Merge pull request #93 from pkali/develop

Develop
This commit is contained in:
2022-06-19 14:43:03 -04:00
committed by GitHub
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: ## 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 ###### 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
+46 -27
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,6 +595,7 @@ 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_White_Flag_____
.by >price_Heat_Guidance__ .by >price_Heat_Guidance__
.by >price_Bal_Guidance___ .by >price_Bal_Guidance___
.by >price_Horz_Guidance__ .by >price_Horz_Guidance__
@@ -608,7 +611,6 @@ WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Auto_Defense___ .by >price_Auto_Defense___
.by >price_Fuel_Tank______ .by >price_Fuel_Tank______
.by >price_Contact_Trigger .by >price_Contact_Trigger
.by >price_White_Flag_____
WeaponPriceL WeaponPriceL
.by <price_Baby_Missile___ .by <price_Baby_Missile___
@@ -659,6 +661,7 @@ WeaponPriceL
.by <price______________45 .by <price______________45
.by <price______________46 .by <price______________46
.by <price______________47 .by <price______________47
.by <price_White_Flag_____
.by <price_Heat_Guidance__ .by <price_Heat_Guidance__
.by <price_Bal_Guidance___ .by <price_Bal_Guidance___
.by <price_Horz_Guidance__ .by <price_Horz_Guidance__
@@ -674,7 +677,6 @@ WeaponPriceL
.by <price_Auto_Defense___ .by <price_Auto_Defense___
.by <price_Fuel_Tank______ .by <price_Fuel_Tank______
.by <price_Contact_Trigger .by <price_Contact_Trigger
.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,6 +733,7 @@ WeaponUnits
.by 0 ;_____________45 .by 0 ;_____________45
.by 0 ;_____________46 .by 0 ;_____________46
.by 0 ;_____________47 .by 0 ;_____________47
.by 1 ;White_Flag___48
.by 6 ;Heat_Guidance__ .by 6 ;Heat_Guidance__
.by 2 ;Bal_Guidance___ .by 2 ;Bal_Guidance___
.by 5 ;Horz_Guidance__ .by 5 ;Horz_Guidance__
@@ -746,7 +749,6 @@ WeaponUnits
.by 1 ;Auto_Defense___ .by 1 ;Auto_Defense___
.by 10 ;Fuel_Tank______ .by 10 ;Fuel_Tank______
.by 25 ;Contact_Trigger .by 25 ;Contact_Trigger
.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,$02,$03,$06,$1d,$0a,$1b,$1c ; defensives
.by $3b,$3c,$3d,$3e,$3f,$5e,$5f,$00 .by $1e,$3b,$3c,$3d,$3e,$3f,$5e,$00
; 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"Heat Guidance " ; 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"Battery " ; 55
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"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 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
+16 -16
View File
@@ -59,22 +59,22 @@ 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_Heat_Guidance__ = $ffff ;_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______ = 80 ;_54
price_Mag_Deflector__ = $ffff ;_55 price_Battery________ = $ffff ;_55
price_Shield_________ = $ffff ;_56 price_Mag_Deflector__ = 120 ;_56
price_Force_Shield___ = $ffff ;_57 price_Shield_________ = 50 ;_57
price_Heavy_Shield___ = $ffff ;_58 price_Force_Shield___ = 210 ;_58
price_Super_Mag______ = $ffff ;_59 price_Heavy_Shield___ = 111 ;_59
price_Auto_Defense___ = $ffff ;_60 price_Super_Mag______ = $ffff ;_60
price_Fuel_Tank______ = $ffff ;_61 price_Auto_Defense___ = 300 ;_61
price_Contact_Trigger = $ffff ;_62 price_Fuel_Tank______ = $ffff ;_62
price_White_Flag_____ = $0 ;_63 price_Contact_Trigger = $ffff ;_63
;-------------------------------- ;--------------------------------
; names of RMT instruments (sfx) ; names of RMT instruments (sfx)
;-------------------------------- ;--------------------------------
+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
+122 -9
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
@@ -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
@@ -690,10 +690,30 @@ 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 #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 DoNotDrawTankNr
rts rts
DrawTankShieldWihHorns
jsr DrawTankShield.DrawInPosition
jsr DrawTankShieldHorns
rts
.endp .endp
; ------------------------------------- ; -------------------------------------
@@ -718,6 +738,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 +1451,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 +1505,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 +1516,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 +1567,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
+109 -44
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"144" ; 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
;----------------------------------------------- ;-----------------------------------------------
@@ -129,17 +136,22 @@ START
jsr RandomizeSequence jsr RandomizeSequence
; for the round #1 shooting sequence is random ; 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 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
@@ -300,13 +312,7 @@ 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)
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
@@ -428,6 +434,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 +449,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
@@ -649,7 +659,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 +697,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 +744,7 @@ NotNegativeEnergy
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
GetRandomWind .proc .proc GetRandomWind
;in: MaxWind (byte) ;in: MaxWind (byte)
;out: Wind (word) ;out: Wind (word)
;uses: _ ;uses: _
@@ -736,7 +773,7 @@ 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+#
@@ -746,21 +783,26 @@ PMoutofScreen .proc
;-------------------------------------------------- ;--------------------------------------------------
.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
;-------------------------------------------------- ;--------------------------------------------------
@@ -854,6 +896,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
@@ -872,8 +915,10 @@ ClearResults
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,27 +929,46 @@ 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
@@ -912,13 +976,14 @@ VBLinterrupt .proc
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 = 12 note (0..60)
jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!) 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
@@ -986,7 +1051,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 +1074,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
@@ -1222,7 +1287,7 @@ getkeyend
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
getkeynowait .proc; .proc getkeynowait
;-------------------------------------------------- ;--------------------------------------------------
jsr WaitForKeyRelease jsr WaitForKeyRelease
lda kbcode lda kbcode
@@ -1230,7 +1295,7 @@ getkeynowait .proc;
rts rts
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
WaitForKeyRelease .proc .proc WaitForKeyRelease
;-------------------------------------------------- ;--------------------------------------------------
lda JSTICK0 lda JSTICK0
and #$0f and #$0f
BIN
View File
Binary file not shown.
+325 -175
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 HowManyOnTheList1 ; amounts of weapons (shells, bullets) in both lists
stx HowManyOnTheList2 stx HowManyOnTheList2
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 HowManyOnTheList1
sta PositionOnTheList sta PositionOnTheList
jmp NotTheSameAsLastTime jmp NotTheSameAsLastTime
ominx06 @
lda HowManyOnTheList2 lda HowManyOnTheList2
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 HowManyOnTheList1
sta NubersOfWeaponsL1,y sta IndexesOfWeaponsL1,y
inc HowManyOnTheList1 inc HowManyOnTheList1
bne NextLineOfTheList bne NextLineOfTheList
SecondList DefenceList
ldy HowManyOnTheList2 ldy HowManyOnTheList2
sta NubersOfWeaponsL2,y sta IndexesOfWeaponsL2,y
inc HowManyOnTheList2 inc HowManyOnTheList2
; 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
@@ -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,8 +657,7 @@ EndUpX
PurchaseKeyDown PurchaseKeyDown
lda WhichList lda WhichList
beq GoDown1 beq GoDown1
inc PositionOnTheList inc:lda PositionOnTheList
lda PositionOnTheList
cmp HowManyOnTheList2 cmp HowManyOnTheList2
bne EndGoDownX bne EndGoDownX
ldy HowManyOnTheList2 ldy HowManyOnTheList2
@@ -609,8 +665,7 @@ PurchaseKeyDown
sty PositionOnTheList sty PositionOnTheList
jmp ChoosingItemForPurchase jmp ChoosingItemForPurchase
GoDown1 GoDown1
inc PositionOnTheList inc:lda PositionOnTheList
lda PositionOnTheList
cmp HowManyOnTheList1 cmp HowManyOnTheList1
bne MakeOffsetDown bne MakeOffsetDown
ldy HowManyOnTheList1 ldy HowManyOnTheList1
@@ -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,117 @@ 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
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 .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 .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 +865,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 +887,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 +898,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,8 +910,8 @@ 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
@@ -819,8 +924,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 +1305,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 +1427,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 +1450,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 +1463,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 +1480,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 +1509,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 +1519,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 +1556,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,16 +1565,13 @@ 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
;-------------------------------- ;--------------------------------
@@ -1690,8 +1784,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 +1791,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 +1834,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 +1867,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 +1879,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 +1898,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 +1913,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 +1926,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 +1941,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
+12 -8
View File
@@ -30,6 +30,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 +68,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 +99,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 +120,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,14 +245,12 @@ 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
+207 -43
View File
@@ -102,14 +102,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 +123,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 +153,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 +173,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
@@ -663,12 +654,39 @@ DistanceCheckLoop
adc #1 adc #1
:3 asl :3 asl
tay 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 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 +758,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 +1025,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 +1042,18 @@ notpressed
;---esc pressed-quit game--- ;---esc pressed-quit game---
rts 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 cmp #$8e
jeq CTRLPressedUp jeq CTRLPressedUp
@@ -1064,10 +1092,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 +1139,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
@@ -1197,6 +1237,13 @@ CTRLpressedTAB
pressedSpace pressedSpace
;================================= ;=================================
;we shoot here!!! ;we shoot here!!!
mva #0 pressTimer ; reset
jsr WaitForKeyRelease
lda pressTimer
cmp #25 ; 1/2s
bcs fire
jmp callInventory
fire
RTS RTS
.endp .endp
@@ -1269,9 +1316,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 +1343,13 @@ 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 #54 ; parachute
beq ParachuteActive
cmp #58 ; scheld 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
@@ -1489,6 +1551,11 @@ 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 ActiveDefenceWeapon,x
cmp #54 ; deactivate weapon only if parachute (53)
bne NoParachuteWeapon
mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute)
NoParachuteWeapon
lda #$34 lda #$34
sta CharCode sta CharCode
lda Ytankstable,x lda Ytankstable,x
@@ -1501,10 +1568,8 @@ EndOfFall
sta xdraw+1 sta xdraw+1
jsr TypeChar jsr TypeChar
mva #0 Erase mva #0 Erase
; now we can deduct one parachute from the list of weapons ldx TankNr
jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) )
lda #$35 ; parachute
jsr DecreaseWeapon
ThereWasNoParachute ThereWasNoParachute
mva #sfx_silencer sfx_effect mva #sfx_silencer sfx_effect
rts rts
@@ -1537,6 +1602,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 +1841,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 +1849,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 #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 .endp
.proc SecondFlight .proc SecondFlight
@@ -2157,7 +2285,7 @@ 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
@@ -2168,7 +2296,7 @@ MIRValreadyAll
; 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 +2304,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 +2350,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