diff --git a/.gitignore b/.gitignore index 5b9bd87..f538938 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.bak +scorch.lab +scorch.lst diff --git a/ai.asm b/ai.asm index ca248b2..7f90a97 100644 --- a/ai.asm +++ b/ai.asm @@ -57,11 +57,23 @@ AIRoutines .word Shooter-1 ;Shooter .word Poolshark-1 ;Poolshark .word Tosser-1 ;Tosser - .word Tosser-1 ;Chooser - .word Tosser-1 ;Spoiler - .word Tosser-1 ;Cyborg - .word Tosser-1 ;Unknown + .word Chooser-1 ;Chooser + .word Spoiler-1 ;Spoiler + .word Cyborg-1 ;Cyborg + .word Unknown-1 ;Unknown +;---------------------------------------------- +.proc Unknown + ; random robotank (from Poolshark to Cyborg) + randomize 4 13 + and #%11111110 + tay + lda AIRoutines+1,y + pha + lda AIRoutines,y + pha + rts +.endp ;---------------------------------------------- .proc Moron jsr RandomizeAngle @@ -154,101 +166,29 @@ loop .endp ;---------------------------------------------- .proc Poolshark + jsr UseBatteryOrFlag ; 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 @- - ; decrease in inventory - clc - sbc #1 - sta (temp),y ; has address of TanksWeaponsTable - ; activate defensive weapon - tya ; number of selectet defensive weapon - sta ActiveDefenceWeapon,x - lda DefensiveEnergy,y - sta ShieldEnergy,x -NoUseDefensive -DefensiveInUse + jsr PoolsharkDefensives firstShoot ;find nearest tank neighbour - jsr MakeLowResDistances - mva #$ff temp2 ; min possible distance - - ;ldx TankNr - ldy NumberOfPlayers - dey - -loop01 - cpy TankNr - beq skipThisPlayer - lda eXistenZ,y - beq skipThisPlayer - - lda LowResDistances,x - cmp LowResDistances,y - bcs EnemyOnTheLeft - ;enemy on the right - sec - lda LowResDistances,y - sbc LowResDistances,x - cmp temp2 ; lowest - bcs lowestIsLower - sta temp2 - sty temp2+1 ; number of the closest tank + jsr FindBestTarget2 + beq EnemyOnLeft ; calculate index to shotangle table + ; in temp2 we have x distance divided by 8 + lda temp2 :3 lsr @ and #%00000111 clc adc #8 - sta AngleTablePointer - jmp lowestIsLower - -EnemyOnTheLeft - sec - lda LowResDistances,x - sbc LowResDistances,y - cmp temp2 ; lowest - bcs lowestIsLower - sta temp2 - sty temp2+1 ; number of the closest tank - ; calculate index to shotangle table + sta AngleTablePointer + bne AngleIsSet +EnemyOnLeft + lda temp2 :3 lsr @ and #%00000111 eor #%00000111 - sta AngleTablePointer - -lowestIsLower -skipThisPlayer - dey - bpl loop01 + sta AngleTablePointer +AngleIsSet randomize 0 8 ldy AngleTablePointer @@ -286,7 +226,72 @@ AngleTable ; 16 bytes ;ba w $348b L$3350 .by 18,26,34,43,50,58,66,74 .endp ;---------------------------------------------- +.proc UseBatteryOrFlag + ; 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 + ; if very low energy and no battery then use White Flag + lda Energy,x + cmp #5 + bcs EnoughEnergy + ; lower than 5 units - white flag + lda #ind_White_Flag_____ + sta ActiveDefenceWeapon,x +EnoughEnergy + rts +.endp +;---------------------------------------------- +.proc PoolsharkDefensives + ; 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 @- + ; decrease in inventory + clc + sbc #1 + sta (temp),y ; has address of TanksWeaponsTable + ; activate defensive weapon + tya ; number of selectet defensive weapon + sta ActiveDefenceWeapon,x + lda DefensiveEnergy,y + sta ShieldEnergy,x +NoUseDefensive +DefensiveInUse + rts +.endp +;---------------------------------------------- .proc Tosser + jsr UseBatteryOrFlag + ; use best defensive :) + jsr TosserDefensives + ; Toosser is like Poolshark but allways uses defensives + jmp Poolshark.firstShoot +.endp +;---------------------------------------------- +.proc TosserDefensives ; use best defensive :) ; allways ; first check check if any is in use @@ -310,8 +315,512 @@ AngleTable ; 16 bytes ;ba w $348b L$3350 sta ShieldEnergy,x DefensiveInUse NoUseDefensive - ; Toosser is like Poolshark but allways uses defensives - jmp Poolshark + rts +.endp +;---------------------------------------------- +.proc Chooser + ; like cyborg but more randomizing force + jsr UseBatteryOrFlag + ; use defensives like Tosser + jsr TosserDefensives + ; now select best target + jsr FindBestTarget3 + sty TargetTankNr + ; aiming + jsr TakeAim ; direction still in A (0 - left, >0 - right) + + ; choose the best weapon + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + ldy #ind_LeapFrog_______ ;the last offensive weapon to use +loop + dey + lda (temp),y + beq loop + tya + sta ActiveWeapon,x + + ; randomizing force +-100 + sbw Force #100 RandBoundaryLow + bpl NotNegativeEnergy + mwa #1 RandBoundaryLow +NotNegativeEnergy + adw Force #100 RandBoundaryHigh + jsr RandomizeForce + lda ForceTableH,x + bne HighForce + ; if Force lower than 256 - set weapon to Baby Missile (for security :) ) + lda #ind_Baby_Missile___ + sta ActiveWeapon,x +HighForce + rts +.endp +;---------------------------------------------- +.proc Spoiler + ; like cyborg but little randomizing force + jsr UseBatteryOrFlag + ; use defensives like Tosser + jsr TosserDefensives + ; now select best target + jsr FindBestTarget3 + sty TargetTankNr + ; aiming + jsr TakeAim ; direction still in A (0 - left, >0 - right) + + ; choose the best weapon + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + ldy #ind_LeapFrog_______ ;the last offensive weapon to use +loop + dey + lda (temp),y + beq loop + tya + sta ActiveWeapon,x + + ; randomizing force +-50 + sbw Force #50 RandBoundaryLow + bpl NotNegativeEnergy + mwa #1 RandBoundaryLow +NotNegativeEnergy + adw Force #50 RandBoundaryHigh + jsr RandomizeForce + lda ForceTableH,x + bne HighForce + ; if Force lower than 256 - set weapon to Baby Missile (for security :) ) + lda #ind_Baby_Missile___ + sta ActiveWeapon,x +HighForce + rts +.endp +;---------------------------------------------- +.proc Cyborg + jsr UseBatteryOrFlag + ; use defensives like Tosser + jsr TosserDefensives + ; now select best target + jsr FindBestTarget3 + sty TargetTankNr + ; aiming + jsr TakeAim ; direction still in A (0 - left, >0 - right) + + ; choose the best weapon + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + ldy #ind_LeapFrog_______ ;the last offensive weapon to use +loop + dey + lda (temp),y + beq loop + tya + sta ActiveWeapon,x + + lda Force + sta ForceTableL,x + lda Force+1 + sta ForceTableH,x + bne HighForce + ; if Force lower than 256 - set weapon to Baby Missile (for security :) ) + lda #ind_Baby_Missile___ + sta ActiveWeapon,x +HighForce + rts +.endp + +;---------------------------------------------- +.proc FindBestTarget3 +; find target with lowest energy +; X - shooting tank number +; returns target tank number in Y and +; direcion of shoot in A (0 - left, >0 - right) +;---------------------------------------------- + jsr MakeLowResDistances + lda #101 + sta temp2 ; max possible energy + lda #0 + sta tempor2 ; direction of shoot + ;ldx TankNr + ldy NumberOfPlayers + dey + +loop01 + cpy TankNr + beq skipThisPlayer + lda eXistenZ,y + beq skipThisPlayer + + lda LowResDistances,x + cmp LowResDistances,y + bcs EnemyOnTheLeft + ;enemy on the right + lda Energy,y + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + inc tempor2 ; set direction to right + bne lowestIsLower + +EnemyOnTheLeft + lda Energy,y + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + +lowestIsLower +skipThisPlayer + dey + bpl loop01 + ; now we have number of the farthest tank in temp2+1 + ; and direction (0 - left, >0 - right) in tempor2 + ; let's move them to registers + ; in temp2 we have energy of target + ldy temp2+1 + lda tempor2 + rts +.endp +;---------------------------------------------- +.proc FindBestTarget2 +; find nearest tank neighbour +; X - shooting tank number +; returns target tank number in Y and +; direcion of shoot in A (0 - left, >0 - right) +;---------------------------------------------- + jsr MakeLowResDistances + mva #$ff temp2 ; min possible distance + mva #0 tempor2 ; direction of shoot + + ;ldx TankNr + ldy NumberOfPlayers + dey + +loop01 + cpy TankNr + beq skipThisPlayer + lda eXistenZ,y + beq skipThisPlayer + + lda LowResDistances,x + cmp LowResDistances,y + bcs EnemyOnTheLeft + ;enemy on the right + sec + lda LowResDistances,y + sbc LowResDistances,x + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + inc tempor2 ; set direction to right + bne lowestIsLower + +EnemyOnTheLeft + sec + lda LowResDistances,x + sbc LowResDistances,y + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + +lowestIsLower +skipThisPlayer + dey + bpl loop01 + ; now we have number of the closest tank in temp2+1 + ; and direction (0 - left, >0 - right) in tempor2 + ; let's move them to registers + ; in temp2 we have x distance divided by 8 + ldy temp2+1 + lda tempor2 + rts +.endp +/* +;---------------------------------------------- +.proc FindBestTarget1 +; find farthest tank neighbour +; X - shooting tank number +; returns target tank number in Y and +; direcion of shoot in A (0 - left, >0 - right) +;---------------------------------------------- + jsr MakeLowResDistances + lda #$00 + sta temp2 ; max possible distance + sta tempor2 ; direction of shoot + ;ldx TankNr + ldy NumberOfPlayers + dey + +loop01 + cpy TankNr + beq skipThisPlayer + lda eXistenZ,y + beq skipThisPlayer + + lda LowResDistances,x + cmp LowResDistances,y + bcs EnemyOnTheLeft + ;enemy on the right + sec + lda LowResDistances,y + sbc LowResDistances,x + cmp temp2 ; bigest + bcc bigestIsBigger + sta temp2 + sty temp2+1 ; number of the farthest tank + inc tempor2 ; set direction to right + bne bigestIsBigger + +EnemyOnTheLeft + sec + lda LowResDistances,x + sbc LowResDistances,y + cmp temp2 ; lowest + bcc bigestIsBigger + sta temp2 + sty temp2+1 ; number of the farthest tank + +bigestIsBigger +skipThisPlayer + dey + bpl loop01 + ; now we have number of the farthest tank in temp2+1 + ; and direction (0 - left, >0 - right) in tempor2 + ; let's move them to registers + ; in temp2 we have x distance divided by 8 + ldy temp2+1 + lda tempor2 + rts +.endp +*/ +;---------------------------------------------- +.proc TakeAim +; targeting the tank number TargetTankNr (and Y) +; A (and tempor2) - direction from shooting tank (0 - left, >0 - right) +; returns angle and power of shoot tank X (TankNr) +; in the appropriate variables (Angle and Force) +;---------------------------------------------- + ; set initial Angle and Force values + ; wind correction 90+(wind/8) + mwa Wind temp2 + :7 lsrw temp2 + clc + lda #90 + adc temp2 + sta NewAngle + lda OptionsTable+2 ; selected gravity + asl + tay + ; force correction - lower tank Y position - higher possible force + clc + lda #screenheight + sbc Ytankstable,x + sta temp2 + clc + lda AIForceTable,y + sta RandBoundaryLow + adc temp2 + sta RandBoundaryHigh + lda AIForceTable+1,y + sta RandBoundaryLow+1 + adc #0 + sta RandBoundaryHigh+1 + jsr RandomizeForce + lda ForceTableL,x + sta Force + lda ForceTableH,x + sta Force+1 + lda #ind_Baby_Missile___ + sta ActiveWeapon,x + ; now we have initial valuses + mva #$ff TestFlightFlag + ; check targeting direction + lda tempor2 + jne AimingLeft +AimingRight + ; make test Shoot (Flight) + jsr SetStartAndFlight + lda HitFlag + beq NoHitInFirstLoopR ; impossible :) + bmi GroundHitInFirstLoopR +TankHitInFirstLoopR + ; tank hit, but which tank? + ; it's our target or not? + ldy HitFlag + dey + cpy TargetTankNr + beq EndOfFirstLoopR ; it's our target! + ; if it's another tank then check position like ground hit +GroundHitInFirstLoopR + ; checking only x position of hit + ldy TargetTankNr + lda xTanksTableH,y + cmp XHit+1 + bne @+ + lda xTanksTableL,y + cmp XHit +@ + bcs HitOnRightSideOfTargetR + ; continue targeting + clc + lda NewAngle + adc #5 ; 5 deg to right + cmp #(180-20) + bcs EndOfFirstLoopR ; if angle 180-20 or higher + sta NewAngle + jmp AimingRight +NoHitInFirstLoopR + ; Angle 5 deg to left and end loop + sec + lda NewAngle + sbc #5 + sta NewAngle +HitOnRightSideOfTargetR +EndOfFirstLoopR + mva #5 modify ; set counter (5 turns) +SecondLoopR + ; make test Shoot (Flight) + jsr SetStartAndFlight + lda HitFlag + beq NoHitInSecondLoopR ; impossible :) + bmi GroundHitInSecondLoopR +TankHitInSecondLoopR + ; tank hit, but which tank? + ; it's our target or not? + ldy HitFlag + dey + cpy TargetTankNr + beq EndOfSecondLoopR ; it's our target! + ; if it's another tank then check position like ground hit +GroundHitInSecondLoopR + ; checking only x position of hit + ldy TargetTankNr + lda xTanksTableH,y + cmp XHit+1 + bne @+ + lda xTanksTableL,y + cmp XHit +@ + bcc HitOnLeftSideOfTargetR + ; continue targeting + dec NewAngle ; 1 deg to left + dec modify ; max 5 turns + beq EndOfSecondLoopR + jmp SecondLoopR +HitOnLeftSideOfTargetR + ; decrease energy (a little) + sbw Force #5 +NoHitInSecondLoopR + ; Angle 1 deg to right and end loop + inc NewAngle +EndOfSecondLoopR + rts + +AimingLeft + ; make test Shoot (Flight) + jsr SetStartAndFlight + lda HitFlag + beq NoHitInFirstLoopL ; impossible :) + bmi GroundHitInFirstLoopL +TankHitInFirstLoopL + ; tank hit, but which tank? + ; it's our target or not? + ldy HitFlag + dey + cpy TargetTankNr + beq EndOfFirstLoopL ; it's our target! + ; if it's another tank then check position like ground hit +GroundHitInFirstLoopL + ; checking only x position of hit + ldy TargetTankNr + lda xTanksTableH,y + cmp XHit+1 + bne @+ + lda xTanksTableL,y + cmp XHit +@ + bcc HitOnLeftSideOfTargetL + ; continue targeting + sec + lda NewAngle + sbc #5 ; 5 deg to left + cmp #21 + bcc EndOfFirstLoopL ; if angle 180-20 or higher + sta NewAngle + jmp AimingLeft +NoHitInFirstLoopL + ; Angle 5 deg to right and end loop + clc + lda NewAngle + adc #5 + sta NewAngle +HitOnLeftSideOfTargetL +EndOfFirstLoopL + mva #5 modify ; set counter (5 turns) +SecondLoopL + ; make test Shoot (Flight) + jsr SetStartAndFlight + lda HitFlag + beq NoHitInSecondLoopL ; impossible :) + bmi GroundHitInSecondLoopL +TankHitInSecondLoopL + ; tank hit, but which tank? + ; it's our target or not? + ldy HitFlag + dey + cpy TargetTankNr + beq EndOfSecondLoopL ; it's our target! + ; if it's another tank then check position like ground hit +GroundHitInSecondLoopL + ; checking only x position of hit + ldy TargetTankNr + lda xTanksTableH,y + cmp XHit+1 + bne @+ + lda xTanksTableL,y + cmp XHit +@ + bcs HitOnRightSideOfTargetL + ; continue targeting + inc NewAngle ; 1 deg to right + dec modify ; max 5 turns + beq EndOfSecondLoopL + jmp SecondLoopL +HitOnRightSideOfTargetL + ; decrease energy (a little) + sbw Force #5 +NoHitInSecondLoopL + ; Angle 1 deg to left and end loop + dec NewAngle +EndOfSecondLoopL + + rts + +SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight + ; xtraj+1 and ytraj+1 set + clc + lda xTanksTableL,x + adc #4 + sta xtraj+1 + lda xTanksTableH,x + adc #0 + sta xtraj+2 + sec + lda yTanksTable,x + sbc #4 + sta ytraj+1 + mva #0 ytraj+2 + mva NewAngle Angle + jsr Flight + ldx TankNr + rts .endp ;---------------------------------------------- .proc PurchaseAI ; @@ -336,8 +845,8 @@ PurchaseAIRoutines .word PoolsharkPurchase-1 ;PoolsharkPurchase .word TosserPurchase-1 ;TosserPurchase .word TosserPurchase-1 ;ChooserPurchase - .word TosserPurchase-1 ;SpoilerPurchase - .word TosserPurchase-1 ;CyborgPurchase + .word CyborgPurchase-1 ;SpoilerPurchase + .word CyborgPurchase-1 ;CyborgPurchase .word TosserPurchase-1 ;UnknownPurchase ;---------------------------------------------- @@ -346,13 +855,41 @@ PurchaseAIRoutines rts .endp ;------- +.proc TryToPurchaseOnePiece2 ; for Cyborg + ; A - weapon number, better it will be in range(1,32) + ; TankNr in X + ; DOES NOT CHANGE X + tay + sta temp+1 + :3 lsr ; A=A/8 + sta temp + tya + and #%00000111 + tay + lda bittable,y + ldy temp + and PurchaseMeTable2,y + beq TryToPurchaseOnePiece.SorryNoPurchase + jmp TryToPurchaseOnePiece.PurchaseIt +.endp +;------- .proc TryToPurchaseOnePiece ; A - weapon number, better it will be in range(1,32) ; TankNr in X ; DOES NOT CHANGE X tay - lda PurchaseMeTable,y + sta temp+1 + :3 lsr ; A=A/8 + sta temp + tya + and #%00000111 + tay + lda bittable,y + ldy temp + and PurchaseMeTable,y beq SorryNoPurchase +PurchaseIt + ldy temp+1 lda WeaponPriceL,y sta temp lda WeaponPriceH,y @@ -422,7 +959,7 @@ SorryNoPurchase mva #3 tempXroller; number of offensive purchases to perform ldx TankNr @ - randomize ind_Battery________ ind_Auto_Defense___ + randomize ind_Battery________ ind_Bouncy_Castle__ jsr TryToPurchaseOnePiece dec tempXroller bne @- @@ -443,12 +980,12 @@ SorryNoPurchase ; what is my money level ldx TankNr - lda MoneyH,x ; money / 256 - sta tempXroller ; perform this many purchase attempts +; 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 + mva #1 tempXroller; number of defensive purchases to perform @ - randomize ind_Battery________ ind_Auto_Defense___ + randomize ind_Battery________ ind_Bouncy_Castle__ jsr TryToPurchaseOnePiece dec tempXroller bne @- @@ -465,3 +1002,30 @@ SorryNoPurchase rts .endp +;---------------------------------------------- +.proc CyborgPurchase + + ; 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 #1 tempXroller; number of defensive purchases to perform +@ + randomize ind_Battery________ ind_Bouncy_Castle__ + jsr TryToPurchaseOnePiece2 + dec tempXroller + bne @- + + ; and now offensives + lda MoneyH,x ; money / 256 + :4 asl ;*16 + sta tempXroller ; perform this many purchase attempts +@ + randomize ind_Missile________ ind_Plasma_Blast___ + jsr TryToPurchaseOnePiece2 + dec tempXroller + bne @- + + rts +.endp diff --git a/artwork/HIMARS14.asm b/artwork/HIMARS14.asm deleted file mode 100644 index bcc29c3..0000000 --- a/artwork/HIMARS14.asm +++ /dev/null @@ -1,501 +0,0 @@ -; @com.wudsn.ide.asm.mainsourcefile=../scorch.asm -/***************************************/ -/* Use MADS http://mads.atari8.info/ */ -/* Mode: DLI (char mode) */ -/***************************************/ - - ;icl "HIMARS14.h" - ;ICL '../lib/atari.hea' - - -WIDTH = 40 -HEIGHT = 30 - -; --- BASIC switch OFF - org $2000\ mva #$ff portb\ rts\ ini $2000 - -; --- dmsc LZSS player routine on zero page - org $80 - -chn_copy .ds 9 -chn_pos .ds 9 -bptr .ds 2 -cur_pos .ds 1 -chn_bits .ds 1 - -bit_data .ds 1 - - - -fcnt .ds 2 -fadr .ds 2 -fhlp .ds 2 -cloc .ds 1 -regA .ds 1 -regX .ds 1 -regY .ds 1 -; --- MAIN PROGRAM - org $2000 -ant dta $80 - dta $42,a(scr),$02,$02,$02,$02,$02,$02,$02,$02,$02,$82,$02,$02,$02,$02,$82 - dta $02,$02,$02,$82,$82,$82,$02,$82,$02,$02,$02,$82 - dta $42,a(verline) - dta $41,a(ant) - -verline - :37 dta d" " - build - -scr ins "HIMARS14.scr" - - .ds 2*40 - - .ALIGN $0400 -fnt ins "HIMARS14.fnt" - - ift USESPRITES - .ALIGN $0800 -pmg .ds $0300 - ift FADECHR = 0 - SPRITES - els - .ds $500 - eif - eif - -song_data - ins 'mmm_16.lzs' -song_end - -POKEY = $D200 - -buffers - .ds 256 * 9 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Song Initialization - this runs in the first tick: -; -.proc init_song - - mva #1 bit_data - - ; Example: here initializes song pointer: - - ;mwa #song_data song_ptr - - ; Init all channels: - ldx #8 - ldy #0 -clear - ; Read just init value and store into buffer and POKEY - jsr get_byte - sta POKEY, x - sty chn_copy, x -cbuf - sta buffers + 255 - inc cbuf + 2 - dex - bpl clear - - ; Initialize buffer pointer: - sty bptr - sty cur_pos - rts -.endp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Wait for next frame -; -.proc wait_frame - - lda 20 -delay - cmp 20 - beq delay -.endp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Play one frame of the song -; -.proc play_frame - lda #>buffers - sta bptr+1 - - lda song_data - sta chn_bits - ldx #8 - - ; Loop through all "channels", one for each POKEY register -chn_loop: - lsr chn_bits - bcs skip_chn ; C=1 : skip this channel - - lda chn_copy, x ; Get status of this stream - bne do_copy_byte ; If > 0 we are copying bytes - - ; We are decoding a new match/literal - lsr bit_data ; Get next bit - bne got_bit - jsr get_byte ; Not enough bits, refill! - ror ; Extract a new bit and add a 1 at the high bit (from C set above) - sta bit_data ; -got_bit: - jsr get_byte ; Always read a byte, it could mean "match size/offset" or "literal byte" - bcs store ; Bit = 1 is "literal", bit = 0 is "match" - - sta chn_pos, x ; Store in "copy pos" - - jsr get_byte - sta chn_copy, x ; Store in "copy length" - - ; And start copying first byte -do_copy_byte: - dec chn_copy, x ; Decrease match length, increase match position - inc chn_pos, x - ldy chn_pos, x - - ; Now, read old data, jump to data store - lda (bptr), y - -store: - ldy cur_pos - sta POKEY, x ; Store to output and buffer - sta (bptr), y - -skip_chn: - ; Increment channel buffer pointer - inc bptr+1 - - dex - bpl chn_loop ; Next channel - - inc cur_pos -.endp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Check for ending of song and jump to the next frame -; - -; not checking really so the tune gets funky :))) - ;lda song_ptr + 1 - ;cmp #>song_end - ;bne wait_frame - ;lda song_ptr - ;cmp #pmg pmbase ;missiles and players data address - mva #$03 pmcntl ;enable players and missiles - eif - - lda:cmp:req $14 ;wait 1 frame - - ; copy system font to $a000 - ldx #0 -@ lda $e000,x - sta $a000,x - ;lda $e100,x ; i need digits only :] - ;sta $a100,x - ;lda $e200,x - ;sta $a200,x - ;lda $e300,x - ;sta $a300,x - inx - bne @- - - sei ;stop IRQ interrupts - mva #$00 nmien ;stop NMI interrupts - sta dmactl - mva #$fe portb ;switch off ROM to get 16k more ram - - mwa #NMI $fffa ;new NMI handler - - mva #$c0 nmien ;switch on NMI+DLI again - - ift CHANGES ;if label CHANGES defined - -_lp lda trig0 ; FIRE #0 - beq stop - - lda trig1 ; FIRE #1 - beq stop - - lda consol ; START - and #1 - beq stop - - lda skctl - and #$04 - bne _lp ;wait to press any key; here you can put any own routine - - els - -null jmp DLI.dli1 ;CPU is busy here, so no more routines allowed - - eif - - -stop - mva #$00 pmcntl ;PMG disabled - tax - sta:rne hposp0,x+ - - mva #$ff portb ;ROM switch on - mva #$40 nmien ;only NMI interrupts, DLI disabled - cli ;IRQ enabled - - - lda #0 - ldx #8 -@ sta POKEY,x - dex - bpl @- - - ;no glitching please (issue #67) - lda #0 - sta $D400 ;dmactl - sta $022F ;dmactls - rts ;return to ... DOS - -; --- DLI PROGRAM - -.local DLI - - ?old_dli = * - - ift !CHANGES - -dli1 lda trig0 ; FIRE #0 - beq stop - - lda trig1 ; FIRE #1 - beq stop - - lda consol ; START - and #1 - beq stop - - lda skctl - and #$04 - beq stop - - lda vcount - cmp #$02 - bne dli1 - - :3 sta wsync - - DLINEW dli10 - - eif - -dli_start - -dli10 - sta regA - -c4 lda #$04 - sta wsync ;line=8 - sta color0 - sta gtictl - DLINEW DLI.dli2 1 0 0 - -dli2 - sta regA - lda >fnt+$400*$01 - sta wsync ;line=96 - sta chbase - DLINEW dli3 1 0 0 - -dli3 - sta regA - lda >fnt+$400*$02 - sta wsync ;line=136 - sta chbase - DLINEW dli4 1 0 0 - -dli4 - sta regA - lda >fnt+$400*$01 - sta wsync ;line=168 - sta chbase - DLINEW dli5 1 0 0 - -dli5 - sta regA - lda >fnt+$400*$02 - sta wsync ;line=176 - sta chbase - DLINEW dli6 1 0 0 - -dli6 - sta regA - lda >fnt+$400*$03 - sta wsync ;line=184 - sta chbase - DLINEW dli7 1 0 0 - -dli7 - sta regA - lda >fnt+$400*$00 - sta wsync ;line=200 - sta chbase - DLINEW dli11 1 0 0 - -dli11 - sta regA - - lda #>$a000 ; system font - sta wsync ;line=232 - sta chbase - lda #$01 - sta gtictl - - lda regA - rti - -.endl - -; --- - -CHANGES = 1 -FADECHR = 0 - -SCHR = 127 - -; --- - -.proc NMI - - bit nmist - bpl VBL - - jmp DLI.dli_start -dliv equ *-2 - -VBL - sta regA - stx regX - sty regY - - sta nmist ;reset NMI flag - - mwa #ant dlptr ;ANTIC address program - - mva #@dmactl(standard|dma|lineX1) dmactl ;set new screen width - - inc cloc ;little timer - -; Initial values - - lda >fnt+$400*$00 - sta chbase -c0 lda #$00 - sta colbak - lda #$02 - sta chrctl - lda #$01 - sta gtictl -c1 lda #$0C - sta color1 -c2 lda #$02 - sta color2 -c3 lda #$0E - sta color3 -x0 lda #$00 - sta hposp0 - sta hposp1 - sta hposp2 - sta hposp3 - sta hposm0 - sta hposm1 - sta hposm2 - sta hposm3 - sta sizep0 - sta sizep1 - sta sizep2 - sta sizep3 - sta sizem - sta colpm0 - sta colpm1 - sta colpm2 - sta colpm3 - sta color0 - - mwa #DLI.dli_start dliv ;set the first address of DLI interrupt - -;this area is for yours routines - jsr play_frame - -quit - lda regA - ldx regX - ldy regY - rti - -.endp - -; --- - ini main -; --- - - ;opt l- - -.MACRO SPRITES -missiles - .ds $100 -player0 - .ds $100 -player1 - .ds $100 -player2 - .ds $100 -player3 - .ds $100 -.ENDM - -USESPRITES = 0 - -.MACRO DLINEW - mva <:1 NMI.dliv - ift [>?old_dli]<>[>:1] - mva >:1 NMI.dliv+1 - eif - - ift :2 - lda regA - eif - - ift :3 - ldx regX - eif - - ift :4 - ldy regY - eif - - rti - - .def ?old_dli = * -.ENDM - diff --git a/artwork/HIMARS14.fnt b/artwork/HIMARS14.fnt deleted file mode 100644 index c80a393..0000000 Binary files a/artwork/HIMARS14.fnt and /dev/null differ diff --git a/artwork/HIMARS14.g2f b/artwork/HIMARS14.g2f deleted file mode 100644 index 027136d..0000000 Binary files a/artwork/HIMARS14.g2f and /dev/null differ diff --git a/artwork/HIMARS14.png b/artwork/HIMARS14.png deleted file mode 100644 index a7c03b2..0000000 Binary files a/artwork/HIMARS14.png and /dev/null differ diff --git a/artwork/HIMARS14.scr b/artwork/HIMARS14.scr deleted file mode 100644 index cb251a1..0000000 Binary files a/artwork/HIMARS14.scr and /dev/null differ diff --git a/artwork/Scorch50.asm b/artwork/Scorch50.asm new file mode 100644 index 0000000..ecc2f78 --- /dev/null +++ b/artwork/Scorch50.asm @@ -0,0 +1,877 @@ +/***************************************/ +/* Use MADS http://mads.atari8.info/ */ +/* Mode: DLI (char mode) */ +/***************************************/ + + ;icl "Scorch50.h" + +; --- dmsc LZSS player routine on zero page + org $80 + +chn_copy .ds 9 +chn_pos .ds 9 +bptr .ds 2 +cur_pos .ds 1 +chn_bits .ds 1 + +bit_data .ds 1 + +fcnt .ds 2 +fadr .ds 2 +fhlp .ds 2 +cloc .ds 1 +regA .ds 1 +regX .ds 1 +regY .ds 1 + +WIDTH = 40 +HEIGHT = 30 + +; --- BASIC switch OFF + org $2000\ mva #$ff portb\ rts\ ini $2000 + +; --- MAIN PROGRAM + org $2000 +ant dta $C2,a(scr) + dta $02,$82,$02,$02,$82,$02,$82,$02,$82,$02,$02,$02,$82,$02,$82,$82 + dta $02,$02,$82,$02,$02,$82,$02,$02,$82,$82,$02,$82,$22 + ;dta $42,a(verline) + dta $41,a(ant) + +;verline +; :37 dta d" " +; dta build + +scr ins "Scorch50.scr" + + .ds 0*40 + + .ALIGN $0400 +fnt ins "Scorch50.fnt" + + ift USESPRITES + .ALIGN $0800 +pmg .ds $0300 + ift FADECHR = 0 + SPRITES + els + .ds $500 + eif + eif + + +song_data + ins 'mmm_16.lzs' +song_end + +POKEY = $D200 + +buffers + .ds 256 * 9 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Song Initialization - this runs in the first tick: +; +.proc init_song + + mva #1 bit_data + + ; Example: here initializes song pointer: + + ;mwa #song_data song_ptr + + ; Init all channels: + ldx #8 + ldy #0 +clear + ; Read just init value and store into buffer and POKEY + jsr get_byte + sta POKEY, x + sty chn_copy, x +cbuf + sta buffers + 255 + inc cbuf + 2 + dex + bpl clear + + ; Initialize buffer pointer: + sty bptr + sty cur_pos + rts +.endp + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Wait for next frame +; +.proc wait_frame + + lda 20 +delay + cmp 20 + beq delay +.endp + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Play one frame of the song +; +.proc play_frame + lda #>buffers + sta bptr+1 + + lda song_data + sta chn_bits + ldx #8 + + ; Loop through all "channels", one for each POKEY register +chn_loop: + lsr chn_bits + bcs skip_chn ; C=1 : skip this channel + + lda chn_copy, x ; Get status of this stream + bne do_copy_byte ; If > 0 we are copying bytes + + ; We are decoding a new match/literal + lsr bit_data ; Get next bit + bne got_bit + jsr get_byte ; Not enough bits, refill! + ror ; Extract a new bit and add a 1 at the high bit (from C set above) + sta bit_data ; +got_bit: + jsr get_byte ; Always read a byte, it could mean "match size/offset" or "literal byte" + bcs store ; Bit = 1 is "literal", bit = 0 is "match" + + sta chn_pos, x ; Store in "copy pos" + + jsr get_byte + sta chn_copy, x ; Store in "copy length" + + ; And start copying first byte +do_copy_byte: + dec chn_copy, x ; Decrease match length, increase match position + inc chn_pos, x + ldy chn_pos, x + + ; Now, read old data, jump to data store + lda (bptr), y + +store: + ldy cur_pos + sta POKEY, x ; Store to output and buffer + sta (bptr), y + +skip_chn: + ; Increment channel buffer pointer + inc bptr+1 + + dex + bpl chn_loop ; Next channel + + inc cur_pos +.endp + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Check for ending of song and jump to the next frame +; + +; not checking really so the tune gets funky :))) + ;lda song_ptr + 1 + ;cmp #>song_end + ;bne wait_frame + ;lda song_ptr + ;cmp #pmg pmbase ;missiles and players data address + mva #$03 pmcntl ;enable players and missiles + eif + + lda:cmp:req $14 ;wait 1 frame + + sei ;stop IRQ interrupts + mva #$00 nmien ;stop NMI interrupts + sta dmactl + ;mva #$fe portb ;switch off ROM to get 16k more ram + + ;mwa #NMI $fffa ;new NMI handler + + sta colbaks + lda #$0E + sta colpf1s + lda #$84 + sta colpf2s + lda #$0E + sta colpf3s + lda #$02 + + + + VMAIN NMI.vbl,6 ;jsr SetVBL + VDLI DLI.dli_start + + + mva #1 vscrol + + mva #$c0 nmien ;switch on NMI+DLI again + +_lp lda trig0 ; FIRE #0 + beq stop + + lda trig1 ; FIRE #1 + beq stop + + lda consol ; START + and #1 + beq stop + + lda skctl + and #$04 + bne _lp ;wait to press any key; here you can put any own routine + + +stop + + cli + vmain sysvbv,6 + + mva #$00 pmcntl ;PMG disabled + tax + sta:rne hposp0,x+ + + ;mva #$ff portb ;ROM switch on + mva #$40 nmien ;only NMI interrupts, DLI disabled + ;cli ;IRQ enabled + + lda #0 + ldx #8 +@ sta POKEY,x + dex + bpl @- + + + ;no glitching please (issue #67) + lda #0 + sta $D400 ;dmactl + sta $022F ;dmactls + rts ;return to ... DOS + +; --- DLI PROGRAM + +.local DLI + + ?old_dli = * + +dli_start + +dli13 + sta regA + + sta wsync ;line=8 + sta wsync ;line=9 + sta wsync ;line=10 + sta wsync ;line=11 + sta wsync ;line=12 + sta wsync ;line=13 +c9 lda #$14 + sta wsync ;line=14 + sta colpm3 + DLINEW DLI.dli2 1 0 0 + +dli2 + sta regA + lda >fnt+$400*$01 + sta wsync ;line=24 + sta chbase + DLINEW dli3 1 0 0 + +dli3 + sta regA + lda >fnt+$400*$02 + sta wsync ;line=48 + sta chbase + sta wsync ;line=49 + sta wsync ;line=50 + sta wsync ;line=51 +s3 lda #$07 + sta wsync ;line=52 + sta sizem + DLINEW dli14 1 0 0 + +dli14 + sta regA + stx regX + sty regY + +x8 lda #$A3 + sta wsync ;line=64 + sta hposp3 +x9 lda #$AB + sta wsync ;line=65 + sta hposm3 + sta wsync ;line=66 + sta wsync ;line=67 + sta wsync ;line=68 + sta wsync ;line=69 + sta wsync ;line=70 +s4 lda #$13 +x10 ldx #$A6 + sta wsync ;line=71 + sta sizem + stx hposm2 +s5 lda #$01 +x11 ldx #$72 +x12 ldy #$62 + sta wsync ;line=72 + sta sizep2 + sta sizep3 + stx hposp2 + sty hposp3 +x13 lda #$A9 + sta wsync ;line=73 + sta hposp1 + DLINEW dli4 1 1 1 + +dli4 + sta regA + lda >fnt+$400*$03 + sta wsync ;line=80 + sta chbase + DLINEW dli5 1 0 0 + +dli5 + sta regA + stx regX + lda >fnt+$400*$04 + sta wsync ;line=112 + sta chbase + sta wsync ;line=113 + sta wsync ;line=114 + sta wsync ;line=115 + sta wsync ;line=116 + sta wsync ;line=117 + sta wsync ;line=118 +s6 lda #$07 +x14 ldx #$A3 + sta wsync ;line=119 + sta sizem + stx hposm1 +s7 lda #$01 +x15 ldx #$93 + sta wsync ;line=120 + sta sizep1 + stx hposp1 + DLINEW dli15 1 1 0 + +dli15 + sta regA + stx regX + + sta wsync ;line=128 + sta wsync ;line=129 + sta wsync ;line=130 + sta wsync ;line=131 +x16 lda #$4A + sta wsync ;line=132 + sta hposp1 +c10 lda #$D4 + sta wsync ;line=133 + sta color2 +s8 lda #$C3 +x17 ldx #$5A + sta wsync ;line=134 + sta sizem + stx hposm3 + DLINEW dli6 1 1 0 + +dli6 + sta regA + stx regX + sty regY + lda >fnt+$400*$05 + sta wsync ;line=136 + sta chbase + sta wsync ;line=137 + sta wsync ;line=138 + sta wsync ;line=139 + sta wsync ;line=140 + sta wsync ;line=141 + sta wsync ;line=142 +s9 lda #$C7 +x18 ldx #$A9 + sta wsync ;line=143 + sta sizem + stx hposm1 +s10 lda #$D7 +x19 ldx #$9E +c11 ldy #$02 + sta wsync ;line=144 + sta sizem + stx hposm2 + sty colpm2 + sta wsync ;line=145 +c12 lda #$04 + sta wsync ;line=146 + sta colpm1 + sta wsync ;line=147 + sta wsync ;line=148 + sta wsync ;line=149 +s11 lda #$00 +x20 ldx #$74 +c13 ldy #$02 + sta wsync ;line=150 + sta sizep3 + stx hposp3 + sty colpm3 + sta wsync ;line=151 + sta wsync ;line=152 + sta wsync ;line=153 + sta wsync ;line=154 + sta wsync ;line=155 + sta wsync ;line=156 + sta wsync ;line=157 +c14 lda #$04 + sta wsync ;line=158 + sta color0 + DLINEW dli7 1 1 1 + +dli7 + sta regA + lda >fnt+$400*$06 + sta wsync ;line=160 + sta chbase + DLINEW dli8 1 0 0 + +dli8 + sta regA + stx regX + sty regY + lda >fnt+$400*$07 + sta wsync ;line=184 + sta chbase + sta wsync ;line=185 +s12 lda #$00 +x21 ldx #$8E +c15 ldy #$08 + sta wsync ;line=186 + sta sizep2 + stx hposp2 + sty colpm2 +x22 lda #$4C +c16 ldx #$0E + sta wsync ;line=187 + sta hposp3 + stx colpm3 +c17 lda #$0A +c18 ldx #$34 + sta wsync ;line=188 + sta color1 + stx colpm3 +s13 lda #$43 +x23 ldx #$49 + sta wsync ;line=189 + sta sizem + stx hposm3 +c19 lda #$08 +c20 ldx #$34 + sta wsync ;line=190 + sta color1 + stx colpm2 + sta wsync ;line=191 +c21 lda #$0A + sta wsync ;line=192 + sta color1 +c22 lda #$08 + sta wsync ;line=193 + sta color1 +c23 lda #$0A + sta wsync ;line=194 + sta color1 +c24 lda #$34 + sta wsync ;line=195 + sta color2 +c25 lda #$0C + sta wsync ;line=196 + sta color1 +c26 lda #$0A + sta wsync ;line=197 + sta color1 +c27 lda #$0C + sta wsync ;line=198 + sta color1 + sta wsync ;line=199 + sta wsync ;line=200 +c28 lda #$0E + sta wsync ;line=201 + sta color1 +c29 lda #$0C + sta wsync ;line=202 + sta color1 +c30 lda #$0E + sta wsync ;line=203 + sta color1 +c31 lda #$0C + sta wsync ;line=204 + sta color1 +c32 lda #$0E + sta wsync ;line=205 + sta color1 + DLINEW dli16 1 1 1 + +dli16 + sta regA + + sta wsync ;line=208 + sta wsync ;line=209 +c33 lda #$0C + sta wsync ;line=210 + sta color1 +c34 lda #$0E + sta wsync ;line=211 + sta color1 +c35 lda #$0C + sta wsync ;line=212 + sta color1 + DLINEW dli9 1 0 0 + +dli9 + sta regA + stx regX + sty regY + lda >fnt+$400*$08 +c36 ldx #$0A + sta wsync ;line=216 + sta chbase + stx color1 +c37 lda #$0C + sta wsync ;line=217 + sta color1 +c38 lda #$0A +x24 ldx #$9D +c39 ldy #$34 + sta wsync ;line=218 + sta color1 + stx hposm1 + sty colpm1 +s14 lda #$03 +x25 ldx #$7D + sta wsync ;line=219 + sta sizep3 + stx hposp3 +c40 lda #$08 +s15 ldx #$13 +x26 ldy #$45 + sta wsync ;line=220 + sta color1 + stx sizem + sty hposm2 +s16 lda #$03 +x27 ldx #$59 + sta wsync ;line=221 + sta sizep2 + stx hposp2 +s17 lda #$53 +x28 ldx #$49 +x29 ldy #$79 + sta wsync ;line=222 + sta sizem + stx hposp1 + sty hposm3 +c41 lda #$06 +c42 ldx #$00 + sta wsync ;line=223 + sta color1 + stx color2 + lda >fnt+$400*$01 +s18 ldx #$50 +x30 ldy #$44 + sta wsync ;line=224 + sta chbase + stx sizem + sty hposm0 + sta wsync ;line=225 +c43 lda #$08 + sta wsync ;line=226 + sta color1 +c44 lda #$0C + sta wsync ;line=227 + sta color1 + sta wsync ;line=228 + sta wsync ;line=229 +c45 lda #$0E + sta wsync ;line=230 + sta color1 + DLINEW dli10 1 1 1 + +dli10 + sta regA + lda >fnt+$400*$00 + sta wsync ;line=232 + sta chbase + ;DLINEW dli11 1 0 0 + + lda regA + rti + +;dli11 +; sta regA +; +; lda #>$a000 ; system font +; sta wsync ;line=232 +; sta chbase +; lda #$01 +; sta gtictl +; +; lda regA +; rti + + +.endl + +; --- + +CHANGES = 1 +FADECHR = 0 + +SCHR = 127 + +dliv = $0200 + +; --- + +.proc NMI + + bit nmist + bpl VBL + + jmp DLI.dli_start + + +VBL + sta regA + stx regX + sty regY + + ;sta nmist ;reset NMI flag + + mwa #ant dlptr ;ANTIC address program + + mva #@dmactl(standard|dma|lineX1|players|missiles) dmactl ;set new screen width + + inc cloc ;little timer + +; Initial values + + lda >fnt+$400*$00 + sta chbase +c0 lda #$00 + sta colbak +c1 lda #$0E + sta color1 +c2 lda #$84 + sta color2 +c3 lda #$0E + sta color3 + lda #$02 + sta chrctl + lda #$01 + sta gtictl + sta sizep0 +s0 lda #$03 + sta sizem +x0 lda #$D0 + sta hposp0 +x1 lda #$28 + sta hposm0 +c4 lda #$00 + sta colpm0 +x2 lda #$A2 + sta hposm3 +c5 lda #$0E + sta colpm3 +s1 lda #$00 + sta sizep2 + sta sizep3 +x3 lda #$92 + sta hposp2 +x4 lda #$8A + sta hposp3 +c6 lda #$14 + sta colpm2 +s2 lda #$00 + sta sizep1 +x5 lda #$9A + sta hposp1 +c7 lda #$14 + sta colpm1 +x6 lda #$A4 + sta hposm2 +x7 lda #$A6 + sta hposm1 +c8 lda #$00 + sta color0 + + mwa #DLI.dli_start dliv ;set the first address of DLI interrupt + +;this area is for yours routines + jsr play_frame + +quit + lda regA + ldx regX + ldy regY + jmp sysvbv + +.endp + +; --- + ini main +; --- + + opt l- + +.MACRO SPRITES +missiles + .he 00 00 00 00 00 00 00 00 03 03 C3 03 03 03 03 03 + .he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 + .he 03 03 03 03 03 03 03 03 03 83 83 83 C3 C3 C3 C3 + .he C3 C3 C3 C3 C3 E3 E3 E3 E3 E3 E3 F3 F3 F3 F3 FB + .he FB FB FB FB FF FF FF FF F3 33 83 83 83 83 C3 D3 + .he D3 D3 13 03 03 03 03 03 03 03 03 03 03 03 03 03 + .he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 + .he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 0F + .he 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 03 03 03 03 C3 C3 + .he C3 C3 C3 C3 C3 C3 C3 C3 C3 D3 FF FF 3F 3F 3F 3F + .he 3F 3F 33 13 03 03 03 03 03 03 03 03 03 03 03 03 + .he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 + .he 03 03 03 03 03 03 03 43 43 C3 C3 C3 C3 03 03 03 + .he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 + .he 03 03 0F 0F 3F 3F FF FC FE FE FF DB 03 03 03 03 + .he 03 03 03 03 03 03 03 03 00 00 00 00 00 00 00 00 +player0 + .he 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 +player1 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 F0 FC FE FE FF FF FF FF + .he FF 0F 0F 0F 0F 0F 0F 0F 0F 0F 07 07 07 07 07 07 + .he 03 03 03 FF FF FF FF FF CF CF FF FF FF FF FF 9F + .he 9F FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 + .he 00 F0 F0 F0 F0 78 F8 78 78 78 78 38 78 38 3C 3C + .he 3C 3C 1C 3C 1C 1C 1C 1C 1E 1E 1E 1E 0E 1E 0E 0E + .he 0E 0F 07 0F 07 0F 07 07 07 07 07 07 06 06 06 06 + .he FF FF FF FF FF FF FF FF FF FF FF 00 00 3E 3F 7F + .he 7F 7F 7F 7F 7F 7F 7F 3F 3F 3F 00 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 FF FF FF FF FF FF 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +player2 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF + .he FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 FF FF FF FF FF 99 99 FF FF FF FF FF 33 + .he 33 FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 + .he 00 00 80 F0 F8 F8 F8 FC FC FC FC FC FC FC FC FC + .he FC FE FE FE FE FE FE FF FF FF FF FF FF FF FE FC + .he F8 F8 F8 F8 F0 F0 F0 F0 F0 F0 F0 F0 E0 E0 E0 E0 + .he E0 E0 E0 FC FE FE FF FF 8F 87 87 87 07 07 07 07 + .he 07 07 07 07 07 07 07 03 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 F8 FC FC FE FE FF FF 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 FF FF FF FF FF FF 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +player3 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 01 07 0F 1F 1F 3F 3F 7F + .he 7F 78 78 F0 F0 F0 F0 F8 F8 F8 78 7C 7C 7C 3C 3E + .he 3E 3E 1E 1F 1F 1F 0F 0F 0F 0F 0F 1F 1F 1F 1F 1F + .he 1F 3F 3F 3F 3F 3F 3F 3F FF 7F 7F 3F 3F 1F 1F 0F + .he 1F 1F 1F 3F 3F 3F 3F 3F 3F 3B 30 30 30 30 30 30 + .he 30 30 30 30 38 3E 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F + .he 7F 7F 7F 7F 7F 7F 7F FF FF FF FF FF FF FF FF FF + .he FF FF FF FF FF FF FF FF 7F 7F 7F 7F 7F 7F FF FF + .he FF FF FF FF FE FE FE FE FE FE FE FE FC 1C FF 7E + .he 7E FE FE FE FE FF FF FF 7F 7E 7E 3C 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 00 00 7C FE FE FF FF FF 00 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .he 00 00 00 FF FF FF FF FF FF FF FF FF 00 00 00 00 + .he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +.ENDM + +USESPRITES = 1 + +.MACRO DLINEW + mva <:1 dliv + ift [>?old_dli]<>[>:1] + mva >:1 dliv+1 + eif + + ift :2 + lda regA + eif + + ift :3 + ldx regX + eif + + ift :4 + ldy regY + eif + + rti + + .def ?old_dli = * +.ENDM + diff --git a/artwork/Scorch50.fnt b/artwork/Scorch50.fnt new file mode 100644 index 0000000..e4fced4 Binary files /dev/null and b/artwork/Scorch50.fnt differ diff --git a/artwork/Scorch50.scr b/artwork/Scorch50.scr new file mode 100644 index 0000000..b1b3d7f Binary files /dev/null and b/artwork/Scorch50.scr differ diff --git a/artwork/TALK1.txt b/artwork/TALK1.txt deleted file mode 100644 index 2ca9011..0000000 --- a/artwork/TALK1.txt +++ /dev/null @@ -1,54 +0,0 @@ -IN TIMES OF TROUBLE, GO WITH WHAT YOU KNOW. -DIE! -EAT MY SHORTS! -YOU'RE TOAST! -BANZAI! -FROM HELL'S HEART I STAB AT THEE... -I DIDN'T DO IT. NOBODY SAW ME DO IT. -TAKE A HIKE! -YOU'RE DEAD MEAT. -MAKE MY DAY. -CHARGE! -ATTACK! -YOU'RE OUTTA HERE. -WATTSA MATTA YOU? -FREEZE, OR I'LL SHOOT! -HA HA HA. -WE COME IN PEACE - SHOOT TO KILL! -IN YOUR FACE! -DIE COMMIE PIG! -I LOVE THE SMELL OF NAPALM IN THE MORNING. -VICTORY! -SHOW SOME RESPECT. -JUST WHO DO YOU THINK YOU ARE? -LOOK OUT BELOW! -KNOCK, KNOCK. -LOOK OVER THERE. -GUESS WHAT'S COMING FOR DINNER? -MERRY CHRISTMAS. -OPEN WIDE! -HERE GOES NOTHING... -DON'T WORRY, IT ISN'T A LIVE ROUND. -BLOOD, PAIN, VIOLENCE! -TAKE THIS, SISSY! -I SHALL FLATTEN YOU! -I SHALL SMASH YOUR UGLY TANK! -I WONDER WHAT THIS BUTTON DOES? -DON'T TAKE THIS PERSONALLY. -WOULD THIS MAKE YOU MAD? -I TOLD YOU TO LEAVE MY SISTER ALONE! -I COULD SPARE YOU, BUT WHY? -MY BOMB IS BIGGER THAN YOURS. -DON'T FORGET ABOUT ME! -HASTA LA VISTA, BABY! -THIS IS YOUR BRAIN ON SCORCH. -TAKE THIS! -THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US. -DIE, ALIEN SWINE! -SAY 'ARRGGHHHHH....' -I SHALL OIL MY TURRET WITH YOUR BLOOD. -DIE, TANK-SCUM! -I'M GONNA BREAK YOUR FACE! -MAMA SAID KNOCK YOU OUT! -I HOPE YOU ENJOY PAIN! -PARTING IS SUCH SWEET SORROW... NOT! diff --git a/artwork/TALK2.txt b/artwork/TALK2.txt deleted file mode 100644 index ef9156a..0000000 --- a/artwork/TALK2.txt +++ /dev/null @@ -1,60 +0,0 @@ -UGH! -AARGH! -AAAGGHHH! -I'M MELTING! -OOF.. -OH! -EEEK! -AACCH! -I HATE IT WHEN THAT HAPPENS. -ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY. -OH NO! -NOT ME! -OUCH. -OH NO, NOT AGAIN. -ANOTHER ONE BITES THE DUST. -GOODBYE. -HELP ME! -FAREWELL, CRUEL WORLD. -REMEMBER THE ALAMO! -OH MAN! -DOOUGH! -ANOTHER DAY, ANOTHER BOMB. -THIS IS THE END, MY ONLY FRIEND. -IT'S ALL OVER. -THE FAT LADY SANG. -WHY DOES EVERYTHING HAPPEN TO ME? -I'M GOING DOWN. -I'VE GOT A BAD FEELING ABOUT THIS. -CRAPOLA. -POW! -BIF! -BAM! -ZONK! -I SHOULD'VE LISTENED TO MY MOTHER... -NO... A BUD LIGHT! -WHAT WAS THAT NOISE? -MAMA SAID THERE'D BE DAYS LIKE THIS. -ITS JUST ONE OF THOSE DAYS... -I SEE A BRIGHT LIGHT... -MOMMY? IS THAT YOU? -I LET YOU HIT ME! -SUCKER SHOT! -I DIDN'T WANT TO LIVE ANYWAY. --- -WAS THAT AS CLOSE AS I THINK IT WAS? -JOIN THE ARMY, SEE THE WORLD THEY SAID. -IT WASN'T JUST A JOB IT WAS AN ADVENTURE! -I DIDN'T LIKE VIOLENCE ANYWAY! -I THOUGHT YOU LIKED ME? -SUCH SENSELESS VIOLENCE! I DON'T UNDERSTAND IT. -I THINK THIS GUY'S A LITTLE CRAZY. -SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE. -HEY! KILLIN' AIN'T COOL. -GEE... THANKS. -I'VE FALLEN AND I CAN'T GET UP! -911? -OH NO! HERE I BLOW AGAIN! -I'LL BE BACK... -HEY - I'VE GOT LAWYERS. -TIME TO CALL 1-900-SUE-TANK. diff --git a/artwork/sfx/feat.old b/artwork/sfx/feat.old new file mode 100644 index 0000000..cdab946 --- /dev/null +++ b/artwork/sfx/feat.old @@ -0,0 +1,41 @@ +STEREOMODE equ 0 +;* --------BEGIN-------- +;* C:\Atari\rmt\rmt128\schorch_str.rmt +FEAT_SFX equ 1 +FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable +FEAT_NOSTARTINGSONGLINE equ 0 +FEAT_INSTRSPEED equ 1 +FEAT_CONSTANTSPEED equ 0 ;(19 times) +FEAT_COMMAND1 equ 1 ;(18 times) +FEAT_COMMAND2 equ 0 ;(0 times) +FEAT_COMMAND3 equ 0 ;(0 times) +FEAT_COMMAND4 equ 0 ;(0 times) +FEAT_COMMAND5 equ 0 ;(0 times) +FEAT_COMMAND6 equ 0 ;(0 times) +FEAT_COMMAND7SETNOTE equ 0 ;(0 times) +FEAT_COMMAND7VOLUMEONLY equ 0 ;(0 times) +FEAT_PORTAMENTO equ 0 ;(0 times) +FEAT_FILTER equ 1 ;(44 times) +FEAT_FILTERG0L equ 1 ;(13 times) +FEAT_FILTERG1L equ 1 ;(22 times) +FEAT_FILTERG0R equ 0 ;(0 times) +FEAT_FILTERG1R equ 0 ;(0 times) +FEAT_BASS16 equ 0 ;(0 times) +FEAT_BASS16G1L equ 0 ;(0 times) +FEAT_BASS16G3L equ 0 ;(0 times) +FEAT_BASS16G1R equ 0 ;(0 times) +FEAT_BASS16G3R equ 0 ;(0 times) +FEAT_VOLUMEONLYG0L equ 0 ;(0 times) +FEAT_VOLUMEONLYG2L equ 0 ;(0 times) +FEAT_VOLUMEONLYG3L equ 0 ;(0 times) +FEAT_VOLUMEONLYG0R equ 0 ;(0 times) +FEAT_VOLUMEONLYG2R equ 0 ;(0 times) +FEAT_VOLUMEONLYG3R equ 0 ;(0 times) +FEAT_TABLETYPE equ 0 ;(0 times) +FEAT_TABLEMODE equ 0 ;(0 times) +FEAT_TABLEGO equ 1 ;(1 times) +FEAT_AUDCTLMANUALSET equ 1 ;(6 times) +FEAT_VOLUMEMIN equ 0 ;(0 times) +FEAT_EFFECTVIBRATO equ 1 ;(3 times) +FEAT_EFFECTFSHIFT equ 1 ;(11 times) +;* --------END-------- diff --git a/artwork/sfx/feat.txt b/artwork/sfx/feat.txt new file mode 100644 index 0000000..cd2326c --- /dev/null +++ b/artwork/sfx/feat.txt @@ -0,0 +1,41 @@ +STEREOMODE equ 0 +;* --------BEGIN-------- +;* C:\Atari\rmt\rmt128\schorch_str2.rmt +FEAT_SFX equ 1 +FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable +FEAT_NOSTARTINGSONGLINE equ 0 +FEAT_INSTRSPEED equ 1 +FEAT_CONSTANTSPEED equ 0 ;(19 times) +FEAT_COMMAND1 equ 1 ;(18 times) +FEAT_COMMAND2 equ 0 ;(0 times) +FEAT_COMMAND3 equ 0 ;(0 times) +FEAT_COMMAND4 equ 0 ;(0 times) +FEAT_COMMAND5 equ 0 ;(0 times) +FEAT_COMMAND6 equ 0 ;(0 times) +FEAT_COMMAND7SETNOTE equ 0 ;(0 times) +FEAT_COMMAND7VOLUMEONLY equ 0 ;(0 times) +FEAT_PORTAMENTO equ 0 ;(0 times) +FEAT_FILTER equ 1 ;(44 times) +FEAT_FILTERG0L equ 1 ;(13 times) +FEAT_FILTERG1L equ 1 ;(22 times) +FEAT_FILTERG0R equ 0 ;(0 times) +FEAT_FILTERG1R equ 0 ;(0 times) +FEAT_BASS16 equ 0 ;(0 times) +FEAT_BASS16G1L equ 0 ;(0 times) +FEAT_BASS16G3L equ 0 ;(0 times) +FEAT_BASS16G1R equ 0 ;(0 times) +FEAT_BASS16G3R equ 0 ;(0 times) +FEAT_VOLUMEONLYG0L equ 0 ;(0 times) +FEAT_VOLUMEONLYG2L equ 0 ;(0 times) +FEAT_VOLUMEONLYG3L equ 0 ;(0 times) +FEAT_VOLUMEONLYG0R equ 0 ;(0 times) +FEAT_VOLUMEONLYG2R equ 0 ;(0 times) +FEAT_VOLUMEONLYG3R equ 0 ;(0 times) +FEAT_TABLETYPE equ 0 ;(0 times) +FEAT_TABLEMODE equ 0 ;(0 times) +FEAT_TABLEGO equ 1 ;(2 times) +FEAT_AUDCTLMANUALSET equ 1 ;(6 times) +FEAT_VOLUMEMIN equ 0 ;(0 times) +FEAT_EFFECTVIBRATO equ 1 ;(3 times) +FEAT_EFFECTFSHIFT equ 1 ;(11 times) +;* --------END-------- diff --git a/artwork/sfx/rmt_feat.asm b/artwork/sfx/rmt_feat.asm deleted file mode 100644 index 84a3f1d..0000000 --- a/artwork/sfx/rmt_feat.asm +++ /dev/null @@ -1,40 +0,0 @@ -;* --------BEGIN-------- -;* Z:\home\pkalinowski\Seafile\atari\projects\scorch_src\artwork\sfx\scorch_trial07_stripped.rmt -FEAT_SFX equ 1 -FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable -FEAT_NOSTARTINGSONGLINE equ 0 -FEAT_INSTRSPEED equ 1 -FEAT_CONSTANTSPEED equ 16 ;(0 times) -FEAT_COMMAND1 equ 1 ;(4 times) -FEAT_COMMAND2 equ 0 ;(0 times) -FEAT_COMMAND3 equ 0 ;(0 times) -FEAT_COMMAND4 equ 0 ;(0 times) -FEAT_COMMAND5 equ 0 ;(0 times) -FEAT_COMMAND6 equ 0 ;(0 times) -FEAT_COMMAND7SETNOTE equ 0 ;(0 times) -FEAT_COMMAND7VOLUMEONLY equ 0 ;(0 times) -FEAT_PORTAMENTO equ 0 ;(0 times) -FEAT_FILTER equ 1 ;(22 times) -FEAT_FILTERG0L equ 0 ;(0 times) -FEAT_FILTERG1L equ 0 ;(0 times) -FEAT_FILTERG0R equ 0 ;(0 times) -FEAT_FILTERG1R equ 0 ;(0 times) -FEAT_BASS16 equ 0 ;(0 times) -FEAT_BASS16G1L equ 0 ;(0 times) -FEAT_BASS16G3L equ 0 ;(0 times) -FEAT_BASS16G1R equ 0 ;(0 times) -FEAT_BASS16G3R equ 0 ;(0 times) -FEAT_VOLUMEONLYG0L equ 0 ;(0 times) -FEAT_VOLUMEONLYG2L equ 0 ;(0 times) -FEAT_VOLUMEONLYG3L equ 0 ;(0 times) -FEAT_VOLUMEONLYG0R equ 0 ;(0 times) -FEAT_VOLUMEONLYG2R equ 0 ;(0 times) -FEAT_VOLUMEONLYG3R equ 0 ;(0 times) -FEAT_TABLETYPE equ 0 ;(0 times) -FEAT_TABLEMODE equ 0 ;(0 times) -FEAT_TABLEGO equ 1 ;(1 times) -FEAT_AUDCTLMANUALSET equ 1 ;(4 times) -FEAT_VOLUMEMIN equ 0 ;(0 times) -FEAT_EFFECTVIBRATO equ 0 ;(0 times) -FEAT_EFFECTFSHIFT equ 1 ;(7 times) -;* --------END-------- diff --git a/artwork/sfx/rmtplayr_game.asm b/artwork/sfx/rmtplayr.a65 similarity index 97% rename from artwork/sfx/rmtplayr_game.asm rename to artwork/sfx/rmtplayr.a65 index a92eeaa..2aeb590 100644 --- a/artwork/sfx/rmtplayr_game.asm +++ b/artwork/sfx/rmtplayr.a65 @@ -1,4 +1,3 @@ -.echo * ;* ;* Raster Music Tracker, RMT Atari routine version 1.20090108 ;* (c) Radek Sterba, Raster/C.P.U., 2002 - 2009 @@ -17,18 +16,40 @@ ;* ;* 3. Because of RMTplayer provides a lot of effects, it spent a lot of CPU time. ;* - STEREOMODE equ 0 ;0 => compile RMTplayer for 4 tracks mono +;* STEREOMODE equ 0..3 ;0 => compile RMTplayer for 4 tracks mono ;* ;1 => compile RMTplayer for 8 tracks stereo ;* ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4 ;* ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4 ;* -; IFT STEREOMODE==1 -;TRACKS equ 8 -; ELS + IFT STEREOMODE==1 +TRACKS equ 8 + ELS TRACKS equ 4 -; EIF + EIF ;* -PLAYER = * +;*PLAYER equ $3400 +;* +;* RMT FEATures definitions file +;* For optimizations of RMT player routine to concrete RMT modul only! + icl "feat.txt" +;* +;* RMT ZeroPage addresses + org RMT_Zero_Page_V +p_tis +p_instrstable org *+2 +p_trackslbstable org *+2 +p_trackshbstable org *+2 +p_song org *+2 +ns org *+2 +nr org *+2 +nt org *+2 +reg1 org *+1 +reg2 org *+1 +reg3 org *+1 +tmp org *+1 + IFT FEAT_COMMAND2 +frqaddcmd2 org *+1 + EIF IFT TRACKS>4 org PLAYER-$400+$40 ELS @@ -745,8 +766,9 @@ ei4 IFT 1==[FEAT_COMMAND1+FEAT_COMMAND2+FEAT_COMMAND3+FEAT_COMMAND4+FEAT_COMMAND5+FEAT_COMMAND6+[FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY]] beq cmd0 ELS - lsr @ - lsr @ +; lsr @ +; lsr @ + lda #0 ; my fix :) sta jmx+1 jmx bcc * jmp cmd0 diff --git a/artwork/sfx/schorch_str2.rmt b/artwork/sfx/schorch_str2.rmt new file mode 100644 index 0000000..1c893ac Binary files /dev/null and b/artwork/sfx/schorch_str2.rmt differ diff --git a/artwork/sfx/scorch_trial07_stripped.rmt b/artwork/sfx/scorch_trial07_stripped.rmt deleted file mode 100644 index 9bef4ce..0000000 Binary files a/artwork/sfx/scorch_trial07_stripped.rmt and /dev/null differ diff --git a/artwork/sfx/scorch_trial09_stripped.rmt b/artwork/sfx/scorch_trial09_stripped.rmt deleted file mode 100644 index 225bb86..0000000 Binary files a/artwork/sfx/scorch_trial09_stripped.rmt and /dev/null differ diff --git a/artwork/sfx/scorch_trial0j.rmt b/artwork/sfx/scorch_trial0j.rmt new file mode 100644 index 0000000..b160dcb Binary files /dev/null and b/artwork/sfx/scorch_trial0j.rmt differ diff --git a/artwork/sfx/scorch_trial0f_stripped.rmt b/artwork/sfx/scorch_trial0j_stripped.rmt similarity index 56% rename from artwork/sfx/scorch_trial0f_stripped.rmt rename to artwork/sfx/scorch_trial0j_stripped.rmt index 0343be7..72a3c58 100644 Binary files a/artwork/sfx/scorch_trial0f_stripped.rmt and b/artwork/sfx/scorch_trial0j_stripped.rmt differ diff --git a/artwork/tanks.fnt b/artwork/tanks.fnt deleted file mode 100644 index 100ef24..0000000 Binary files a/artwork/tanks.fnt and /dev/null differ diff --git a/artwork/tanksv2.fnt b/artwork/tanksv2.fnt deleted file mode 100644 index 8adfc4e..0000000 Binary files a/artwork/tanksv2.fnt and /dev/null differ diff --git a/artwork/tanksv3.fnt b/artwork/tanksv3.fnt new file mode 100644 index 0000000..ddd8678 Binary files /dev/null and b/artwork/tanksv3.fnt differ diff --git a/artwork/weapons.fnt b/artwork/weapons.fnt deleted file mode 100644 index 0bccd80..0000000 Binary files a/artwork/weapons.fnt and /dev/null differ diff --git a/artwork/weapons_AW5_mod.fnt b/artwork/weapons_AW6_mod.fnt similarity index 93% rename from artwork/weapons_AW5_mod.fnt rename to artwork/weapons_AW6_mod.fnt index 8aa58be..577e581 100644 Binary files a/artwork/weapons_AW5_mod.fnt and b/artwork/weapons_AW6_mod.fnt differ diff --git a/constants.asm b/constants.asm index 7721be5..98ed096 100644 --- a/constants.asm +++ b/constants.asm @@ -2,11 +2,29 @@ .IF *>0 ;this is a trick that prevents compiling this file alone +; initial values for some variables +initialvaluesStart +I_OptionsTable .by 0,1,2,2,0,1,3,2 +I_RoundsInTheGame .by 10 ;how many rounds in the current game +I_seppukuVal .by 75 +I_mountainDeltaH .by 3 +I_mountainDeltaL .by $ff +;---------------------------------------------------- +; 4x4 text buffer +I_ResultLineBuffer + dta d" ", $ff +I_LineHeader1 + dta d"# ROUND: " +I_RoundNrDisplay + dta d" #", $ff +initialvaluesCount = *-initialvaluesstart ; MAX 128 bytes ! ;=================================================================================== ;==========================CONSTANT TABLES, do not erase!=========================== ;=================================================================================== -TankColoursTable .BYTE $86,$46,$c6,$28,$c6,$ee -TankStatusColoursTable .BYTE $80,$40,$c4,$20,$c0,$e4 +TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$de +TankStatusColoursTable .BYTE $54,$24,$94,$c4,$74,$d4 +TankShapesTable .BYTE char_tank1___________,char_tank2___________,char_tank3___________ + .BYTE char_tank1___________,char_tank2___________,char_tank3___________ dliColorsBack :10 .by $02,$00 dliColorsFore @@ -18,6 +36,7 @@ CashOptionH GravityTable .by 10,20,25,30,40 MaxWindTable .by 5,20,40,70,99 RoundsTable .by 10,20,30,40,50 +AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity flyDelayTable .by 255,150,75,35,1 seppukuTable .by 255, 45,25,15,9 mountainsDeltaTableH .by 0,1,3,5,7 @@ -36,7 +55,11 @@ TanksWeaponsTableL .by TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 - +;-------------- +XtankOffsetGO_L + .by 6,56,106,156,206,0 +XtankOffsetGO_H + .by 0,0,0,0,0,1 ;-----4x4 texts----- LineTop dta d"(%%%%%%%%%%%%)", $ff @@ -197,90 +220,6 @@ SlideLeftTable .BY %00000111 .BY %00001100 -;----------------------------------------------------------- -; 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 (horizontally right) to 90 (up) - - .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 (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 (horizontally right) to 90 (up) - - ; 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 - - ;------------------------------------------------- TanksNamesDefault dta d"1st.Tank" @@ -352,8 +291,8 @@ WeaponPriceH ; weapons prices (tables with prices of weapons) .by >price_Heavy_Shield___ .by >price_Force_Shield___ .by >price_Super_Mag______ - .by >price_Auto_Defense___ - .by >price_Fuel_Tank______ + .by >price_Bouncy_Castle__ + .by >price_Long_Barrel____ .by >price_Nuclear_Winter_ WeaponPriceL @@ -418,8 +357,8 @@ WeaponPriceL .by 0 ;this is a trick that prevents compiling this file alone @@ -31,6 +31,11 @@ OptionsDL .word OptionsScreen .byte $30,$02,$02,$70 :maxOptions .by $02,$10 + :(9-maxOptions) .by $70,$10 + .byte $80 + .byte $4f + .word (display+140*40) + :21 .by $0f ;76 .byte $41 .word OptionsDL ;------------------------ @@ -54,51 +59,51 @@ dl ; MAIN game display list .byte $10 ; 2 blank lines .byte $4f - .word display ; 1 line - :76 .by $0f ;76 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :13 .by $0f ;13 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :8 .by $0f ;8 - .by $4f ;1 + .word display ; 1 line + :76 .by $0f ;76 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :13 .by $0f ;13 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :8 .by $0f ;8 + .by $4f ;1 .wo display+$0ff0 - :2 .by $0f ;2 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :9 .by $0f ;9 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :8 .by $0f ;8 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :7 .by $0f ;7 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :6 .by $0f ;6 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :5 .by $0f ;5 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :4 .by $0f ;4 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :3 .by $0f ;3 - .by $0f+$80 ; DLI (black to end);1 - :38 .byte $0f ;35 ..... = 200 + :2 .by $0f ;2 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :9 .by $0f ;9 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :8 .by $0f ;8 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :7 .by $0f ;7 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :6 .by $0f ;6 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :5 .by $0f ;5 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :4 .by $0f ;4 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :3 .by $0f ;3 + .by $0f+$80 ; DLI (black to end);1 + :38 .byte $0f ;35 ..... = 200 .by $4f - .wo EmptyLine ; additional line of ground + .wo EmptyLine ; additional line of ground .byte $41 .word dl ;----------------------------------------------- ;Screen displays go first to avoid crossing 4kb barrier ;----------------------------------------------- OptionsScreen - dta d"Welcome to Scorch ver. " - build ; 3 bytes from scorch.asm (fancy method) :) - dta d" (un)2000-2022" + dta d"Welcome to Scorch v. " + build ; 4 bytes from scorch.asm (fancy method) :) + dta d" (un)2000-2022" dta d" Please select option with cursor keys " dta d" and press (Return) to proceed " OptionsHere @@ -128,6 +133,7 @@ MoreDown ListOfWeapons :36 dta d" " ListOfWeapons1End +;GameOverResults ; reuse after game (remember to clear on start new) ListOfDefensiveWeapons :16 dta d" " ListOfDefensiveWeaponsEnd ;constant useful when clearing @@ -146,6 +152,41 @@ EmptyLine dta d" " ; ------------------------------------------------- .ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!! +;----------------------------------------------- +GameOverResults = display+$0ff0 ; reuse after game +Credits = GameOverResults +(6*40) +CreditsLastLine = Credits + (41*40) +GameOverDL + .byte $70,$40 + .byte $47 ; 16 gr8 lines + .word GameOverTitle + .byte $4f ; 1 line + .word display+(40*72) + :28 .byte $0f ; 28 lines + .byte $0f+$80 + .byte $4f ; 1 line + .word display+(40*32) + :30 .byte $0f ; 30 lines + .byte $0f+$80 ; 1 line + .byte $4f ; 1 line + .word display+(40*72) + :7 .byte $0f ; 7 lines + .byte $00+$80 ; 1 line + .byte $42 ; 7 tekst lines + .word GameOverTitle2 + .byte $00+$80 + .byte $42 + .word GameOverResults + :5 .byte $00+$80,$02 + .byte $70+$80 + .byte $42+$20 ; VSCRL +DLCreditsAddr + .word Credits + :6 .byte $02+$20 + .byte $02 + .byte $41 + .word GameOverDL + NameScreen dta d" Enter names of players " dta d" Tank 01 Name:" @@ -179,5 +220,8 @@ activateTextEnd purchaseText dta d"Purchase" purchaseTextEnd - -.endif +GameOverTitle + dta d" game over "* +GameOverTitle2 + dta d" Player Points Hits Earned Money " +.endif \ No newline at end of file diff --git a/grafproc.asm b/grafproc.asm index 79e977e..9d4ec3f 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -462,19 +462,18 @@ endcircleloop .endp ;-------------------------------------------------- -.proc clearscreen +.proc ClearScreen ;-------------------------------------------------- - - lda #$ff - ldx #0 -@ - :31 sta display+($100*#),x - sta display+$1e50,x ; this is so no space outside of the screen is cleared - ; of course we are clearing $100 instead of $50, but who cares :] - inx + mwa #display temp + ldy #0 +@ lda #$ff + sta (temp),y + inw temp + cpw temp #display+screenheight*screenBytes+1 bne @- - rts + rts .endp + ;-------------------------------*------------------ .proc placetanks ;-------------------------------------------------- @@ -631,19 +630,16 @@ No6thTankHide SkipHidingPM + ldy TankShapesTable,x lda AngleTable,x - tay - lda BarrelTable,y - sta CharCode + cmp #91 ; left or right tank shape + bcs LeftTank + :2 iny ; right tank +LeftTank + sty CharCode DrawTankNrX ldx tanknr - lda xtankstableL,x - sta xdraw - lda xtankstableH,x - sta xdraw+1 - lda ytankstable,x - sta ydraw - mva #0 ydraw+1 + jsr SetupXYdraw jsr TypeChar @@ -728,44 +724,57 @@ ZeroesToGo6 bne ClearPM6 NoPlayerMissile + + ldy #$01 + lda Erase + beq @+ + dey +@ sty color ; draw defensive weapons like shield ( tank number in X ) ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char ldx TankNr lda ActiveDefenceWeapon,x cmp #ind_Shield_________ ; one shot shield - beq DrawTankShield + beq DrawTankSh cmp #ind_Force_Shield___ ; shield with energy and parachute beq DrawTankShieldBold cmp #ind_Heavy_Shield___ ; shield with energy beq DrawTankShieldBold - cmp #ind_Auto_Defense___ ; Auto Defence + cmp #ind_Bouncy_Castle__ ; Auto Defence beq DrawTankShieldWihHorns cmp #ind_Mag_Deflector__ ; Mag Deflector beq DrawTankShieldWihHorns cmp #ind_White_Flag_____ ; White Flag beq DrawTankFlag bne NoShieldDraw -DrawTankShield - jmp DrawTankShield.DrawInPosition +DrawTankSh + jsr DrawTankShield + jmp NoShieldDraw DrawTankShieldWihHorns - jsr DrawTankShield.DrawInPosition - jmp DrawTankShieldHorns + jsr DrawTankShield + jsr DrawTankShieldHorns + jmp NoShieldDraw DrawTankShieldBold - jsr DrawTankShield.DrawInPosition - jmp DrawTankShieldBoldLine + jsr DrawTankShield + jsr DrawTankShieldBoldLine + jmp NoShieldDraw DrawTankFlag - lda #$5E ; flag symbol + lda #char_flag____________ ; flag symbol sta CharCode lda Ytankstable,x sec sbc #8 sta ydraw - lda XtanksTableL,x - sta xdraw - lda XtanksTableH,x - sta xdraw+1 jsr TypeChar NoShieldDraw +BarrelChange + ldy #$01 + lda Erase + beq @+ + dey +@ sty color + jsr DrawBarrel + ldx TankNr DoNotDrawTankNr rts .endp @@ -782,11 +791,15 @@ tankflash_loop mva #1 Erase ldx TankNr jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! - PAUSE 2 + ;PAUSE 2 + ldy #1 + jsr PauseYFrames mva #0 Erase ldx TankNr jsr DrawTankNr.SkipHidingPM - PAUSE 2 + ;PAUSE 2 + ldy #1 + jsr PauseYFrames dec fs jne tankflash_loop rts @@ -801,22 +814,9 @@ tankflash_loop ; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- - lda xtankstableL,x - sta xdraw - lda xtankstableH,x - sta xdraw+1 - lda ytankstable,x - sta ydraw - mva #0 ydraw+1 -DrawInPosition - mva #1 color - lda erase - beq ShieldVisible - dec color -ShieldVisible sbw xdraw #$03 ; 3 pixels to left ; draw left vertical line of shield ( | ) - mva #6 temp ; strange !!! + mva #7 temp ; strange !!! @ jsr plot .nowarn dew ydraw @@ -894,17 +894,18 @@ ShieldVisible .proc DrawTankParachute ;Tank number in X ;-------------------------------------------------- - lda #$34 ; parachute symbol + lda #char_parachute_______ ; parachute symbol sta CharCode lda Ytankstable,x - sec + cmp #16 + bcc ToHighToParachute + ;sec sbc #8 sta ydraw - lda XtanksTableL,x - sta xdraw - lda XtanksTableH,x - sta xdraw+1 + jsr SetupXYdraw.X jsr TypeChar +ToHighToParachute + ldx TankNr rts .endp @@ -944,19 +945,16 @@ NoFallingSound and #01 beq DoNotClearParachute ; here we clear the parachute - ldx TankNr +; ldx TankNr jsr DrawTankParachute DoNotClearParachute mva #0 Erase - ldx TankNr +; ldx TankNr 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 + jsr SetupXYdraw.X lda Ytankstable,x clc adc #1 ; in this point the comment helped us! For the very first @@ -1037,9 +1035,10 @@ FallingLeft 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 + bne NotLeftEdge + lda XtanksTableL,x + cmp #2 ; 2 pixels correction due to a barrel wider than tank beq EndLeftFall NotLeftEdge ; tank is falling left - modify coorinates @@ -1064,7 +1063,7 @@ FallingRight lda XtanksTableH,x adc #0 sta temp+1 - cpw temp #screenwidth + cpw temp #screenwidth-2 ; 2 pixels correction due to a barrel wider than tank beq EndRightFall ; tank is falling right - modify coorinates sec @@ -1088,9 +1087,9 @@ EndOfFCycle cmp #3 ; parachute and falling bne DoNotDrawParachute ; here we draw parachute - ldx TankNr +; ldx TankNr jsr DrawTankParachute - wait ; onli if tank with patachute + jsr WaitOneFrame ; only if tank with parachute RapidFalling DoNotDrawParachute lda EndOfTheFallFlag @@ -1099,7 +1098,7 @@ DoNotDrawParachute ; 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 +; ldx TankNr lda XtanksTableL,x and #$01 beq EndOfFall ; if it is even then it is the end @@ -1116,7 +1115,7 @@ ForceFallLeft jne TankFallsX EndOfFall mva #1 Erase - ldx TankNr +; ldx TankNr ; if tank was falling down having parachute, ; we must deduct one parachute lda Parachute @@ -1135,7 +1134,7 @@ NoParachuteWeapon jsr DrawTankParachute ThereWasNoParachute mva #0 Erase - ldx TankNr +; ldx TankNr jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) mva #sfx_silencer sfx_effect rts @@ -1432,7 +1431,7 @@ EndDrawing rts .endp -; **************************************************** +/* ;-------------------------------------------------- .proc calculatemountains0 ; Only for testing - makes ground flat (0 pixels) @@ -1457,7 +1456,7 @@ SetYofNextTank bpl SetYofNextTank rts .endp -; **************************************************** +*/ ; ----------------------------------------- .proc unPlot @@ -1578,10 +1577,10 @@ EndOfUnPlot ; ----------------------------------------- ; is it not over the screen ??? cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) - bcs unPlot.EndOfUnPlot + bcs unPlot.EndOfUnPlot ;nearest RTS CheckX02 cpw xdraw #screenwidth - bcs EndOfPlot ;nearest RTS + bcs EndOfPlot MakePlot ; let's calculate coordinates from xdraw and ydraw @@ -1800,7 +1799,7 @@ EndPutChar FontColor0 ; char to the table lda CharCode4x4 - and #1 + and #%00000001 beq Upper4bits lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) Upper4bits @@ -1842,11 +1841,11 @@ GetUpper4bits and #$7 sta ybit - lsrw xbyte ; div 8 - rorw xbyte - rorw xbyte + :3 lsrw xbyte ; div 8 +; rorw xbyte +; rorw xbyte ;--- - ldy xbyte + ldy xbyte ; horizontal byte offet stored in Y lda dy ; y = y - 3 because left lower. sec sbc #3 @@ -1906,6 +1905,154 @@ EndPut4x4 ; and #$fc ; ora #$02 ; 2=normal, 3 = wide screen width sta dmactls + jsr WaitOneFrame + rts +.endp +; ------------------------------------- +.proc SetupXYdraw + lda ytankstable,x + sta ydraw + mva #0 ydraw+1 +X lda XtanksTableL,x + sta xdraw + lda XtanksTableH,x + sta xdraw+1 + rts +.endp +;-------------------------------------------------- +.proc DrawBarrel +; X - tankNr +; changes xdraw, ydraw, fx, fy +;-------------------------------------------------- + ;vx calculation + ;vx = sin(90-Angle) for Angle <=90 + ;vx = -sin(Angle-90) for 90 < Angle <= 180 + + ; erase previous barrel + + ;cos(Angle) (but we use sin table only so some shenanigans happen) + ; mva #0 color + ; lda previousBarrelAngle,x + ; sta Angle + ; jsr DrawBarrelTech + ; + ; mva #1 color + ldx TankNr + jsr SetupXYdraw + lda BarrelLength,x + sta yc ; current tank barrel length + lda angleTable,x + sta Angle + jsr DrawBarrelTech + rts +.endp + +.proc DrawBarrelTech + ; angle in Angle and A + + mvx #0 goleft + cmp #91 + bcc angleUnder90 + + ;over 90 + sec + sbc #90 + tax + ; barrel start offset over 90deg + adw xdraw #5 xdraw + mva #1 goleft + bpl @+ ; jmp @+ + +angleUnder90 + sec ; X = 90-Angle + lda #90 + sbc Angle + tax + ; barrel start offset under 90deg + adw xdraw #3 xdraw + +@ + sbw ydraw #3 ydraw + lda sintable,x ; cos(X) + sta vx + +;======vy + ;vy = sin(Angle) for Angle <=90 + ;vy = sin(180-Angle) for 90 < Angle <= 180 + +;-- + lda Angle + cmp #91 + bcc YangleUnder90 + + lda #180 + sec + sbc Angle +YangleUnder90 + tax + lda sintable,x + sta vy + + lda #0 ; all arithmetic to zero + sta vx+1 + sta vy+1 + sta fx + sta fy + + ; draw by vx vy + ; in each step + ; 1. plot(xdraw, ydraw) + ; 2. add vx and vy to 3 byte variables xdraw.fx, ydraw.fy + ; 3 check length, if shorter, go to 1. + + ; mva #6 yc ; barrel length +barrelLoop + + lda goleft + bne @+ + clc + lda fx + adc vx + sta fx + lda xdraw + adc #0 + sta xdraw + lda xdraw+1 + adc #0 + sta xdraw+1 + jmp ybarrel +@ + sec + lda fx + sbc vx + sta fx + lda xdraw + sbc #0 + sta xdraw + lda xdraw+1 + sbc #0 + sta xdraw+1 + +ybarrel + sec + lda fy + sbc vy + sta fy + lda ydraw + sbc #0 + sta ydraw + lda ydraw+1 + sbc #0 + sta ydraw+1 + + jsr plot ;.MakePlot + + dec yc + bne barrelLoop + + mwa xdraw EndOfTheBarrelX + mva ydraw EndOfTheBarrelY + rts .endp diff --git a/instrukcjaPL.txt b/instrukcjaPL.txt new file mode 100644 index 0000000..de7314f --- /dev/null +++ b/instrukcjaPL.txt @@ -0,0 +1,157 @@ +Podstawowa instrukcja: + +Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce). + +1 Wybór opcji gry. +Na pierwszym ekranie możemy skonfigurować opcje rozgrywwki: +- ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer +- początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, jecz przy krótkich rozgrywkach warto wybrać większą wartość) +- grawitacja +- maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund, tu możemy wybrać jak silny może być) +- ilość rozgrywanych rund +- 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), do strzelistych i wysokich (NP) +Wybór opcji klawiszami kursora lub joystickiem. +klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu. + +2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer +Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joysticjiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też kompute (pozostałe opcje). Jednocześnie z klawiatury można wprowadzić nazwę wybranego gracza. +Po naciśnięciu klawisza [RETURN] lub przycisku Joysticka ekran przechodzi na następnego gracza aż zostaną wybrane poziomy trudności dla każdego z nich. +Jeśli nazwa nie zostanie wpisana (bo np operujemy wyłącznie joystickiem), to zostanie uzupełniona nazwą domyślną. + +3. Ekran zakupów (przed każdą rundą) +Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni. +Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza. +(oczywiście dla graczy komputerowych ten ekran się nie pojawia) + +4. Główny ekran gry +W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji: +- nazwa czołgu gracza +- wybrana aktualnie broń ofensywna +- pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób +- ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia +- ustawiona przez gracza siła strzału (maksymalna siła strzału jest ograniczana przez energię gracza - nie może przekroczyć energii * 10 . Oznacza to, że mając małą ilość energii możemy oddać słabsze strzały +- numer aktualnej rundy rozgrywki +- prędkość i kierunek wiatru +- w nawiasie nazwę aktywnej broni defensywnej - jeśli jest jakaś aktywowana przez gracz +Tutaj klawiszologia jest prosta, klawisze kursora lub joustick: lewo/prawo - zmiana kąta nachylenia lufy, góra/dół - zmiana ustawienia siły strzału. +[SPACJA] lub przycisk joysticka naciśnięte krótko - oddanie strzału +[TAB] - wybór broni ofensywnej (ta opcja nie jest dostępna bezpośrednio joystickiem - trzeba wybrać Inventory) +klawisz [I] lub dłuższe przytrzymanie przycisku joysticka - przejście do Inventory +Inventory to ekran (a w zasadzie dwa) bliźniaczo podobny do ekranu zakupów. Zasady poruszania się są identyczne z tym, że tu nie kupujemy broni, ale wybieramy jedną z ofensywnych, którą będziemy strzelać lub aktywujemy broń defensywną. +Klawisz [M] - wyłączenie/włączenie muzyki w tle +Klawisz [S] - wyłączenie/włączenie dźwięków efektów. +Klawisz [O] - wymuszenie zakończenia gry (Game Over). W podsumowaniu wyników nie jest brana pod uwagę przerwana właśnie runda rozgrywki, a wyłącznie rundy zakończone wcześniej. Odpowiada to wciśnięciu klawisza [ESC] z tą różnicą, że wyświetlane jest podsumowanie oraz creditsy. + +W czasie całej gry w dowolnym momencie (chyba że akurat gra komputer, wtedy czasem trzeba chwilę poczekać) można nacisnąć klawisz [ESC], który umożliwia przerwanie gry i powrót na początek (oczywiście jest zabezpieczenie przed przypadkowym naciśnięciem). + + +A tutaj zręby opisu działania poszczególnych broni, zasad punktacji itp: + +—----------------------- + +Najpierw co wiemy o energii czołgów +- Czołgi mają energię (a Ogry warstwy - jak cebula) - na starcie 99 jednostek +- Energii czołgom ubywa na 3 sposoby: +1. 1 jednostka po oddaniu każdego strzału +2. w czasie spadania (jeden piksel w dół 2 jednostki) +3. w chwili trafienia w czołg lub obok niego jakiegoś pocisku - i tu ilość odejmowanej energii zależy od odległości od centrum eksplozji i typu/siły rażenia pocisku. + +Jak działa odejmowanie energii (i zarabianie kasy!) +Po każdej rundzie wyliczana jest ilość zdobytych/straconych pieniędzy robione jest to na podstawie dwóch zmiennych gromadzonych przez każdy z czołgów w trakcie rundy. Te zmienne to: +gain - energia "przechwycona" od trafionych czołgów (także jeśli trafimy w samego siebie :) i tu haczyk, jeśli pozostało nam bardzo mało energii opłacalne może być trafienie w siebie mocną bronią! +loose - energia stracona w wyniku eksplozji/upadku (i tu ważne liczona jest całkowita utrata energii nawet jeśli czołg ma w chwili trafienia mniej). +Dodatkowo czołg który wygrał rundę ma parametr gain (przechwyconej od trafionych czołgów energii) zwiększany o pozostałą mu na koniec rundy energię (bo nie zginął i powinien ją mieć - choć bywa też inaczej :) ) + +Konkretnie: +Po każdej rundzie: +money = money + (2 * (gain+energy)) +money = money - loose +if money <0 then money=0 + +(na starcie każdej rundy gain i loose mają wartość 0) + +W czasie rundy, jeśli w wyniku strzału oddanego przez czołg inny czołg zostanie trafiony, czołg oddający strzał "dostaje energię" zabraną czołgowi trafionemu. +czołg oddający strzał: +gain = gain + EnergyDecrease +czołg trafiony: +loose = loose + EnergyDecrease + +gdzie EnergyDecrease to utrata energii w wyniku trafienia. + +Oczywiście jednocześnie trafiony czołg traci ilość energii zapisaną w EnergyDecrease, z tym że tutaj strata nie może przekroczyć posiadanej energii. + +Uwaga! Ekranowa reprezentacja pieniędzy ma na końcu dopisane dodatkowe 0 więc faktyczne mamy 10 razy więcej kasy niż wynika z powyższych obliczeń :) + +Jak działa trafienie. +Każda broń, która skutkuje eksplozją, ma swój promień rażenia (ExplosionRadius). +Po eksplozji każdy czołg w jej zasięgu traci energię. +Działa to tak, że obliczana jest odległość trafianego czołgu od centrum eksplozji, zmniejszony o tę odległość ExplosionRadius jest mnożony przez 8 i w wyniku otrzymujemy EnergyDecrease. +Czyli w przypadku trafienia centralnie w czołg: +EnergyDecrease = ExplosionRadius * 8 +a z każdym pikselem dalej od centrum ubywa o 8 jednostek mniej. +Nie wiem czy to zrozumiałe - ja rozumiem :) +Przykładowo, jeśli czołg zostanie trafiony centralnie przy pomocy Baby Missile - odejmowane jest mu 88 jednostek energii (11 * 8), co także oznacza, że przy trafieniu tym pociskiem w odległości 12 pikseli od czołgu - nie traci on energii wcale. + +A oto wartości promienia rażenia (ExplosionRadius) dla poszczególnych broni: + +Baby Missile - 11 +Missile - 17 +Baby Nuke - 25 +Nuke - 31 +LeapFrog - 17 15 13 +Funky Bomb - 21 11 (* 5) +MIRV - 17 (* 5) +Death's Head - 31 (* 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 +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 +Heavy Riot Bomb - 29 +Baby Digger - 0 (60 - jak w Riot Blast) +Digger - 0 (60 - jak wyżej) +Heavy Digger - 0 (60 - jak wyżej) +Baby Sandhog - 0 (60 - jak wyżej) +Sandhog - 0 (60 - jak wyżej) +Heavy Sandhog - 0 (60 - jak wyżej) +Dirt Clod - 12 +Dirt Ball - 22 +Ton of Dirt - 31 +Liquid Dirt - 0 (może warto to zmienić?) +Dirt Charge - 0 (61 - jak wyżej) +Laser - x 100 (ale tu także jest inaczej - równo 100 tylko w przypadku bezpośredniego trafienia, zmienna ExplosionRadius nie jest używana, więc nie ma mnożenia przez 8 - po prostu odejmujemy 100 jednostek energii - czyli czołg zawsze ginie). + + +Duże punkty otrzymane przez gracza to ilość czołgów, które zginęły wcześniej niż on. Jeśli któryś z innych czołgów skapitulował wcześniej (Biała Flaga) nie jest doliczany do tych które zginęły i nie daje punktów. +Tylko te punkty decydują o kolejności w podsumowaniu + + +A teraz bronie defensywne: +White Flag - powoduje poddanie gracza (może czasem przydać się w sytuacji beznadziejnej). Zaletą jest to, że poddając się nie dajemy dużego punktu przeciwnikom i nie powodujemy, że któryś zyska na tym, że nas zgładzi, ograniczamy też stratę swojej energii czyli także kasy. I tu także ważna uwaga - to jedyna broń defensywna, którą można deaktywować. Wystarczy ponownie wejść do inventory i jeszcze raz wybrać jej aktywację. +Battery - w momencie aktywacji doładowuje energię czołgu do pełna (99 jednostek) i jednocześnie jest to jedyna broń defensywna, która nie deaktywuje innych broni defensywnych w przypadku jej użycia. +Parachute - nie chroni przed ubytkiem energii z powodu sąsiedniej eksplozji, powoduje że nie ubywa energii w czasie JEDNEGO spadania. Po takim upadku deaktywuje się i trzeba aktywować nowy spadochron. +Shield - najprostsza osłona działa dokładnie przeciwnie niż Parachute, nie chroni przed ubytkiem energii w czasie spadania, chroni za to przed ubytkiem energii spowodowanym JEDNĄ sąsiednią eksplozją. Chroni jednorazowo, bez znaczenia jak silna jest eksplozja (czy jest to tylko "draśnięcie", czy też bezpośrednie trafienie atomówką) i od razu po niej deaktywuje się. +Heavy Shield - osłona z własną energią (na starcie 99 jednostek), działa tak samo jak Shield (nie chroni przed upadkiem) z tym wyjątkiem, że ma własny zasób energii. Przy eksplozji w pierwszej kolejności zmniejszana jest energia tej osłony i jeśli dojdzie ona do 0 to osłona deaktywuje się i dalej zmniejszana jest energia czołgu. W związku z takim działaniem, czołg z tym typem osłony można "zabić" podkopując go, bo spadanie zmniejsza energię czołgu a nie osłony. +Force Shield - najmocniejsza osłona - działa tak jak Heavy Shield tyle że połączona z Parachute. Co ważne w jej przypadku upadek nie zabiera energii osłonie ani czołgowi. Zabierają ją tylko trafienia. +Bouncy Castle - broń agresywna :) . Działa następująco. W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje "odbicie" pocisku w przeciwnym kierunku z tą samą siłą z jaką był wystrzelony. W przypadku braku wiatru i różnicy poziomów broń trafia wtedy w czołg, który ją wystrzelił. Po takim odbiciu deaktywuje się. W związku z tym, że broń ta reaguje w ten sposób tylko na precyzyjne trafienia, jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie trzeba będzie przemyśleć tę wartość i dać tu mniejszą). +Mag Deflector - druga broń agresywna :) . W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje przesunięcie punktu trafienia losowo w lewo lub prawą stronę chronionego czołgu, ale niezbyt daleko, więc można dostać "odłamkiem" przy silniejszej broni. Tak jak w przypadku Bouncy Castle jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie i tutaj trzeba będzie przemyśleć tę wartość i dać mniejszą). +Nuclear Winter - nic nie dodaje, nic nie zabiera :) - w zasadzie to broń nie tyle defensywna co obosieczna. Zasypuje teren opadem "radioaktywnym", który jest zwyczajną glebą. Jeśli nie mamy pod ręką żadnej broni odkopującej teren i do tego osłony (najlepiej jednorazowej), to po takim "opadzie" będzie trzeba strzelić do siebie - bo będąc pod ziemią inaczej się nie da. Ewentualnie pozostaje zawsze White Flag. +Long Schlong - broń specjalna :) - kosztuje dużo, nie bardzo w czymkolwiek pomaga (poza ewentualnym odkopaniem się ale tylko przy niewielkim przysypaniu ale fanie się nazywa i wygląda :) - Można ją aktywować niezależnie od innych broni defensywnych i pozostaje aktywna do końca rundy (nie da się jej deaktywować). + +W związku z odmiennym działaniem broni MIRV, Auto Defense i Mag Deflector wykorzystują tylko funkcję osłony przy trafieniu tą bronią. + +Dodatkowo, żadna z osłon nie chroni przed Napalmem. Auto Defense czy Mag Deflector przy bezpośrednim trafieniu odbije je lub przeniesie obok, ale wystarczy trafić bardzo blisko czołgu i nie zadziała jego osłona. + +Bronie White Flag i Nuclear Winter po aktywacji wymagają uruchomienia, jest to realizowanie przez "oddanie strzału" po aktywacji tej broni. Oczywiście strzał bronią ofensywną nie jest wtedy oddawany, a jedynie uruchamiana jest wybrana broń defensywna. + +Można mieć aktywną tylko jedną broń defensywną w danej chwili (za wyjątkiem Long Schlong oczywiście :) ). Zawsze przed oddaniem strzału możemy zmienić decyzję i aktywować inną broni defensywną czy też dezaktywować White Flag. +Oczywiście aktywacja broni w momencie kiedy mamy już aktywowaną jakąś inną powoduje utratę tej poprzedniej (nie ma zwrotów :) ). + + + + diff --git a/lib/macro.hea b/lib/macro.hea index 4e29ec5..2567870 100644 --- a/lib/macro.hea +++ b/lib/macro.hea @@ -76,16 +76,16 @@ .MACRO WAIT ; WAIT ; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) - lda CONSOL - cmp #6 ; START KEY - beq ?nowait - LDA VCOUNT - ldy vcount -?WA cpy VCOUNT - BEQ ?WA -?wframe - cmp vcount - bne ?wframe +?zero LDA VCOUNT + beq ?zero + bpl ?WA + sbc #10 ; last lines correction +?WA cmp VCOUNT + beq ?WA + bcc ?WA +?WFRAME cmp VCOUNT + beq ?nowait + bcs ?WFRAME ?nowait .ENDM ;------------------------------------- diff --git a/scorch.asm b/scorch.asm index de26a6c..664ff1c 100644 --- a/scorch.asm +++ b/scorch.asm @@ -36,11 +36,11 @@ ;we decided it must go in 'English' to let other people work on it .macro build - dta d"148" ; number of this build (3 bytes) + dta d"1.00" ; number of this build (3 bytes) .endm icl 'definitions.asm' - icl 'artwork/sfx/rmt_feat.asm' +; icl 'artwork/sfx/rmt_feat.asm' .zpvar xdraw .word = $80 ;variable X for plot @@ -60,6 +60,7 @@ .zpvar xtempDRAW .word ;same as above for XDRAW routine .zpvar ytempDRAW .word ;same as above for XDRAW routine .zpvar tempor2 .byte + .zpvar CreditsVScrol .byte ;--------------temps used in circle routine .zpvar xi .word ;X (word) in draw routine .zpvar fx .byte @@ -77,6 +78,7 @@ .zpvar UnderTank1 .byte .zpvar UnderTank2 .byte ;---------------------------- + .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) .zpvar weaponPointer .word .zpvar dliCounter .byte .zpvar pressTimer .byte @@ -85,36 +87,42 @@ ;.zpvar dliA .byte ;.zpvar dliX .byte ;.zpvar dliY .byte + .zpvar sfx_effect .byte + .zpvar RMT_blocked .byte +;-------------- + + displayposition = modify + ;* RMT ZeroPage addresses - .zpvar p_tis .word - .zpvar p_trackslbstable .word - .zpvar p_trackshbstable .word - .zpvar p_song .word - .zpvar ns .word - .zpvar nr .word - .zpvar nt .word - .zpvar reg1 .byte - .zpvar reg2 .byte - .zpvar reg3 .byte - .zpvar tmp .byte - IFT FEAT_COMMAND2 - .zpvar frqaddcmd2 .byte - EIF - p_instrstable = p_tis + .zpvar RMT_Zero_Page_V .byte +; .zpvar p_tis .word +; .zpvar p_trackslbstable .word +; .zpvar p_trackshbstable .word +; .zpvar p_song .word +; .zpvar ns .word +; .zpvar nr .word +; .zpvar nt .word +; .zpvar reg1 .byte +; .zpvar reg2 .byte +; .zpvar reg3 .byte +; .zpvar tmp .byte +; IFT FEAT_COMMAND2 +; .zpvar frqaddcmd2 .byte +; EIF +; p_instrstable = p_tis - displayposition = modify ;------------------------------- icl 'lib/atari.hea' icl 'lib/macro.hea' ;splash screen and musix - icl 'artwork/HIMARS14.asm' + icl 'artwork/Scorch50.asm' ;Game loading address ORG $3000 WeaponFont - ins 'artwork/weapons_AW5_mod.fnt' ; 'artwork/weapons.fnt' + ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' ;----------------------------------------------- ;Screen displays go here to avoid crossing 4kb barrier ;----------------------------------------------- @@ -124,18 +132,57 @@ WeaponFont ;-------------------------------------------------- ; Game Code ;-------------------------------------------------- -START +FirstSTART + mva #0 dmactls ; dark screen + jsr WaitOneFrame + ; one time zero variables in RAM (non zero page) + lda #0 + ldy #OneTimeZeroVariablesCount-1 +@ sta OneTimeZeroVariables,y + dey + bpl @- + + ; initialize variables in RAM (non zero page) + ldy #initialvaluesCount-1 +@ lda initialvaluesStart,y + sta variablesToInitialize,y + dey + bpl @- + + ; RMT INIT + lda #$f0 ;initial value + sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) + + lda #$ff ;initial value + sta sfx_effect + + lda #0 + jsr RmtSongSelect + + VMAIN VBLinterrupt,7 ;jsr SetVBL + +START ; Startup sequence jsr Initialize + + ;jsr GameOverScreen ; only for test !!! + + lda #song_main_menu + jsr RmtSongSelect + jsr Options ;startup screen - lda escFlag - bne START + mva #0 dmactls ; dark screen + jsr WaitOneFrame + bit escFlag + bmi START jsr EnterPlayerNames - lda escFlag - bne START + mva #0 dmactls ; dark screen + jsr WaitOneFrame + bit escFlag + bmi START jsr RandomizeSequence ; for the round #1 shooting sequence is random @@ -144,15 +191,17 @@ MainGameLoop jsr CallPurchaseForEveryTank ; issue #72 (glitches when switches) - mva #0 dmactls + mva #0 dmactls ; dark screen + jsr WaitOneFrame jsr GetRandomWind jsr RoundInit jsr MainRoundLoop - lda escFlag - bne START + bit escFlag + bmi START + jvs GoGameOver mva #0 TankNr ; @@ -171,25 +220,12 @@ MainGameLoop ; Results are number of other deaths ; before the player dies itself - lda #song_end_round + lda #song_round_over jsr RmtSongSelect jsr DisplayResults - ;check demo mode - ldx numberOfPlayers - dex -checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE - lda skillTable,x - beq peopleAreHere - dex - bpl checkForHuman - ; no people, just wait a bit - pause 150 - jmp noKey + jsr DemoModeOrKey -peopleAreHere - jsr getkey -noKey ldx NumberOfPlayers dex CalculateGains @@ -202,7 +238,15 @@ CalculateGains ; Important! If player has 10 energy and gets a central hit ; from nuke that would take 90 energy points, his loss ; is 90, not 10 - + + ; adding the remaining energy of the tank to gain + ; winner gets more ! :) + lda Energy,x + adc gainL,x + sta gainL,x + bcc @+ + inc gainH,x +@ ; add gain * 2 asl gainL,x rol gainH,x @@ -235,14 +279,50 @@ zeromoney lda #0 sta moneyL,x sta moneyH,x - skipzeroing +; and earned money for summary + clc + lda EarnedMoneyL,x + adc gainL,x + sta EarnedMoneyL,x + lda EarnedMoneyH,x + adc gainH,x + sta EarnedMoneyH,x + ; substract lose + ; if lose is greater than money then zero money + lda EarnedMoneyH,x + cmp loseH,x + bcc ezeromoney + bne esubstractlose + lda EarnedMoneyL,x + cmp loseL,x + bcc ezeromoney +esubstractlose + sec + lda EarnedMoneyL,x + sbc loseL,x + sta EarnedMoneyL,x + lda EarnedMoneyH,x + sbc loseH,x + sta EarnedMoneyH,x + jmp eskipzeroing +ezeromoney + lda #0 + sta EarnedMoneyL,x + sta EarnedMoneyH,x +eskipzeroing + dex - bpl CalculateGains + jpl CalculateGains lda GameIsOver - jne START - + beq NoGameOverYet +GoGameOver + mva #0 dmactls ; dark screen + jsr WaitOneFrame + jsr GameOverScreen + jmp START +NoGameOverYet inc CurrentRoundNr lda #$0 sta dmactls ; issue #72 @@ -266,9 +346,10 @@ skipzeroing lda #song_ingame jsr RmtSongSelect + jsr SetPMWidth lda #0 - sta sizep0 ; P0-P1 widths - sta sizep0+1 + sta colpf2s ; status line "off" + sta colpf1s tax @ sta singleRoundVars,x @@ -287,6 +368,8 @@ SettingEnergies sta Energy,x sta eXistenZ,x sta LASTeXistenZ,x + lda #StandardBarrel ; standard barrel length + sta BarrelLength,x ; anything in eXistenZ table means that this tank exist ; in the given round lda #<1000 @@ -319,14 +402,19 @@ SettingEnergies jsr SetMainScreen jsr ColorsOfSprites - lda #0 - sta colpf2s ; status line "off" - sta colpf1s + +; lda #90 ; barrel fully erect +; ldx #MaxPlayers-1 +;@ sta previousBarrelAngle,x +; dex +; bpl @- + jsr drawmountains ;draw them jsr drawtanks ;finally draw tanks - mva #0 TankSequencePointer + mva #$00 TankSequencePointer + ;---------round screen is ready--------- mva #TextForegroundColor colpf1s ; status line "on" rts @@ -410,6 +498,8 @@ DoNotFinishTheRound ldx tankNr lda TankStatusColoursTable,x sta colpf2s ; set color of status line + jsr PutTankNameOnScreen + jsr DisplayStatus lda SkillTable,x beq ManualShooting @@ -418,21 +508,18 @@ RoboTanks ; robotanks shoot here ; TankNr still in X jsr ArtificialIntelligence - jsr PutTankNameOnScreen - jsr DisplayStatus - pause 30 + ;pause 30 ldx TankNr + jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) ) jsr MoveBarrelToNewPosition lda kbcode cmp #28 ; ESC bne @+ jsr AreYouSure - lda escFlag - seq:rts + bit escFlag + spl:rts @ - ; let's move the tank's barrel so it points the right - ; direction jmp AfterManualShooting ManualShooting @@ -440,7 +527,7 @@ ManualShooting jsr WaitForKeyRelease jsr BeforeFire lda escFlag - seq:rts + seq:rts ; keys Esc or O AfterManualShooting mva #0 plot4x4color @@ -466,7 +553,7 @@ StandardShoot jsr DecreaseWeaponBeforeShoot jsr DisplayStatus - ldx TankNr +; ldx TankNr dec Energy,x ; lower energy to eventually let tanks commit suicide ShootNow @@ -511,16 +598,16 @@ AfterExplode NoFallDown2 ;here tanks are falling down mva tankNr tempor2 - mvx #0 TankNr - + ldx NumberOfPlayers + dex TanksFallDown + stx TankNr lda eXistenZ,x beq NoExistNoFall jsr TankFalls NoExistNoFall - inc:ldx TankNr - cpx NumberOfPlayers - bne TanksFallDown + dex + bpl TanksFallDown mva tempor2 TankNr missed @@ -538,30 +625,8 @@ NextPlayerShoots SeteXistenZ lda Energy,x sta eXistenZ,x - sta L1 - - ;DATA L1,L2 - ;Multiplication 8bit*8bit, - ;result 16bit - ;this algiorithm is a little longer than one in Ruszczyc 6502 book - ;but it is faster - - LDy #8 - LDA #0 - CLC -LP0 - ror - ROR L1 - BCC B0 - CLC - ADC #10 ; (L2) multiplication by 10 -B0 DEY - BNE LP0 - ror - ROR L1 - STA MaxForceTableH,x - lda L1 - sta MaxForceTableL,x + + jsr MaxForceCalculate dex bpl SeteXistenZ @@ -736,16 +801,16 @@ ldahashzero NotNegativeEnergy sta Energy,x ;now increase the gain of the shooting tank - phx - ldx TankNr + ; phx + ldy TankNr clc - lda gainL,x + lda gainL,y adc EnergyDecrease - sta gainL,x - lda gainH,x + sta gainL,y + lda gainH,y adc #$00 - sta gainH,x - plx + sta gainH,y + ; plx rts .endp @@ -787,12 +852,7 @@ NotNegativeShieldEnergy lda #0 ; turn off defense weapons when hara-kiring sta ActiveDefenceWeapon,x sta ShieldEnergy,x - lda xtankstableL,x - sta xdraw - lda xtankstableH,x - sta xdraw+1 - lda yTanksTable,x - sta ydraw + jsr SetupXYdraw lda #1 ; Missile jsr ExplosionDirect jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku @@ -826,7 +886,37 @@ NotNegativeShieldEnergy .endr @ rts .endp +;-------------------------------------------------- +.proc MaxForceCalculate +; calculates max force for tank (tanknr in X) +; Energy of tank X in A +;-------------------------------------------------- + sta L1 + + ;DATA L1,L2 + ;Multiplication 8bit*8bit, + ;result 16bit + ;this algiorithm is a little longer than one in Ruszczyc 6502 book + ;but it is faster + LDy #8 + LDA #0 + CLC +LP0 + ror + ROR L1 + BCC B0 + CLC + ADC #10 ; (L2) multiplication by 10 +B0 DEY + BNE LP0 + ror + ROR L1 + STA MaxForceTableH,x + lda L1 + sta MaxForceTableL,x + rts +.endp ;-------------------------------------------------- .proc PMoutofScreen ;-------------------------------------------------- @@ -856,7 +946,7 @@ NotNegativeShieldEnergy ;-------------------------------------------------- ldx #$3f ; TODO: maxweapons @ lda #$0 - cpx #48 ; White Flag + cpx #ind_White_Flag_____ ; White Flag bne @+ lda #99 @ sta TanksWeapon1,x @@ -890,17 +980,15 @@ deletePtr = temp inw deletePtr cpw deletePtr #variablesEnd bne @- - + mwa #1024 RandBoundaryHigh mva #$ff LastWeapon sta HowMuchToFall mva #1 color - jsr WeaponCleanup + jsr SetStandardBarrels + jsr WeaponCleanup - - mva #TextBackgroundColor colpf2s - mva #TextForegroundColor colpf3s mva #>WeaponFont chbas ;parameter for old plot (unPlot) max 5 points @@ -925,6 +1013,47 @@ SetunPlots ; sta dmactls lda #$03 ; P/M on sta pmcntl + jsr SetPMWidth + lda #%00100000 ; P/M priorities (multicolor players on) + sta gtictls + jsr PMoutofScreen + + ;let the tanks be visible! + ldx #(maxPlayers-1) + lda #99 ; tank is visible +MakeTanksVisible + sta eXistenZ,x + dex + bpl MakeTanksVisible + + mva #1 CurrentRoundNr ;we start from round 1 + mva #6 NTSCcounter + +; ; RMT INIT +; lda #$f0 ;initial value +; sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) +; +; lda #$ff ;initial value +; sta sfx_effect +; +; lda #0 +; jsr RmtSongSelect +; +; VMAIN VBLinterrupt,7 ;jsr SetVBL + + rts +.endp +;-------------------------------------------------- +.proc SetStandardBarrels + ldx #maxPlayers-1 + lda #StandardBarrel ; standard barrel length +@ sta BarrelLength,x + dex + bpl @- + rts +.endp +;-------------------------------------------------- +.proc SetPMWidth lda #$00 sta sizep0 ; P0-P3 widths sta sizep0+1 @@ -932,43 +1061,7 @@ SetunPlots sta sizep0+3 lda #%01010101 sta sizem ; all missiles, double width - lda #%00100000 ; P/M priorities (multicolor players on) - sta gtictls - jsr PMoutofScreen - - ;let the tanks be visible! - ldx #(maxPlayers-1) - lda #1 ; tank is visible -MakeTanksVisible - sta eXistenZ,x - dex - bpl MakeTanksVisible - - - ldx #0 - txa -ClearResults - sta ResultsTable,x - inx - cpx #MaxPlayers - bne ClearResults - - mva #1 CurrentRoundNr ;we start from round 1 - mva #6 NTSCcounter - - ; RMT INIT - lda #$f0 ;initial value - sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) -; - lda #$ff ;initial value - sta sfx_effect -; - lda #0 - jsr RmtSongSelect -; - VMAIN VBLinterrupt,6 ;jsr SetVBL - - rts + rts .endp ;-------------------------------------------------- .proc DLIinterruptGraph @@ -992,12 +1085,78 @@ ClearResults rti .endp ;-------------------------------------------------- +.proc DLIinterruptOptions + ;sta dliA + ;sty dliY + pha +; lda dliColorsBack + lda #0 + sta COLPF1 + lda dliColorsFore + sta COLPF2 + pla + rti +.endp +;-------------------------------------------------- +.proc DLIinterruptGameOver + ;sta dliA + ;sty dliY + pha + phy + lda dliCounter + bne EndofPMG + lda #%00100000 ; playfield after P/M + STA WSYNC + sta gtictl + bne EndOfDLI_GO +EndofPMG + cmp #1 + bne ColoredLines + lda #%00100100 ; playfield before P/M + STA WSYNC + sta gtictl + bne EndOfDLI_GO +ColoredLines + cmp #9 + beq CreditsScroll + tay + lda GameOverColoursTable-3,y ; -2 becouse this is DLI nr 2 and -1 (labels line) + ldy #$0a ; text colour (brightnes) + STA WSYNC + sta COLPF2 + sty COLPF1 + bne EndOfDLI_GO +CreditsScroll + lda #$00 + sta COLPF2 + inc CreditsVScrol + lda CreditsVScrol + cmp #32 ;not to fast + beq nextlinedisplay + :2 lsr ;not to fast + sta VSCROL + jmp EndOfDLI_GO +nextlinedisplay + lda #0 + sta CreditsVScrol + sta VSCROL + adw DLCreditsAddr #40 + cpw DLCreditsAddr #CreditsLastLine + bne EndOfDLI_GO + mwa #Credits DLCreditsAddr +EndOfDLI_GO + inc dliCounter + ply + pla + rti +.endp +;-------------------------------------------------- .proc DLIinterruptText ;sta dliA pha sta WSYNC - mva #TextBackgroundColor colpf2 - mva #TextForegroundColor colpf3 + mva #TextBackgroundColor COLPF2 + mva #TextForegroundColor COLPF3 ;lda dliA pla DLIinterruptNone @@ -1024,7 +1183,8 @@ itsPAL ; pressTimer is trigger tick counter. always 50 ticks / s bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s - + bit RMT_blocked + bmi SkipRMTVBL ; ------- RMT ------- lda sfx_effect bmi lab2 @@ -1040,12 +1200,12 @@ itsPAL lab2 jsr RASTERMUSICTRACKER+3 ;1 play ; ------- RMT ------- - +SkipRMTVBL exitVBL ply plx pla - jmp SYSVBV + jmp XITVBV .endp ;---------------------------------------------- .proc RandomizeSequence0 @@ -1177,20 +1337,30 @@ LimitForce .endp ;---------------------------------------------- .proc MoveBarrelToNewPosition + mva #1 Erase + jsr DrawTankNr.BarrelChange + mva #0 Erase +MoveBarrel + mva #sfx_set_power_2 sfx_effect jsr DrawTankNr jsr DisplayStatus.displayAngle - ldx TankNr +; ldx TankNr + mva #1 Erase + jsr WaitOneFrame + jsr DrawTankNr.BarrelChange + mva #0 Erase lda NewAngle cmp AngleTable,x beq BarrelPositionIsFine bcc rotateLeft ; older is bigger rotateRight;older is lower inc angleTable,x - jmp MoveBarrelToNewPosition + jmp MoveBarrel rotateLeft dec angleTable,x - jmp MoveBarrelToNewPosition + jmp MoveBarrel BarrelPositionIsFine + jsr DrawTankNr rts .endp @@ -1299,7 +1469,7 @@ nextishigher and #$3f ;CTRL and SHIFT ellimination cmp #28 ; ESC bne getkeyend - mvx #1 escFlag + mvx #$80 escFlag bne getkeyend checkJoyGetKey @@ -1348,6 +1518,54 @@ getkeyend bne WaitForKeyRelease rts .endp +;-------------------------------------------------- +.proc IsKeyPressed ; A=0 - yes , A>0 - no +;-------------------------------------------------- + lda SKSTAT + and #%00000100 + beq @+ + lda #1 +@ and TRIG0S + rts +.endp +;-------------------------------------------------- +.proc DemoModeOrKey +;-------------------------------------------------- + ;check demo mode + ldx numberOfPlayers + dex +checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE + lda skillTable,x + beq peopleAreHere + dex + bpl checkForHuman + ; no people, just wait a bit + ;pause 150 + ldy #75 + jsr PauseYFrames + jmp noKey + +peopleAreHere + jsr getkey +noKey + rts +.endp +.proc WaitOneFrame + lda CONSOL + cmp #6 ; START KEY + beq @+ + wait +@ rts +.endp +.proc PauseYFrames +; Y - number of frames to wait (divided by 2) +; pauses for maximally 510 frames (255 * 2) +@ jsr WaitOneFrame + jsr WaitOneFrame + dey + bne @- + rts +.endp ;-------------------------------------------------- .proc RmtSongSelect @@ -1355,9 +1573,12 @@ getkeyend ; starting song line 0-255 to A reg bit noMusic spl:lda #song_silencio + mvx #$ff RMT_blocked ldx #MODUL ;hi byte of RMT module to Y reg - jmp RASTERMUSICTRACKER ;Init, :RTS + jsr RASTERMUSICTRACKER ;Init + mva #0 RMT_blocked + rts .endp ;---------------------------------------------- icl 'weapons.asm' @@ -1376,7 +1597,7 @@ font4x4 ins 'artwork/font4x4s.bmp',+62 ;---------------------------------------------- TankFont - ins 'artwork/tanksv2.fnt' + ins 'artwork/tanksv3.fnt',+0,352 ; 44 characters only ;---------------------------------------------- icl 'variables.asm' ;---------------------------------------------- @@ -1384,26 +1605,23 @@ TankFont ; reserved space for RMT player .ds $0320 .align $100 +PLAYER .ECHO 'PLAYER: ',* - icl 'artwork/sfx/rmtplayr_game.asm' + icl 'artwork/sfx/rmtplayr.a65' MODUL equ $b000 ;address of RMT module opt h- ;RMT module is standard Atari binary file already - ins "artwork/sfx/scorch_trial0f_stripped.rmt" ;include music RMT module + ins "artwork/sfx/schorch_str2.rmt" ;include music RMT module opt h+ ; ; TheEnd .ECHO 'TheEnd: ',TheEnd - .if TheEnd > PMGraph + $300 - .error "memory conflict" - - .endif -;---------------------------------------------- -; Player/missile memory - org $b800 -PMGraph + ;.if TheEnd > PMGraph + $300 + ; .error "memory conflict" + ;.endif - run START + + run FirstSTART diff --git a/scorch.xex b/scorch.xex index d1439d1..8daadca 100644 Binary files a/scorch.xex and b/scorch.xex differ diff --git a/textproc.asm b/textproc.asm index 06b809b..2b8fcc1 100644 --- a/textproc.asm +++ b/textproc.asm @@ -1,4 +1,4 @@ -; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm .IF *>0 @@ -16,23 +16,55 @@ ; - money each player has on the beginning of the game (moneyL i moneyH) ; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight + jsr clearscreen ;let the screen be clean + mwa #OptionsDL dlptrs ; lda dmactls ; and #$fc ; ora #$02 ; normal screen width - lda #%00110010 ; normal screen width, DL on, P/M off +; lda #%00110010 ; normal screen width, DL on, P/M off + lda #%00111110 ; normal screen width, DL on, P/M on sta dmactls - - VDLI DLIinterruptText.DLIinterruptNone ; jsr SetDLI for text screen without DLIs + jsr SetPMWidth + mva #TextBackgroundColor colpf2s + mva #TextForegroundColor colpf3s + mva #$ca colpf1s + + VDLI DLIinterruptOptions ; jsr SetDLI for Options text screen + +; -------- setup bottom (tanks) line + lda NumberOfPlayers + pha + lda mountainsDeltaTableH + sta mountainDeltaH + lda mountainsDeltaTableL + sta mountainDeltaL + mva #6 NumberOfPlayers + jsr PMoutofScreen ;let P/M disappear + jsr clearscreen ;let the screen be clean + jsr ClearPMmemory + jsr placetanks ;let the tanks be evenly placed + jsr calculatemountains ;let mountains be easy for the eye + jsr ColorsOfSprites + jsr drawmountains ;draw them + ldx NumberOfPlayers + dex +@ jsr RandomizeAngle + sta AngleTable,x + dex + bpl @- + jsr drawtanks ;finally draw tanks + pla + sta NumberOfPlayers +; -------- mva #0 OptionsY OptionsMainLoop - jsr OptionsInversion jsr getkey - ldx escFlag - seq:rts + bit escFlag + spl:rts cmp #$f ;cursor down bne OptionsNoDown @@ -222,8 +254,8 @@ OptionsYLoop ManualPurchase jsr Purchase - ldx escFlag - seq:rts + bit escFlag + spl:rts AfterManualPurchase inc:lda TankNr @@ -251,6 +283,9 @@ AfterManualPurchase ; ora #$02 ; normal screen width lda #%00110010 ; normal screen width, DL on, P/M off sta dmactls + + lda #song_supermarket + jsr RmtSongSelect mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons @@ -290,8 +325,8 @@ AfterPurchase sta decimal lda moneyH,x sta decimal+1 - mwa #textbuffer2+29 displayposition - jsr displaydec + mwa #textbuffer2+28 displayposition + jsr displaydec5 ; in xbyte there is the address of the line that ; is being processed now @@ -346,9 +381,6 @@ CreateList ldy #25 lda #15 ; "/" sta (xbyte),y - iny - lda #04 ; "$" - sta (xbyte),y ldy #31 lda #16 ; "0" sta (xbyte),y @@ -361,12 +393,15 @@ CreateList ldx temp ;getting back index of the weapon ; and now price of the weapon - adw xbyte #27 displayposition ; 27 chars from the beginning of the line + adw xbyte #26 displayposition ; 26 chars from the beginning of the line lda WeaponPriceL,x sta decimal lda WeaponPriceH,x sta decimal+1 - jsr displaydec + jsr displaydec5 + ldy #26 ; overwrite first digit (allways space - no digit :) ) + lda #04 ; "$" + sta (xbyte),y jmp notInventory @@ -623,8 +658,8 @@ ChoosingItemForPurchase jsr PutLitteChar ; Places pointer at the right position jsr getkey - ldx escFlag - seq:jmp WaitForKeyRelease ; like jsr ... : rts + bit escFlag + spl:jmp WaitForKeyRelease ; like jsr ... : rts cmp #$2c ; Tab jeq ListChange cmp #$06 ; cursor left @@ -795,27 +830,35 @@ invSelectDef lda IndexesOfWeaponsL2,y tay ldx tankNr - cmp #ind_Battery________ - bne NotBattery - ; if activate battery, we do it differently + cmp #ind_Battery________ + bne NotBattery + ; if activate battery, we do it differently mva #sfx_battery sfx_effect - mva #99 Energy,x - bne DecreaseDefensive ; bypass activation + mva #99 Energy,x + jsr MaxForceCalculate + jmp DecreaseDefensive ; bypass activation NotBattery - cmp #ind_White_Flag_____ - bne NotWhiteFlag - cmp ActiveDefenceWeapon,x - bne NoDeactivateWhiteFlag - mva #sfx_white_flag sfx_effect - lda #$00 ; if try to activate activated White Flag then deactivate Defence + cmp #ind_Long_Barrel____ + bne NotBarrel + ; if activate long barrel, we do it differently too + mva #sfx_long_barrel sfx_effect + mva #LongBarrel BarrelLength,x + bne DecreaseDefensive ; bypass activation +NotBarrel + cmp #ind_White_Flag_____ + bne NotWhiteFlag + cmp ActiveDefenceWeapon,x + bne NoDeactivateWhiteFlag + mva #sfx_white_flag sfx_effect + lda #$00 ; if try to activate activated White Flag then deactivate Defence sta ActiveDefenceWeapon,x - sta ShieldEnergy,x - beq DefActivationEnd + sta ShieldEnergy,x + beq DefActivationEnd NotWhiteFlag NoDeactivateWhiteFlag - ; activate new defensive + ; activate new defensive sta ActiveDefenceWeapon,x - ; set defensive energy + ; set defensive energy lda DefensiveEnergy,y sta ShieldEnergy,x DecreaseDefensive @@ -983,8 +1026,8 @@ NoArrowDown lda TankStatusColoursTable,x sta colpf2s ; set color of player name line jsr EnterPlayerName - lda escFlag - seq:rts + bit escFlag + spl:rts inc TankNr lda TankNr cmp NumberOfPlayers @@ -1043,8 +1086,8 @@ endOfTankName CheckKeys jsr getkey - ldx escFlag - seq:rts + bit escFlag + spl:rts ; is the char to be recorded? ldx #keycodesEnd-keycodes ;table was 38 chars long @@ -1154,6 +1197,8 @@ EndOfNick asl ; 8 chars per name tax ; in X where to put new name + mva #sfx_next_player sfx_effect + lda NameAdr ; check if first char is " " and #$7F ; remove inverse (Cursor) beq MakeDefaultName @@ -1175,7 +1220,6 @@ nextchar05 iny cpy #$08 bne nextchar05 - mva #sfx_next_player sfx_effect rts .endp @@ -1213,13 +1257,13 @@ CheckNextLevel .endp ;-------------------------------------------------- -.proc displaydec ;decimal (word), displayposition (word) +.proc displaydec5 ;decimal (word), displayposition (word) ;-------------------------------------------------- ; displays decimal number as in parameters (in text mode) ; leading zeroes are removed -; the range is (0000..9999 - two bytes) +; the range is (00000..65565 - two bytes) - ldy #3 ; there will be 4 digits + ldy #4 ; there will be 5 digits NextDigit ldx #16 ; 16-bit dividee so Rotate 16 times lda #$00 @@ -1243,39 +1287,31 @@ TooLittle000 dex dey bpl NextDigit ; Result again /10 and we have next digit - -rightnumber -; now cut leading zeroes (002 goes 2) - lda decimalresult - cmp zero - bne decimalend - lda space - sta decimalresult - - lda decimalresult+1 - cmp zero - bne decimalend - lda space - sta decimalresult+1 - - lda decimalresult+2 - cmp zero - bne DecimalEnd - lda space - sta decimalresult+2 - -DecimalEnd - ; displaying - ldy #3 +;rightnumber + ; displaying without leading zeroes (if zeroes exist then display space at this position) + ldy #0 + ldx #0 ; digit flag (cut leading zeroes) displayloop lda decimalresult,y + cpx #0 + bne noleading0 + cpy #4 + beq noleading0 ; if 00000 - last 0 must be + cmp zero + bne noleading0 + lda space + beq displaychar ; space = 0 ! +noleading0 + inx ; set flag (no leading zeroes to cut) +displaychar sta (displayposition),y - dey - bpl displayloop +nexdigit + iny + cpy #5 + bne displayloop rts .endp - ;-------------------------------------------------- .proc displaybyte ;decimal (byte), displayposition (word) ;-------------------------------------------------- @@ -1324,11 +1360,6 @@ displayloop1 rts .endp -;-------decimal constans -zero -digits dta d"0123456789" -nineplus dta d"9"+1 -space dta d" " ;-------------------------------------------------------- .proc Display4x4AboveTank ; @@ -1584,11 +1615,11 @@ EndOfTypeLine4x4 jsr GetKey cmp #$2b ; "Y" bne @+ - mva #1 escFlag + mva #$80 escFlag bne skip01 @ mva #0 escFlag - jsr WaitForKeyRelease skip01 + jsr WaitForKeyRelease ;clean mva #3 di @@ -1692,7 +1723,7 @@ quit_seppuku beq @+ ;unconditional jump, because TypeLine4x4 ends with beq GameOver4x4 - lda #song_game_over + lda #song_round_over jsr RmtSongSelect mwa #LineGameOver LineAddress4x4 mwa #((ScreenWidth/2)-(8*4)) LineXdraw @@ -1743,11 +1774,21 @@ ResultOfTheNextPlayer ;there are at least 2 players, so we can safely ;start displaying the result - ldx #0 lda #3 ;it means | - sta ResultLineBuffer,x + sta ResultLineBuffer + ldy TankNr + lda ResultsTable,y + sta decimal + mva #0 decimal+1 + mwa #(ResultLineBuffer+8) displayposition + jsr displaydec5 ;decimal (byte), displayposition (word) + ; overwrite the second digit of the points (max 255) + ;it means ":" + mva #26 ResultLineBuffer+9 + + ldx #0 lda TankNr asl asl ; times 8, because it is lengtgh @@ -1762,18 +1803,8 @@ TankNameCopyLoop iny cpx #8 ; end of name bne TankNameCopyLoop + ; last letter of tank name overwrites first digit of the points (max 255) - ldy TankNr - lda ResultsTable,y - sta decimal - mva #0 decimal+1 - mwa #(ResultLineBuffer+9) displayposition - jsr displaydec ;decimal (byte), displayposition (word) - - - ; overwrite the first digit of the points (max 255) - ;it means ":" - mva #26 ResultLineBuffer+9 ;just after the digits ;it means | @@ -1828,6 +1859,256 @@ FinishResultDisplay jmp TypeLine4x4 ; jsr:rts .endp +;-------------------------------------------------- +.proc GameOverScreen +;-------------------------------------------------- + jsr WaitForKeyRelease + jsr ClearScreen + jsr ClearPMmemory + jsr PrepareCredits + jsr GameOverResultsClear + mwa #GameOverDL dlptrs + lda #%00111110 ; normal screen width, DL on, P/M on + sta dmactls + lda #%00100100 ; playfield before P/M + sta gtictls + jsr SetPMWidth + jsr ColorsOfSprites + mva #0 colpf1s + sta CreditsVScrol + mva #TextForegroundColor colpf2s + VDLI DLIinterruptGameOver ; jsr SetDLI for Game Over screen + ; make text and color lines for each tank + ldx NumberOfPlayers ;we start from the highest (best) tank + dex ;and it is the last one + stx ResultOfTankNr ;in TankSequence table + ldy #0 ;witch line we are coloring +FinalResultOfTheNextPlayer + ldx ResultOfTankNr ;we are after a round, so we can use TankNr + lda TankSequence,x ;and we keep here real number if the tank + tax + stx TankNr ;for which we are displaying results + lda TankStatusColoursTable,x + sta GameOverColoursTable,y + ; Y - line number (from 0 to 5) + ; X - TanNr + ; let's make texts + phy + ; first calculate adres first byte of line + mwa #GameOverResults temp +@ dey + bmi LineAdresReady + adw temp #40 + jmp @- +LineAdresReady + ; put position of tank on the screen + pla + pha ; now we have line number in A register + ldy #1 + tax + lda zero+1,x + sta (temp),y +; puts name of the tank on the screen + ldy #$03 + lda TankNr + :3 asl ; 8 chars per name + tax +NextChar + lda tanksnames,x + sta (temp),y + inx + iny + cpy #$08+3 + bne NextChar + ; put big points on the screen + ldx TankNr + lda ResultsTable,x + sta decimal + mva #0 decimal+1 + adw temp #12 displayposition + jsr displaydec5 + mva #0 displayposition ; overwrite first digit + ; put hits points on the screen + ldx TankNr + lda DirectHitsL,x + sta decimal + lda DirectHitsH,x + sta decimal+1 + adw temp #19 displayposition + jsr displaydec5 + mva #0 displayposition ; overwrite first digit + ; put earned money on the screen + ldx TankNr + lda EarnedMoneyL,x + sta decimal + lda EarnedMoneyH,x + sta decimal+1 + adw temp #30 displayposition + jsr displaydec5 + ldy #35 + lda zero + sta (temp),y ; and last zero + ply + iny + dec ResultOfTankNr + jpl FinalResultOfTheNextPlayer +MakeBlackLines + cpy #$06 + beq AllLinesReady + lda #0 ; black line color for rest of tanks + sta GameOverColoursTable,y + iny + bne MakeBlackLines +AllLinesReady + ldx #(MaxPlayers-1) +MakeAllTanksVisible + lda #99 + sta eXistenZ,x + lda #0 + sta ActiveDefenceWeapon,x + dex + bpl MakeAllTanksVisible + jsr SetStandardBarrels + + ; start music and animations + lda #song_ending_looped + jsr RmtSongSelect + ; initial tank positions randomization + ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 +@ + jsr RandomizeTankPos + dex + bpl @- +MainTanksFloatingLoop + ; main tanks floating loop + ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 +AllTanksFloatingDown + stx TankNr + lda Ytankstable,x + cmp #72 ; tank under screen - no erase + bcs NoEraseTank + mva #1 Erase + jsr DrawTankNr + mva #0 Erase + sta ATRACT ; reset atract mode +NoEraseTank + ldx TankNr + inc Ytankstable,x + lda ActiveDefenceWeapon,x + beq NotFastTank + :3 inc Ytankstable,x +NotFastTank + lda Ytankstable,x +; cmp #32 ; tank over screen - not visible + cmp #80 ; tank under screen - new tank randomize + bcs TankUnderScreen + cmp #72 ; tank under screen but.... parachute + bcs DrawOnlyParachute + bcc TankOnScreen +TankUnderScreen + jsr RandomizeTankPos +TankOnScreen + jsr DrawTankNr +DrawOnlyParachute + lda ActiveDefenceWeapon,x + bne FastTank + jsr DrawTankParachute +FastTank +; ldx TankNr + dex + bpl AllTanksFloatingDown + jsr IsKeyPressed + bne MainTanksFloatingLoop ; neverending loop + mva #0 dmactls ; dark screen + jsr WaitOneFrame + jsr GameOverResultsClear + rts +RandomizeTankPos + randomize 10 32 ; 10 not 8 - barrel !! :) + sta Ytankstable,x + randomize 0 180 + sta AngleTable,x + randomize 0 (49-8) + and #%11111110 ; correction for PMG + clc + adc XtankOffsetGO_L,x + sta XtankstableL,x + lda XtankOffsetGO_H,x + adc #0 + sta XtankstableH,x + lda random + cmp #32 ; like 1:8 + bcc NowFastTank + lda #0 + sta ActiveDefenceWeapon,x + rts +NowFastTank + lda #1 + sta ActiveDefenceWeapon,x + rts +GameOverResultsClear + lda #$00 + tax +@ sta GameOverResults,x + inx + cpx #(6*40)+1 + bne @- + rts +PrepareCredits + ; Rewrites credits and places it in the middle of each line. + mwa #CreditsStart temp ; from + mwa #Credits temp2 ; to +MainRewriteLoop + ldy #0 + cpw temp #CreditsEnd + beq EndOfCredits + ; count characters in this line +@ lda (temp),y + bmi LastCharFound + iny + bne @- +LastCharFound + ; in Y number of characters reduced by 1 + ; let's count how many spaces add before the text + sec + sty magic + lda #40 + sbc magic + lsr ; now in A we have number of spaces in front + sta magic + ldy #0 + tya + tax +FirstSpaces + sta (temp2),y ; fill the area in front of the text with spaces + iny + cpy magic + bne FirstSpaces +MainText + lda (temp,x) + sta (temp2),y ; rewrite the text to a new place + bmi LastCharWritten + inw temp + iny + bne MainText +LastCharWritten + inw temp + and #%01111111 ; remove inverse + sta (temp2),y + iny + txa ; space to A (0) +LastSpaces + sta (temp2),y ; fill the area behind the text with spaces + iny + cpy #40 + bne LastSpaces +NextLine + adw temp2 #40 + jmp MainRewriteLoop +EndOfCredits + mwa #Credits DLCreditsAddr ; set address in DL to first line + rts +.endp ;------------------------------------------------- .proc DisplayStatus ;------------------------------------------------- @@ -1878,17 +2159,17 @@ FinishResultDisplay ;--------------------- ;displaying name of the defence weapon (if active) ;--------------------- - lda #$08 ; ( - sta textbuffer+80+22 - lda #$09 ; ) - sta textbuffer+80+39 - lda ActiveDefenceWeapon,x - bne ActiveDefence - ; clear brackets - lda #$00 ; space - sta textbuffer+80+22 - sta textbuffer+80+39 - lda #47 ; no weapon name + lda #$08 ; ( + sta textbuffer+80+22 + lda #$09 ; ) + sta textbuffer+80+39 + lda ActiveDefenceWeapon,x + bne ActiveDefence + ; clear brackets + lda #$00 ; space + sta textbuffer+80+22 + sta textbuffer+80+39 + lda #47 ; no weapon name ActiveDefence sta temp ;get back number of the weapon mva #0 temp+1 @@ -1921,26 +2202,26 @@ ActiveDefence ;--------------------- ;displaying the energy of a tank shield (if exist) ;--------------------- - ; clear (if no shield) - lda #$00 ; space - sta textbuffer+40+10 - sta textbuffer+40+11 - sta textbuffer+40+12 - sta textbuffer+40+13 - ; check shield energy and display it - ldx TankNr - lda ActiveDefenceWeapon,x - beq NoDefenceWeapon - lda ShieldEnergy,x - beq NoShieldEnergy - sta decimal ; displayed value - lda #$08 ; ( - sta textbuffer+40+10 - mwa #textbuffer+40+11 displayposition + ; clear (if no shield) + lda #$00 ; space + sta textbuffer+40+10 + sta textbuffer+40+11 + sta textbuffer+40+12 + sta textbuffer+40+13 + ; check shield energy and display it + ldx TankNr + lda ActiveDefenceWeapon,x + beq NoDefenceWeapon + lda ShieldEnergy,x + beq NoShieldEnergy + sta decimal ; displayed value + lda #$08 ; ( + sta textbuffer+40+10 + mwa #textbuffer+40+11 displayposition jsr displaybyte - lda #$09 ; ) - sta textbuffer+40+13 -NoDefenceWeapon + lda #$09 ; ) + sta textbuffer+40+13 +NoDefenceWeapon NoShieldEnergy ;========================= @@ -1989,8 +2270,8 @@ DisplayWindValue sta decimal lda ForceTableH,x sta decimal+1 - mwa #textbuffer+40+36 displayposition - jsr displaydec + mwa #textbuffer+40+35 displayposition + jsr displaydec5 ;========================= ;display Angle @@ -1998,30 +2279,30 @@ DisplayWindValue displayAngle ldx TankNr lda AngleTable,x - cmp #90 - beq VerticallyUp - bcs AngleToLeft + cmp #90 + beq VerticallyUp + bcs AngleToLeft AngleToRight - ; now we have values from 0 to 89 and right angle + ; now we have values from 0 to 89 and right angle sta decimal lda #$7f ; (tab) character sta textbuffer+40+25 lda #0 ;space sta textbuffer+40+22 - beq AngleDisplay + beq AngleDisplay AngleToLeft - sec - lda #180 - sbc AngleTable,x - ; angles 180 - 91 converted to 0 - 89 - sta decimal + sec + lda #180 + sbc AngleTable,x + ; angles 180 - 91 converted to 0 - 89 + sta decimal lda #$7e ;(del) char sta textbuffer+40+22 lda #0 ;space sta textbuffer+40+25 - beq AngleDisplay + beq AngleDisplay VerticallyUp - ; now we have value 90 + ; now we have value 90 sta decimal lda #0 ;space sta textbuffer+40+25 @@ -2030,7 +2311,7 @@ VerticallyUp AngleDisplay mwa #textbuffer+40+23 displayposition jsr displaybyte - + ldx TankNr rts .endp ;------------------------------------------------- diff --git a/variables.asm b/variables.asm index 8e89e01..4e367e8 100644 --- a/variables.asm +++ b/variables.asm @@ -8,21 +8,29 @@ ; compilation to e.g. cartridge ; zero page variables are declared in program.s65 module ;===================================================== -TanksNames ; DO NOT ZERO - ticket #24 +OneTimeZeroVariables +OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 128 bytes ! +noMusic .by 0 ; 0 - play music, $ff - do not play music +noSfx .by 0 ; 0 - play SFX, $ff - do not play SFX +;---------------------------------------------------- +; Color table for Game Over Screen (created in a gameover routine) + .by $00 ; labels line color +GameOverColoursTable .BYTE $80,$40,$c4,$20,$c0,$e4 +;---------------------------------------------------- +TanksNames ; DO NOT ZERO ON RESTART GAME - ticket #24 :6 dta d" " ;---------------------------------------------------- -;Options DO NOT ZERO - ticket #27 +skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) + .DS [MaxPlayers] +;---------------------------------------------------- +variablesToInitialize +;Options DO NOT ZERO ON RESTART GAME - ticket #27 OptionsTable .by 0,1,2,2,0,1,3,2 RoundsInTheGame .by 10 ;how many rounds in the current game seppukuVal .by 75 mountainDeltaH .by 3 mountainDeltaL .by $ff ;---------------------------------------------------- -skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) - .DS [MaxPlayers] -;---------------------------------------------------- -noMusic .by 0 ; 0 - play music, $ff - do not play music -noSfx .by 0 ; 0 - play SFX, $ff - do not play SFX ; 4x4 text buffer ResultLineBuffer dta d" ", $ff @@ -38,8 +46,6 @@ isInventory .ds 1 ; 0 - purchase, $ff - inventory ;-------------- drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) ;-------------- -sfx_effect .ds 1 -;-------------- noDeathCounter .ds 1 ;-------------- OptionsY .ds 1 ;vertical position of cursor on Options screen @@ -84,6 +90,14 @@ ResultsTable ;the results in the gameeeeee .DS [MaxPlayers] TempResults .DS [MaxPlayers] +DirectHitsH + .DS [MaxPlayers] +DirectHitsL + .DS [MaxPlayers] +EarnedMoneyH + .DS [MaxPlayers] +EarnedMoneyL + .DS [MaxPlayers] ;---------------------------------------------------- ForceTableL ;shooting Force of the tank during the round .DS [MaxPlayers] @@ -95,12 +109,8 @@ MaxForceTableL ;Energy of the tank during the round MaxForceTableH .DS [MaxPlayers] ;---------------------------------------------------- - -AngleTable ;Angle of the barrel of each tank during the round +BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round start! .DS [MaxPlayers] -NewAngle .DS 1 -;---------------------------------------------------- - ActiveWeapon ;number of the selected weapon .DS [MaxPlayers] ActiveDefenceWeapon ;number of the activated defence weapon - 0 @@ -135,6 +145,9 @@ ytankstable ;Y positions of tanks (lower left point) LowResDistances ; coarse tank positions divided by 4 (to be in just one byte) .DS [MaxPlayers] ;---------------------------------------------------- +TargetTankNr ; Target tank index (for AI routines) + .DS 1 +;---------------------------------------------------- Erase .DS 1 ; if 1 only mask of the character is printed ; on the graphics screen. if 0 character is printed normally @@ -286,7 +299,7 @@ DifficultyLevel ; Difficulty Level (human/cpu) ;---------------------------------------------------- ;displaydecimal decimal .DS 2 -decimalresult .DS 4 +decimalresult .DS 5 ;xmissile ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte @@ -339,11 +352,22 @@ TankTempY ;---------------------------------------------------- singleRoundVars ;-------------- -escFlag .ds 1 +escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed ;-------------- CurrentResult .DS 1 -;-------------- +;-------------- +AngleTable ;Angle of the barrel of each tank during the round + .DS [MaxPlayers] +NewAngle ; used in AI + .DS 1 +;previousBarrelAngle +; .DS [MaxPlayers] +EndOfTheBarrelX + .ds 2 +EndOfTheBarrelY + .ds 1 +;---------------------------------------------------- previousAngle .DS [MaxPlayers] previousEnergyL @@ -352,8 +376,6 @@ previousLeftRange .DS [MaxPlayers] previousEnergyH .DS [MaxPlayers] -previousRightAngle - .DS [MaxPlayers] RandBoundaryLow .ds 2 RandBoundaryHigh diff --git a/weapons.asm b/weapons.asm index ea44c7b..a04e04c 100644 --- a/weapons.asm +++ b/weapons.asm @@ -283,6 +283,7 @@ NoLowerCircle .endp ; ------------------------ .proc napalm + mva #sfx_napalm sfx_effect inc FallDown2 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) jsr CalculateExplosionRange @@ -291,6 +292,7 @@ NoLowerCircle .endp ; ------------------------ .proc hotnapalm + mva #sfx_napalm sfx_effect inc FallDown2 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) jsr CalculateExplosionRange @@ -331,10 +333,10 @@ RepeatFlame ; internal loop (draw flames) lda random and #%00000110 clc - adc #$46 + adc #char_flame___________ bne PutFlameChar LastNapalmRepeat - lda #$4e ; clear flame symbol + lda #char_clear_flame_____ ; clear flame symbol PutFlameChar sta CharCode ; check coordinates @@ -569,7 +571,7 @@ DiggerCharacter lda random and #$06 clc - adc #$36 + adc #char_digger__________ adc sandhogflag sta CharCode cpw xdraw #(screenwidth-6) @@ -579,7 +581,7 @@ DiggerCharacter ; ------------------------ .proc babysandhog mva #sfx_sandhog sfx_effect - mva #8 sandhogflag + mva #char_sandhog_offset sandhogflag inc FallDown2 mva #13 DigLong mva #1 diggery ; how many branches (-1) @@ -588,7 +590,7 @@ DiggerCharacter ; ------------------------ .proc sandhog mva #sfx_sandhog sfx_effect - mva #8 sandhogflag + mva #char_sandhog_offset sandhogflag inc FallDown2 mva #13 DigLong mva #3 diggery ; how many branches (-1) @@ -597,7 +599,7 @@ DiggerCharacter ; ------------------------ .proc heavysandhog mva #sfx_sandhog sfx_effect - mva #8 sandhogflag + mva #char_sandhog_offset sandhogflag inc FallDown2 mva #13 DigLong mva #5 diggery ; how many branches (-1) @@ -661,20 +663,25 @@ DiggerCharacter ldx TankNr lda AngleTable,x tay - clc - lda xtankstableL,x - adc EndOfTheBarrelX,y ; correction of the end of the barrel point (X) - sta xbyte - lda xtankstableH,x - adc #0 - sta xbyte+1 - sec - lda ytankstable,x - sbc EndOfTheBarrelY,y ; correction of the end of the barrel point (Y) - sta ybyte - lda #$00 - sbc #$00 - sta ybyte+1 + + mwa EndOfTheBarrelX xbyte + mva EndOfTheBarrelY ybyte + mva #0 ybyte+1 + + ;clc + ;lda xtankstableL,x + ;adc EndOfTheBarrelX,y ; correction of the end of the barrel point (X) + ;sta xbyte + ;lda xtankstableH,x + ;adc #0 + ;sta xbyte+1 + ;sec + ;lda ytankstable,x + ;sbc EndOfTheBarrelY,y ; correction of the end of the barrel point (Y) + ;sta ybyte + ;lda #$00 + ;sbc #$00 + ;sta ybyte+1 mwa xdraw LaserCoordinate mwa ydraw LaserCoordinate+2 @@ -759,10 +766,10 @@ ExplosionLoop2 ;calculation ldx NumberOfPlayers + dex DistanceCheckLoop - dex lda eXistenZ,x - beq EndOfDistanceCheckLoop + jeq EndOfDistanceCheckLoop ;here the tank exist lda XtankstableL,x clc @@ -803,7 +810,7 @@ DistanceCheckLoop beq UseShieldWithEnergy cmp #ind_Heavy_Shield___ ; shield with energy beq UseShieldWithEnergy - cmp #ind_Auto_Defense___ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc) + cmp #ind_Bouncy_Castle__ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc) beq UseShieldWithEnergy cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc) beq UseShieldWithEnergy @@ -820,14 +827,21 @@ ShieldCoveredTank ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) UseShield mva #1 Erase - phx - jsr DrawTankShield - plx - mva #0 ActiveDefenceWeapon,x ; deactivate defense weapons + lda TankNr + pha ; store TankNr + stx TankNr ; store X in TankNr :) + jsr DrawTankNr ; now erase tank with shield (to erase shield) + lda #0 + sta ActiveDefenceWeapon,x ; deactivate defense weapons + sta Erase + jsr DrawTankNr ; draw tank without shield + ldx TankNr ; restore X value :) + pla + sta TankNr ; restore TankNr value :) TankIsNotWithinTheRange EndOfDistanceCheckLoop - txa - jne DistanceCheckLoop + dex + jpl DistanceCheckLoop mva #sfx_silencer sfx_effect rts .endp @@ -881,8 +895,8 @@ Rollin sta HeightRol ; relative point RollinContinues - wait - wait + jsr WaitOneFrame + jsr WaitOneFrame ; new point is set adw xdraw #mountaintable tempXROLLER ldy #0 @@ -1019,7 +1033,7 @@ NoColor ; jump here with color=0 to clean dirt ; current dirt width sta magic NextRow - wait + jsr WaitOneFrame ldy magic NextLine lda random @@ -1134,6 +1148,7 @@ ToHighFill ;first, get current parameters (angle+force) ;for an active tank and display them ;(these values are taken from the previous round) + mva #0 Erase ldx TankNr @@ -1155,7 +1170,7 @@ ContinueToCheckMaxForce2 jsr DrawTankNr - wait ; best after drawing a tank + jsr WaitOneFrame ; best after drawing a tank @@ -1176,11 +1191,20 @@ notpressed lda kbcode and #%10111111 ; SHIFT elimination + cmp #$08 ; O + bne @+ + jsr AreYouSure + bit escFlag + bpl notpressed + ;---O pressed-quit game to game over screen--- + mva #$40 escFlag + rts +@ cmp #28 ; ESC bne @+ jsr AreYouSure - lda escFlag - beq notpressed + bit escFlag + bpl notpressed ;---esc pressed-quit game--- rts @@ -1195,9 +1219,14 @@ callInventory ; mva #$ff isInventory jsr Purchase + mva #0 dmactls ; dark screen + jsr WaitOneFrame + lda #song_ingame + jsr RmtSongSelect mva #0 escFlag jsr DisplayStatus jsr SetMainScreen + jsr WaitOneFrame jsr DrawTanks jsr WaitForKeyRelease jmp BeforeFire @@ -1325,61 +1354,69 @@ CTRLPressedDown jmp BeforeFire pressedRight + ldx TankNr lda pressTimer spl:mva #0 pressTimer ; if >128 then reset to 0 cmp #25 ; 1/2s bcs CTRLPressedRight mva #sfx_set_power_2 sfx_effect - ldx TankNr + mva #1 Erase + jsr DrawTankNr.BarrelChange dec AngleTable,x lda AngleTable,x cmp #255 ; -1 jne BeforeFire - lda #180 + lda #179 sta AngleTable,x jmp BeforeFire CTRLPressedRight - mva #sfx_set_power_2 sfx_effect ldx TankNr + mva #sfx_set_power_2 sfx_effect + mva #1 Erase + jsr DrawTankNr.BarrelChange lda AngleTable,x sec sbc #4 sta AngleTable,x - cmp #4 ; smalles angle for speed rotating + cmp #4 ; smallest angle for speed rotating jcs BeforeFire - lda #180 + lda #179 sta AngleTable,x jmp BeforeFire pressedLeft + ldx TankNr lda pressTimer spl:mva #0 pressTimer ; if >128 then reset to 0 cmp #25 ; 1/2s bcs CTRLPressedLeft mva #sfx_set_power_2 sfx_effect - ldx TankNr + mva #1 Erase + jsr DrawTankNr.BarrelChange INC AngleTable,x lda AngleTable,x - cmp #181 + cmp #180 jne BeforeFire - lda #0 + lda #1 sta AngleTable,x jmp BeforeFire CTRLPressedLeft - mva #sfx_set_power_2 sfx_effect ldx TankNr + mva #sfx_set_power_2 sfx_effect + mva #1 Erase + jsr DrawTankNr.BarrelChange lda AngleTable,x clc adc #4 sta AngleTable,x - cmp #181-4 + cmp #180-4 jcc BeforeFire - lda #0 + lda #1 sta AngleTable,x jmp BeforeFire @@ -1484,38 +1521,26 @@ NotStrongShoot sta Force+1 mva #sfx_shoot sfx_effect AfterStrongShoot - lda #$0 - sta Force+2 lda AngleTable,x sta Angle - lda #0 - sta xtraj - sta ytraj - ; Shoots tank nr X !!! :) ; set the starting coordinates of bullet with correction ; to start where the tank's barrel ends ; (without it bullet would go from the left lower corner of the tank) ;ldx TankNr - ldy Angle - clc - lda xtankstableL,x - adc EndOfTheBarrelX,y ; correction of X - sta xtraj+1 - lda xtankstableH,x - adc #$00 - sta xtraj+2 - sec - lda ytankstable,x - sbc EndOfTheBarrelY,y ; correction of Y - sta ytraj+1 - lda #$00 - sbc #$00 - sta ytraj+2 + + mwa EndOfTheBarrelX xtraj+1 + mva EndOfTheBarrely ytraj+1 + lda #0 + sta Force+2 + sta ytraj+2 + sta xtraj + sta ytraj + sta TestFlightFlag ; checking if the shot is underground (no Flight but Hit :) ) - ldy #0 + tay ; A=0 ! adw xtraj+1 #mountaintable temp lda ytraj+1 cmp (temp),y ; check collision witch mountains @@ -1533,6 +1558,7 @@ ShotUnderGround ;-------------------------------------------------- .proc Flight ; Force(byte.byte), Wind(0.word) ; Angle(byte) 128=0, 255=maxright, 0=maxleft +; if TestFlightFlag is set ($ff) ne real flight - hit test only (for AI) ;-------------------------------------------------- ;g=-0.1 ;vx=Force*cos(Angle) @@ -1764,6 +1790,8 @@ NoWind mwa xtraj+1 XtrajOld+1 mwa ytraj+1 YtrajOld+1 + bit TestFlightFlag + bmi nowait lda tracerflag bne nowait lda color @@ -1802,7 +1830,9 @@ SkipCollisionCheck mwa xtraj+1 xdraw mwa ytraj+1 ydraw - + + bit TestFlightFlag + bmi NoUnPlot lda tracerflag bne NoUnPlot @@ -1815,7 +1845,8 @@ NoUnPlot Hit mwa XHit xdraw mwa YHit ydraw - + bit TestFlightFlag + bmi EndOfFlight jsr unPlot EndOfFlight mwa xdraw xcircle ; we must store for a little while @@ -1834,18 +1865,31 @@ EndOfFlight EndOfFlight2 mva #0 tracerflag ; don't know why + bit TestFlightFlag + jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check ; and now check for defensive-aggressive weapon lda HitFlag jeq NoHitAtEndOfFight ; RTS only !!! jmi NoTankHitAtEndOfFight + ; tank hit - increase direct hits points + ldx TankNr + inx + cpx HitFlag ; we don't count suicides :) + beq @+ + dex + inc DirectHitsL,x + bne @+ + inc DirectHitsH,x +@ ; tank hit - check defensive weapon of this tank tax dex ; index of tank in X lda ActiveDefenceWeapon,x - cmp #ind_Auto_Defense___ ; Auto Defence - beq AutoDefence + cmp #ind_Bouncy_Castle__ ; Auto Defence + jeq BouncyCastle cmp #ind_Mag_Deflector__ ; Mag Deflector - bne NoDefence + beq MagDeflector + jmp NoDefence MagDeflector ; now run defensive-aggressive weapon - Mag Deflector! ; get tank position @@ -1872,28 +1916,47 @@ RightDeflection bcs EndOfMagDeflector ; hit of course but we need RTS sbw XHit #36 ; change to left EndOfMagDeflector + mva #1 Erase + lda TankNr + pha ; store TankNr + stx TankNr ; store X in TankNr :) + jsr DrawTankNr ; now erase tank with shield (to erase shield) + lda #0 + sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon + sta ShieldEnergy,x + sta Erase + jsr DrawTankNr ; draw tank without shield + ldx TankNr ; restore X value :) + pla + sta TankNr ; restore TankNr value :) mwa XHit xdraw ; why? !!! NoTankHitAtEndOfFight NoHitAtEndOfFight NoDefence + lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 rts ; END !!! -AutoDefence - ; now run defensive-aggressive weapon - Auto Defence! +BouncyCastle + mva #sfx_shield_on sfx_effect + ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)! sbb #180 LeapFrogAngle Angle ; swap angle (LeapFrogAngle - because we have strored angle in this variable) - lsrw Force ; Force = Force / 2 - becouse earlier we multiplied by 2 - mva #1 Erase ; now erase shield - phx - jsr DrawTankShield - jsr DrawTankShieldHorns - plx - lda #$00 - sta Erase - sta ActiveDefenceWeapon,x ; deactivate used Auto Defence + lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 + mva #1 Erase + lda TankNr + pha ; store TankNr + stx TankNr ; store X in TankNr :) + jsr DrawTankNr ; now erase tank with shield (to erase shield) + lda #0 + sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon sta ShieldEnergy,x sta xtraj ; prepare coordinates sta ytraj sta xtraj+2 sta ytraj+2 + sta Erase + jsr DrawTankNr ; draw tank without shield + ldx TankNr ; restore X value :) + pla + sta TankNr ; restore TankNr value :) mwa XHit xtraj+1 sbw YHit #5 ytraj+1 mva #1 color @@ -1918,30 +1981,25 @@ AutoDefence sta xtraj sta ytraj - lda xtankstableL,x - sta xtraj+1 - lda xtankstableH,x - sta xtraj+2 - lda ytankstable,x - sta ytraj+1 - lda #$00 - sta ytraj+2 + mwa EndOfTheBarrelX xbyte + mva EndOfTheBarrelY ybyte + mva #0 ybyte+1 - ldy Angle - clc - lda xtraj+1 - adc EndOfTheBarrelX,y ; correction of X - sta xtraj+1 - lda xtraj+2 - adc #0 - sta xtraj+2 - sec - lda ytraj+1 - sbc EndOfTheBarrelY,y ; correction of Y - sta ytraj+1 - lda ytraj+2 - sbc #0 - sta ytraj+2 +; ldy Angle +; clc +; lda xtraj+1 +; adc EndOfTheBarrelX,y ; correction of X +; sta xtraj+1 +; lda xtraj+2 +; adc #0 +; sta xtraj+2 +; sec +; lda ytraj+1 +; sbc EndOfTheBarrelY,y ; correction of Y +; sta ytraj+1 +; lda ytraj+2 +; sbc #0 +; sta ytraj+2 ldy #100 ; ??? mva #1 tracerflag ; I do not know (I mean I think I know ;) ) @@ -2285,7 +2343,8 @@ MIRValreadyAll jsr FlashTank ; first we flash tank mva #1 Erase jsr DrawTankNr ; and erase tank - mva #0 Erase + lda #0 + sta Erase ldx TankNr sta Energy,x ; clear tank energy sta eXistenZ,x ; erase from existence @@ -2318,7 +2377,7 @@ NextLine1 dex bpl NextLine1 ; - wait ; wait uses A and Y + jsr WaitOneFrame ; wait uses A only ; second loop - inverse again and put random "snow" to column of bytes ldx #120 ldy magic @@ -2374,7 +2433,8 @@ InverseScreenByte ; XHit , YHit - coordinates of hit ; X - index of the hit tank - ldx #0 + ldx NumberOfPlayers + dex CheckCollisionWithTankLoop lda eXistenZ,x beq DeadTank @@ -2420,9 +2480,8 @@ LeftFromTheTank OverTheTank BelowTheTank DeadTank - inx - cpx NumberOfPlayers - bne CheckCollisionWithTankLoop + dex + bpl CheckCollisionWithTankLoop rts CheckCollisionWithShieldedTank ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield)