From ee420460906e1f5fca54de2cccc87321ba132f29 Mon Sep 17 00:00:00 2001 From: blondie7575 Date: Thu, 23 Sep 2021 12:36:48 -0600 Subject: [PATCH] Added mining and currency spend for weapons --- font.s | 10 +++++----- gamemanager.s | 1 + gscats.2mg | Bin 819264 -> 819264 bytes inventory.s | 37 +++++++++++++++++++++++++++++++--- player.s | 53 ++++++++++++++++++++++++++++++++----------------- projectile.s | 35 ++++++++++++++++++++++++++------ smallNumbers.s | 10 +++++++++- terrain.s | 13 ++++++++++-- utility.s | 2 +- 9 files changed, 125 insertions(+), 36 deletions(-) diff --git a/font.s b/font.s index d27411e..fca127d 100644 --- a/font.s +++ b/font.s @@ -196,12 +196,12 @@ s_Number: qbyte $00F00F00 s_Dollar: - qbyte $000F0F00 - qbyte $00FFFFF0 - qbyte $0F0F0F00 qbyte $00FFFF00 - qbyte $000F0FF0 - qbyte $0FFFFF00 + qbyte $0F000FF0 + qbyte $0F000FF0 + qbyte $0FFFFFF0 + qbyte $00FFFF00 + qbyte $00000000 s_Percent: qbyte $0FF000F0 diff --git a/gamemanager.s b/gamemanager.s index f9bcc04..4fecc11 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -372,6 +372,7 @@ fire: stz fireRequested ldy currentPlayer jsr playerFire + jsr renderPlayerHeader rts diff --git a/gscats.2mg b/gscats.2mg index 80473173ca5b7bb1bb8a42007ea93ef4ffc56143..401c3fec8a44c98937ba6d0ee65bcb07d1595f14 100644 GIT binary patch delta 4039 zcmZu!4R90372Z1`A)RDPCd54n5|$8#dP0&bO^NsmHou0rg`tlKy`tcI zPp|$K$03AF@1X(|3Ze-yojB|_y6&jbIeShRdrlasfkTw62uG>Sw8PVrI7%Hf7>_)s zGM=92UZ=i6=cd!hj_fJDr_(6}-_UyAH&7>xuW=@Yi%=_7L+3`0HBBt1lVs~JDDmpRBBVE-`;pv95MslV3B@Y5ak5ou}-1LyS7au%*tB2@mq#!oiYb%y^47 zu)DWdIa{I|Ic(uA%K8>+R&c8|WlPuzW2@DFyWFc%NV=)ok#zl@rSZMiLMFD)sn%MF zZf7U-_&)2qPVQ0n6=!&#wOn@j;zNu)%@-eL*a`=dr~Betta7d|zSSzTKD^9F)R#-Q z1{)>}iuDZz8F?k&H_XVZc@@^I)qmIVxPiY-YzJ3DCQY>B#hcV2DwuoZ7BHN9wvsc1mBlaAC->KoZWfaQ_h6rN5; zLX>(!=WMk`WStYH)Ha>7%^EpDII5N%IZu&Q`>c`QC>^bo%Vc~QLsP0PRIW1AN-^N@DN0K2~Wa$Z3z!l)O~F^FE8h{WxV@Z0WTNu zaWpniz&mXF_rJHCcie!G`3ctjUTq1_R%L`&0=1Tx*G^idtp)|_czGQUasz95$4qTG zKd_SLri1E%bv$R&3a0P_t9j-82I?W@_9!)D!3DuF$9-jI$mv!uqGlT1Fmd-KdXXcW ziS;SvkUkX%$0S1}o%WY|2TK5~J!?OuX3*9QlxfLORMt~<6)KPONHJ%**l$9~Pczbm zYC3)VNO8GWxm-ydJlt;-dyZeHvW%rBkI9rA`^#tYRL_T81T|BACQs5nGHgix`xVBc zaD6p=OWCfX2IurXyYs*W4}9{{KtM+e}N-_K+0>IsYjtiD$B;G zxz;B=my);lCvU=3Pyc4>ceaQ5N>61~<CfZxx;m;Bl(A!Wm5_4sDcNA~!n4*z18)+MA&ja>pR-mRS> z3cuK?wF@b;wkMD@;KWYt9L$rg&k9-u6c=%*XsoKeSBNhZNj%p>fm|$dtky3iHloy= z7N>jkD0+7%=TtW$`J@2+RCbG#tvHGX05OKflY&+tqqF}Z4{H-rmCSPyv! zBJNQKI<6Fx{J<~NNngZQi34zI*MAL2;6_0#Q53{Z5M(`kK=5 z!YvHJS|ds%sbK_Za$?{jtk5a9sJVRMr^J$I=2a4npQ}w-{PLSVjF2?Nk5Bv5An3>+ zcdkTZ^@U_HJR-DQAJovY=R;=TgRgTuaLgIzlUpY-mrg8)Tknm#?;kvEm+sfqOyo-7 zbhvr~habk5ifqO0G$1CvI4CBNR5`h`yBCU8ZwufD$!iDzw>BZrjuo(KvKXP+-EI*8 zsLOTNBpisFSrUIryyNcMwJC>RKC}zm)giM1Amf*A!lB%- z)xyExU3*CEqmVou%Rl`>GLj4B70o1WnCpmxz&zK1qN?Cvgxm_S7pjYt1 z0Fi@O#2Sc3IL8aMDUv|9FuqparVA5wNh5%t+d0~ceYkC^!3(4&c0Kd zVjxdb#ulebqFbDhetrGK;OFbd&+aQW2XSb!0mK7CQLH|m4@pZBB432BNftol%DoN5 zUD9HcVA8kE>b}(lyKz&FZ?k$KyW}%aq2X?U8^r>O*$NAirs{+Ng-nHdAqqNB$Xqx{ zO}x7{T7q-za6zywW_Xjw*mC#{IUArJMZu?;4!9-CL*{Zg#`%7te-c!GTbr_JK083! z1=ChPIi!h7Obm`5V=Lg{d=xfqesLZgUl6~%8+c}TOp@wxV?4_aTKpv{jaclZ+b#Zy zyzi~`m*}kV+OBJa(mr7EC&>bqpj3CbCs5$yBB!%|`^n{1}4F#m0g?aQ(r@WN^7!BP3ozO<;Cg@Y4o1t5vGtjMV J`H$H){SR32A@=|P delta 3778 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 diff --git a/inventory.s b/inventory.s index a9ac115..1f768ad 100644 --- a/inventory.s +++ b/inventory.s @@ -29,7 +29,7 @@ renderInventory: tya clc adc #playerData - adc #PD_INVENTORY + adc #PD_PRICES sta PARAML1 ; Compute initial VRAM position ($E1-relative) @@ -114,13 +114,22 @@ renderInventoryItem_unselected: lda (PARAML1),y sta PARAML0 jsr intToString + + ; Prepend currency prefix to counter string + BITS8A + lda intToStringResult + inc + sta intToStringPrefix + lda #':' ; Colon maps to dollar sign in tiny number font + sta intToStringResult + BITS16 sec pla sbc #($2000 - 160*2)-1 ; Font engine wants VRAM-relative tax - lda #intToStringResult - jsr DrawNumber + lda #intToStringPrefix + jsr DrawTinyNumber renderInventoryItem_done: RESTORE_AXY @@ -133,3 +142,25 @@ renderInventoryItem_abort: renderInventoryItemIndex: .word 0 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; awardTreats +; +; PARAML0 = Amount to award +; +awardTreats: + SAVE_AY + + ldy currentPlayer + PLAYERPTR_Y + + clc + lda playerData+PD_TREATS,y + adc PARAML0 + sta playerData+PD_TREATS,y + + ldy currentPlayer + jsr renderPlayerHeader + + RESTORE_AY + rts diff --git a/player.s b/player.s index 7a9d4e9..81e4e66 100644 --- a/player.s +++ b/player.s @@ -7,6 +7,7 @@ playerData: + ;;;;;;;;;;;; PLAYER 1 ;;;;;;;;;;;;;; ; gameobject data .word 0 ; X pos in pixels (from left terrain edge) .word 0 ; Y pos in pixels (from bottom terrain edge) @@ -20,13 +21,15 @@ playerData: .word 100 ; Anger .byte 8,"SPROCKET " ; Name .word 1 ; Base Sprite - .word 0,5,5,0,0,0,0,0 ; Inventory + .word 0,5,7,0,0,0,0,0 ; Prices .word 0 ; Current weapon + .word 7 ; Treats - .repeat 88 + .repeat 86 .byte 0 ; Padding to 256-byte boundary .endrepeat + ;;;;;;;;;;;; PLAYER 2 ;;;;;;;;;;;;;; ; gameobject data .word 0 ; X pos in pixels (from left terrain edge) .word 0 ; Y pos in pixels (from bottom terrain edge) @@ -35,15 +38,16 @@ playerData: .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .word 155 ; Angle in degrees from +X + .word 155 ; Angle in degrees from +X .word 2 ; Power - .word 100 ; Anger + .word 100 ; Anger .byte 8,"TINKER " ; Name .word 0 ; Base Sprite - .word 0,5,5,0,0,0,0,0 ; Inventory + .word 0,5,7,0,0,0,0,0 ; Prices .word 0 ; Current weapon + .word 7 ; Treats - .repeat 88 + .repeat 86 .byte 0 ; Padding to 256-byte boundary .endrepeat @@ -52,8 +56,9 @@ PD_POWER = 134 PD_ANGER = 136 PD_NAME = 138 PD_BASESPRITE = 148 -PD_INVENTORY = 150 +PD_PRICES = 150 PD_CURRWEAPON = 166 +PD_TREATS = 168 PD_SIZE = 256 .macro PLAYERPTR_Y @@ -172,30 +177,32 @@ playerDeltaPowerClampHigh: ; playerFire ; ; Y = Player index -; Trashes SCRATCHL +; Trashes SCRATCHL,SCRATCHL2 ; playerFire: - SAVE_AX + SAVE_AXY PLAYERPTR_Y - ; Check for inventory + ; Check that we can afford it lda playerData+PD_CURRWEAPON,y pha asl tax - beq playerFire_infiniteAmmo ; Weapon 0 is always infinite stx SCRATCHL - lda #playerData+PD_INVENTORY + lda #playerData+PD_PRICES clc adc SCRATCHL sta SCRATCHL lda (SCRATCHL),y - beq playerFire_abort - dec ; Consume ammo - sta (SCRATCHL),y - dec inventoryDirty + sta SCRATCHL -playerFire_infiniteAmmo: + lda playerData+PD_TREATS,y + cmp SCRATCHL + bmi playerFire_abort + + sec ; Spend money + sbc SCRATCHL + sta playerData+PD_TREATS,y ; Prepare projectile parameters pla @@ -213,7 +220,7 @@ playerFire_infiniteAmmo: jsr fireProjectile playerFire_done: - RESTORE_AX + RESTORE_AXY rts playerFire_abort: @@ -358,6 +365,14 @@ renderPlayerHeader: ldx #96 + 321 jsr drawNumber + lda #treatsStr + ldx #126 + 321 + jsr DrawString + + lda playerData+PD_TREATS,y + ldx #130 + 321 + jsr drawNumber + RESTORE_AXY rts @@ -367,5 +382,7 @@ powerStr: pstring "+: " angerStr: pstring "): " +treatsStr: + pstring "$ " diff --git a/projectile.s b/projectile.s index a680d54..62dd030 100644 --- a/projectile.s +++ b/projectile.s @@ -104,8 +104,9 @@ projectileTypes: .addr 0 ; Render .addr 0 ; Cleanup .word 1 ; Directional + .word 1 ; Mining - .repeat 12 + .repeat 10 .byte 0 ; Padding to 32-byte boundary .endrepeat @@ -120,8 +121,9 @@ projectileTypes: .addr 0 ; Render .addr 0 ; Cleanup .word 0 ; Directional + .word 0 ; Mining - .repeat 12 + .repeat 10 .byte 0 ; Padding to 32-byte boundary .endrepeat @@ -136,8 +138,10 @@ projectileTypes: .addr renderFan ; Render .addr deleteFan ; Cleanup .word 1 ; Directional + .word 0 ; Mining - .repeat 12 + .repeat 10 + .byte 0 ; Padding to 32-byte boundary .endrepeat @@ -152,6 +156,7 @@ PT_UPDATE = 12 PT_RENDER = 14 PT_CLEANUP = 16 PT_DIRECTIONAL = 18 +PT_MINING = 20 .macro PROJECTILEPTR_Y tya ; Pointer to projectile structure from index @@ -890,14 +895,14 @@ processTerrainImpact: lda projectileData+GO_POSX,y clc adc #GAMEOBJECTWIDTH/2+1 ; A fudge that makes crater location look better in this direction, and tunneling work better - bra processTerrainStoreContinue + bra processTerrainImpactStoreContinue processTerrainImpactNegative: lda projectileData+GO_POSX,y clc adc #GAMEOBJECTWIDTH/4-1 ; A fudge that makes crater location look better in this direction, and tunneling work better -processTerrainStoreContinue: +processTerrainImpactStoreContinue: sta PARAML0 pha ; Dirt explosion will need this lda projectileData+GO_POSY,y @@ -916,7 +921,7 @@ processTerrainStoreContinue: jsr craterTerrain - jsr unclipTerrain + jsr unclipTerrain ; Recompile the rows affected by the crater clc @@ -943,4 +948,22 @@ processTerrainStoreContinue: sta PARAML0 jsr createDirtExplosion + ; Cash in the dirt if needed + ldy projectileActive + lda projectileData+JD_TYPE,y + tay + PROJECTILETYPEPTR_Y + + lda projectileTypes+PT_MINING,y + beq processTerrainImpactDone + lda craterTerrainAccumulator + lsr ; Dirt to treats conversion rate + lsr + lsr + inc ; Ensure minimum one treat + sta PARAML0 + jsr awardTreats + +processTerrainImpactDone: rts + diff --git a/smallNumbers.s b/smallNumbers.s index 15a5360..7ce7bb1 100644 --- a/smallNumbers.s +++ b/smallNumbers.s @@ -12,7 +12,7 @@ F_CURRPOS: .word 0 ;current top left char position F_NUMPTR = $06 ;pointer to string (including length byte) / DP -DrawNumber: +DrawTinyNumber: SAVE_AXY sta F_NUMPTR @@ -85,6 +85,7 @@ DigitTable: .addr s_7 .addr s_8 .addr s_9 + .addr s_SmallDollar ; Use ASCII code for colon DigitData: @@ -158,3 +159,10 @@ s_9: fontword $00F0 fontword $00F0 +s_SmallDollar: ; Use ASCII code for colon + .dbyt $a66a + .dbyt $6F66 + .dbyt $6666 + .dbyt $a66a + .dbyt $aaaa + diff --git a/terrain.s b/terrain.s index 94874ec..9e7363e 100644 --- a/terrain.s +++ b/terrain.s @@ -69,6 +69,7 @@ renderTerrainDone: craterTerrain: SAVE_AX + stz craterTerrainAccumulator lda #TERRAINWIDTH ; Convert X pos to terrain-right byte count sec sbc PARAML0 @@ -108,11 +109,17 @@ craterTerrainLoop: adc PARAML1 ; Convert to terrain-space bmi craterTerrainZero sta SCRATCHL2 + sec lda (PARAML0),y - cmp SCRATCHL2 + sbc SCRATCHL2 bmi craterTerrainLoop - lda SCRATCHL2 ; Circle value is lower, so use that + ; Circle value is lower, so use that + clc + adc craterTerrainAccumulator ; Track total crater material + sta craterTerrainAccumulator + + lda SCRATCHL2 ; Replace terrain height with cratered value sta (PARAML0),y bra craterTerrainLoop @@ -128,6 +135,8 @@ craterTerrainDone: RESTORE_AX rts +craterTerrainAccumulator: + .word 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; clipTerrain diff --git a/utility.s b/utility.s index 6634977..fb64443 100644 --- a/utility.s +++ b/utility.s @@ -96,9 +96,9 @@ intToStringDone: rts intToStringBCD: .byte 0,0,0 +intToStringPrefix: .byte 0 intToStringResult: .byte 0,0,0,0,0,0 - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; mult16 ;