diff --git a/README.md b/README.md index 05586f0..28898ee 100644 --- a/README.md +++ b/README.md @@ -47,20 +47,40 @@ With the advent of fujinet (https://fujinet.online/) we are thinking about makin ## Changes: +###### Build 146 +2022-07-03 +Super heavy rewrite build. +Not much changed visually since the last build, but really large parts of the code were rewritten, optimized and improved. A fresh swath of buggies certainly introduced, too. +- completely new tank falling routine by @Pecusx - over 300 bytes saved, complexity reduced, more just energy deduction when falling. +- silly angle system rewritten to a proper, primary school angling. BTW - I had to dig into 8th grade trig to make it work. About 200 bytes saved, complexity reduced. Next build will have improved angle speed UI. I will also allow for an easier improvement of tank visuals. +- Weapon price and quantity balance - this is our honest attempt to make game more fun. We'll accept any critique and improvement proposals. +- New AI opponent - Tosser! Not much better than Poolshark, but still beats sharks most of the time. +- AI opponents can purchase defensive weapons what makes playing against AI somewhat more challenging. +- Improved Laser. It is still not ideal, but better. Still hard to aim :] +- Few small parachute related bugs fixed +- Death's Head bug fix + +Issues closed: +- https://github.com/pkali/scorch_src/issues/87 Angles are reasonable now. PROFIT!!! + + ###### Build 145 2022-06-26 Possibly last round of weapon additions! + @Pecusx added - working White Flag -- it is a way to give up while not making opponents richer! - Battery - a must for every tank with low energy. - Strong Parachute - like a normal parachute, but stronger (it has energy and can work more than once) - Nuclear Winter - a quick and efficient solution to global worming, err, warning, WARMING! + @mikerro added new SFX and in-game-tunes. - Pressing [S] turns on/off SFX (when aiming). Pressing [M] turns on/off in-game tunes. + Tickets closed: -- https://github.com/pkali/scorch_src/issues/54 - holding joystick up or down longer speeds up force change. It makes playing with joystick much nicer. -- https://github.com/pkali/scorch_src/issues/76 - a beginning of visual tweaks by Adam -- infinite defensive weapons purchase bug fixed, to chagrin of some... +- https://github.com/pkali/scorch_src/issues/54 - holding a joystick up or down speeds up force change. It makes playing with a joystick much nicer. +- https://github.com/pkali/scorch_src/issues/76 - a beginning of visual tweaks by @6502adam +- infinite defensive weapons purchase bug fixed, to the chagrin of some... ###### Build 144 2022-06-19 diff --git a/ai.asm b/ai.asm index 74db4ea..695f520 100644 --- a/ai.asm +++ b/ai.asm @@ -9,7 +9,7 @@ ; greeeting to myself 10 years older in 2013-11-09... still no idea ;---------------------------------------------- -MakeLowResDistances .proc +.proc MakeLowResDistances ; create low precision table of positions ; by dividing positions by 4 @@ -30,7 +30,7 @@ loop .endp ;---------------------------------------------- -ArtificialIntelligence .proc ; +.proc ArtificialIntelligence ; ; A - skill of the TankNr ; returns shoot energy and angle in ; ForceTable/L/H and AngleTable @@ -42,6 +42,13 @@ ArtificialIntelligence .proc ; pha lda AIRoutines,x pha + + ldx TankNr ; common values used in AI routines + ; address of weapons table (for future use) + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 rts .endp ;---------------- @@ -49,15 +56,14 @@ AIRoutines .word Moron-1 .word Shooter-1 ;Shooter .word Poolshark-1 ;Poolshark - .word Poolshark-1 ;Toosser + .word Tosser-1 ;Tosser .word Poolshark-1 ;Chooser .word Poolshark-1 ;Spoiler .word Poolshark-1 ;Cyborg .word Poolshark-1 ;Unknown ;---------------------------------------------- -Moron .proc - ldx TankNr +.proc Moron jsr RandomizeAngle sta NewAngle mwa #80 RandBoundaryLow @@ -66,21 +72,29 @@ Moron .proc rts .endp ;---------------------------------------------- -Shooter .proc +.proc Shooter - ldx TankNr lda PreviousAngle,x ora PreviousEnergyL,x ora PreviousEnergyH,x beq firstShoot lda PreviousAngle,x + cmp #90 + bcs shootingLeftAtThisMomentOfTime + ; shooting right at this moment of time + sec + sbc #5 + cmp #10 + bcs @+ ;not smaller than 10 + bcc firstShoot ; GET THE aim againg + +shootingLeftAtThisMomentOfTime + clc adc #5 - bmi @+ - cmp #90 - bcc @+ - lda #(-90) + cmp #170 ; maximum shooter angle + bcs firstShoot @ sta NewAngle @@ -89,42 +103,36 @@ Shooter .proc sbc #5 sta ForceTableL,x lda PreviousEnergyH,x - sbc #0 + sbc #0 sta ForceTableH,x jmp endo firstShoot ; compare the x position with the middle of the screen + lda xTanksTableH,x + cmp #>(screenwidth/2) + bne @+ lda xTanksTableL,x - sta temp - lda xTanksTableH,x - sta temp+1 - cpw temp #(screenwidth/2) - bcs tankIsOnTheRight - - lda RANDOM - and #$1F - clc - adc #5 + cmp #<(screenwidth/2) +@ bcc tankIsOnTheRight + ; enemy tank is on the left + randomize 95 125 sta NewAngle - jmp forceNow + bne forceNow + tankIsOnTheRight - lda RANDOM - and #$1F - clc - adc #(-85) - ;lda #-45 - sta NewAngle + randomize 55 85 + sta NewAngle forceNow mwa #100 RandBoundaryLow mwa #800 RandBoundaryHigh - ldx TankNr ;this is possibly not necessary + ;ldx TankNr ;this is possibly not necessary jsr RandomizeForce endo - ldx TankNr ;this is possibly not necessary + ;ldx TankNr ;this is possibly not necessary jsr RandomizeForce.LimitForce lda NewAngle sta PreviousAngle,x @@ -135,28 +143,66 @@ endo ; choose the best weapon - lda TanksWeaponsTableL,x - sta temp - lda TanksWeaponsTableH,x - sta temp+1 ldy #32 ;the last weapon loop dey - lda (temp),y + lda (temp),y ; this is set up before calling the routine, has address of TanksWeaponsTable beq loop tya sta ActiveWeapon,x rts .endp ;---------------------------------------------- -Poolshark .proc - +.proc Poolshark + ; defensives + ; if low energy ten use battery + lda Energy,x + cmp #30 + bcs EnoughEnergy + ; lower than 30 units - check battery + ldy #ind_Battery________ + lda (temp),y ; has address of TanksWeaponsTable + beq NoBatteries + ; we have batteries - use one + clc + sbc #1 + sta (temp),y + lda #99 + sta Energy,x +NoBatteries +EnoughEnergy + ; use best defensive :) + ; but not allways + randomize 1 3 + cmp #1 + bne NoUseDefensive + ; first check check if any is in use + lda ActiveDefenceWeapon,x + bne DefensiveInUse + ldy #ind_Nuclear_Winter_+1 ;the last defensive weapon +@ + dey + cpy #ind_Battery________ ;first defensive weapon (White Flag nad Battery - never use) + beq NoUseDefensive + lda (temp),y ; has address of TanksWeaponsTable + beq @- + tya + ; activate defensive weapon + sta ActiveDefenceWeapon,x + lda DefensiveEnergy,y + sta ShieldEnergy,x + ; decrease in inventory + clc + sbc #1 + sta (temp),y ; has address of TanksWeaponsTable +NoUseDefensive +DefensiveInUse firstShoot ;find nearest tank neighbour jsr MakeLowResDistances mva #$ff temp2 ; min possible distance - ldx TankNr + ;ldx TankNr ldy NumberOfPlayers dey @@ -217,7 +263,7 @@ forceNow jsr RandomizeForce endo - ldx TankNr ;this is possibly not necessary + ;ldx TankNr ;this is possibly not necessary ; choose the best weapon @@ -225,7 +271,7 @@ endo sta temp lda TanksWeaponsTableH,x sta temp+1 - ldy #32 ;the last weapon + ldy #ind_Laser__________ ;the last offensive weapon loop dey lda (temp),y @@ -236,11 +282,39 @@ loop ;---------------------------------------------- AngleTable ; 16 bytes ;ba w $348b L$3350 - .by 178,186,194,202,210,218,226,234 - .by 16,24,32,40,48,56,64,72 - .endp + .by 106,114,122,130,138,146,154,162 + .by 18,26,34,43,50,58,66,74 +.endp ;---------------------------------------------- -PurchaseAI .proc ; +.proc Tosser + ; use best defensive :) + ; allways + ; first check check if any is in use + lda ActiveDefenceWeapon,x + bne DefensiveInUse + ldy #ind_Nuclear_Winter_+1 ;the last defensive weapon +@ + dey + cpy #ind_Battery________ ;first defensive weapon (White Flag nad Battery - never use) + beq NoUseDefensive + lda (temp),y ; has address of TanksWeaponsTable + beq @- + tya + ; activate defensive weapon + sta ActiveDefenceWeapon,x + lda DefensiveEnergy,y + sta ShieldEnergy,x + ; decrease in inventory + clc + sbc #1 + sta (temp),y +DefensiveInUse +NoUseDefensive + ; Toosser is like Poolshark but allways uses defensives + jmp Poolshark +.endp +;---------------------------------------------- +.proc PurchaseAI ; ; A - skill of the TankNr ; makes purchase for AI opponents ; results of this routine are not visible on the screen @@ -260,21 +334,22 @@ PurchaseAIRoutines .word MoronPurchase-1 .word ShooterPurchase-1 ;ShooterPurchase .word PoolsharkPurchase-1 ;PoolsharkPurchase - .word PoolsharkPurchase-1 ;ToosserPurchase + .word TosserPurchase-1 ;TosserPurchase .word PoolsharkPurchase-1 ;ChooserPurchase .word PoolsharkPurchase-1 ;SpoilerPurchase .word PoolsharkPurchase-1 ;CyborgPurchase .word PoolsharkPurchase-1 ;UnknownPurchase ;---------------------------------------------- -MoronPurchase +.proc MoronPurchase ;Moron buys nothing rts - +.endp ;------- -TryToPurchaseOnePiece .proc +.proc TryToPurchaseOnePiece ; A - weapon number, better it will be in range(1,32) ; TankNr in X + ; DOES NOT CHANGE X tay lda PurchaseMeTable,y beq SorryNoPurchase @@ -320,28 +395,73 @@ SorryNoPurchase ;---------------------------------------------- -ShooterPurchase .proc - mva #4 tempXroller; number of purchases to perform - +.proc ShooterPurchase + ; first try to buy defensives + mva #2 tempXroller; number of offensive purchases to perform ldx TankNr -loop - randomize 1 14 +@ + randomize ind_Battery________ ind_StrongParachute jsr TryToPurchaseOnePiece dec tempXroller - bne loop - - rts - .endp -;---------------------------------------------- -PoolsharkPurchase .proc - mva #8 tempXroller; number of purchases to perform - - ldx TankNr -loop - randomize 1 30 + bne @- + + ; and now offensives + mva #4 tempXroller; number of offensive purchases to perform + ;ldx TankNr +@ + randomize ind_Missile________ ind_Heavy_Roller___ jsr TryToPurchaseOnePiece dec tempXroller - bne loop + bne @- rts .endp +;---------------------------------------------- +.proc PoolsharkPurchase + ; first try to buy defensives + mva #3 tempXroller; number of offensive purchases to perform + ldx TankNr +@ + randomize ind_Battery________ ind_Auto_Defense___ + jsr TryToPurchaseOnePiece + dec tempXroller + bne @- + + ; and now offensives + mva #8 tempXroller; number of purchases to perform + ;ldx TankNr +@ + randomize ind_Missile________ ind_Dirt_Charge____ + jsr TryToPurchaseOnePiece + dec tempXroller + bne @- + + rts +.endp +;---------------------------------------------- +.proc TosserPurchase + + ; what is my money level + ldx TankNr + lda MoneyH,x ; money / 256 + sta tempXroller ; perform this many purchase attempts + ; first try to buy defensives + mva #3 tempXroller; number of defensive purchases to perform +@ + randomize ind_Battery________ ind_Auto_Defense___ + jsr TryToPurchaseOnePiece + dec tempXroller + bne @- + + ; and now offensives + lda MoneyH,x ; money / 256 + asl ;*2 + sta tempXroller ; perform this many purchase attempts +@ + randomize ind_Missile________ ind_Dirt_Charge____ + jsr TryToPurchaseOnePiece + dec tempXroller + bne @- + + rts +.endp diff --git a/artwork/tanks.fnt b/artwork/tanksv2.fnt similarity index 81% rename from artwork/tanks.fnt rename to artwork/tanksv2.fnt index 8c0e93d..d06950e 100644 Binary files a/artwork/tanks.fnt and b/artwork/tanksv2.fnt differ diff --git a/constants.asm b/constants.asm index 88d91f0..87140ed 100644 --- a/constants.asm +++ b/constants.asm @@ -70,32 +70,6 @@ pmtableH .by >(pmgraph+$700) .by >(pmgraph+$300) ;----------- -; this table changes Angle to the appropriate tank character -BarrelTableL - .by $02,$02,$02,$02,$02,$02,$02,$02 - .by $04,$04,$04,$04,$04,$04,$04,$04 - .by $06,$06,$06,$06,$06,$06,$06,$06,$06 - .by $08,$08,$08,$08,$08,$08,$08,$08 - .by $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a - .by $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c - .by $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e - .by $10,$10,$10,$10,$10,$10,$10,$10 - .by $12,$12,$12,$12,$12,$12,$12,$12,$12 - .by $14,$14,$14,$14,$14,$14,$14,$14 - .by $16,$16,$16,$16,$16,$16,$16,$16 -BarrelTableR - .by $2c,$2c,$2c,$2c,$2c,$2c,$2c,$2c - .by $2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a - .by $28,$28,$28,$28,$28,$28,$28,$28,$28 - .by $26,$26,$26,$26,$26,$26,$26,$26 - .by $24,$24,$24,$24,$24,$24,$24,$24 - .by $22,$22,$22,$22,$22,$22,$22,$22,$22 - .by $20,$20,$20,$20,$20,$20,$20,$20 - .by $1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e - .by $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c - .by $1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a - .by $18,$18,$18,$18,$18,$18,$18,$18 - sintable .by 0 .by 4 @@ -210,332 +184,100 @@ disktance ;tanks distance ; this table is for deciding where a tank should slide ; accordingly to what is below the tank -; there are 3 bits used here -; bit 0 - go down -; bit 1 - go left -; bit 2 - go right -; position in the table equals to bit pattern of soil below tank +; values in table mean that tank is moving to the left +SlideLeftTable + .BY %00000001 + .BY %00000010 + .BY %00000011 + .BY %00000100 + .BY %00000101 + .BY %00000110 + .BY %00000111 + .BY %00001100 -WhereToSlideTable - ; we have 3 bits, when set: 2 - go left, 1 - go right, 0 - go down - .BY %001 ; 00000000 - .BY %101 ; 00000001 - .BY %100 ; 00000010 - .BY %100 ; 00000011 - .BY %100 ; 00000100 - .BY %100 ; 00000101 - .BY %100 ; 00000110 - .BY %100 ; 00000111 - .BY %000 ; 00001000 - .BY %000 ; 00001001 - .BY %000 ; 00001010 - .BY %000 ; 00001011 - .BY %100 ; 00001100 - .BY %000 ; 00001101 - .BY %000 ; 00001110 - .BY %000 ; 00001111 - .BY %000 ; 00010000 - .BY %000 ; 00010001 - .BY %000 ; 00010010 - .BY %000 ; 00010011 - .BY %000 ; 00010100 - .BY %000 ; 00010101 - .BY %000 ; 00010110 - .BY %000 ; 00010111 - .BY %000 ; 00011000 - .BY %000 ; 00011001 - .BY %000 ; 00011010 - .BY %000 ; 00011011 - .BY %000 ; 00011100 - .BY %000 ; 00011101 - .BY %000 ; 00011110 - .BY %000 ; 00011111 - .BY %010 ; 00100000 - .BY %000 ; 00100001 - .BY %000 ; 00100010 - .BY %000 ; 00100011 - .BY %000 ; 00100100 - .BY %000 ; 00100101 - .BY %000 ; 00100110 - .BY %000 ; 00100111 - .BY %000 ; 00101000 - .BY %000 ; 00101001 - .BY %000 ; 00101010 - .BY %000 ; 00101011 - .BY %000 ; 00101100 - .BY %000 ; 00101101 - .BY %000 ; 00101110 - .BY %000 ; 00101111 - .BY %010 ; 00110000 - .BY %000 ; 00110001 - .BY %000 ; 00110010 - .BY %000 ; 00110011 - .BY %000 ; 00110100 - .BY %000 ; 00110101 - .BY %000 ; 00110110 - .BY %000 ; 00110111 - .BY %000 ; 00111000 - .BY %000 ; 00111001 - .BY %000 ; 00111010 - .BY %000 ; 00111011 - .BY %000 ; 00111100 - .BY %000 ; 00111101 - .BY %000 ; 00111110 - .BY %000 ; 00111111 - .BY %010 ; 01000000 - .BY %000 ; 01000001 - .BY %000 ; 01000010 - .BY %000 ; 01000011 - .BY %000 ; 01000100 - .BY %000 ; 01000101 - .BY %000 ; 01000110 - .BY %000 ; 01000111 - .BY %000 ; 01001000 - .BY %000 ; 01001001 - .BY %000 ; 01001010 - .BY %000 ; 01001011 - .BY %000 ; 01001100 - .BY %000 ; 01001101 - .BY %000 ; 01001110 - .BY %000 ; 01001111 - .BY %000 ; 01010000 - .BY %000 ; 01010001 - .BY %000 ; 01010010 - .BY %000 ; 01010011 - .BY %000 ; 01010100 - .BY %000 ; 01010101 - .BY %000 ; 01010110 - .BY %000 ; 01010111 - .BY %000 ; 01011000 - .BY %000 ; 01011001 - .BY %000 ; 01011010 - .BY %000 ; 01011011 - .BY %000 ; 01011100 - .BY %000 ; 01011101 - .BY %000 ; 01011110 - .BY %000 ; 01011111 - .BY %010 ; 01100000 - .BY %000 ; 01100001 - .BY %000 ; 01100010 - .BY %000 ; 01100011 - .BY %000 ; 01100100 - .BY %000 ; 01100101 - .BY %000 ; 01100110 - .BY %000 ; 01100111 - .BY %000 ; 01101000 - .BY %000 ; 01101001 - .BY %000 ; 01101010 - .BY %000 ; 01101011 - .BY %000 ; 01101100 - .BY %000 ; 01101101 - .BY %000 ; 01101110 - .BY %000 ; 01101111 - .BY %000 ; 01110000 - .BY %000 ; 01110001 - .BY %000 ; 01110010 - .BY %000 ; 01110011 - .BY %000 ; 01110100 - .BY %000 ; 01110101 - .BY %000 ; 01110110 - .BY %000 ; 01110111 - .BY %000 ; 01111000 - .BY %000 ; 01111001 - .BY %000 ; 01111010 - .BY %000 ; 01111011 - .BY %000 ; 01111100 - .BY %000 ; 01111101 - .BY %000 ; 01111110 - .BY %000 ; 01111111 - .BY %011 ; 10000000 - .BY %000 ; 10000001 - .BY %000 ; 10000010 - .BY %000 ; 10000011 - .BY %000 ; 10000100 - .BY %000 ; 10000101 - .BY %000 ; 10000110 - .BY %000 ; 10000111 - .BY %000 ; 10001000 - .BY %000 ; 10001001 - .BY %000 ; 10001010 - .BY %000 ; 10001011 - .BY %000 ; 10001100 - .BY %000 ; 10001101 - .BY %000 ; 10001110 - .BY %000 ; 10001111 - .BY %000 ; 10010000 - .BY %000 ; 10010001 - .BY %000 ; 10010010 - .BY %000 ; 10010011 - .BY %000 ; 10010100 - .BY %000 ; 10010101 - .BY %000 ; 10010110 - .BY %000 ; 10010111 - .BY %000 ; 10011000 - .BY %000 ; 10011001 - .BY %000 ; 10011010 - .BY %000 ; 10011011 - .BY %000 ; 10011100 - .BY %000 ; 10011101 - .BY %000 ; 10011110 - .BY %000 ; 10011111 - .BY %010 ; 10100000 - .BY %000 ; 10100001 - .BY %000 ; 10100010 - .BY %000 ; 10100011 - .BY %000 ; 10100100 - .BY %000 ; 10100101 - .BY %000 ; 10100110 - .BY %000 ; 10100111 - .BY %000 ; 10101000 - .BY %000 ; 10101001 - .BY %000 ; 10101010 - .BY %000 ; 10101011 - .BY %000 ; 10101100 - .BY %000 ; 10101101 - .BY %000 ; 10101110 - .BY %000 ; 10101111 - .BY %000 ; 10110000 - .BY %000 ; 10110001 - .BY %000 ; 10110010 - .BY %000 ; 10110011 - .BY %000 ; 10110100 - .BY %000 ; 10110101 - .BY %000 ; 10110110 - .BY %000 ; 10110111 - .BY %000 ; 10111000 - .BY %000 ; 10111001 - .BY %000 ; 10111010 - .BY %000 ; 10111011 - .BY %000 ; 10111100 - .BY %000 ; 10111101 - .BY %000 ; 10111110 - .BY %000 ; 10111111 - .BY %010 ; 11000000 - .BY %000 ; 11000001 - .BY %000 ; 11000010 - .BY %000 ; 11000011 - .BY %000 ; 11000100 - .BY %000 ; 11000101 - .BY %000 ; 11000110 - .BY %000 ; 11000111 - .BY %000 ; 11001000 - .BY %000 ; 11001001 - .BY %000 ; 11001010 - .BY %000 ; 11001011 - .BY %000 ; 11001100 - .BY %000 ; 11001101 - .BY %000 ; 11001110 - .BY %000 ; 11001111 - .BY %000 ; 11010000 - .BY %000 ; 11010001 - .BY %000 ; 11010010 - .BY %000 ; 11010011 - .BY %000 ; 11010100 - .BY %000 ; 11010101 - .BY %000 ; 11010110 - .BY %000 ; 11010111 - .BY %000 ; 11011000 - .BY %000 ; 11011001 - .BY %000 ; 11011010 - .BY %000 ; 11011011 - .BY %000 ; 11011100 - .BY %000 ; 11011101 - .BY %000 ; 11011110 - .BY %000 ; 11011111 - .BY %010 ; 11100000 - .BY %000 ; 11100001 - .BY %000 ; 11100010 - .BY %000 ; 11100011 - .BY %000 ; 11100100 - .BY %000 ; 11100101 - .BY %000 ; 11100110 - .BY %000 ; 11100111 - .BY %000 ; 11101000 - .BY %000 ; 11101001 - .BY %000 ; 11101010 - .BY %000 ; 11101011 - .BY %000 ; 11101100 - .BY %000 ; 11101101 - .BY %000 ; 11101110 - .BY %000 ; 11101111 - .BY %000 ; 11110000 - .BY %000 ; 11110001 - .BY %000 ; 11110010 - .BY %000 ; 11110011 - .BY %000 ; 11110100 - .BY %000 ; 11110101 - .BY %000 ; 11110110 - .BY %000 ; 11110111 - .BY %000 ; 11111000 - .BY %000 ; 11111001 - .BY %000 ; 11111010 - .BY %000 ; 11111011 - .BY %000 ; 11111100 - .BY %000 ; 11111101 - .BY %000 ; 11111110 - .BY %000 ; 11111111 +;----------------------------------------------------------- +; this table changes Angle to the appropriate tank character +BarrelTable + + .by $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2A,$2A, + .by $2A,$2A,$2A,$2A,$2A,$2A,$28,$28,$28,$28, + .by $28,$28,$28,$28,$28,$26,$26,$26,$26,$26, + .by $26,$26,$26,$24,$24,$24,$24,$24,$24,$24, + .by $24,$22,$22,$22,$22,$22,$22,$22,$22,$22, + .by $20,$20,$20,$20,$20,$20,$20,$20,$1E,$1E, + .by $1E,$1E,$1E,$1E,$1E,$1E,$1C,$1C,$1C,$1C, + .by $1C,$1C,$1C,$1C,$1C,$1A,$1A,$1A,$1A,$1A, + .by $1A,$1A,$1A,$18,$18,$18,$18,$18,$18,$18, + ;.by $18, + + .by $16,$16,$16,$16,$16,$16,$16,$16,$14,$14, + .by $14,$14,$14,$14,$14,$14,$12,$12,$12,$12, + .by $12,$12,$12,$12,$12,$10,$10,$10,$10,$10, + .by $10,$10,$10,$0E,$0E,$0E,$0E,$0E,$0E,$0E, + .by $0E,$0C,$0C,$0C,$0C,$0C,$0C,$0C,$0C,$0C, + .by $0A,$0A,$0A,$0A,$0A,$0A,$0A,$0A,$08,$08, + .by $08,$08,$08,$08,$08,$08,$06,$06,$06,$06, + .by $06,$06,$06,$06,$06,$04,$04,$04,$04,$04, + .by $04,$04,$04,$02,$02,$02,$02,$02,$02,$02, + .by $02, EndOfTheBarrelX - ; right angles from 0 (vertically up) to 90 (horizontally to the right) - .by 4,4,4,4,4,4,4,4,4,4,4 - .by 5,5,5,5,5,5,5,5,5,5 - .by 6,6,6,6,6,6,6,6,6 - .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7 + ; right angles from 0 (horizontally right) to 90 (up) - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0 ; not used + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,6,6,6,6,6,6,6,6,6, + .by 5,5,5,5,5,5,5,5,5,5, + .by 4,4,4,4,4,4,4,4,4,4, + ;.by 4, - ; left angles from 90 (horizontally to the left) to 1 (vertically up) - .by 0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .by 0,0,0,0,0,0,0,0,0,0,0,0,0 - .by 0,0,0,0,0,0,0,0,0,0 - .by 0,0,0,0,0,0,0,0,0 - .by 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .by 1,1,1,1,1,1,1,1,1 - .by 2,2,2,2,2,2,2,2,2,2 - .by 3,3,3,3,3,3,3,3,3,3,3 + ; left angles from 90 (vertical) to 180 (horizontally left) + .by 3,3,3,3,3,3,3,3,3,3, + .by 3,2,2,2,2,2,2,2,2,2, + .by 2,1,1,1,1,1,1,1,1,1, + .by 0,0,0,0,0,0,0,0,0,0, + .by 0,0,0,0,0,0,0,0,0,0, + .by 0,0,0,0,0,0,0,0,0,0, + .by 0,0,0,0,0,0,0,0,0,0, + .by 0,0,0,0,0,0,0,0,0,0, + .by 0,0,0,0,0,0,0,0,0,0, + .by 0 EndOfTheBarrelY - ; right angles from 0 (vertically up) to 90 (horizontally to the right) - .by 7,7,7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - .by 6,6,6,6,6,6,6,6,6 - .by 5,5,5,5,5,5,5,5,5,5 - .by 4,4,4,4,4,4,4,4,4,4,4,4,4 - .by 4,4,4,4,4,4,4,4,4,4,4,4,4,4 ; one pixel Up for fix problems with colision check -; .by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 +; right angles from 0 (horizontally right) to 90 (up) - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0,0,0,0,0,0,0 ; not used - .by 0,0,0,0 ; not used + ; one pixel Up for fix problems with colision check + ;.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 + .by 4,4,4,4,4,4,4,4,4,4, + .by 4,4,4,4,4,4,4,4,4,4, + .by 4,4,4,4,4,4,4,5,5,5, + .by 5,5,5,5,5,5,5,6,6,6, + .by 6,6,6,6,6,6,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + ;.by 7, + +; left angles from 90 (vertical) to 180 (horizontally left) + + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,7,7,7,7,7, + .by 7,7,7,7,7,6,6,6,6,6, + .by 6,6,6,6,5,5,5,5,5,5, + .by 5,5,5,5,4,4,4,4,4,4, + .by 4,4,4,4,4,4,4,4,4,4, + .by 4,4,4,4,4,4,4,4,4,4, + .by 4, + ; one pixel Up for fix problems with colision check + ;.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 - ; left angles from 90 (horizontally to the left) to 1 (vertically up) -; .by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 - .by 4,4,4,4,4,4,4,4,4,4,4,4,4,4 ; one pixel Up for fix problems with colision check - .by 4,4,4,4,4,4,4,4,4,4,4,4,4 - .by 5,5,5,5,5,5,5,5,5,5 - .by 6,6,6,6,6,6,6,6,6 - .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7,7 - .by 7,7,7,7,7,7,7,7,7,7,7 ;------------------------------------------------- TanksNamesDefault @@ -687,18 +429,18 @@ WeaponPriceL WeaponUnits .by 10 ;Baby_Missile___ .by 5 ;Missile________ - .by 3 ;Baby_Nuke______ + .by 2 ;Baby_Nuke______ .by 1 ;Nuke___________ .by 2 ;LeapFrog_______ - .by 2 ;Funky_Bomb_____ - .by 3 ;MIRV___________ + .by 3 ;Funky_Bomb_____ + .by 2 ;MIRV___________ .by 1 ;Death_s_Head___ .by 10 ;Napalm_________ .by 2 ;Hot_Napalm_____ .by 20 ;Tracer_________ .by 10 ;Smoke_Tracer___ - .by 10 ;Baby_Roller____ - .by 5 ;Roller_________ + .by 5 ;Baby_Roller____ + .by 3 ;Roller_________ .by 2 ;Heavy_Roller___ .by 5 ;Riot_Charge____ .by 2 ;Riot_Blast_____ @@ -710,9 +452,9 @@ WeaponUnits .by 10 ;Baby_Sandhog___ .by 5 ;Sandhog________ .by 2 ;Heavy_Sandhog__ - .by 10 ;Dirt_Clod______ - .by 5 ;Dirt_Ball______ - .by 2 ;Ton_of_Dirt____ + .by 5 ;Dirt_Clod______ + .by 3 ;Dirt_Ball______ + .by 1 ;Ton_of_Dirt____ .by 4 ;Liquid_Dirt____ .by 2 ;Dirt_Charge____ .by 10 ;Earth_Disrupter @@ -739,7 +481,7 @@ WeaponUnits .by 5 ;Horz_Guidance__ .by 5 ;Vert_Guidance__ .by 2 ;Lazy_Boy_______ - .by 8 ;Parachute______ + .by 3 ;Parachute______ .by 2 ;StrongParachute .by 2 ;Mag_Deflector__ .by 3 ;Shield_________ @@ -800,6 +542,22 @@ PurchaseMeTable ;weapons good to be purchased by the robot dta 0 ;"----------------" ; 45 dta 0 ;"----------------" ; 46 dta 0 ;"----------------" ; 47 + dta 0 ;"White Flag " ; 48 + dta 1 ;"Battery " ; 49 + dta 0 ;"Bal Guidance " ; 50 + dta 0 ;"Horz Guidance " ; 51 + dta 0 ;"Vert Guidance " ; 52 + dta 0 ;"Lazy Boy " ; 53 + dta 1 ;"Parachute " ; 54 + dta 1 ;"Strong Parachute" ; 55 + dta 1 ;"Mag Deflector " ; 56 + dta 1 ;"Shield " ; 57 + dta 1 ;"Force Shield " ; 58 + dta 1 ;"Heavy Shield " ; 59 + dta 0 ;"Super Mag " ; 60 + dta 1 ;"Auto Defense " ; 61 + dta 0 ;"Fuel Tank " ; 62 + dta 0 ;"Nuclear Winter " ; 63 ;------------------------------------------------- diff --git a/definitions.asm b/definitions.asm index 703aa1b..e01b886 100644 --- a/definitions.asm +++ b/definitions.asm @@ -23,27 +23,27 @@ price_Napalm_________ = $ffff ;496 ;_8 price_Hot_Napalm_____ = $ffff ;511 ;_9 price_Tracer_________ = 102 ;_10 price_Smoke_Tracer___ = 291 ;_11 -price_Baby_Roller____ = 689 ;_12 -price_Roller_________ = 600 ;_13 -price_Heavy_Roller___ = 592 ;_14 -price_Riot_Charge____ = 330 ;_15 -price_Riot_Blast_____ = 341 ;_16 -price_Riot_Bomb______ = 369 ;_17 -price_Heavy_Riot_Bomb = 322 ;_18 -price_Baby_Digger____ = 336 ;_19 -price_Digger_________ = 276 ;_20 -price_Heavy_Digger___ = 253 ;_21 -price_Baby_Sandhog___ = 218 ;_22 +price_Baby_Roller____ = 211 ;_12 +price_Roller_________ = 244 ;_13 +price_Heavy_Roller___ = 326 ;_14 +price_Riot_Charge____ = 230 ;_15 +price_Riot_Blast_____ = 241 ;_16 +price_Riot_Bomb______ = 259 ;_17 +price_Heavy_Riot_Bomb = 272 ;_18 +price_Baby_Digger____ = 136 ;_19 +price_Digger_________ = 176 ;_20 +price_Heavy_Digger___ = 207 ;_21 +price_Baby_Sandhog___ = 158 ;_22 price_Sandhog________ = 191 ;_23 -price_Heavy_Sandhog__ = 305 ;_24 +price_Heavy_Sandhog__ = 223 ;_24 price_Dirt_Clod______ = 104 ;_25 price_Dirt_Ball______ = 130 ;_26 price_Ton_of_Dirt____ = 171 ;_27 -price_Liquid_Dirt____ = 530 ;_28 -price_Dirt_Charge____ = 581 ;_29 +price_Liquid_Dirt____ = 330 ;_28 +price_Dirt_Charge____ = 343 ;_29 price_Earth_Disrupter = $ffff ;430 ;_30 price_Plasma_Blast___ = $ffff ;274 ;_31 -price_Laser__________ = 577 ;_32 +price_Laser__________ = 277 ;_32 price______________33 = 0 price______________34 = 0 price______________35 = 0 @@ -67,10 +67,10 @@ price_Vert_Guidance__ = $ffff ;_52 price_Lazy_Boy_______ = $ffff ;_53 price_Parachute______ = 234 ;_54 price_StrongParachute = 1000 ;_55 -price_Mag_Deflector__ = 245 ;_56 -price_Shield_________ = 112 ;_57 -price_Force_Shield___ = 268 ;_58 -price_Heavy_Shield___ = 375 ;_59 +price_Mag_Deflector__ = 745 ;_56 +price_Shield_________ = 224 ;_57 +price_Force_Shield___ = 1100 ;_58 +price_Heavy_Shield___ = 628 ;_59 price_Super_Mag______ = $ffff ;_60 price_Auto_Defense___ = 512 ;_61 price_Fuel_Tank______ = $ffff ;_62 diff --git a/grafproc.asm b/grafproc.asm index 218498e..e974b02 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -609,29 +609,18 @@ DrawNextTank ldx tankNr ; let's check the energy lda eXistenZ,x - bne SkipRemovigPM ; if energy=0 then no tank + bne SkipHidingPM ; if energy=0 then no tank ; hide P/M lda #0 sta hposp0,x jmp DoNotDrawTankNr -SkipRemovigPM +SkipHidingPM lda AngleTable,x - bmi AngleToLeft01 - lda #90 - sec - sbc AngleTable,x tay - lda BarrelTableR,y - jmp CharacterAlreadyKnown -AngleToLeft01 - sec - sbc #(255-90) - tay - lda BarrelTableL,y -CharacterAlreadyKnown + lda BarrelTable,y sta CharCode DrawTankNrX ldx tanknr @@ -742,11 +731,11 @@ tankflash_loop sne:mva #1 fs ; finish it mva #1 Erase ldx TankNr - jsr DrawTankNr.SkipRemovigPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! + jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! PAUSE 2 mva #0 Erase ldx TankNr - jsr DrawTankNr.SkipRemovigPM + jsr DrawTankNr.SkipHidingPM PAUSE 2 dec fs jne tankflash_loop diff --git a/lib/macro.hea b/lib/macro.hea index 6181aa6..4e29ec5 100644 --- a/lib/macro.hea +++ b/lib/macro.hea @@ -104,6 +104,9 @@ .macro randomize ;usage: randomize floor ceiling ;returns (in A) a random .byte between "floor" and "ceiling" + .if :2 < :1 + .error "floor higher than ceiling" + .endif ?rand lda random cmp #:1 ;floor diff --git a/scorch.asm b/scorch.asm index 56d0084..4283fed 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"145" ; number of this build (3 bytes) + dta d"146" ; number of this build (3 bytes) .endm icl 'definitions.asm' @@ -73,6 +73,9 @@ .zpvar dd .word .zpvar di .word .zpvar dp .word + ;---------------------------- + .zpvar UnderTank1 .byte + .zpvar UnderTank2 .byte ;---------------------------- .zpvar weaponPointer .word .zpvar dliCounter .byte @@ -308,12 +311,16 @@ SettingEnergies jsr SetMainScreen jsr ColorsOfSprites + lda #0 + sta colpf2s ; status line "off" + sta colpf1s jsr drawmountains ;draw them jsr drawtanks ;finally draw tanks mva #0 TankSequencePointer ;---------round screen is ready--------- + mva #TextForegroundColor colpf1s ; status line "on" rts .endp @@ -373,6 +380,7 @@ DoNotFinishTheRound mva #0 noDeathCounter mva #sfx_seppuku sfx_effect + jsr DisplaySeppuku jmp Seppuku @@ -485,12 +493,15 @@ AfterExplode NoFallDown2 ;here tanks are falling down mva tankNr tempor2 - mva #0 TankNr + mvx #0 TankNr TanksFallDown + lda eXistenZ,x + beq NoExistNoFall jsr TankFalls - inc:lda TankNr - cmp NumberOfPlayers +NoExistNoFall + inc:ldx TankNr + cpx NumberOfPlayers bne TanksFallDown mva tempor2 TankNr missed @@ -741,6 +752,9 @@ NotNegativeShieldEnergy sta ydraw+1 ; get position of the tank ldx TankNr + lda #0 ; turn off defense weapons when hara-kiring + sta ActiveDefenceWeapon,x + sta ShieldEnergy,x lda xtankstableL,x sta xdraw lda xtankstableH,x @@ -1076,9 +1090,9 @@ UsageLoop bcs RandomizeAngle - sta temp - lda #90 ; CARRY=0 here - sbc temp + ;sta temp + ;lda #90 ; CARRY=0 here + ;sbc temp rts .endp @@ -1132,32 +1146,16 @@ LimitForce .proc MoveBarrelToNewPosition jsr DrawTankNr ldx TankNr - lda AngleTable,x - clc - adc #90 ;shift angle to the positive values - sta temp lda NewAngle - clc - adc #90 - cmp temp + cmp AngleTable,x beq BarrelPositionIsFine bcc rotateLeft ; older is bigger rotateRight;older is lower inc angleTable,x - bne MoveBarrelToNewPosition - - mva #$30 CharCode ; if angle goes through 0 we clear the barrel - jsr DrawTankNr.drawtankNrX - jmp MoveBarrelToNewPosition rotateLeft dec angleTable,x - bpl MoveBarrelToNewPosition - mva #$2e CharCode - jsr DrawTankNr.drawtankNrX - jmp MoveBarrelToNewPosition - BarrelPositionIsFine rts @@ -1344,7 +1342,7 @@ font4x4 ins 'artwork/font4x4s.bmp',+62 ;---------------------------------------------- TankFont - ins 'artwork/tanks.fnt' + ins 'artwork/tanksv2.fnt' ;---------------------------------------------- icl 'variables.asm' ;---------------------------------------------- @@ -1364,7 +1362,7 @@ MODUL equ $b000 ;address of RMT module TheEnd .ECHO 'TheEnd: ',TheEnd .if TheEnd > PMGraph + $300 - .error memory conflict + .error "memory conflict" .endif ;---------------------------------------------- diff --git a/scorch.xex b/scorch.xex index f02f07a..3f09126 100644 Binary files a/scorch.xex and b/scorch.xex differ diff --git a/textproc.asm b/textproc.asm index 8b79b17..cac0e40 100644 --- a/textproc.asm +++ b/textproc.asm @@ -803,7 +803,11 @@ NotBattery beq DefActivationEnd NotWhiteFlag NoDeactivateWhiteFlag + ; activate new defensive sta ActiveDefenceWeapon,x + ; set defensive energy + lda DefensiveEnergy,y + sta ShieldEnergy,x DecreaseDefensive ; decrease number of defensives lda TanksWeaponsTableL,x @@ -815,8 +819,6 @@ DecreaseDefensive sbc #1 sta (weaponPointer),y - lda DefensiveEnergy,y - sta ShieldEnergy,x DefActivationEnd jmp WaitForKeyRelease ; rts @@ -1203,7 +1205,7 @@ CheckNextLevel .proc displaydec ;decimal (word), displayposition (word) ;-------------------------------------------------- ; displays decimal number as in parameters (in text mode) -; leading zeores are removed +; leading zeroes are removed ; the range is (0000..9999 - two bytes) ldy #3 ; there will be 4 digits @@ -1905,33 +1907,36 @@ NoShieldEnergy ldx TankNr lda AngleTable,x bmi AngleToLeft - lda #$7f ; (tab) character - sta textbuffer+40+25 - lda #0 ;space - sta textbuffer+40+22 - lda #90 - sec - sbc AngleTable,x + + lda AngleTable,x sta decimal + ;lda #$7f ; (tab) character + ;sta textbuffer+40+25 + lda #0 ;space + ;sta textbuffer+40+22 + sta decimal+1 ; angle is single byte, but displayed with displaydec (word) routine + ;lda #90 + ;sec + ;sbc AngleTable,x tay - lda BarrelTableR,y + lda BarrelTable,y sta CharCode bne AngleDisplay ;like jmp, because code always <>0 AngleToLeft - sec - sbc #(255-90) + ;sec + ;sbc #(255-90) sta decimal tay - lda BarrelTableL,y + lda BarrelTable,y sta CharCode - lda #$7e ;(del) char - sta textbuffer+40+22 - lda #0 ;space - sta textbuffer+40+25 + ;lda #$7e ;(del) char + ;sta textbuffer+40+22 + ;lda #0 ;space + ;sta textbuffer+40+25 AngleDisplay - mwa #textbuffer+40+23 displayposition - jsr displaybyte + mwa #textbuffer+40+21 displayposition + jsr displaydec ;========================= ;display Wind diff --git a/variables.asm b/variables.asm index 93ed69f..c444e67 100644 --- a/variables.asm +++ b/variables.asm @@ -12,7 +12,7 @@ TanksNames ; DO NOT ZERO - ticket #24 :6 dta d" " ;---------------------------------------------------- ;Options DO NOT ZERO - ticket #27 -OptionsTable .by 0,0,2,2,0,1,3 +OptionsTable .by 0,1,2,2,0,1,3 RoundsInTheGame .by 10 ;how many rounds in the current game seppukuVal .by 75 ;---------------------------------------------------- @@ -178,7 +178,7 @@ xcircle .DS 2 ycircle .DS 2 tempcir .DS 2 ;TankFalls -IfFallDown .DS 1 +FallingSoundBit .DS 1 PreviousFall .DS 1 EndOfTheFallFlag .DS 1 ; in case of the infinite fall Parachute .DS 1 ; are you insured with parachute? diff --git a/weapons.asm b/weapons.asm index 963ae92..c17543b 100644 --- a/weapons.asm +++ b/weapons.asm @@ -202,11 +202,8 @@ FunkyBombLoop lda random sta Force mva #1 Force+1 - ;Angle randomization Range: (-16..+16) - lda random - lsr - and #%00011111 - scc:eor #$ff + ;Angle randomization Range: (70-110 degrees) + randomize 70 110 sta Angle lda #0 @@ -235,16 +232,22 @@ NoExplosionInFunkyBomb mva #31 ExplosionRadius jsr CalculateExplosionRange - mva #sfx_nuke sfx_effect + mva #sfx_nuke sfx_effect + SaveDrawXY jsr xmissile + UnSaveDrawXY sbw xdraw #35 jsr CalculateExplosionRange mva #sfx_nuke sfx_effect + SaveDrawXY jsr xmissile + UnSaveDrawXY adw xdraw #70 jsr CalculateExplosionRange mva #sfx_nuke sfx_effect + SaveDrawXY jsr xmissile + UnSaveDrawXY sbw xdraw #35 ; sbw ydraw #35 @@ -252,18 +255,32 @@ NoExplosionInFunkyBomb cpw ydraw #screenHeight bcs NoUpperCircle mva #sfx_nuke sfx_effect + SaveDrawXY jsr xmissile + UnSaveDrawXY NoUpperCircle adw ydraw #70 ;jsr CalculateExplosionRange cpw ydraw #screenHeight bcs NoLowerCircle mva #sfx_nuke sfx_effect + SaveDrawXY jsr xmissile + UnSaveDrawXY NoLowerCircle mva #sfx_silencer sfx_effect rts .endp +.proc SaveDrawXY + mwa xdraw tempXROLLER + mwa ydraw modify + rts +.endp +.proc UnSaveDrawXY + mwa tempXROLLER xdraw + mwa modify ydraw + rts +.endp ; ------------------------ .proc babyroller inc FallDown2 @@ -536,35 +553,30 @@ DiggerCharacter lda #$00 sbc #$00 sta ybyte+1 + mva #0 drawFunction + mwa xdraw LaserCoordinate mwa ydraw LaserCoordinate+2 mwa xbyte LaserCoordinate+4 mwa ybyte LaserCoordinate+6 - mva #sfx_lightning sfx_effect - jsr draw - mva #0 color - mwa LaserCoordinate xdraw - mwa LaserCoordinate+2 ydraw - mwa LaserCoordinate+4 xbyte - mwa LaserCoordinate+6 ybyte mva #sfx_lightning sfx_effect - jsr draw - mva #1 color - mwa LaserCoordinate xdraw - mwa LaserCoordinate+2 ydraw - mwa LaserCoordinate+4 xbyte - mwa LaserCoordinate+6 ybyte - mva #sfx_lightning sfx_effect - jsr draw - mva #0 color - mwa LaserCoordinate xdraw - mwa LaserCoordinate+2 ydraw - mwa LaserCoordinate+4 xbyte - mwa LaserCoordinate+6 ybyte - mva #sfx_lightning sfx_effect - jsr draw + mva #51 yc ; laser blink counter +@ + lda yc + and #$01 + sta color + mwa LaserCoordinate xdraw + mwa LaserCoordinate+2 ydraw + mwa LaserCoordinate+4 xbyte + mwa LaserCoordinate+6 ybyte + mva #sfx_lightning sfx_effect + jsr draw + + dec:lda yc + bpl @- + mva #1 color mwa LaserCoordinate xdraw mwa LaserCoordinate+2 ydraw @@ -1179,34 +1191,34 @@ CTRLPressedDown bmi ForceGoesZero jmp BeforeFire -pressedLeft +pressedRight mva #sfx_set_power_2 sfx_effect ldx TankNr dec AngleTable,x lda AngleTable,x - cmp #$ff ; if angle goes through 0 we clear the barrel - bne NotThrough90DegreesLeft - mva #$2e CharCode - jsr DrawTankNr.drawtankNrX -NotThrough90DegreesLeft - cmp #(255-91) + ;cmp #180 ; if angle goes through 180 we clear the barrel + ;bne NotThrough90DegreesLeft + ;mva #$2e CharCode ; TODO: change + ;jsr DrawTankNr.drawtankNrX +;NotThrough90DegreesLeft + cmp #255 ; -1 jne BeforeFire - lda #90 + lda #180 sta AngleTable,x jmp BeforeFire -pressedRight +pressedLeft mva #sfx_set_power_2 sfx_effect ldx TankNr INC AngleTable,x lda AngleTable,x - bne NotThrough90DegreesRight - mva #$30 CharCode ; if angle goes through 0 we clear the barrel - jsr DrawTankNr.drawtankNrX -NotThrough90DegreesRight - cmp #91 + ;bne NotThrough90DegreesRight + ;mva #$30 CharCode ; if angle goes through 0 we clear the barrel + ;jsr DrawTankNr.drawtankNrX +;NotThrough90DegreesRight + cmp #181 jne BeforeFire - lda #(255-90) + lda #0 sta AngleTable,x jmp BeforeFire @@ -1354,15 +1366,14 @@ ShotUnderGround rts .endp - ;-------------------------------------------------- .proc TankFalls; ;-------------------------------------------------- - mva #sfx_shield_off sfx_effect lda #0 - sta PreviousFall + sta PreviousFall ; bit 7 - left, bit 6 - right sta EndOfTheFallFlag sta Parachute + mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop ; let's check if the given tank has got the parachute ldx TankNr @@ -1376,155 +1387,13 @@ ShotUnderGround ParachuteActive inc Parachute TankFallsX - ; coordinates of the first pixel under the tank - ldx TankNr - lda XtankstableL,x - sta xdraw - lda XtankstableH,x - sta xdraw+1 - lda Ytankstable,x - clc - adc #1 ; in this point the comment helped us! For the very first - ; time in our lives! Tada! It opens a new chapter!!! - sta ydraw - ; - lda #08 - sta mask2 ; Loop Counter -ByteBelowTank - jsr point - beq EmptyPoint2 - sec - bcs ROLPoint2 -EmptyPoint2 - clc -ROLPoint2 - rol mask1 - inw xdraw - dec mask2 - bne ByteBelowTank - ldx mask1 - lda WhereToSlideTable,x - sta IfFallDown ; taking directions of falling down from the table - bne ItStillFalls - ; Tank falling down already finished, but it is not sure that - ; the horizontal coordinate is even. - ; If it is odd then it must be corrected because otherwise - ; P/M graphics background would not look OK - ldx TankNr - lda XtanksTableL,x - and #$01 - jeq EndOfFall ; if it is even then it is the end - ; and if not, we push it one pixel the way it was falling before - lda PreviousFall - sta IfFallDown - inc EndOfTheFallFlag ; because after this correction is shouldn't fall anymore - -; we have 3 bits: 0 - go down, 1 - go right, 2 - go left -;--- -ItStillFalls - lda Parachute - and #1 - bne ParachutePresent - ; decreasing energy - if the vertical fall, substract 2 - ; and if at an angle then substract 1 - ldy #1 ; how much energy to substract - lda IfFallDown - and #1 - beq NoFallingDown - ldx TankNr - jsr DecreaseEnergyX - lda IfFallDown - and #6 - bne FallDiagonally - ldx TankNr - jsr DecreaseEnergyX -FallDiagonally -NoFallingDown -ParachutePresent - ; check parachute type - lda ActiveDefenceWeapon,x - cmp #ind_StrongParachute ; strong parachute - bne OneTimeParachute - ; decreasing energy of parachute - if the vertical fall, substract 2 - ; and if at an angle then substract 1 - ldy #1 ; how much energy to substract - lda IfFallDown - and #1 - beq NoFallingDown2 - ldx TankNr - jsr DecreaseShieldEnergyX - cpy #0 ; is necessary to reduce tenk energy ? - beq @+ - jsr DecreaseEnergyX -@ - ldy #1 - lda IfFallDown - and #6 - bne FallDiagonally2 - ldx TankNr - jsr DecreaseShieldEnergyX - cpy #0 ; is necessary to reduce tenk energy ? - beq @+ - jsr DecreaseEnergyX -@ - ; check energy of parachute - - lda ShieldEnergy,x - bne OneTimeParachute - mva #0 Parachute - mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) - ; and now we must clear parachute symbol - mva #1 Erase - jsr DrawTankParachute -FallDiagonally2 -NoFallingDown2 -OneTimeParachute - ; we must set flag meaning that the tank was falling down - ; because later maybe the number of parachutes will decrease - ; (if there were parachutes and they were ON) - - lda Parachute - ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) - sta Parachute -testowanie - ; storing last direction of falling - ; (it is not necessarily the direction from the previous - ; iteraction, so we must check directional bits before storing) - lda IfFallDown - and #$06 - beq FallStraightDown - sta PreviousFall -FallStraightDown - lda Parachute - and #01 - beq RapidFalling - wait -RapidFalling - ; we finish falling down if the tank reached the edge of the screen - ; but if it falls straight down or the other way than the edge, - ; then continue falling! - ldx TankNr - lda XtanksTableL,x - bne NotLeftEdge - lda XtanksTableH,x - bne NotLeftEdge - lda IfFallDown - and #$04 ; check if it does not fall left - jne EndOfFall ; if so then maybe we finish -NotLeftEdge - clc - lda XtanksTableL,x - adc #$08 ; we'll check right side of the char - sta temp - lda XtanksTableH,x - adc #0 - sta temp+1 - cpw temp #screenwidth - bne NotRightEdge - lda IfFallDown - and #$02 ; check if it does not fall right - jne EndOfFall ; if so then maybe we finish -NotRightEdge + ; sound only if really falls + lda Parachute + and FallingSoundBit ; bit 1 + beq NoFallingSound + mva #0 FallingSoundBit + mva #sfx_shield_off sfx_effect +NoFallingSound ; clear previous position mva #1 Erase jsr DrawTankNr @@ -1538,17 +1407,100 @@ NotRightEdge DoNotClearParachute mva #0 Erase ldx TankNr - lsr IfFallDown ; bit nr 0 (down) - bcc DoesNotFallDown - ; tank is falling down + lda EndOfTheFallFlag ; We only get byte below the tank if still falling + bne NoGroundCheck + ; coordinates of the first pixel under the tank + ldx TankNr + lda XtankstableL,x + sta xdraw + lda XtankstableH,x + sta xdraw+1 + lda Ytankstable,x + clc + adc #1 ; in this point the comment helped us! For the very first + ; time in our lives! Tada! It opens a new chapter!!! + sta ydraw + ; +; UnderTank1 ; byte under tank +; UnderTank2 ; byte under tank reversed (for simple check right direction) + lda #08 + sta temp ; Loop Counter +ByteBelowTank + jsr point + beq EmptyPoint2 + sec + ror UnderTank2 + sec + bcs ROLPoint2 +EmptyPoint2 + clc + ror UnderTank2 + clc +ROLPoint2 + rol UnderTank1 + inw xdraw + dec temp + bne ByteBelowTank +NoGroundCheck + ldx TankNr + lda UnderTank1 + bne NoFallingDown + ; Tank falling down ---- + lda Parachute + and #1 + bne ParachutePresent + ; decreasing energy + ldy #2 ; how much energy to substract + jsr DecreaseEnergyX +ParachutePresent + ; check parachute type + lda ActiveDefenceWeapon,x + cmp #ind_StrongParachute ; strong parachute + bne OneTimeParachute + ; decreasing energy of parachute + ldy #2 ; how much energy to substract + jsr DecreaseShieldEnergyX + cpy #0 ; is necessary to reduce tenk energy ? + beq @+ + jsr DecreaseEnergyX +@ + ; check energy of parachute + lda ShieldEnergy,x + bne OneTimeParachute + mva #0 Parachute + mva #0 ActiveDefenceWeapon,x ; deactivate defence +OneTimeParachute + lda Parachute + ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) + sta Parachute + ; tank is falling down - modify coorinates lda Ytankstable,x clc adc #1 sta Ytankstable,x -DoesNotFallDown - lsr IfFallDown ; bit nr 1 (right) - bcc DoesNotFallLeft - ; tank is falling left + jmp EndOfFCycle +NoFallingDown + ; check direction (left or right) + ldy #7 ; SlideLeftTable length -1 (from 0 to 7) +@ lda SlideLeftTable,y + cmp UnderTank1 + beq FallingRight + cmp UnderTank2 + beq FallingLeft + dey + bpl @- + bmi NoLeftOrRight +FallingLeft + ; tank is falling left + bit PreviousFall ; bit 6 - right + bvs EndLeftFall + ; we finish falling left if the tank reached the edge of the screen + lda XtanksTableL,x + bne NotLeftEdge + lda XtanksTableH,x + beq EndLeftFall +NotLeftEdge + ; tank is falling left - modify coorinates clc lda XtankstableL,x adc #1 @@ -1556,10 +1508,23 @@ DoesNotFallDown lda XtankstableH,x adc #0 sta XtankstableH,x -DoesNotFallLeft - lsr IfFallDown ; bit nr 2 (left) - bcc DoesNotFallRight - ; tank is falling right + mva #%10000000 PreviousFall ; set bit 7 - left + bne EndOfFCycle +FallingRight + ; tank is falling right + bit PreviousFall ; bit 7 - left + bmi EndRightFall + ; we finish falling right if the tank reached the edge of the screen + clc + lda XtanksTableL,x + adc #$08 ; we'll check right side of the char + sta temp + lda XtanksTableH,x + adc #0 + sta temp+1 + cpw temp #screenwidth + beq EndRightFall + ; tank is falling right - modify coorinates sec lda XtankstableL,x sbc #1 @@ -1567,44 +1532,72 @@ DoesNotFallLeft lda XtankstableH,x sbc #0 sta XtankstableH,x -DoesNotFallRight - jsr DrawTankNr - + mva #%01000000 PreviousFall ; set bit 6 - right + bne EndOfFCycle +EndLeftFall +EndRightFall +NoLeftOrRight + inc EndOfTheFallFlag ; after this is shouldn't fall +EndOfFCycle + ; draw tank on new position + jsr DrawTankNr ; ew have TankNr in X (I hope :) ) ; checking is parachute present and if so, draw it lda Parachute - and #01 - beq DoNotDrawParachute - + cmp #3 ; parachute and falling + bne DoNotDrawParachute ; here we draw parachute ldx TankNr jsr DrawTankParachute + wait ; onli if tank with patachute +RapidFalling DoNotDrawParachute - lda EndOfTheFallFlag - jeq TankFallsX - + lda EndOfTheFallFlag + jeq TankFallsX + ; Tank falling down already finished, but it is not sure that + ; the horizontal coordinate is even. + ; If it is odd then it must be corrected because otherwise + ; P/M graphics background would not look OK + ldx TankNr + lda XtanksTableL,x + and #$01 + beq EndOfFall ; if it is even then it is the end + ; and if not, we push it one pixel the way it was falling before + lda #%10000000 ; set "virtual ground" for right falling + ldy #%00000001 + bit PreviousFall + bmi ForceFallLeft + tay ; tricky - replaces ldy #%10000000 + lda #%00000001 ; set "virtual ground" for left falling +ForceFallLeft + sta UnderTank1 + sty UnderTank2 + jne TankFallsX EndOfFall - jsr DrawTankNr - + mva #1 Erase + ldx TankNr ; if tank was falling down having parachute, ; we must deduct one parachute lda Parachute cmp #$03 ; was falling down and the parachute - bne ThereWasNoParachute - ; first we clear parachute on the screen - mva #1 Erase - ldx TankNr + bne NoParachuteWeapon + ; first we check type of parachute lda ActiveDefenceWeapon,x cmp #ind_Parachute______ ; deactivate weapon only if parachute (54) bne NoParachuteWeapon mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) NoParachuteWeapon + ; now we clear parachute on the screen if present + lda Parachute + and #01 + beq ThereWasNoParachute jsr DrawTankParachute +ThereWasNoParachute mva #0 Erase ldx TankNr jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) -ThereWasNoParachute mva #sfx_silencer sfx_effect rts + .endp ;-------------------------------------------------- @@ -1629,8 +1622,8 @@ ThereWasNoParachute ; Angle(byte) 128=0, 255=maxright, 0=maxleft ;-------------------------------------------------- ;g=-0.1 -;vx=Force*sin(Angle) -;vy=Force*cos(Angle) +;vx=Force*cos(Angle) +;vy=Force*sin(Angle) ; ;:begin ;ytraj=ytray-vy @@ -1640,6 +1633,9 @@ ThereWasNoParachute ;plot xtraj,ytraj - there is clearing in plot ;goto begin + + + ; smoke tracer :) ldy #0 ldx TankNr @@ -1667,45 +1663,41 @@ RepeatFlight sta ydraw+1 ;vx calculation + ;vx = sin(90-Angle) for Angle <=90 + ;vx = -sin(Angle-90) for 90 < Angle <= 180 aslw Force ;Force = Force * 2 - ;sin(Angle) + ;cos(Angle) (but we use sin table only so some shenanigans happen) ldx Angle stx LeapFrogAngle ; we will need it later ;Angle works like this: - ;0 'degrees' is straight up - ;90 'degrees' is horizontally right - ;255 is straight up (same as 0) - ;255-90 (165) horizontally left + ;0 'degrees' is horizontally right + ;90 'degrees' is straight up + ;180 horizontally left - bpl FlightRight + ; (we have to set goleft used in rolling weapons) + + cpx #91 + bcc angleUnder90 - ;and if the highest bit is set then - ;Flight to LEFT - ;calculate Angle with this formula: - ;Angle=90-(Angle-165) - - sec - txa - sbc #165 ;(Angle-165) - sta temp - lda #90 - sbc temp ;90-(Angle-165) - ;and we have rady angle here ... and we go LEFT! - tax - sta Angle - - ; and now we contine as if nothing happened - ; (but we have goleft set to 1!!!) + ;over 90 mva #1 goleft - bne @+ + sec + txa ; lda # Angle + sbc #90 + tax + jmp @+ -FlightRight +angleUnder90 mva #0 goleft -@ - lda sintable,x ;sin(Angle) - sta Multiplee ;sin(Angle)*Force + sec ; X = 90-Angle + lda #90 + sbc Angle + tax +@ + lda sintable,x ; cos(X) + sta Multiplee ; *Force mwa Force Multiplier lda #$0 sta Multiplier+2 @@ -1744,18 +1736,27 @@ DoNotAdd .endr @ ;======vy - lda #0 ;cos(Angle) + ;vy = sin(Angle) for Angle <=90 + ;vy = sin(180-Angle) for 90 < Angle <= 180 + + lda #0 sta vy sta vy+1 sta vy+2 ;-- - lda #90 + ldx Angle + cpx #91 + bcc YangleUnder90 + + lda #180 sec sbc Angle tax + +YangleUnder90 lda sintable,x - sta Multiplee ;cos(Angle)*Force + sta Multiplee ;sin(Angle)*Force mwa Force Multiplier lda #$0 sta Multiplier+2 @@ -1814,7 +1815,7 @@ Loopi ; we check if it is MIRV and if so, jump to MIRV routine ldx TankNr lda ActiveWeapon,x - cmp #6 ; MIRV + cmp #ind_MIRV___________ ; MIRV jeq MIRVdownLoop StillUp