From a3fd31be2d88d756253600677d6743b3bd1f781b Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 17 Apr 2022 16:17:11 -0400 Subject: [PATCH] build 135 --- README.md | 34 ++++++++++---------- artwork/TALK1.txt | 2 +- constants.asm | 16 +++++++--- display.asm | 19 +++++------ grafproc.asm | 4 +-- scorch.asm | 57 ++++++++++++++++++++------------- scorch.xex | Bin 33774 -> 34091 bytes textproc.asm | 79 ++++++++++++++++++++++++++++++++++++++++++---- variables.asm | 13 ++++++-- weapons.asm | 12 +++---- 10 files changed, 161 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index 796b65a..e2ae151 100755 --- a/README.md +++ b/README.md @@ -26,26 +26,26 @@ Game source code is split into 5+3 parts: - weapons.asm - general arsenal of tankies We were trying to use as much macros and pseudo-ops as possible. -They are defined in atari.hea and macro.hea files together with many -atari constants. This way it should be relatively easy to -port this code to e.g. C64 +They are defined in atari.hea and macro.hea files together with many atari constants. This way it should be relatively easy to port this code to e.g. C64 -After those N years of working on this piece of code -we are sure it would be much wiser to write it in C, Action! -or MadPascal but on the other hand it is so much fun to type 150 chars -where all you want to have y=ax+b :) +After those N years of working on this piece of code we are sure it would be much wiser to write it in C, Action! or MadPascal but on the other hand it is so much fun to type 150 chars where all you want to have y=ax+b :) -Originally most variables were in Polish, comments were sparse -but we wanted to release this piece of code to public -and due to being always short of time/energy (to finish the game) -we decided it must go in 'English' to let other people work on it. -It never happened, but we got some encouraging comments and we are still -trying to do something from time to time. +Originally most variables were in Polish, comments were sparse, but we wanted to release this piece of code to public. +Because of being always short of time/energy (to finish the game) we decided it must go in 'English' to let other people work on it. +It never happened, but we got some encouraging comments and we are still trying to do something from time to time. With the advent of fujinet (https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see. ## Changes: +###### Build 135 +2022-04-17 +Happy Easter! This is a "premature ejacu.." err... "premature optimization" build. I got into an optimization fewer and got the code messed up, having to revert to the base. One important ticket closed: +- https://github.com/pkali/scorch_src/issues/35 Two morons shooting each other for more than 5 minutes. Added a new option "Seppuku". It causes one of the tanks ashamed with their inefficiency to detonate the weapon on itself. This was quite a difficult addition, requiring me to understand large swaths of the code, always a great challenge. Smoother gameplay with AIs guaranteed or money back. +Other small fixes: +- https://github.com/pkali/scorch_src/issues/23 High flying MIRV leaves traces. Not anymore. +- https://github.com/pkali/scorch_src/issues/12 Make soil fall down faster after soil eating weapons. Soil eating range is OK, it is the soil down routine that is slow (but visually attractive). + ###### Build 134 2022-04-10 - https://github.com/pkali/scorch_src/issues/34 - plot pointer visible only when missile is out of the screen @@ -53,6 +53,7 @@ With the advent of fujinet (https://fujinet.online/) we are thinking about makin - https://github.com/pkali/scorch_src/issues/32 - Basic is turned off right on the beginning of loading. Dracon reported problems with running the game in Altirra, this was the best idea I had about it. Maybe next will be removing from zero page LZSS routine by @dmsc - https://github.com/pkali/scorch_src/issues/31 - STA WSYNC removed from missile flight delay - https://github.com/pkali/scorch_src/issues/30 - player level remembered between rounds, thx @KrzysRog +- https://github.com/pkali/scorch_src/issues/5 - funkybomb smoke stays on the edges of the screen ###### Build 133 2022-04-03 @@ -106,12 +107,10 @@ With the advent of fujinet (https://fujinet.online/) we are thinking about makin - fixed bug 015 (Only first shoot of FunkyBomb is correct - fixed bug 016 (No falling soil after leapfrog) - ##### Build 125 2022-01-23 - included splash screen by KAZ - ##### Build 124 2013-12-21 - removed large chunk of redundant 4x4 print code and table generation code, @@ -162,7 +161,7 @@ MISSING UPDATE INFORMATION... POSSIBLY NOTHING IMPORTANT HAPPENED HERE. - fixed bug 001 (lack of explosions on the empty ground) - fixed bug 003 (wrapping death's head explosions) - fixed plot (faster explosions) -- fukk, just 6 years and we are back!!! This game is pretty addictive :) +- fokk, just 6 years and we are back!!! This game is pretty addictive :) TO DO: - send our wives and kids away much more often :)))) @@ -201,7 +200,6 @@ textproc.s65 SHORTSYS.S65 - new macro PAUSE (waits given number of frames) - ##### Build 112 2003-08-15 @@ -238,4 +236,4 @@ variables.s65 grafproc.s65 - shorter delay during Flight -...older history missing... \ No newline at end of file +...transmission error...former history missing... \ No newline at end of file diff --git a/artwork/TALK1.txt b/artwork/TALK1.txt index 6606cbe..2ca9011 100755 --- a/artwork/TALK1.txt +++ b/artwork/TALK1.txt @@ -45,7 +45,7 @@ THIS IS YOUR BRAIN ON SCORCH. TAKE THIS! THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US. DIE, ALIEN SWINE! -SAY "ARRGGHHHHH...." +SAY 'ARRGGHHHHH....' I SHALL OIL MY TURRET WITH YOUR BLOOD. DIE, TANK-SCUM! I'M GONNA BREAK YOUR FACE! diff --git a/constants.asm b/constants.asm index bb2308c..eeee2cb 100644 --- a/constants.asm +++ b/constants.asm @@ -13,7 +13,8 @@ CashOptionH GravityTable .by 10,20,25,30,40 MaxWindTable .by 5,20,40,60,80 RoundsTable .by 10,20,30,40,50 -flyDelayTable .by 255,150,75,35,1 +flyDelayTable .by 255,150,75,35,1 +seppukuTable .by 255, 45,25,15,9 ;------------------------------------------------ LevelNameBeginL ; begins of level names @@ -30,9 +31,7 @@ TanksWeaponsTableL TanksWeaponsTableH .by >TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 ;-----4x4 texts----- -ResultLineBuffer - dta d" " - .byte $ff + LineTop dta d"(%%%%%%%%%%%%)" .byte $ff @@ -54,6 +53,13 @@ LineHeader2 LineGameOver dta d"# GAME OVER #" .byte $ff +seppukuText + dta d"# SEPPUKU! #" + .byte $ff +lineClear + dta d" " + .byte $ff + ;----------- pmtableL ; addressess of the P/M memory for 5 tanks (6th is without P/M background) @@ -1038,7 +1044,7 @@ joyToKeyTable .by $ff,$ff,$ff,$ff,$ff,$ff,$ff,$07,$ff,$ff,$ff,$06,$ff,$0f,$0e,$ff ;----------------------------------- -keycodes ;tables for calculating KeyCode to Screen Code (38 -1 characters) +keycodes ;tables for converting KeyCode to Screen Code (38 -1 characters) .by $3f,$15,$12,$3a,$2a,$38,$3d,$39 .by $0d,$01,$05,$00,$25,$23,$08,$0a .by $2f,$28,$3e,$2d,$0b,$10,$2e,$16 diff --git a/display.asm b/display.asm index d2244ef..6639b3b 100755 --- a/display.asm +++ b/display.asm @@ -30,7 +30,7 @@ OptionsDL .byte $42 .word OptionsScreen .byte $30,$02,$02,$70 - :maxOptions .by $02,0 + :maxOptions .by $02,$10 .byte $41 .word OptionsDL ;------------------------ @@ -60,24 +60,25 @@ dl ; MAIN game display list .by $0f .by $4f .wo display+$0ff0 - :97 .byte $0f + :100 .byte $0f ;97 .byte $41 .word dl ;----------------------------------------------- ;Screen displays go first to avoid crossing 4kb barrier ;----------------------------------------------- OptionsScreen - dta d"Welcome to Scorch ver. 134 (un)2000-2022" + dta d"Welcome to Scorch ver. 135 (un)2000-2022" dta d" Please select option with cursor keys " dta d" and press (Return) to proceed " OptionsHere ; 0123456789012345678901234567890123456789 - dta d"Players : 2 3 4 5 6 " - dta d"Cash : none 2K 5K 8K 10K " - dta d"Gravity : 0.2G 0.5G 1G 2G 4G " - dta d"Wind : 1B 3B 5B 7B 9B " - dta d"Rounds : 10 20 30 40 50 " - dta d"Shells : slug slow norm fast hare " + dta d"Players : 2 3 4 5 6 " + dta d"Cash : none 2K 5K 8K 10K " + dta d"Gravity : 0.2G 0.5G 1G 2G 4G " + dta d"Wind : 1B 3B 5B 7B 9B " + dta d"Rounds : 10 20 30 40 50 " + dta d"Missiles : slug slow norm fast hare " + dta d"Seppuku : nevr rare norm oftn alws " OptionsScreenEnd ; ------------------------------------------------- NameScreen diff --git a/grafproc.asm b/grafproc.asm index 095e20c..03b7b88 100755 --- a/grafproc.asm +++ b/grafproc.asm @@ -1409,8 +1409,6 @@ PutChar4x4FULL .proc; ;but this time all pixels are being drawn ;(empty and not empty) ;-------------------------------------------------- - lda plot4x4color - sta color ; calculating address of the first byte mva #4 LoopCounter4x4 @@ -1461,7 +1459,7 @@ Loop4x4ContinuedFULL ; here we have on screen one line of the char inw ydraw sbw xdraw #4 - sbw y4x4 #32 + sbw y4x4 #32 ; why? possibly because of width of the 4x4 font dec:lda LoopCounter4x4 bne nextline4x4FULL diff --git a/scorch.asm b/scorch.asm index 8b1aa03..23a1a25 100644 --- a/scorch.asm +++ b/scorch.asm @@ -79,7 +79,7 @@ screenwidth = screenBytes*8 ; Max screenwidth = 512!!! margin = 48 ;mountain drawing Y variable margin display = $1010 ;screen takes $2K due to clearing routine MaxPlayers = 6 -maxOptions = 6 ;number of all options +maxOptions = 7 ;number of all options PMOffset = $23 ; P/M to graphics offset icl 'lib/atari.hea' @@ -247,7 +247,7 @@ Round .proc ; ; the default shooting angle to 45 degrees ; of course gains an looses are zeroed - jsr DisplayingSymbols + jsr StatusDisplay lda #0 tax @ @@ -310,7 +310,7 @@ MainRoundLoop ; here we must check if by a chance there is only one ; tank with energy greater than 0 left - ldy #0 ; number of tanks with energy greater than zero + ldy #0 ; in Y - number of tanks with energy greater than zero ldx NumberOfPlayers dex CheckingIfRoundIsFinished @@ -337,7 +337,7 @@ WhichTankWonLoop ; somehow I believed program will be never here ; but it was a bad assumption ; god knows when there is such a situation - ; (we've got a SITUATION here, it you know what I mean) + ; (we've got a SITUATION here, if you know what I mean) ; there are two tanks left. ; one of them is killed by the second tank ; second tank explodes and kills the first one. @@ -355,8 +355,22 @@ ThisOneWon rts ; this Round is finished DoNotFinishTheRound - ;ldx TankNr + ; Seppuku here + lda noDeathCounter + cmp seppukuVal + bcc @+ + + mva #0 noDeathCounter + + jsr DisplaySeppuku + + jmp Seppuku + + + + ;ldx TankNr +@ ldx TankSequencePointer lda TankSequence,x sta TankNr @@ -373,10 +387,11 @@ DoNotFinishTheRound lda SkillTable,x beq ManualShooting +RoboTanks ; robotanks shoot here jsr ArtificialIntelligence jsr MoveBarrelToNewPosition - jsr DisplayingSymbols ;all digital values like force, angle, wind, etc. + jsr StatusDisplay ;all digital values like force, angle, wind, etc. jsr PutTankNameOnScreen ; let's move the tank's barrel so it points the right ; direction @@ -388,17 +403,20 @@ ManualShooting jsr BeforeFire AfterManualShooting + inc noDeathCounter + jsr DecreaseWeaponBeforeShoot - jsr DisplayingSymbols + jsr StatusDisplay ldx TankNr dec Energy,x ; lower energy to eventually let tanks commit suicide - lda ActiveWeapon,x +ShootNow jsr Shoot lda HitFlag ;0 if missed beq missed +Seppuku lda #0 sta FallDown1 sta FallDown2 @@ -532,13 +550,18 @@ NoPlayerNoDeath .endp ;--------------------------------- PlayerXdeath .proc - ; first we inform that this tank should not explode anymore: - ; there is 0 in A, and Tank Number in X, so... + + ; this tank should not explode anymore: + ; there is 0 in A, and Tank Number in X, so... sta LASTeXistenZ,x ; save x somewhere stx TankTempY + ;clear NoDeathCounter here + sta noDeathCounter + + ; display defensive text here (well, defensive ; is not the real meaning, it should be pre-death, ; but I am too lazy to change names of variables) @@ -659,10 +682,7 @@ GetRandomWind .proc sta Wind mva #$00 Wind+1 ; multiply Wind by 16 and take it as a decimal part (0.Wind) - aslw Wind - aslw Wind - aslw Wind - aslw Wind + :4 aslw Wind lda random and #$01 sta WindOrientation @@ -673,14 +693,7 @@ GetRandomWind .proc PMoutofScreen .proc ;-------------------------------------------------- lda #$00 ; let all P/M disappear - sta hposp0 - sta hposp0+1 - sta hposp0+2 - sta hposp0+3 - sta hposp0+4 - sta hposp0+5 - sta hposp0+6 - sta hposp0+7 + :8 sta hposp0+# rts .endp diff --git a/scorch.xex b/scorch.xex index 87d5dbca6d9f1ffd7a46c093ed28a60f081d7c52..db52fce39549ab3c2f77050df508f905077ef2b3 100644 GIT binary patch delta 12513 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 U(F#}VU3cw1v8sT?8obm09}W8H)Bpeg delta 12370 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