From 08964e2f68ecfc1c517555b1db43c43c83a4c910 Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 8 May 2022 01:10:33 -0400 Subject: [PATCH] SFX: work in progress --- artwork/sfx/rmt_feat.asm | 40 + artwork/sfx/rmtplayr_game.asm | 1336 +++++++++++++++++++++++ artwork/sfx/scorch_trial07_stripped.rmt | Bin 0 -> 1277 bytes definitions.asm | 26 + display.asm | 8 +- scorch.asm | 138 ++- scorch.xex | Bin 34363 -> 37086 bytes variables.asm | 2 + weapons.asm | 30 +- 9 files changed, 1538 insertions(+), 42 deletions(-) create mode 100644 artwork/sfx/rmt_feat.asm create mode 100644 artwork/sfx/rmtplayr_game.asm create mode 100644 artwork/sfx/scorch_trial07_stripped.rmt diff --git a/artwork/sfx/rmt_feat.asm b/artwork/sfx/rmt_feat.asm new file mode 100644 index 0000000..84a3f1d --- /dev/null +++ b/artwork/sfx/rmt_feat.asm @@ -0,0 +1,40 @@ +;* --------BEGIN-------- +;* Z:\home\pkalinowski\Seafile\atari\projects\scorch_src\artwork\sfx\scorch_trial07_stripped.rmt +FEAT_SFX equ 1 +FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable +FEAT_NOSTARTINGSONGLINE equ 0 +FEAT_INSTRSPEED equ 1 +FEAT_CONSTANTSPEED equ 16 ;(0 times) +FEAT_COMMAND1 equ 1 ;(4 times) +FEAT_COMMAND2 equ 0 ;(0 times) +FEAT_COMMAND3 equ 0 ;(0 times) +FEAT_COMMAND4 equ 0 ;(0 times) +FEAT_COMMAND5 equ 0 ;(0 times) +FEAT_COMMAND6 equ 0 ;(0 times) +FEAT_COMMAND7SETNOTE equ 0 ;(0 times) +FEAT_COMMAND7VOLUMEONLY equ 0 ;(0 times) +FEAT_PORTAMENTO equ 0 ;(0 times) +FEAT_FILTER equ 1 ;(22 times) +FEAT_FILTERG0L equ 0 ;(0 times) +FEAT_FILTERG1L equ 0 ;(0 times) +FEAT_FILTERG0R equ 0 ;(0 times) +FEAT_FILTERG1R equ 0 ;(0 times) +FEAT_BASS16 equ 0 ;(0 times) +FEAT_BASS16G1L equ 0 ;(0 times) +FEAT_BASS16G3L equ 0 ;(0 times) +FEAT_BASS16G1R equ 0 ;(0 times) +FEAT_BASS16G3R equ 0 ;(0 times) +FEAT_VOLUMEONLYG0L equ 0 ;(0 times) +FEAT_VOLUMEONLYG2L equ 0 ;(0 times) +FEAT_VOLUMEONLYG3L equ 0 ;(0 times) +FEAT_VOLUMEONLYG0R equ 0 ;(0 times) +FEAT_VOLUMEONLYG2R equ 0 ;(0 times) +FEAT_VOLUMEONLYG3R equ 0 ;(0 times) +FEAT_TABLETYPE equ 0 ;(0 times) +FEAT_TABLEMODE equ 0 ;(0 times) +FEAT_TABLEGO equ 1 ;(1 times) +FEAT_AUDCTLMANUALSET equ 1 ;(4 times) +FEAT_VOLUMEMIN equ 0 ;(0 times) +FEAT_EFFECTVIBRATO equ 0 ;(0 times) +FEAT_EFFECTFSHIFT equ 1 ;(7 times) +;* --------END-------- diff --git a/artwork/sfx/rmtplayr_game.asm b/artwork/sfx/rmtplayr_game.asm new file mode 100644 index 0000000..d1cf105 --- /dev/null +++ b/artwork/sfx/rmtplayr_game.asm @@ -0,0 +1,1336 @@ +.echo * +;* +;* Raster Music Tracker, RMT Atari routine version 1.20090108 +;* (c) Radek Sterba, Raster/C.P.U., 2002 - 2009 +;* http://raster.atari.org +;* +;* Warnings: +;* +;* 1. RMT player routine needs 19 itself reserved bytes in zero page (no accessed +;* from any other routines) as well as cca 1KB of memory before the "PLAYER" +;* address for frequency tables and functionary variables. It's: +;* a) from PLAYER-$03c0 to PLAYER for stereo RMTplayer +;* b) from PLAYER-$0320 to PLAYER for mono RMTplayer +;* +;* 2. RMT player routine MUST (!!!) be compiled from the begin of the memory page. +;* i.e. "PLAYER" address can be $..00 only! +;* +;* 3. Because of RMTplayer provides a lot of effects, it spent a lot of CPU time. +;* + STEREOMODE equ 0 ;0 => compile RMTplayer for 4 tracks mono +;* ;1 => compile RMTplayer for 8 tracks stereo +;* ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4 +;* ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4 +;* +; IFT STEREOMODE==1 +;TRACKS equ 8 +; ELS +TRACKS equ 4 +; EIF +;* +PLAYER = * + .ECHO 'PLAYER addr:',* + IFT TRACKS>4 + org PLAYER-$400+$40 + ELS + org PLAYER-$400+$e0 + EIF +track_variables +trackn_db org *+TRACKS +trackn_hb org *+TRACKS +trackn_idx org *+TRACKS +trackn_pause org *+TRACKS +trackn_note org *+TRACKS +trackn_volume org *+TRACKS +trackn_distor org *+TRACKS +trackn_shiftfrq org *+TRACKS + IFT FEAT_PORTAMENTO +trackn_portafrqc org *+TRACKS +trackn_portafrqa org *+TRACKS +trackn_portaspeed org *+TRACKS +trackn_portaspeeda org *+TRACKS +trackn_portadepth org *+TRACKS + EIF +trackn_instrx2 org *+TRACKS +trackn_instrdb org *+TRACKS +trackn_instrhb org *+TRACKS +trackn_instridx org *+TRACKS +trackn_instrlen org *+TRACKS +trackn_instrlop org *+TRACKS +trackn_instrreachend org *+TRACKS +trackn_volumeslidedepth org *+TRACKS +trackn_volumeslidevalue org *+TRACKS + IFT FEAT_VOLUMEMIN +trackn_volumemin org *+TRACKS + EIF +FEAT_EFFECTS equ FEAT_EFFECTVIBRATO||FEAT_EFFECTFSHIFT + IFT FEAT_EFFECTS +trackn_effdelay org *+TRACKS + EIF + IFT FEAT_EFFECTVIBRATO +trackn_effvibratoa org *+TRACKS + EIF + IFT FEAT_EFFECTFSHIFT +trackn_effshift org *+TRACKS + EIF +trackn_tabletypespeed org *+TRACKS + IFT FEAT_TABLEMODE +trackn_tablemode org *+TRACKS + EIF +trackn_tablenote org *+TRACKS +trackn_tablea org *+TRACKS +trackn_tableend org *+TRACKS + IFT FEAT_TABLEGO +trackn_tablelop org *+TRACKS + EIF +trackn_tablespeeda org *+TRACKS + IFT FEAT_FILTER||FEAT_BASS16 +trackn_command org *+TRACKS + EIF + IFT FEAT_BASS16 +trackn_outnote org *+TRACKS + EIF + IFT FEAT_FILTER +trackn_filter org *+TRACKS + EIF +trackn_audf org *+TRACKS +trackn_audc org *+TRACKS + IFT FEAT_AUDCTLMANUALSET +trackn_audctl org *+TRACKS + EIF +v_aspeed org *+1 +track_endvariables + org PLAYER-$100-$140-$40+2 +INSTRPAR equ 12 +tabbeganddistor + dta frqtabpure-frqtab,$00 + dta frqtabpure-frqtab,$20 + dta frqtabpure-frqtab,$40 + dta frqtabbass1-frqtab,$c0 + dta frqtabpure-frqtab,$80 + dta frqtabpure-frqtab,$a0 + dta frqtabbass1-frqtab,$c0 + dta frqtabbass2-frqtab,$c0 + IFT FEAT_EFFECTVIBRATO +vibtabbeg dta 0,vib1-vib0,vib2-vib0,vib3-vib0 +vib0 dta 0 +vib1 dta 1,-1,-1,1 +vib2 dta 1,0,-1,-1,0,1 +vib3 dta 1,1,0,-1,-1,-1,-1,0,1,1 +vibtabnext + dta vib0-vib0+0 + dta vib1-vib0+1,vib1-vib0+2,vib1-vib0+3,vib1-vib0+0 + dta vib2-vib0+1,vib2-vib0+2,vib2-vib0+3,vib2-vib0+4,vib2-vib0+5,vib2-vib0+0 + dta vib3-vib0+1,vib3-vib0+2,vib3-vib0+3,vib3-vib0+4,vib3-vib0+5,vib3-vib0+6,vib3-vib0+7,vib3-vib0+8,vib3-vib0+9,vib3-vib0+0 + EIF + org PLAYER-$100-$140 + IFT FEAT_BASS16 +frqtabbasslo + dta $F2,$33,$96,$E2,$38,$8C,$00,$6A,$E8,$6A,$EF,$80,$08,$AE,$46,$E6 + dta $95,$41,$F6,$B0,$6E,$30,$F6,$BB,$84,$52,$22,$F4,$C8,$A0,$7A,$55 + dta $34,$14,$F5,$D8,$BD,$A4,$8D,$77,$60,$4E,$38,$27,$15,$06,$F7,$E8 + dta $DB,$CF,$C3,$B8,$AC,$A2,$9A,$90,$88,$7F,$78,$70,$6A,$64,$5E,$00 + EIF + org PLAYER-$100-$100 +frqtab + ERT [255 + ldy #0 + tya +ri0 sta track_variables,y + sta track_endvariables-$100,y + iny + bne ri0 + ELS + ldy #track_endvariables-track_variables + lda #0 +ri0 sta track_variables-1,y + dey + bne ri0 + EIF + ldy #4 + lda (ns),y + sta v_maxtracklen + iny + IFT FEAT_CONSTANTSPEED==0 + lda (ns),y + sta v_speed + EIF + IFT FEAT_INSTRSPEED==0 + iny + lda (ns),y + sta v_instrspeed + sta v_ainstrspeed + ELI FEAT_INSTRSPEED>1 + lda #FEAT_INSTRSPEED + sta v_ainstrspeed + EIF + ldy #8 +ri1 lda (ns),y + sta p_tis-8,y + iny + cpy #8+8 + bne ri1 + IFT FEAT_NOSTARTINGSONGLINE==0 + pla + pha + IFT TRACKS>4 + asl @ + asl @ + asl @ + clc + adc p_song + sta p_song + pla + php + and #$e0 + asl @ + rol @ + rol @ + rol @ + ELS + asl @ + asl @ + clc + adc p_song + sta p_song + pla + php + and #$c0 + asl @ + rol @ + rol @ + EIF + plp + adc p_song+1 + sta p_song+1 + EIF + jsr GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 +rmt_silence + IFT STEREOMODE>0 + lda #0 + sta $d208 + sta $d218 + ldy #3 + sty $d20f + sty $d21f + ldy #8 +si1 sta $d200,y + sta $d210,y + dey + bpl si1 + ELS + lda #0 + sta $d208 + ldy #3 + sty $d20f + ldy #8 +si1 sta $d200,y + dey + bpl si1 + EIF + IFT FEAT_INSTRSPEED==0 + lda v_instrspeed + ELS + lda #FEAT_INSTRSPEED + EIF + rts +GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 +GetSongLine + ldx #0 + stx v_abeat +nn0 +nn1 txa + tay + lda (p_song),y + cmp #$fe + bcs nn2 + tay + lda (p_trackslbstable),y + sta trackn_db,x + lda (p_trackshbstable),y +nn1a sta trackn_hb,x + lda #0 + sta trackn_idx,x + lda #1 +nn1a2 sta trackn_pause,x + lda #$80 + sta trackn_instrx2,x + inx +xtracks01 cpx #TRACKS + bne nn1 + lda p_song + clc +xtracks02 adc #TRACKS + sta p_song + bcc GetTrackLine + inc p_song+1 +nn1b + jmp GetTrackLine +nn2 + beq nn3 +nn2a + lda #0 + beq nn1a2 +nn3 + ldy #2 + lda (p_song),y + tax + iny + lda (p_song),y + sta p_song+1 + stx p_song + ldx #0 + beq nn0 +GetTrackLine +oo0 +oo0a + IFT FEAT_CONSTANTSPEED==0 + lda #$ff +v_speed equ *-1 + sta v_bspeed + EIF + ldx #-1 +oo1 + inx + dec trackn_pause,x + bne oo1x +oo1b + lda trackn_db,x + sta ns + lda trackn_hb,x + sta ns+1 +oo1i + ldy trackn_idx,x + inc trackn_idx,x + lda (ns),y + sta reg1 + and #$3f + cmp #61 + beq oo1a + bcs oo2 + sta trackn_note,x + IFT FEAT_BASS16 + sta trackn_outnote,x + EIF + iny + lda (ns),y + lsr @ + and #$3f*2 + sta trackn_instrx2,x +oo1a + lda #1 + sta trackn_pause,x + ldy trackn_idx,x + inc trackn_idx,x + lda (ns),y + lsr @ + ror reg1 + lsr @ + ror reg1 + lda reg1 + IFT FEAT_GLOBALVOLUMEFADE + sec + sbc #$00 +RMTGLOBALVOLUMEFADE equ *-1 + bcs voig + lda #0 +voig + EIF + and #$f0 + sta trackn_volume,x +oo1x +xtracks03sub1 cpx #TRACKS-1 + bne oo1 + IFT FEAT_CONSTANTSPEED==0 + lda #$ff +v_bspeed equ *-1 + sta v_speed + ELS + lda #FEAT_CONSTANTSPEED + EIF + sta v_aspeed + jmp InitOfNewSetInstrumentsOnly +oo2 + cmp #63 + beq oo63 + lda reg1 + and #$c0 + beq oo62_b + asl @ + rol @ + rol @ + sta trackn_pause,x + jmp oo1x +oo62_b + iny + lda (ns),y + sta trackn_pause,x + inc trackn_idx,x + jmp oo1x +oo63 + lda reg1 + IFT FEAT_CONSTANTSPEED==0 + bmi oo63_1X + iny + lda (ns),y + sta v_bspeed + inc trackn_idx,x + jmp oo1i +oo63_1X + EIF + cmp #255 + beq oo63_11 + iny + lda (ns),y + sta trackn_idx,x + jmp oo1i +oo63_11 + jmp GetSongLine +p2xrmtp3 jmp rmt_p3 +p2x0 dex + bmi p2xrmtp3 +InitOfNewSetInstrumentsOnly +p2x1 ldy trackn_instrx2,x + bmi p2x0 + IFT FEAT_SFX + jsr SetUpInstrumentY2 + jmp p2x0 +rmt_sfx + sta trackn_note,x + IFT FEAT_BASS16 + sta trackn_outnote,x + EIF + lda #$f0 ;* sfx note volume*16 +RMTSFXVOLUME equ *-1 ;* label for sfx note volume parameter overwriting + sta trackn_volume,x + EIF +SetUpInstrumentY2 + lda (p_instrstable),y + sta trackn_instrdb,x + sta nt + iny + lda (p_instrstable),y + sta trackn_instrhb,x + sta nt+1 + IFT FEAT_FILTER + lda #1 + sta trackn_filter,x + EIF + IFT FEAT_TABLEGO + IFT FEAT_FILTER + tay + ELS + ldy #1 + EIF + lda (nt),y + sta trackn_tablelop,x + iny + ELS + ldy #2 + EIF + lda (nt),y + sta trackn_instrlen,x + iny + lda (nt),y + sta trackn_instrlop,x + iny + lda (nt),y + sta trackn_tabletypespeed,x + IFT FEAT_TABLETYPE||FEAT_TABLEMODE + and #$3f + EIF + sta trackn_tablespeeda,x + IFT FEAT_TABLEMODE + lda (nt),y + and #$40 + sta trackn_tablemode,x + EIF + IFT FEAT_AUDCTLMANUALSET + iny + lda (nt),y + sta trackn_audctl,x + iny + ELS + ldy #6 + EIF + lda (nt),y + sta trackn_volumeslidedepth,x + IFT FEAT_VOLUMEMIN + iny + lda (nt),y + sta trackn_volumemin,x + IFT FEAT_EFFECTS + iny + EIF + ELS + IFT FEAT_EFFECTS + ldy #8 + EIF + EIF + IFT FEAT_EFFECTS + lda (nt),y + sta trackn_effdelay,x + IFT FEAT_EFFECTVIBRATO + iny + lda (nt),y + tay + lda vibtabbeg,y + sta trackn_effvibratoa,x + EIF + IFT FEAT_EFFECTFSHIFT + ldy #10 + lda (nt),y + sta trackn_effshift,x + EIF + EIF + lda #128 + sta trackn_volumeslidevalue,x + sta trackn_instrx2,x + asl @ + sta trackn_instrreachend,x + sta trackn_shiftfrq,x + tay + lda (nt),y + sta trackn_tableend,x + adc #0 + sta trackn_instridx,x + lda #INSTRPAR + sta trackn_tablea,x + tay + lda (nt),y + sta trackn_tablenote,x +xata_rtshere + IFT FEAT_SFX + rts + ELS + jmp p2x0 + EIF +rmt_play +rmt_p0 + jsr SetPokey +rmt_p1 + IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 + dec v_ainstrspeed + bne rmt_p3 + EIF + IFT FEAT_INSTRSPEED==0 + lda #$ff +v_instrspeed equ *-1 + sta v_ainstrspeed + ELI FEAT_INSTRSPEED>1 + lda #FEAT_INSTRSPEED + sta v_ainstrspeed + EIF +rmt_p2 + dec v_aspeed + bne rmt_p3 + inc v_abeat + lda #$ff +v_abeat equ *-1 + cmp #$ff +v_maxtracklen equ *-1 + beq p2o3 + jmp GetTrackLine +p2o3 + jmp GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 +go_ppnext jmp ppnext +rmt_p3 + lda #>frqtab + sta nr+1 +xtracks05sub1 ldx #TRACKS-1 +pp1 + lda trackn_instrhb,x + beq go_ppnext + sta ns+1 + lda trackn_instrdb,x + sta ns + ldy trackn_instridx,x + lda (ns),y + sta reg1 + iny + lda (ns),y + sta reg2 + iny + lda (ns),y + sta reg3 + iny + tya + cmp trackn_instrlen,x + bcc pp2 + beq pp2 + lda #$80 + sta trackn_instrreachend,x +pp1b + lda trackn_instrlop,x +pp2 sta trackn_instridx,x + lda reg1 + IFT TRACKS>4 + cpx #4 + bcc pp2s + lsr @ + lsr @ + lsr @ + lsr @ +pp2s + EIF + and #$0f + ora trackn_volume,x + tay + lda volumetab,y + sta tmp + lda reg2 + and #$0e + tay + lda tabbeganddistor,y + sta nr + lda tmp + ora tabbeganddistor+1,y + sta trackn_audc,x +InstrumentsEffects + IFT FEAT_EFFECTS + lda trackn_effdelay,x + beq ei2 + cmp #1 + bne ei1 + lda trackn_shiftfrq,x + IFT FEAT_EFFECTFSHIFT + clc + adc trackn_effshift,x + EIF + IFT FEAT_EFFECTVIBRATO + clc + ldy trackn_effvibratoa,x + adc vib0,y + EIF + sta trackn_shiftfrq,x + IFT FEAT_EFFECTVIBRATO + lda vibtabnext,y + sta trackn_effvibratoa,x + EIF + jmp ei2 +ei1 + dec trackn_effdelay,x +ei2 + EIF + ldy trackn_tableend,x + cpy #INSTRPAR+1 + bcc ei3 + lda trackn_tablespeeda,x + bpl ei2f +ei2c + tya + cmp trackn_tablea,x + bne ei2c2 + IFT FEAT_TABLEGO + lda trackn_tablelop,x + ELS + lda #INSTRPAR + EIF + sta trackn_tablea,x + bne ei2a +ei2c2 + inc trackn_tablea,x +ei2a + lda trackn_instrdb,x + sta nt + lda trackn_instrhb,x + sta nt+1 + ldy trackn_tablea,x + lda (nt),y + IFT FEAT_TABLEMODE + ldy trackn_tablemode,x + beq ei2e + clc + adc trackn_tablenote,x +ei2e + EIF + sta trackn_tablenote,x + lda trackn_tabletypespeed,x + IFT FEAT_TABLETYPE||FEAT_TABLEMODE + and #$3f + EIF +ei2f + sec + sbc #1 + sta trackn_tablespeeda,x +ei3 + lda trackn_instrreachend,x + bpl ei4 + lda trackn_volume,x + beq ei4 + IFT FEAT_VOLUMEMIN + cmp trackn_volumemin,x + beq ei4 + bcc ei4 + EIF + tay + lda trackn_volumeslidevalue,x + clc + adc trackn_volumeslidedepth,x + sta trackn_volumeslidevalue,x + bcc ei4 + tya + sbc #16 + sta trackn_volume,x +ei4 + IFT FEAT_COMMAND2 + lda #0 + sta frqaddcmd2 + EIF + IFT FEAT_COMMAND1||FEAT_COMMAND2||FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + lda reg2 + IFT FEAT_FILTER||FEAT_BASS16 + sta trackn_command,x + EIF + and #$70 + IFT 1==[FEAT_COMMAND1+FEAT_COMMAND2+FEAT_COMMAND3+FEAT_COMMAND4+FEAT_COMMAND5+FEAT_COMMAND6+[FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY]] + beq cmd0 + ELS + lsr @ + lsr @ + sta jmx+1 +jmx bcc * + jmp cmd0 + nop + jmp cmd1 + IFT FEAT_COMMAND2||FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd2 + EIF + IFT FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd3 + EIF + IFT FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd4 + EIF + IFT FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd5 + EIF + IFT FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd6 + EIF + IFT FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd7 + EIF + EIF + ELS + IFT FEAT_FILTER||FEAT_BASS16 + lda reg2 + sta trackn_command,x + EIF + EIF +cmd1 + IFT FEAT_COMMAND1 + lda reg3 + jmp cmd0c + EIF +cmd2 + IFT FEAT_COMMAND2 + lda reg3 + sta frqaddcmd2 + lda trackn_note,x + jmp cmd0a + EIF +cmd3 + IFT FEAT_COMMAND3 + lda trackn_note,x + clc + adc reg3 + sta trackn_note,x + jmp cmd0a + EIF +cmd4 + IFT FEAT_COMMAND4 + lda trackn_shiftfrq,x + clc + adc reg3 + sta trackn_shiftfrq,x + lda trackn_note,x + jmp cmd0a + EIF +cmd5 + IFT FEAT_COMMAND5&&FEAT_PORTAMENTO + IFT FEAT_TABLETYPE + lda trackn_tabletypespeed,x + bpl cmd5a1 + ldy trackn_note,x + lda (nr),y + clc + adc trackn_tablenote,x + jmp cmd5ax + EIF +cmd5a1 + lda trackn_note,x + clc + adc trackn_tablenote,x + cmp #61 + bcc cmd5a2 + lda #63 +cmd5a2 + tay + lda (nr),y +cmd5ax + sta trackn_portafrqc,x + ldy reg3 + bne cmd5a + sta trackn_portafrqa,x +cmd5a + tya + lsr @ + lsr @ + lsr @ + lsr @ + sta trackn_portaspeed,x + sta trackn_portaspeeda,x + lda reg3 + and #$0f + sta trackn_portadepth,x + lda trackn_note,x + jmp cmd0a + ELI FEAT_COMMAND5 + lda trackn_note,x + jmp cmd0a + EIF +cmd6 + IFT FEAT_COMMAND6&&FEAT_FILTER + lda reg3 + clc + adc trackn_filter,x + sta trackn_filter,x + lda trackn_note,x + jmp cmd0a + ELI FEAT_COMMAND6 + lda trackn_note,x + jmp cmd0a + EIF +cmd7 + IFT FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + IFT FEAT_COMMAND7SETNOTE + lda reg3 + IFT FEAT_COMMAND7VOLUMEONLY + cmp #$80 + beq cmd7a + EIF + sta trackn_note,x + jmp cmd0a + EIF + IFT FEAT_COMMAND7VOLUMEONLY +cmd7a + lda trackn_audc,x + ora #$f0 + sta trackn_audc,x + lda trackn_note,x + jmp cmd0a + EIF + EIF +cmd0 + lda trackn_note,x + clc + adc reg3 +cmd0a + IFT FEAT_TABLETYPE + ldy trackn_tabletypespeed,x + bmi cmd0b + EIF + clc + adc trackn_tablenote,x + cmp #61 + bcc cmd0a1 + lda #0 + sta trackn_audc,x + lda #63 +cmd0a1 + IFT FEAT_BASS16 + sta trackn_outnote,x + EIF + tay + lda (nr),y + clc + adc trackn_shiftfrq,x + IFT FEAT_COMMAND2 + clc + adc frqaddcmd2 + EIF + IFT FEAT_TABLETYPE + jmp cmd0c +cmd0b + cmp #61 + bcc cmd0b1 + lda #0 + sta trackn_audc,x + lda #63 +cmd0b1 + tay + lda trackn_shiftfrq,x + clc + adc trackn_tablenote,x + clc + adc (nr),y + IFT FEAT_COMMAND2 + clc + adc frqaddcmd2 + EIF + EIF +cmd0c + sta trackn_audf,x +pp9 + IFT FEAT_PORTAMENTO + lda trackn_portaspeeda,x + beq pp10 + dec trackn_portaspeeda,x + bne pp10 + lda trackn_portaspeed,x + sta trackn_portaspeeda,x + lda trackn_portafrqa,x + cmp trackn_portafrqc,x + beq pp10 + bcs pps1 + adc trackn_portadepth,x + bcs pps8 + cmp trackn_portafrqc,x + bcs pps8 + jmp pps9 +pps1 + sbc trackn_portadepth,x + bcc pps8 + cmp trackn_portafrqc,x + bcs pps9 +pps8 + lda trackn_portafrqc,x +pps9 + sta trackn_portafrqa,x +pp10 + lda reg2 + and #$01 + beq pp11 + lda trackn_portafrqa,x + clc + adc trackn_shiftfrq,x + sta trackn_audf,x +pp11 + EIF +ppnext + dex + bmi rmt_p4 + jmp pp1 +rmt_p4 + IFT FEAT_AUDCTLMANUALSET + lda trackn_audctl+0 + ora trackn_audctl+1 + ora trackn_audctl+2 + ora trackn_audctl+3 + tax + ELS + ldx #0 + EIF +qq1 + stx v_audctl + IFT FEAT_FILTER + IFT FEAT_FILTERG0L + lda trackn_command+0 + bpl qq2 + lda trackn_audc+0 + and #$0f + beq qq2 + lda trackn_audf+0 + clc + adc trackn_filter+0 + sta trackn_audf+2 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L + lda trackn_audc+2 + and #$10 + bne qq1a + EIF + lda #0 + sta trackn_audc+2 +qq1a + txa + ora #4 + tax + EIF +qq2 + IFT FEAT_FILTERG1L + lda trackn_command+1 + bpl qq3 + lda trackn_audc+1 + and #$0f + beq qq3 + lda trackn_audf+1 + clc + adc trackn_filter+1 + sta trackn_audf+3 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3L + lda trackn_audc+3 + and #$10 + bne qq2a + EIF + lda #0 + sta trackn_audc+3 +qq2a + txa + ora #2 + tax + EIF +qq3 + IFT FEAT_FILTERG0L||FEAT_FILTERG1L + cpx v_audctl + bne qq5 + EIF + EIF + IFT FEAT_BASS16 + IFT FEAT_BASS16G1L + lda trackn_command+1 + and #$0e + cmp #6 + bne qq4 + lda trackn_audc+1 + and #$0f + beq qq4 + ldy trackn_outnote+1 + lda frqtabbasslo,y + sta trackn_audf+0 + lda frqtabbasshi,y + sta trackn_audf+1 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0L + lda trackn_audc+0 + and #$10 + bne qq3a + EIF + lda #0 + sta trackn_audc+0 +qq3a + txa + ora #$50 + tax + EIF +qq4 + IFT FEAT_BASS16G3L + lda trackn_command+3 + and #$0e + cmp #6 + bne qq5 + lda trackn_audc+3 + and #$0f + beq qq5 + ldy trackn_outnote+3 + lda frqtabbasslo,y + sta trackn_audf+2 + lda frqtabbasshi,y + sta trackn_audf+3 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L + lda trackn_audc+2 + and #$10 + bne qq4a + EIF + lda #0 + sta trackn_audc+2 +qq4a + txa + ora #$28 + tax + EIF + EIF +qq5 + stx v_audctl + IFT TRACKS>4 + IFT FEAT_AUDCTLMANUALSET + lda trackn_audctl+4 + ora trackn_audctl+5 + ora trackn_audctl+6 + ora trackn_audctl+7 + tax + ELS + ldx #0 + EIF + stx v_audctl2 + IFT FEAT_FILTER + IFT FEAT_FILTERG0R + lda trackn_command+0+4 + bpl qs2 + lda trackn_audc+0+4 + and #$0f + beq qs2 + lda trackn_audf+0+4 + clc + adc trackn_filter+0+4 + sta trackn_audf+2+4 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R + lda trackn_audc+2+4 + and #$10 + bne qs1a + EIF + lda #0 + sta trackn_audc+2+4 +qs1a + txa + ora #4 + tax + EIF +qs2 + IFT FEAT_FILTERG1R + lda trackn_command+1+4 + bpl qs3 + lda trackn_audc+1+4 + and #$0f + beq qs3 + lda trackn_audf+1+4 + clc + adc trackn_filter+1+4 + sta trackn_audf+3+4 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3R + lda trackn_audc+3+4 + and #$10 + bne qs2a + EIF + lda #0 + sta trackn_audc+3+4 +qs2a + txa + ora #2 + tax + EIF +qs3 + IFT FEAT_FILTERG0R||FEAT_FILTERG1R + cpx v_audctl2 + bne qs5 + EIF + EIF + IFT FEAT_BASS16 + IFT FEAT_BASS16G1R + lda trackn_command+1+4 + and #$0e + cmp #6 + bne qs4 + lda trackn_audc+1+4 + and #$0f + beq qs4 + ldy trackn_outnote+1+4 + lda frqtabbasslo,y + sta trackn_audf+0+4 + lda frqtabbasshi,y + sta trackn_audf+1+4 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0R + lda trackn_audc+0+4 + and #$10 + bne qs3a + EIF + lda #0 + sta trackn_audc+0+4 +qs3a + txa + ora #$50 + tax + EIF +qs4 + IFT FEAT_BASS16G3R + lda trackn_command+3+4 + and #$0e + cmp #6 + bne qs5 + lda trackn_audc+3+4 + and #$0f + beq qs5 + ldy trackn_outnote+3+4 + lda frqtabbasslo,y + sta trackn_audf+2+4 + lda frqtabbasshi,y + sta trackn_audf+3+4 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R + lda trackn_audc+2+4 + and #$10 + bne qs4a + EIF + lda #0 + sta trackn_audc+2+4 +qs4a + txa + ora #$28 + tax + EIF + EIF +qs5 + stx v_audctl2 + EIF +rmt_p5 + IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 + lda #$ff +v_ainstrspeed equ *-1 + ELS + lda #1 + EIF + rts +SetPokey + IFT STEREOMODE==1 ;* L1 L2 L3 L4 R1 R2 R3 R4 + ldy #$ff +v_audctl2 equ *-1 + lda trackn_audf+0+4 + ldx trackn_audf+0 +xstastx01 sta $d210 + stx $d200 + lda trackn_audc+0+4 + ldx trackn_audc+0 +xstastx02 sta $d211 + stx $d201 + lda trackn_audf+1+4 + ldx trackn_audf+1 +xstastx03 sta $d212 + stx $d202 + lda trackn_audc+1+4 + ldx trackn_audc+1 +xstastx04 sta $d213 + stx $d203 + lda trackn_audf+2+4 + ldx trackn_audf+2 +xstastx05 sta $d214 + stx $d204 + lda trackn_audc+2+4 + ldx trackn_audc+2 +xstastx06 sta $d215 + stx $d205 + lda trackn_audf+3+4 + ldx trackn_audf+3 +xstastx07 sta $d216 + stx $d206 + lda trackn_audc+3+4 + ldx trackn_audc+3 +xstastx08 sta $d217 + stx $d207 + lda #$ff +v_audctl equ *-1 +xstysta01 sty $d218 + sta $d208 + ELI STEREOMODE==0 ;* L1 L2 L3 L4 + ldy #$ff +v_audctl equ *-1 + lda trackn_audf+0 + ldx trackn_audc+0 + sta $d200 + stx $d201 + lda trackn_audf+1 + ldx trackn_audc+1 + sta $d200+2 + stx $d201+2 + lda trackn_audf+2 + ldx trackn_audc+2 + sta $d200+4 + stx $d201+4 + lda trackn_audf+3 + ldx trackn_audc+3 + sta $d200+6 + stx $d201+6 + sty $d208 + ELI STEREOMODE==2 ;* L1 R2 R3 L4 + ldy #$ff +v_audctl equ *-1 + lda trackn_audf+0 + ldx trackn_audc+0 + sta $d200 + stx $d201 + sta $d210 + lda trackn_audf+1 + ldx trackn_audc+1 + sta $d210+2 + stx $d211+2 + lda trackn_audf+2 + ldx trackn_audc+2 + sta $d210+4 + stx $d211+4 + sta $d200+4 + lda trackn_audf+3 + ldx trackn_audc+3 + sta $d200+6 + stx $d201+6 + sta $d210+6 + sty $d218 + sty $d208 + ELI STEREOMODE==3 ;* L1 L2 R3 R4 + ldy #$ff +v_audctl equ *-1 + lda trackn_audf+0 + ldx trackn_audc+0 + sta $d200 + stx $d201 + lda trackn_audf+1 + ldx trackn_audc+1 + sta $d200+2 + stx $d201+2 + lda trackn_audf+2 + ldx trackn_audc+2 + sta $d210+4 + stx $d211+4 + sta $d200+4 + lda trackn_audf+3 + ldx trackn_audc+3 + sta $d210+6 + stx $d211+6 + sta $d200+6 + sty $d218 + sty $d208 + EIF + rts +RMTPLAYEREND diff --git a/artwork/sfx/scorch_trial07_stripped.rmt b/artwork/sfx/scorch_trial07_stripped.rmt new file mode 100644 index 0000000000000000000000000000000000000000..9bef4ce437e31a845ed1f0c878d4c2b91424af45 GIT binary patch literal 1277 zcmbW0zi--55XZm%0hp(Qnt&7rDv(PP3ItG1qbQ09gV!o*RVz}LN*!1-bwVA(Qq;8* zn*mS#3p&!Z|3imLsWNu!(4q9~hYe9-$Q1kwAE!6dy;*nmWp*}yKVQrr`_KFj{x|>o5B&6f_(b_U zR--f_I20^0R47E=q%p`gt!$ImMCEeeR9DwW8FKGFG$y34bG8$nbmt)lT@7$)RYoFo@|E7a*kub~@c7K)`xwN`JoI#0XD zCnsxhvC1%GUv6SmCw|AqWRUSpv^h7dc zq=RD;B5kCS30+h9+*M6ew%lV@yh+@%*kIjk6J^4itKbFT7`(o?02fv82lRP_@d(2a z1|zsTa7M82VvWG$LZEWSez*w*Ra6IA{EwAIE(O6Omo!-AZG;s_M+T7 WUp(ra_xek1x%`V;9|}L!U;aNO`JdJR literal 0 HcmV?d00001 diff --git a/definitions.asm b/definitions.asm index 2049a3e..9adf387 100644 --- a/definitions.asm +++ b/definitions.asm @@ -75,3 +75,29 @@ price_Auto_Defense___ = 0 ;_60 price_Fuel_Tank______ = 0 ;_61 price_Contact_Trigger = 0 ;_62 price______________63 = 0 +;-------------------------------- +; names of RMT instruments (sfx) +;-------------------------------- +sfx_set_power_1 = $00 +sfx_set_power_2 = $01 +sfx_lightning = $02 +sfx_dunno = $03 +sfx_nuke = $04 +sfx_hit = $05 +sfx_death_beg = $06 +sfx_plasma_1_2 = $07 +sfx_plasma_2_2 = $08 +sfx_napalm = $09 +sfx_dirt_charge = $0a +sfx_missile_hit = $0b +sfx_funky_hit = $0c +sfx_shield_on = $0d +sfx_shield_off = $0e +sfx_parachute = $0f +sfx_smoke_cloud = $10 +sfx_riot_blast = $11 +sfx_sandhog = $12 +sfx_dirt_char_s = $13 +sfx_digger = $14 +sfx_key = $15 + diff --git a/display.asm b/display.asm index b3c9515..93ab9b3 100755 --- a/display.asm +++ b/display.asm @@ -120,7 +120,7 @@ NameAdr dta d" Human/Atari (difficulty level) " dta d" " NamesOfLevels - dta d" HUMAN Moron Shooter " + dta d" HUMAN Moron Shooter " dta d" Poolshark Toosser Chooser " dta d" Spoiler Cyborg Unknown " dta d" " @@ -165,10 +165,10 @@ LastLine textbuffer ; 0123456789012345678901234567890123456789 dta d"Player: " - dta d"Energy: 99 Angle: <32> Force: 1000 " - dta d" Round: 50 Wind: <22> " + dta d"Energy: 99 Angle: <99> Force: 9999 " + dta d" Round: 99 Wind: <99> " textbuffer2 - dta d"Player: ******** Cash: 00000 " + dta d"Player: ******** Cash: 99999 " dta d"----------------------------------------" diff --git a/scorch.asm b/scorch.asm index 105baa4..a928aee 100644 --- a/scorch.asm +++ b/scorch.asm @@ -40,44 +40,59 @@ .endm icl 'definitions.asm' + icl 'artwork/sfx/rmt_feat.asm' - .zpvar xdraw .word = $80 ;variable X for plot - .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) - .zpvar xbyte .word - - .zpvar ybyte .word - .zpvar CharCode .byte - .zpvar fontind .word - .zpvar tanknr .byte + .zpvar xdraw .word = $80 ;variable X for plot + .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) + .zpvar xbyte .word + .zpvar ybyte .word + .zpvar CharCode .byte + .zpvar fontind .word + .zpvar tanknr .byte .zpvar TankSequencePointer .byte - .zpvar oldplot .word - .zpvar xc .word - .zpvar temp .word ;temporary word for the most embeded loops only - .zpvar temp2 .word ;same as above - .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 oldplot .word + .zpvar xc .word + .zpvar temp .word ;temporary word for the most embeded loops only + .zpvar temp2 .word ;same as above + .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 ;--------------temps used in circle routine - .zpvar xi .word ;X (word) in draw routine - .zpvar fx .byte ;circle drawing variables - .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 xi .word ;X (word) in draw routine + .zpvar fx .byte ;circle drawing variables + .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 + ;* RMT ZeroPage addresses + .zpvar p_tis .word + .zpvar p_trackslbstable .word + .zpvar p_trackshbstable .word + .zpvar p_song .word + .zpvar ns .word + .zpvar nr .word + .zpvar nt .word + .zpvar reg1 .byte + .zpvar reg2 .byte + .zpvar reg3 .byte + .zpvar tmp .byte + IFT FEAT_COMMAND2 + .zpvar frqaddcmd2 .byte + EIF + p_instrstable = p_tis -displayposition = modify + displayposition = modify ;------------------------------- icl 'lib/atari.hea' @@ -101,6 +116,7 @@ START ; Startup sequence jsr Initialize + VMAIN VBLinterrupt,6 ; jsr SetVBL mwa #OptionsDL dlptrs lda dmactls @@ -135,7 +151,6 @@ START ; for the round #1 shooting sequence is random MainGameLoop - VMAIN VBLinterrupt,6 ; jsr SetVBL VDLI DLIinterrupt ; jsr SetDLI jsr CallPurchaseForEveryTank @@ -574,6 +589,9 @@ PlayerXdeath .proc inc CurrentResult .endp + + mva #sfx_death_beg sfx_effect + ;RandomizeDeffensiveText randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) sta TextNumberOff @@ -589,6 +607,7 @@ PlayerXdeath .proc jsr DisplayOffensiveTextNr + ; calculate position of the explosion (the post-death one) ldx TankTempY clc @@ -625,8 +644,10 @@ MetodOfDeath bcs MetodOfDeath tay lda weaponsOfDeath,y - jsr ExplosionDirect + jsr ExplosionDirect + mva #$15 sfx_effect + ; jump to after explosion routines (soil fallout, etc.) ; After going through these routines we are back ; to checking if a tank exploded and maybe we have @@ -816,6 +837,19 @@ ClearResults mva #1 CurrentRoundNr ;we start from round 1 + ; RMT INIT + lda #$f0 ;initial value + sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) +; + lda #$ff ;initial value + sta sfx_effect +; + ldx #MODUL ;hi byte of RMT module to Y reg + lda #0 ;starting song line 0-255 to A reg + jsr RASTERMUSICTRACKER ;Init +; + rts .endp @@ -835,7 +869,26 @@ DLIinterrupt .proc VBLinterrupt .proc pha + phx + phy mva #0 dliCounter + + lda sfx_effect + bmi lab2 + asl @ ; * 2 + tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126) + ldx #0 ;X = 0 channel (0..3 or 0..7 for stereo module) + 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 + + ply + plx pla jmp SYSVBV .endp @@ -1084,7 +1137,8 @@ getkey .proc; waits for pressing a key and returns pressed value in A lda SKSTAT cmp #$ff beq checkJoyGetKey ; key not pressed, check Joy - + + mva #sfx_key sfx_effect lda kbcode and #$3f ;CTRL and SHIFT ellimination rts @@ -1151,7 +1205,19 @@ TankFont ;---------------------------------------------- icl 'variables.asm' ;---------------------------------------------- +; reserved space for RMT player + .ds $0320 + .align $100 + .ECHO 'PLAYER: ',* + icl 'artwork/sfx/rmtplayr_game.asm' + opt h- ;RMT module is standard Atari binary file already + ins "artwork/sfx/scorch_trial07_stripped.rmt" ;include music RMT module + opt h+ +; +; +MODUL equ $a000 ;address of RMT module TheEnd + .ECHO 'TheEnd:',TheEnd .if TheEnd > PMGraph + $300 .error memory conflict diff --git a/scorch.xex b/scorch.xex index 403f6fc76893d437a1a7c3fab0e7c13a714789b9..4190c8c98e766fd934c5d8962bb2fe43d7a26319 100644 GIT binary patch delta 14915 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 IJU9LS03mN-K>z>% diff --git a/variables.asm b/variables.asm index 03b48fe..9216010 100755 --- a/variables.asm +++ b/variables.asm @@ -34,6 +34,8 @@ RoundNrDisplay variablesStart ; zeroing starts here ;-------------- +sfx_effect .ds 1 +;-------------- noDeathCounter .ds 1 ;-------------- OptionsY .ds 1 ;vertical position of cursor on Options screen diff --git a/weapons.asm b/weapons.asm index fd6658c..d998ea8 100755 --- a/weapons.asm +++ b/weapons.asm @@ -77,6 +77,7 @@ VOID .endp ; ------------------------ .proc babynuke + mva #sfx_nuke sfx_effect inc FallDown2 mva #25 ExplosionRadius jsr CalculateExplosionRange @@ -84,6 +85,7 @@ VOID .endp ; ------------------------ .proc nuke + mva #sfx_nuke sfx_effect inc FallDown2 mva #31 ExplosionRadius jsr CalculateExplosionRange @@ -91,6 +93,7 @@ VOID .endp ; ------------------------ .proc leapfrog + mva #sfx_funky_hit sfx_effect inc FallDown2 mva #17 ExplosionRadius jsr CalculateExplosionRange @@ -129,6 +132,7 @@ VOID beq EndOfLeapping mva #15 ExplosionRadius jsr CalculateExplosionRange0 + mva #sfx_funky_hit sfx_effect jsr xmissile ; soil must fall down now! there is no other way... @@ -157,6 +161,7 @@ VOID beq EndOfLeapping mva #13 ExplosionRadius jsr CalculateExplosionRange0 + mva #sfx_funky_hit sfx_effect jmp xmissile EndOfLeapping rts @@ -168,6 +173,7 @@ EndOfLeapping .endp ; ------------------------ .proc funkybomb ; + mva #sfx_funky_hit sfx_effect mwa xtraj+1 xtrajfb mwa ytraj+1 ytrajfb inc FallDown2 @@ -220,6 +226,7 @@ DoNotEor jsr CalculateExplosionRange lda HitFlag beq NoExplosionInFunkyBomb + mva #sfx_funky_hit sfx_effect jsr xmissile NoExplosionInFunkyBomb dec FunkyBombCounter @@ -232,12 +239,16 @@ NoExplosionInFunkyBomb inc FallDown2 mva #31 ExplosionRadius jsr CalculateExplosionRange + + mva #sfx_nuke sfx_effect jsr xmissile sbw xdraw #35 jsr CalculateExplosionRange + mva #sfx_nuke sfx_effect jsr xmissile adw xdraw #70 jsr CalculateExplosionRange + mva #sfx_nuke sfx_effect jsr xmissile sbw xdraw #35 ; @@ -245,12 +256,14 @@ NoExplosionInFunkyBomb ;jsr CalculateExplosionRange cpw ydraw #screenHeight bcs NoUpperCircle + mva #sfx_nuke sfx_effect jsr xmissile NoUpperCircle adb ydraw #70 ;jsr CalculateExplosionRange cpw ydraw #screenHeight bcs NoLowerCircle + mva #sfx_nuke sfx_effect jsr xmissile NoLowerCircle rts @@ -317,6 +330,7 @@ NoLowerCircle .endp ; ------------------------ .proc xdigger + mva #sfx_digger sfx_effect mwa xdraw digstartx mwa ydraw digstarty ldx diggery @@ -431,6 +445,7 @@ DiggerCharacter .endp ; ------------------------ .proc babysandhog + mva #sfx_sandhog sfx_effect mva #8 sandhogflag inc FallDown2 mva #13 DigLong @@ -439,6 +454,7 @@ DiggerCharacter .endp ; ------------------------ .proc sandhog + mva #sfx_sandhog sfx_effect mva #8 sandhogflag inc FallDown2 mva #13 DigLong @@ -447,6 +463,7 @@ DiggerCharacter .endp ; ------------------------ .proc heavysandhog + mva #sfx_sandhog sfx_effect mva #8 sandhogflag inc FallDown2 mva #13 DigLong @@ -490,6 +507,7 @@ DiggerCharacter .endp ; ------------------------ .proc riotblast + mva #sfx_riot_blast sfx_effect inc FallDown2 mva #61 ExplosionRadius jsr CalculateExplosionRange @@ -808,6 +826,8 @@ DirectionChecked .proc ofdirt ; ; -------------------------------------------------- ; makes dirt on xdraw,ydraw position and of ExplosionRadius height + mva #sfx_dirt_char_s sfx_effect + mva #1 color NoColor ; jump here with color=0 to clean dirt mwa xdraw xcircle @@ -885,8 +905,7 @@ UpNotYet2 lda HowMuchToFall cmp #1 beq HowMuchToFallRight3 -.nowarn - dew xdraw +.NOWARN dew xdraw lda xdraw bne RollinContinuesLiquid lda xdraw+1 @@ -1021,6 +1040,9 @@ pressedUp bne CheckingMaxForce inc EnergyTableH,x CheckingMaxForce + + mva #sfx_set_power_2 sfx_effect + lda MaxEnergyTableH,x cmp EnergyTableH,x bne FurtherCheckMaxForce @@ -1048,6 +1070,8 @@ CTRLPressedUp pressedDown + mva #sfx_set_power_1 sfx_effect + ldx TankNr dec EnergyTableL,x lda EnergyTableL,x @@ -1063,6 +1087,8 @@ ForceGoesZero jmp BeforeFire CTRLPressedDown + mva #sfx_set_power_1 sfx_effect + ldx TankNr sec lda EnergyTableL,x