Compare commits

..

66 Commits

Author SHA1 Message Date
Pirx 4fe360d63c Merge pull request #100 from pkali/develop
build 145
2022-06-26 22:19:22 -04:00
Pirx c9ceb58117 build 145 2022-06-26 22:18:16 -04:00
Pirx e10514debd forgot about rounds... #76 2022-06-26 21:48:46 -04:00
Pirx 2907fe7a91 whiter color of pale #76 2022-06-26 21:26:22 -04:00
Pirx a0d5d22e74 small musique fixum-dyrdum 2022-06-26 11:21:35 -04:00
Pirx 1ea62798c8 sonico a musica nueva 2022-06-25 18:02:50 -04:00
Pirx 42facad64e wrong inventory position fix 2022-06-25 10:29:12 -04:00
Pecusx 2c98d73877 Nuclear Winter optimization - we save 4 bytes
:)
2022-06-22 17:28:31 +02:00
Pecusx 4ae4403448 Battery added! 2022-06-21 13:11:07 +02:00
Pecusx 242bc4586c Optimization - we save 15 bytes 2022-06-21 12:51:49 +02:00
Pecusx eda0e65189 Small bugfix 2022-06-21 12:38:17 +02:00
Pecusx 8613854f80 cosmetics 2022-06-21 11:34:05 +02:00
Pecusx 1c277b0e6f Nuclear Winter added. 2022-06-21 11:25:45 +02:00
Pecusx 623c9c9583 White Flag works! 2022-06-20 21:01:01 +02:00
Pecusx ce55bf0d97 Wrong parachute symbol :) 2022-06-20 14:34:36 +02:00
Pecusx 537f88e4c6 Deactivate defensive weapon now possible.
If you activate previously activated White Flag, you deactivate defensive weapons.
2022-06-20 14:07:53 +02:00
Pecusx 9aaa4fec69 Displaying White Flag and inverse reaction to fire button. 2022-06-20 13:23:36 +02:00
Pecusx 67b5dfb110 Strong Parachute (with energy) added!
and defensive (really all) weapons indexes (numbers) as constans.
2022-06-20 10:43:16 +02:00
Pirx 4200e60d47 Merge pull request #96 from pkali/develop
Develop
2022-06-19 20:23:25 -04:00
Pirx 7324203925 README 2022-06-19 20:23:05 -04:00
Pirx 634c2f83e9 README 2022-06-19 20:21:14 -04:00
Pirx 18f88705e5 Merge pull request #95 from pkali/develop
new xex
2022-06-19 20:05:32 -04:00
Pirx fe6bd17a66 new xex 2022-06-19 20:04:08 -04:00
Pirx 1d8f26d562 Merge pull request #94 from pkali/develop
inflation and supply chains distuption causes weapon price increase
2022-06-19 20:01:20 -04:00
Pirx 2bb8a743e1 inflation and supply chains distuption causes weapon price increase 2022-06-19 20:00:54 -04:00
Pirx 708a7b4aa9 Merge pull request #93 from pkali/develop
Develop
2022-06-19 14:43:03 -04:00
Pirx 8153670711 build 144 2022-06-19 14:42:24 -04:00
Pirx ab140ed5ca short fire - inventory, long fire - fire #75 2022-06-19 14:22:54 -04:00
Pirx cc3e2d1845 power timer 1/2s to speed up #75 2022-06-19 12:02:48 -04:00
Pirx 98e866abdd elaborate fix of a simple issue... #92 2022-06-18 20:17:16 -04:00
Pirx ffa748fb68 font update #26 2022-06-18 11:22:04 -04:00
Pirx de047779ce looks like inventory works... #26 2022-06-18 10:40:00 -04:00
Pirx 3c685b2811 infinite money when purchasing Baby Missile fix #26 2022-06-18 07:07:24 -04:00
Pecusx c86dcd7c59 cosmetics 2022-06-16 18:34:00 +02:00
Pecusx f924868459 Better (not best) collision with tank check
.... and corrected two defensive weapon numbers - Mag Deflector and Auto Defence are working.
2022-06-16 17:52:34 +02:00
Pirx 2992bd40b3 no shoot after inventory select #26 2022-06-15 07:48:57 -04:00
Pirx b19d218670 decrease activated defensives #26 2022-06-15 00:11:01 -04:00
Pirx 8ab450ff48 WIP: almost working... #26 2022-06-14 10:33:01 -04:00
Pirx 5e2ab7f206 defensives activate #26 2022-06-14 09:26:38 -04:00
Pecusx cd69bf22db Shield energy table added.
... for easier activation.
Defensive weapon numbering revised.
2022-06-13 09:18:05 +02:00
Pirx ff8c4d9329 number of shells in inventory #26 2022-06-13 01:35:57 -04:00
Pirx 83e128a1b5 no prices in inventory #26 2022-06-13 01:21:27 -04:00
Pirx cc8688263a Purchase/Activate texts in shop #26 2022-06-12 10:18:13 -04:00
Pirx b5bf6ecc30 joy left change offensive/deffensive #26 2022-06-12 09:48:10 -04:00
Pirx e2c85c98c2 inventory offensive weapons selection #26 2022-06-12 00:39:19 -04:00
Pirx c47a22a833 wip: purchase does not show active weapon #26 2022-06-11 20:08:25 -04:00
Pirx cd4275226a wip: inventory shows active weapon #26 2022-06-11 18:08:25 -04:00
Pirx cb270be865 wip: inventory shows weapons #26 2022-06-11 14:53:28 -04:00
Pirx 7df1d5eff9 isInventory var 2022-06-11 13:08:49 -04:00
Pirx c3f6e2399d to be as it was 2022-06-11 10:04:29 -04:00
Pirx 598860b7d0 infinite purchases fix #26 2022-06-11 09:43:08 -04:00
Pirx c1aa177767 WIP: press I for inventory #26 2022-06-11 05:51:13 -04:00
Pecusx eb7f6369de Collision with tank now checks the shield
We must rewvite CheckCollisionWithTank procedure !!!!
In future :)
2022-06-10 19:37:52 +02:00
Pecusx 41900d7671 Mag Deflector added
Only for test.
Now all players has active Mag Deflector with energy (99) before game.
2022-06-10 18:48:19 +02:00
Pecusx 6a6689b9b7 Auto Defence added
Only for test.
Now all players has active Auto Defence with energy (99) before game.
2022-06-10 11:13:20 +02:00
Pecusx 836c67afcf cosmetics 2022-06-09 20:32:37 +02:00
Pecusx 1b983b8d92 Index of hit tank in HitFlag
For future use.
Easier to check whether the hit tank or ground.
2022-06-09 18:06:31 +02:00
Pecusx 53e9f89012 Shield "horns" drawing.
For future use (defensive but aggressive :) ) weapons.
2022-06-09 14:40:48 +02:00
Pecusx cf40bf905d Slight change. 2022-06-09 12:57:50 +02:00
Pecusx 91b613f166 Shield witch parachute added
Only for test.
Now all players has active Shield with energy (99) and witch parachute before game.
Alo added display name of active defensive weapon on statusbar, and some fixes.
2022-06-09 09:46:09 +02:00
Pecusx eace9eb5cf Shield with energy added
Only for test.
Now all players has active Shield with energy (99) before game.
2022-06-08 21:52:19 +02:00
Pecusx 4c6b56a1e2 Now shield is displayed on a tank without PM
Small bugfix.
2022-06-08 14:40:29 +02:00
Pecusx 7b86fc98cd Simple shield added
Only for test.
Now all players has active Shield before game.
2022-06-08 11:14:03 +02:00
Pecusx 186cacf5ba The first attempt at handling defensive weapons
Only for test.
Now all players has active Parachute berore round.
2022-06-07 10:25:23 +02:00
Pecusx 031416b8e6 "Underground" shot fixed. 2022-06-06 17:59:43 +02:00
Pecusx 1394524a26 FunkyBomb and LeapFrog bugfix #89
Problem was due to the better accuracy of the collision with tank check procedure.
2022-06-06 09:42:22 +02:00
14 changed files with 1307 additions and 442 deletions
+29
View File
@@ -47,6 +47,35 @@ With the advent of fujinet (https://fujinet.online/) we are thinking about makin
## Changes: ## Changes:
###### Build 145
2022-06-26
Possibly last round of weapon additions!
@Pecusx added
- working White Flag -- it is a way to give up while not making opponents richer!
- Battery - a must for every tank with low energy.
- Strong Parachute - like a normal parachute, but stronger (it has energy and can work more than once)
- Nuclear Winter - a quick and efficient solution to global worming, err, warning, WARMING!
@mikerro added new SFX and in-game-tunes.
- Pressing [S] turns on/off SFX (when aiming). Pressing [M] turns on/off in-game tunes.
Tickets closed:
- https://github.com/pkali/scorch_src/issues/54 - holding joystick up or down longer speeds up force change. It makes playing with joystick much nicer.
- https://github.com/pkali/scorch_src/issues/76 - a beginning of visual tweaks by Adam
- infinite defensive weapons purchase bug fixed, to chagrin of some...
###### Build 144
2022-06-19
Father's day release comes with the most anticipated new feature: defensive weapons. Thanks to @Pecus we have 5 completely new weapons and a more reasonably working parachute. The stub of the instruction manual describing these weapons is available here: https://github.com/pkali/scorch_src/wiki/Instruction-manual.
The new inventory system has been added. Call it by pressing the "I" key or short-pressing fire. Select the weapon to use by moving the joystick or cursor keys right. Switch between offensive and defensive weapons by moving the joystick left. Fire/escape to quit inventory.
Another significant playability change is #54 - it is not finished yet, but keeping the joystick up or down makes force increase/decrease faster. Also - short press of fire calls Inventory, long press fires the shell. The timings are experimental, please let me know if this needs a modification/improvement.
Tickets closed:
* https://github.com/pkali/scorch_src/issues/92 - less unnecessary cleaning of the offensive texts
* https://github.com/pkali/scorch_src/issues/89 - improved collisions with tank
* https://github.com/pkali/scorch_src/issues/71 - ditto
* https://github.com/pkali/scorch_src/issues/11, https://github.com/pkali/scorch_src/issues/26, https://github.com/pkali/scorch_src/issues/8, https://github.com/pkali/scorch_src/issues/20 - new inventory system
###### Build 143 ###### Build 143
2022-06-05 2022-06-05
Rewrite build. We redone several important parts of the game to allow for bug fixes and requested features. Generally it was a great success, but some new bugs appeared. This build is nice for the eye, but beware, no mercy for testers again :) Rewrite build. We redone several important parts of the game to allow for bug fixes and requested features. Generally it was a great success, but some new bugs appeared. This build is nice for the eye, but beware, no mercy for testers again :)
+2 -2
View File
@@ -73,7 +73,7 @@ pmg .ds $0300
eif eif
song_data song_data
ins 'mmm_16.lzs' ins 'mmm_16.lzs'
song_end song_end
POKEY = $D200 POKEY = $D200
@@ -456,7 +456,7 @@ quit
ini main ini main
; --- ; ---
opt l- ;opt l-
.MACRO SPRITES .MACRO SPRITES
missiles missiles
BIN
View File
Binary file not shown.
+60 -36
View File
@@ -14,9 +14,9 @@ dliColorsFore
TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor
TextForegroundColor = $0c TextForegroundColor = $0c
CashOptionL ;(one zero less than on the screen) CashOptionL ;(one zero less than on the screen)
.by 0,<200,<500,<800,<1000 .by 0,<200,<800,<1200,<2000
CashOptionH CashOptionH
.by 0,>200,>500,>800,>1000 .by 0,>200,>800,>1200,>2000
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
@@ -514,7 +514,8 @@ EndOfTheBarrelY
.by 6,6,6,6,6,6,6,6,6 .by 6,6,6,6,6,6,6,6,6
.by 5,5,5,5,5,5,5,5,5,5 .by 5,5,5,5,5,5,5,5,5,5
.by 4,4,4,4,4,4,4,4,4,4,4,4,4 .by 4,4,4,4,4,4,4,4,4,4,4,4,4
.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 .by 4,4,4,4,4,4,4,4,4,4,4,4,4,4 ; one pixel Up for fix problems with colision check
; .by 3,3,3,3,3,3,3,3,3,3,3,3,3,3
.by 0,0,0,0,0,0,0,0,0,0 ; not used .by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used .by 0,0,0,0,0,0,0,0,0,0 ; not used
@@ -526,7 +527,8 @@ EndOfTheBarrelY
.by 0,0,0,0 ; not used .by 0,0,0,0 ; not used
; left angles from 90 (horizontally to the left) to 1 (vertically up) ; left angles from 90 (horizontally to the left) to 1 (vertically up)
.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 ; .by 3,3,3,3,3,3,3,3,3,3,3,3,3,3
.by 4,4,4,4,4,4,4,4,4,4,4,4,4,4 ; one pixel Up for fix problems with colision check
.by 4,4,4,4,4,4,4,4,4,4,4,4,4 .by 4,4,4,4,4,4,4,4,4,4,4,4,4
.by 5,5,5,5,5,5,5,5,5,5 .by 5,5,5,5,5,5,5,5,5,5
.by 6,6,6,6,6,6,6,6,6 .by 6,6,6,6,6,6,6,6,6
@@ -593,13 +595,14 @@ WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price______________45 .by >price______________45
.by >price______________46 .by >price______________46
.by >price______________47 .by >price______________47
.by >price_Heat_Guidance__ .by >price_White_Flag_____
.by >price_Battery________
.by >price_Bal_Guidance___ .by >price_Bal_Guidance___
.by >price_Horz_Guidance__ .by >price_Horz_Guidance__
.by >price_Vert_Guidance__ .by >price_Vert_Guidance__
.by >price_Lazy_Boy_______ .by >price_Lazy_Boy_______
.by >price_Parachute______ .by >price_Parachute______
.by >price_Battery________ .by >price_StrongParachute
.by >price_Mag_Deflector__ .by >price_Mag_Deflector__
.by >price_Shield_________ .by >price_Shield_________
.by >price_Force_Shield___ .by >price_Force_Shield___
@@ -607,8 +610,7 @@ WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Super_Mag______ .by >price_Super_Mag______
.by >price_Auto_Defense___ .by >price_Auto_Defense___
.by >price_Fuel_Tank______ .by >price_Fuel_Tank______
.by >price_Contact_Trigger .by >price_Nuclear_Winter_
.by >price_White_Flag_____
WeaponPriceL WeaponPriceL
.by <price_Baby_Missile___ .by <price_Baby_Missile___
@@ -659,13 +661,14 @@ WeaponPriceL
.by <price______________45 .by <price______________45
.by <price______________46 .by <price______________46
.by <price______________47 .by <price______________47
.by <price_Heat_Guidance__ .by <price_White_Flag_____
.by <price_Battery________
.by <price_Bal_Guidance___ .by <price_Bal_Guidance___
.by <price_Horz_Guidance__ .by <price_Horz_Guidance__
.by <price_Vert_Guidance__ .by <price_Vert_Guidance__
.by <price_Lazy_Boy_______ .by <price_Lazy_Boy_______
.by <price_Parachute______ .by <price_Parachute______
.by <price_Battery________ .by <price_StrongParachute
.by <price_Mag_Deflector__ .by <price_Mag_Deflector__
.by <price_Shield_________ .by <price_Shield_________
.by <price_Force_Shield___ .by <price_Force_Shield___
@@ -673,8 +676,7 @@ WeaponPriceL
.by <price_Super_Mag______ .by <price_Super_Mag______
.by <price_Auto_Defense___ .by <price_Auto_Defense___
.by <price_Fuel_Tank______ .by <price_Fuel_Tank______
.by <price_Contact_Trigger .by <price_Nuclear_Winter_
.by <price_White_Flag_____
;------------------------------------------------- ;-------------------------------------------------
; how many units (bulletd) of a given weapon we get for a given price ; how many units (bulletd) of a given weapon we get for a given price
@@ -731,13 +733,14 @@ WeaponUnits
.by 0 ;_____________45 .by 0 ;_____________45
.by 0 ;_____________46 .by 0 ;_____________46
.by 0 ;_____________47 .by 0 ;_____________47
.by 6 ;Heat_Guidance__ .by 1 ;White_Flag___48
.by 3 ;Battery________
.by 2 ;Bal_Guidance___ .by 2 ;Bal_Guidance___
.by 5 ;Horz_Guidance__ .by 5 ;Horz_Guidance__
.by 5 ;Vert_Guidance__ .by 5 ;Vert_Guidance__
.by 2 ;Lazy_Boy_______ .by 2 ;Lazy_Boy_______
.by 8 ;Parachute______ .by 8 ;Parachute______
.by 10 ;Battery________ .by 2 ;StrongParachute
.by 2 ;Mag_Deflector__ .by 2 ;Mag_Deflector__
.by 3 ;Shield_________ .by 3 ;Shield_________
.by 3 ;Force_Shield___ .by 3 ;Force_Shield___
@@ -745,8 +748,7 @@ WeaponUnits
.by 2 ;Super_Mag______ .by 2 ;Super_Mag______
.by 1 ;Auto_Defense___ .by 1 ;Auto_Defense___
.by 10 ;Fuel_Tank______ .by 10 ;Fuel_Tank______
.by 25 ;Contact_Trigger .by 1 ;Nuclear_Winter_
.by 1 ;_____________63
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
@@ -809,8 +811,8 @@ WeaponSymbols
.by $58,$59,$5a,$5b,$60,$7b,$7c,$7d .by $58,$59,$5a,$5b,$60,$7b,$7c,$7d
.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 $02,$03,$06,$1d,$0a,$1b,$1c,$1e .by $5f,$1c,$03,$06,$1d,$0a,$1b,$1b ; defensives
.by $3b,$3c,$3d,$3e,$3f,$5e,$5f,$00 .by $1e,$3b,$3c,$3d,$3e,$3f,$5e,$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
@@ -861,26 +863,43 @@ NamesOfWeapons ;the comment is an index in the tables
dta d"----------------" ; 44 dta d"----------------" ; 44
dta d"----------------" ; 45 dta d"----------------" ; 45
dta d"----------------" ; 46 dta d"----------------" ; 46
dta d"----------------" ; 47 dta d" " ; 47 ; special (no weapon) name to simplify display
dta d"Heat Guidance " ; 48 ($30) dta d"White Flag " ; 48 ($30)
dta d"Bal Guidance " ; 49 dta d"Battery " ; 49
dta d"Horz Guidance " ; 50 dta d"Bal Guidance " ; 50
dta d"Vert Guidance " ; 51 dta d"Horz Guidance " ; 51
dta d"Lazy Boy " ; 52 dta d"Vert Guidance " ; 52
dta d"Parachute " ; 53 dta d"Lazy Boy " ; 53
dta d"Battery " ; 54 dta d"Parachute " ; 54 - no energy
dta d"Mag Deflector " ; 55 dta d"Strong Parachute" ; 55 - with energy (earlier Battery)
dta d"Shield " ; 56 dta d"Mag Deflector " ; 56 - with shield and energy
dta d"Force Shield " ; 57 dta d"Shield " ; 57 - shield for one shot - no energy
dta d"Heavy Shield " ; 58 dta d"Force Shield " ; 58 - shield with energy and parachute
dta d"Super Mag " ; 59 dta d"Heavy Shield " ; 59 - shield with energy
dta d"Auto Defense " ; 60 dta d"Super Mag " ; 60
dta d"Fuel Tank " ; 61 dta d"Auto Defense " ; 61 - with shield and energy
dta d"Contact Trigger " ; 62 dta d"Fuel Tank " ; 62
dta d"White Flag " ; 63 dta d"Nuclear Winter " ; 63
DefensiveEnergy = * - 48
.by 00 ; White Flag
.by 00 ; Heat Guidance
.by 00 ; Bal Guidance
.by 00 ; Horz Guidance
.by 00 ; Vert Guidance
.by 00 ; Lazy Boy
.by 00 ; Parachute
.by 99 ; Strong Parachute
.by 99 ; Mag Deflector
.by 00 ; Shield
.by 99 ; Force Shield
.by 99 ; Heavy Shield
.by 00 ; Super Mag
.by 99 ; Auto Defense
.by 00 ; Fuel Tank
.by 00 ; Nuclear Winter
weaponsOfDeath weaponsOfDeath
dta 1,2,3,7,15,16,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
weaponsOfDeathEnd weaponsOfDeathEnd
joyToKeyTable joyToKeyTable
; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15 ; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15
@@ -900,5 +919,10 @@ scrcodes
dta d"qrstuvwx" dta d"qrstuvwx"
dta d"yz123456" dta d"yz123456"
dta d"7890." ; "-" dta d"7890." ; "-"
;-----------------------------------
gameOverSpritesTop
; end of the Gover sprites by number of players
; 1 2 3 4 5 6
.by 130,130,136,142,148,154
.endif .endif
+90 -16
View File
@@ -59,22 +59,87 @@ price______________44 = 0
price______________45 = 0 price______________45 = 0
price______________46 = 0 price______________46 = 0
price______________47 = 0 price______________47 = 0
price_Heat_Guidance__ = $ffff ;_48_($30) price_White_Flag_____ = $0 ;_48_($30)
price_Bal_Guidance___ = $ffff ;_49 price_Battery________ = 300 ;_49
price_Horz_Guidance__ = $ffff ;_50 price_Bal_Guidance___ = $ffff ;_50
price_Vert_Guidance__ = $ffff ;_51 price_Horz_Guidance__ = $ffff ;_51
price_Lazy_Boy_______ = $ffff ;_52 price_Vert_Guidance__ = $ffff ;_52
price_Parachute______ = 1100 ;_53 price_Lazy_Boy_______ = $ffff ;_53
price_Battery________ = $ffff ;_54 price_Parachute______ = 234 ;_54
price_Mag_Deflector__ = $ffff ;_55 price_StrongParachute = 1000 ;_55
price_Shield_________ = $ffff ;_56 price_Mag_Deflector__ = 245 ;_56
price_Force_Shield___ = $ffff ;_57 price_Shield_________ = 112 ;_57
price_Heavy_Shield___ = $ffff ;_58 price_Force_Shield___ = 268 ;_58
price_Super_Mag______ = $ffff ;_59 price_Heavy_Shield___ = 375 ;_59
price_Auto_Defense___ = $ffff ;_60 price_Super_Mag______ = $ffff ;_60
price_Fuel_Tank______ = $ffff ;_61 price_Auto_Defense___ = 512 ;_61
price_Contact_Trigger = $ffff ;_62 price_Fuel_Tank______ = $ffff ;_62
price_White_Flag_____ = $0 ;_63 price_Nuclear_Winter_ = 1000 ;_63
;Weapon indexes (numbers)
ind_Baby_Missile___ = 0
ind_Missile________ = 1
ind_Baby_Nuke______ = 2
ind_Nuke___________ = 3
ind_LeapFrog_______ = 4
ind_Funky_Bomb_____ = 5
ind_MIRV___________ = 6
ind_Death_s_Head___ = 7
ind_Napalm_________ = 8
ind_Hot_Napalm_____ = 9
ind_Tracer_________ = 10
ind_Smoke_Tracer___ = 11
ind_Baby_Roller____ = 12
ind_Roller_________ = 13
ind_Heavy_Roller___ = 14
ind_Riot_Charge____ = 15
ind_Riot_Blast_____ = 16
ind_Riot_Bomb______ = 17
ind_Heavy_Riot_Bomb = 18
ind_Baby_Digger____ = 19
ind_Digger_________ = 20
ind_Heavy_Digger___ = 21
ind_Baby_Sandhog___ = 22
ind_Sandhog________ = 23
ind_Heavy_Sandhog__ = 24
ind_Dirt_Clod______ = 25
ind_Dirt_Ball______ = 26
ind_Ton_of_Dirt____ = 27
ind_Liquid_Dirt____ = 28
ind_Dirt_Charge____ = 29
ind_Earth_Disrupter = 30
ind_Plasma_Blast___ = 31
ind_Laser__________ = 32
ind______________33 = 0
ind______________34 = 0
ind______________35 = 0
ind______________36 = 0
ind______________37 = 0
ind______________38 = 0
ind______________39 = 0
ind______________40 = 0
ind______________41 = 0
ind______________42 = 0
ind______________43 = 0
ind______________44 = 0
ind______________45 = 0
ind______________46 = 0
ind______________47 = 0
ind_White_Flag_____ = 48
ind_Battery________ = 49
ind_Bal_Guidance___ = 50
ind_Horz_Guidance__ = 51
ind_Vert_Guidance__ = 52
ind_Lazy_Boy_______ = 53
ind_Parachute______ = 54
ind_StrongParachute = 55
ind_Mag_Deflector__ = 56
ind_Shield_________ = 57
ind_Force_Shield___ = 58
ind_Heavy_Shield___ = 59
ind_Super_Mag______ = 60
ind_Auto_Defense___ = 61
ind_Fuel_Tank______ = 62
ind_Nuclear_Winter_ = 63
;-------------------------------- ;--------------------------------
; names of RMT instruments (sfx) ; names of RMT instruments (sfx)
;-------------------------------- ;--------------------------------
@@ -106,3 +171,12 @@ sfx_keyclick = $18 ;y
sfx_shoot = $19 ;z sfx_shoot = $19 ;z
sfx_seppuku = $1a ;1 sfx_seppuku = $1a ;1
sfx_liquid_dirt = $1b ;2 sfx_liquid_dirt = $1b ;2
sfx_battery = $1c ;3
sfx_white_flag = $1d ;4
;--------------------------------
; RMT songs (lines)
;--------------------------------
song_silencio = $00
song_end_round = $02
song_ingame = $06
song_game_over = $0b
+14 -6
View File
@@ -104,7 +104,7 @@ OptionsScreen
OptionsHere OptionsHere
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
dta d"Players : 2 3 4 5 6 " dta d"Players : 2 3 4 5 6 "
dta d"Cash : none 2K 5K 8K 10K " dta d"Cash : none 2K 8K 12K 20K "
dta d"Gravity : 0.2G 0.5G 1G 2G 4G " dta d"Gravity : 0.2G 0.5G 1G 2G 4G "
dta d"Wind : 1B 3B 5B 7B 9B " dta d"Wind : 1B 3B 5B 7B 9B "
dta d"Rounds : 10 20 30 40 50 " dta d"Rounds : 10 20 30 40 50 "
@@ -136,7 +136,9 @@ WeaponsDescription
dta d" - Defensive/Offensive weapon " dta d" - Defensive/Offensive weapon "
dta d" " dta d" "
dta d"Space"* dta d"Space"*
dta d" - Purchase " dta d" - "
purchaseActivate
dta d"Purchase "
dta d"Return"* dta d"Return"*
dta d" - Finish " dta d" - Finish "
EmptyLine EmptyLine
@@ -166,11 +168,17 @@ NamesOfLevels
textbuffer textbuffer
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
dta d"Player: " dta d"Player: "
dta d"Energy: Angle: Force: " dta d"Energy: Angle: Force: "
dta d" Round: Wind: " dta d"Round: Wind: "
textbuffer2 textbuffer2
dta d"Player: Cash: " dta d"Player: Cash: 0 " ; ZERO TO MAKE YOU RICHER ON THE SCREEN
dta d"----------------------------------------" dta d"----------------------------------------"
;---------------------------------------------------
activateText
dta d"Activate"
activateTextEnd
purchaseText
dta d"Purchase"
purchaseTextEnd
.endif .endif
+144 -16
View File
@@ -262,8 +262,7 @@ CheckCollisionDraw
sbc #1 sbc #1
sta YHit sta YHit
sty YHit+1 sty YHit+1
;mwa ydraw YHit mva #$ff HitFlag
mva #1 HitFlag
StopHitChecking StopHitChecking
jmp ContinueDraw jmp ContinueDraw
@ @
@@ -364,7 +363,7 @@ endcircleloop
rts rts
.endp .endp
;---- ;----
splot8 .proc .proc splot8
; plot xcircle+XC,ycircle+YC ; plot xcircle+XC,ycircle+YC
; plot xcircle+XC,ycircle-YC ; plot xcircle+XC,ycircle-YC
; plot xcircle-XC,ycircle-YC ; plot xcircle-XC,ycircle-YC
@@ -463,7 +462,7 @@ splot8 .proc
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
clearscreen .proc .proc clearscreen
;-------------------------------------------------- ;--------------------------------------------------
lda #$ff lda #$ff
@@ -477,7 +476,7 @@ clearscreen .proc
rts rts
.endp .endp
;-------------------------------*------------------ ;-------------------------------*------------------
placetanks .proc .proc placetanks
;-------------------------------------------------- ;--------------------------------------------------
ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1
lda #0 lda #0
@@ -588,20 +587,20 @@ UnequalTanks
;------------------------------------------------- ;-------------------------------------------------
.proc drawtanks .proc drawtanks
;------------------------------------------------- ;-------------------------------------------------
lda tanknr lda TankNr
pha pha
ldx #$00 ldx #$00
stx tanknr stx TankNr
DrawNextTank DrawNextTank
jsr drawtanknr jsr drawtanknr
inc tanknr inc TankNr
ldx tanknr ldx TankNr
Cpx NumberOfPlayers Cpx NumberOfPlayers
bne DrawNextTank bne DrawNextTank
pla pla
sta tankNr sta TankNr
rts rts
.endp .endp
@@ -642,6 +641,7 @@ DrawTankNrX
sta xdraw+1 sta xdraw+1
lda ytankstable,x lda ytankstable,x
sta ydraw sta ydraw
mva #0 ydraw+1
jsr TypeChar jsr TypeChar
@@ -654,11 +654,11 @@ DrawTankNrX
rorw xbyte ; divide by 2 (carry does not matter) rorw xbyte ; divide by 2 (carry does not matter)
lda xbyte lda xbyte
clc clc
adc #$24 ; P/M to graphics offset adc #PMOffset+1 ; P/M to graphics offset
cpx #$4 ; 5th tank are joined missiles and offset is defferent cpx #$4 ; 5th tank are joined missiles and offset is defferent
bne NoMissile bne NoMissile
clc clc
adc #$0C adc #$0C ; missile offset offset
NoMissile NoMissile
sta hposp0,x sta hposp0,x
; vertical position ; vertical position
@@ -690,10 +690,45 @@ ZeroesToGo
sta (xbyte),y sta (xbyte),y
dey dey
bne ClearPM bne ClearPM
NoPlayerMissile NoPlayerMissile
; draw defensive weapons like shield ( tank number in X )
; in xdraw, ydraw we have coordinates left LOWER corner of Tank char
lda ActiveDefenceWeapon,x
cmp #ind_Shield_________ ; one shot shield
beq ShieldDraw
cmp #ind_Force_Shield___ ; shield with energy and parachute
beq ShieldDraw
cmp #ind_Heavy_Shield___ ; shield with energy
beq ShieldDraw
cmp #ind_Auto_Defense___ ; Auto Defence
beq DrawTankShieldWihHorns
cmp #ind_Mag_Deflector__ ; Mag Deflector
beq DrawTankShieldWihHorns
cmp #ind_White_Flag_____ ; White Flag
beq DrawTankFlag
bne NoShieldDraw
ShieldDraw
jsr DrawTankShield.DrawInPosition
NoShieldDraw
DoNotDrawTankNr DoNotDrawTankNr
rts rts
DrawTankShieldWihHorns
jsr DrawTankShield.DrawInPosition
jsr DrawTankShieldHorns
rts
DrawTankFlag
lda #$5E ; flag symbol
sta CharCode
lda Ytankstable,x
sec
sbc #8
sta ydraw
lda XtanksTableL,x
sta xdraw
lda XtanksTableH,x
sta xdraw+1
jsr TypeChar
rts
.endp .endp
; ------------------------------------- ; -------------------------------------
@@ -718,6 +753,88 @@ tankflash_loop
rts rts
.endp .endp
;--------------------------------------------------
.proc DrawTankShield
; X - tank number
; if use DrawInPosition entry point then:
; xdraw, ydraw - coordinates left LOWER corner of Tank char
; values remain there after a DrawTankNr proc.
;
; this proc change xdraw, ydraw and temp!
;--------------------------------------------------
lda xtankstableL,x
sta xdraw
lda xtankstableH,x
sta xdraw+1
lda ytankstable,x
sta ydraw
mva #0 ydraw+1
DrawInPosition
mva #1 color
lda erase
beq ShieldVisible
dec color
ShieldVisible
sbw xdraw #$03 ; 3 pixels to left
; draw left vertical line of shield ( | )
mva #6 temp ; strange !!!
@
jsr plot
.nowarn dew ydraw
dec temp
bne @-
; draw left oblique line of shield ( / )
mva #4 temp
@
jsr plot
.nowarn dew ydraw
inw xdraw
dec temp
bne @-
; draw top horizontal line of shield ( _ )
mva #5 temp
@
jsr plot
inw xdraw
dec temp
bne @-
; draw right oblique line of shield ( \ )
mva #4 temp
@
jsr plot
inw ydraw
inw xdraw
dec temp
bne @-
; draw right vertical line of shield ( | )
mva #7 temp
@
jsr plot
inw ydraw
dec temp
bne @-
rts
.endp
;--------------------------------------------------
.proc DrawTankShieldHorns
; use only directly after DrawTankShield
; this proc draws a little "horns" on shield.
; Symbol of defensive but aggressive :) weapon
;--------------------------------------------------
.nowarn dew xdraw ; 1 pixel left
sbw ydraw #$0a ; 10 pixels up
jsr plot
.nowarn dew ydraw
inw xdraw
jsr plot
sbw xdraw #$0d ; 13 pixels left
jsr plot
inw xdraw
inw ydraw
jsr plot
rts
.endp
;-------------------------------------------------- ;--------------------------------------------------
.proc drawmountains .proc drawmountains
;-------------------------------------------------- ;--------------------------------------------------
@@ -1349,7 +1466,7 @@ EndPutChar
; ------------------------------------------ ; ------------------------------------------
.proc PutChar4x4 .proc PutChar4x4
; puts 4x4 pixels char on the graphics screen ; puts 4x4 pixels char on the graphics screen
; in: xdraw, ydraw (LOWER left corner of the char) ; in: dx, dy (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte) ; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/1) ; in: plot4x4color (0/1)
; all pixels are being drawn ; all pixels are being drawn
@@ -1403,7 +1520,7 @@ GetUpper4bits
bpl CopyChar bpl CopyChar
; calculating coordinates from xdraw and ydraw ; calculating coordinates from xdraw and ydraw
mwa xdraw xbyte mwa dx xbyte
lda xbyte lda xbyte
and #$7 and #$7
@@ -1414,7 +1531,7 @@ GetUpper4bits
rorw xbyte rorw xbyte
;--- ;---
ldy xbyte ldy xbyte
lda ydraw ; y = y - 3 because left lower. lda dy ; y = y - 3 because left lower.
sec sec
sbc #3 sbc #3
tax tax
@@ -1465,4 +1582,15 @@ EndPut4x4
rts rts
.endp .endp
.proc SetMainScreen
mva #0 dmactl
VDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen
mwa #dl dlptrs ; issue #72 (glitches when switches)
lda dmactls
and #$fc
ora #$02 ; 2=normal, 3 = wide screen width
sta dmactls
rts
.endp
.endif .endif
+162 -79
View File
@@ -36,7 +36,7 @@
;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"143" ; number of this build (3 bytes) dta d"145" ; number of this build (3 bytes)
.endm .endm
icl 'definitions.asm' icl 'definitions.asm'
@@ -55,26 +55,33 @@
.zpvar xc .word .zpvar xc .word
.zpvar temp .word ;temporary word for the most embeded loops only .zpvar temp .word ;temporary word for the most embeded loops only
.zpvar temp2 .word ;same as above .zpvar temp2 .word ;same as above
.zpvar modify .word ;origially used to replace self-modyfying code
.zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine) .zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine)
.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
;--------------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 ;circle drawing variables .zpvar fx .byte
.zpvar yi .word ;Y (word) in draw routine .zpvar yi .word ;Y (word) in draw routine
.zpvar fy .byte .zpvar fy .byte
.zpvar xk .word .zpvar xk .word
.zpvar fs .byte .zpvar fs .byte
.zpvar yc .byte ;ycircle - temporary for circle .zpvar yc .byte ;ycircle - temporary for circle
.zpvar dx .word .zpvar dx .word
.zpvar tempor2 .byte
.zpvar dy .word .zpvar dy .word
.zpvar dd .word .zpvar dd .word
.zpvar di .word .zpvar di .word
.zpvar dp .word .zpvar dp .word
.zpvar modify .word ;----------------------------
.zpvar weaponPointer .word .zpvar weaponPointer .word
.zpvar dliCounter .byte .zpvar dliCounter .byte
.zpvar pressTimer .byte
.zpvar NTSCcounter .byte
;.zpvar dliA .byte
;.zpvar dliX .byte
;.zpvar dliY .byte
;* RMT ZeroPage addresses ;* RMT ZeroPage addresses
.zpvar p_tis .word .zpvar p_tis .word
.zpvar p_trackslbstable .word .zpvar p_trackslbstable .word
@@ -103,7 +110,7 @@
;Game loading address ;Game loading address
ORG $3000 ORG $3000
WeaponFont WeaponFont
ins 'artwork/weapons_AW5.fnt' ; 'artwork/weapons.fnt' ins 'artwork/weapons_AW5_mod.fnt' ; 'artwork/weapons.fnt'
;----------------------------------------------- ;-----------------------------------------------
;Screen displays go here to avoid crossing 4kb barrier ;Screen displays go here to avoid crossing 4kb barrier
;----------------------------------------------- ;-----------------------------------------------
@@ -130,16 +137,10 @@ START
; for the round #1 shooting sequence is random ; for the round #1 shooting sequence is random
MainGameLoop MainGameLoop
VDLI DLIinterruptText ; jsr SetDLI for text (purchase) screen
jsr CallPurchaseForEveryTank jsr CallPurchaseForEveryTank
; issue #72 (glitches when switches) ; issue #72 (glitches when switches)
mva #0 dmactl mva #0 dmactl
lda dmactls
and #$fc
;ora #$02 ; 2=normal, 3 = wide screen width, 0 = no screen
sta dmactls
jsr GetRandomWind jsr GetRandomWind
@@ -166,7 +167,8 @@ 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
jsr RmtSongSelect
jsr DisplayResults jsr DisplayResults
;check demo mode ;check demo mode
@@ -239,6 +241,7 @@ skipzeroing
inc CurrentRoundNr inc CurrentRoundNr
mva #0 dmactl ; issue #72 mva #0 dmactl ; issue #72
jsr RmtSongSelect
mva #sfx_silencer sfx_effect mva #sfx_silencer sfx_effect
jmp MainGameLoop jmp MainGameLoop
@@ -253,6 +256,9 @@ skipzeroing
; the shooting angle is randomized ; the shooting angle is randomized
; of course gains an looses are zeroed ; of course gains an looses are zeroed
lda #song_ingame
jsr RmtSongSelect
lda #0 lda #0
tax tax
@ sta singleRoundVars,x @ sta singleRoundVars,x
@@ -300,19 +306,14 @@ SettingEnergies
jsr calculatemountains ;let mountains be easy for the eye jsr calculatemountains ;let mountains be easy for the eye
;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height ;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height
VDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen jsr SetMainScreen
mwa #dl dlptrs ; issue #72 (glitches when switches) jsr ColorsOfSprites
lda dmactls
and #$fc
ora #$02 ; 2=normal, 3 = wide screen width
sta dmactls
jsr drawmountains ;draw them jsr drawmountains ;draw them
jsr drawtanks ;finally draw tanks jsr drawtanks ;finally draw tanks
mva #0 TankSequencePointer mva #0 TankSequencePointer
;--------------------round screen is ready--------- ;---------round screen is ready---------
rts rts
.endp .endp
@@ -418,6 +419,22 @@ ManualShooting
seq:rts seq:rts
AfterManualShooting AfterManualShooting
; defensive weapons without flight handling
ldx TankNr
lda ActiveDefenceWeapon,x
cmp #ind_White_Flag_____ ; White Flag
beq ShootWhiteFlag
cmp #ind_Nuclear_Winter_
bne StandardShoot
ShootAtomicWinter
; --- nuclear winter ---
jsr NuclearWinter
jmp NextPlayerShoots ; and we skip shoot
ShootWhiteFlag
; --- white flag ---
jsr WhiteFlag
jmp NextPlayerShoots ; and we skip shoot
StandardShoot
inc noDeathCounter inc noDeathCounter
jsr DecreaseWeaponBeforeShoot jsr DecreaseWeaponBeforeShoot
@@ -428,6 +445,10 @@ AfterManualShooting
ShootNow ShootNow
jsr Shoot jsr Shoot
;here we clear offensive text (after a shoot)
ldy TankNr
mva #0 plot4x4color
jsr DisplayOffensiveTextNr
lda HitFlag ;0 if missed lda HitFlag ;0 if missed
beq missed beq missed
@@ -439,9 +460,9 @@ ShootNow
continueMainRoundLoopAfterSeppuku continueMainRoundLoopAfterSeppuku
;here we clear offensive text (after a shoot) ;here we clear offensive text (after a shoot)
ldy TankNr ;ldy TankNr
mva #0 plot4x4color ;mva #0 plot4x4color
jsr DisplayOffensiveTextNr ;jsr DisplayOffensiveTextNr
AfterExplode AfterExplode
@@ -454,14 +475,12 @@ AfterExplode
@ @
;temporary tanks removal (would fall down with soil) ;temporary tanks removal (would fall down with soil)
mva TankNr tempor2
mva #1 Erase mva #1 Erase
jsr drawtanks jsr drawtanks
mva tempor2 TankNr
mva #0 Erase mva #0 Erase
lda FallDown2 lda FallDown2
beq NoFallDown2 beq NoFallDown2
jsr SoilDown2; jsr SoilDown2
NoFallDown2 NoFallDown2
;here tanks are falling down ;here tanks are falling down
@@ -649,7 +668,7 @@ MetodOfDeath
;-------------------------------------------------- ;--------------------------------------------------
.proc DecreaseEnergyX .proc DecreaseEnergyX
;Decreases energy of player nr X ;Decreases energy of player nr X by the value Y
;increases his financial loss ;increases his financial loss
;increases gain of tank TankNr ;increases gain of tank TankNr
;-------------------------------------------------- ;--------------------------------------------------
@@ -687,6 +706,33 @@ NotNegativeEnergy
rts rts
.endp .endp
;--------------------------------------------------
.proc DecreaseShieldEnergyX
; Decreases energy of shield player nr X by the value Y
; if shield energy is 0 after decrease then in Y we have
; rest of the energy - to decrease tank energy
;--------------------------------------------------
sty EnergyDecrease
ldy #0 ; if Shield survive then no decrease tank anergy
; Energy cannot be less than 0
lda ShieldEnergy,x
cmp EnergyDecrease
bcc UseAllShieldEnergy
;sec
sbc EnergyDecrease
bpl NotNegativeShieldEnergy ; jump allways
UseAllShieldEnergy
; now calculate rest of energy for future tank energy decrease
sec
lda EnergyDecrease
sbc ShieldEnergy,x
tay
lda #0
NotNegativeShieldEnergy
sta ShieldEnergy,x
rts
.endp
;--------------------------------- ;---------------------------------
.proc Seppuku .proc Seppuku
lda #0 lda #0
@@ -707,7 +753,7 @@ NotNegativeEnergy
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
GetRandomWind .proc .proc GetRandomWind
;in: MaxWind (byte) ;in: MaxWind (byte)
;out: Wind (word) ;out: Wind (word)
;uses: _ ;uses: _
@@ -736,31 +782,50 @@ GetRandomWind .proc
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
PMoutofScreen .proc .proc PMoutofScreen
;-------------------------------------------------- ;--------------------------------------------------
lda #$00 ; let all P/M disappear lda #$00 ; let all P/M disappear
:8 sta hposp0+# :8 sta hposp0+#
rts rts
.endp .endp
;--------------------------------------------------
.proc ColorsOfSprites
lda TankColoursTable ; colours of sprites under tanks
sta COLPM0S
lda TankColoursTable+1
sta COLPM1S
lda TankColoursTable+2
sta COLPM2S
lda TankColoursTable+3
sta COLPM3S
LDA TankColoursTable+4
STA COLPF3S ; joined missiles (5th tank)
rts
.endp
;-------------------------------------------------- ;--------------------------------------------------
.proc WeaponCleanup; .proc WeaponCleanup;
; cleaning of the weapon possesion tables ; cleaning of the weapon possesion tables
; (99 of Baby Missles, all other weapons=0) ; 99 of Baby Missles(index==0), all other weapons=0)
;-------------------------------------------------- ;--------------------------------------------------
ldx #$3f ldx #$3f ; TODO: maxweapons
lda #$0 @ lda #$0
@ cpx #48 ; White Flag
sta TanksWeapon1,x bne @+
lda #99
@ sta TanksWeapon1,x
sta TanksWeapon2,x sta TanksWeapon2,x
sta TanksWeapon3,x sta TanksWeapon3,x
sta TanksWeapon4,x sta TanksWeapon4,x
sta TanksWeapon5,x sta TanksWeapon5,x
sta TanksWeapon6,x sta TanksWeapon6,x
dex dex
sne:lda #99 beq setBmissile
bpl @- bpl @-1
rts rts
setBmissile
lda #99
bne @-
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
@@ -823,18 +888,6 @@ SetunPlots
lda #$10 ; P/M priorities (bit 4 joins missiles) lda #$10 ; P/M priorities (bit 4 joins missiles)
sta gtictls sta gtictls
jsr PMoutofScreen jsr PMoutofScreen
lda TankColoursTable ; temporary colours of sprites under tanks
sta COLPM0S
lda TankColoursTable+1
sta COLPM1S
lda TankColoursTable+2
sta COLPM2S
lda TankColoursTable+3
sta COLPM3S
LDA TankColoursTable+4
STA COLPF3S ; joined missiles (5th tank)
mva #0 hscrol
;let the tanks be visible! ;let the tanks be visible!
ldx #(maxPlayers-1) ldx #(maxPlayers-1)
@@ -854,6 +907,7 @@ ClearResults
bne ClearResults bne ClearResults
mva #1 CurrentRoundNr ;we start from round 1 mva #1 CurrentRoundNr ;we start from round 1
mva #6 NTSCcounter
; RMT INIT ; RMT INIT
lda #$f0 ;initial value lda #$f0 ;initial value
@@ -862,18 +916,18 @@ ClearResults
lda #$ff ;initial value lda #$ff ;initial value
sta sfx_effect sta sfx_effect
; ;
ldx #<MODUL ;low byte of RMT module to X reg lda #0
ldy #>MODUL ;hi byte of RMT module to Y reg jsr RmtSongSelect
lda #0 ;starting song line 0-255 to A reg
jsr RASTERMUSICTRACKER ;Init
; ;
VMAIN VBLinterrupt,6 ;jsr SetVBL VMAIN VBLinterrupt,6 ;jsr SetVBL
rts rts
.endp .endp
;--------------------------------------------------
DLIinterruptGraph .proc .proc DLIinterruptGraph
pha ;sta dliA
;sty dliY
pha
phy phy
ldy dliCounter ldy dliCounter
lda dliColorsBack,y lda dliColorsBack,y
@@ -884,41 +938,63 @@ DLIinterruptGraph .proc
sta COLPF1 sta COLPF1
sty COLPF2 sty COLPF2
inc dliCounter inc dliCounter
ply ;ldy dliY
;lda dliA
ply
pla pla
rti rti
.endp .endp
;--------------------------------------------------
DLIinterruptText .proc .proc DLIinterruptText
pha ;sta dliA
pha
sta WSYNC sta WSYNC
mva #TextBackgroundColor colpf2 mva #TextBackgroundColor colpf2
mva #TextForegroundColor colpf3 mva #TextForegroundColor colpf3
pla ;lda dliA
pla
DLIinterruptNone DLIinterruptNone
rti rti
.endp .endp
;--------------------------------------------------
VBLinterrupt .proc .proc VBLinterrupt
pha pha
phx phx
phy phy
mva #0 dliCounter mva #0 dliCounter
lda PAL
and #%00001110
beq itsPAL
;it is NTSC here
dec NTSCcounter
bne itsPAL
mva #6 NTSCcounter
bne exitVBL ; skip doing VBL things each 6 frames in Amerika, Amerika
; We're all living in Amerika, Coca Cola, Wonderbra
itsPAL
; pressTimer is trigger tick counter. always 50 ticks / s
bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s
; ------- RMT -------
lda sfx_effect lda sfx_effect
bmi lab2 bmi lab2
asl @ ; * 2 asl @ ; * 2
tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126) tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126)
ldx #0 ;X = 0 channel (0..3 or 0..7 for stereo module) ldx #0 ;X = 0 channel (0..3 or 0..7 for stereo module)
lda #0 ;A = 12 note (0..60) lda #0 ;A = 0 note (0..60)
jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!) bit noSfx
; smi:jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!)
lda #$ff lda #$ff
sta sfx_effect ;reinit value sta sfx_effect ;reinit value
;
lab2 lab2
jsr RASTERMUSICTRACKER+3 ;1 play jsr RASTERMUSICTRACKER+3 ;1 play
; ------- RMT -------
exitVBL
ply ply
plx plx
pla pla
@@ -934,9 +1010,7 @@ lab2
bne @- bne @-
rts rts
.endp .endp
;--------------------------------------------------
.proc RandomizeSequence .proc RandomizeSequence
; in: NumberOfPlayers ; in: NumberOfPlayers
; out: TankSequence ; out: TankSequence
@@ -986,7 +1060,7 @@ UsageLoop
rts rts
.endp .endp
;---------------------------------------------- ;----------------------------------------------
RandomizeAngle .proc ; .proc RandomizeAngle
; routine returns in A ; routine returns in A
; a valid angle for the tank's barrel. ; a valid angle for the tank's barrel.
; X is not changed ; X is not changed
@@ -1009,7 +1083,7 @@ RandomizeAngle .proc ;
rts rts
.endp .endp
;---------------------------------------------- ;----------------------------------------------
RandomizeForce .proc .proc RandomizeForce
; routine returns in ForceTable/L/H ; routine returns in ForceTable/L/H
; valid force of shooting for TankNr ; valid force of shooting for TankNr
; in X must be TankNr ; in X must be TankNr
@@ -1054,7 +1128,6 @@ LimitForce
rts rts
.endp .endp
;---------------------------------------------- ;----------------------------------------------
.proc MoveBarrelToNewPosition .proc MoveBarrelToNewPosition
jsr DrawTankNr jsr DrawTankNr
@@ -1088,7 +1161,7 @@ rotateLeft
BarrelPositionIsFine BarrelPositionIsFine
rts rts
.endp .endp
;---------------------------------------------- ;----------------------------------------------
.proc SortSequence ; .proc SortSequence ;
@@ -1218,19 +1291,19 @@ notpressedJoyGetKey
getkeyend getkeyend
mvx #sfx_keyclick sfx_effect mvx #sfx_keyclick sfx_effect
rts rts
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
getkeynowait .proc; .proc getkeynowait
;-------------------------------------------------- ;--------------------------------------------------
jsr WaitForKeyRelease jsr WaitForKeyRelease
lda kbcode lda kbcode
and #$3f ;CTRL and SHIFT ellimination and #$3f ;CTRL and SHIFT ellimination
rts rts
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
WaitForKeyRelease .proc .proc WaitForKeyRelease
;-------------------------------------------------- ;--------------------------------------------------
lda JSTICK0 lda JSTICK0
and #$0f and #$0f
@@ -1244,7 +1317,16 @@ WaitForKeyRelease .proc
rts rts
.endp .endp
;--------------------------------------------------
.proc RmtSongSelect
;--------------------------------------------------
; starting song line 0-255 to A reg
bit noMusic
spl:lda #song_silencio
ldx #<MODUL ;low byte of RMT module to X reg
ldy #>MODUL ;hi byte of RMT module to Y reg
jmp RASTERMUSICTRACKER ;Init, :RTS
.endp
;---------------------------------------------- ;----------------------------------------------
icl 'weapons.asm' icl 'weapons.asm'
;---------------------------------------------- ;----------------------------------------------
@@ -1266,6 +1348,7 @@ TankFont
;---------------------------------------------- ;----------------------------------------------
icl 'variables.asm' icl 'variables.asm'
;---------------------------------------------- ;----------------------------------------------
; reserved space for RMT player ; reserved space for RMT player
.ds $0320 .ds $0320
.align $100 .align $100
@@ -1274,7 +1357,7 @@ TankFont
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_trial0e_stripped.rmt" ;include music RMT module ins "artwork/sfx/scorch_trial0f_stripped.rmt" ;include music RMT module
opt h+ opt h+
; ;
; ;
BIN
View File
Binary file not shown.
+401 -191
View File
@@ -8,7 +8,7 @@
;---------------------------------------- ;----------------------------------------
;-------------------------------------------------- ;--------------------------------------------------
Options .proc .proc Options
;-------------------------------------------------- ;--------------------------------------------------
; start-up screen - options, etc. ; start-up screen - options, etc.
; this function returns: ; this function returns:
@@ -201,14 +201,9 @@ OptionsYLoop
;------------------------------------------- ;-------------------------------------------
; call of the purchase screens for each tank ; call of the purchase screens for each tank
.proc CallPurchaseForEveryTank .proc CallPurchaseForEveryTank
jsr PMoutofScreen
mwa #PurchaseDL dlptrs
lda dmactls
and #$fc
ora #$02 ; normal screen width
sta dmactls
mva #0 TankNr mva #0 TankNr
sta isInventory
@ @
ldx TankNr ldx TankNr
lda SkillTable,x lda SkillTable,x
@@ -231,17 +226,29 @@ AfterManualPurchase
;-------------------------------------------------- ;--------------------------------------------------
.proc Purchase ; .proc Purchase ;
;-------------------------------------------------- ;--------------------------------------------------
; TODO: when round ends with a weapon depleted the pointer points to an empty line
; In tanknr there is a number of the tank (player) ; In tanknr there is a number of the tank (player)
; that is buying weapons now (from 0). ; that is buying weapons now (from 0).
; Rest of the data is taken from appropriate tables ; Rest of the data is taken from appropriate tables
; and during the purchase these tables are modified. ; and during the purchase these tables are modified.
mva #0 dmactl
VDLI DLIinterruptText ; jsr SetDLI for text (purchase) screen
jsr PMoutofScreen
mwa #PurchaseDL dlptrs
lda dmactls
and #$fc
ora #$02 ; normal screen width
sta dmactls
mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons
ldx tankNr ldx tankNr
lda TankStatusColoursTable,x lda TankStatusColoursTable,x
sta colpf2s sta colpf2s
; we are clearing list of the weapons ; we are clearing list of the weapons
mva #$ff LastWeapon mva #$ff LastWeapon
mva #$00 WhichList mva #$00 WhichList
@@ -265,6 +272,8 @@ NextChar03
; here we must jump in after each purchase ; here we must jump in after each purchase
; to generate again list of available weapons ; to generate again list of available weapons
AfterPurchase AfterPurchase
; current cash display
mva #sfx_purchase sfx_effect mva #sfx_purchase sfx_effect
ldx tanknr ldx tanknr
lda moneyL,x lda moneyL,x
@@ -277,32 +286,44 @@ AfterPurchase
; 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
mwa #ListOfWeapons xbyte mwa #ListOfWeapons xbyte
ldx #$00 ; number of the checked weapon ldx #$00 ; index of the checked weapon
stx HowManyOnTheList1 ; amounts of weapons (shells, bullets) in both lists stx HowManyOnTheListOff ; amounts of weapons (shells, bullets) in both lists
stx HowManyOnTheList2 stx HowManyOnTheListDef
stx PositionOnTheList
; Creating full list of the available weapons for displaying ; Creating full list of the available weapons for displaying
; in X there is a number of the weapon to be checked, ; in X there is an index of the weapon to be checked,
; in 'Xbyte' address of the first char in filled screen line ; in 'Xbyte' address of the first char in filled screen line
CreateList CreateList
; checking if the weapon of the given number is present stx temp ; index of a weapon will be necessary later
; checking if the weapon of the given index is present
lda WeaponUnits,x lda WeaponUnits,x
jeq NoWeapon jeq NoWeapon
; checking if we can afford buying this weapon
ldy tanknr ldy tanknr
bit isInventory
jmi itIsInventory
; put "Purchase" on the screen
ldx #[purchaseTextEnd-purchaseText-1]
@ lda purchaseText,x
sta purchaseActivate,x
dex
bpl @-
; checking if we can afford buying this weapon
ldx temp
lda moneyH,y lda moneyH,y
cmp WeaponPriceH,x cmp WeaponPriceH,x
bne CheckWeapon01 bne @+
lda moneyL,y lda moneyL,y
cmp WeaponPriceL,x cmp WeaponPriceL,x
CheckWeapon01 @
jcc TooLittleCash jcc TooLittleCash
; we have enough cash and the weapon can be ; we have enough cash and the weapon can be
; added to the list ; added to the list
stx temp ; number of weapon will be necessary later
; first parentheses and other special chars ; first parentheses and other special chars
; (it's easier this way) ; (it's easier this way)
@@ -322,58 +343,65 @@ CheckWeapon01
lda #16 ; "0" lda #16 ; "0"
sta (xbyte),y sta (xbyte),y
; now symbol of the weapon ;now number of units (shells) to be purchased
lda WeaponSymbols,x adw xbyte #23 displayposition ; 23 chars from the beginning of the line
ldy #$4 ; 4 chars from the beginning of the line
sta (xbyte),y
;now number of purchased units (shells)
clc
lda xbyte
adc #23 ; 23 chars from the beginning of the line
sta displayposition
lda xbyte+1
adc #$00
sta displayposition+1
lda WeaponUnits,x lda WeaponUnits,x
sta decimal sta decimal
jsr displaybyte jsr displaybyte
ldx temp ;getting back number of the weapon ldx temp ;getting back index of the weapon
; and now price of the weapon ; and now price of the weapon
clc adw xbyte #27 displayposition ; 27 chars from the beginning of the line
lda xbyte
adc #27 ; 27 chars from the beginning of the line
sta displayposition
lda xbyte+1
adc #$00
sta displayposition+1
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 displaydec
lda temp ;getting back number of the weapon jmp notInventory
pha ;and saving it on the stack
itIsInventory
; put "Activate" on the screen
ldx #[purchaseTextEnd-purchaseText-1]
@ lda activateText,x
sta purchaseActivate,x
dex
bpl @-
ldx temp
lda TanksWeaponsTableL,y
sta weaponPointer
lda TanksWeaponsTableH,y
sta weaponPointer+1
ldy temp
lda (weaponPointer),y
jeq noWeapon
; clear price area
ldy #22 ; beginning of the price area
lda #0
@ sta (XBYTE),y
iny
cpy #32+1 ; end of price
bne @-
notInventory
; number of posessed shells
lda temp ; weapon index again
jsr HowManyBullets jsr HowManyBullets
sta decimal sta decimal
pla adw xbyte #1 displayposition
sta temp ; let's store weapon number again
clc
lda xbyte
adc #1 ; 1 char from the beginning of the screen
sta displayposition
lda xbyte+1
adc #$00
sta displayposition+1
jsr displaybyte jsr displaybyte
ldx temp ;weapon index
; now symbol of the weapon
lda WeaponSymbols,x
ldy #$4 ; 4 chars from the beginning of the line
sta (xbyte),y
; and now name of the weapon and finisheeeedd !!!! ; and now name of the weapon and finisheeeedd !!!!
ldx temp ;weapon number
mva #0 temp+1 ; this number is only in X mva #0 temp+1 ; this number is only in X
; times 16 (it's length of the names of weapons) ; times 16 (it's length of the names of weapons)
ldy #3 ; Rotate 4 times ldy #3 ; Rotate 4 times
@@ -383,55 +411,54 @@ CheckWeapon01
dey dey
bpl @- bpl @-
adw temp #NamesOfWeapons-6 modify adw temp #NamesOfWeapons-6 weaponPointer
ldy #6 ; from 6th char ldy #6 ; from 6th char on screen
@ @
lda (modify),y lda (weaponPointer),y
sta (xbyte),y sta (xbyte),y
iny iny
cpy #(16+6) cpy #(16+6)
bne @- bne @-
; in X there is what we need ; in X there is what we need (weapon index)
; If on screen after the purchase there is still ; If on screen after the purchase there is still
; present the weapon purchased recently, ; present the weapon purchased recently,
; the pointer must point to it. ; the pointer must point to it.
bit lastWeapon
bpl @+ ; if == $ff => first run, jump to top
mva #0 PositionOnTheList
beq NotTheSameAsLastTime
@
cpx LastWeapon cpx LastWeapon
bne NotTheSameAsLastTime bne NotTheSameAsLastTime
lda WhichList lda WhichList
bne ominx06 bne @+
lda HowManyOnTheList1 lda HowManyOnTheListOff
sta PositionOnTheList sta PositionOnTheList
jmp NotTheSameAsLastTime jmp NotTheSameAsLastTime
ominx06 @
lda HowManyOnTheList2 lda HowManyOnTheListDef
sta PositionOnTheList sta PositionOnTheList
NotTheSameAsLastTime NotTheSameAsLastTime
; increase appropriate counter ; increase appropriate counter
txa txa
cpx #$30 cpx #$30
bcs SecondList bcs DefenceList
ldy HowManyOnTheList1 ldy HowManyOnTheListOff
sta NubersOfWeaponsL1,y sta IndexesOfWeaponsL1,y
inc HowManyOnTheList1 inc HowManyOnTheListOff
bne NextLineOfTheList bne NextLineOfTheList
SecondList DefenceList
ldy HowManyOnTheList2 ldy HowManyOnTheListDef
sta NubersOfWeaponsL2,y sta IndexesOfWeaponsL2,y
inc HowManyOnTheList2 inc HowManyOnTheListDef
; If everything is copied then next line ; If everything is copied then next line
NextLineOfTheList NextLineOfTheList
clc adw xbyte #40
lda xbyte
adc #40
sta xbyte
bcc TooLittleCash
inc xbyte+1
TooLittleCash TooLittleCash
NoWeapon NoWeapon
@@ -464,7 +491,7 @@ WeHaveOffset
; of the first erased char. ; of the first erased char.
; (multiplying taken from book of Ruszczyc 'Assembler 6502' ; (multiplying taken from book of Ruszczyc 'Assembler 6502'
lda HowManyOnTheList1 lda HowManyOnTheListOff
sta xbyte+1 ; multiplier (temporarily here, it will be erased anyway) sta xbyte+1 ; multiplier (temporarily here, it will be erased anyway)
lda #$00 ; higher byte of the Result lda #$00 ; higher byte of the Result
sta xbyte ; lower byte of the Result sta xbyte ; lower byte of the Result
@@ -507,7 +534,7 @@ DoNotIncHigher1
; Multiply number on list 1 by 40 and set address ; Multiply number on list 1 by 40 and set address
; of the first erased char. ; of the first erased char.
lda HowManyOnTheList2 lda HowManyOnTheListDef
sta xbyte+1 ; multiplier sta xbyte+1 ; multiplier
lda #$00 ; higher byte of the Result lda #$00 ; higher byte of the Result
sta xbyte ; lower byte of the Result sta xbyte ; lower byte of the Result
@@ -550,18 +577,48 @@ DoNotIncHigher2
; screen clearing at each list refresh ; screen clearing at each list refresh
; (it was very ugly - I checked it :) ; (it was very ugly - I checked it :)
bit isInventory ;
bpl ChoosingItemForPurchase
lda whichList
bne PositionDefensive
; calculate positionOnTheList from the activeWeapon (offensives)
ldx tankNr
lda activeWeapon,x
ldy #0
@
cmp IndexesOfWeaponsL1,y
beq ?weaponfound
iny
cpy #48 ; maxOffensiveWeapons
bne @-
; not found apparently?
; TODO: check border case (the last weapon)
ldy #0
beq ?weaponFound ; jmp
PositionDefensive
jsr calcPosDefensive
?weaponFound
; weapon index in Y
sty positionOnTheList
; Here we have all we need ; Here we have all we need
; So choose the weapon for purchase ...... ; So choose the weapon for purchase ......
;-------------------------------------------------- ;--------------------------------------------------
ChoosingItemForPurchase ChoosingItemForPurchase
;-------------------------------------------------- ;--------------------------------------------------
jsr PutLitteChar ; Places pointer at the right position jsr PutLitteChar ; Places pointer at the right position
jsr getkey jsr getkey
ldx escFlag ldx escFlag
seq:rts seq:jmp WaitForKeyRelease ; like jsr ... : rts
cmp #$2c ; Tab cmp #$2c ; Tab
jeq ListChange jeq ListChange
cmp #$06 ; cursor left
jeq ListChange
cmp #$0c ; Return cmp #$0c ; Return
sne:rts sne:rts
cmp #$e cmp #$e
@@ -600,20 +657,18 @@ EndUpX
PurchaseKeyDown PurchaseKeyDown
lda WhichList lda WhichList
beq GoDown1 beq GoDown1
inc PositionOnTheList inc:lda PositionOnTheList
lda PositionOnTheList cmp HowManyOnTheListDef
cmp HowManyOnTheList2
bne EndGoDownX bne EndGoDownX
ldy HowManyOnTheList2 ldy HowManyOnTheListDef
dey dey
sty PositionOnTheList sty PositionOnTheList
jmp ChoosingItemForPurchase jmp ChoosingItemForPurchase
GoDown1 GoDown1
inc PositionOnTheList inc:lda PositionOnTheList
lda PositionOnTheList cmp HowManyOnTheListOff
cmp HowManyOnTheList1
bne MakeOffsetDown bne MakeOffsetDown
ldy HowManyOnTheList1 ldy HowManyOnTheListOff
dey dey
sty PositionOnTheList sty PositionOnTheList
MakeOffsetDown MakeOffsetDown
@@ -632,18 +687,31 @@ EndGoDownX
; swapping the displayed list and setting pointer to position 0 ; swapping the displayed list and setting pointer to position 0
ListChange ListChange
mva #0 OffsetDL1
lda WhichList lda WhichList
eor #$01 eor #$01
sta WhichList sta WhichList
bne SecondSelected bne DeffensiveSelected
mwa #ListOfWeapons WeaponsListDL mwa #ListOfWeapons WeaponsListDL
jmp @+ lda isInventory
SecondSelected beq @+
mwa #ListOfDefensiveWeapons WeaponsListDL ; inventory
jsr calcPosOffensive
jmp ChoosingItemForPurchase
@ @
lda #$00 mva #0 PositionOnTheList
sta PositionOnTheList jmp ChoosingItemForPurchase
sta OffsetDL1
DeffensiveSelected
mwa #ListOfDefensiveWeapons WeaponsListDL
lda isInventory
beq @+
jsr calcPosDefensive
jmp ChoosingItemForPurchase
@
mva #0 positionOnTheList
jmp ChoosingItemForPurchase jmp ChoosingItemForPurchase
.endp .endp
@@ -652,24 +720,23 @@ SecondSelected
;-------------------------------------------------- ;--------------------------------------------------
.proc PurchaseWeaponNow .proc PurchaseWeaponNow
;-------------------------------------------------- ;--------------------------------------------------
weaponPtr = temp bit isInventory
isPriceZero = tempXRoller bmi inventorySelect
lda WhichList lda WhichList
bne PurchaseDeffensive bne PurchaseDeffensive
; here we purchase the offensive weapon ; here we purchase the offensive weapon
ldy PositionOnTheList ldy PositionOnTheList
lda NubersOfWeaponsL1,y lda IndexesOfWeaponsL1,y
jmp PurchaseAll jmp PurchaseAll
PurchaseDeffensive PurchaseDeffensive
ldy PositionOnTheList ldy PositionOnTheList
lda NubersOfWeaponsL2,y lda IndexesOfWeaponsL2,y
PurchaseAll PurchaseAll
; after getting weapon number the routine is common for all ; after getting weapon index the routine is common for all
ldx tanknr ldx tanknr
tay ; weapon number is in Y tay ; weapon index is in Y
beq @+
sec sec
lda moneyL,x ; substracting from posessed money lda moneyL,x ; substracting from posessed money
sbc WeaponPriceL,y ; of price of the given weapon sbc WeaponPriceL,y ; of price of the given weapon
@@ -678,61 +745,141 @@ PurchaseAll
sbc WeaponPriceH,y sbc WeaponPriceH,y
sta moneyH,x sta moneyH,x
; save info about price == 0 positiveMoney
lda WeaponPriceL,y
ora WeaponPriceH,y
sta isPriceZero
; now we have to get address of ; now we have to get address of
; the table of the weapon of the tank ; the table of the weapon of the tank
; and add appropriate number of shells ; and add appropriate number of shells
lda TanksWeaponsTableL,x lda TanksWeaponsTableL,x
sta weaponPtr sta weaponPointer
lda TanksWeaponsTableH,x lda TanksWeaponsTableH,x
sta weaponPtr+1 sta weaponPointer+1
clc clc
lda (weaponPtr),y ; and we have number of posessed bullets of the weapon lda (weaponPointer),y ; and we have number of posessed bullets of the weapon
adc WeaponUnits,y adc WeaponUnits,y
sta (weaponPtr),y ; and we added appropriate number of bullets sta (weaponPointer),y ; and we added appropriate number of bullets
cmp #100 ; but there should be no more than 99 bullets cmp #100 ; but there should be no more than 99 bullets
bcc LessThan100 bcc LessThan100
lda #99 lda #99
sta (weaponPtr),y sta (weaponPointer),y
LessThan100 LessThan100
sty LastWeapon ; store last purchased weapon sty LastWeapon ; store last purchased weapon
; because we must put screen pointer next to it ; because we must put screen pointer next to it
; additional check for unfinished game mva #0 PositionOnTheList ; to move the pointer to the top when no more monies
; if weapon was free (price == $0)
; then have nothing...
lda isPriceZero
bne @+
lda #0
sta (weaponPtr),y
@
jmp Purchase.AfterPurchase jmp Purchase.AfterPurchase
inventorySelect
lda whichList
bne invSelectDef
ldy PositionOnTheList
lda IndexesOfWeaponsL1,y
ldx tankNr
sta activeWeapon,x
jmp WaitForKeyRelease ; rts
invSelectDef
ldy PositionOnTheList
lda IndexesOfWeaponsL2,y
tay
ldx tankNr
cmp #ind_Battery________
bne NotBattery
; if activate battery, we do it differently
mva #sfx_battery sfx_effect
mva #99 Energy,x
bne DecreaseDefensive ; bypass activation
NotBattery
cmp #ind_White_Flag_____
bne NotWhiteFlag
cmp ActiveDefenceWeapon,x
bne NoDeactivateWhiteFlag
mva #sfx_white_flag sfx_effect
lda #$00 ; if try to activate activated White Flag then deactivate Defence
sta ActiveDefenceWeapon,x
sta ShieldEnergy,x
beq DefActivationEnd
NotWhiteFlag
NoDeactivateWhiteFlag
sta ActiveDefenceWeapon,x
DecreaseDefensive
; decrease number of defensives
lda TanksWeaponsTableL,x
sta weaponPointer
lda TanksWeaponsTableH,x
sta weaponPointer+1
lda (weaponPointer),y
sec
sbc #1
sta (weaponPointer),y
lda DefensiveEnergy,y
sta ShieldEnergy,x
DefActivationEnd
jmp WaitForKeyRelease ; rts
.endp
; -----------------------------------------------------
.proc calcPosDefensive
; calculate positionOnTheList from the activeWeapon (defensives)
ldx tankNr
lda ActiveDefenceWeapon,x
beq ?noWeaponActive
ldy #0 ; min defensive weapon
@
cmp IndexesOfWeaponsL2,y
beq ?weaponfound
iny
cpy #8*2 ; maxDefensiveWeapon
bne @-
; not found apparently?
; TODO: check border case (the last weapon)
?noWeaponActive
ldy #0
?weaponFound
cpy howManyOnTheListDef
bcs ?noWeaponActive
sty positionOnTheList
rts
.endp .endp
.proc calcPosOffensive
; calculate positionOnTheList from the activeWeapon (defensives)
ldx tankNr
lda ActiveWeapon,x
beq ?noWeaponActive
ldy #0 ; min defensive weapon
@
cmp IndexesOfWeaponsL1,y
beq ?weaponfound
iny
cpy #8*5 ; maxOffensiveWeapon
bne @-
; not found apparently?
; TODO: check border case (the last weapon)
?noWeaponActive
ldy #0
?weaponFound
cpy howManyOnTheListOff
bcs ?noWeaponActive
sty positionOnTheList
rts
.endp
; -----------------------------------------------------
.proc PutLitteChar .proc PutLitteChar
; first let's cleat both lists from little chars ; first let's clear both lists from little chars
mwa #ListOfWeapons xbyte mwa #ListOfWeapons xbyte
ldx #52 ; there are 52 lines total ldx #52 ; there are 52 lines total
ldy #$00 ldy #$00
EraseLoop EraseLoop
lda #$00 tya ; lda #$00
sta (xbyte),y sta (xbyte),y
clc adw xbyte #40
lda xbyte
adc #40
sta xbyte
bcc ominx02
inc xbyte+1
ominx02
dex dex
bpl EraseLoop bpl EraseLoop
; now let's check which list is active now ; now let's check which list is active now
lda WhichList lda WhichList
beq CharToList1 beq CharToList1
@@ -742,13 +889,7 @@ ominx02
ldx PositionOnTheList ldx PositionOnTheList
beq SelectList2 ; if there is 0 we add nothing beq SelectList2 ; if there is 0 we add nothing
AddLoop2 AddLoop2
clc adw xbyte #40
lda xbyte
adc #40
sta xbyte
bcc ominx03
inc xbyte+1
ominx03
dex dex
bne AddLoop2 bne AddLoop2
SelectList2 SelectList2
@@ -770,13 +911,7 @@ CharToList1
ldx PositionOnTheList ldx PositionOnTheList
beq SelectList1 ; if there is 0 we add nothing beq SelectList1 ; if there is 0 we add nothing
AddLoop1 AddLoop1
clc adw xbyte #40
lda xbyte
adc #40
sta xbyte
bcc ominx04
inc xbyte+1
ominx04
dex dex
bne AddLoop1 bne AddLoop1
SelectList1 SelectList1
@@ -787,13 +922,7 @@ SelectList1
ldx OffsetDL1 ldx OffsetDL1
beq SetWindowList1 ; if zero then add nothing beq SetWindowList1 ; if zero then add nothing
LoopWindow1 LoopWindow1
clc adw xbyte #40
lda xbyte
adc #40
sta xbyte
bcc ominx05
inc xbyte+1
ominx05
dex dex
bne LoopWindow1 bne LoopWindow1
SetWindowList1 SetWindowList1
@@ -805,13 +934,13 @@ SetWindowList1
ldy #>EmptyLine ldy #>EmptyLine
lda OffsetDL1 lda OffsetDL1
beq NoArrowUp beq NoArrowUp
ldx #<MoreUp ldx #<MoreUp
ldy #>MoreUp ldy #>MoreUp
NoArrowUp NoArrowUp
stx MoreUpdl stx MoreUpdl
sty MoreUpdl+1 sty MoreUpdl+1
; the same, bu scrolling down ; the same, bu scrolling down
lda HowManyOnTheList1 lda HowManyOnTheListOff
ldx #<EmptyLine ldx #<EmptyLine
ldy #>EmptyLine ldy #>EmptyLine
sec sec
@@ -819,8 +948,8 @@ NoArrowUp
bmi NoArrowDown bmi NoArrowDown
cmp OffsetDL1 cmp OffsetDL1
bcc NoArrowDown bcc NoArrowDown
ldx #<MoreDown ldx #<MoreDown
ldy #>MoreDown ldy #>MoreDown
NoArrowDown NoArrowDown
stx MoreDowndl stx MoreDowndl
sty MoreDowndl+1 sty MoreDowndl+1
@@ -1200,6 +1329,8 @@ space dta d" "
;that's easy because we have number of tank ;that's easy because we have number of tank
;and xtankstableL and H keep X position of a given tank ;and xtankstableL and H keep X position of a given tank
;save vars (messed when printing...)
lda xtankstableL,y lda xtankstableL,y
sta temp sta temp
lda xtankstableH,y lda xtankstableH,y
@@ -1320,12 +1451,12 @@ DOTNcharloop
asl asl
clc clc
adc TextPositionX adc TextPositionX
sta Xdraw sta dx
lda #0 lda #0
adc TextPositionX+1 adc TextPositionX+1
sta Xdraw+1 sta dx+1
lda TextPositionY lda TextPositionY
sta ydraw sta dy
jsr PutChar4x4 jsr PutChar4x4
inc TextCounter inc TextCounter
@@ -1343,6 +1474,7 @@ DOTNcharloop
;address in LineAddress4x4 ;address in LineAddress4x4
;starting from LineXdraw, LineYdraw ;starting from LineXdraw, LineYdraw
ldy #0 ldy #0
sty LineCharNr sty LineCharNr
@@ -1355,8 +1487,8 @@ TypeLine4x4Loop
beq EndOfTypeLine4x4 beq EndOfTypeLine4x4
sta CharCode4x4 sta CharCode4x4
mwa LineXdraw Xdraw mwa LineXdraw dx
mva LineYdraw Ydraw mva LineYdraw dy
mva #1 plot4x4color mva #1 plot4x4color
jsr PutChar4x4 ;type empty pixels as well! jsr PutChar4x4 ;type empty pixels as well!
adw LineXdraw #4 adw LineXdraw #4
@@ -1372,10 +1504,6 @@ EndOfTypeLine4x4
.proc AreYouSure .proc AreYouSure
;using 4x4 font ;using 4x4 font
;save vars (messed in TypeLine4x4)
mwa Xdraw xk
mva Ydraw yc
mva #4 ResultY ; where seppuku text starts Y-wise on the screen mva #4 ResultY ; where seppuku text starts Y-wise on the screen
;top frame ;top frame
@@ -1405,7 +1533,7 @@ EndOfTypeLine4x4
skip01 skip01
;clean ;clean
mva #3 dx mva #3 di
mva #4 ResultY mva #4 ResultY
@ @
mva #1 plot4x4color mva #1 plot4x4color
@@ -1415,23 +1543,16 @@ skip01
jsr TypeLine4x4 jsr TypeLine4x4
adb ResultY #4 ;next line adb ResultY #4 ;next line
dec dx dec di
bne @- bne @-
quit_areyousure quit_areyousure
;restore vars
mva yc Ydraw
mwa xk Xdraw
rts rts
.endp .endp
;-------------------------------- ;--------------------------------
.proc DisplaySeppuku .proc DisplaySeppuku
;using 4x4 font ;using 4x4 font
;save vars (messed in TypeLine4x4)
mwa Xdraw xk
mva Ydraw yc
mva #20 fs ; temp, how many times blink the billboard mva #20 fs ; temp, how many times blink the billboard
seppuku_loop seppuku_loop
@@ -1459,7 +1580,7 @@ seppuku_loop
;clean seppuku ;clean seppuku
mva #3 dx mva #3 di
mva #4 ResultY mva #4 ResultY
@ @
mwa #lineClear LineAddress4x4 mwa #lineClear LineAddress4x4
@@ -1468,24 +1589,22 @@ seppuku_loop
jsr TypeLine4x4 jsr TypeLine4x4
adb ResultY #4 ;next line adb ResultY #4 ;next line
dec dx dec di
bne @- bne @-
dec fs dec fs
jne seppuku_loop jne seppuku_loop
quit_seppuku quit_seppuku
;restore vars
mva yc Ydraw
mwa xk Xdraw
rts rts
.endp .endp
;-------------------------------- ;--------------------------------
.proc DisplayResults ; .proc DisplayResults ;
;displays results of the round ;displays results of the round
;using 4x4 font ;using 4x4 font
jsr RoundOverSprites
mva #sfx_smoke_cloud sfx_effect
mva #1 plot4x4color mva #1 plot4x4color
;centering the result screen ;centering the result screen
@@ -1515,6 +1634,8 @@ quit_seppuku
beq @+ ;unconditional jump, because TypeLine4x4 ends with beq beq @+ ;unconditional jump, because TypeLine4x4 ends with beq
GameOver4x4 GameOver4x4
lda #song_game_over
jsr RmtSongSelect
mwa #LineGameOver LineAddress4x4 mwa #LineGameOver LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw mva ResultY LineYdraw
@@ -1690,8 +1811,6 @@ FinishResultDisplay
bpl @- bpl @-
adw temp #NamesOfWeapons adw temp #NamesOfWeapons
ldy #6 ; from 6th character
ldy #15 ldy #15
@ @
lda (temp),y lda (temp),y
@@ -1699,6 +1818,39 @@ FinishResultDisplay
dey dey
bpl @- bpl @-
;---------------------
;displaying name of the defence weapon (if active)
;---------------------
lda #$08 ; (
sta textbuffer+80+22
lda #$09 ; )
sta textbuffer+80+39
lda ActiveDefenceWeapon,x
bne ActiveDefence
; clear brackets
lda #$00 ; space
sta textbuffer+80+22
sta textbuffer+80+39
lda #47 ; no weapon name
ActiveDefence
sta temp ;get back number of the weapon
mva #0 temp+1
; times 16 (because this is length of weapon name)
ldy #3 ; shift left 4 times
@
aslw temp
dey
bpl @-
adw temp #NamesOfWeapons
ldy #15
@
lda (temp),y
sta textbuffer+40+40+23,y
dey
bpl @-
;--------------------- ;---------------------
;displaying the energy of a tank ;displaying the energy of a tank
;--------------------- ;---------------------
@@ -1709,6 +1861,31 @@ FinishResultDisplay
mwa #textbuffer+48 displayposition mwa #textbuffer+48 displayposition
jsr displaybyte jsr displaybyte
;---------------------
;displaying the energy of a tank shield (if exist)
;---------------------
; clear (if no shield)
lda #$00 ; space
sta textbuffer+40+10
sta textbuffer+40+11
sta textbuffer+40+12
sta textbuffer+40+13
; check shield energy and display it
ldx TankNr
lda ActiveDefenceWeapon,x
beq NoDefenceWeapon
lda ShieldEnergy,x
beq NoShieldEnergy
sta decimal ; displayed value
lda #$08 ; (
sta textbuffer+40+10
mwa #textbuffer+40+11 displayposition
jsr displaybyte
lda #$09 ; )
sta textbuffer+40+13
NoDefenceWeapon
NoShieldEnergy
;========================= ;=========================
;display Force ;display Force
;========================= ;=========================
@@ -1717,7 +1894,7 @@ FinishResultDisplay
sta decimal sta decimal
lda ForceTableH,x lda ForceTableH,x
sta decimal+1 sta decimal+1
mwa #textbuffer+40+34 displayposition mwa #textbuffer+40+36 displayposition
jsr displaydec jsr displaydec
;========================= ;=========================
@@ -1729,9 +1906,9 @@ FinishResultDisplay
lda AngleTable,x lda AngleTable,x
bmi AngleToLeft bmi AngleToLeft
lda #$7f ; (tab) character lda #$7f ; (tab) character
sta textbuffer+40+23 sta textbuffer+40+25
lda #0 ;space lda #0 ;space
sta textbuffer+40+20 sta textbuffer+40+22
lda #90 lda #90
sec sec
sbc AngleTable,x sbc AngleTable,x
@@ -1748,12 +1925,12 @@ AngleToLeft
lda BarrelTableL,y lda BarrelTableL,y
sta CharCode sta CharCode
lda #$7e ;(del) char lda #$7e ;(del) char
sta textbuffer+40+20 sta textbuffer+40+22
lda #0 ;space lda #0 ;space
sta textbuffer+40+23 sta textbuffer+40+25
AngleDisplay AngleDisplay
mwa #textbuffer+40+21 displayposition mwa #textbuffer+40+23 displayposition
jsr displaybyte jsr displaybyte
;========================= ;=========================
@@ -1763,9 +1940,9 @@ AngleDisplay
lda Wind+3 ; highest byte of 4 byte wind lda Wind+3 ; highest byte of 4 byte wind
bmi DisplayLeftWind bmi DisplayLeftWind
lda #$7f ; (tab) char lda #$7f ; (tab) char
sta textbuffer+80+28 sta textbuffer+80+20
lda #0 ;space lda #0 ;space
sta textbuffer+80+25 sta textbuffer+80+17
beq DisplayWindValue beq DisplayWindValue
DisplayLeftWind DisplayLeftWind
sec ; Wind = -Wind sec ; Wind = -Wind
@@ -1776,14 +1953,14 @@ DisplayLeftWind
sbc temp+1 sbc temp+1
sta temp+1 sta temp+1
lda #$7e ;(del) char lda #$7e ;(del) char
sta textbuffer+80+25 sta textbuffer+80+17
lda #0 ;space lda #0 ;space
sta textbuffer+80+28 sta textbuffer+80+20
DisplayWindValue DisplayWindValue
:4 lsrw temp ;divide by 16 to have a nice value on a screen :4 lsrw temp ;divide by 16 to have a nice value on a screen
lda temp lda temp
sta decimal sta decimal
mwa #textbuffer+80+26 displayposition mwa #textbuffer+80+18 displayposition
jsr displaybyte jsr displaybyte
;========================= ;=========================
@@ -1791,7 +1968,7 @@ DisplayWindValue
;========================= ;=========================
lda CurrentRoundNr lda CurrentRoundNr
sta decimal sta decimal
mwa #textbuffer+80+14 displayposition mwa #textbuffer+80+7 displayposition
jsr displaybyte ;decimal (byte), displayposition (word) jsr displaybyte ;decimal (byte), displayposition (word)
rts rts
@@ -1815,5 +1992,38 @@ NextChar02
rts rts
.endp .endp
;------------------------------------------------- ;-------------------------------------------------
.proc RoundOverSprites
; fill sprites with bytes
ldy numberOfPlayers
dey
lda gameOverSpritesTop,y
sta temp
; clean the whole sprite
lda #0
tax
@ sta PMGraph+$400,x
sta PMGraph+$500,x
dex
bne @-
; set background
lda #$ff
ldx #100 ; top of the sprites
@ sta PMGraph+$400,x
sta PMGraph+$500,x
inx
cpx temp
bne @-
GOSbeg = 112
mva #GOSbeg hposp0
mva #GOSbeg+12 hposp0+1
mva #15 COLPM0S
sta COLPM1S
rts
.endp
;-------------------------------------------------
.endif .endif
+16 -10
View File
@@ -19,6 +19,8 @@ seppukuVal .by 75
skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
.DS [MaxPlayers] .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
@@ -30,6 +32,8 @@ RoundNrDisplay
;===================================================== ;=====================================================
variablesStart ; zeroing starts here variablesStart ; zeroing starts here
;===================================================== ;=====================================================
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 sfx_effect .ds 1
@@ -66,6 +70,8 @@ looseL
;---------------------------------------------------- ;----------------------------------------------------
Energy Energy
.DS [MaxPlayers] .DS [MaxPlayers]
ShieldEnergy
.DS [MaxPlayers]
EnergyDecrease .DS 1 EnergyDecrease .DS 1
eXistenZ eXistenZ
.DS [MaxPlayers] .DS [MaxPlayers]
@@ -95,6 +101,8 @@ 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
.DS [MaxPlayers]
WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile
;---------------------------------------------------- ;----------------------------------------------------
@@ -114,7 +122,7 @@ MaxWind .ds 1 ;
WindOrientation .DS 1 ;(0-right,1-left) WindOrientation .DS 1 ;(0-right,1-left)
;---------------------------------------------------- ;----------------------------------------------------
Counter .DS 1 ;temporary Counter for outside loops Counter .DS 1 ;temporary Counter for outside loops
HitFlag .DS 1 ;1 when missile hit anything HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
;---------------------------------------------------- ;----------------------------------------------------
xtankstableL ;X positions of tanks (lower left point) xtankstableL ;X positions of tanks (lower left point)
.DS [MaxPlayers] .DS [MaxPlayers]
@@ -239,22 +247,20 @@ temptankNr .DS 1
;---------------------------------------------------- ;----------------------------------------------------
;Variables from textproc.s65 ;Variables from textproc.s65
; tables with numbers of weapons on the right lists ; tables with indexes of weapons on the right lists
; to be honest - I do not know at the moment what the above
; comment was supposed to mean...
; OK (2022) so, L1 is list of offensive weapons, L2 - defensive ; OK (2022) so, L1 is list of offensive weapons, L2 - defensive
NubersOfWeaponsL1 IndexesOfWeaponsL1
.ds 8*5 ; :(8*5) .by $ff .ds 8*5 ; max 40 offensive weapons. this is wrong, should be 48, still only 32 defined.
NubersOfWeaponsL2 IndexesOfWeaponsL2
.ds 8*2 ; :(8*2) .by $ff .ds 8*2 ; max 16 defensive weapons.
;---------------------------------------------------- ;----------------------------------------------------
; variables storing amount of weapons on the first and second ; variables storing amount of weapons on the first and second
; list and pointer position ; list and pointer position
HowManyOnTheList1 HowManyOnTheListOff
.DS 1 .DS 1
HowManyOnTheList2 HowManyOnTheListDef
.DS 1 .DS 1
PositionOnTheList ; pointer position on the list being displayed PositionOnTheList ; pointer position on the list being displayed
.DS 1 .DS 1
+381 -78
View File
@@ -33,7 +33,7 @@ ExplosionRoutines
.word VOID-1 ;napalm .word VOID-1 ;napalm
.word VOID-1 ;hotnapalm .word VOID-1 ;hotnapalm
.word tracer-1 .word tracer-1
.word VOID-1 ;smoketracer .word tracer-1 ;smoketracer
.word babyroller-1 .word babyroller-1
.word roller-1 .word roller-1
.word heavyroller-1 .word heavyroller-1
@@ -57,6 +57,7 @@ ExplosionRoutines
.word laser-1 .word laser-1
VOID VOID
tracer
rts rts
.endp .endp
; ------------------------ ; ------------------------
@@ -102,14 +103,7 @@ VOID
jsr xmissile jsr xmissile
; soil must fall down now! there is no other way... ; soil must fall down now! there is no other way...
;first clean the offensive text...
ldy TankNr
mva #0 plot4x4color
jsr DisplayOffensiveTextNr
; hide tanks or they fall down with soil ; hide tanks or they fall down with soil
lda TankNr lda TankNr
pha pha
mva #1 Erase mva #1 Erase
@@ -130,6 +124,7 @@ VOID
mva LeapFrogAngle Angle mva LeapFrogAngle Angle
mva #sfx_funky_hit sfx_effect mva #sfx_funky_hit sfx_effect
sbw ytraj+1 #$05 ; next missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1)
jsr Flight jsr Flight
lda HitFlag lda HitFlag
beq EndOfLeapping beq EndOfLeapping
@@ -159,6 +154,7 @@ VOID
ror Force ror Force
mva LeapFrogAngle Angle mva LeapFrogAngle Angle
mva #sfx_funky_hit sfx_effect mva #sfx_funky_hit sfx_effect
sbw ytraj+1 #$05 ; next missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1)
jsr Flight jsr Flight
lda HitFlag lda HitFlag
beq EndOfLeapping beq EndOfLeapping
@@ -178,17 +174,13 @@ EndOfLeapping
.proc funkybomb ; .proc funkybomb ;
mva #sfx_baby_missile sfx_effect mva #sfx_baby_missile sfx_effect
mwa xtraj+1 xtrajfb mwa xtraj+1 xtrajfb
mwa ytraj+1 ytrajfb sbw ytraj+1 #$05 ytrajfb ; funky missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1)
inc FallDown2 inc FallDown2
;central Explosion ;central Explosion
mva #21 ExplosionRadius mva #21 ExplosionRadius
jsr CalculateExplosionRange0 jsr CalculateExplosionRange0
jsr xmissile jsr xmissile
ldy TankNr
mva #0 plot4x4color
jsr DisplayOffensiveTextNr
lda TankNr lda TankNr
pha pha
mva #1 Erase mva #1 Erase
@@ -273,10 +265,6 @@ NoLowerCircle
rts rts
.endp .endp
; ------------------------ ; ------------------------
.proc tracer
rts
.endp
; ------------------------
.proc babyroller .proc babyroller
inc FallDown2 inc FallDown2
mva #11 ExplosionRadius mva #11 ExplosionRadius
@@ -663,12 +651,39 @@ DistanceCheckLoop
adc #1 adc #1
:3 asl :3 asl
tay tay
; check shields
lda ActiveDefenceWeapon,x
cmp #ind_Shield_________ ; one hit shield
beq UseShield
cmp #ind_Force_Shield___ ; shield with energy and parachute
beq UseShieldWithEnergy
cmp #ind_Heavy_Shield___ ; shield with energy
beq UseShieldWithEnergy
cmp #ind_Auto_Defense___ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
beq UseShieldWithEnergy
cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
beq UseShieldWithEnergy
jsr DecreaseEnergyX jsr DecreaseEnergyX
jmp EndOfDistanceCheckLoop
UseShieldWithEnergy
jsr DecreaseShieldEnergyX
cpy #0 ; is necessary to reduce tenk energy ?
beq ShieldCoveredTank
jsr DecreaseEnergyX
ShieldCoveredTank
lda ShieldEnergy,x
jne EndOfDistanceCheckLoop
ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :)
UseShield
mva #1 Erase
phx
jsr DrawTankShield
plx
mva #0 ActiveDefenceWeapon,x ; deactivate defense weapons
TankIsNotWithinTheRange TankIsNotWithinTheRange
EndOfDistanceCheckLoop EndOfDistanceCheckLoop
txa txa
bne DistanceCheckLoop jne DistanceCheckLoop
mva #sfx_silencer sfx_effect mva #sfx_silencer sfx_effect
rts rts
.endp .endp
@@ -740,7 +755,7 @@ UpNotYet
sbc #1 sbc #1
sta ydraw sta ydraw
;check tank collision prior to PLOT ;check tank collision prior to PLOT
sty HitFlag sty HitFlag ; set to 0
jsr CheckCollisionWithTank jsr CheckCollisionWithTank
@@ -1007,13 +1022,11 @@ ContinueToCheckMaxForce2
; $f3 - shift+key ; $f3 - shift+key
notpressed notpressed
lda TRIG0S
beq notpressed
lda SKSTAT lda SKSTAT
cmp #$ff cmp #$ff
beq checkJoy jeq checkJoy
cmp #$f7 ; SHIFT cmp #$f7 ; SHIFT
beq checkJoy jeq checkJoy
lda kbcode lda kbcode
and #%10111111 ; SHIFT elimination and #%10111111 ; SHIFT elimination
@@ -1026,6 +1039,23 @@ notpressed
;---esc pressed-quit game--- ;---esc pressed-quit game---
rts rts
@
cmp #$0d ; I
bne @+
callInventory
; Hide all tanks - after inventory they may have other shapes
mva #1 Erase
jsr DrawTanks
mva #0 Erase
;
mva #$ff isInventory
jsr Purchase
mva #0 escFlag
jsr DisplayStatus
jsr SetMainScreen
jsr DrawTanks
jsr WaitForKeyRelease
jmp BeforeFire
@ @
cmp #$8e cmp #$8e
jeq CTRLPressedUp jeq CTRLPressedUp
@@ -1048,6 +1078,10 @@ jumpFromStick
jeq pressedSpace jeq pressedSpace
cmp #$2c cmp #$2c
jeq pressedTAB jeq pressedTAB
cmp #$25 ; M
jeq pressedM
cmp #$3e ; S
jeq pressedS
jmp notpressed jmp notpressed
checkJoy checkJoy
;------------JOY------------- ;------------JOY-------------
@@ -1064,10 +1098,17 @@ notpressedJoy
;fire ;fire
lda TRIG0S lda TRIG0S
jeq pressedSpace jeq pressedSpace
mva #$ff pressTimer ; stop counting frames
jmp notpressed jmp notpressed
; ;
pressedUp pressedUp
lda pressTimer
spl:mva #0 pressTimer ; if >128 then reset to 0
cmp #25 ; 1/2s
bcs CTRLPressedUp
;force increaseeee! ;force increaseeee!
ldx TankNr ldx TankNr
inc ForceTableL,x inc ForceTableL,x
@@ -1104,6 +1145,11 @@ CTRLPressedUp
pressedDown pressedDown
lda pressTimer
spl:mva #0 pressTimer ; if >128 then reset to 0
cmp #25 ; 1/2s
bcs CTRLPressedDown
mva #sfx_set_power_1 sfx_effect mva #sfx_set_power_1 sfx_effect
ldx TankNr ldx TankNr
@@ -1193,10 +1239,33 @@ CTRLpressedTAB
jsr WaitForKeyRelease jsr WaitForKeyRelease
jmp BeforeFire jmp BeforeFire
pressedM
; have you tried turning the music off and on again?
lda #$ff
eor:sta noMusic
lda #song_ingame
jsr RmtSongSelect
jsr WaitForKeyRelease
jmp BeforeFire
pressedS
; have you tried turning sfx off and on again?
lda #$ff
eor:sta noSfx
jsr WaitForKeyRelease
jmp BeforeFire
pressedSpace pressedSpace
;================================= ;=================================
;we shoot here!!! ;we shoot here!!!
mva #0 pressTimer ; reset
jsr WaitForKeyRelease
lda pressTimer
cmp #25 ; 1/2s
bcc fire
jmp callInventory
fire
RTS RTS
.endp .endp
@@ -1225,7 +1294,7 @@ RandomizeOffensiveText
ldx TankNr ldx TankNr
lda ActiveWeapon,x lda ActiveWeapon,x
cmp #$20 ; laser cmp #ind_Laser__________ ; laser
bne NotStrongShoot bne NotStrongShoot
mva #0 color mva #0 color
lda #7 lda #7
@@ -1269,9 +1338,20 @@ AfterStrongShoot
sbc #$00 sbc #$00
sta ytraj+2 sta ytraj+2
; checking if the shot is underground (no Flight but Hit :) )
ldy #0
adw xtraj+1 #mountaintable temp
lda ytraj+1
cmp (temp),y ; check collision witch mountains
bcs ShotUnderGround
jsr Flight jsr Flight
mva #1 color mva #1 color
rts rts
ShotUnderGround
mwa xtraj+1 xdraw ; but why not XHit and YHit !!!???
mwa ytraj+1 ydraw
mva #$ff HitFlag
rts
.endp .endp
@@ -1285,9 +1365,15 @@ AfterStrongShoot
sta Parachute sta Parachute
; let's check if the given tank has got the parachute ; let's check if the given tank has got the parachute
lda #$35 ; parachute ldx TankNr
jsr HowManyBullets lda ActiveDefenceWeapon,x
beq TankFallsX cmp #ind_Parachute______ ; parachute
beq ParachuteActive
cmp #ind_StrongParachute ; strong parachute
beq ParachuteActive
cmp #ind_Force_Shield___ ; shield witch energy and parachute
bne TankFallsX
ParachuteActive
inc Parachute inc Parachute
TankFallsX TankFallsX
; coordinates of the first pixel under the tank ; coordinates of the first pixel under the tank
@@ -1355,6 +1441,44 @@ ItStillFalls
FallDiagonally FallDiagonally
NoFallingDown NoFallingDown
ParachutePresent ParachutePresent
; check parachute type
lda ActiveDefenceWeapon,x
cmp #ind_StrongParachute ; strong parachute
bne OneTimeParachute
; decreasing energy of parachute - if the vertical fall, substract 2
; and if at an angle then substract 1
ldy #1 ; how much energy to substract
lda IfFallDown
and #1
beq NoFallingDown2
ldx TankNr
jsr DecreaseShieldEnergyX
cpy #0 ; is necessary to reduce tenk energy ?
beq @+
jsr DecreaseEnergyX
@
ldy #1
lda IfFallDown
and #6
bne FallDiagonally2
ldx TankNr
jsr DecreaseShieldEnergyX
cpy #0 ; is necessary to reduce tenk energy ?
beq @+
jsr DecreaseEnergyX
@
; check energy of parachute
lda ShieldEnergy,x
bne OneTimeParachute
mva #0 Parachute
mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute)
; and now we must clear parachute symbol
mva #1 Erase
jsr DrawTankParachute
FallDiagonally2
NoFallingDown2
OneTimeParachute
; we must set flag meaning that the tank was falling down ; we must set flag meaning that the tank was falling down
; because later maybe the number of parachutes will decrease ; because later maybe the number of parachutes will decrease
; (if there were parachutes and they were ON) ; (if there were parachutes and they were ON)
@@ -1362,7 +1486,7 @@ ParachutePresent
lda Parachute lda Parachute
ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) ora #2 ; we set bit nr 1 (nr 0 means that parachute is present)
sta Parachute sta Parachute
testowanie
; storing last direction of falling ; storing last direction of falling
; (it is not necessarily the direction from the previous ; (it is not necessarily the direction from the previous
; iteraction, so we must check directional bits before storing) ; iteraction, so we must check directional bits before storing)
@@ -1410,17 +1534,7 @@ NotRightEdge
beq DoNotClearParachute beq DoNotClearParachute
; here we clear the parachute ; here we clear the parachute
ldx TankNr ldx TankNr
lda #$34 jsr DrawTankParachute
sta CharCode
lda Ytankstable,x
sec
sbc #8
sta ydraw
lda XtanksTableL,x
sta xdraw
lda XtanksTableH,x
sta xdraw+1
jsr TypeChar
DoNotClearParachute DoNotClearParachute
mva #0 Erase mva #0 Erase
ldx TankNr ldx TankNr
@@ -1463,17 +1577,7 @@ DoesNotFallRight
; here we draw parachute ; here we draw parachute
ldx TankNr ldx TankNr
lda #$34 jsr DrawTankParachute
sta CharCode
lda Ytankstable,x
sec
sbc #8
sta ydraw
lda XtanksTableL,x
sta xdraw
lda XtanksTableH,x
sta xdraw+1
jsr TypeChar
DoNotDrawParachute DoNotDrawParachute
lda EndOfTheFallFlag lda EndOfTheFallFlag
jeq TankFallsX jeq TankFallsX
@@ -1489,7 +1593,25 @@ EndOfFall
; first we clear parachute on the screen ; first we clear parachute on the screen
mva #1 Erase mva #1 Erase
ldx TankNr ldx TankNr
lda #$34 lda ActiveDefenceWeapon,x
cmp #ind_Parachute______ ; deactivate weapon only if parachute (54)
bne NoParachuteWeapon
mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute)
NoParachuteWeapon
jsr DrawTankParachute
mva #0 Erase
ldx TankNr
jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) )
ThereWasNoParachute
mva #sfx_silencer sfx_effect
rts
.endp
;--------------------------------------------------
.proc DrawTankParachute
;Tank number in X
;--------------------------------------------------
lda #$34 ; parachute symbol
sta CharCode sta CharCode
lda Ytankstable,x lda Ytankstable,x
sec sec
@@ -1500,16 +1622,8 @@ EndOfFall
lda XtanksTableH,x lda XtanksTableH,x
sta xdraw+1 sta xdraw+1
jsr TypeChar jsr TypeChar
mva #0 Erase rts
; now we can deduct one parachute from the list of weapons
lda #$35 ; parachute
jsr DecreaseWeapon
ThereWasNoParachute
mva #sfx_silencer sfx_effect
rts
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
.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
@@ -1537,6 +1651,7 @@ noSmokeTracer
sty SmokeTracerFlag sty SmokeTracerFlag
RepeatIfSmokeTracer RepeatIfSmokeTracer
RepeatFlight
mwa ytraj+1 Ytrajold+1 mwa ytraj+1 Ytrajold+1
mwa xtraj+1 Xtrajold+1 mwa xtraj+1 Xtrajold+1
mva #%01000000 drawFunction mva #%01000000 drawFunction
@@ -1775,8 +1890,6 @@ EndOfFlight
jsr unPlot jsr unPlot
mwa xcircle xdraw mwa xcircle xdraw
mwa ycircle ydraw mwa ycircle ydraw
; mwa XHit xdraw
; mva YHit ydraw
ldy SmokeTracerFlag ldy SmokeTracerFlag
beq EndOfFlight2 beq EndOfFlight2
@@ -1785,7 +1898,71 @@ EndOfFlight
jmp SecondFlight jmp SecondFlight
EndOfFlight2 EndOfFlight2
mva #0 tracerflag ; don't know why mva #0 tracerflag ; don't know why
rts
; and now check for defensive-aggressive weapon
lda HitFlag
jeq NoHitAtEndOfFight ; RTS only !!!
jmi NoTankHitAtEndOfFight
; tank hit - check defensive weapon of this tank
tax
dex ; index of tank in X
lda ActiveDefenceWeapon,x
cmp #ind_Auto_Defense___ ; Auto Defence
beq AutoDefence
cmp #ind_Mag_Deflector__ ; Mag Deflector
bne NoDefence
MagDeflector
; now run defensive-aggressive weapon - Mag Deflector!
; get tank position
clc
lda xtankstableL,x
adc #$04 ; almost in tak center :)
sta XHit
lda xtankstableH,x
adc #$00
sta XHit+1
lda #$ff ; change to ground hit (we hope)
sta HitFlag
bit random ; left or right deflection ?
bpl RightDeflection
LeftDeflection
sbw XHit #18 ; 18 pixels to right and explode...
bit XHit+1 ; if off-screen ...
bpl EndOfMagDeflector ; hit of course but we need RTS
adw XHit #36 ; change to right :)
jmp EndOfMagDeflector
RightDeflection
adw XHit #18 ; 18 pixels to right and explode...
cpw XHit screenwidth ; if off-screen ...
bcs EndOfMagDeflector ; hit of course but we need RTS
sbw XHit #36 ; change to left
EndOfMagDeflector
mwa XHit xdraw ; why? !!!
NoTankHitAtEndOfFight
NoHitAtEndOfFight
NoDefence
rts ; END !!!
AutoDefence
; now run defensive-aggressive weapon - Auto Defence!
sbb #255 LeapFrogAngle Angle ; swap angle (LeapFrogAngle - because we have strored angle in this variable)
lsrw Force ; Force = Force / 2 - becouse earlier we multiplied by 2
mva #1 Erase ; now erase shield
phx
jsr DrawTankShield
jsr DrawTankShieldHorns
plx
lda #$00
sta Erase
sta ActiveDefenceWeapon,x ; deactivate used Auto Defence
sta ShieldEnergy,x
sta xtraj ; prepare coordinates
sta ytraj
sta xtraj+2
sta ytraj+2
mwa XHit xtraj+1
sbw YHit #5 ytraj+1
mva #1 color
jmp RepeatFlight ; and repeat Fight
.endp .endp
.proc SecondFlight .proc SecondFlight
@@ -2157,18 +2334,108 @@ MIRValreadyAll
mva tempor2 TankNr mva tempor2 TankNr
mva #0 Erase mva #0 Erase
jsr SoilDown2 jsr SoilDown2
mva #1 HitFlag mva #$ff HitFlag ; but why ??
;jsr drawtanks ;jsr drawtanks
rts rts
.endp .endp
; -------------------------------------------------
.proc WhiteFlag
; -------------------------------------------------
; This routine is run from inside of the main loop
; and replaces Shoot and Flight routines
; X and TankNr - index of shooting tank
; -------------------------------------------------
mva #sfx_death_begin sfx_effect
jsr FlashTank ; first we flash tank
mva #1 Erase
jsr DrawTankNr ; and erase tank
mva #0 Erase
ldx TankNr
sta Energy,x ; clear tank energy
sta eXistenZ,x ; erase from existence
sta LASTeXistenZ,x ; to prevent explosion
sta ActiveDefenceWeapon,x ; deactivate White Flag
jsr PMoutofScreen
jsr drawtanks ; for restore PM
mva #sfx_silencer sfx_effect
rts
.endp
; -------------------------------------------------
.proc NuclearWinter
; -------------------------------------------------
; This routine is run from inside of the main loop
; and replaces Shoot and Flight routines
; X and TankNr - index of shooting tank
; -------------------------------------------------
mva #sfx_sandhog sfx_effect
ldy #0 ; byte counter (from 0 to 39)
NextColumn
; big loop - we repat internal loops for each column of bytes
sty magic
ldx #120 ; line counter (from 0 to 60 )
; first loop - inverse column of bytes for a while
ldy magic
NextLine1
jsr InverseScreenByte
dex
dex
bpl NextLine1
;
wait ; wait uses A and Y
; second loop - inverse again and put random "snow" to column of bytes
ldx #120
ldy magic
mva #$55 magic+1
NextLine2
jsr InverseScreenByte
lda random
ora magic+1
and (temp),y
sta (temp),y
lda magic+1
eor #$ff
sta magic+1
dex
dex
bpl NextLine2
; and go to next column
iny
cpy #40
bne NextColumn
; and we have "snow" :)
lda #0
ldx TankNr
sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
sta RangeLeft ; whole screen in range of soil down
sta RangeLeft+1
mwa #screenwidth RangeRight
jsr SoilDown2
jsr drawtanks ; for restore PM
rts
; in order to optimize the fragment repeated in both internal loops
; we save 15 bytes :)
InverseScreenByte
lda LineTableL,x
sta temp
lda LineTableH,x
sta temp+1
lda (temp),y
eor #$ff
sta (temp),y
rts
.endp
; ------------------------------------------------- ; -------------------------------------------------
.proc CheckCollisionWithTank .proc CheckCollisionWithTank
; ------------------------------------------------- ; -------------------------------------------------
; Check collision with Tank :) ; Check collision with Tank :)
; xdraw , ydraw - coordinates of the checked point ; xdraw , ydraw - coordinates of the checked point
; results: ; results:
; HitFlag - 1 - hit, 0 - no hit ; HitFlag - $ff - hit ground, 0 - no hit, 1-6 - hit tank (index+1)
; XHit , YHit - coordinates of hit ; XHit , YHit - coordinates of hit
; X - index of the hit tank ; X - index of the hit tank
@@ -2176,31 +2443,40 @@ MIRValreadyAll
CheckCollisionWithTankLoop CheckCollisionWithTankLoop
lda eXistenZ,x lda eXistenZ,x
beq DeadTank beq DeadTank
; first we test top and bottom (same with and without shield!)
lda ytankstable,x
cmp ydraw ; check range
bcc BelowTheTank ;(ytankstable,ytankstable+3)
sbc #4 ; we must rewrite EndOfTheBarrelY table or remove Y correction completely to "bold" tank !!!
cmp ydraw
bcs OverTheTank
; with or without shield ?
lda ShieldEnergy,x
bne CheckCollisionWithShieldedTank ; tank with shield is bigger :)
lda xtankstableH,x lda xtankstableH,x
cmp xdraw+1 cmp xdraw+1
bne Condition01 bne @+
lda xtankstableL,x lda xtankstableL,x
cmp xdraw cmp xdraw
Condition01 @
bcs LeftFromTheTank ;add 8 double byte bcs LeftFromTheTank ;add 8 double byte
; now we use Y as low byte and A as high byte of checked position (right edge of tank)
; it is tricky but fast and much shorter
clc clc
adc #8 adc #8
tay tay
lda xtankstableH,x lda xtankstableH,x
adc #0 adc #0
cmp xdraw+1 cmp xdraw+1
bne Condition02 bne @+
cpy xdraw cpy xdraw
Condition02 @
bcc RightFromTheTank bcc RightFromTheTank
TankHit
lda ytankstable,x inx
cmp ydraw ; check range stx HitFlag ; index of hit tank+1
bcc BelowTheTank ;(ytankstable,ytankstable+3) dex
sbc #4
cmp ydraw
bcs OverTheTank
mva #1 HitFlag
mwa xdraw XHit mwa xdraw XHit
mwa ydraw YHit mwa ydraw YHit
rts ; in X there is an index of the hit tank rts ; in X there is an index of the hit tank
@@ -2213,6 +2489,33 @@ DeadTank
cpx NumberOfPlayers cpx NumberOfPlayers
bne CheckCollisionWithTankLoop bne CheckCollisionWithTankLoop
rts rts
CheckCollisionWithShieldedTank
; now we use Y as low byte and A as high byte of checked position (left right edgs of shield)
; it is tricky but fast and much shorter
lda xtankstableL,x
sec
sbc #4 ; 5 pixels more on left side
tay
lda xtankstableH,x
sbc #0
; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!!
cmp xdraw+1
bne @+
cpy xdraw
@
bcs LeftFromTheTank
tya ;add 16 double byte
clc
adc #16
tay
lda xtankstableH,x
adc #0
cmp xdraw+1
bne @+
cpy xdraw
@
bcc RightFromTheTank
bcs TankHit
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
CalculateExplosionRange0 CalculateExplosionRange0