Compare commits

..

90 Commits

Author SHA1 Message Date
Pirx d474ba7af8 README updt 2022-08-13 17:47:49 -04:00
Pirx 802b67673b Merge pull request #116 from pkali/developXL
Develop xl
2022-08-13 17:34:35 -04:00
Pecusx 5070b11be3 Battery lottery 2022-08-12 22:34:56 +02:00
Pirx 0d210b8d88 basic off 2022-08-12 10:59:15 -04:00
Pirx 171f37c73f intro colors fix 2022-08-12 09:52:51 -04:00
Pecusx cee53fd257 Now splash screen works on classic Atari 800 :) 2022-08-12 15:23:23 +02:00
Pecusx 224588eaa9 Manual PL fix :) 2022-08-12 13:49:25 +02:00
Pecusx 4cd864e47e Polish manual update 2022-08-12 13:44:05 +02:00
Pecusx 710570ae8a Press O to Game Over and small bugfix 2022-08-12 13:40:04 +02:00
Pirx 2820f66467 credits updt 2022-08-11 22:28:23 -04:00
Pecusx c84aecc886 Polish instruction 2022-08-11 22:52:16 +02:00
Pecusx 25ed106e02 Financial bonus for the winner 2022-08-11 21:23:34 +02:00
Pecusx bc65dafdac Long Schlong new price and SFX and minor fix 2022-08-11 18:21:45 +02:00
Pirx fd15ed9bb6 correct song during gameplay and version 1.00 2022-08-11 10:57:30 -04:00
Pirx 028c34bf31 cleanup 2022-08-11 10:43:45 -04:00
Pirx 3b0388fdaf Scorch50 splash 2022-08-11 10:15:38 -04:00
Pecusx 9d14950ef9 AI selected weapons on statusbar 2022-08-11 14:31:33 +02:00
Pecusx a205c37dc0 Atract and next player SFX fix 2022-08-11 11:10:23 +02:00
Pecusx 950d6922b4 New funky defensive weapon - Long Barrel 2022-08-11 10:46:23 +02:00
Pirx 22785ecdd5 kolorki Adama, 2022-07-21 2022-08-11 01:20:45 -04:00
Pirx 268d99ffaf Boucy Castle sfx 2022-08-11 00:54:00 -04:00
Pirx bb826b680d Auto Defense -> Bouncy Castle 2022-08-11 00:34:21 -04:00
Pecusx f45d2c8446 Better SFX, music for purchase and Credits fix 2022-08-10 20:52:26 +02:00
Pecusx 1f576a0c49 Preventing compilation of unused procedures. 2022-08-10 19:58:07 +02:00
Pecusx 054c5df5d7 New music file and Song change fixed! 2022-08-10 18:39:37 +02:00
Pecusx 1b4a73c362 RMT Player bug fix !!! 2022-08-10 13:30:30 +02:00
Pecusx f807fe8876 WaitOneFrame fixed 2022-08-10 00:56:56 +02:00
Pecusx f14b64a7f6 SFX audio channel corrected 2022-08-09 23:40:56 +02:00
Pecusx e45cc3e609 Preventing double RTM calls - but still hangs 2022-08-09 23:28:46 +02:00
Pecusx 192b1b01dc New old RMT player and bugfix 2022-08-09 22:32:16 +02:00
Pecusx 664dc1568d Variables initialization on strart 2022-08-09 13:30:21 +02:00
Pecusx 234fbc5a4a Tanks and mountains on Oprions screen but RMT still hangs 2022-08-09 10:10:44 +02:00
Pecusx 2f57c1f774 Game Over and Credits - but RTM problems 2022-08-08 21:18:47 +02:00
Pecusx 2d274b05d0 Clear variables optimisation and better text screen init 2022-08-07 16:01:09 +02:00
Pecusx 5b90bc571e Purchase AI uses bit tables instead bytes 2022-08-07 13:50:38 +02:00
Pirx c1b16cd1d1 missing MSX file added 2022-08-07 07:47:37 -04:00
Pirx cf08093cee FEAT update 2022-08-06 16:31:51 -04:00
Pirx e6d37e8410 song 0h1 2022-08-06 16:24:18 -04:00
Pirx 56ed83fbac PAUSE ellimintation 2022-08-06 16:16:47 -04:00
Pirx 2cda0bfb12 music v0g 2022-08-06 14:06:09 -04:00
Pirx e5ce864254 new song, VBL fix 2022-08-06 01:03:01 -04:00
Pirx 312bca4866 shorter ClearScreen 2022-08-05 23:56:27 -04:00
Pecusx 2bec64c38e Macro "wait" as procedure. 2022-08-05 17:13:13 +02:00
Pecusx d448eb2e1e Better? AI purchases and new WAIT macro 2022-08-05 12:04:14 +02:00
Pecusx 05409fa301 Diferent Cyborg purchase strategy 2022-08-05 10:12:44 +02:00
Pecusx e60776fd57 New optimized DisplayDec5 proc 2022-08-03 18:13:07 +02:00
Pecusx eed446545e 5 digits decimal display added 2022-08-03 15:00:07 +02:00
Pecusx 54cc76464e DirectHits and EarnedMoney counters added (for summary) 2022-08-03 14:36:03 +02:00
Pecusx 3ac678e68b Game Over screen exit 2022-08-03 00:17:11 +02:00
Pecusx 823be97490 Tank names and points on Game Over screen 2022-08-02 20:52:22 +02:00
Pecusx 8775e0b42e Colored lines on Game Over screen 2022-08-02 19:49:51 +02:00
Pecusx cd41f59175 Better set PM width (prepare to new Game Over screen) 2022-08-02 14:40:12 +02:00
Pecusx 91d5172fe2 To high parachute bug fixed! 2022-08-02 11:20:51 +02:00
Pecusx 3a836fa072 Better aiming (lower tank position - more force) 2022-08-01 23:26:06 +02:00
Pecusx 84da6fb7a0 Cyborg aiming fix 2022-08-01 23:12:48 +02:00
Pecusx 9eb0f8adff Faster AI (and fixed)
Correcion for barrel wider tjan tank (2 pixels)
2022-08-01 21:54:41 +02:00
Pecusx 2f1f016ce0 Fix for Blue Zombie tank :) 2022-08-01 10:12:23 +02:00
Pecusx 8e0aa974e7 Small loop ptimisation 2022-07-31 23:56:47 +02:00
Pecusx 6a0c3a91e9 AI optimisations 2022-07-31 22:49:34 +02:00
Pecusx 025afbce91 MagDeflector disappears properly 2022-07-31 21:29:03 +02:00
Pecusx edbfddf090 MagDeflector is working properly
And an attempt to repair the blue zombie tank.
2022-07-31 20:34:44 +02:00
Pecusx d7501b5c7c All AI tanks works but... 2022-07-31 18:35:51 +02:00
Pecusx 1945dd5e88 AI optimisations 2022-07-31 16:44:18 +02:00
Pecusx c725fd3827 New Cyborg AI 2022-07-31 16:14:01 +02:00
Pecusx c8ffba4603 AI internals 2022-07-29 13:27:59 +02:00
Pecusx 16f24793f6 Small memory optimisations 2022-07-28 22:08:43 +02:00
Pecusx f9fc25ec0f Preparing for better AI (invisible shot) 2022-07-28 21:38:38 +02:00
Pecusx 4d090f1766 All 3 tank shapes visible 2022-07-28 17:54:38 +02:00
Pecusx 9df4a49abe 3 tank shapes 2022-07-28 17:42:49 +02:00
Pecusx 0a68184f7c New (smaller) 8x8 font file and optimisations.
Second tank shape added.
2022-07-28 09:53:01 +02:00
Pecusx 807da90fda AI ​​uses White Flag 2022-07-27 22:40:53 +02:00
Pecusx 3855b0e2cf Robotanks barrel angle sound 2022-07-27 21:46:35 +02:00
Pecusx a01af2a608 New (drawto) barrels finished 2022-07-27 20:55:14 +02:00
Pecusx 47dcfa1af4 Final Shields fix
Now shields are draw ONLY in DrawTankNr proc.
2022-07-27 18:01:33 +02:00
Pecusx 02ff63d524 Game Over animation fix 2022-07-27 14:00:34 +02:00
Pecusx 9b42e79b61 Shields fix 2022-07-27 13:44:20 +02:00
Pecusx 2c3b4d148e Barrels optimisation and more 2022-07-27 13:03:10 +02:00
Pirx 513f13c5fc broken inventory rollback 2022-07-25 09:50:49 -04:00
Pirx 27bc443581 WIP: broken inventory 2022-07-25 00:50:16 -04:00
Pirx 992130f267 WIP: barrels anew 2022-07-24 09:19:03 -04:00
Pirx 1de19dfd26 WIP: drawto barrels 2022-07-23 15:42:22 -04:00
Pirx 960675d4ac WIP: drawto barrels 2022-07-23 15:20:19 -04:00
Pirx dc9e2de8df WIP: drawto barrels 2022-07-23 15:14:47 -04:00
Pirx a7e1bd519e WIP: drawto barrels 2022-07-23 15:14:00 -04:00
Pecusx 616452a01e Texts and more colours on Game Over screen 2022-07-19 10:37:09 +02:00
Pirx f20ce14dc3 moving GameoverDL to stop shaking 2022-07-18 23:51:05 -04:00
Pecusx d9012f4485 Good Game Over animation 2022-07-18 16:37:56 +02:00
Pecusx 5c38b7b12a Game Over animation - still not good. 2022-07-18 13:47:57 +02:00
Pirx 6cb817d463 sprites down the memory lane 2022-07-18 07:02:09 -04:00
Pecusx 19200be905 Game Over "animation" - TEST ONLY! 2022-07-18 12:44:33 +02:00
38 changed files with 3329 additions and 1499 deletions
+2
View File
@@ -1,2 +1,4 @@
*.bak *.bak
scorch.lab
scorch.lst
+28
View File
@@ -48,6 +48,34 @@ With the advent of fujinet (https://fujinet.online/) we are thinking about makin
## Changes: ## Changes:
###### Version 1.00
2022-08-13
Silly Version 1.00
This is an official Silly Venture Summer Edition Atari 50 release. The game reached version 1.00.
The game manual is available at https://github.com/pkali/scorch_src/wiki
All 48KB+ 8-bit Atari computers are supported.
Thank you @Pecusx and @Miker for your hard work over the last few weeks - I was almost entirely absent because of the real-world attack.
Most important changes:
* New Game Over screen with a summary of wins, direct hits and earned cash. https://github.com/pkali/scorch_src/issues/9
* Tank barrels are drawn procedurally to make aiming easier..
* Various SFX and music updates with new tunes for all parts of the game. https://github.com/pkali/scorch_src/issues/112
* AI can use White Flag.
* 3 different tank shapes https://github.com/pkali/scorch_src/issues/64.
* All AI levels are programmed. Cyborg is tough! https://github.com/pkali/scorch_src/issues/40
* New weapon - Long Schlong!
* New splash screen.
* Game mechanics improved.
* [O] key skips to the Game Over screen.
* The game works on Atari 800.
* Huge amount of optimizations to squeeze the game into 48K.
And now the new adventure begins!
###### Build 148 ###### Build 148
2022-07-17 2022-07-17
WHAT DOES THE FOX SAY? WHAT DOES THE FOX SAY?
+662 -98
View File
@@ -57,11 +57,23 @@ AIRoutines
.word Shooter-1 ;Shooter .word Shooter-1 ;Shooter
.word Poolshark-1 ;Poolshark .word Poolshark-1 ;Poolshark
.word Tosser-1 ;Tosser .word Tosser-1 ;Tosser
.word Tosser-1 ;Chooser .word Chooser-1 ;Chooser
.word Tosser-1 ;Spoiler .word Spoiler-1 ;Spoiler
.word Tosser-1 ;Cyborg .word Cyborg-1 ;Cyborg
.word Tosser-1 ;Unknown .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 .proc Moron
jsr RandomizeAngle jsr RandomizeAngle
@@ -154,101 +166,29 @@ loop
.endp .endp
;---------------------------------------------- ;----------------------------------------------
.proc Poolshark .proc Poolshark
jsr UseBatteryOrFlag
; defensives ; defensives
; if low energy ten use battery jsr PoolsharkDefensives
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
firstShoot firstShoot
;find nearest tank neighbour ;find nearest tank neighbour
jsr MakeLowResDistances jsr FindBestTarget2
mva #$ff temp2 ; min possible distance beq EnemyOnLeft
;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
; calculate index to shotangle table ; calculate index to shotangle table
; in temp2 we have x distance divided by 8
lda temp2
:3 lsr @ :3 lsr @
and #%00000111 and #%00000111
clc clc
adc #8 adc #8
sta AngleTablePointer sta AngleTablePointer
jmp lowestIsLower bne AngleIsSet
EnemyOnLeft
EnemyOnTheLeft lda temp2
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
:3 lsr @ :3 lsr @
and #%00000111 and #%00000111
eor #%00000111 eor #%00000111
sta AngleTablePointer sta AngleTablePointer
AngleIsSet
lowestIsLower
skipThisPlayer
dey
bpl loop01
randomize 0 8 randomize 0 8
ldy AngleTablePointer ldy AngleTablePointer
@@ -286,7 +226,72 @@ AngleTable ; 16 bytes ;ba w $348b L$3350
.by 18,26,34,43,50,58,66,74 .by 18,26,34,43,50,58,66,74
.endp .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 .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 :) ; use best defensive :)
; allways ; allways
; first check check if any is in use ; first check check if any is in use
@@ -310,8 +315,512 @@ AngleTable ; 16 bytes ;ba w $348b L$3350
sta ShieldEnergy,x sta ShieldEnergy,x
DefensiveInUse DefensiveInUse
NoUseDefensive NoUseDefensive
; Toosser is like Poolshark but allways uses defensives rts
jmp Poolshark .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 .endp
;---------------------------------------------- ;----------------------------------------------
.proc PurchaseAI ; .proc PurchaseAI ;
@@ -336,8 +845,8 @@ PurchaseAIRoutines
.word PoolsharkPurchase-1 ;PoolsharkPurchase .word PoolsharkPurchase-1 ;PoolsharkPurchase
.word TosserPurchase-1 ;TosserPurchase .word TosserPurchase-1 ;TosserPurchase
.word TosserPurchase-1 ;ChooserPurchase .word TosserPurchase-1 ;ChooserPurchase
.word TosserPurchase-1 ;SpoilerPurchase .word CyborgPurchase-1 ;SpoilerPurchase
.word TosserPurchase-1 ;CyborgPurchase .word CyborgPurchase-1 ;CyborgPurchase
.word TosserPurchase-1 ;UnknownPurchase .word TosserPurchase-1 ;UnknownPurchase
;---------------------------------------------- ;----------------------------------------------
@@ -346,13 +855,41 @@ PurchaseAIRoutines
rts rts
.endp .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 .proc TryToPurchaseOnePiece
; A - weapon number, better it will be in range(1,32) ; A - weapon number, better it will be in range(1,32)
; TankNr in X ; TankNr in X
; DOES NOT CHANGE X ; DOES NOT CHANGE X
tay 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 beq SorryNoPurchase
PurchaseIt
ldy temp+1
lda WeaponPriceL,y lda WeaponPriceL,y
sta temp sta temp
lda WeaponPriceH,y lda WeaponPriceH,y
@@ -422,7 +959,7 @@ SorryNoPurchase
mva #3 tempXroller; number of offensive purchases to perform mva #3 tempXroller; number of offensive purchases to perform
ldx TankNr ldx TankNr
@ @
randomize ind_Battery________ ind_Auto_Defense___ randomize ind_Battery________ ind_Bouncy_Castle__
jsr TryToPurchaseOnePiece jsr TryToPurchaseOnePiece
dec tempXroller dec tempXroller
bne @- bne @-
@@ -443,12 +980,12 @@ SorryNoPurchase
; what is my money level ; what is my money level
ldx TankNr ldx TankNr
lda MoneyH,x ; money / 256 ; lda MoneyH,x ; money / 256
sta tempXroller ; perform this many purchase attempts ; sta tempXroller ; perform this many purchase attempts
; first try to buy defensives ; 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 jsr TryToPurchaseOnePiece
dec tempXroller dec tempXroller
bne @- bne @-
@@ -465,3 +1002,30 @@ SorryNoPurchase
rts rts
.endp .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
-501
View File
@@ -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 #<song_end
;bne wait_frame
end_loop
rts
song_ptr = get_byte + 1
.proc get_byte
lda song_data+1
inc song_ptr
bne skip
inc song_ptr+1
skip
rts
.endp
main
jsr init_song
; --- init PMG
ift USESPRITES
mva >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
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.
+877
View File
@@ -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 #<song_end
;bne wait_frame
end_loop
rts
song_ptr = get_byte + 1
.proc get_byte
lda song_data+1
inc song_ptr
bne skip
inc song_ptr+1
skip
rts
.endp
main
jsr init_song
; ; 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 @-
; --- init PMG
ift USESPRITES
mva >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
Binary file not shown.
Binary file not shown.
-54
View File
@@ -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!
-60
View File
@@ -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.
-<SOB>-
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.
+41
View File
@@ -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--------
+41
View File
@@ -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--------
-40
View File
@@ -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--------
@@ -1,4 +1,3 @@
.echo *
;* ;*
;* Raster Music Tracker, RMT Atari routine version 1.20090108 ;* Raster Music Tracker, RMT Atari routine version 1.20090108
;* (c) Radek Sterba, Raster/C.P.U., 2002 - 2009 ;* (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. ;* 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 ;* ;1 => compile RMTplayer for 8 tracks stereo
;* ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4 ;* ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4
;* ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4 ;* ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4
;* ;*
; IFT STEREOMODE==1 IFT STEREOMODE==1
;TRACKS equ 8 TRACKS equ 8
; ELS ELS
TRACKS equ 4 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 IFT TRACKS>4
org PLAYER-$400+$40 org PLAYER-$400+$40
ELS ELS
@@ -745,8 +766,9 @@ ei4
IFT 1==[FEAT_COMMAND1+FEAT_COMMAND2+FEAT_COMMAND3+FEAT_COMMAND4+FEAT_COMMAND5+FEAT_COMMAND6+[FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY]] IFT 1==[FEAT_COMMAND1+FEAT_COMMAND2+FEAT_COMMAND3+FEAT_COMMAND4+FEAT_COMMAND5+FEAT_COMMAND6+[FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY]]
beq cmd0 beq cmd0
ELS ELS
lsr @ ; lsr @
lsr @ ; lsr @
lda #0 ; my fix :)
sta jmx+1 sta jmx+1
jmx bcc * jmx bcc *
jmp cmd0 jmp cmd0
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+124 -165
View File
@@ -2,11 +2,29 @@
.IF *>0 ;this is a trick that prevents compiling this file alone .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!=========================== ;==========================CONSTANT TABLES, do not erase!===========================
;=================================================================================== ;===================================================================================
TankColoursTable .BYTE $86,$46,$c6,$28,$c6,$ee TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$de
TankStatusColoursTable .BYTE $80,$40,$c4,$20,$c0,$e4 TankStatusColoursTable .BYTE $54,$24,$94,$c4,$74,$d4
TankShapesTable .BYTE char_tank1___________,char_tank2___________,char_tank3___________
.BYTE char_tank1___________,char_tank2___________,char_tank3___________
dliColorsBack dliColorsBack
:10 .by $02,$00 :10 .by $02,$00
dliColorsFore dliColorsFore
@@ -18,6 +36,7 @@ CashOptionH
GravityTable .by 10,20,25,30,40 GravityTable .by 10,20,25,30,40
MaxWindTable .by 5,20,40,70,99 MaxWindTable .by 5,20,40,70,99
RoundsTable .by 10,20,30,40,50 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 flyDelayTable .by 255,150,75,35,1
seppukuTable .by 255, 45,25,15,9 seppukuTable .by 255, 45,25,15,9
mountainsDeltaTableH .by 0,1,3,5,7 mountainsDeltaTableH .by 0,1,3,5,7
@@ -36,7 +55,11 @@ TanksWeaponsTableL
.by <TanksWeapon1,<TanksWeapon2,<TanksWeapon3,<TanksWeapon4,<TanksWeapon5,<TanksWeapon6 .by <TanksWeapon1,<TanksWeapon2,<TanksWeapon3,<TanksWeapon4,<TanksWeapon5,<TanksWeapon6
TanksWeaponsTableH TanksWeaponsTableH
.by >TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 .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----- ;-----4x4 texts-----
LineTop LineTop
dta d"(%%%%%%%%%%%%)", $ff dta d"(%%%%%%%%%%%%)", $ff
@@ -197,90 +220,6 @@ SlideLeftTable
.BY %00000111 .BY %00000111
.BY %00001100 .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 TanksNamesDefault
dta d"1st.Tank" dta d"1st.Tank"
@@ -352,8 +291,8 @@ WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Heavy_Shield___ .by >price_Heavy_Shield___
.by >price_Force_Shield___ .by >price_Force_Shield___
.by >price_Super_Mag______ .by >price_Super_Mag______
.by >price_Auto_Defense___ .by >price_Bouncy_Castle__
.by >price_Fuel_Tank______ .by >price_Long_Barrel____
.by >price_Nuclear_Winter_ .by >price_Nuclear_Winter_
WeaponPriceL WeaponPriceL
@@ -418,8 +357,8 @@ WeaponPriceL
.by <price_Heavy_Shield___ .by <price_Heavy_Shield___
.by <price_Force_Shield___ .by <price_Force_Shield___
.by <price_Super_Mag______ .by <price_Super_Mag______
.by <price_Auto_Defense___ .by <price_Bouncy_Castle__
.by <price_Fuel_Tank______ .by <price_Long_Barrel____
.by <price_Nuclear_Winter_ .by <price_Nuclear_Winter_
;------------------------------------------------- ;-------------------------------------------------
@@ -491,76 +430,56 @@ WeaponUnits
.by 3 ;Force_Shield___ .by 3 ;Force_Shield___
.by 2 ;Super_Mag______ .by 2 ;Super_Mag______
.by 1 ;Auto_Defense___ .by 1 ;Auto_Defense___
.by 10 ;Fuel_Tank______ .by 2 ;Long_Barrel____
.by 1 ;Nuclear_Winter_ .by 1 ;Nuclear_Winter_
PurchaseMeTable ;weapons good to be purchased by the robot PurchaseMeTable ;weapons good to be purchased by the robot
;the comment is an index in the tables ;the comment is an index in the tables
dta 1 ;"Baby Missile " ; 0 ; "Baby Missile ","Missile ","Baby Nuke ","Nuke "
dta 1 ;"Missile " ; 1 ; "LeapFrog ","Funky Bomb ","MIRV ","Death's Head "
dta 1 ;"Baby Nuke " ; 2 .by %01111111
dta 1 ;"Nuke " ; 3 ; "Napalm ","Hot Napalm ","Tracer ","Smoke Tracer "
dta 1 ;"LeapFrog " ; 4 ; "Baby Roller ","Roller ","Heavy Roller ","Riot Charge "
dta 1 ;"Funky Bomb " ; 5 .by %11001110
dta 1 ;"MIRV " ; 6 ; "Riot Blast ","Riot Bomb ","Heavy Riot Bomb ","Baby Digger "
dta 1 ;"Death's Head " ; 7 ; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog "
dta 1 ;"Napalm " ; 8 .by %00000000
dta 1 ;"Hot Napalm " ; 9 ; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt "
dta 0 ;"Tracer " ; 10 ; "Liquid Dirt ","Dirt Charge ","Earth Disrupter ","Plasma Blast "
dta 0 ;"Smoke Tracer " ; 11 .by %00000000
dta 1 ;"Baby Roller " ; 12 ; "Laser "
dta 1 ;"Roller " ; 13 .by %00000000
dta 1 ;"Heavy Roller " ; 14 .by 0 ; offset to defensives
dta 0 ;"Riot Charge " ; 15 ; "White Flag ","Battery ","Bal Guidance ","Horz Guidance "
dta 0 ;"Riot Blast " ; 16 ; "Vert Guidance ","Lazy Boy ","Parachute ","Strong Parachute"
dta 0 ;"Riot Bomb " ; 17 .by %01000011
dta 0 ;"Heavy Riot Bomb " ; 18 ; "Mag Deflector ","Shield ","Heavy Shield ","Force Shield "
dta 0 ;"Baby Digger " ; 19 ; "Super Mag ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
dta 0 ;"Digger " ; 20 .by %11110100
dta 0 ;"Heavy Digger " ; 21
dta 0 ;"Baby Sandhog " ; 22
dta 0 ;"Sandhog " ; 23
dta 0 ;"Heavy Sandhog " ; 24
dta 0 ;"Dirt Clod " ; 25
dta 0 ;"Dirt Ball " ; 26
dta 0 ;"Ton of Dirt " ; 27
dta 0 ;"Liquid Dirt " ; 28
dta 0 ;"Dirt Charge " ; 29
dta 0 ;"Earth Disrupter " ; 30
dta 0 ;"Plasma Blast " ; 31
dta 1 ;"Laser " ; 32
dta 0 ;"----------------" ; 33
dta 0 ;"----------------" ; 34
dta 0 ;"----------------" ; 35
dta 0 ;"----------------" ; 36
dta 0 ;"----------------" ; 37
dta 0 ;"----------------" ; 38
dta 0 ;"----------------" ; 39
dta 0 ;"----------------" ; 40
dta 0 ;"----------------" ; 41
dta 0 ;"----------------" ; 42
dta 0 ;"----------------" ; 43
dta 0 ;"----------------" ; 44
dta 0 ;"----------------" ; 45
dta 0 ;"----------------" ; 46
dta 0 ;"----------------" ; 47
dta 0 ;"White Flag " ; 48
dta 1 ;"Battery " ; 49
dta 0 ;"Bal Guidance " ; 50
dta 0 ;"Horz Guidance " ; 51
dta 0 ;"Vert Guidance " ; 52
dta 0 ;"Lazy Boy " ; 53
dta 1 ;"Parachute " ; 54
dta 1 ;"Strong Parachute" ; 55
dta 1 ;"Mag Deflector " ; 56
dta 1 ;"Shield " ; 57
dta 1 ;"Heavy Shield " ; 58
dta 1 ;"Force Shield " ; 59
dta 0 ;"Super Mag " ; 60
dta 1 ;"Auto Defense " ; 61
dta 0 ;"Fuel Tank " ; 62
dta 0 ;"Nuclear Winter " ; 63
PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg)
;the comment is an index in the tables
; "Baby Missile ","Missile ","Baby Nuke ","Nuke "
; "LeapFrog ","Funky Bomb ","MIRV ","Death's Head "
.by %00110001
; "Napalm ","Hot Napalm ","Tracer ","Smoke Tracer "
; "Baby Roller ","Roller ","Heavy Roller ","Riot Charge "
.by %01000000
; "Riot Blast ","Riot Bomb ","Heavy Riot Bomb ","Baby Digger "
; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog "
.by %00000000
; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt "
; "Liquid Dirt ","Dirt Charge ","Earth Disrupter ","Plasma Blast "
.by %00000000
; "Laser "
.by %00000000
.by 0 ; offset to defensives
; "White Flag ","Battery ","Bal Guidance ","Horz Guidance "
; "Vert Guidance ","Lazy Boy ","Parachute ","Strong Parachute"
.by %01000001
; "Mag Deflector ","Shield ","Heavy Shield ","Force Shield "
; "Super Mag ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
.by %10110100
;------------------------------------------------- ;-------------------------------------------------
; Screen codes of icons (chars) representing a given weapon ; Screen codes of icons (chars) representing a given weapon
@@ -572,7 +491,7 @@ WeaponSymbols
.by $20,$00,$00,$00,$00,$00,$00,$00 .by $20,$00,$00,$00,$00,$00,$00,$00
.by $00,$00,$00,$00,$00,$00,$00,$00 .by $00,$00,$00,$00,$00,$00,$00,$00
.by $5f,$1c,$03,$06,$1d,$0a,$1b,$1b ; defensives .by $5f,$1c,$03,$06,$1d,$0a,$1b,$1b ; defensives
.by $1e,$3b,$3d,$3c,$3e,$3f,$5e,$7d .by $1e,$3b,$3d,$3c,$3e,$3f,$1d,$7d
; Names of weapons (16 chars long) ; Names of weapons (16 chars long)
NamesOfWeapons ;the comment is an index in the tables NamesOfWeapons ;the comment is an index in the tables
@@ -631,15 +550,15 @@ NamesOfWeapons ;the comment is an index in the tables
dta d"Horz Guidance " ; 51 dta d"Horz Guidance " ; 51
dta d"Vert Guidance " ; 52 dta d"Vert Guidance " ; 52
dta d"Lazy Boy " ; 53 dta d"Lazy Boy " ; 53
dta d"Parachute " ; 54 - no energy dta d"Parachute " ; 54 - no energy
dta d"Strong Parachute" ; 55 - with energy (earlier Battery) dta d"Strong Parachute" ; 55 - with energy (earlier Battery)
dta d"Mag Deflector " ; 56 - with shield and energy dta d"Mag Deflector " ; 56 - with shield and energy
dta d"Shield " ; 57 - shield for one shot - no energy dta d"Shield " ; 57 - shield for one shot - no energy
dta d"Heavy Shield " ; 58 - shield with energy dta d"Heavy Shield " ; 58 - shield with energy
dta d"Force Shield " ; 59 - shield with energy and parachute dta d"Force Shield " ; 59 - shield with energy and parachute
dta d"Super Mag " ; 60 dta d"Super Mag " ; 60
dta d"Auto Defense " ; 61 - with shield and energy dta d"Bouncy Castle " ; 61 - with shield and energy
dta d"Fuel Tank " ; 62 dta d"Long Schlong " ; 62
dta d"Nuclear Winter " ; 63 dta d"Nuclear Winter " ; 63
DefensiveEnergy = * - 48 DefensiveEnergy = * - 48
.by 00 ; White Flag .by 00 ; White Flag
@@ -655,8 +574,8 @@ DefensiveEnergy = * - 48
.by 99 ; Heavy Shield .by 99 ; Heavy Shield
.by 99 ; Force Shield .by 99 ; Force Shield
.by 00 ; Super Mag .by 00 ; Super Mag
.by 99 ; Auto Defense .by 99 ; Bouncy Castle
.by 00 ; Fuel Tank .by 00 ; Long Barrel
.by 00 ; Nuclear Winter .by 00 ; Nuclear Winter
weaponsOfDeath weaponsOfDeath
dta 1,2,3,7,17,18,19,20,21,22,23,24,25,26,27 dta 1,2,3,7,17,18,19,20,21,22,23,24,25,26,27
@@ -684,5 +603,45 @@ gameOverSpritesTop
; end of the Gover sprites by number of players ; end of the Gover sprites by number of players
; 1 2 3 4 5 6 ; 1 2 3 4 5 6
.by 130,130,136,142,148,154 .by 130,130,136,142,148,154
;-------decimal constans
zero
digits dta d"0123456789"
nineplus dta d"9"+1
space dta d" "
;------credits
CreditsStart
dta d" "*
dta d"You were playin",d"g"*
dta d"Scorc",d"h"*
dta d"Warsaw, Miam",d"i"*
dta d"2000-202",d"2"*
dta d" "*
dta d"B",d"y"*
dta d" "*
dta d"Programmin",d"g"*
dta d"Tomasz 'Pecus' Peck",d"o"*
dta d"Pawel 'pirx' Kalinowsk",d"i"*
dta d" "*
dta d"SFX, Music and Suppor",d"t"*
dta d"Michal 'Miker' Szpilowsk",d"i"*
dta d" "*
dta d"Additional Musi",d"c"*
dta d"Mario 'Emkay' Kri",d"x"*
dta d" "*
dta d"Code Optimizatio",d"n"*
dta d"Piotr '0xF' Fusi",d"k"*
dta d" "*
dta d"Ar",d"t"*
dta d"Adam Wachowsk",d"i"*
dta d"Krzysztof 'Kaz' Ziembi",d"k"*
dta d" "*
dta d"Ideas and Q",d"A"*
dta d"Bocianu, Probabilitydragon, EnderDude",d","*
dta d"Beeblebrox, KrzysRog, lopezpb, Dracon",d","*
dta d"brad-colbert, archon800, nowy80",d","*
dta d"Shaggy the Atarian, RetroBorsuk, ZP",d"H"*
dta d" "*
dta d"Stay tuned for the FujiNet version",d"!"*
dta d" "*
CreditsEnd
.endif .endif
+31 -8
View File
@@ -1,18 +1,38 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
;----------------------------------------------
; Player/missile memory
PMGraph = $0800
display = $1010 ;screen takes $2K due to clearing routine
screenheight = 200 screenheight = 200
screenBytes = 40 screenBytes = 40
screenwidth = screenBytes*8 ; Max screenwidth = 512!!! screenwidth = screenBytes*8 ; Max screenwidth = 512!!!
margin = 40 ;mountain drawing Y variable margin margin = 40 ;mountain drawing Y variable margin
display = $1010 ;screen takes $2K due to clearing routine
MaxPlayers = 6 MaxPlayers = 6
maxOptions = 8 ;number of all options maxOptions = 8 ;number of all options
PMOffsetX = $2C ; P/M to graphics offset PMOffsetX = $2C ; P/M to graphics offset
PMOffsetY = $23 ; P/M to graphics offset PMOffsetY = $23 ; P/M to graphics offset
napalmRadius = 10 napalmRadius = 10
StandardBarrel = 6 ; standard tank barrel length
LongBarrel = 20 ; long barrel length
TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor
TextForegroundColor = $0c TextForegroundColor = $0A
;character codes for symbols (tank, parachute, etc. )
char_parachute_______ = $02
char_flag____________ = $1e
char_flame___________ = $14
char_clear_flame_____ = $1c
char_digger__________ = $04
char_sandhog_________ = $0c
char_sandhog_offset = char_sandhog_________ - char_digger__________
char_tank1___________ = $20
char_tank2___________ = $24
char_tank3___________ = $28
;Weapon prices (*10 on screen) ;Weapon prices (*10 on screen)
price_Baby_Missile___ = 0 ;_0 price_Baby_Missile___ = 0 ;_0
@@ -76,8 +96,8 @@ price_Shield_________ = 224 ;_57
price_Heavy_Shield___ = 628 ;_58 price_Heavy_Shield___ = 628 ;_58
price_Force_Shield___ = 1100 ;_59 price_Force_Shield___ = 1100 ;_59
price_Super_Mag______ = $ffff ;_60 price_Super_Mag______ = $ffff ;_60
price_Auto_Defense___ = 512 ;_61 price_Bouncy_Castle__ = 512 ;_61
price_Fuel_Tank______ = $ffff ;_62 price_Long_Barrel____ = 2100 ;_62
price_Nuclear_Winter_ = 1000 ;_63 price_Nuclear_Winter_ = 1000 ;_63
;Weapon indexes (numbers) ;Weapon indexes (numbers)
ind_Baby_Missile___ = 0 ind_Baby_Missile___ = 0
@@ -141,8 +161,8 @@ ind_Shield_________ = 57
ind_Heavy_Shield___ = 58 ind_Heavy_Shield___ = 58
ind_Force_Shield___ = 59 ind_Force_Shield___ = 59
ind_Super_Mag______ = 60 ind_Super_Mag______ = 60
ind_Auto_Defense___ = 61 ind_Bouncy_Castle__ = 61
ind_Fuel_Tank______ = 62 ind_Long_Barrel____ = 62
ind_Nuclear_Winter_ = 63 ind_Nuclear_Winter_ = 63
;-------------------------------- ;--------------------------------
; names of RMT instruments (sfx) ; names of RMT instruments (sfx)
@@ -177,10 +197,13 @@ sfx_seppuku = $1a ;1
sfx_liquid_dirt = $1b ;2 sfx_liquid_dirt = $1b ;2
sfx_battery = $1c ;3 sfx_battery = $1c ;3
sfx_white_flag = $1d ;4 sfx_white_flag = $1d ;4
sfx_long_barrel = $1e
;-------------------------------- ;--------------------------------
; RMT songs (lines) ; RMT songs (lines)
;-------------------------------- ;--------------------------------
song_silencio = $00 song_silencio = $00
song_end_round = $02 song_main_menu = $02
song_ingame = $06 song_ingame = $06
song_game_over = $0b song_round_over = $0b
song_ending_looped = $0e
song_supermarket = $1b
+84 -40
View File
@@ -1,4 +1,4 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0 ;this is a trick that prevents compiling this file alone .IF *>0 ;this is a trick that prevents compiling this file alone
@@ -31,6 +31,11 @@ OptionsDL
.word OptionsScreen .word OptionsScreen
.byte $30,$02,$02,$70 .byte $30,$02,$02,$70
:maxOptions .by $02,$10 :maxOptions .by $02,$10
:(9-maxOptions) .by $70,$10
.byte $80
.byte $4f
.word (display+140*40)
:21 .by $0f ;76
.byte $41 .byte $41
.word OptionsDL .word OptionsDL
;------------------------ ;------------------------
@@ -54,51 +59,51 @@ dl ; MAIN game display list
.byte $10 ; 2 blank lines .byte $10 ; 2 blank lines
.byte $4f .byte $4f
.word display ; 1 line .word display ; 1 line
:76 .by $0f ;76 :76 .by $0f ;76
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:13 .by $0f ;13 :13 .by $0f ;13
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:8 .by $0f ;8 :8 .by $0f ;8
.by $4f ;1 .by $4f ;1
.wo display+$0ff0 .wo display+$0ff0
:2 .by $0f ;2 :2 .by $0f ;2
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:9 .by $0f ;9 :9 .by $0f ;9
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:8 .by $0f ;8 :8 .by $0f ;8
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:7 .by $0f ;7 :7 .by $0f ;7
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:6 .by $0f ;6 :6 .by $0f ;6
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:5 .by $0f ;5 :5 .by $0f ;5
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:4 .by $0f ;4 :4 .by $0f ;4
.by $0f+$80 ; DLI (black bar) ;2 .by $0f+$80 ; DLI (black bar) ;2
.by $0f+$80 ; DLI .by $0f+$80 ; DLI
:3 .by $0f ;3 :3 .by $0f ;3
.by $0f+$80 ; DLI (black to end);1 .by $0f+$80 ; DLI (black to end);1
:38 .byte $0f ;35 ..... = 200 :38 .byte $0f ;35 ..... = 200
.by $4f .by $4f
.wo EmptyLine ; additional line of ground .wo EmptyLine ; additional line of ground
.byte $41 .byte $41
.word dl .word dl
;----------------------------------------------- ;-----------------------------------------------
;Screen displays go first to avoid crossing 4kb barrier ;Screen displays go first to avoid crossing 4kb barrier
;----------------------------------------------- ;-----------------------------------------------
OptionsScreen OptionsScreen
dta d"Welcome to Scorch ver. " dta d"Welcome to Scorch v. "
build ; 3 bytes from scorch.asm (fancy method) :) build ; 4 bytes from scorch.asm (fancy method) :)
dta d" (un)2000-2022" dta d" (un)2000-2022"
dta d" Please select option with cursor keys " dta d" Please select option with cursor keys "
dta d" and press (Return) to proceed " dta d" and press (Return) to proceed "
OptionsHere OptionsHere
@@ -128,6 +133,7 @@ MoreDown
ListOfWeapons ListOfWeapons
:36 dta d" " :36 dta d" "
ListOfWeapons1End ListOfWeapons1End
;GameOverResults ; reuse after game (remember to clear on start new)
ListOfDefensiveWeapons ListOfDefensiveWeapons
:16 dta d" " :16 dta d" "
ListOfDefensiveWeaponsEnd ;constant useful when clearing ListOfDefensiveWeaponsEnd ;constant useful when clearing
@@ -146,6 +152,41 @@ EmptyLine
dta d" " dta d" "
; ------------------------------------------------- ; -------------------------------------------------
.ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!! .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 NameScreen
dta d" Enter names of players " dta d" Enter names of players "
dta d" Tank 01 Name:" dta d" Tank 01 Name:"
@@ -179,5 +220,8 @@ activateTextEnd
purchaseText purchaseText
dta d"Purchase" dta d"Purchase"
purchaseTextEnd purchaseTextEnd
GameOverTitle
.endif dta d" game over "*
GameOverTitle2
dta d" Player Points Hits Earned Money "
.endif
+225 -78
View File
@@ -462,19 +462,18 @@ endcircleloop
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
.proc clearscreen .proc ClearScreen
;-------------------------------------------------- ;--------------------------------------------------
mwa #display temp
lda #$ff ldy #0
ldx #0 @ lda #$ff
@ sta (temp),y
:31 sta display+($100*#),x inw temp
sta display+$1e50,x ; this is so no space outside of the screen is cleared cpw temp #display+screenheight*screenBytes+1
; of course we are clearing $100 instead of $50, but who cares :]
inx
bne @- bne @-
rts rts
.endp .endp
;-------------------------------*------------------ ;-------------------------------*------------------
.proc placetanks .proc placetanks
;-------------------------------------------------- ;--------------------------------------------------
@@ -631,19 +630,16 @@ No6thTankHide
SkipHidingPM SkipHidingPM
ldy TankShapesTable,x
lda AngleTable,x lda AngleTable,x
tay cmp #91 ; left or right tank shape
lda BarrelTable,y bcs LeftTank
sta CharCode :2 iny ; right tank
LeftTank
sty CharCode
DrawTankNrX DrawTankNrX
ldx tanknr ldx tanknr
lda xtankstableL,x jsr SetupXYdraw
sta xdraw
lda xtankstableH,x
sta xdraw+1
lda ytankstable,x
sta ydraw
mva #0 ydraw+1
jsr TypeChar jsr TypeChar
@@ -728,44 +724,57 @@ ZeroesToGo6
bne ClearPM6 bne ClearPM6
NoPlayerMissile NoPlayerMissile
ldy #$01
lda Erase
beq @+
dey
@ sty color
; draw defensive weapons like shield ( tank number in X ) ; draw defensive weapons like shield ( tank number in X )
; in xdraw, ydraw we have coordinates left LOWER corner of Tank char ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char
ldx TankNr ldx TankNr
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
cmp #ind_Shield_________ ; one shot shield cmp #ind_Shield_________ ; one shot shield
beq DrawTankShield beq DrawTankSh
cmp #ind_Force_Shield___ ; shield with energy and parachute cmp #ind_Force_Shield___ ; shield with energy and parachute
beq DrawTankShieldBold beq DrawTankShieldBold
cmp #ind_Heavy_Shield___ ; shield with energy cmp #ind_Heavy_Shield___ ; shield with energy
beq DrawTankShieldBold beq DrawTankShieldBold
cmp #ind_Auto_Defense___ ; Auto Defence cmp #ind_Bouncy_Castle__ ; Auto Defence
beq DrawTankShieldWihHorns beq DrawTankShieldWihHorns
cmp #ind_Mag_Deflector__ ; Mag Deflector cmp #ind_Mag_Deflector__ ; Mag Deflector
beq DrawTankShieldWihHorns beq DrawTankShieldWihHorns
cmp #ind_White_Flag_____ ; White Flag cmp #ind_White_Flag_____ ; White Flag
beq DrawTankFlag beq DrawTankFlag
bne NoShieldDraw bne NoShieldDraw
DrawTankShield DrawTankSh
jmp DrawTankShield.DrawInPosition jsr DrawTankShield
jmp NoShieldDraw
DrawTankShieldWihHorns DrawTankShieldWihHorns
jsr DrawTankShield.DrawInPosition jsr DrawTankShield
jmp DrawTankShieldHorns jsr DrawTankShieldHorns
jmp NoShieldDraw
DrawTankShieldBold DrawTankShieldBold
jsr DrawTankShield.DrawInPosition jsr DrawTankShield
jmp DrawTankShieldBoldLine jsr DrawTankShieldBoldLine
jmp NoShieldDraw
DrawTankFlag DrawTankFlag
lda #$5E ; flag symbol lda #char_flag____________ ; flag symbol
sta CharCode sta CharCode
lda Ytankstable,x lda Ytankstable,x
sec sec
sbc #8 sbc #8
sta ydraw sta ydraw
lda XtanksTableL,x
sta xdraw
lda XtanksTableH,x
sta xdraw+1
jsr TypeChar jsr TypeChar
NoShieldDraw NoShieldDraw
BarrelChange
ldy #$01
lda Erase
beq @+
dey
@ sty color
jsr DrawBarrel
ldx TankNr
DoNotDrawTankNr DoNotDrawTankNr
rts rts
.endp .endp
@@ -782,11 +791,15 @@ tankflash_loop
mva #1 Erase mva #1 Erase
ldx TankNr ldx TankNr
jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy !
PAUSE 2 ;PAUSE 2
ldy #1
jsr PauseYFrames
mva #0 Erase mva #0 Erase
ldx TankNr ldx TankNr
jsr DrawTankNr.SkipHidingPM jsr DrawTankNr.SkipHidingPM
PAUSE 2 ;PAUSE 2
ldy #1
jsr PauseYFrames
dec fs dec fs
jne tankflash_loop jne tankflash_loop
rts rts
@@ -801,22 +814,9 @@ tankflash_loop
; ;
; this proc change xdraw, ydraw and temp! ; 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 sbw xdraw #$03 ; 3 pixels to left
; draw left vertical line of shield ( | ) ; draw left vertical line of shield ( | )
mva #6 temp ; strange !!! mva #7 temp ; strange !!!
@ @
jsr plot jsr plot
.nowarn dew ydraw .nowarn dew ydraw
@@ -894,17 +894,18 @@ ShieldVisible
.proc DrawTankParachute .proc DrawTankParachute
;Tank number in X ;Tank number in X
;-------------------------------------------------- ;--------------------------------------------------
lda #$34 ; parachute symbol lda #char_parachute_______ ; parachute symbol
sta CharCode sta CharCode
lda Ytankstable,x lda Ytankstable,x
sec cmp #16
bcc ToHighToParachute
;sec
sbc #8 sbc #8
sta ydraw sta ydraw
lda XtanksTableL,x jsr SetupXYdraw.X
sta xdraw
lda XtanksTableH,x
sta xdraw+1
jsr TypeChar jsr TypeChar
ToHighToParachute
ldx TankNr
rts rts
.endp .endp
@@ -944,19 +945,16 @@ NoFallingSound
and #01 and #01
beq DoNotClearParachute beq DoNotClearParachute
; here we clear the parachute ; here we clear the parachute
ldx TankNr ; ldx TankNr
jsr DrawTankParachute jsr DrawTankParachute
DoNotClearParachute DoNotClearParachute
mva #0 Erase mva #0 Erase
ldx TankNr ; ldx TankNr
lda EndOfTheFallFlag ; We only get byte below the tank if still falling lda EndOfTheFallFlag ; We only get byte below the tank if still falling
bne NoGroundCheck bne NoGroundCheck
; coordinates of the first pixel under the tank ; coordinates of the first pixel under the tank
ldx TankNr ldx TankNr
lda XtankstableL,x jsr SetupXYdraw.X
sta xdraw
lda XtankstableH,x
sta xdraw+1
lda Ytankstable,x lda Ytankstable,x
clc clc
adc #1 ; in this point the comment helped us! For the very first adc #1 ; in this point the comment helped us! For the very first
@@ -1037,9 +1035,10 @@ FallingLeft
bit PreviousFall ; bit 6 - right bit PreviousFall ; bit 6 - right
bvs EndLeftFall bvs EndLeftFall
; we finish falling left if the tank reached the edge of the screen ; we finish falling left if the tank reached the edge of the screen
lda XtanksTableL,x
bne NotLeftEdge
lda XtanksTableH,x lda XtanksTableH,x
bne NotLeftEdge
lda XtanksTableL,x
cmp #2 ; 2 pixels correction due to a barrel wider than tank
beq EndLeftFall beq EndLeftFall
NotLeftEdge NotLeftEdge
; tank is falling left - modify coorinates ; tank is falling left - modify coorinates
@@ -1064,7 +1063,7 @@ FallingRight
lda XtanksTableH,x lda XtanksTableH,x
adc #0 adc #0
sta temp+1 sta temp+1
cpw temp #screenwidth cpw temp #screenwidth-2 ; 2 pixels correction due to a barrel wider than tank
beq EndRightFall beq EndRightFall
; tank is falling right - modify coorinates ; tank is falling right - modify coorinates
sec sec
@@ -1088,9 +1087,9 @@ EndOfFCycle
cmp #3 ; parachute and falling cmp #3 ; parachute and falling
bne DoNotDrawParachute bne DoNotDrawParachute
; here we draw parachute ; here we draw parachute
ldx TankNr ; ldx TankNr
jsr DrawTankParachute jsr DrawTankParachute
wait ; onli if tank with patachute jsr WaitOneFrame ; only if tank with parachute
RapidFalling RapidFalling
DoNotDrawParachute DoNotDrawParachute
lda EndOfTheFallFlag lda EndOfTheFallFlag
@@ -1099,7 +1098,7 @@ DoNotDrawParachute
; the horizontal coordinate is even. ; the horizontal coordinate is even.
; If it is odd then it must be corrected because otherwise ; If it is odd then it must be corrected because otherwise
; P/M graphics background would not look OK ; P/M graphics background would not look OK
ldx TankNr ; ldx TankNr
lda XtanksTableL,x lda XtanksTableL,x
and #$01 and #$01
beq EndOfFall ; if it is even then it is the end beq EndOfFall ; if it is even then it is the end
@@ -1116,7 +1115,7 @@ ForceFallLeft
jne TankFallsX jne TankFallsX
EndOfFall EndOfFall
mva #1 Erase mva #1 Erase
ldx TankNr ; ldx TankNr
; if tank was falling down having parachute, ; if tank was falling down having parachute,
; we must deduct one parachute ; we must deduct one parachute
lda Parachute lda Parachute
@@ -1135,7 +1134,7 @@ NoParachuteWeapon
jsr DrawTankParachute jsr DrawTankParachute
ThereWasNoParachute ThereWasNoParachute
mva #0 Erase mva #0 Erase
ldx TankNr ; ldx TankNr
jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) )
mva #sfx_silencer sfx_effect mva #sfx_silencer sfx_effect
rts rts
@@ -1432,7 +1431,7 @@ EndDrawing
rts rts
.endp .endp
; **************************************************** /*
;-------------------------------------------------- ;--------------------------------------------------
.proc calculatemountains0 .proc calculatemountains0
; Only for testing - makes ground flat (0 pixels) ; Only for testing - makes ground flat (0 pixels)
@@ -1457,7 +1456,7 @@ SetYofNextTank
bpl SetYofNextTank bpl SetYofNextTank
rts rts
.endp .endp
; **************************************************** */
; ----------------------------------------- ; -----------------------------------------
.proc unPlot .proc unPlot
@@ -1578,10 +1577,10 @@ EndOfUnPlot
; ----------------------------------------- ; -----------------------------------------
; is it not over the screen ??? ; is it not over the screen ???
cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
bcs unPlot.EndOfUnPlot bcs unPlot.EndOfUnPlot ;nearest RTS
CheckX02 CheckX02
cpw xdraw #screenwidth cpw xdraw #screenwidth
bcs EndOfPlot ;nearest RTS bcs EndOfPlot
MakePlot MakePlot
; let's calculate coordinates from xdraw and ydraw ; let's calculate coordinates from xdraw and ydraw
@@ -1800,7 +1799,7 @@ EndPutChar
FontColor0 FontColor0
; char to the table ; char to the table
lda CharCode4x4 lda CharCode4x4
and #1 and #%00000001
beq Upper4bits beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits Upper4bits
@@ -1842,11 +1841,11 @@ GetUpper4bits
and #$7 and #$7
sta ybit sta ybit
lsrw xbyte ; div 8 :3 lsrw xbyte ; div 8
rorw xbyte ; rorw xbyte
rorw xbyte ; rorw xbyte
;--- ;---
ldy xbyte ldy xbyte ; horizontal byte offet stored in Y
lda dy ; y = y - 3 because left lower. lda dy ; y = y - 3 because left lower.
sec sec
sbc #3 sbc #3
@@ -1906,6 +1905,154 @@ EndPut4x4
; and #$fc ; and #$fc
; ora #$02 ; 2=normal, 3 = wide screen width ; ora #$02 ; 2=normal, 3 = wide screen width
sta dmactls 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 rts
.endp .endp
+157
View File
@@ -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 :) ).
+10 -10
View File
@@ -76,16 +76,16 @@
.MACRO WAIT .MACRO WAIT
; WAIT ; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) ; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
lda CONSOL ?zero LDA VCOUNT
cmp #6 ; START KEY beq ?zero
beq ?nowait bpl ?WA
LDA VCOUNT sbc #10 ; last lines correction
ldy vcount ?WA cmp VCOUNT
?WA cpy VCOUNT beq ?WA
BEQ ?WA bcc ?WA
?wframe ?WFRAME cmp VCOUNT
cmp vcount beq ?nowait
bne ?wframe bcs ?WFRAME
?nowait ?nowait
.ENDM .ENDM
;------------------------------------- ;-------------------------------------
+388 -170
View File
@@ -36,11 +36,11 @@
;we decided it must go in 'English' to let other people work on it ;we decided it must go in 'English' to let other people work on it
.macro build .macro build
dta d"148" ; number of this build (3 bytes) dta d"1.00" ; number of this build (3 bytes)
.endm .endm
icl 'definitions.asm' icl 'definitions.asm'
icl 'artwork/sfx/rmt_feat.asm' ; icl 'artwork/sfx/rmt_feat.asm'
.zpvar xdraw .word = $80 ;variable X for plot .zpvar xdraw .word = $80 ;variable X for plot
@@ -60,6 +60,7 @@
.zpvar xtempDRAW .word ;same as above for XDRAW routine .zpvar xtempDRAW .word ;same as above for XDRAW routine
.zpvar ytempDRAW .word ;same as above for XDRAW routine .zpvar ytempDRAW .word ;same as above for XDRAW routine
.zpvar tempor2 .byte .zpvar tempor2 .byte
.zpvar CreditsVScrol .byte
;--------------temps used in circle routine ;--------------temps used in circle routine
.zpvar xi .word ;X (word) in draw routine .zpvar xi .word ;X (word) in draw routine
.zpvar fx .byte .zpvar fx .byte
@@ -77,6 +78,7 @@
.zpvar UnderTank1 .byte .zpvar UnderTank1 .byte
.zpvar UnderTank2 .byte .zpvar UnderTank2 .byte
;---------------------------- ;----------------------------
.zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight)
.zpvar weaponPointer .word .zpvar weaponPointer .word
.zpvar dliCounter .byte .zpvar dliCounter .byte
.zpvar pressTimer .byte .zpvar pressTimer .byte
@@ -85,36 +87,42 @@
;.zpvar dliA .byte ;.zpvar dliA .byte
;.zpvar dliX .byte ;.zpvar dliX .byte
;.zpvar dliY .byte ;.zpvar dliY .byte
.zpvar sfx_effect .byte
.zpvar RMT_blocked .byte
;--------------
displayposition = modify
;* RMT ZeroPage addresses ;* RMT ZeroPage addresses
.zpvar p_tis .word .zpvar RMT_Zero_Page_V .byte
.zpvar p_trackslbstable .word ; .zpvar p_tis .word
.zpvar p_trackshbstable .word ; .zpvar p_trackslbstable .word
.zpvar p_song .word ; .zpvar p_trackshbstable .word
.zpvar ns .word ; .zpvar p_song .word
.zpvar nr .word ; .zpvar ns .word
.zpvar nt .word ; .zpvar nr .word
.zpvar reg1 .byte ; .zpvar nt .word
.zpvar reg2 .byte ; .zpvar reg1 .byte
.zpvar reg3 .byte ; .zpvar reg2 .byte
.zpvar tmp .byte ; .zpvar reg3 .byte
IFT FEAT_COMMAND2 ; .zpvar tmp .byte
.zpvar frqaddcmd2 .byte ; IFT FEAT_COMMAND2
EIF ; .zpvar frqaddcmd2 .byte
p_instrstable = p_tis ; EIF
; p_instrstable = p_tis
displayposition = modify
;------------------------------- ;-------------------------------
icl 'lib/atari.hea' icl 'lib/atari.hea'
icl 'lib/macro.hea' icl 'lib/macro.hea'
;splash screen and musix ;splash screen and musix
icl 'artwork/HIMARS14.asm' icl 'artwork/Scorch50.asm'
;Game loading address ;Game loading address
ORG $3000 ORG $3000
WeaponFont 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 ;Screen displays go here to avoid crossing 4kb barrier
;----------------------------------------------- ;-----------------------------------------------
@@ -124,18 +132,57 @@ WeaponFont
;-------------------------------------------------- ;--------------------------------------------------
; Game Code ; 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 ; Startup sequence
jsr Initialize jsr Initialize
;jsr GameOverScreen ; only for test !!!
lda #song_main_menu
jsr RmtSongSelect
jsr Options ;startup screen jsr Options ;startup screen
lda escFlag mva #0 dmactls ; dark screen
bne START jsr WaitOneFrame
bit escFlag
bmi START
jsr EnterPlayerNames jsr EnterPlayerNames
lda escFlag mva #0 dmactls ; dark screen
bne START jsr WaitOneFrame
bit escFlag
bmi START
jsr RandomizeSequence jsr RandomizeSequence
; for the round #1 shooting sequence is random ; for the round #1 shooting sequence is random
@@ -144,15 +191,17 @@ MainGameLoop
jsr CallPurchaseForEveryTank jsr CallPurchaseForEveryTank
; issue #72 (glitches when switches) ; issue #72 (glitches when switches)
mva #0 dmactls mva #0 dmactls ; dark screen
jsr WaitOneFrame
jsr GetRandomWind jsr GetRandomWind
jsr RoundInit jsr RoundInit
jsr MainRoundLoop jsr MainRoundLoop
lda escFlag bit escFlag
bne START bmi START
jvs GoGameOver
mva #0 TankNr ; mva #0 TankNr ;
@@ -171,25 +220,12 @@ MainGameLoop
; Results are number of other deaths ; Results are number of other deaths
; before the player dies itself ; before the player dies itself
lda #song_end_round lda #song_round_over
jsr RmtSongSelect jsr RmtSongSelect
jsr DisplayResults jsr DisplayResults
;check demo mode jsr DemoModeOrKey
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
peopleAreHere
jsr getkey
noKey
ldx NumberOfPlayers ldx NumberOfPlayers
dex dex
CalculateGains CalculateGains
@@ -202,7 +238,15 @@ CalculateGains
; Important! If player has 10 energy and gets a central hit ; Important! If player has 10 energy and gets a central hit
; from nuke that would take 90 energy points, his loss ; from nuke that would take 90 energy points, his loss
; is 90, not 10 ; 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 ; add gain * 2
asl gainL,x asl gainL,x
rol gainH,x rol gainH,x
@@ -235,14 +279,50 @@ zeromoney
lda #0 lda #0
sta moneyL,x sta moneyL,x
sta moneyH,x sta moneyH,x
skipzeroing 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 dex
bpl CalculateGains jpl CalculateGains
lda GameIsOver lda GameIsOver
jne START beq NoGameOverYet
GoGameOver
mva #0 dmactls ; dark screen
jsr WaitOneFrame
jsr GameOverScreen
jmp START
NoGameOverYet
inc CurrentRoundNr inc CurrentRoundNr
lda #$0 lda #$0
sta dmactls ; issue #72 sta dmactls ; issue #72
@@ -266,9 +346,10 @@ skipzeroing
lda #song_ingame lda #song_ingame
jsr RmtSongSelect jsr RmtSongSelect
jsr SetPMWidth
lda #0 lda #0
sta sizep0 ; P0-P1 widths sta colpf2s ; status line "off"
sta sizep0+1 sta colpf1s
tax tax
@ sta singleRoundVars,x @ sta singleRoundVars,x
@@ -287,6 +368,8 @@ SettingEnergies
sta Energy,x sta Energy,x
sta eXistenZ,x sta eXistenZ,x
sta LASTeXistenZ,x sta LASTeXistenZ,x
lda #StandardBarrel ; standard barrel length
sta BarrelLength,x
; anything in eXistenZ table means that this tank exist ; anything in eXistenZ table means that this tank exist
; in the given round ; in the given round
lda #<1000 lda #<1000
@@ -319,14 +402,19 @@ SettingEnergies
jsr SetMainScreen jsr SetMainScreen
jsr ColorsOfSprites jsr ColorsOfSprites
lda #0
sta colpf2s ; status line "off" ; lda #90 ; barrel fully erect
sta colpf1s ; ldx #MaxPlayers-1
;@ sta previousBarrelAngle,x
; dex
; bpl @-
jsr drawmountains ;draw them jsr drawmountains ;draw them
jsr drawtanks ;finally draw tanks jsr drawtanks ;finally draw tanks
mva #0 TankSequencePointer mva #$00 TankSequencePointer
;---------round screen is ready--------- ;---------round screen is ready---------
mva #TextForegroundColor colpf1s ; status line "on" mva #TextForegroundColor colpf1s ; status line "on"
rts rts
@@ -410,6 +498,8 @@ DoNotFinishTheRound
ldx tankNr ldx tankNr
lda TankStatusColoursTable,x lda TankStatusColoursTable,x
sta colpf2s ; set color of status line sta colpf2s ; set color of status line
jsr PutTankNameOnScreen
jsr DisplayStatus
lda SkillTable,x lda SkillTable,x
beq ManualShooting beq ManualShooting
@@ -418,21 +508,18 @@ RoboTanks
; robotanks shoot here ; robotanks shoot here
; TankNr still in X ; TankNr still in X
jsr ArtificialIntelligence jsr ArtificialIntelligence
jsr PutTankNameOnScreen ;pause 30
jsr DisplayStatus
pause 30
ldx TankNr ldx TankNr
jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) )
jsr MoveBarrelToNewPosition jsr MoveBarrelToNewPosition
lda kbcode lda kbcode
cmp #28 ; ESC cmp #28 ; ESC
bne @+ bne @+
jsr AreYouSure jsr AreYouSure
lda escFlag bit escFlag
seq:rts spl:rts
@ @
; let's move the tank's barrel so it points the right
; direction
jmp AfterManualShooting jmp AfterManualShooting
ManualShooting ManualShooting
@@ -440,7 +527,7 @@ ManualShooting
jsr WaitForKeyRelease jsr WaitForKeyRelease
jsr BeforeFire jsr BeforeFire
lda escFlag lda escFlag
seq:rts seq:rts ; keys Esc or O
AfterManualShooting AfterManualShooting
mva #0 plot4x4color mva #0 plot4x4color
@@ -466,7 +553,7 @@ StandardShoot
jsr DecreaseWeaponBeforeShoot jsr DecreaseWeaponBeforeShoot
jsr DisplayStatus jsr DisplayStatus
ldx TankNr ; ldx TankNr
dec Energy,x ; lower energy to eventually let tanks commit suicide dec Energy,x ; lower energy to eventually let tanks commit suicide
ShootNow ShootNow
@@ -511,16 +598,16 @@ AfterExplode
NoFallDown2 NoFallDown2
;here tanks are falling down ;here tanks are falling down
mva tankNr tempor2 mva tankNr tempor2
mvx #0 TankNr ldx NumberOfPlayers
dex
TanksFallDown TanksFallDown
stx TankNr
lda eXistenZ,x lda eXistenZ,x
beq NoExistNoFall beq NoExistNoFall
jsr TankFalls jsr TankFalls
NoExistNoFall NoExistNoFall
inc:ldx TankNr dex
cpx NumberOfPlayers bpl TanksFallDown
bne TanksFallDown
mva tempor2 TankNr mva tempor2 TankNr
missed missed
@@ -538,30 +625,8 @@ NextPlayerShoots
SeteXistenZ SeteXistenZ
lda Energy,x lda Energy,x
sta eXistenZ,x sta eXistenZ,x
sta L1
jsr MaxForceCalculate
;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
dex dex
bpl SeteXistenZ bpl SeteXistenZ
@@ -736,16 +801,16 @@ ldahashzero
NotNegativeEnergy NotNegativeEnergy
sta Energy,x sta Energy,x
;now increase the gain of the shooting tank ;now increase the gain of the shooting tank
phx ; phx
ldx TankNr ldy TankNr
clc clc
lda gainL,x lda gainL,y
adc EnergyDecrease adc EnergyDecrease
sta gainL,x sta gainL,y
lda gainH,x lda gainH,y
adc #$00 adc #$00
sta gainH,x sta gainH,y
plx ; plx
rts rts
.endp .endp
@@ -787,12 +852,7 @@ NotNegativeShieldEnergy
lda #0 ; turn off defense weapons when hara-kiring lda #0 ; turn off defense weapons when hara-kiring
sta ActiveDefenceWeapon,x sta ActiveDefenceWeapon,x
sta ShieldEnergy,x sta ShieldEnergy,x
lda xtankstableL,x jsr SetupXYdraw
sta xdraw
lda xtankstableH,x
sta xdraw+1
lda yTanksTable,x
sta ydraw
lda #1 ; Missile lda #1 ; Missile
jsr ExplosionDirect jsr ExplosionDirect
jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku
@@ -826,7 +886,37 @@ NotNegativeShieldEnergy
.endr .endr
@ rts @ rts
.endp .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 .proc PMoutofScreen
;-------------------------------------------------- ;--------------------------------------------------
@@ -856,7 +946,7 @@ NotNegativeShieldEnergy
;-------------------------------------------------- ;--------------------------------------------------
ldx #$3f ; TODO: maxweapons ldx #$3f ; TODO: maxweapons
@ lda #$0 @ lda #$0
cpx #48 ; White Flag cpx #ind_White_Flag_____ ; White Flag
bne @+ bne @+
lda #99 lda #99
@ sta TanksWeapon1,x @ sta TanksWeapon1,x
@@ -890,17 +980,15 @@ deletePtr = temp
inw deletePtr inw deletePtr
cpw deletePtr #variablesEnd cpw deletePtr #variablesEnd
bne @- bne @-
mwa #1024 RandBoundaryHigh mwa #1024 RandBoundaryHigh
mva #$ff LastWeapon mva #$ff LastWeapon
sta HowMuchToFall sta HowMuchToFall
mva #1 color mva #1 color
jsr WeaponCleanup jsr SetStandardBarrels
jsr WeaponCleanup
mva #TextBackgroundColor colpf2s
mva #TextForegroundColor colpf3s
mva #>WeaponFont chbas mva #>WeaponFont chbas
;parameter for old plot (unPlot) max 5 points ;parameter for old plot (unPlot) max 5 points
@@ -925,6 +1013,47 @@ SetunPlots
; sta dmactls ; sta dmactls
lda #$03 ; P/M on lda #$03 ; P/M on
sta pmcntl 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 lda #$00
sta sizep0 ; P0-P3 widths sta sizep0 ; P0-P3 widths
sta sizep0+1 sta sizep0+1
@@ -932,43 +1061,7 @@ SetunPlots
sta sizep0+3 sta sizep0+3
lda #%01010101 lda #%01010101
sta sizem ; all missiles, double width sta sizem ; all missiles, double width
lda #%00100000 ; P/M priorities (multicolor players on) rts
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
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
.proc DLIinterruptGraph .proc DLIinterruptGraph
@@ -992,12 +1085,78 @@ ClearResults
rti rti
.endp .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 .proc DLIinterruptText
;sta dliA ;sta dliA
pha pha
sta WSYNC sta WSYNC
mva #TextBackgroundColor colpf2 mva #TextBackgroundColor COLPF2
mva #TextForegroundColor colpf3 mva #TextForegroundColor COLPF3
;lda dliA ;lda dliA
pla pla
DLIinterruptNone DLIinterruptNone
@@ -1024,7 +1183,8 @@ itsPAL
; pressTimer is trigger tick counter. always 50 ticks / s ; pressTimer is trigger tick counter. always 50 ticks / s
bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s
bit RMT_blocked
bmi SkipRMTVBL
; ------- RMT ------- ; ------- RMT -------
lda sfx_effect lda sfx_effect
bmi lab2 bmi lab2
@@ -1040,12 +1200,12 @@ itsPAL
lab2 lab2
jsr RASTERMUSICTRACKER+3 ;1 play jsr RASTERMUSICTRACKER+3 ;1 play
; ------- RMT ------- ; ------- RMT -------
SkipRMTVBL
exitVBL exitVBL
ply ply
plx plx
pla pla
jmp SYSVBV jmp XITVBV
.endp .endp
;---------------------------------------------- ;----------------------------------------------
.proc RandomizeSequence0 .proc RandomizeSequence0
@@ -1177,20 +1337,30 @@ LimitForce
.endp .endp
;---------------------------------------------- ;----------------------------------------------
.proc MoveBarrelToNewPosition .proc MoveBarrelToNewPosition
mva #1 Erase
jsr DrawTankNr.BarrelChange
mva #0 Erase
MoveBarrel
mva #sfx_set_power_2 sfx_effect
jsr DrawTankNr jsr DrawTankNr
jsr DisplayStatus.displayAngle jsr DisplayStatus.displayAngle
ldx TankNr ; ldx TankNr
mva #1 Erase
jsr WaitOneFrame
jsr DrawTankNr.BarrelChange
mva #0 Erase
lda NewAngle lda NewAngle
cmp AngleTable,x cmp AngleTable,x
beq BarrelPositionIsFine beq BarrelPositionIsFine
bcc rotateLeft ; older is bigger bcc rotateLeft ; older is bigger
rotateRight;older is lower rotateRight;older is lower
inc angleTable,x inc angleTable,x
jmp MoveBarrelToNewPosition jmp MoveBarrel
rotateLeft rotateLeft
dec angleTable,x dec angleTable,x
jmp MoveBarrelToNewPosition jmp MoveBarrel
BarrelPositionIsFine BarrelPositionIsFine
jsr DrawTankNr
rts rts
.endp .endp
@@ -1299,7 +1469,7 @@ nextishigher
and #$3f ;CTRL and SHIFT ellimination and #$3f ;CTRL and SHIFT ellimination
cmp #28 ; ESC cmp #28 ; ESC
bne getkeyend bne getkeyend
mvx #1 escFlag mvx #$80 escFlag
bne getkeyend bne getkeyend
checkJoyGetKey checkJoyGetKey
@@ -1348,6 +1518,54 @@ getkeyend
bne WaitForKeyRelease bne WaitForKeyRelease
rts rts
.endp .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 .proc RmtSongSelect
@@ -1355,9 +1573,12 @@ getkeyend
; starting song line 0-255 to A reg ; starting song line 0-255 to A reg
bit noMusic bit noMusic
spl:lda #song_silencio spl:lda #song_silencio
mvx #$ff RMT_blocked
ldx #<MODUL ;low byte of RMT module to X reg ldx #<MODUL ;low byte of RMT module to X reg
ldy #>MODUL ;hi byte of RMT module to Y reg ldy #>MODUL ;hi byte of RMT module to Y reg
jmp RASTERMUSICTRACKER ;Init, :RTS jsr RASTERMUSICTRACKER ;Init
mva #0 RMT_blocked
rts
.endp .endp
;---------------------------------------------- ;----------------------------------------------
icl 'weapons.asm' icl 'weapons.asm'
@@ -1376,7 +1597,7 @@ font4x4
ins 'artwork/font4x4s.bmp',+62 ins 'artwork/font4x4s.bmp',+62
;---------------------------------------------- ;----------------------------------------------
TankFont TankFont
ins 'artwork/tanksv2.fnt' ins 'artwork/tanksv3.fnt',+0,352 ; 44 characters only
;---------------------------------------------- ;----------------------------------------------
icl 'variables.asm' icl 'variables.asm'
;---------------------------------------------- ;----------------------------------------------
@@ -1384,26 +1605,23 @@ TankFont
; reserved space for RMT player ; reserved space for RMT player
.ds $0320 .ds $0320
.align $100 .align $100
PLAYER
.ECHO 'PLAYER: ',* .ECHO 'PLAYER: ',*
icl 'artwork/sfx/rmtplayr_game.asm' icl 'artwork/sfx/rmtplayr.a65'
MODUL equ $b000 ;address of RMT module MODUL equ $b000 ;address of RMT module
opt h- ;RMT module is standard Atari binary file already 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+ opt h+
; ;
; ;
TheEnd TheEnd
.ECHO 'TheEnd: ',TheEnd .ECHO 'TheEnd: ',TheEnd
.if TheEnd > PMGraph + $300 ;.if TheEnd > PMGraph + $300
.error "memory conflict" ; .error "memory conflict"
;.endif
.endif
;----------------------------------------------
; Player/missile memory
org $b800
PMGraph
run START
run FirstSTART
BIN
View File
Binary file not shown.
+415 -134
View File
@@ -1,4 +1,4 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0 .IF *>0
@@ -16,23 +16,55 @@
; - money each player has on the beginning of the game (moneyL i moneyH) ; - 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 ; - 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 mwa #OptionsDL dlptrs
; lda dmactls ; lda dmactls
; and #$fc ; and #$fc
; ora #$02 ; normal screen width ; 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 sta dmactls
jsr SetPMWidth
VDLI DLIinterruptText.DLIinterruptNone ; jsr SetDLI for text screen without DLIs 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 mva #0 OptionsY
OptionsMainLoop OptionsMainLoop
jsr OptionsInversion jsr OptionsInversion
jsr getkey jsr getkey
ldx escFlag bit escFlag
seq:rts spl:rts
cmp #$f ;cursor down cmp #$f ;cursor down
bne OptionsNoDown bne OptionsNoDown
@@ -222,8 +254,8 @@ OptionsYLoop
ManualPurchase ManualPurchase
jsr Purchase jsr Purchase
ldx escFlag bit escFlag
seq:rts spl:rts
AfterManualPurchase AfterManualPurchase
inc:lda TankNr inc:lda TankNr
@@ -251,6 +283,9 @@ AfterManualPurchase
; ora #$02 ; normal screen width ; 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
sta dmactls sta dmactls
lda #song_supermarket
jsr RmtSongSelect
mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons
@@ -290,8 +325,8 @@ AfterPurchase
sta decimal sta decimal
lda moneyH,x lda moneyH,x
sta decimal+1 sta decimal+1
mwa #textbuffer2+29 displayposition mwa #textbuffer2+28 displayposition
jsr displaydec jsr displaydec5
; in xbyte there is the address of the line that ; in xbyte there is the address of the line that
; is being processed now ; is being processed now
@@ -346,9 +381,6 @@ CreateList
ldy #25 ldy #25
lda #15 ; "/" lda #15 ; "/"
sta (xbyte),y sta (xbyte),y
iny
lda #04 ; "$"
sta (xbyte),y
ldy #31 ldy #31
lda #16 ; "0" lda #16 ; "0"
sta (xbyte),y sta (xbyte),y
@@ -361,12 +393,15 @@ CreateList
ldx temp ;getting back index of the weapon ldx temp ;getting back index of the weapon
; and now price 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 lda WeaponPriceL,x
sta decimal sta decimal
lda WeaponPriceH,x lda WeaponPriceH,x
sta decimal+1 sta decimal+1
jsr displaydec jsr displaydec5
ldy #26 ; overwrite first digit (allways space - no digit :) )
lda #04 ; "$"
sta (xbyte),y
jmp notInventory jmp notInventory
@@ -623,8 +658,8 @@ ChoosingItemForPurchase
jsr PutLitteChar ; Places pointer at the right position jsr PutLitteChar ; Places pointer at the right position
jsr getkey jsr getkey
ldx escFlag bit escFlag
seq:jmp WaitForKeyRelease ; like jsr ... : rts spl:jmp WaitForKeyRelease ; like jsr ... : rts
cmp #$2c ; Tab cmp #$2c ; Tab
jeq ListChange jeq ListChange
cmp #$06 ; cursor left cmp #$06 ; cursor left
@@ -795,27 +830,35 @@ invSelectDef
lda IndexesOfWeaponsL2,y lda IndexesOfWeaponsL2,y
tay tay
ldx tankNr ldx tankNr
cmp #ind_Battery________ cmp #ind_Battery________
bne NotBattery bne NotBattery
; if activate battery, we do it differently ; if activate battery, we do it differently
mva #sfx_battery sfx_effect mva #sfx_battery sfx_effect
mva #99 Energy,x mva #99 Energy,x
bne DecreaseDefensive ; bypass activation jsr MaxForceCalculate
jmp DecreaseDefensive ; bypass activation
NotBattery NotBattery
cmp #ind_White_Flag_____ cmp #ind_Long_Barrel____
bne NotWhiteFlag bne NotBarrel
cmp ActiveDefenceWeapon,x ; if activate long barrel, we do it differently too
bne NoDeactivateWhiteFlag mva #sfx_long_barrel sfx_effect
mva #sfx_white_flag sfx_effect mva #LongBarrel BarrelLength,x
lda #$00 ; if try to activate activated White Flag then deactivate Defence 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 ActiveDefenceWeapon,x
sta ShieldEnergy,x sta ShieldEnergy,x
beq DefActivationEnd beq DefActivationEnd
NotWhiteFlag NotWhiteFlag
NoDeactivateWhiteFlag NoDeactivateWhiteFlag
; activate new defensive ; activate new defensive
sta ActiveDefenceWeapon,x sta ActiveDefenceWeapon,x
; set defensive energy ; set defensive energy
lda DefensiveEnergy,y lda DefensiveEnergy,y
sta ShieldEnergy,x sta ShieldEnergy,x
DecreaseDefensive DecreaseDefensive
@@ -983,8 +1026,8 @@ NoArrowDown
lda TankStatusColoursTable,x lda TankStatusColoursTable,x
sta colpf2s ; set color of player name line sta colpf2s ; set color of player name line
jsr EnterPlayerName jsr EnterPlayerName
lda escFlag bit escFlag
seq:rts spl:rts
inc TankNr inc TankNr
lda TankNr lda TankNr
cmp NumberOfPlayers cmp NumberOfPlayers
@@ -1043,8 +1086,8 @@ endOfTankName
CheckKeys CheckKeys
jsr getkey jsr getkey
ldx escFlag bit escFlag
seq:rts spl:rts
; is the char to be recorded? ; is the char to be recorded?
ldx #keycodesEnd-keycodes ;table was 38 chars long ldx #keycodesEnd-keycodes ;table was 38 chars long
@@ -1154,6 +1197,8 @@ EndOfNick
asl ; 8 chars per name asl ; 8 chars per name
tax ; in X where to put new name tax ; in X where to put new name
mva #sfx_next_player sfx_effect
lda NameAdr ; check if first char is " " lda NameAdr ; check if first char is " "
and #$7F ; remove inverse (Cursor) and #$7F ; remove inverse (Cursor)
beq MakeDefaultName beq MakeDefaultName
@@ -1175,7 +1220,6 @@ nextchar05
iny iny
cpy #$08 cpy #$08
bne nextchar05 bne nextchar05
mva #sfx_next_player sfx_effect
rts rts
.endp .endp
@@ -1213,13 +1257,13 @@ CheckNextLevel
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
.proc displaydec ;decimal (word), displayposition (word) .proc displaydec5 ;decimal (word), displayposition (word)
;-------------------------------------------------- ;--------------------------------------------------
; displays decimal number as in parameters (in text mode) ; displays decimal number as in parameters (in text mode)
; leading zeroes are removed ; 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 NextDigit
ldx #16 ; 16-bit dividee so Rotate 16 times ldx #16 ; 16-bit dividee so Rotate 16 times
lda #$00 lda #$00
@@ -1243,39 +1287,31 @@ TooLittle000 dex
dey dey
bpl NextDigit ; Result again /10 and we have next digit bpl NextDigit ; Result again /10 and we have next digit
;rightnumber
rightnumber ; displaying without leading zeroes (if zeroes exist then display space at this position)
; now cut leading zeroes (002 goes 2) ldy #0
lda decimalresult ldx #0 ; digit flag (cut leading zeroes)
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
displayloop displayloop
lda decimalresult,y 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 sta (displayposition),y
dey nexdigit
bpl displayloop iny
cpy #5
bne displayloop
rts rts
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
.proc displaybyte ;decimal (byte), displayposition (word) .proc displaybyte ;decimal (byte), displayposition (word)
;-------------------------------------------------- ;--------------------------------------------------
@@ -1324,11 +1360,6 @@ displayloop1
rts rts
.endp .endp
;-------decimal constans
zero
digits dta d"0123456789"
nineplus dta d"9"+1
space dta d" "
;-------------------------------------------------------- ;--------------------------------------------------------
.proc Display4x4AboveTank ; .proc Display4x4AboveTank ;
@@ -1584,11 +1615,11 @@ EndOfTypeLine4x4
jsr GetKey jsr GetKey
cmp #$2b ; "Y" cmp #$2b ; "Y"
bne @+ bne @+
mva #1 escFlag mva #$80 escFlag
bne skip01 bne skip01
@ mva #0 escFlag @ mva #0 escFlag
jsr WaitForKeyRelease
skip01 skip01
jsr WaitForKeyRelease
;clean ;clean
mva #3 di mva #3 di
@@ -1692,7 +1723,7 @@ quit_seppuku
beq @+ ;unconditional jump, because TypeLine4x4 ends with beq beq @+ ;unconditional jump, because TypeLine4x4 ends with beq
GameOver4x4 GameOver4x4
lda #song_game_over lda #song_round_over
jsr RmtSongSelect jsr RmtSongSelect
mwa #LineGameOver LineAddress4x4 mwa #LineGameOver LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw mwa #((ScreenWidth/2)-(8*4)) LineXdraw
@@ -1743,11 +1774,21 @@ ResultOfTheNextPlayer
;there are at least 2 players, so we can safely ;there are at least 2 players, so we can safely
;start displaying the result ;start displaying the result
ldx #0
lda #3 ;it means | 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 lda TankNr
asl asl
asl ; times 8, because it is lengtgh asl ; times 8, because it is lengtgh
@@ -1762,18 +1803,8 @@ TankNameCopyLoop
iny iny
cpx #8 ; end of name cpx #8 ; end of name
bne TankNameCopyLoop 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 ;just after the digits
;it means | ;it means |
@@ -1828,6 +1859,256 @@ FinishResultDisplay
jmp TypeLine4x4 ; jsr:rts jmp TypeLine4x4 ; jsr:rts
.endp .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 .proc DisplayStatus
;------------------------------------------------- ;-------------------------------------------------
@@ -1878,17 +2159,17 @@ FinishResultDisplay
;--------------------- ;---------------------
;displaying name of the defence weapon (if active) ;displaying name of the defence weapon (if active)
;--------------------- ;---------------------
lda #$08 ; ( lda #$08 ; (
sta textbuffer+80+22 sta textbuffer+80+22
lda #$09 ; ) lda #$09 ; )
sta textbuffer+80+39 sta textbuffer+80+39
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
bne ActiveDefence bne ActiveDefence
; clear brackets ; clear brackets
lda #$00 ; space lda #$00 ; space
sta textbuffer+80+22 sta textbuffer+80+22
sta textbuffer+80+39 sta textbuffer+80+39
lda #47 ; no weapon name lda #47 ; no weapon name
ActiveDefence ActiveDefence
sta temp ;get back number of the weapon sta temp ;get back number of the weapon
mva #0 temp+1 mva #0 temp+1
@@ -1921,26 +2202,26 @@ ActiveDefence
;--------------------- ;---------------------
;displaying the energy of a tank shield (if exist) ;displaying the energy of a tank shield (if exist)
;--------------------- ;---------------------
; clear (if no shield) ; clear (if no shield)
lda #$00 ; space lda #$00 ; space
sta textbuffer+40+10 sta textbuffer+40+10
sta textbuffer+40+11 sta textbuffer+40+11
sta textbuffer+40+12 sta textbuffer+40+12
sta textbuffer+40+13 sta textbuffer+40+13
; check shield energy and display it ; check shield energy and display it
ldx TankNr ldx TankNr
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
beq NoDefenceWeapon beq NoDefenceWeapon
lda ShieldEnergy,x lda ShieldEnergy,x
beq NoShieldEnergy beq NoShieldEnergy
sta decimal ; displayed value sta decimal ; displayed value
lda #$08 ; ( lda #$08 ; (
sta textbuffer+40+10 sta textbuffer+40+10
mwa #textbuffer+40+11 displayposition mwa #textbuffer+40+11 displayposition
jsr displaybyte jsr displaybyte
lda #$09 ; ) lda #$09 ; )
sta textbuffer+40+13 sta textbuffer+40+13
NoDefenceWeapon NoDefenceWeapon
NoShieldEnergy NoShieldEnergy
;========================= ;=========================
@@ -1989,8 +2270,8 @@ DisplayWindValue
sta decimal sta decimal
lda ForceTableH,x lda ForceTableH,x
sta decimal+1 sta decimal+1
mwa #textbuffer+40+36 displayposition mwa #textbuffer+40+35 displayposition
jsr displaydec jsr displaydec5
;========================= ;=========================
;display Angle ;display Angle
@@ -1998,30 +2279,30 @@ DisplayWindValue
displayAngle displayAngle
ldx TankNr ldx TankNr
lda AngleTable,x lda AngleTable,x
cmp #90 cmp #90
beq VerticallyUp beq VerticallyUp
bcs AngleToLeft bcs AngleToLeft
AngleToRight 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 sta decimal
lda #$7f ; (tab) character lda #$7f ; (tab) character
sta textbuffer+40+25 sta textbuffer+40+25
lda #0 ;space lda #0 ;space
sta textbuffer+40+22 sta textbuffer+40+22
beq AngleDisplay beq AngleDisplay
AngleToLeft AngleToLeft
sec sec
lda #180 lda #180
sbc AngleTable,x sbc AngleTable,x
; angles 180 - 91 converted to 0 - 89 ; angles 180 - 91 converted to 0 - 89
sta decimal sta decimal
lda #$7e ;(del) char lda #$7e ;(del) char
sta textbuffer+40+22 sta textbuffer+40+22
lda #0 ;space lda #0 ;space
sta textbuffer+40+25 sta textbuffer+40+25
beq AngleDisplay beq AngleDisplay
VerticallyUp VerticallyUp
; now we have value 90 ; now we have value 90
sta decimal sta decimal
lda #0 ;space lda #0 ;space
sta textbuffer+40+25 sta textbuffer+40+25
@@ -2030,7 +2311,7 @@ VerticallyUp
AngleDisplay AngleDisplay
mwa #textbuffer+40+23 displayposition mwa #textbuffer+40+23 displayposition
jsr displaybyte jsr displaybyte
ldx TankNr
rts rts
.endp .endp
;------------------------------------------------- ;-------------------------------------------------
+41 -19
View File
@@ -8,21 +8,29 @@
; compilation to e.g. cartridge ; compilation to e.g. cartridge
; zero page variables are declared in program.s65 module ; 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" " :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 OptionsTable .by 0,1,2,2,0,1,3,2
RoundsInTheGame .by 10 ;how many rounds in the current game RoundsInTheGame .by 10 ;how many rounds in the current game
seppukuVal .by 75 seppukuVal .by 75
mountainDeltaH .by 3 mountainDeltaH .by 3
mountainDeltaL .by $ff 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 ; 4x4 text buffer
ResultLineBuffer ResultLineBuffer
dta d" ", $ff 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) drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
;-------------- ;--------------
sfx_effect .ds 1
;--------------
noDeathCounter .ds 1 noDeathCounter .ds 1
;-------------- ;--------------
OptionsY .ds 1 ;vertical position of cursor on Options screen OptionsY .ds 1 ;vertical position of cursor on Options screen
@@ -84,6 +90,14 @@ ResultsTable ;the results in the gameeeeee
.DS [MaxPlayers] .DS [MaxPlayers]
TempResults TempResults
.DS [MaxPlayers] .DS [MaxPlayers]
DirectHitsH
.DS [MaxPlayers]
DirectHitsL
.DS [MaxPlayers]
EarnedMoneyH
.DS [MaxPlayers]
EarnedMoneyL
.DS [MaxPlayers]
;---------------------------------------------------- ;----------------------------------------------------
ForceTableL ;shooting Force of the tank during the round ForceTableL ;shooting Force of the tank during the round
.DS [MaxPlayers] .DS [MaxPlayers]
@@ -95,12 +109,8 @@ MaxForceTableL ;Energy of the tank during the round
MaxForceTableH MaxForceTableH
.DS [MaxPlayers] .DS [MaxPlayers]
;---------------------------------------------------- ;----------------------------------------------------
BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round start!
AngleTable ;Angle of the barrel of each tank during the round
.DS [MaxPlayers] .DS [MaxPlayers]
NewAngle .DS 1
;----------------------------------------------------
ActiveWeapon ;number of the selected weapon ActiveWeapon ;number of the selected weapon
.DS [MaxPlayers] .DS [MaxPlayers]
ActiveDefenceWeapon ;number of the activated defence weapon - 0 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) LowResDistances ; coarse tank positions divided by 4 (to be in just one byte)
.DS [MaxPlayers] .DS [MaxPlayers]
;---------------------------------------------------- ;----------------------------------------------------
TargetTankNr ; Target tank index (for AI routines)
.DS 1
;----------------------------------------------------
Erase .DS 1 ; if 1 only mask of the character is printed Erase .DS 1 ; if 1 only mask of the character is printed
; on the graphics screen. if 0 character is printed normally ; on the graphics screen. if 0 character is printed normally
@@ -286,7 +299,7 @@ DifficultyLevel ; Difficulty Level (human/cpu)
;---------------------------------------------------- ;----------------------------------------------------
;displaydecimal ;displaydecimal
decimal .DS 2 decimal .DS 2
decimalresult .DS 4 decimalresult .DS 5
;xmissile ;xmissile
ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte
@@ -339,11 +352,22 @@ TankTempY
;---------------------------------------------------- ;----------------------------------------------------
singleRoundVars singleRoundVars
;-------------- ;--------------
escFlag .ds 1 escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed
;-------------- ;--------------
CurrentResult CurrentResult
.DS 1 .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 previousAngle
.DS [MaxPlayers] .DS [MaxPlayers]
previousEnergyL previousEnergyL
@@ -352,8 +376,6 @@ previousLeftRange
.DS [MaxPlayers] .DS [MaxPlayers]
previousEnergyH previousEnergyH
.DS [MaxPlayers] .DS [MaxPlayers]
previousRightAngle
.DS [MaxPlayers]
RandBoundaryLow RandBoundaryLow
.ds 2 .ds 2
RandBoundaryHigh RandBoundaryHigh
+172 -113
View File
@@ -283,6 +283,7 @@ NoLowerCircle
.endp .endp
; ------------------------ ; ------------------------
.proc napalm .proc napalm
mva #sfx_napalm sfx_effect
inc FallDown2 inc FallDown2
mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width)
jsr CalculateExplosionRange jsr CalculateExplosionRange
@@ -291,6 +292,7 @@ NoLowerCircle
.endp .endp
; ------------------------ ; ------------------------
.proc hotnapalm .proc hotnapalm
mva #sfx_napalm sfx_effect
inc FallDown2 inc FallDown2
mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width)
jsr CalculateExplosionRange jsr CalculateExplosionRange
@@ -331,10 +333,10 @@ RepeatFlame ; internal loop (draw flames)
lda random lda random
and #%00000110 and #%00000110
clc clc
adc #$46 adc #char_flame___________
bne PutFlameChar bne PutFlameChar
LastNapalmRepeat LastNapalmRepeat
lda #$4e ; clear flame symbol lda #char_clear_flame_____ ; clear flame symbol
PutFlameChar PutFlameChar
sta CharCode sta CharCode
; check coordinates ; check coordinates
@@ -569,7 +571,7 @@ DiggerCharacter
lda random lda random
and #$06 and #$06
clc clc
adc #$36 adc #char_digger__________
adc sandhogflag adc sandhogflag
sta CharCode sta CharCode
cpw xdraw #(screenwidth-6) cpw xdraw #(screenwidth-6)
@@ -579,7 +581,7 @@ DiggerCharacter
; ------------------------ ; ------------------------
.proc babysandhog .proc babysandhog
mva #sfx_sandhog sfx_effect mva #sfx_sandhog sfx_effect
mva #8 sandhogflag mva #char_sandhog_offset sandhogflag
inc FallDown2 inc FallDown2
mva #13 DigLong mva #13 DigLong
mva #1 diggery ; how many branches (-1) mva #1 diggery ; how many branches (-1)
@@ -588,7 +590,7 @@ DiggerCharacter
; ------------------------ ; ------------------------
.proc sandhog .proc sandhog
mva #sfx_sandhog sfx_effect mva #sfx_sandhog sfx_effect
mva #8 sandhogflag mva #char_sandhog_offset sandhogflag
inc FallDown2 inc FallDown2
mva #13 DigLong mva #13 DigLong
mva #3 diggery ; how many branches (-1) mva #3 diggery ; how many branches (-1)
@@ -597,7 +599,7 @@ DiggerCharacter
; ------------------------ ; ------------------------
.proc heavysandhog .proc heavysandhog
mva #sfx_sandhog sfx_effect mva #sfx_sandhog sfx_effect
mva #8 sandhogflag mva #char_sandhog_offset sandhogflag
inc FallDown2 inc FallDown2
mva #13 DigLong mva #13 DigLong
mva #5 diggery ; how many branches (-1) mva #5 diggery ; how many branches (-1)
@@ -661,20 +663,25 @@ DiggerCharacter
ldx TankNr ldx TankNr
lda AngleTable,x lda AngleTable,x
tay tay
clc
lda xtankstableL,x mwa EndOfTheBarrelX xbyte
adc EndOfTheBarrelX,y ; correction of the end of the barrel point (X) mva EndOfTheBarrelY ybyte
sta xbyte mva #0 ybyte+1
lda xtankstableH,x
adc #0 ;clc
sta xbyte+1 ;lda xtankstableL,x
sec ;adc EndOfTheBarrelX,y ; correction of the end of the barrel point (X)
lda ytankstable,x ;sta xbyte
sbc EndOfTheBarrelY,y ; correction of the end of the barrel point (Y) ;lda xtankstableH,x
sta ybyte ;adc #0
lda #$00 ;sta xbyte+1
sbc #$00 ;sec
sta ybyte+1 ;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 xdraw LaserCoordinate
mwa ydraw LaserCoordinate+2 mwa ydraw LaserCoordinate+2
@@ -759,10 +766,10 @@ ExplosionLoop2
;calculation ;calculation
ldx NumberOfPlayers ldx NumberOfPlayers
dex
DistanceCheckLoop DistanceCheckLoop
dex
lda eXistenZ,x lda eXistenZ,x
beq EndOfDistanceCheckLoop jeq EndOfDistanceCheckLoop
;here the tank exist ;here the tank exist
lda XtankstableL,x lda XtankstableL,x
clc clc
@@ -803,7 +810,7 @@ DistanceCheckLoop
beq UseShieldWithEnergy beq UseShieldWithEnergy
cmp #ind_Heavy_Shield___ ; shield with energy cmp #ind_Heavy_Shield___ ; shield with energy
beq UseShieldWithEnergy 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 beq UseShieldWithEnergy
cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc) cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
beq UseShieldWithEnergy beq UseShieldWithEnergy
@@ -820,14 +827,21 @@ ShieldCoveredTank
ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :)
UseShield UseShield
mva #1 Erase mva #1 Erase
phx lda TankNr
jsr DrawTankShield pha ; store TankNr
plx stx TankNr ; store X in TankNr :)
mva #0 ActiveDefenceWeapon,x ; deactivate defense weapons 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 TankIsNotWithinTheRange
EndOfDistanceCheckLoop EndOfDistanceCheckLoop
txa dex
jne DistanceCheckLoop jpl DistanceCheckLoop
mva #sfx_silencer sfx_effect mva #sfx_silencer sfx_effect
rts rts
.endp .endp
@@ -881,8 +895,8 @@ Rollin
sta HeightRol ; relative point sta HeightRol ; relative point
RollinContinues RollinContinues
wait jsr WaitOneFrame
wait jsr WaitOneFrame
; new point is set ; new point is set
adw xdraw #mountaintable tempXROLLER adw xdraw #mountaintable tempXROLLER
ldy #0 ldy #0
@@ -1019,7 +1033,7 @@ NoColor ; jump here with color=0 to clean dirt
; current dirt width ; current dirt width
sta magic sta magic
NextRow NextRow
wait jsr WaitOneFrame
ldy magic ldy magic
NextLine NextLine
lda random lda random
@@ -1134,6 +1148,7 @@ ToHighFill
;first, get current parameters (angle+force) ;first, get current parameters (angle+force)
;for an active tank and display them ;for an active tank and display them
;(these values are taken from the previous round) ;(these values are taken from the previous round)
mva #0 Erase
ldx TankNr ldx TankNr
@@ -1155,7 +1170,7 @@ ContinueToCheckMaxForce2
jsr DrawTankNr jsr DrawTankNr
wait ; best after drawing a tank jsr WaitOneFrame ; best after drawing a tank
@@ -1176,11 +1191,20 @@ notpressed
lda kbcode lda kbcode
and #%10111111 ; SHIFT elimination 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 cmp #28 ; ESC
bne @+ bne @+
jsr AreYouSure jsr AreYouSure
lda escFlag bit escFlag
beq notpressed bpl notpressed
;---esc pressed-quit game--- ;---esc pressed-quit game---
rts rts
@@ -1195,9 +1219,14 @@ callInventory
; ;
mva #$ff isInventory mva #$ff isInventory
jsr Purchase jsr Purchase
mva #0 dmactls ; dark screen
jsr WaitOneFrame
lda #song_ingame
jsr RmtSongSelect
mva #0 escFlag mva #0 escFlag
jsr DisplayStatus jsr DisplayStatus
jsr SetMainScreen jsr SetMainScreen
jsr WaitOneFrame
jsr DrawTanks jsr DrawTanks
jsr WaitForKeyRelease jsr WaitForKeyRelease
jmp BeforeFire jmp BeforeFire
@@ -1325,61 +1354,69 @@ CTRLPressedDown
jmp BeforeFire jmp BeforeFire
pressedRight pressedRight
ldx TankNr
lda pressTimer lda pressTimer
spl:mva #0 pressTimer ; if >128 then reset to 0 spl:mva #0 pressTimer ; if >128 then reset to 0
cmp #25 ; 1/2s cmp #25 ; 1/2s
bcs CTRLPressedRight bcs CTRLPressedRight
mva #sfx_set_power_2 sfx_effect mva #sfx_set_power_2 sfx_effect
ldx TankNr mva #1 Erase
jsr DrawTankNr.BarrelChange
dec AngleTable,x dec AngleTable,x
lda AngleTable,x lda AngleTable,x
cmp #255 ; -1 cmp #255 ; -1
jne BeforeFire jne BeforeFire
lda #180 lda #179
sta AngleTable,x sta AngleTable,x
jmp BeforeFire jmp BeforeFire
CTRLPressedRight CTRLPressedRight
mva #sfx_set_power_2 sfx_effect
ldx TankNr ldx TankNr
mva #sfx_set_power_2 sfx_effect
mva #1 Erase
jsr DrawTankNr.BarrelChange
lda AngleTable,x lda AngleTable,x
sec sec
sbc #4 sbc #4
sta AngleTable,x sta AngleTable,x
cmp #4 ; smalles angle for speed rotating cmp #4 ; smallest angle for speed rotating
jcs BeforeFire jcs BeforeFire
lda #180 lda #179
sta AngleTable,x sta AngleTable,x
jmp BeforeFire jmp BeforeFire
pressedLeft pressedLeft
ldx TankNr
lda pressTimer lda pressTimer
spl:mva #0 pressTimer ; if >128 then reset to 0 spl:mva #0 pressTimer ; if >128 then reset to 0
cmp #25 ; 1/2s cmp #25 ; 1/2s
bcs CTRLPressedLeft bcs CTRLPressedLeft
mva #sfx_set_power_2 sfx_effect mva #sfx_set_power_2 sfx_effect
ldx TankNr mva #1 Erase
jsr DrawTankNr.BarrelChange
INC AngleTable,x INC AngleTable,x
lda AngleTable,x lda AngleTable,x
cmp #181 cmp #180
jne BeforeFire jne BeforeFire
lda #0 lda #1
sta AngleTable,x sta AngleTable,x
jmp BeforeFire jmp BeforeFire
CTRLPressedLeft CTRLPressedLeft
mva #sfx_set_power_2 sfx_effect
ldx TankNr ldx TankNr
mva #sfx_set_power_2 sfx_effect
mva #1 Erase
jsr DrawTankNr.BarrelChange
lda AngleTable,x lda AngleTable,x
clc clc
adc #4 adc #4
sta AngleTable,x sta AngleTable,x
cmp #181-4 cmp #180-4
jcc BeforeFire jcc BeforeFire
lda #0 lda #1
sta AngleTable,x sta AngleTable,x
jmp BeforeFire jmp BeforeFire
@@ -1484,38 +1521,26 @@ NotStrongShoot
sta Force+1 sta Force+1
mva #sfx_shoot sfx_effect mva #sfx_shoot sfx_effect
AfterStrongShoot AfterStrongShoot
lda #$0
sta Force+2
lda AngleTable,x lda AngleTable,x
sta Angle sta Angle
lda #0
sta xtraj
sta ytraj
; Shoots tank nr X !!! :) ; Shoots tank nr X !!! :)
; set the starting coordinates of bullet with correction ; set the starting coordinates of bullet with correction
; to start where the tank's barrel ends ; to start where the tank's barrel ends
; (without it bullet would go from the left lower corner of the tank) ; (without it bullet would go from the left lower corner of the tank)
;ldx TankNr ;ldx TankNr
ldy Angle
clc mwa EndOfTheBarrelX xtraj+1
lda xtankstableL,x mva EndOfTheBarrely ytraj+1
adc EndOfTheBarrelX,y ; correction of X lda #0
sta xtraj+1 sta Force+2
lda xtankstableH,x sta ytraj+2
adc #$00 sta xtraj
sta xtraj+2 sta ytraj
sec sta TestFlightFlag
lda ytankstable,x
sbc EndOfTheBarrelY,y ; correction of Y
sta ytraj+1
lda #$00
sbc #$00
sta ytraj+2
; checking if the shot is underground (no Flight but Hit :) ) ; checking if the shot is underground (no Flight but Hit :) )
ldy #0 tay ; A=0 !
adw xtraj+1 #mountaintable temp adw xtraj+1 #mountaintable temp
lda ytraj+1 lda ytraj+1
cmp (temp),y ; check collision witch mountains cmp (temp),y ; check collision witch mountains
@@ -1533,6 +1558,7 @@ ShotUnderGround
;-------------------------------------------------- ;--------------------------------------------------
.proc Flight ; Force(byte.byte), Wind(0.word) .proc Flight ; Force(byte.byte), Wind(0.word)
; Angle(byte) 128=0, 255=maxright, 0=maxleft ; Angle(byte) 128=0, 255=maxright, 0=maxleft
; if TestFlightFlag is set ($ff) ne real flight - hit test only (for AI)
;-------------------------------------------------- ;--------------------------------------------------
;g=-0.1 ;g=-0.1
;vx=Force*cos(Angle) ;vx=Force*cos(Angle)
@@ -1764,6 +1790,8 @@ NoWind
mwa xtraj+1 XtrajOld+1 mwa xtraj+1 XtrajOld+1
mwa ytraj+1 YtrajOld+1 mwa ytraj+1 YtrajOld+1
bit TestFlightFlag
bmi nowait
lda tracerflag lda tracerflag
bne nowait bne nowait
lda color lda color
@@ -1802,7 +1830,9 @@ SkipCollisionCheck
mwa xtraj+1 xdraw mwa xtraj+1 xdraw
mwa ytraj+1 ydraw mwa ytraj+1 ydraw
bit TestFlightFlag
bmi NoUnPlot
lda tracerflag lda tracerflag
bne NoUnPlot bne NoUnPlot
@@ -1815,7 +1845,8 @@ NoUnPlot
Hit Hit
mwa XHit xdraw mwa XHit xdraw
mwa YHit ydraw mwa YHit ydraw
bit TestFlightFlag
bmi EndOfFlight
jsr unPlot jsr unPlot
EndOfFlight EndOfFlight
mwa xdraw xcircle ; we must store for a little while mwa xdraw xcircle ; we must store for a little while
@@ -1834,18 +1865,31 @@ EndOfFlight
EndOfFlight2 EndOfFlight2
mva #0 tracerflag ; don't know why mva #0 tracerflag ; don't know why
bit TestFlightFlag
jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check
; and now check for defensive-aggressive weapon ; and now check for defensive-aggressive weapon
lda HitFlag lda HitFlag
jeq NoHitAtEndOfFight ; RTS only !!! jeq NoHitAtEndOfFight ; RTS only !!!
jmi NoTankHitAtEndOfFight 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 ; tank hit - check defensive weapon of this tank
tax tax
dex ; index of tank in X dex ; index of tank in X
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
cmp #ind_Auto_Defense___ ; Auto Defence cmp #ind_Bouncy_Castle__ ; Auto Defence
beq AutoDefence jeq BouncyCastle
cmp #ind_Mag_Deflector__ ; Mag Deflector cmp #ind_Mag_Deflector__ ; Mag Deflector
bne NoDefence beq MagDeflector
jmp NoDefence
MagDeflector MagDeflector
; now run defensive-aggressive weapon - Mag Deflector! ; now run defensive-aggressive weapon - Mag Deflector!
; get tank position ; get tank position
@@ -1872,28 +1916,47 @@ RightDeflection
bcs EndOfMagDeflector ; hit of course but we need RTS bcs EndOfMagDeflector ; hit of course but we need RTS
sbw XHit #36 ; change to left sbw XHit #36 ; change to left
EndOfMagDeflector 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? !!! mwa XHit xdraw ; why? !!!
NoTankHitAtEndOfFight NoTankHitAtEndOfFight
NoHitAtEndOfFight NoHitAtEndOfFight
NoDefence NoDefence
lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2
rts ; END !!! rts ; END !!!
AutoDefence BouncyCastle
; now run defensive-aggressive weapon - Auto Defence! 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) 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 lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2
mva #1 Erase ; now erase shield mva #1 Erase
phx lda TankNr
jsr DrawTankShield pha ; store TankNr
jsr DrawTankShieldHorns stx TankNr ; store X in TankNr :)
plx jsr DrawTankNr ; now erase tank with shield (to erase shield)
lda #$00 lda #0
sta Erase sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon
sta ActiveDefenceWeapon,x ; deactivate used Auto Defence
sta ShieldEnergy,x sta ShieldEnergy,x
sta xtraj ; prepare coordinates sta xtraj ; prepare coordinates
sta ytraj sta ytraj
sta xtraj+2 sta xtraj+2
sta ytraj+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 mwa XHit xtraj+1
sbw YHit #5 ytraj+1 sbw YHit #5 ytraj+1
mva #1 color mva #1 color
@@ -1918,30 +1981,25 @@ AutoDefence
sta xtraj sta xtraj
sta ytraj sta ytraj
lda xtankstableL,x mwa EndOfTheBarrelX xbyte
sta xtraj+1 mva EndOfTheBarrelY ybyte
lda xtankstableH,x mva #0 ybyte+1
sta xtraj+2
lda ytankstable,x
sta ytraj+1
lda #$00
sta ytraj+2
ldy Angle ; ldy Angle
clc ; clc
lda xtraj+1 ; lda xtraj+1
adc EndOfTheBarrelX,y ; correction of X ; adc EndOfTheBarrelX,y ; correction of X
sta xtraj+1 ; sta xtraj+1
lda xtraj+2 ; lda xtraj+2
adc #0 ; adc #0
sta xtraj+2 ; sta xtraj+2
sec ; sec
lda ytraj+1 ; lda ytraj+1
sbc EndOfTheBarrelY,y ; correction of Y ; sbc EndOfTheBarrelY,y ; correction of Y
sta ytraj+1 ; sta ytraj+1
lda ytraj+2 ; lda ytraj+2
sbc #0 ; sbc #0
sta ytraj+2 ; sta ytraj+2
ldy #100 ; ??? ldy #100 ; ???
mva #1 tracerflag ; I do not know (I mean I think I know ;) ) mva #1 tracerflag ; I do not know (I mean I think I know ;) )
@@ -2285,7 +2343,8 @@ MIRValreadyAll
jsr FlashTank ; first we flash tank jsr FlashTank ; first we flash tank
mva #1 Erase mva #1 Erase
jsr DrawTankNr ; and erase tank jsr DrawTankNr ; and erase tank
mva #0 Erase lda #0
sta Erase
ldx TankNr ldx TankNr
sta Energy,x ; clear tank energy sta Energy,x ; clear tank energy
sta eXistenZ,x ; erase from existence sta eXistenZ,x ; erase from existence
@@ -2318,7 +2377,7 @@ NextLine1
dex dex
bpl NextLine1 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 ; second loop - inverse again and put random "snow" to column of bytes
ldx #120 ldx #120
ldy magic ldy magic
@@ -2374,7 +2433,8 @@ InverseScreenByte
; XHit , YHit - coordinates of hit ; XHit , YHit - coordinates of hit
; X - index of the hit tank ; X - index of the hit tank
ldx #0 ldx NumberOfPlayers
dex
CheckCollisionWithTankLoop CheckCollisionWithTankLoop
lda eXistenZ,x lda eXistenZ,x
beq DeadTank beq DeadTank
@@ -2420,9 +2480,8 @@ LeftFromTheTank
OverTheTank OverTheTank
BelowTheTank BelowTheTank
DeadTank DeadTank
inx dex
cpx NumberOfPlayers bpl CheckCollisionWithTankLoop
bne CheckCollisionWithTankLoop
rts rts
CheckCollisionWithShieldedTank CheckCollisionWithShieldedTank
; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield)