Compare commits

..

45 Commits

Author SHA1 Message Date
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
12 changed files with 876 additions and 338 deletions
+15
View File
@@ -47,6 +47,21 @@ With the advent of fujinet (https://fujinet.online/) we are thinking about makin
## Changes:
###### Build 144
2022-06-19
Juneteenth release is coming with the most anticipated new feature: defensive weapons. Thanks to @Pecusx we have 5 completely new weapons and more reasonably working parachute. The stub of 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 "I" key or short-pressing fire. Select weapon to use by moving joystick or cursor keys right. Switch between offensive and deffensive weapons by moving joystick left. Fire/escape to quit inventory.
Other significant playability change is https://github.com/pkali/scorch_src/issues/54 - it is not finished yet, but keeping joystick up or down makes force to increase / decrease faster.
Also - short press of fire calls Inventory, long press fires the shell. The timings are experimental, please let me know it 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
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 :)
+2 -2
View File
@@ -73,7 +73,7 @@ pmg .ds $0300
eif
song_data
ins 'mmm_16.lzs'
ins 'mmm_16.lzs'
song_end
POKEY = $D200
@@ -456,7 +456,7 @@ quit
ini main
; ---
opt l-
;opt l-
.MACRO SPRITES
missiles
+46 -27
View File
@@ -14,9 +14,9 @@ dliColorsFore
TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor
TextForegroundColor = $0c
CashOptionL ;(one zero less than on the screen)
.by 0,<200,<500,<800,<1000
.by 0,<200,<800,<1200,<2000
CashOptionH
.by 0,>200,>500,>800,>1000
.by 0,>200,>800,>1200,>2000
GravityTable .by 10,20,25,30,40
MaxWindTable .by 5,20,40,70,99
RoundsTable .by 10,20,30,40,50
@@ -514,7 +514,8 @@ EndOfTheBarrelY
.by 6,6,6,6,6,6,6,6,6
.by 5,5,5,5,5,5,5,5,5,5
.by 4,4,4,4,4,4,4,4,4,4,4,4,4
.by 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
@@ -526,7 +527,8 @@ EndOfTheBarrelY
.by 0,0,0,0 ; not used
; 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 5,5,5,5,5,5,5,5,5,5
.by 6,6,6,6,6,6,6,6,6
@@ -593,6 +595,7 @@ WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price______________45
.by >price______________46
.by >price______________47
.by >price_White_Flag_____
.by >price_Heat_Guidance__
.by >price_Bal_Guidance___
.by >price_Horz_Guidance__
@@ -608,7 +611,6 @@ WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Auto_Defense___
.by >price_Fuel_Tank______
.by >price_Contact_Trigger
.by >price_White_Flag_____
WeaponPriceL
.by <price_Baby_Missile___
@@ -659,6 +661,7 @@ WeaponPriceL
.by <price______________45
.by <price______________46
.by <price______________47
.by <price_White_Flag_____
.by <price_Heat_Guidance__
.by <price_Bal_Guidance___
.by <price_Horz_Guidance__
@@ -674,7 +677,6 @@ WeaponPriceL
.by <price_Auto_Defense___
.by <price_Fuel_Tank______
.by <price_Contact_Trigger
.by <price_White_Flag_____
;-------------------------------------------------
; how many units (bulletd) of a given weapon we get for a given price
@@ -731,6 +733,7 @@ WeaponUnits
.by 0 ;_____________45
.by 0 ;_____________46
.by 0 ;_____________47
.by 1 ;White_Flag___48
.by 6 ;Heat_Guidance__
.by 2 ;Bal_Guidance___
.by 5 ;Horz_Guidance__
@@ -746,7 +749,6 @@ WeaponUnits
.by 1 ;Auto_Defense___
.by 10 ;Fuel_Tank______
.by 25 ;Contact_Trigger
.by 1 ;_____________63
PurchaseMeTable ;weapons good to be purchased by the robot
;the comment is an index in the tables
@@ -809,8 +811,8 @@ WeaponSymbols
.by $58,$59,$5a,$5b,$60,$7b,$7c,$7d
.by $20,$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 $3b,$3c,$3d,$3e,$3f,$5e,$5f,$00
.by $5f,$02,$03,$06,$1d,$0a,$1b,$1c ; defensives
.by $1e,$3b,$3c,$3d,$3e,$3f,$5e,$00
; Names of weapons (16 chars long)
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"----------------" ; 45
dta d"----------------" ; 46
dta d"----------------" ; 47
dta d" " ; 47 ; special (no weapon) name to simplify display
dta d"Heat Guidance " ; 48 ($30)
dta d"Bal Guidance " ; 49
dta d"Horz Guidance " ; 50
dta d"Vert Guidance " ; 51
dta d"Lazy Boy " ; 52
dta d"Parachute " ; 53
dta d"Battery " ; 54
dta d"Mag Deflector " ; 55
dta d"Shield " ; 56
dta d"Force Shield " ; 57
dta d"Heavy Shield " ; 58
dta d"Super Mag " ; 59
dta d"Auto Defense " ; 60
dta d"Fuel Tank " ; 61
dta d"Contact Trigger " ; 62
dta d"White Flag " ; 63
dta d"White Flag " ; 48 ($30)
dta d"Heat Guidance " ; 49
dta d"Bal Guidance " ; 50
dta d"Horz Guidance " ; 51
dta d"Vert Guidance " ; 52
dta d"Lazy Boy " ; 53
dta d"Parachute " ; 54 - no energy
dta d"Battery " ; 55
dta d"Mag Deflector " ; 56 - with shield and energy
dta d"Shield " ; 57 - shield for one shot - no energy
dta d"Force Shield " ; 58 - shield with energy and parachute
dta d"Heavy Shield " ; 59 - shield with energy
dta d"Super Mag " ; 60
dta d"Auto Defense " ; 61 - with shield and energy
dta d"Fuel Tank " ; 62
dta d"Contact Trigger " ; 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 00 ; Battery
.by 90 ; 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 ; Contact Trigger
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
joyToKeyTable
; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15
+16 -16
View File
@@ -59,22 +59,22 @@ price______________44 = 0
price______________45 = 0
price______________46 = 0
price______________47 = 0
price_Heat_Guidance__ = $ffff ;_48_($30)
price_Bal_Guidance___ = $ffff ;_49
price_Horz_Guidance__ = $ffff ;_50
price_Vert_Guidance__ = $ffff ;_51
price_Lazy_Boy_______ = $ffff ;_52
price_Parachute______ = 1100 ;_53
price_Battery________ = $ffff ;_54
price_Mag_Deflector__ = $ffff ;_55
price_Shield_________ = $ffff ;_56
price_Force_Shield___ = $ffff ;_57
price_Heavy_Shield___ = $ffff ;_58
price_Super_Mag______ = $ffff ;_59
price_Auto_Defense___ = $ffff ;_60
price_Fuel_Tank______ = $ffff ;_61
price_Contact_Trigger = $ffff ;_62
price_White_Flag_____ = $0 ;_63
price_White_Flag_____ = $0 ;_48_($30)
price_Heat_Guidance__ = $ffff ;_49
price_Bal_Guidance___ = $ffff ;_50
price_Horz_Guidance__ = $ffff ;_51
price_Vert_Guidance__ = $ffff ;_52
price_Lazy_Boy_______ = $ffff ;_53
price_Parachute______ = 234 ;_54
price_Battery________ = $ffff ;_55
price_Mag_Deflector__ = 245 ;_56
price_Shield_________ = 112 ;_57
price_Force_Shield___ = 268 ;_58
price_Heavy_Shield___ = 375 ;_59
price_Super_Mag______ = $ffff ;_60
price_Auto_Defense___ = 512 ;_61
price_Fuel_Tank______ = $ffff ;_62
price_Contact_Trigger = $ffff ;_63
;--------------------------------
; names of RMT instruments (sfx)
;--------------------------------
+14 -6
View File
@@ -104,7 +104,7 @@ OptionsScreen
OptionsHere
; 0123456789012345678901234567890123456789
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"Wind : 1B 3B 5B 7B 9B "
dta d"Rounds : 10 20 30 40 50 "
@@ -136,7 +136,9 @@ WeaponsDescription
dta d" - Defensive/Offensive weapon "
dta d" "
dta d"Space"*
dta d" - Purchase "
dta d" - "
purchaseActivate
dta d"Purchase "
dta d"Return"*
dta d" - Finish "
EmptyLine
@@ -166,11 +168,17 @@ NamesOfLevels
textbuffer
; 0123456789012345678901234567890123456789
dta d"Player: "
dta d"Energy: Angle: Force: "
dta d" Round: Wind: "
dta d"Energy: Angle: Force: "
dta d"Round: Wind: "
textbuffer2
dta d"Player: Cash: "
dta d"Player: Cash: 0 " ; ZERO TO MAKE YOU RICHER ON THE SCREEN
dta d"----------------------------------------"
;---------------------------------------------------
activateText
dta d"Activate"
activateTextEnd
purchaseText
dta d"Purchase"
purchaseTextEnd
.endif
+122 -9
View File
@@ -262,8 +262,7 @@ CheckCollisionDraw
sbc #1
sta YHit
sty YHit+1
;mwa ydraw YHit
mva #1 HitFlag
mva #$ff HitFlag
StopHitChecking
jmp ContinueDraw
@
@@ -364,7 +363,7 @@ endcircleloop
rts
.endp
;----
splot8 .proc
.proc splot8
; plot xcircle+XC,ycircle+YC
; plot xcircle+XC,ycircle-YC
; plot xcircle-XC,ycircle-YC
@@ -463,7 +462,7 @@ splot8 .proc
.endp
;--------------------------------------------------
clearscreen .proc
.proc clearscreen
;--------------------------------------------------
lda #$ff
@@ -477,7 +476,7 @@ clearscreen .proc
rts
.endp
;-------------------------------*------------------
placetanks .proc
.proc placetanks
;--------------------------------------------------
ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1
lda #0
@@ -642,6 +641,7 @@ DrawTankNrX
sta xdraw+1
lda ytankstable,x
sta ydraw
mva #0 ydraw+1
jsr TypeChar
@@ -690,10 +690,30 @@ ZeroesToGo
sta (xbyte),y
dey
bne ClearPM
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 #57 ; one shot shield activation
beq ShieldDraw
cmp #58 ; shield with energy and parachute activation
beq ShieldDraw
cmp #59 ; shield with energy activation
beq ShieldDraw
cmp #61 ; Auto Defence
beq DrawTankShieldWihHorns
cmp #56 ; Mag Deflector
beq DrawTankShieldWihHorns
bne NoShieldDraw
ShieldDraw
jsr DrawTankShield.DrawInPosition
NoShieldDraw
DoNotDrawTankNr
rts
DrawTankShieldWihHorns
jsr DrawTankShield.DrawInPosition
jsr DrawTankShieldHorns
rts
.endp
; -------------------------------------
@@ -718,6 +738,88 @@ tankflash_loop
rts
.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
;--------------------------------------------------
@@ -1349,7 +1451,7 @@ EndPutChar
; ------------------------------------------
.proc PutChar4x4
; 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: plot4x4color (0/1)
; all pixels are being drawn
@@ -1403,7 +1505,7 @@ GetUpper4bits
bpl CopyChar
; calculating coordinates from xdraw and ydraw
mwa xdraw xbyte
mwa dx xbyte
lda xbyte
and #$7
@@ -1414,7 +1516,7 @@ GetUpper4bits
rorw xbyte
;---
ldy xbyte
lda ydraw ; y = y - 3 because left lower.
lda dy ; y = y - 3 because left lower.
sec
sbc #3
tax
@@ -1465,4 +1567,15 @@ EndPut4x4
rts
.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
+112 -47
View File
@@ -36,7 +36,7 @@
;we decided it must go in 'English' to let other people work on it
.macro build
dta d"143" ; number of this build (3 bytes)
dta d"144" ; number of this build (3 bytes)
.endm
icl 'definitions.asm'
@@ -55,26 +55,33 @@
.zpvar xc .word
.zpvar temp .word ;temporary word for the most embeded loops only
.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 xtempDRAW .word ;same as above for XDRAW routine
.zpvar ytempDRAW .word ;same as above for XDRAW routine
.zpvar tempor2 .byte
;--------------temps used in circle 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 fy .byte
.zpvar xk .word
.zpvar fs .byte
.zpvar yc .byte ;ycircle - temporary for circle
.zpvar dx .word
.zpvar tempor2 .byte
.zpvar dy .word
.zpvar dd .word
.zpvar di .word
.zpvar dp .word
.zpvar modify .word
;----------------------------
.zpvar weaponPointer .word
.zpvar dliCounter .byte
.zpvar pressTimer .byte
.zpvar NTSCcounter .byte
;.zpvar dliA .byte
;.zpvar dliX .byte
;.zpvar dliY .byte
;* RMT ZeroPage addresses
.zpvar p_tis .word
.zpvar p_trackslbstable .word
@@ -103,7 +110,7 @@
;Game loading address
ORG $3000
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
;-----------------------------------------------
@@ -128,19 +135,24 @@ START
jsr RandomizeSequence
; for the round #1 shooting sequence is random
; activate mag deflector for all players (test)
; ldx numberOfPlayers
; dex
;@
; mva #56 ActiveDefenceWeapon,x
; tay
; lda DefensiveEnergy,y
; sta ShieldEnergy,x ; set energy of shield
; dex
; bpl @-
; mag deflector activated! (test)
MainGameLoop
VDLI DLIinterruptText ; jsr SetDLI for text (purchase) screen
jsr CallPurchaseForEveryTank
; issue #72 (glitches when switches)
mva #0 dmactl
lda dmactls
and #$fc
;ora #$02 ; 2=normal, 3 = wide screen width, 0 = no screen
sta dmactls
jsr GetRandomWind
jsr RoundInit
@@ -300,13 +312,7 @@ SettingEnergies
jsr calculatemountains ;let mountains be easy for the eye
;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height
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
jsr SetMainScreen
jsr drawmountains ;draw them
jsr drawtanks ;finally draw tanks
@@ -428,6 +434,10 @@ AfterManualShooting
ShootNow
jsr Shoot
;here we clear offensive text (after a shoot)
ldy TankNr
mva #0 plot4x4color
jsr DisplayOffensiveTextNr
lda HitFlag ;0 if missed
beq missed
@@ -439,9 +449,9 @@ ShootNow
continueMainRoundLoopAfterSeppuku
;here we clear offensive text (after a shoot)
ldy TankNr
mva #0 plot4x4color
jsr DisplayOffensiveTextNr
;ldy TankNr
;mva #0 plot4x4color
;jsr DisplayOffensiveTextNr
AfterExplode
@@ -649,7 +659,7 @@ MetodOfDeath
;--------------------------------------------------
.proc DecreaseEnergyX
;Decreases energy of player nr X
;Decreases energy of player nr X by the value Y
;increases his financial loss
;increases gain of tank TankNr
;--------------------------------------------------
@@ -687,6 +697,33 @@ NotNegativeEnergy
rts
.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
lda #0
@@ -707,7 +744,7 @@ NotNegativeEnergy
.endp
;--------------------------------------------------
GetRandomWind .proc
.proc GetRandomWind
;in: MaxWind (byte)
;out: Wind (word)
;uses: _
@@ -736,7 +773,7 @@ GetRandomWind .proc
.endp
;--------------------------------------------------
PMoutofScreen .proc
.proc PMoutofScreen
;--------------------------------------------------
lda #$00 ; let all P/M disappear
:8 sta hposp0+#
@@ -746,21 +783,26 @@ PMoutofScreen .proc
;--------------------------------------------------
.proc WeaponCleanup;
; 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
lda #$0
@
sta TanksWeapon1,x
ldx #$3f ; TODO: maxweapons
@ lda #$0
cpx #48 ; White Flag
bne @+
lda #99
@ sta TanksWeapon1,x
sta TanksWeapon2,x
sta TanksWeapon3,x
sta TanksWeapon4,x
sta TanksWeapon5,x
sta TanksWeapon6,x
dex
sne:lda #99
bpl @-
beq setBmissile
bpl @-1
rts
setBmissile
lda #99
bne @-
.endp
;--------------------------------------------------
@@ -854,7 +896,8 @@ ClearResults
bne ClearResults
mva #1 CurrentRoundNr ;we start from round 1
mva #6 NTSCcounter
; RMT INIT
lda #$f0 ;initial value
sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240)
@@ -872,8 +915,10 @@ ClearResults
rts
.endp
DLIinterruptGraph .proc
pha
.proc DLIinterruptGraph
;sta dliA
;sty dliY
pha
phy
ldy dliCounter
lda dliColorsBack,y
@@ -884,27 +929,46 @@ DLIinterruptGraph .proc
sta COLPF1
sty COLPF2
inc dliCounter
ply
;ldy dliY
;lda dliA
ply
pla
rti
.endp
DLIinterruptText .proc
pha
.proc DLIinterruptText
;sta dliA
pha
sta WSYNC
mva #TextBackgroundColor colpf2
mva #TextForegroundColor colpf3
pla
;lda dliA
pla
DLIinterruptNone
rti
.endp
VBLinterrupt .proc
.proc VBLinterrupt
pha
phx
phy
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
bmi lab2
asl @ ; * 2
@@ -912,13 +976,14 @@ VBLinterrupt .proc
ldx #0 ;X = 0 channel (0..3 or 0..7 for stereo module)
lda #0 ;A = 12 note (0..60)
jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!)
;
lda #$ff
sta sfx_effect ;reinit value
;
lab2
jsr RASTERMUSICTRACKER+3 ;1 play
; ------- RMT -------
exitVBL
ply
plx
pla
@@ -986,7 +1051,7 @@ UsageLoop
rts
.endp
;----------------------------------------------
RandomizeAngle .proc ;
.proc RandomizeAngle
; routine returns in A
; a valid angle for the tank's barrel.
; X is not changed
@@ -1009,7 +1074,7 @@ RandomizeAngle .proc ;
rts
.endp
;----------------------------------------------
RandomizeForce .proc
.proc RandomizeForce
; routine returns in ForceTable/L/H
; valid force of shooting for TankNr
; in X must be TankNr
@@ -1222,7 +1287,7 @@ getkeyend
.endp
;--------------------------------------------------
getkeynowait .proc;
.proc getkeynowait
;--------------------------------------------------
jsr WaitForKeyRelease
lda kbcode
@@ -1230,7 +1295,7 @@ getkeynowait .proc;
rts
.endp
;--------------------------------------------------
WaitForKeyRelease .proc
.proc WaitForKeyRelease
;--------------------------------------------------
lda JSTICK0
and #$0f
BIN
View File
Binary file not shown.
+328 -178
View File
@@ -8,7 +8,7 @@
;----------------------------------------
;--------------------------------------------------
Options .proc
.proc Options
;--------------------------------------------------
; start-up screen - options, etc.
; this function returns:
@@ -201,14 +201,9 @@ OptionsYLoop
;-------------------------------------------
; call of the purchase screens for each tank
.proc CallPurchaseForEveryTank
jsr PMoutofScreen
mwa #PurchaseDL dlptrs
lda dmactls
and #$fc
ora #$02 ; normal screen width
sta dmactls
mva #0 TankNr
sta isInventory
@
ldx TankNr
lda SkillTable,x
@@ -231,17 +226,29 @@ AfterManualPurchase
;--------------------------------------------------
.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)
; that is buying weapons now (from 0).
; Rest of the data is taken from appropriate tables
; 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
ldx tankNr
lda TankStatusColoursTable,x
sta colpf2s
sta colpf2s
; we are clearing list of the weapons
mva #$ff LastWeapon
mva #$00 WhichList
@@ -265,6 +272,8 @@ NextChar03
; here we must jump in after each purchase
; to generate again list of available weapons
AfterPurchase
; current cash display
mva #sfx_purchase sfx_effect
ldx tanknr
lda moneyL,x
@@ -277,32 +286,44 @@ AfterPurchase
; in xbyte there is the address of the line that
; is being processed now
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 HowManyOnTheList2
stx PositionOnTheList
; 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
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
jeq NoWeapon
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
ldy tanknr
ldx temp
lda moneyH,y
cmp WeaponPriceH,x
bne CheckWeapon01
bne @+
lda moneyL,y
cmp WeaponPriceL,x
CheckWeapon01
@
jcc TooLittleCash
; we have enough cash and the weapon can be
; added to the list
stx temp ; number of weapon will be necessary later
; first parentheses and other special chars
; (it's easier this way)
@@ -322,58 +343,65 @@ CheckWeapon01
lda #16 ; "0"
sta (xbyte),y
; now symbol of the weapon
lda WeaponSymbols,x
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
;now number of units (shells) to be purchased
adw xbyte #23 displayposition ; 23 chars from the beginning of the line
lda WeaponUnits,x
sta decimal
jsr displaybyte
ldx temp ;getting back number of the weapon
ldx temp ;getting back index of the weapon
; and now price of the weapon
clc
lda xbyte
adc #27 ; 27 chars from the beginning of the line
sta displayposition
lda xbyte+1
adc #$00
sta displayposition+1
adw xbyte #27 displayposition ; 27 chars from the beginning of the line
lda WeaponPriceL,x
sta decimal
lda WeaponPriceH,x
sta decimal+1
jsr displaydec
lda temp ;getting back number of the weapon
pha ;and saving it on the stack
jmp notInventory
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
sta decimal
pla
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
adw xbyte #1 displayposition
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 !!!!
ldx temp ;weapon number
mva #0 temp+1 ; this number is only in X
; times 16 (it's length of the names of weapons)
ldy #3 ; Rotate 4 times
@@ -383,55 +411,54 @@ CheckWeapon01
dey
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
iny
cpy #(16+6)
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
; present the weapon purchased recently,
; the pointer must point to it.
bit lastWeapon
bpl @+ ; if == $ff => first run, jump to top
mva #0 PositionOnTheList
beq NotTheSameAsLastTime
@
cpx LastWeapon
bne NotTheSameAsLastTime
lda WhichList
bne ominx06
bne @+
lda HowManyOnTheList1
sta PositionOnTheList
jmp NotTheSameAsLastTime
ominx06
@
lda HowManyOnTheList2
sta PositionOnTheList
NotTheSameAsLastTime
; increase appropriate counter
txa
cpx #$30
bcs SecondList
bcs DefenceList
ldy HowManyOnTheList1
sta NubersOfWeaponsL1,y
sta IndexesOfWeaponsL1,y
inc HowManyOnTheList1
bne NextLineOfTheList
SecondList
DefenceList
ldy HowManyOnTheList2
sta NubersOfWeaponsL2,y
sta IndexesOfWeaponsL2,y
inc HowManyOnTheList2
; If everything is copied then next line
NextLineOfTheList
clc
lda xbyte
adc #40
sta xbyte
bcc TooLittleCash
inc xbyte+1
adw xbyte #40
TooLittleCash
NoWeapon
@@ -550,18 +577,48 @@ DoNotIncHigher2
; screen clearing at each list refresh
; (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
; So choose the weapon for purchase ......
;--------------------------------------------------
ChoosingItemForPurchase
;--------------------------------------------------
jsr PutLitteChar ; Places pointer at the right position
jsr getkey
ldx escFlag
seq:rts
seq:jmp WaitForKeyRelease ; like jsr ... : rts
cmp #$2c ; Tab
jeq ListChange
cmp #$06 ; cursor left
jeq ListChange
cmp #$0c ; Return
sne:rts
cmp #$e
@@ -600,8 +657,7 @@ EndUpX
PurchaseKeyDown
lda WhichList
beq GoDown1
inc PositionOnTheList
lda PositionOnTheList
inc:lda PositionOnTheList
cmp HowManyOnTheList2
bne EndGoDownX
ldy HowManyOnTheList2
@@ -609,8 +665,7 @@ PurchaseKeyDown
sty PositionOnTheList
jmp ChoosingItemForPurchase
GoDown1
inc PositionOnTheList
lda PositionOnTheList
inc:lda PositionOnTheList
cmp HowManyOnTheList1
bne MakeOffsetDown
ldy HowManyOnTheList1
@@ -632,18 +687,31 @@ EndGoDownX
; swapping the displayed list and setting pointer to position 0
ListChange
mva #0 OffsetDL1
lda WhichList
eor #$01
sta WhichList
bne SecondSelected
bne DeffensiveSelected
mwa #ListOfWeapons WeaponsListDL
jmp @+
SecondSelected
mwa #ListOfDefensiveWeapons WeaponsListDL
lda isInventory
beq @+
; inventory
jsr calcPosOffensive
jmp ChoosingItemForPurchase
@
lda #$00
sta PositionOnTheList
sta OffsetDL1
mva #0 PositionOnTheList
jmp ChoosingItemForPurchase
DeffensiveSelected
mwa #ListOfDefensiveWeapons WeaponsListDL
lda isInventory
beq @+
jsr calcPosDefensive
jmp ChoosingItemForPurchase
@
mva #0 positionOnTheList
jmp ChoosingItemForPurchase
.endp
@@ -652,24 +720,23 @@ SecondSelected
;--------------------------------------------------
.proc PurchaseWeaponNow
;--------------------------------------------------
weaponPtr = temp
isPriceZero = tempXRoller
bit isInventory
bmi inventorySelect
lda WhichList
bne PurchaseDeffensive
; here we purchase the offensive weapon
ldy PositionOnTheList
lda NubersOfWeaponsL1,y
lda IndexesOfWeaponsL1,y
jmp PurchaseAll
PurchaseDeffensive
ldy PositionOnTheList
lda NubersOfWeaponsL2,y
lda IndexesOfWeaponsL2,y
PurchaseAll
; after getting weapon number the routine is common for all
; after getting weapon index the routine is common for all
ldx tanknr
tay ; weapon number is in Y
beq @+
tay ; weapon index is in Y
sec
lda moneyL,x ; substracting from posessed money
sbc WeaponPriceL,y ; of price of the given weapon
@@ -678,61 +745,117 @@ PurchaseAll
sbc WeaponPriceH,y
sta moneyH,x
; save info about price == 0
lda WeaponPriceL,y
ora WeaponPriceH,y
sta isPriceZero
positiveMoney
; now we have to get address of
; the table of the weapon of the tank
; and add appropriate number of shells
lda TanksWeaponsTableL,x
sta weaponPtr
sta weaponPointer
lda TanksWeaponsTableH,x
sta weaponPtr+1
sta weaponPointer+1
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
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
bcc LessThan100
lda #99
sta (weaponPtr),y
sta (weaponPointer),y
LessThan100
sty LastWeapon ; store last purchased weapon
; because we must put screen pointer next to it
; additional check for unfinished game
; if weapon was free (price == $0)
; then have nothing...
lda isPriceZero
bne @+
lda #0
sta (weaponPtr),y
@
mva #0 PositionOnTheList ; to move the pointer to the top when no more monies
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
sta ActiveDefenceWeapon,x
; 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
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
sty positionOnTheList
rts
.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
sty positionOnTheList
rts
.endp
; -----------------------------------------------------
.proc PutLitteChar
; first let's cleat both lists from little chars
; first let's clear both lists from little chars
mwa #ListOfWeapons xbyte
ldx #52 ; there are 52 lines total
ldy #$00
EraseLoop
lda #$00
tya ; lda #$00
sta (xbyte),y
clc
lda xbyte
adc #40
sta xbyte
bcc ominx02
inc xbyte+1
ominx02
adw xbyte #40
dex
bpl EraseLoop
; now let's check which list is active now
lda WhichList
beq CharToList1
@@ -742,13 +865,7 @@ ominx02
ldx PositionOnTheList
beq SelectList2 ; if there is 0 we add nothing
AddLoop2
clc
lda xbyte
adc #40
sta xbyte
bcc ominx03
inc xbyte+1
ominx03
adw xbyte #40
dex
bne AddLoop2
SelectList2
@@ -770,13 +887,7 @@ CharToList1
ldx PositionOnTheList
beq SelectList1 ; if there is 0 we add nothing
AddLoop1
clc
lda xbyte
adc #40
sta xbyte
bcc ominx04
inc xbyte+1
ominx04
adw xbyte #40
dex
bne AddLoop1
SelectList1
@@ -787,13 +898,7 @@ SelectList1
ldx OffsetDL1
beq SetWindowList1 ; if zero then add nothing
LoopWindow1
clc
lda xbyte
adc #40
sta xbyte
bcc ominx05
inc xbyte+1
ominx05
adw xbyte #40
dex
bne LoopWindow1
SetWindowList1
@@ -805,8 +910,8 @@ SetWindowList1
ldy #>EmptyLine
lda OffsetDL1
beq NoArrowUp
ldx #<MoreUp
ldy #>MoreUp
ldx #<MoreUp
ldy #>MoreUp
NoArrowUp
stx MoreUpdl
sty MoreUpdl+1
@@ -819,8 +924,8 @@ NoArrowUp
bmi NoArrowDown
cmp OffsetDL1
bcc NoArrowDown
ldx #<MoreDown
ldy #>MoreDown
ldx #<MoreDown
ldy #>MoreDown
NoArrowDown
stx MoreDowndl
sty MoreDowndl+1
@@ -1200,6 +1305,8 @@ space dta d" "
;that's easy because we have number of tank
;and xtankstableL and H keep X position of a given tank
;save vars (messed when printing...)
lda xtankstableL,y
sta temp
lda xtankstableH,y
@@ -1320,12 +1427,12 @@ DOTNcharloop
asl
clc
adc TextPositionX
sta Xdraw
sta dx
lda #0
adc TextPositionX+1
sta Xdraw+1
sta dx+1
lda TextPositionY
sta ydraw
sta dy
jsr PutChar4x4
inc TextCounter
@@ -1343,6 +1450,7 @@ DOTNcharloop
;address in LineAddress4x4
;starting from LineXdraw, LineYdraw
ldy #0
sty LineCharNr
@@ -1355,8 +1463,8 @@ TypeLine4x4Loop
beq EndOfTypeLine4x4
sta CharCode4x4
mwa LineXdraw Xdraw
mva LineYdraw Ydraw
mwa LineXdraw dx
mva LineYdraw dy
mva #1 plot4x4color
jsr PutChar4x4 ;type empty pixels as well!
adw LineXdraw #4
@@ -1372,10 +1480,6 @@ EndOfTypeLine4x4
.proc AreYouSure
;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
;top frame
@@ -1405,7 +1509,7 @@ EndOfTypeLine4x4
skip01
;clean
mva #3 dx
mva #3 di
mva #4 ResultY
@
mva #1 plot4x4color
@@ -1415,23 +1519,16 @@ skip01
jsr TypeLine4x4
adb ResultY #4 ;next line
dec dx
dec di
bne @-
quit_areyousure
;restore vars
mva yc Ydraw
mwa xk Xdraw
rts
.endp
;--------------------------------
.proc DisplaySeppuku
;using 4x4 font
;save vars (messed in TypeLine4x4)
mwa Xdraw xk
mva Ydraw yc
mva #20 fs ; temp, how many times blink the billboard
seppuku_loop
@@ -1459,7 +1556,7 @@ seppuku_loop
;clean seppuku
mva #3 dx
mva #3 di
mva #4 ResultY
@
mwa #lineClear LineAddress4x4
@@ -1468,16 +1565,13 @@ seppuku_loop
jsr TypeLine4x4
adb ResultY #4 ;next line
dec dx
dec di
bne @-
dec fs
jne seppuku_loop
quit_seppuku
;restore vars
mva yc Ydraw
mwa xk Xdraw
rts
.endp
;--------------------------------
@@ -1690,8 +1784,6 @@ FinishResultDisplay
bpl @-
adw temp #NamesOfWeapons
ldy #6 ; from 6th character
ldy #15
@
lda (temp),y
@@ -1699,6 +1791,39 @@ FinishResultDisplay
dey
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
;---------------------
@@ -1709,6 +1834,31 @@ FinishResultDisplay
mwa #textbuffer+48 displayposition
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
;=========================
@@ -1717,7 +1867,7 @@ FinishResultDisplay
sta decimal
lda ForceTableH,x
sta decimal+1
mwa #textbuffer+40+34 displayposition
mwa #textbuffer+40+36 displayposition
jsr displaydec
;=========================
@@ -1729,9 +1879,9 @@ FinishResultDisplay
lda AngleTable,x
bmi AngleToLeft
lda #$7f ; (tab) character
sta textbuffer+40+23
sta textbuffer+40+25
lda #0 ;space
sta textbuffer+40+20
sta textbuffer+40+22
lda #90
sec
sbc AngleTable,x
@@ -1748,12 +1898,12 @@ AngleToLeft
lda BarrelTableL,y
sta CharCode
lda #$7e ;(del) char
sta textbuffer+40+20
sta textbuffer+40+22
lda #0 ;space
sta textbuffer+40+23
sta textbuffer+40+25
AngleDisplay
mwa #textbuffer+40+21 displayposition
mwa #textbuffer+40+23 displayposition
jsr displaybyte
;=========================
@@ -1763,9 +1913,9 @@ AngleDisplay
lda Wind+3 ; highest byte of 4 byte wind
bmi DisplayLeftWind
lda #$7f ; (tab) char
sta textbuffer+80+28
sta textbuffer+80+20
lda #0 ;space
sta textbuffer+80+25
sta textbuffer+80+17
beq DisplayWindValue
DisplayLeftWind
sec ; Wind = -Wind
@@ -1776,14 +1926,14 @@ DisplayLeftWind
sbc temp+1
sta temp+1
lda #$7e ;(del) char
sta textbuffer+80+25
sta textbuffer+80+17
lda #0 ;space
sta textbuffer+80+28
sta textbuffer+80+20
DisplayWindValue
:4 lsrw temp ;divide by 16 to have a nice value on a screen
lda temp
sta decimal
mwa #textbuffer+80+26 displayposition
mwa #textbuffer+80+18 displayposition
jsr displaybyte
;=========================
@@ -1791,7 +1941,7 @@ DisplayWindValue
;=========================
lda CurrentRoundNr
sta decimal
mwa #textbuffer+80+14 displayposition
mwa #textbuffer+80+7 displayposition
jsr displaybyte ;decimal (byte), displayposition (word)
rts
+13 -9
View File
@@ -30,6 +30,8 @@ RoundNrDisplay
;=====================================================
variablesStart ; zeroing starts here
;=====================================================
isInventory .ds 1 ; 0 - purchase, $ff - inventory
;--------------
drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
;--------------
sfx_effect .ds 1
@@ -47,7 +49,7 @@ moneyH ;we place zero at the end of prices and money
;and have range from 0 to 99990 (not too much)
;money players have (maybe one more byte is needed?)
.DS [MaxPlayers]
moneyL
moneyL
.DS [MaxPlayers]
;----------------------------------------------------
gainH ;how much money player gets after the round
@@ -66,6 +68,8 @@ looseL
;----------------------------------------------------
Energy
.DS [MaxPlayers]
ShieldEnergy
.DS [MaxPlayers]
EnergyDecrease .DS 1
eXistenZ
.DS [MaxPlayers]
@@ -95,6 +99,8 @@ NewAngle .DS 1
ActiveWeapon ;number of the selected weapon
.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
;----------------------------------------------------
@@ -114,7 +120,7 @@ MaxWind .ds 1 ;
WindOrientation .DS 1 ;(0-right,1-left)
;----------------------------------------------------
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)
.DS [MaxPlayers]
@@ -239,14 +245,12 @@ temptankNr .DS 1
;----------------------------------------------------
;Variables from textproc.s65
; tables with numbers of weapons on the right lists
; to be honest - I do not know at the moment what the above
; comment was supposed to mean...
; tables with indexes of weapons on the right lists
; OK (2022) so, L1 is list of offensive weapons, L2 - defensive
NubersOfWeaponsL1
.ds 8*5 ; :(8*5) .by $ff
NubersOfWeaponsL2
.ds 8*2 ; :(8*2) .by $ff
IndexesOfWeaponsL1
.ds 8*5 ; max 40 offensive weapons. this is wrong, should be 48, still only 32 defined.
IndexesOfWeaponsL2
.ds 8*2 ; max 16 defensive weapons.
;----------------------------------------------------
; variables storing amount of weapons on the first and second
+208 -44
View File
@@ -102,14 +102,7 @@ VOID
jsr xmissile
; 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
lda TankNr
pha
mva #1 Erase
@@ -130,6 +123,7 @@ VOID
mva LeapFrogAngle Angle
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
lda HitFlag
beq EndOfLeapping
@@ -159,6 +153,7 @@ VOID
ror Force
mva LeapFrogAngle Angle
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
lda HitFlag
beq EndOfLeapping
@@ -178,16 +173,12 @@ EndOfLeapping
.proc funkybomb ;
mva #sfx_baby_missile sfx_effect
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
;central Explosion
mva #21 ExplosionRadius
jsr CalculateExplosionRange0
jsr xmissile
ldy TankNr
mva #0 plot4x4color
jsr DisplayOffensiveTextNr
lda TankNr
pha
@@ -663,12 +654,39 @@ DistanceCheckLoop
adc #1
:3 asl
tay
; check shields
lda ActiveDefenceWeapon,x
cmp #57 ; one hit shield
beq UseShield
cmp #58 ; shield with energy and parachute
beq UseShieldWithEnergy
cmp #59 ; shield with energy
beq UseShieldWithEnergy
cmp #61 ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
beq UseShieldWithEnergy
cmp #56 ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
beq UseShieldWithEnergy
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
EndOfDistanceCheckLoop
txa
bne DistanceCheckLoop
jne DistanceCheckLoop
mva #sfx_silencer sfx_effect
rts
.endp
@@ -740,7 +758,7 @@ UpNotYet
sbc #1
sta ydraw
;check tank collision prior to PLOT
sty HitFlag
sty HitFlag ; set to 0
jsr CheckCollisionWithTank
@@ -1007,13 +1025,11 @@ ContinueToCheckMaxForce2
; $f3 - shift+key
notpressed
lda TRIG0S
beq notpressed
lda SKSTAT
cmp #$ff
beq checkJoy
jeq checkJoy
cmp #$f7 ; SHIFT
beq checkJoy
jeq checkJoy
lda kbcode
and #%10111111 ; SHIFT elimination
@@ -1026,6 +1042,18 @@ notpressed
;---esc pressed-quit game---
rts
@
cmp #$0d ; I
bne @+
callInventory
mva #$ff isInventory
jsr Purchase
mva #0 escFlag
jsr DisplayStatus
jsr SetMainScreen
jsr DrawTanks
jsr WaitForKeyRelease
jmp BeforeFire
@
cmp #$8e
jeq CTRLPressedUp
@@ -1064,10 +1092,17 @@ notpressedJoy
;fire
lda TRIG0S
jeq pressedSpace
mva #$ff pressTimer ; stop counting frames
jmp notpressed
;
pressedUp
lda pressTimer
spl:mva #0 pressTimer ; if >128 then reset to 0
cmp #25 ; 1/2s
bcs CTRLPressedUp
;force increaseeee!
ldx TankNr
inc ForceTableL,x
@@ -1104,6 +1139,11 @@ CTRLPressedUp
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
ldx TankNr
@@ -1197,6 +1237,13 @@ CTRLpressedTAB
pressedSpace
;=================================
;we shoot here!!!
mva #0 pressTimer ; reset
jsr WaitForKeyRelease
lda pressTimer
cmp #25 ; 1/2s
bcs fire
jmp callInventory
fire
RTS
.endp
@@ -1269,9 +1316,20 @@ AfterStrongShoot
sbc #$00
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
mva #1 color
rts
ShotUnderGround
mwa xtraj+1 xdraw ; but why not XHit and YHit !!!???
mwa ytraj+1 ydraw
mva #$ff HitFlag
rts
.endp
@@ -1285,9 +1343,13 @@ AfterStrongShoot
sta Parachute
; let's check if the given tank has got the parachute
lda #$35 ; parachute
jsr HowManyBullets
beq TankFallsX
ldx TankNr
lda ActiveDefenceWeapon,x
cmp #54 ; parachute
beq ParachuteActive
cmp #58 ; scheld witch energy and parachute
bne TankFallsX
ParachuteActive
inc Parachute
TankFallsX
; coordinates of the first pixel under the tank
@@ -1489,6 +1551,11 @@ EndOfFall
; first we clear parachute on the screen
mva #1 Erase
ldx TankNr
lda ActiveDefenceWeapon,x
cmp #54 ; deactivate weapon only if parachute (53)
bne NoParachuteWeapon
mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute)
NoParachuteWeapon
lda #$34
sta CharCode
lda Ytankstable,x
@@ -1501,10 +1568,8 @@ EndOfFall
sta xdraw+1
jsr TypeChar
mva #0 Erase
; now we can deduct one parachute from the list of weapons
lda #$35 ; parachute
jsr DecreaseWeapon
ldx TankNr
jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) )
ThereWasNoParachute
mva #sfx_silencer sfx_effect
rts
@@ -1536,7 +1601,8 @@ ThereWasNoParachute
noSmokeTracer
sty SmokeTracerFlag
RepeatIfSmokeTracer
RepeatIfSmokeTracer
RepeatFlight
mwa ytraj+1 Ytrajold+1
mwa xtraj+1 Xtrajold+1
mva #%01000000 drawFunction
@@ -1775,8 +1841,6 @@ EndOfFlight
jsr unPlot
mwa xcircle xdraw
mwa ycircle ydraw
; mwa XHit xdraw
; mva YHit ydraw
ldy SmokeTracerFlag
beq EndOfFlight2
@@ -1785,7 +1849,71 @@ EndOfFlight
jmp SecondFlight
EndOfFlight2
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 #61 ; Auto Defence
beq AutoDefence
cmp #56 ; 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
.proc SecondFlight
@@ -2157,7 +2285,7 @@ MIRValreadyAll
mva tempor2 TankNr
mva #0 Erase
jsr SoilDown2
mva #1 HitFlag
mva #$ff HitFlag ; but why ??
;jsr drawtanks
rts
.endp
@@ -2168,7 +2296,7 @@ MIRValreadyAll
; Check collision with Tank :)
; xdraw , ydraw - coordinates of the checked point
; 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
; X - index of the hit tank
@@ -2176,31 +2304,40 @@ MIRValreadyAll
CheckCollisionWithTankLoop
lda eXistenZ,x
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
cmp xdraw+1
bne Condition01
bne @+
lda xtankstableL,x
cmp xdraw
Condition01
@
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
adc #8
tay
lda xtankstableH,x
adc #0
cmp xdraw+1
bne Condition02
bne @+
cpy xdraw
Condition02
@
bcc RightFromTheTank
lda ytankstable,x
cmp ydraw ; check range
bcc BelowTheTank ;(ytankstable,ytankstable+3)
sbc #4
cmp ydraw
bcs OverTheTank
mva #1 HitFlag
TankHit
inx
stx HitFlag ; index of hit tank+1
dex
mwa xdraw XHit
mwa ydraw YHit
rts ; in X there is an index of the hit tank
@@ -2213,6 +2350,33 @@ DeadTank
cpx NumberOfPlayers
bne CheckCollisionWithTankLoop
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
;--------------------------------------------------
CalculateExplosionRange0