diff --git a/MANUAL_EN.md b/MANUAL_EN.md index 9afad72..0cdc748 100644 --- a/MANUAL_EN.md +++ b/MANUAL_EN.md @@ -12,8 +12,15 @@ On the first screen, you can configure gameplay options: * number of rounds in a game * missile speed (does not affect the flight path - only changes the apparent missile speed - does not change anything in the gameplay itself) * frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose. - * The height (and undulation) of the mountains from almost flat (NL - Kingdom of the Netherlands), to soaring and high (NP - Federal Democratic Republic of Nepal) +* The height (and undulation) of the mountains from almost flat (NL - Kingdom of the Netherlands), to soaring and high (NP - Federal Democratic Republic of Nepal) +* the way the walls (edges of the screen) work: + 1. none - projectiles that flew off the screen do not return + 2. wrap - the screen "wraps" and projectiles that flew to the right appear on the left side (and vice versa) + 3. bump - the right and left walls deflect projectiles that want to fly through them + 4. boxy - just like bump, except that the "ceiling" also reflects projectiles + 5. rand - at the beginning of each round, one of the above 4 ways the walls work is drawn. +Translated with www.DeepL.com/Translator (free version) Select options with cursor keys or joystick. The [RETURN] key or Joystick button moves to the next screen. @@ -126,16 +133,16 @@ And here are the `ExplosionRadius` values for each weapon: | Baby Missile | 11 | | Missile | 17 | | Baby Nuke | 25 | -| Nuke | 31 | +| Nuke | 30 | | LeapFrog| 17 15 13 | | Funky Bomb | 21 11 (* 5) | | MIRV | 17 (* 5) | -| Death's Head | 31 (* 5) | +| Death's Head | 30 (* 5) | | Napalm | x 40 (this weapon is different and the distance from the center is not determined, simply any tank within range of the flames loses 40 units of energy - the ExplosionRadius variable is not used) | | Hot Napalm | x 80 (the same principle as in Napalm) | | Baby Roller | 11 | | Roller | 21 | -| Heavy Roller | 31 | +| Heavy Roller | 30 | | Riot Charge | 31 | | Riot Blast | 0 (in reality - 61 but with these weapons it is not taken into account when counting energy loss only the width of the ground to fall) | | Riot Bomb | 17 | diff --git a/MANUAL_PL.md b/MANUAL_PL.md index 3af3685..dbcb154 100644 --- a/MANUAL_PL.md +++ b/MANUAL_PL.md @@ -12,6 +12,13 @@ Na pierwszym ekranie możemy skonfigurować opcje rozgrywwki: * szybkość lotu pocisków (nie ma wpływu na tor lotu - zmienia jedynie widoczną prędkość rysowania - nie zmienia nic w samej rozgrywce) * częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania. * wysokość (i pofałdowanie) gór od prawie płaskich (NL - Królestwo Niderlandów), do strzelistych i wysokich (NP - Federalna Demokratyczna Republika Nepalu) +* sposób działania ścian (krawędzi ekranu): + 1. none - pociski, które wyleciały poza ekran nie wracają + 2. wrap - ekran "zawija się" i pociski, które wyleciały w prawo pojawiają się z lewej strony (i odwrotnie) + 3. bump - prawa i lewa ściana odbijają pociski, które chcą przez nie przelecieć + 4. boxy - tak jak bump, tyle że "sufit" także odbija pociski + 5. rand - na początku każdej rundy losowany jest jeden z 4 powyższych sposobów działania ścian + Wybór opcji klawiszami kursora lub joystickiem. @@ -122,16 +129,16 @@ A oto wartości promienia rażenia (ExplosionRadius) dla poszczególnych broni: | Baby Missile | 11 | | Missile | 17 | | Baby Nuke | 25 | -| Nuke | 31 | +| Nuke | 30 | | LeapFrog| 17 15 13 | | Funky Bomb | 21 11 (* 5) | | MIRV | 17 (* 5) | -| Death's Head | 31 (* 5) | +| Death's Head | 30 (* 5) | | Napalm | x 40 (ta broń jest inna i nie jest wyznaczana odległość od centrum, po prostu każdy czołg znajdujący się w zasięgu płomieni traci 40 jednostek energii - zmienna ExplosionRadius nie jest używana) | | Hot Napalm | x 80 (zasada taka jak w Napalm) | | Baby Roller | 11 | | Roller | 21 | -| Heavy Roller | 31 | +| Heavy Roller | 30 | | Riot Charge | 31 | | Riot Blast | 0 (tak na prawdę - 61 ale przy tych broniach nie jest brana pod uwagę przy liczeniu ubytku energii tylko szerokości gruntu do opadnięcia) | | Riot Bomb | 17 | diff --git a/README.md b/README.md index 754558f..06eabac 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,17 @@ With the advent of [fujinet](https://fujinet.online/) we are thinking about maki ## Changes: +###### Version 1.11 +2022-08-22 + +A release lollapalooza. + +The silliness indicator crashed. What are we doing? + +Changes: +* A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values. +* Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change. + ###### Version 1.10 2022-08-21 diff --git a/constants.asm b/constants.asm index f6455cb..351fa01 100644 --- a/constants.asm +++ b/constants.asm @@ -4,7 +4,7 @@ ; initial values for some variables initialvaluesStart -I_OptionsTable .by 0,1,2,2,0,1,3,2 +I_OptionsTable .by 0,1,2,2,0,1,3,2,0 I_RoundsInTheGame .by 10 ;how many rounds in the current game I_seppukuVal .by 75 I_mountainDeltaH .by 3 diff --git a/definitions.asm b/definitions.asm index 2508f10..6c8b761 100644 --- a/definitions.asm +++ b/definitions.asm @@ -17,7 +17,7 @@ display = $1010 ;screen takes $2K due to clearing routine margin = 40 ;mountain drawing Y variable margin MaxPlayers = 6 -maxOptions = 8 ;number of all options +maxOptions = 9 ;number of all options PMOffsetX = $2C ; P/M to graphics offset PMOffsetY = $23 ; P/M to graphics offset napalmRadius = 10 diff --git a/display.asm b/display.asm index 5fe33e8..735cf65 100644 --- a/display.asm +++ b/display.asm @@ -17,6 +17,7 @@ OptionsHere dta d"Missiles : slug slow norm fast hare " dta d"Seppuku : nevr rare norm oftn alws " dta d"Mountains: NL BE CZ CH NP " + dta d"Walls : none wrap bump boxy rand " OptionsScreenEnd ;----------------------------------------------- ListOfWeapons diff --git a/scorch.asm b/scorch.asm index 86927a5..341379a 100644 --- a/scorch.asm +++ b/scorch.asm @@ -36,7 +36,7 @@ ;we decided it must go in 'English' to let other people work on it .macro build - dta d"1.10" ; number of this build (3 bytes) + dta d"1.11" ; number of this build (3 bytes) .endm icl 'definitions.asm' @@ -219,7 +219,7 @@ FirstSTART START ; Startup sequence jsr Initialize - + ;jsr GameOverScreen ; only for test !!! lda #song_main_menu @@ -242,6 +242,7 @@ START ; for the round #1 shooting sequence is random MainGameLoop + jsr SetWallsType ; first set default barrel lengths (fix for Long Schlong activation :) ) ; we must do it before purchase/activate ldx #(MaxPlayers-1) @@ -1508,7 +1509,24 @@ nextishigher rts .endp - +;-------------------------------------------------- +.proc SetWallsType +;-------------------------------------------------- + mva #0 WallsType + lda OptionsTable+8 + cmp #4 + beq SetRandomWalls + lsr + ror WallsType + lsr + ror WallsType + rts +SetRandomWalls + lda random + and #%11000000 + sta WallsType + rts +.endp ;-------------------------------------------------- .proc GetKey ; waits for pressing a key and returns pressed value in A ; when [ESC] is pressed, escFlag is set to 1 diff --git a/scorch.xex b/scorch.xex index 4f3a190..bb5c044 100644 Binary files a/scorch.xex and b/scorch.xex differ diff --git a/textproc.asm b/textproc.asm index 816d289..07b5289 100644 --- a/textproc.asm +++ b/textproc.asm @@ -204,7 +204,7 @@ OptionSetLoop ; next option adw temp #40 ;jump to next line inc:lda temp2 - cmp #maxoptions ;number of options + cmp #maxOptions ;number of options bne OptionsSetMainLoop ;inversing the first few chars of the selected line (OptionsY) @@ -853,7 +853,9 @@ invSelectDef ; if activate battery, we do it differently mva #sfx_battery sfx_effect mva #99 Energy,x + phy jsr MaxForceCalculate + ply jmp DecreaseDefensive ; bypass activation NotBattery cmp #ind_Long_Barrel____ @@ -1105,6 +1107,7 @@ LastNameChar lda #$80 ; place cursor on the end sta NameAdr,y + dey sty PositionInName diff --git a/variables.asm b/variables.asm index 5ed36e3..59ef84c 100644 --- a/variables.asm +++ b/variables.asm @@ -29,7 +29,7 @@ skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning ;---------------------------------------------------- variablesToInitialize ;Options DO NOT ZERO ON RESTART GAME - ticket #27 -OptionsTable .by 0,1,2,2,0,1,3,2 +OptionsTable .by 0,1,2,2,0,1,3,2,0 RoundsInTheGame .by 10 ;how many rounds in the current game seppukuVal .by 75 mountainDeltaH .by 3 @@ -138,7 +138,8 @@ MaxWind .ds 1 ; WindOrientation .DS 1 ;(0-right,1-left) ;---------------------------------------------------- ;Counter .DS 1 ;temporary Counter for outside loops -;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank +;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank +WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy ;---------------------------------------------------- xtankstableL ;X positions of tanks (lower left point) .DS [MaxPlayers] diff --git a/weapons.asm b/weapons.asm index faa1b4b..7042470 100644 --- a/weapons.asm +++ b/weapons.asm @@ -1798,6 +1798,12 @@ NoWind mwa ytraj+1 ybyte jsr draw ;key + bit LaserFlag + bmi LaserNoWalls + ; Check for walls + jsr MakeWalls + ; +LaserNoWalls mwa xtraj+1 XtrajOld+1 mwa ytraj+1 YtrajOld+1 @@ -2333,7 +2339,49 @@ MIRValreadyAll ;jsr drawtanks rts .endp - +; ------------------------------------------------- +.proc MakeWalls +; ------------------------------------------------- + bit WallsType ; ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy + bpl WrapAndNone + bvc MakeBump + ; top bounce + bit ytraj+2 + bpl NoOnTop + sec + .rept 4 + lda #$00 + sbc vy+# + sta vy+# + .endr +NoOnTop +MakeBump + cpw xtraj+1 #screenwidth + bcc OnScreen + ; inverse vx (bouncing wall) + sec + .rept 4 + lda #$00 + sbc vx+# + sta vx+# + .endr + rts +WrapAndNone + bvc NoWall + cpw xtraj+1 #screenwidth + bcc OnScreen + ; (wrapping wall) + bit xtraj+2 + bmi LeftWrap +RightWrap + sbw xtraj+1 #screenwidth + rts +LeftWrap + adw xtraj+1 #screenwidth +OnScreen +NoWall + rts +.endp ; ------------------------------------------------- .proc WhiteFlag ; -------------------------------------------------