wwf-wrestlemania/SPECIAL.ASM

6003 lines
104 KiB
NASM
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

**************************************************************
*
* Software: Jamie Rivett
* Initiated: 5/18/94
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
**************************************************************
.file "special.asm"
.title "general special moves stuff"
.width 132
.option b,d,l,t
.mnolist
.include "macros.h"
.include "mproc.equ" ;Mproc equates
.include "display.equ" ;Display proc equates
.include "gsp.equ" ;Gsp asm equates
.include "sys.equ"
.include "game.equ"
.include "plyr.equ"
.include "anim.equ"
.include "audit.equ"
.include "sound.h"
.include "ring.equ"
.include "lifebar.h"
.include "miscimg.glo"
.include "special.equ"
.include "fontsimg.glo"
.include "bgndtbl.glo"
.include "imgtbl.glo"
.INCLUDE "SWEAT.EQU"
******************************************************************************
* EXTERNAL REFERENCES
.ref BAKMODS,message_palette,triple_sound,HALT,no_debris
.ref announce_rnd_winner,pal_set,octopus2,ZERO_BITS,pal_find
.ref RNDRNG0,CREATE_DISQUAL,pal_getf,GENERIC_DISPLAY,NUM_OPPS
.ref PCNT,RNDPER,print_string_C2,ROLLING_COUNT,RNDRNGS
.ref BGND_UD1,process_ptrs,mess_objid,setup_message,osgemd_ascii
.ref dufus_msg_on,reduce_bog
.ref ring_out_on
.ref _switch_addr
.ref match_cnt
******************************************************************************
* SYMBOLS DEFINED IN THIS FILE
SHOW_DAMAGE_POINTS equ 0
******************************************************************************
* VARIABLES
.bss impact_params ,32*8 * NUM_WRES ;
BSSX WHICH_SKIRT_PAL,16
BSSX plyr1_objlist, 32 ;collideable objects on P1's side
BSSX plyr2_objlist, 32 ; P2's side
BSSX neutral_objlist,32 ;neutral collideable
BSSX debris_count, 16 ;active debris processes
******************************************************************************
* EQUATES FOR THIS FILE
STRUCTPD
LONG ANIM
LONG XVAL
LONG YVAL
WORD ZVAL
LONG XVEL
LONG YVEL
WORD FLAGS
LONG PROC
LONG PALLET
LONG STAR_TBL
#*****************************************************************************
*
* a10=index into offsets table
SUBR create_dizzy_proc
move *a13(STARS_FLAG),a0
jrnz #x
CREATE0 dizzy_proc
move a0,a9
move a13,*a9(PROC),L
movk 1,a0
move a0,*a13(STARS_FLAG)
move *a13(WRESTLERNUM),a8
X128 a8
addi #dizzy_offsets,a8
X32 a10
add a10,a8
move *a8+,a1 ;x offset
move *a13(OBJ_XPOSINT),a0
move *a13(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
neg a1
#no_flip
add a1,a0
sll 16,a0
move a0,*a9(XVAL),L
movi Y_SCALE_MULTIPLIER,a0
move *a13(OBJ_ZPOSINT),a1
mpyu a0,a1
move *a13(OBJ_YPOSINT),a0
move *a8,a14 ;y offset
add a14,a0
sll 16,a0
sub a0,a1
move a1,*a9(YVAL),L
; move *a13(OBJ_PRIORITY),a0
move *a13(OBJ_ZPOSINT),a0
ori 1000h,a0
;The stars for laying on ground guy, appear in front of other guy also!
;No easy solution for this problem...
inc a0
move a0,*a9(ZVAL)
#x
rets
; stand, lying
#dizzy_offsets
; stand, on stomach, on back,?,?
.word 6,6dh, 0,0, 0,0, 0,0 ;0 Bret Hart
.word 2,73h, 0,0, 0,0, 0,0 ;1 Razor Ramon
.word 19h,74h, 0,0, 0,0, 0,0 ;2 Undertaker
.word 10,6dh, 0,0, 0,0, 0,0 ;3 Yokozuna
.word -5,6bh, 0,0, 0,0, 0,0 ;4 Shawn Michaels
.word 5,116, 0,0, 0,0, 0,0 ;5 Bam Bam
.word 7,116, 2eh,30h, 30h,20h, 0,0 ;6 Doink
.word 7,116, 0,0, 0,0, 0,0 ;7 Spare
.word 7,116, 0,0, 0,0, 0,0 ;8 Lex Luger
.word 7,116, 0,0, 0,0, 0,0 ;9 Referee
#*****************************************************************************
SUBRP dizzy_proc
move *a13(PROC),a0,L
move *a0(WRESTLERNUM),a0
X32 a0
addi #star_art,a0
move *a0,a10,L
move a10,*a13(STAR_TBL),L
move *a10+,a11 ;tick count
move *a10+,a2,L ;* image
move *a13(XVAL),a0,L ;x val
move *a13(YVAL),a1,L ;y val
move *a13(ZVAL),a3 ;z val
movi DMAWNZ|M_3D,a4 ;DMA flags
clr a5 ;OID
clr a6 ;x vel
clr a7 ;y vel
calla BEGINOBJ
move *a13(PROC),a9,L
#loop
SLEEPK 1
move *a9(STARS_FLAG),a0
jrz #die
;If stars are on for grounded opponent, swap ZPOS based on nearest opponent
move *a9(PLYRMODE),a0
cmpi MODE_ONGROUND,a0
jrnz #nock
move *a9(NEW_FACING_DIR),a0
btst MOVE_UP_BIT,a0
jrnz #front
;Stars should be lower Z than wrestlers
move *a13(ZVAL),a0 ;z val
subk 1,a0
move a0,*a8(OZPOS)
jruc #nock
#front
;Stars should be higher Z than wrestlers
move *a13(ZVAL),a0 ;z val
addk 1,a0
move a0,*a8(OZPOS)
#nock
dsj a11,#loop
#cnt
move *a10+,a11
jrnz #ok
; movi #dizzy_anim,a10 ;repeat
move *a13(STAR_TBL),a10,L
jruc #cnt
#ok
move *a10+,a0,L
callr change_image_local
jruc #loop
#die
calla DELOBJA8
DIE
#star_art
.long #hdizzy_anim ;0 Bret Hart
.long #rdizzy_anim ;1 Razor Ramon
.long #udizzy_anim ;2 Undertaker
.long #ydizzy_anim ;3 Yokozuna
.long #sdizzy_anim ;4 Shawn Michaels
.long #bdizzy_anim ;5 Bam Bam
.long #ddizzy_anim ;6 Doink
.long 0 ;7 spare
.long #ldizzy_anim ;8 Lex Luger
.long 0 ;9 Referee
#hdizzy_anim
WL 4,STARS01
WL 4,STARS02
WL 4,STARS03
WL 4,STARS04
WL 4,STARS05
WL 4,STARS06
.word 0
#rdizzy_anim
WL 5,RAZDIZ201
WL 5,RAZDIZ202
WL 5,RAZDIZ203
WL 5,RAZDIZ204
WL 5,RAZDIZ205
WL 5,RAZDIZ206
WL 5,RAZDIZ207
WL 5,RAZDIZ208
WL 5,RAZDIZ209
WL 5,RAZDIZ210
.word 0
#udizzy_anim
WL 5,UNDZ01
WL 5,UNDZ02
WL 5,UNDZ03
WL 5,UNDZ04
WL 5,UNDZ05
WL 5,UNDZ06
.word 0
#ydizzy_anim
WL 5,YKDZ01
WL 5,YKDZ02
WL 5,YKDZ03
WL 5,YKDZ04
WL 5,YKDZ05
WL 5,YKDZ06
WL 5,YKDZ07
WL 5,YKDZ08
WL 5,YKDZ09
.word 0
#sdizzy_anim
WL 4,SHNDIZ01
WL 4,SHNDIZ02
WL 4,SHNDIZ03
WL 4,SHNDIZ04
WL 4,SHNDIZ05
WL 4,SHNDIZ06
WL 4,SHNDIZ07
WL 4,SHNDIZ08
WL 4,SHNDIZ09
WL 4,SHNDIZ10
.word 0
#bdizzy_anim
WL 5,BMDZ01
WL 5,BMDZ02
WL 5,BMDZ03
WL 5,BMDZ04
WL 5,BMDZ05
WL 5,BMDZ06
.word 0
#ddizzy_anim
WL 4,STARS01
WL 4,STARS02
WL 4,STARS03
WL 4,STARS04
WL 4,STARS05
WL 4,STARS06
.word 0
#ldizzy_anim
WL 4,STARS01
WL 4,STARS02
WL 4,STARS03
WL 4,STARS04
WL 4,STARS05
WL 4,STARS06
.word 0
#*****************************************************************************
;For Bam fire head butt
;For Taker club to head
SUBR create_impact
;quit if no_debris is set
move @no_debris,a14
jrnz #rets
move @reduce_bog,a14
jrnz #rets
PUSH a1,a4,a7,a10,a11
move *a13(WHOIHIT),a10,L
move *a10(WRESTLERNUM),a0
sll 5,a0
addi #offset_t,a0
move *a0,a11,L
CREATE DEBRIS_PID,#explosions
CREATE DEBRIS_PID,#explosions2
PULL a1,a4,a7,a10,a11
#rets rets
#offset_t
.long [100,0] ;0 (Bret)
.long [108,0] ;1 (Razor)
.long [108,0] ;2 (Taker)
.long [105,0] ;3 (Yoko)
.long [80,0] ;4 (Shawn)
.long [105,0] ;5 (Bam Bam)
.long [96,0] ;6 (Doink)
.long [105,0] ;7 (spare)
.long [90,0] ;8 (Lex)
;For Bam fire super kick
;For Taker fire super kick
SUBR create_impact2
;quit if no_debris is set
move @no_debris,a14
jrnz #rets
move @reduce_bog,a14
jrnz #rets
PUSH a1,a4,a7,a10,a11
move *a13(WHOIHIT),a10,L
movi [38h,13h],a11
CREATE DEBRIS_PID,#explosions
CREATE DEBRIS_PID,#explosions2
PULL a1,a4,a7,a10,a11
rets
;For Taker explosion for pin
SUBR create_impact5
;quit if no_debris is set
move @no_debris,a14
jrnz #rets
move @reduce_bog,a14
jrnz #rets
PUSH a1,a4,a7,a10,a11
move *a13(WHOIHIT),a10,L
movi [10,1h],a11
CREATE DEBRIS_PID,#explosions
CREATE DEBRIS_PID,#explosions2
CREATE DEBRIS_PID,#explosions2
PULL a1,a4,a7,a10,a11
rets
;For Bam fire punches to head
SUBR create_impact3
;quit if no_debris is set
move @no_debris,a14
jrnz #rets
move @reduce_bog,a14
jrnz #rets
PUSH a1,a4,a7,a10,a11
move *a13(WHOIHIT),a10,L
movi [58h,0],a11
CREATE DEBRIS_PID,#explosions
PULL a1,a4,a7,a10,a11
rets
;For Yoko salt to face
SUBR create_impact_salt
PUSH a1,a4,a7,a10,a11
move a13,a10
movi [38h,0],a11
CREATE DEBRIS_PID,explosions_salt
PULL a1,a4,a7,a10,a11
rets
;For Taker uppercut
SUBR create_impact4
;quit if no_debris is set
move @no_debris,a14
jrnz #rets
move @reduce_bog,a14
jrnz #rets
PUSH a1,a4,a7,a10,a11
move *a13(WHOIHIT),a10,L
movi [58h,0],a11
CREATE DEBRIS_PID,#head_fountain
;Don't allow other debris to come out and bog us down!
movk 1,a0
move a0,@no_debris
PULL a1,a4,a7,a10,a11
rets
;For Bam flying kick to face
SUBR create_impact_flykick
;quit if no_debris is set
move @no_debris,a14
jrnz #rets
move @reduce_bog,a14
jrnz #rets
PUSH a1,a4,a7,a10,a11
move *a13(WHOIHIT),a10,L
movi [58h,0],a11
CREATE DEBRIS_PID,#head_fountain_kick
;Don't allow other debris to come out and bog us down!
movk 1,a0
move a0,@no_debris
PULL a1,a4,a7,a10,a11
rets
#head_fountain_kick
;For Taker uppercut fountain
move *a10(DEBRIS_X),a1
jrnz #cont_k
clr a0 ;okay, a0 IS always zero after a wakeup,
move a0,@no_debris ; but it's bad karma to count on it.
DIE
#cont_k
CREATE DEBRIS_PID,impact_proc2
move a0,a9
movi XPLODE_P,a0
move a0,*a9(PALLET),L
callr #stuff_it
SLEEPK 2
jruc #head_fountain_kick
#head_fountain
;For Taker uppercut fountain
move *a10(DEBRIS_X),a1
jrnz #cont
clr a0 ;okay, a0 IS always zero after a wakeup,
move a0,@no_debris ; but it's bad karma to count on it.
DIE
#cont
CREATE DEBRIS_PID,impact_proc2
move a0,a9
movi BLUEEX_P,a0
move a0,*a9(PALLET),L
callr #stuff_it
SLEEPK 2
jruc #head_fountain
#stuff_it
movk 11,a0
calla RNDRNG0
sll 5,a0
addi #exp_tbl,a0
move *a0,a0,L
move a0,*a9(ANIM),L ;animation
movi DMAWNZ|M_3D,a4 ;DMA flags
move *a10(DEBRIS_X),a1
move *a10(OBJ_XPOSINT),a0
move *a10(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip2
neg a1
ori M_FLIPH,a4 ;flip image
#no_flip2
add a1,a0
sll 16,a0
move a0,*a9(XVAL),L
move a4,*a9(FLAGS) ;DMA flags
movi Y_SCALE_MULTIPLIER,a0
move *a10(OBJ_ZPOSINT),a3
mpyu a0,a3
move *a10(OBJ_YPOSINT),a0
move *A10(DEBRIS_Y),a14
add a14,a0
sll 16,a0
sub a0,a3
move a3,*a9(YVAL),L
move *a10(OBJ_ZPOSINT),a0
ori 1000h,a0
move *a10(INRING),a14
jrz #inring2
cmpi [015ach,0],a0
jrgt #inring2
subi [01e5h,0],a0 ;below mat
#inring2
move a0,a2
move @HCOUNT,a1
btst 0,a1
jrz #ok2
addi 5h,a2
#ok2
move a2,*a9(ZVAL)
movi 20000h,a0
calla RNDRNG0
subi 10000h,a0
move a0,*a9(XVEL),L
movi 20000h,a0
calla RNDRNG0
subi 10000h,a0
move a0,*a9(YVEL),L
rets
;For Yoko salt bucket
SUBR create_bucket_salt
;quit if no_debris is set
move @no_debris,a14
jrnz #rets
move @reduce_bog,a14
jrnz #rets
PUSH a1,a4,a7,a10,a11
; move *a13(WHOIHIT),a10,L
; movi [58h,0],a11
move a13,a10
CREATE DEBRIS_PID,#salt_from_bucket
;Don't allow other debris to come out and bog us down!
; movk 1,a0
; move a0,@no_debris
PULL a1,a4,a7,a10,a11
rets
#salt_from_bucket
;For Taker uppercut fountain
move *a10(DEBRIS_X),a1
jrnz #conts
move a1,@no_debris
DIE
#conts
CREATE DEBRIS_PID,impact_proc2
move a0,a9
movk 3,a0
calla RNDRNG0
sll 5,a0
addi #salt_exp_tbl,a0
move *a0,a0,L
move a0,*a9(ANIM),L ;animation
movi SALTTR_P,a0
move a0,*a9(PALLET),L
movi DMAWNZ|M_3D,a4 ;DMA flags
move *a10(DEBRIS_X),a1
move *a10(OBJ_XPOSINT),a0
move *a10(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip2s
neg a1
ori M_FLIPH,a4 ;flip image
#no_flip2s
add a1,a0
sll 16,a0
move a0,*a9(XVAL),L
move a4,*a9(FLAGS) ;DMA flags
movi Y_SCALE_MULTIPLIER,a0
move *a10(OBJ_ZPOSINT),a3
mpyu a0,a3
move *a10(OBJ_YPOSINT),a0
move *A10(DEBRIS_Y),a14
add a14,a0
sll 16,a0
sub a0,a3
move a3,*a9(YVAL),L
move *a10(OBJ_ZPOSINT),a0
ori 1000h,a0
move *a10(INRING),a14
jrz #inring2s
cmpi [015ach,0],a0
jrgt #inring2s
subi [01e5h,0],a0 ;below mat
#inring2s
move a0,a2
move @HCOUNT,a1
btst 0,a1
jrz #ok2s
addi 5h,a2
#ok2s
move a2,*a9(ZVAL)
movi 20000h,a0
calla RNDRNG0
subi 10000h,a0
move a0,*a9(XVEL),L
movi 20000h,a0
calla RNDRNG0
subi 10000h,a0
move a0,*a9(YVEL),L
SLEEPK 2
jruc #salt_from_bucket
*****************************************************************************
#explosions2
SLEEPK 1
#explosions
;if there's too much debris already, don't do anything.
move @debris_count,a14
cmpi DEBRIS_MAX,a14
jrge #die
;increment global debris count
move @debris_count,a14
inc a14
move a14,@debris_count
movx a11,a0
move a0,*a13(PDATA) ;x
movy a11,a0
srl 16,a0
move a0,*a13(PDATA+16) ;y
movk 4,a11
move *a10(WHOHITME),a0,L
MOVE *A0(COMBO_COUNT),A0
JRZ #lp
movk 1,a11
#lp
CREATE DEBRIS_PID,impact_proc
move a0,a9
movk 11,a0
calla RNDRNG0
sll 5,a0
addi #exp_tbl,a0
move *a0,a0,L
move a0,*a9(ANIM),L ;animation
move *a10(WHOHITME),a0,L
move *a0(WRESTLERNUM),a0
sll 5,a0
addi #pal_t,a0
move *a0,a0,L
move a0,*a9(PALLET),L
movi DMAWNZ|M_3D,a4 ;DMA flags
move *a13(PDATA),a1 ;x
move *a10(OBJ_XPOSINT),a0
move *a10(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
neg a1
ori M_FLIPH,a4 ;flip image
#no_flip
add a1,a0
move a0,a2
movi 30,a0
calla RNDRNG0
subi 15,a0
add a0,a2
sll 16,a2
move a2,*a9(XVAL),L
move a4,*a9(FLAGS) ;DMA flags
movi Y_SCALE_MULTIPLIER,a0
move *a10(OBJ_ZPOSINT),a3
mpyu a0,a3
move *a10(OBJ_YPOSINT),a0
move *a13(PDATA+16),a14 ;y
add a14,a0 ;<--- get from table
move a0,a2
movi 20,a0
calla RNDRNG0
subi 10,a0
add a0,a2
sll 16,a2
sub a2,a3
move a3,*a9(YVAL),L
; movi >2480,a0
move *a10(OBJ_ZPOSINT),a0
ori 1000h,a0
move *a10(INRING),a14
jrz #inring
cmpi [015ach,0],a0
jrgt #inring
subi [01e5h,0],a0 ;below mat
#inring
move a0,a2
move @HCOUNT,a1
btst 0,a1
jrz #ok
addi 5h,a2
#ok
move a2,*a9(ZVAL)
; movi 8000h,a0
; calla RNDRNG0
; subi 4000h,a0
;
; move *a10(OBJ_XVEL),a1,L
; add a1,a0
clr a0
move a0,*a9(XVEL),L
movi 10000h,a0
calla RNDRNG0
subi 8000h,a0
; move *a10(OBJ_YVEL),a1,L
; add a1,a0
clr a0
move a0,*a9(YVEL),L
SLEEPK 4
dsj a11,#lp
;decrement global debris count
move @debris_count,a14
dec a14
move a14,@debris_count
#die DIE
#pal_t .long XPLODE_P ;0 (Bret)
.long XPLODE_P ;1 (Razor)
.long BLUEEX_P ;2 (Taker)
.long XPLODE_P ;3 (Yoko)
.long XPLODE_P ;4 (Shawn)
.long XPLODE_P ;5 (Bam Bam)
.long XPLODE_P ;6 (Doink)
.long XPLODE_P ;7 spare
.long XPLODE_P ;8 (Lex)
****************************************************************************
* a11 = * impact parameters
SUBR impact_proc2
move a10,a9
callr begin_ani
#loop0
SLEEPK 1
JSRP special_ani
jruc #loop0
*****************************************************************************
* a11 = * impact parameters
SUBR impact_proc
move a10,a9
callr begin_ani
#loop
SLEEPK 1
move *a9(OBJ_XVEL),a0,L
move a0,*a8(OXVEL),L
JSRP special_ani
jruc #loop
;;;* A1=PID, A7=PC, A8,A9,A10,A11 Passed parameters
; movi sp_firehit_anim,a10
; callr begin_ani
;
; SLEEPK 1
; callr special_ani
;sp_d200_anim
;;Will be damage point value!
; WL 30,FIREHIT01
; .word 0
;
;
;sp_firehit_anim
; WL 4,FIREHIT01
; WL 4,FIREHIT02
; WL 4,FIREHIT03
; WL 4,FIREHIT04
; .word 0
#exp_tbl
.long #sp_explode_a1_anim
.long #sp_explode_a2_anim
.long #sp_explode_a3_anim
.long #sp_explode_a4_anim
.long #sp_explode_b1_anim
.long #sp_explode_b2_anim
.long #sp_explode_b3_anim
.long #sp_explode_b4_anim
.long #sp_explode_c1_anim
.long #sp_explode_c2_anim
.long #sp_explode_c3_anim
.long #sp_explode_c4_anim
#salt_exp_tbl
.long #sp_salt_exp1_anim
.long #sp_salt_exp2_anim
.long #sp_salt_exp3_anim
.long #sp_salt_exp4_anim
#sp_salt_exp1_anim
WL 4,SALTA01
WL 4,SALTA02
WL 4,SALTA03
WL 4,SALTA04
WL 4,SALTA05
WL 4,SALTA06
WL 4,SALTA07
WL 4,SALTA08
WL 4,SALTA09
WL 4,SALTA10
.word 0
#sp_salt_exp2_anim
WL 4,SALTB01
WL 4,SALTB02
WL 4,SALTB03
WL 4,SALTB04
WL 4,SALTB05
WL 4,SALTB06
WL 4,SALTB07
WL 4,SALTB08
WL 4,SALTB09
WL 4,SALTB10
WL 4,SALTB11
.word 0
#sp_salt_exp3_anim
WL 3,SALTA01
WL 3,SALTA02
WL 3,SALTA03
WL 3,SALTA04
WL 3,SALTA05
WL 3,SALTA06
WL 3,SALTA07
WL 3,SALTA08
WL 3,SALTA09
WL 3,SALTA10
.word 0
#sp_salt_exp4_anim
WL 3,SALTB01
WL 3,SALTB02
WL 3,SALTB03
WL 3,SALTB04
WL 3,SALTB05
WL 3,SALTB06
WL 3,SALTB07
WL 3,SALTB08
WL 3,SALTB09
WL 3,SALTB10
WL 3,SALTB11
.word 0
#sp_explode_a1_anim
WL 4,XPLODA01
WL 4,XPLODA03
WL 4,XPLODA04
WL 4,XPLODA05
WL 4,XPLODA06
WL 4,XPLODA07
WL 4,XPLODA08
WL 4,XPLODA09
WL 4,XPLODA10
.word 0
#sp_explode_a2_anim
WL 2,XPLODA01
WL 2,XPLODA03
WL 2,XPLODA04
WL 2,XPLODA05
WL 2,XPLODA06
WL 2,XPLODA07
WL 2,XPLODA08
WL 2,XPLODA09
WL 2,XPLODA10
.word 0
#sp_explode_a3_anim
#sp_explode_a4_anim
WL 3,XPLODA01
WL 3,XPLODA03
WL 3,XPLODA04
WL 3,XPLODA05
WL 3,XPLODA06
WL 3,XPLODA07
WL 3,XPLODA08
WL 3,XPLODA09
WL 3,XPLODA10
.word 0
#sp_explode_b1_anim
WL 4,XPLODB01
WL 4,XPLODB03
WL 4,XPLODB04
WL 4,XPLODB05
WL 4,XPLODB06
WL 4,XPLODB07
WL 4,XPLODB08
WL 4,XPLODB09
WL 4,XPLODB10
.word 0
#sp_explode_b2_anim
WL 2,XPLODB01
WL 2,XPLODB03
WL 2,XPLODB04
WL 2,XPLODB05
WL 2,XPLODB06
WL 2,XPLODB07
WL 2,XPLODB08
WL 2,XPLODB09
WL 2,XPLODB10
.word 0
#sp_explode_b3_anim
#sp_explode_b4_anim
WL 3,XPLODB01
WL 3,XPLODB03
WL 3,XPLODB04
WL 3,XPLODB05
WL 3,XPLODB06
WL 3,XPLODB07
WL 3,XPLODB08
WL 3,XPLODB09
WL 3,XPLODB10
.word 0
#sp_explode_c1_anim
WL 4,XPLODC01
WL 4,XPLODC03
WL 4,XPLODC04
WL 4,XPLODC05
WL 4,XPLODC06
WL 4,XPLODC07
WL 4,XPLODC08
WL 4,XPLODC09
WL 4,XPLODC10
.word 0
#sp_explode_c2_anim
WL 2,XPLODC01
WL 2,XPLODC03
WL 2,XPLODC04
WL 2,XPLODC05
WL 2,XPLODC06
WL 2,XPLODC07
WL 2,XPLODC08
WL 2,XPLODC09
WL 2,XPLODC10
.word 0
#sp_explode_c3_anim
#sp_explode_c4_anim
WL 3,XPLODC01
WL 3,XPLODC03
WL 3,XPLODC04
WL 3,XPLODC05
WL 3,XPLODC06
WL 3,XPLODC07
WL 3,XPLODC08
WL 3,XPLODC09
WL 3,XPLODC10
.word 0
#*****************************************************************************
explosions_salt
SLEEPK 5
movx a11,a0
move a0,*a13(PDATA) ;x
movy a11,a0
srl 16,a0
move a0,*a13(PDATA+16) ;y
movk 6,a11
#lp
CREATE DEBRIS_PID,impact_proc
move a0,a9
movk 3,a0
calla RNDRNG0
sll 5,a0
addi #salt_exp_tbl,a0
move *a0,a0,L
move a0,*a9(ANIM),L ;animation
movi SMOKE_P,a0
move a0,*a9(PALLET),L
movi DMAWNZ|M_3D,a4 ;DMA flags
move *a13(PDATA),a1 ;x
move *a10(OBJ_XPOSINT),a0
move *a10(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
neg a1
ori M_FLIPH,a4 ;flip image
#no_flip
add a1,a0
move a0,a2
movi 30,a0
calla RNDRNG0
subi 15,a0
add a0,a2
sll 16,a2
move a2,*a9(XVAL),L
move a4,*a9(FLAGS) ;DMA flags
movi Y_SCALE_MULTIPLIER,a0
move *a10(OBJ_ZPOSINT),a3
mpyu a0,a3
move *a10(OBJ_YPOSINT),a0
move *a13(PDATA+16),a14 ;y
add a14,a0 ;<--- get from table
move a0,a2
movi 20,a0
calla RNDRNG0
subi 10,a0
add a0,a2
sll 16,a2
sub a2,a3
move a3,*a9(YVAL),L
; movi >2480,a0
move *a10(OBJ_ZPOSINT),a0
ori 1000h,a0
move *a10(INRING),a14
jrz #inring
cmpi [015ach,0],a0
jrgt #inring
subi [01e5h,0],a0 ;below mat
#inring
move a0,a2
move @HCOUNT,a1
btst 0,a1
jrz #ok
addi 5h,a2
#ok
move a2,*a9(ZVAL)
; movi 8000h,a0
; calla RNDRNG0
; subi 4000h,a0
;
; move *a10(OBJ_XVEL),a1,L
; add a1,a0
clr a0
move a0,*a9(XVEL),L
movi 10000h,a0
calla RNDRNG0
subi 8000h,a0
; move *a10(OBJ_YVEL),a1,L
; add a1,a0
clr a0
move a0,*a9(YVEL),L
SLEEPK 3
dsj a11,#lp
DIE
#salt_exp_tbl
.long #salt_exp1_anim
.long #salt_exp2_anim
.long #salt_exp1_anim
.long #salt_exp2_anim
#salt_exp1_anim
WL 4,SMOKE01
WL 4,SMOKE03
WL 4,SMOKE04
WL 4,SMOKE05
WL 4,SMOKE06
WL 4,SMOKE07
WL 4,SMOKE08
WL 4,SMOKE09
WL 4,SMOKE10
.word 0
#salt_exp2_anim
WL 4,SMOKEB01
WL 4,SMOKEB03
WL 4,SMOKEB04
WL 4,SMOKEB05
WL 4,SMOKEB06
WL 4,SMOKEB07
WL 4,SMOKEB08
WL 4,SMOKEB09
WL 4,SMOKEB10
.word 0
#*****************************************************************************
SUBRP begin_ani
move *a13(ANIM),a10,L ;* animation
move *a13(PALLET),a0,L ;Obj pal
move a0,b0
move *a13(XVAL),a0,L ;x val
move *a13(YVAL),a1,L ;y val
move *a13(ZVAL),a3 ;z val
move *a13(FLAGS),a4 ;DMA flags
clr a5 ;OID
move *a13(XVEL),a6,L ;x vel
move *a13(YVEL),a7,L ;y vel
move *a10+,a11 ;tick count
move *a10+,a2,L ;* image
calla BEGINOBJP
rets
#*****************************************************************************
SUBRP special_ani
dec a11
jrnz #cont
move *a10+,a11 ;tick count
jrz #die
move *a10+,a0,L ;* image
move a0,*a8(OIMG),L
move *a0(0),*a8(OSIZE),L
move *a0(ISAG),*a8(OSAG),L
move *a0(IANIOFFX),a1
;;; add a10,a1 ;add in X ani-offset (if any)
move a1,*a8(ODXOFF) ;display x offset
move *a0(IANIOFFY),a1
;;; add a11,a1 ;add in Y pos & ani-offset
move a1,*a8(ODYOFF) ;display y offset
movb *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp
#cont
RETP
#die
calla DELOBJA8
DIE
#*****************************************************************************
* a0 = * image
* a8 = * object
SUBRP change_image_local
move a0,*a8(OIMG),L
move *a0(0),*a8(OSIZE),L
move *a0(ISAG),*a8(OSAG),L
move *a0(IANIOFFX),a1
move a1,*a8(ODXOFF) ;display x offset
move *a0(IANIOFFY),a1
move a1,*a8(ODYOFF) ;display y offset
movb *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp
rets
#*****************************************************************************
SUBR init_special_objlist
clr a0
move a0,@plyr1_objlist,L
move a0,@plyr2_objlist,L
move a0,@neutral_objlist,L
rets
#*****************************************************************************
;
; a0 = * process
insert_special_objlist
movi neutral_objlist,a1
move *a13(SP_PLYR_SIDE),a14 ;( p1=0, p2=1, neutral=-1 )
jrn #ok
movi plyr1_objlist,a1
move a14,a14
jrz #ok
movi plyr2_objlist,a1
#ok
move *a1(0),*a0(SP_NEXT),L ;update next link
move a0,*a1,L ;insert at head of list
rets
#*****************************************************************************
;
; a0 = * process
SUBR delete_special_objlist
movi neutral_objlist,a1 ;prev
move *a0(SP_PLYR_SIDE),a14 ;( p1=0, p2=1, neutral=-1 )
jrn #ok
movi plyr1_objlist,a1 ;prev
move a14,a14
jrz #ok
movi plyr2_objlist,a1 ;prev
#ok
move *a1,a2,L ;cur
jrz #empty
cmp a2,a0
jrne #no_match
move *a2(SP_NEXT),*a1(0),L ;unlink
rets
#no_match
move a2,a1 ;prev
move *a2(SP_NEXT),a2,L ;cur
jrz #empty
cmp a2,a0
jrne #no_match
move *a2(SP_NEXT),*a1(SP_NEXT),L ;unlink
rets
#empty
; .if DEBUG
; LOCKUP
; .endif
rets
#*****************************************************************************
SUBR doink_pie
move a11,*a13(SP_WRESPROC),L
move *a11(PLYR_SIDE),*a13(SP_PLYR_SIDE)
move a13,a0
callr insert_special_objlist ;insert into collis list
callr sp_create_obj
callr sp_create_shadow
move *a13(SP_OBJ),a8,L
movi [86,0],a1
movi [6,0],a2 ;x-vel
move *a11(OBJ_XPOS),a0,L
move *a11(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
move *a13(SP_OBJCONTROL),a14
ori M_FLIPH,a14
move a14,*a13(SP_OBJCONTROL)
neg a1
neg a2
#no_flip
add a1,a0
move a0,*a13(SP_OBJ_XPOS),L
move a2,*a13(SP_OBJ_XVEL),L
move *a11(OBJ_ZPOS),*a13(SP_OBJ_ZPOS),L
move *a11(OBJ_YPOS),a0,L
addi [97,0],a0
move a0,*a13(SP_OBJ_YPOS),L
move *a11(INRING),*a13(SP_INRING)
move *a11(GROUND_Y),a0
sll 16,a0
move a0,*a13(SP_GROUND_Y),L
clr a0
move a0,*a13(SP_GRAVITY),L
move a0,*a13(SP_OBJ_ZVEL),L
move a0,*a13(SP_OBJ_YVEL),L
move a0,*a13(SP_DIE)
movi pie_anim,a0
callr sp_change_anim
#lp
callr sp_velocity_add
callr sp_update_pos
SLEEPK 1
callr sp_animate
move *a13(SP_DIE),a0
jrnz #die
move @WORLDTLX+16,a0 ;world x int
addi 200,a0 ;center of screen
move *a13(SP_OBJ_XPOSINT),a1
sub a1,a0
abs a0
cmpi 256,a0 ;off screen by 56 pixels
jrlt #lp
move a13,a0
callr delete_special_objlist
#die
move *a13(SP_OBJ),a0,L
calla DELOBJ
move *a13(SP_SHADOW_OBJ),a0,L
calla DELOBJ
DIE
#*****************************************************************************
SUBR bam_fireball
move a11,*a13(SP_WRESPROC),L
move *a11(PLYR_SIDE),*a13(SP_PLYR_SIDE)
move a13,a0
callr insert_special_objlist ;insert into collis list
callr sp_create_obj
callr sp_create_shadow
move *a13(SP_OBJ),a8,L
movi [86,0],a1
movi [6,0],a2 ;x-vel
move *a11(OBJ_XPOS),a0,L
move *a11(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
move *a13(SP_OBJCONTROL),a14
ori M_FLIPH,a14
move a14,*a13(SP_OBJCONTROL)
neg a1
neg a2
#no_flip
add a1,a0
move a0,*a13(SP_OBJ_XPOS),L
move a2,*a13(SP_OBJ_XVEL),L
move *a11(OBJ_ZPOS),*a13(SP_OBJ_ZPOS),L
move *a11(OBJ_YPOS),a0,L
addi [97,0],a0
move a0,*a13(SP_OBJ_YPOS),L
move *a11(INRING),*a13(SP_INRING)
move *a11(GROUND_Y),a0
sll 16,a0
move a0,*a13(SP_GROUND_Y),L
clr a0
move a0,*a13(SP_GRAVITY),L
move a0,*a13(SP_OBJ_ZVEL),L
move a0,*a13(SP_OBJ_YVEL),L
move a0,*a13(SP_DIE)
movi fireball_anim,a0
callr sp_change_anim
#lp
callr sp_velocity_add
callr sp_update_pos
SLEEPK 1
callr sp_animate
move *a13(SP_DIE),a0
jrnz #die
move @WORLDTLX+16,a0 ;world x int
addi 200,a0 ;center of screen
move *a13(SP_OBJ_XPOSINT),a1
sub a1,a0
abs a0
cmpi 256,a0 ;off screen by 56 pixels
jrlt #lp
move a13,a0
callr delete_special_objlist
#die
move *a13(SP_OBJ),a0,L
calla DELOBJ
move *a13(SP_SHADOW_OBJ),a0,L
calla DELOBJ
DIE
#*****************************************************************************
SUBR und_spirit_pull
;Old spirits
clr a0
jruc #cont
SUBR und_spirit_push
;New reaper
movk 1,a0
#cont move a0,*a13(SP_ID)
move a11,*a13(SP_WRESPROC),L
move *a11(PLYR_SIDE),*a13(SP_PLYR_SIDE)
move a13,a0
callr insert_special_objlist ;insert into collis list
callr sp_create_obj
move *a13(SP_OBJ),a8,L
move *a13(SP_ID),a14
jrnz #reap
;Old spirit
movi [32,0],a1
movi [7,0],a2 ;x-vel
movi [36h,0],a3
movi spirit_anim,a4
movi spirit_anim,a9
jruc #cont2
#reap
;Reaper
movi [2,0],a1
movi [4,0],a2 ;x-vel
movi [2eh,0],a3
movi reaper_grow,a4
movi reaper_anim,a9
#cont2
move *a11(OBJ_XPOS),a0,L
move *a11(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
move *a13(SP_OBJCONTROL),a14
ori M_FLIPH,a14
move a14,*a13(SP_OBJCONTROL)
neg a1
neg a2
#no_flip
add a1,a0
move a0,*a13(SP_OBJ_XPOS),L
move a2,*a13(SP_OBJ_XVEL),L
move *a11(OBJ_ZPOS),*a13(SP_OBJ_ZPOS),L
move *a11(OBJ_YPOS),a0,L
add a3,a0
move a0,*a13(SP_OBJ_YPOS),L
move *a11(INRING),*a13(SP_INRING)
move *a11(GROUND_Y),a0
sll 16,a0
move a0,*a13(SP_GROUND_Y),L
clr a0
move a0,*a13(SP_GRAVITY),L
move a0,*a13(SP_OBJ_ZVEL),L
move a0,*a13(SP_OBJ_YVEL),L
move a0,*a13(SP_DIE)
move a4,a0
callr sp_change_anim
#lp
callr sp_velocity_add
; callr sp_update_pos
;sp_update_pos
move *a13(SP_OBJ),a8,L
move *a13(SP_OBJ_ZPOS),a0,L
ori [01000h,0],a0
move *a13(SP_INRING),a14
jrz #inring
cmpi [015ach,0],a0
jrgt #inring
subi [01e5h,0],a0 ;below mat
#inring
move a0,*a8(OZVAL),L
move *a13(SP_OBJ_XPOS),*a8(OXVAL),L ;object
movi Y_SCALE_MULTIPLIER,a0
move *a13(SP_OBJ_ZPOSINT),a1
mpyu a0,a1
move a1,a2
move *a13(SP_OBJ_YPOS),a0,L
sub a0,a1
move a1,*a8(OYVAL),L
move *a13(SP_OBJCONTROL),a7 ;flip bits & pixel ops
andi 0111111b,a7
setf 6,0,0
move a7,*a8(OCTRL) ;Write 6 low bits
setf 16,1,0
SLEEPK 1
move a9,a0
callr sp_animate
move *a13(SP_DIE),a0
jrnz #die
move @WORLDTLX+16,a0 ;world x int
addi 200,a0 ;center of screen
move *a13(SP_OBJ_XPOSINT),a1
sub a1,a0
abs a0
cmpi 256,a0 ;off screen by 56 pixels
jrlt #lp
move a13,a0
callr delete_special_objlist
#die
move *a13(SP_OBJ),a0,L
calla DELOBJ
; move *a13(SP_SHADOW_OBJ),a0,L
; calla DELOBJ
DIE
#*****************************************************************************
* Yoko salt toss
*
SUBR yok_salt_spray
movk 2,a0
move a0,*a13(SP_ID)
move a11,*a13(SP_WRESPROC),L
move *a11(PLYR_SIDE),*a13(SP_PLYR_SIDE)
move a13,a0
callr insert_special_objlist ;insert into collis list
callr sp_create_obj
move *a13(SP_OBJ),a8,L
;Salt
movi [36h,0],a1
movi [7,0h],a2 ;x-vel
movi [5bh,0],a3
movi salt_grow,a4
movi salt_anim,a9
move *a11(OBJ_XPOS),a0,L
move *a11(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
move *a13(SP_OBJCONTROL),a14
ori M_FLIPH,a14
move a14,*a13(SP_OBJCONTROL)
neg a1
neg a2
#no_flip
add a1,a0
move a0,*a13(SP_OBJ_XPOS),L
move a2,*a13(SP_OBJ_XVEL),L
move *a11(OBJ_ZPOS),*a13(SP_OBJ_ZPOS),L
move *a11(OBJ_YPOS),a0,L
add a3,a0
move a0,*a13(SP_OBJ_YPOS),L
move *a11(INRING),*a13(SP_INRING)
move *a11(GROUND_Y),a0
sll 16,a0
move a0,*a13(SP_GROUND_Y),L
movi 4800h,a0
move a0,*a13(SP_GRAVITY),L
movi 30000h,a0
move a0,*a13(SP_OBJ_YVEL),L
clr a0
move a0,*a13(SP_OBJ_ZVEL),L
move a0,*a13(SP_DIE)
move a4,a0
callr sp_change_anim
#lp
callr sp_velocity_add
; callr sp_update_pos
;sp_update_pos
move *a13(SP_OBJ),a8,L
move *a13(SP_OBJ_ZPOS),a0,L
ori [01000h,0],a0
move *a13(SP_INRING),a14
jrz #inring
cmpi [015ach,0],a0
jrgt #inring
subi [01e5h,0],a0 ;below mat
#inring
move a0,*a8(OZVAL),L
move *a13(SP_OBJ_XPOS),*a8(OXVAL),L ;object
movi Y_SCALE_MULTIPLIER,a0
move *a13(SP_OBJ_ZPOSINT),a1
mpyu a0,a1
move a1,a2
move *a13(SP_OBJ_YPOS),a0,L
sub a0,a1
move a1,*a8(OYVAL),L
move *a13(SP_OBJCONTROL),a7 ;flip bits & pixel ops
andi 0111111b,a7
setf 6,0,0
move a7,*a8(OCTRL) ;Write 6 low bits
setf 16,1,0
SLEEPK 1
move a9,a0
callr sp_animate
move *a13(SP_DIE),a0
jrnz #die
move @WORLDTLX+16,a0 ;world x int
addi 200,a0 ;center of screen
move *a13(SP_OBJ_XPOSINT),a1
sub a1,a0
abs a0
cmpi 256,a0 ;off screen by 56 pixels
jrlt #lp
#die
; cmpi 2,a0
;;Already taken off list?
; jrnz #die2
move a13,a0
callr delete_special_objlist
;#die2
move *a13(SP_OBJ),a0,L
calla DELOBJ
DIE
#*****************************************************************************
SUBR react_bloodnguts_gen
move a11,*a13(SP_WRESPROC),L
#asdf
movi 3,a8
#loop
movi 2,a9
#loop2
CREATE DEBRIS_PID,react_blood
push a13
move a13,a10
move a0,a13
move a11,*a13(SP_WRESPROC),L
move *a11(OBJ_XPOS),*a13(SP_OBJ_XPOS),L
move *a11(OBJ_ZPOS),*a13(SP_OBJ_ZPOS),L
move *a11(OBJ_YPOS),a0,L
addi [90,0],a0
move a0,*a13(SP_OBJ_YPOS),L
move *a11(INRING),*a13(SP_INRING)
move *a11(GROUND_Y),a0
sll 16,a0
move a0,*a13(SP_GROUND_Y),L
pull a13
dsj a9,#loop2
SLEEPK 2
dsj a8,#loop
SLEEP 2*60
DIE
SUBR react_blood
clr a0
move a0,*a13(SP_SHADOW_OBJ),L
movi GRAVITY*2,a0
move a0,*a13(SP_GRAVITY),L
movi DMAWNZ,a0 ;DMA flags
move a0,*a13(SP_OBJCONTROL)
clr a0 ;x pos
clr a1 ;y pos
movi PINSHAD1,a2 ;* image
movi 150,a3 ;z pos
movi DMAWNZ,a4 ;DMA flags
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
calla BEGINOBJ
move a8,*a13(SP_OBJ),L
; clr a0 ;x pos
; clr a1 ;y pos
; movi PINSHAD1,a2 ;* image
; movi 149,a3 ;z pos
; movi DMAWNZ,a4 ;DMA flags
; clr a5 ;object ID
; clr a6 ;x vel
; clr a7 ;y vel
; calla BEGINOBJ
; move a8,*a13(SP_SHADOW_OBJ),L
movi [4,0],a0
calla RNDRNG0
move a0,*a13(SP_OBJ_XVEL),L
jrp #no_xflip
move *a13(SP_OBJCONTROL),a0
ori M_FLIPH,a0
move a0,*a13(SP_OBJCONTROL)
#no_xflip
movi [2,0],a0
calla RNDRNGS
move a0,*a13(SP_OBJ_ZVEL),L
movi [4,0],a0
calla RNDRNGS
addi [8,0],a0
move a0,*a13(SP_OBJ_YVEL),L
move *a13(SP_OBJ),a8,L
movi flame_anim,a0
calla sp_change_anim
clr a0
move a0,*a13(SP_DIE)
movi 60*3,a0
move a0,*a13(SP_LIFESPAN)
#lp1
callr sp_velocity_add
callr sp_update_pos
SLEEPK 2
move *a13(SP_OBJ_XVEL),a0,L
move *a13(SP_OBJ_YVEL),a1,L
callr calc_veldir
X32 a0
addi flame_table_A,a0
move *a0,a2,L
move a2,*a8(OIMG),L
move *a2(ICMAP),a0,L ;Get *palette
calla pal_getf
move a0,*a8(OPAL),L ;Set palette & constant
move *a2(0),*a8(OSIZE),L
move *a2(ISAG),*a8(OSAG),L
move *a2(IANIOFFX),*a8(ODXOFF)
move *a2(IANIOFFY),*a8(ODYOFF)
movb *a2(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp
;; callr sp_animate
; move *a13(SP_LIFESPAN),a0
; dec a0
; jrz #die
; move a0,*a13(SP_LIFESPAN)
; move *a13(SP_DIE),a0
; jrz #lp1
move *a13(SP_OBJ_YPOS),a1,L
move *a13(SP_GROUND_Y),a14,L
cmp a1,a14
jrle #lp1
move a14,*a13(SP_OBJ_YPOS),L
movi flame_splat_anim,a0
calla sp_change_anim
callr sp_update_pos
#lp2
; callr sp_update_pos
SLEEPK 2
callr sp_animate
move *a13(SP_DIE),a0
jrz #lp2
#die
move *a13(SP_OBJ),a0,L
calla DELOBJ
; move *a13(SP_SHADOW_OBJ),a0,L
; calla DELOBJ
DIE
#*****************************************************************************
SUBR special_hit
PUSH a13
PUSH a8
move a6,a13
move a13,a0
callr delete_special_objlist
move *a13(SP_ID),a14
sll 5,a14
addi #splat_tbl,a14
move *a14,a0,L
callr sp_change_anim
PULL a13
move a13,a0
callr delete_special_objlist
move *a13(SP_ID),a14
sll 5,a14
addi #splat_tbl,a14
move *a14,a0,L
callr sp_change_anim
PULL a13
rets
#splat_tbl
.long spiritsplat_anim
.long reapersplat_anim
.long saltsplat_anim
#*****************************************************************************
sp_create_obj
clr a0 ;x pos
clr a1 ;y pos
movi PINSHAD1,a2 ;* image
movi 150,a3 ;z pos
movi DMAWNZ,a4 ;DMA flags
move a4,*a13(SP_OBJCONTROL)
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
calla BEGINOBJ
move a8,*a13(SP_OBJ),L
rets
#*****************************************************************************
sp_create_shadow
clr a0 ;x pos
clr a1 ;y pos
movi PINSHAD1,a2 ;* image
movi 149,a3 ;z pos
movi DMAWNZ,a4 ;DMA flags
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
calla BEGINOBJ
move a8,*a13(SP_SHADOW_OBJ),L
rets
#*****************************************************************************
sp_velocity_add
move *a13(SP_OBJ_XPOS),a1,L
move *a13(SP_OBJ_XVEL),a0,L
add a0,a1
move a1,*a13(SP_OBJ_XPOS),L
move *a13(SP_OBJ_YPOS),a1,L
move *a13(SP_OBJ_YVEL),a0,L
move *a13(SP_GRAVITY),a14,L
sub a14,a0
move a0,*a13(SP_OBJ_YVEL),L
add a0,a1
move a1,*a13(SP_OBJ_YPOS),L
move *a13(SP_OBJ_ZPOS),a1,L
move *a13(SP_OBJ_ZVEL),a0,L
add a0,a1
move a1,*a13(SP_OBJ_ZPOS),L
rets
#*****************************************************************************
sp_standard_bounce
move *a13(SP_OBJ_YVEL),a0,L
jrp #ok
move *a13(SP_OBJ_YPOS),a1,L
move *a13(SP_GROUND_Y),a14,L
cmp a1,a14
jrle #ok
move a14,*a13(SP_OBJ_YPOS),L
sra 1,a0
neg a0
move a0,*a13(SP_OBJ_YVEL),L
#ok
rets
#*****************************************************************************
sp_update_pos
move *a13(SP_OBJ),a8,L
move *a13(SP_SHADOW_OBJ),a9,L
move *a13(SP_OBJ_ZPOS),a0,L
ori [01000h,0],a0
move *a13(SP_INRING),a14
jrz #inring
cmpi [015ach,0],a0
jrgt #inring
subi [01e5h,0],a0 ;below mat
#inring
move a0,*a8(OZVAL),L
move a0,*a9(OZVAL),L
move *a13(SP_OBJ_XPOS),*a8(OXVAL),L ;object
move *a13(SP_OBJ_XPOS),*a9(OXVAL),L ;shadow
movi Y_SCALE_MULTIPLIER,a0
move *a13(SP_OBJ_ZPOSINT),a1
mpyu a0,a1
move a1,a2
move *a13(SP_OBJ_YPOS),a0,L
sub a0,a1
move a1,*a8(OYVAL),L
move *a13(SP_GROUND_Y),a0,L
sub a0,a2
move a2,*a9(OYVAL),L
move *a9(OXPOS),a0
andni 1,a0
move @PCNT,a1
andi 1,a1
or a1,a0
move *a9(OYPOS),a1
andi 1,a1
xor a1,a0
move a0,*a9(OXPOS) ;shake shadow
move *a13(SP_OBJCONTROL),a7 ;flip bits & pixel ops
andi 0111111b,a7
setf 6,0,0
move a7,*a8(OCTRL) ;Write 6 low bits
setf 16,1,0
rets
sp_update_pos_single
move *a13(SP_OBJ),a8,L
move *a13(SP_OBJ_ZPOS),a0,L
ori [01000h,0],a0
move *a13(SP_INRING),a14
jrz #inring2
cmpi [015ach,0],a0
jrgt #inring2
subi [01e5h,0],a0 ;below mat
#inring2
move a0,*a8(OZVAL),L
move *a13(SP_OBJ_XPOS),*a8(OXVAL),L ;object
movi Y_SCALE_MULTIPLIER,a0
move *a13(SP_OBJ_ZPOSINT),a1
mpyu a0,a1
move a1,a2
move *a13(SP_OBJ_YPOS),a0,L
sub a0,a1
move a1,*a8(OYVAL),L
move *a13(SP_OBJCONTROL),a7 ;flip bits & pixel ops
andi 0111111b,a7
setf 6,0,0
move a7,*a8(OCTRL) ;Write 6 low bits
setf 16,1,0
rets
#*****************************************************************************
SUBR sp_change_anim
move a0,*a13(SP_ANIBASE),L
move a0,*a13(SP_ANIPC),L
movk 1,a0
move a0,*a13(SP_ANICNT)
move *a13(SP_OBJ),a8,L
callr sp_animate
rets
SUBRP sp_animate
move *a13(SP_DIE),a0
jrnz _exit
move *a13(SP_ANICNT),a0
dec a0
move a0,*a13(SP_ANICNT)
jrgt _exit
next_command
move *a13(SP_ANIPC),a4,L
move *a4+,a0
jrn #command
move a0,*a13(SP_ANICNT)
move *a4+,a2,L
move *a8(OIMG),a1,L
move *a1(ICMAP),a1,L ;* old palette
move a2,*a8(OIMG),L ;new image
move *a2(ICMAP),a0,L ;Get *palette
cmp a0,a1
jreq #no_change
;do this only if palette has changed!!!
move *a2(ICMAP),a0,L ;Get *palette
calla pal_getf
move a0,*a8(OPAL),L ;Set palette & constant
#no_change
move *a2(0),*a8(OSIZE),L
move *a2(ISAG),*a8(OSAG),L
move *a2(IANIOFFX),*a8(ODXOFF)
move *a2(IANIOFFY),*a8(ODYOFF)
movb *a2(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp
; setf 6,0,0
; move a7,*a8(OCTRL) ;Write 6 low bits
; setf 16,1,0
move a4,*a13(SP_ANIPC),L
_exit
rets
#command
andi 0ffh,a0
;TEMP!
.if DEBUG
TEST a0
jrn #errlo
cmpi 14,a0
jrgt #errhi
jruc #ok0
#errlo LOCKUP
nop
#errhi LOCKUP
nop
#ok0 .endif
;!PMET
X32 a0
addi #ani_commands,a0
move *a0,a0,L
jump a0
#ani_commands
.long _asp_zip ;0
.long _asp_end ;1
.long _asp_die ;2
.long _asp_repeat ;3
.long _asp_goto ;4
.long _asp_collbox ;5
.long _asp_zerovels ;6
.long _asp_add_yvel ;7
.long _asp_setword ;8
.long _asp_setlong ;9
.long _asp_code ;10
.long _asp_waitnegyvel ;11
.long _asp_zeroyvel ;12
.long _asp_waithitgnd ;13
.long _asp_set_grav ;14
#********
_asp_zip ;0
move a4,*a13(SP_ANIPC),L
jruc next_command
#********
_asp_end ;1
move a4,*a13(SP_ANIPC),L
jruc next_command
#********
_asp_die ;2
movk 2,a0
move a0,*a13(SP_DIE)
rets
#********
_asp_repeat ;3
move *a13(SP_ANIBASE),*a13(SP_ANIPC),L
jruc next_command
#********
_asp_goto ;4
move *a4(0),*a13(SP_ANIPC),L
jruc next_command
#********
_asp_collbox ;5
move a4,a14
addi 6*10h,a14 ;6 words
move a14,*a13(SP_ANIPC),L
move *a4(0),*a13(SP_XOFF)
move *a4(10h),*a13(SP_WIDTH)
move *a4(20h),*a13(SP_YOFF)
move *a4(30h),*a13(SP_HEIGHT)
move *a4(40h),*a13(SP_ZOFF)
move *a4(50h),*a13(SP_DEPTH)
jruc next_command
#********
_asp_zerovels ;6
clr a0
move a0,*a13(SP_OBJ_XVEL),L
move a0,*a13(SP_OBJ_YVEL),L
move a0,*a13(SP_OBJ_ZVEL),L
move a4,*a13(SP_ANIPC),L
jruc next_command
#********
_asp_add_yvel ;7
move *a4+,a0,L
move a4,*a13(SP_ANIPC),L
move *a13(SP_OBJ_YVEL),a1,L
add a0,a1
move a1,*a13(SP_OBJ_YVEL),L
jruc next_command
#********
_asp_setword ;8
STRUCT 0
WORD #PDOFF
WORD #WORD
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a13(SP_ANIPC),L
move *a4(#PDOFF),a0
add a13,a0
move *a4(#WORD),a1
move a1,*a0
jruc next_command
#********
_asp_setlong ;9
STRUCT 0
WORD #PDOFF
LONG #LONG
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a13(SP_ANIPC),L
move *a4(#PDOFF),a0
add a13,a0
move *a4(#LONG),a1,L
move a1,*a0,L
jruc next_command
#********
_asp_code ;10
move *a4+,a0,L
move a4,*a13(SP_ANIPC),L
call a0
jruc next_command
#********
_asp_waitnegyvel ;11
move *a13(SP_OBJ_YVEL),a0,L
jrp #wait
clr a0
move a0,*a13(SP_OBJ_YVEL),L
move a4,*a13(SP_ANIPC),L
jruc next_command
#wait
movk 1,a0
move a0,*a13(SP_ANICNT) ;# ticks to hold cur frame
rets
#********
_asp_zeroyvel ;12
clr a0
move a0,*a13(SP_OBJ_YVEL),L
move a4,*a13(SP_ANIPC),L
jruc next_command
#********
_asp_waithitgnd ;13
move *a13(SP_OBJ_YVEL),a0,L ;must have down velocity
jrp #no_gnd
move *a13(SP_OBJ_YPOSINT),a0
move *a13(SP_GROUND_Y+10h),a1
cmp a1,a0 ;a0-a1
jrgt #no_gnd
sll 16,a1
move a1,*a13(SP_OBJ_YPOS),L
move a4,*a13(SP_ANIPC),L
jruc next_command
#no_gnd
movk 1,a0
move a0,*a13(SP_ANICNT)
rets
#********
_asp_set_grav ;14
move *a4+,a0,L
move a4,*a13(SP_ANIPC),L
move a0,*a13(SP_GRAVITY),L
jruc next_command
#********
blade_anim
WL 3,BLADE01
WL 3,BLADE02
WL 3,BLADE03
WL 3,BLADE04
WL 3,BLADE05
WL 3,BLADE06
WL 3,BLADE07
WL 3,BLADE08
WL 3,BLADE09
WL 3,BLADE10
.word ASP_REPEAT
chain_anim
WL 4,CHAIN01
WL 4,CHAIN02
WL 4,CHAIN03
WL 4,CHAIN04
WL 4,CHAIN05
WL 4,CHAIN06
.word ASP_REPEAT
bladeR_anim
WL 3,BLADE04
WL 3,BLADE03
WL 3,BLADE02
WL 3,BLADE01
WL 3,BLADE10
WL 3,BLADE09
WL 3,BLADE08
WL 3,BLADE07
WL 3,BLADE06
WL 3,BLADE05
.word ASP_REPEAT
star_anim
WL 3,STAR01
WL 3,STAR02
WL 3,STAR03
WL 3,STAR04
WL 3,STAR05
WL 3,STAR06
WL 3,STAR07
WL 3,STAR08
WL 3,STAR09
WL 3,STAR10
WL 3,STAR11
WL 3,STAR12
WL 3,STAR13
WL 3,STAR14
.word ASP_REPEAT
dbell_anim
WL 3,DBELL01
WL 3,DBELL02
WL 3,DBELL03
WL 3,DBELL04
WL 3,DBELL05
WL 3,DBELL06
WL 3,DBELL07
WL 3,DBELL08
WL 3,DBELL09
WL 3,DBELL10
WL 3,DBELL11
WL 3,DBELL12
WL 3,DBELL13
WL 3,DBELL14
WL 3,DBELL15
.word ASP_REPEAT
lamb_anim
WL 3,LAMB01
WL 3,LAMB02
WL 3,LAMB03
WL 3,LAMB04
WL 3,LAMB05
WL 3,LAMB06
WL 3,LAMB07
WL 3,LAMB08
WL 3,LAMB09
WL 3,LAMB10
WL 3,LAMB11
WL 3,LAMB12
WL 3,LAMB13
WL 3,LAMB14
WL 3,LAMB15
.word ASP_REPEAT
fish1_anim
WL 2,FISHF01
WL 2,FISHF02
WL 2,FISHF03
WL 2,FISHF04
WL 2,FISHF05
WL 2,FISHF04
WL 2,FISHF03
WL 2,FISHF02
.word ASP_REPEAT
fish2_anim
WL 3,FISHT01
WL 3,FISHT02
WL 3,FISHT03
WL 3,FISHT04
WL 3,FISHT05
WL 3,FISHT06
WL 3,FISHT07
WL 3,FISHT08
WL 3,FISHT09
WL 3,FISHT10
WL 3,FISHT11
WL 3,FISHT12
WL 3,FISHT13
WL 3,FISHT14
WL 3,FISHT15
.word ASP_REPEAT
turkey_anim
WL 4,TURKEY1
WL 4,TURKEY2
WL 4,TURKEY3
WL 4,TURKEY4
WL 4,TURKEY5
WL 4,TURKEY6
WL 4,TURKEY7
WL 4,TURKEY8
.word ASP_REPEAT
#*******
bat_anim
WWL ASP_SETLONG,SP_HITGND_CODE,#bat_bounce
.word ASP_SETWORD,SP_LIFESPAN,150
WL ASP_CODE,#choose_anim
batLR_anim
WL ASP_CODE,#fliponx
WL 1,BATSD01
.word ASP_WAITHITGND
WWL ASP_SETLONG,SP_GRAVITY,04000h
WL ASP_CODE,#set_yvel
#bl1
WL 2,BATSD01
WL 7,BATSD02
WL 2,BATSD03
WL 2,BATSD04
WL 2,BATSD05
.word ASP_WAITNEGYVEL
WL ASP_ADD_YVEL,048000h
WL ASP_GOTO,#bl1
#fliponx
move *a13(SP_OBJ_XVEL),a0,L
jrp #noflip
move *a13(SP_OBJCONTROL),a0
xori M_FLIPH,a0
move a0,*a13(SP_OBJCONTROL)
#noflip
rets
#choose_anim
move *a13(SP_OBJ_YVEL),a0,L
sra 1,a0
move a0,*a13(SP_OBJ_YVEL),L
move *a13(SP_OBJ_XVEL),a0,L
abs a0
cmpi 0c000h,a0
jrgt #fall_through ;to left/right bat
movi batU_anim,a0
move a0,*a13(SP_ANIPC),L
#fall_through
rets
batU_anim
WL 1,BATBK01
.word ASP_WAITHITGND
WWL ASP_SETLONG,SP_GRAVITY,04000h
WL ASP_CODE,#set_yvel
#bl2
WL 2,BATBK01
WL 7,BATBK02
WL 2,BATBK03
WL 2,BATBK04
WL 2,BATBK05
.word ASP_WAITNEGYVEL
WL ASP_ADD_YVEL,048000h
WL ASP_GOTO,#bl2
#set_yvel
movi 4000h,a0
calla RNDRNGS
addi 048000h,a0
move a0,*a13(SP_OBJ_YVEL),L
rets
#bat_bounce
move *a13(SP_OBJ_YVEL),a0,L
jrp #ok
move *a13(SP_OBJ_YPOS),a1,L
move *a13(SP_GROUND_Y),a14,L
cmp a1,a14
jrle #ok
move a14,*a13(SP_OBJ_YPOS),L
clr a0
move a0,*a13(SP_OBJ_YVEL),L
#ok
rets
#*******
skull_anim
WL 3,SKULL01
WL 3,SKULL02
WL 3,SKULL03
WL 3,SKULL04
WL 3,SKULL05
WL 3,SKULL06
WL 3,SKULL07
WL 3,SKULL08
WL 3,SKULL09
WL 3,SKULL10
WL 3,SKULL11
WL 3,SKULL12
WL 3,SKULL13
.word ASP_REPEAT
bone_anim
WL 3,BONE01
WL 3,BONE02
WL 3,BONE03
WL 3,BONE04
WL 3,BONE05
WL 3,BONE06
WL 3,BONE07
WL 3,BONE08
WL 3,BONE09
WL 3,BONE10
WL 3,BONE11
WL 3,BONE12
WL 3,BONE13
WL 3,BONE14
WL 3,BONE15
.word ASP_REPEAT
bone2_anim
WL ASP_CODE,#choose_anim
boneR_anim
WL 2,BONEB15
WL 2,BONEB14
WL 2,BONEB13
WL 2,BONEB12
WL 2,BONEB11
WL 2,BONEB10
WL 2,BONEB09
WL 2,BONEB08
WL 2,BONEB07
WL 2,BONEB06
WL 2,BONEB05
WL 2,BONEB04
WL 2,BONEB03
WL 2,BONEB02
WL 2,BONEB01
.word ASP_REPEAT
#choose_anim
move *a13(SP_OBJ_XVEL),a0,L
jrp #fall_through
movi boneL_anim,a0
move a0,*a13(SP_ANIPC),L
#fall_through
rets
boneL_anim
WL 2,BONEB01
WL 2,BONEB02
WL 2,BONEB03
WL 2,BONEB04
WL 2,BONEB05
WL 2,BONEB06
WL 2,BONEB07
WL 2,BONEB08
WL 2,BONEB09
WL 2,BONEB10
WL 2,BONEB11
WL 2,BONEB12
WL 2,BONEB13
WL 2,BONEB14
WL 2,BONEB15
.word ASP_REPEAT
#*******
heart_anim
WL 3,HART01
WL 3,HART02
WL 3,HART03
WL 3,HART04
WL 3,HART05
WL 3,HART06
WL 3,HART07
WL 3,HART08
WL 3,HART09
WL 3,HART10
WL 3,HART11
WL 3,HART12
WL 3,HART13
WL 3,HART14
WL 3,HART15
.word ASP_REPEAT
glasses_anim
WL 3,BGLAS01
WL 3,BGLAS02
WL 3,BGLAS03
WL 3,BGLAS04
WL 3,BGLAS05
WL 3,BGLAS06
WL 3,BGLAS07
WL 3,BGLAS08
WL 3,BGLAS09
WL 3,BGLAS10
WL 3,BGLAS11
WL 3,BGLAS12
WL 3,BGLAS13
WL 3,BGLAS14
WL 3,BGLAS15
.word ASP_REPEAT
glasses1_anim
WL 4,BGLAS01
WL 4,BGLAS02
WL 4,BGLAS03
WL 4,BGLAS04
WL 4,BGLAS05
WL 4,BGLAS06
WL 4,BGLAS07
WL 4,BGLAS08
WL 4,BGLAS09
WL 4,BGLAS10
WL 4,BGLAS11
WL 4,BGLAS12
WL 4,BGLAS13
WL 4,BGLAS14
WL 4,BGLAS15
.word ASP_REPEAT
glasses2_anim
WL 2,BGLAS05
WL 2,BGLAS06
WL 2,BGLAS07
WL 2,BGLAS08
WL 2,BGLAS09
WL 2,BGLAS10
WL 2,BGLAS11
WL 2,BGLAS12
WL 2,BGLAS13
WL 2,BGLAS14
WL 2,BGLAS15
WL 2,BGLAS01
WL 2,BGLAS02
WL 2,BGLAS03
WL 2,BGLAS04
.word ASP_REPEAT
tombbit_anim
WL 4,TPIE01
WL 4,TPIE02
WL 4,TPIE03
WL 4,TPIE04
WL 4,TPIE05
WL 4,TPIE06
WL 4,TPIE07
WL 4,TPIE08
.word ASP_REPEAT
flame_splat_anim
WL 4,BLDHIT1
WL 4,BLDHIT2
WL 4,BLDHIT3
WL 4,BLDHIT4
.word ASP_DIE
WL 8,FLAMEA08
WL 8,FLAMEA09
WL 8,FLAMEA10
.word ASP_DIE
#misc_anims
.long ball_anim
.long flame_anim
.long fireball_anim
ball_anim
WL 3,BALL01
WL 3,BALL02
WL 3,BALL03
WL 3,BALL04
WL 3,BALL05
WL 3,BALL06
WL 3,BALL07
WL 3,BALL08
WL 3,BALL09
WL 3,BALL10
WL 3,BALL11
WL 3,BALL12
WL 3,BALL13
WL 3,BALL14
WL 3,BALL15
.word ASP_REPEAT
ex_anima1 ;0
WL 4,XPLODA01
WL 4,XPLODA03
WL 4,XPLODA04
WL 4,XPLODA05
WL 4,XPLODA06
WL 4,XPLODA07
WL 4,XPLODA08
WL 4,XPLODA09
WL 4,XPLODA10
.word ASP_DIE
flame_anim
WL 8,FLAMEA01
WL 8,FLAMEA02
WL 8,FLAMEA03
WL 8,FLAMEA04
WL 8,FLAMEA05
WL 8,FLAMEA06
WL 8,FLAMEA07
.word ASP_REPEAT
fireball_anim
.word ASP_COLLBOX,-10,20,-8,16,-10,20 ;xoff,width,yoff,height,zoff,depth
#lp
WL 4,FIREBALL1
WL 4,FIREBALL2
WL 4,FIREBALL3
WL 4,FIREBALL4
WL 4,FIREBALL5
WL 4,FIREBALL6
WL ASP_GOTO,#lp
spirit_anim
.word ASP_COLLBOX,0,10,-8,16,-10,20 ;xoff,width,yoff,height,zoff,depth
#lp2
WL 3,GHOST01
WL 3,GHOST02
WL 3,GHOST03
WL 3,GHOST04
WL 3,GHOST05
WL ASP_GOTO,#lp2
salt_grow
.word ASP_COLLBOX,0,10,-8,16,-1000,20 ;xoff,width,yoff,height,zoff,depth
WL 1,SALT01
WL ASP_CODE,#set_xv
salt_anim
.word ASP_COLLBOX,0,10,-8,16,-40,80 ;xoff,width,yoff,height,zoff,depth
WL 20,SALT01
.word ASP_ZEROVELS
WL ASP_SET_GRAV,0h
;Turn collisions off
.word ASP_COLLBOX,0,10,-8,16,-1000,20 ;xoff,width,yoff,height,zoff,depth
WL 4,SALT02
WL 4,SALT03
WL 4,SALT04
WL 4,SALT05
WL 4,SALT06
WL 4,SALT07
WL 4,SALT08
WL 4,SALT09
.word ASP_DIE
reaper_grow
.word ASP_COLLBOX,0,10,-8,16,-1000,20 ;xoff,width,yoff,height,zoff,depth
WL 1,RPR01
WL 1,RPR02
WL 1,RPR03
WL 1,RPR04
WL 1,RPR05
WL ASP_CODE,#set_xv
reaper_anim
WL 3,REPRFL01
WL 3,REPRFL02
.word ASP_COLLBOX,0,10,-8,16,-10,20 ;xoff,width,yoff,height,zoff,depth
#lp3
WL 3,REPRFL03
WL 3,REPRFL04
WL 3,REPRFL05
WL 3,REPRFL06
WL 3,REPRFL07
WL 3,REPRFL08
WL 3,REPRFL01
WL 3,REPRFL02
WL ASP_GOTO,#lp3
#set_xv
movi [7,0],a0 ;x-vel
move *a13(SP_OBJCONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
neg a0
#no_flip
move a0,*a13(SP_OBJ_XVEL),L
rets
SUBR spiritsplat_anim
.word ASP_ZEROVELS
WL 3,GHOHIT01
WL 3,GHOHIT02
WL 3,GHOHIT03
WL 3,GHOHIT04
WL 3,GHOHIT05
WL 3,GHOHIT06
WL 3,GHOHIT07
WL 3,GHOHIT08
WL 3,GHOHIT09
WL 3,GHOHIT10
WL 3,GHOHIT11
WL 3,GHOHIT12
WL 3,GHOHIT13
WL 3,GHOHIT14
WL 3,GHOHIT15
WL 3,GHOHIT16
.word ASP_DIE
SUBR reapersplat_anim
.word ASP_ZEROVELS
WL 3,REPRMS01
WL 3,REPRMS02
WL 3,REPRMS03
WL 3,REPRMS04
WL 3,REPRMS05
WL 3,REPRMS06
WL 3,REPRMS07
.word ASP_DIE
SUBR firesplat_anim
.word ASP_ZEROVELS
WL 4,CLOBHIT01
WL 4,CLOBHIT02
WL 4,CLOBHIT03
WL 4,CLOBHIT04
.word ASP_DIE
SUBR saltsplat_anim
; .word ASP_ZEROVELS
WL ASP_SET_GRAV,0h
;Turn collisions off
.word ASP_COLLBOX,0,10,-8,16,-1000,20 ;xoff,width,yoff,height,zoff,depth
WL 4,SALT02
WL 4,SALT03
WL 2,SALT04
WL ASP_CODE,#adjust_vels
; .word ASP_ZEROVELS
; WL ASP_ADD_YVEL,-20000h
WL 2,SALT04
WL 3,SALT05
WL ASP_CODE,#adjust_vels
WL ASP_ADD_YVEL,-20000h
WL 3,SALT06
WL 3,SALT07
.word ASP_ZEROVELS
WL ASP_ADD_YVEL,-20000h
WL 3,SALT08
WL 3,SALT09
.word ASP_DIE
#adjust_vels
move *a13(SP_OBJ_XVEL),a0,L
sra 1,a0
move a0,*a13(SP_OBJ_XVEL),L
movi -20000h,a0
move a0,*a13(SP_OBJ_YVEL),L
clr a0
move a0,*a13(SP_OBJ_ZVEL),L
rets
#********
pie_anim
.word ASP_COLLBOX,-10,20,-8,16,-10,20 ;xoff,width,yoff,height,zoff,depth
#lp
;;; WL 99,PIE03
WL 4,BGBAT01
WL 4,BGBAT02
WL 4,BGBAT03
WL 4,BGBAT04
WL 4,BGBAT05
WL ASP_GOTO,#lp
SUBR piesplat_anim
.word ASP_ZEROVELS
WL 4,PIE05
WL 4,PIE06
WL 4,PIE07
WL 4,PIE08
.word ASP_DIE
#********
pin_animC1
WL 1,PIN15
WL 1,PIN14
WL 1,PIN13
WL 1,PIN12
WL 1,PIN11
WL 1,PIN10
WL 1,PIN09
WL 1,PIN08
WL 1,PIN07
WL 1,PIN06
WL 1,PIN05
WL 1,PIN04
WL 1,PIN03
WL 1,PIN02
WL 1,PIN01
.word ASP_REPEAT
pin_animC2
WL 2,PIN15
WL 2,PIN14
WL 2,PIN13
WL 2,PIN12
WL 2,PIN11
WL 2,PIN10
WL 2,PIN09
WL 2,PIN08
WL 2,PIN07
WL 2,PIN06
WL 2,PIN05
WL 2,PIN04
WL 2,PIN03
WL 2,PIN02
WL 2,PIN01
.word ASP_REPEAT
pin_animC3
WL 3,PIN15
WL 3,PIN14
WL 3,PIN13
WL 3,PIN12
WL 3,PIN11
WL 3,PIN10
WL 3,PIN09
WL 3,PIN08
WL 3,PIN07
WL 3,PIN06
WL 3,PIN05
WL 3,PIN04
WL 3,PIN03
WL 3,PIN02
WL 3,PIN01
.word ASP_REPEAT
pin_animA1
WL 1,PIN01
WL 1,PIN02
WL 1,PIN03
WL 1,PIN04
WL 1,PIN05
WL 1,PIN06
WL 1,PIN07
WL 1,PIN08
WL 1,PIN09
WL 1,PIN10
WL 1,PIN11
WL 1,PIN12
WL 1,PIN13
WL 1,PIN14
WL 1,PIN15
.word ASP_REPEAT
pin_animA2
WL 2,PIN01
WL 2,PIN02
WL 2,PIN03
WL 2,PIN04
WL 2,PIN05
WL 2,PIN06
WL 2,PIN07
WL 2,PIN08
WL 2,PIN09
WL 2,PIN10
WL 2,PIN11
WL 2,PIN12
WL 2,PIN13
WL 2,PIN14
WL 2,PIN15
.word ASP_REPEAT
pin_animA3
WL 3,PIN01
WL 3,PIN02
WL 3,PIN03
WL 3,PIN04
WL 3,PIN05
WL 3,PIN06
WL 3,PIN07
WL 3,PIN08
WL 3,PIN09
WL 3,PIN10
WL 3,PIN11
WL 3,PIN12
WL 3,PIN13
WL 3,PIN14
WL 3,PIN15
.word ASP_REPEAT
#*****************************************************************************
*
* args:
* a0 = X-VEL (LONG)
* a1 = Y-VEL (LONG)
*
* ret:
* a0 = angle 0=0d(U) 9=45d(UR) 18=90d(R) 27=135d(DR) 36=180d(D)
*
SUBR calc_veldir
abs a0
move a1,a14
abs a14
or a0,a14
jrz #done
movi #posx_posy,a2
move a1,a1 ;y-vel
jrp #pos_yvel
movi #posx_negy,a2
#pos_yvel
abs a1
move a14,a3 ;x+y vel < 8 ?
srl 16+3,a3
jrz #not_max
#ovr
srl 1,a0
srl 1,a1
srl 1,a3
jrnz #ovr ;< 8 now?
jruc #range_ok
#not_max
btst 18,a14 ;bit 2 of int set (=4) ?
jrnz #range_ok
#undr
sll 1,a0
sll 1,a1
sll 1,a14
btst 18,a14 ;bit 2 of int set (=4) ?
jrz #undr
#range_ok
;; addi 08000h,a0 ;round up
srl 16,a0 ;x
;; addi 08000h,a1 ;round up
srl 16,a1 ;y
;#again
; cmpi 8,a0 ;do this before losing fractional
; jrge #tohi
; cmpi 8,a1
; jrlt #ok1
;
;#tohi
; srl 1,a0
; srl 1,a1
; jruc #again
;#ok1
X8 a1 ;y*8
add a1,a0 ;+x
X16 a0 ;16 bit word
add a2,a0
move *a0,a0
#done
rets
#posx_posy
;X 0 1 2 3 4 5 6 7
.word 18,18,18,18,18,18,18,18 ;0
.word 13,09,13,14,15,16,16,16 ;1
.word 09,05,09,11,13,14,14,15 ;2
.word 04,04,07,09,11,12,13,13 ;3
.word 00,03,05,07,09,10,11,12 ;4
.word 00,02,04,06,08,09,10,11 ;5
.word 00,02,04,06,07,08,09,10 ;6
.word 00,02,03,05,06,07,08,09 ;7 Y
#posx_negy
;X 0 1 2 3 4 5 6 7
.word 18,18,18,18,18,18,18,18 ; 0
.word 23,27,23,22,21,20,20,20 ;-1
.word 28,31,27,25,23,22,22,21 ;-2
.word 33,32,29,27,25,24,23,23 ;-3
.word 36,33,31,29,27,26,25,24 ;-4
.word 36,34,32,30,28,27,26,25 ;-5
.word 36,34,32,31,29,28,27,26 ;-6
.word 36,34,33,31,30,29,28,27 ;-7 Y
#*****************************************************************************
flame_table_A
.long BLOOD01 ;0 ( 0d UP)
.long BLOOD01 ;1 ( 5d)
.long BLOOD01 ;2 ( 10d)
.long BLOOD01 ;3 ( 15d)
.long BLOOD02 ;4 ( 20d)
.long BLOOD02 ;5 ( 25d)
.long BLOOD02 ;6 ( 30d)
.long BLOOD03 ;7 ( 35d)
.long BLOOD03 ;8 ( 40d)
.long BLOOD03 ;9 ( 45d UP-RIGHT)
.long BLOOD03 ;10 ( 50d)
.long BLOOD04 ;11 ( 55d)
.long BLOOD04 ;12 ( 60d)
.long BLOOD04 ;13 ( 65d)
.long BLOOD05 ;14 ( 70d)
.long BLOOD05 ;15 ( 75d)
.long BLOOD05 ;16 ( 80d)
.long BLOOD06 ;17 ( 85d)
.long BLOOD06 ;18 ( 90d RIGHT)
.long BLOOD06 ;19 (95d)
.long BLOOD06 ;20 (100d)
.long BLOOD07 ;21 (105d)
.long BLOOD07 ;22 (110d)
.long BLOOD07 ;23 (115d)
.long BLOOD08 ;24 (120d)
.long BLOOD08 ;25 (125d)
.long BLOOD08 ;26 (130d)
.long BLOOD08 ;27 (135d DOWN-RIGHT)
.long BLOOD09 ;28 (140d)
.long BLOOD09 ;29 (145d)
.long BLOOD09 ;30 (150d)
.long BLOOD10 ;31 (155d)
.long BLOOD10 ;32 (160d)
.long BLOOD10 ;33 (165d)
.long BLOOD11 ;34 (170d)
.long BLOOD11 ;35 (175d)
.long BLOOD11 ;36 (180d DOWN)
#*****************************************************************************
STRUCT 0
WORD DB_LOOP
WORD DB_COUNT
WORD DB_SLEEP
WORD DB_RXOFF
WORD DB_RYOFF
WORD DB_RZOFF
LONG DB_XVEL
LONG DB_YVEL
LONG DB_ZVEL
LONG DB_RXVEL
LONG DB_RYVEL
LONG DB_RZVEL
LONG DB_GRAVITY
WORD DB_LIFESPAN
WORD DB_RLIFESPAN
STRUCTPD
WORD #ANIM
; a8 = * arguments
; a11 = * wrestler proc
SUBR react_debris
move *a8(0),a0 ;%chance of generating debris
calla RNDPER
jrls #die
;if there's too much debris already, don't do anything.
move @debris_count,a14
cmpi DEBRIS_MAX,a14
jrge #die
;increment global debris count
move @debris_count,a14
inc a14
move a14,@debris_count
move *a11(WRESTLERNUM),a10 ;table index
SLL 5,A10
ADDI WHICH_DEBRIS_SOUND,A10,L
MOVE *A10,A10,L
MOVE *A10+,A0
JRZ NO_SOUND_AT_ALL
CALLA RNDRNG0
DONT_WORRY_ABOUT_RANDOM
SLL 4,A0
ADD A0,A10
MOVE *A10,A0
JRZ NO_SOUND_AT_ALL
CALLA triple_sound
NO_SOUND_AT_ALL
move *a8(010h),a10 ;table index
X32 a10
addi #debris_table,a10
move *a10,a10,L
addi 20h,a8 ;* x,y,z off
move *a10(DB_LOOP),a9 ;loop count
#lp1
move *a10(DB_COUNT),a0 ;# per loop
#lp2
PUSH a0
movi 7,a0
calla RNDRNG0
X32 a0
move *a11(WRESTLERNUM),a14
cmpi 2,a14
jrnz #not_und
move *a11(ANIBASE),a1,L
.ref und_4_pin2_anim
cmpi und_4_pin2_anim,a1
jrnz #not_und
mmtm sp,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a14
movi 0cfh,a0 ;bat sound
calla triple_sound
mmfm sp,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a14
movi 8*32,a0
#not_und
X32 a14
addi debris_anims,a14
move *a14,a14,L
add a14,a0
move *a0(0),*a13(#ANIM),L
CREATE DEBRIS_PID,react_debris2
move *a13(#ANIM),*a0(SP_ANIMPTR),L ;&anim
PULL a0
dsj a0,#lp2
move *a10(DB_SLEEP),a0 ;sleep cnt
jrz #skp
calla PRCSLP
#skp
dsj a9,#lp1
#exit
;decrement global debris count
move @debris_count,a14
dec a14
move a14,@debris_count
#die DIE
WHICH_DEBRIS_SOUND
.long BRET_DEBRIS
.long RAZOR_DEBRIS
.long TAKER_DEBRIS
.long YOKO_DEBRIS
.long SHAWN_DEBRIS
.long BAM_DEBRIS
.long DOINK_DEBRIS
.long 0
.long LEX_DEBRIS
;BRET_DEBRIS
; .WORD 0
YOKO_DEBRIS
.WORD 3,0d9h,0dah,0dbh,0dch
BRET_DEBRIS
SHAWN_DEBRIS
.WORD 1,0d7h,0d8h
BAM_DEBRIS
.WORD 4,09dh,09eh,09fh,0a0h,0a1h
DOINK_DEBRIS
.WORD 1,04EH,04FH
TAKER_DEBRIS
.WORD 4,09dh,09eh,09fh,0a0h,0a1h
LEX_DEBRIS
RAZOR_DEBRIS
.WORD 1,0cdh,0c6h
#debris_table
.long #db0
.long #db1
.long #db2
.long #db3
.long #db4
.long #db5
.long #db6
.long #db7
#db0 ;standing - hit to body 1
.word 3,1,2 ;loop count, # per loop, sleep cnt
.word 0,20,0 ;random +/- x,y,z pos offs
.long -020000h,050000h, 000000h ;initial x,y,z vel
.long 018000h, 010000h, 010000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 60,5 ;lifespan, +/- rand
#db1 ;onground - hit to body 1
.word 2,2,4 ;loop count, # per loop, sleep cnt
.word 20,0,0 ;random +/- x,y,z pos offs
.long 000000h, 080000h, 000000h ;initial x,y,z vel
.long 020000h, 020000h, 020000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 70,5 ;lifespan, +/- rand
#db2 ;standing - hit to head 1
.word 2,1,3 ;loop count, # per loop, sleep cnt
.word 0,5,0 ;random +/- x,y,z pos offs
.long -030000h,050000h, 000000h ;initial x,y,z vel
.long 018000h, 010000h, 010000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 60,5 ;lifespan, +/- rand
#db3 ;standing - hit to head 2
.word 1,1,0 ;loop count, # per loop, sleep cnt
.word 0,5,0 ;random +/- x,y,z pos offs
.long -030000h,050000h, 000000h ;initial x,y,z vel
.long 018000h, 010000h, 010000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 60,5 ;lifespan, +/- rand
#db4 ;Doink earslap squish
.word 2,3,2 ;loop count, # per loop, sleep cnt
.word 20,0,0 ;random +/- x,y,z pos offs
.long 000000h, 080000h, 000000h ;initial x,y,z vel
.long 020000h, 020000h, 020000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 70,5 ;lifespan, +/- rand
#db5 ;BAM POGO head slammed into ground
.word 2,2,3 ;loop count, # per loop, sleep cnt
.word 10,10,0 ;random +/- x,y,z pos offs
.long 000000h, 080000h, 000000h ;initial x,y,z vel
.long 020000h, 020000h, 020000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 70,5 ;lifespan, +/- rand
#db6 ;BAM BAM fire head butt - Comes from Bam Bam attack sequence!
.word 2,1,3 ;loop count, # per loop, sleep cnt
.word 0,5,0 ;random +/- x,y,z pos offs
.long -030000h,050000h, 000000h ;initial x,y,z vel
.long 018000h, 010000h, 010000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 60,5 ;lifespan, +/- rand
#db7 ;onground - Taker pins me with hand
.word 8,2,4 ;loop count, # per loop, sleep cnt
.word 15,0,0 ;random +/- x,y,z pos offs
.long 000000h, 040000h, 000000h ;initial x,y,z vel
.long 020000h, 020000h, 020000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 70,5 ;lifespan, +/- rand
#*****************************************************************************
; a8 = * x,y,z off
; a10 = * debris table
; a11 = * wrestler proc
SUBR react_debris2
;if there's too much debris already, don't do anything.
move @debris_count,a14
cmpi DEBRIS_MAX,a14
jrge #die
;increment global debris count
move @debris_count,a14
inc a14
move a14,@debris_count
move a11,*a13(SP_WRESPROC),L
move *a11(PLYR_SIDE),*a13(SP_PLYR_SIDE)
move *a10(DB_RXOFF),a0 ;+/- xoff
jrz #skp0
calla RNDRNGS
#skp0 move *a8,a1 ;xoff
add a0,a1
move *a11(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip1
neg a1
#no_flip1
move *a11(OBJ_XPOSINT),a0
add a1,a0
sll 16,a0
move a0,*a13(SP_OBJ_XPOS),L
move *a10(DB_RYOFF),a0 ;+/- yoff
jrz #skp1
calla RNDRNGS
#skp1 move *a8(010h),a1 ;yoff
add a0,a1
move *a11(OBJ_YPOSINT),a0
add a1,a0
sll 16,a0
move a0,*a13(SP_OBJ_YPOS),L
move *a10(DB_RZOFF),a0 ;+/- zoff
jrz #skp2
calla RNDRNGS
#skp2 move *a8(020h),a1 ;zoff
add a0,a1
move *a11(OBJ_ZPOSINT),a0
add a1,a0
sll 16,a0
move a0,*a13(SP_OBJ_ZPOS),L
move *a11(INRING),*a13(SP_INRING)
move *a11(GROUND_Y),a0
sll 16,a0
move a0,*a13(SP_GROUND_Y),L
clr a0
move a0,*a13(SP_SHADOW_OBJ),L
move *a10(DB_GRAVITY),*a13(SP_GRAVITY),L
callr sp_create_obj
callr sp_create_shadow
move *a13(SP_OBJ),a8,L
move *a10(DB_RXVEL),a0,L
jrz #skp3
calla RNDRNGS
#skp3 move *a10(DB_XVEL),a1,L
add a0,a1
move *a11(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip2 ;flip relative
neg a1
#no_flip2
move a1,*a13(SP_OBJ_XVEL),L
move *a10(DB_RZVEL),a0,L
jrz #skp4
calla RNDRNGS
#skp4 move *a10(DB_ZVEL),a1,L
add a0,a1
move a1,*a13(SP_OBJ_ZVEL),L
move *a10(DB_RYVEL),a0,L
jrz #skp5
calla RNDRNGS
#skp5 move *a10(DB_YVEL),a1,L
add a0,a1
move a1,*a13(SP_OBJ_YVEL),L
movi sp_standard_bounce,a0
move a0,*a13(SP_HITGND_CODE),L
move *a13(SP_OBJ),a8,L
clr a0
move a0,*a13(SP_DIE)
move *a10(DB_RLIFESPAN),a0
jrz #skp6
calla RNDRNGS
#skp6 move *a10(DB_LIFESPAN),a1
add a0,a1
move a1,*a13(SP_LIFESPAN)
move *a13(SP_ANIMPTR),a0,L ;& anim
calla sp_change_anim
#lp
callr sp_velocity_add
move *a13(SP_HITGND_CODE),a0,L
call a0
callr sp_update_pos
SLEEP 1
callr sp_animate
move *a13(SP_LIFESPAN),a0
dec a0
jrz #die
move a0,*a13(SP_LIFESPAN)
move *a13(SP_DIE),a0
jrz #lp
#die
move *a13(SP_OBJ),a0,L
calla DELOBJ
move *a13(SP_SHADOW_OBJ),a0,L
calla DELOBJ
;decrement global debris count
move @debris_count,a14
dec a14
move a14,@debris_count
DIE
#pin_anims
.long pin_animC1 ;0
.long pin_animC2 ;1
.long pin_animC2 ;2
.long pin_animC3 ;3
.long pin_animC3 ;4
.long pin_animC2 ;5
.long pin_animC2 ;6
.long pin_animC1 ;7
.long pin_animA1 ;0
.long pin_animA2 ;1
.long pin_animA2 ;2
.long pin_animA3 ;3
.long pin_animA3 ;4
.long pin_animA2 ;5
.long pin_animA2 ;6
.long pin_animA1 ;7
debris_anims
.long #bret_debris_anims ;0
.long #razor_debris_anims ;1
.long #taker_debris_anims ;2
.long #yoko_debris_anims ;3
.long #shawn_debris_anims ;4
.long #bam_debris_anims ;5
.long #doink_debris_anims ;6
.long #doink_debris_anims ;7
.long #lex_debris_anims ;8
***
#bret_debris_anims
.long heart_anim ;0
.long glasses_anim ;1
.long glasses1_anim ;2
.long glasses2_anim ;3
.long heart_anim ;4
.long heart_anim ;5
.long heart_anim ;6
.long heart_anim ;7
***
#razor_debris_anims
.long chain_anim ;0
.long bladeR_anim ;1
.long blade_anim ;2
.long bladeR_anim ;3
.long blade_anim ;4
.long bladeR_anim ;5
.long blade_anim ;6
.long bladeR_anim ;7
***
#taker_debris_anims
.long bat_anim ;0
.long bat_anim ;1
.long skull_anim ;2
.long bone_anim ;3
.long bat_anim ;4
.long bat_anim ;5
.long skull_anim ;6
.long bone2_anim ;7
;Special bats only for a pin
.long bat_anim ;8
***
#yoko_debris_anims
.long lamb_anim ;0
.long fish1_anim ;1
.long fish2_anim ;2
.long lamb_anim ;3
.long fish1_anim ;4
.long fish2_anim ;5
.long turkey_anim ;6
.long fish1_anim ;7
***
#shawn_debris_anims
.long heart_anim ;4
.long heart_anim ;5
.long heart_anim ;6
.long heart_anim ;7
.long heart_anim ;7
.long heart_anim ;7
.long heart_anim ;7
.long heart_anim ;7
***
#bam_debris_anims
.long ex_anima1 ;0
.long ex_anima1 ;0
.long ex_anima1 ;0
.long ex_anima1 ;0
.long ex_anima1 ;0
.long ex_anima1 ;0
.long ex_anima1 ;0
.long ex_anima1 ;0
***
#doink_debris_anims
.long pin_animC2 ;0
.long pin_animA2 ;1
.long pin_animC3 ;2
.long ball_anim ;3
.long ball_anim ;4
.long pin_animA2 ;5
.long pin_animC3 ;6
.long pin_animA3 ;7
***
#lex_debris_anims
.long dbell_anim ;0
.long star_anim ;1
.long dbell_anim ;2
.long star_anim ;3
.long dbell_anim ;4
.long star_anim ;5
.long dbell_anim ;6
.long star_anim ;7
#*****************************************************************************
; a8 = * arguments
; a11 = * wrestler proc
SUBR und_tombbits2
move @no_debris,a14
jrnz #no_bab
move @reduce_bog,a14
jrnz #no_bab
movk 4,a9
#lp2
movi #tmb_debris2,a10
movi #xyz_off2,a8
CREATE DEBRIS_PID,react_debris2
movi tombbit_anim,a14
move a14,*a0(SP_ANIMPTR),L ;&anim
movi #tmb_debris2,a10
movi #xyz_off2,a8
CREATE DEBRIS_PID,react_debris2
movi tombbit_anim,a14
move a14,*a0(SP_ANIMPTR),L ;&anim
SLEEPK 1
dsj a9,#lp2
#no_bab
DIE
SUBR und_tombbits
move @no_debris,a14
jrnz #no_bab
move @reduce_bog,a14
jrnz #no_bab
movk 3,a9
#lp
movi #tmb_debris,a10
movi #xyz_off,a8
CREATE DEBRIS_PID,react_debris2
movi tombbit_anim,a14
move a14,*a0(SP_ANIMPTR),L ;&anim
SLEEPK 1
dsj a9,#lp
DIE
#xyz_off .word 91,97,0
#xyz_off2 .word 58,8,0
#tmb_debris
.word 2,3,2 ;loop count, # per loop, sleep cnt
.word 20,0,0 ;random +/- x,y,z pos offs
.long 000000h, 050000h, 000000h ;initial x,y,z vel
.long 020000h, 020000h, 020000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 60,5 ;lifespan, +/- rand
#tmb_debris2
.word 3,3,1 ;loop count, # per loop, sleep cnt
.word 20,0,0 ;random +/- x,y,z pos offs
.long 000000h, 050000h, 000000h ;initial x,y,z vel
.long 010000h, 020000h, 010000h ;random +/- x,y,z vel
.long GRAVITY ;gravity value
.word 30,5 ;lifespan, +/- rand
#*****************************************************************************
BELOW .EQU 16*2
NEXT .EQU 60*2
.long 0,0,NEXT
TEXT_LIST
;software & design
.long #LINESD,0,BELOW
.long #LINESD1,0,BELOW
.long #LINESD2,0,BELOW
.long #LINESD3,0,BELOW
.long #LINESD4,0,BELOW
.long #LINESD5,0,NEXT
;art & design
.long #LINEAD,0,BELOW
.long #LINEAD1,0,BELOW
.long #LINEAD2,0,BELOW
.long #LINEAD3,0,BELOW
.long #LINEAD4,0,NEXT
;music & sound
.long #LINEMS,0,BELOW
.long #LINEMS1,0,NEXT
;hardware design
.long #LINEHD,0,BELOW
.long #LINEHD1,0,BELOW
.long #LINEHD2,0,BELOW
.long #LINEHD3,0,BELOW
.long #LINEHD4,0,BELOW
.long #LINEHD5,0,NEXT
;art tools
.long #LINEAT,0,BELOW
.long #LINEAT1,0,BELOW
.long #LINEAT2,0,BELOW
.long #LINEAT3,0,BELOW
.long #LINEAT4,0,NEXT
;hardware support
.long #LINEHS,0,BELOW
.long #LINEHS1,0,BELOW
.long #LINEHS2,0,BELOW
.long #LINEHS3,0,BELOW
.long #LINEHS4,0,NEXT
;sound system
.long #LINESS,0,BELOW
.long #LINESS1,0,BELOW
.long #LINESS2,0,NEXT
;game testers
.long #LINEGT,0,BELOW
.long #LINEGT1,0,BELOW
.long #LINEGT2,0,NEXT
;special thanks
.long #LINEST,0,BELOW
.long #LINEST1,0,BELOW
.long #LINEST2,0,BELOW
.long #LINEST3,0,BELOW
.long #LINEST4,0,BELOW
.long #LINEST5,0,BELOW
.long #LINEST6,0,BELOW
.long #LINEST7,0,BELOW
.long #LINEST8,0,BELOW
.long #LINEST9,0,BELOW
.long #LINEST10,0,NEXT
;more special thanks
.long #LINECP,0,BELOW
.long #LINECP1,0,BELOW
.long #LINECP2,0,BELOW
.long #LINECP3,0,BELOW+280
; .long #LINECP4,0,BELOW
; .long #LINECP5,0,BELOW
; .long #LINECP6,0,BELOW
; .long #LINECP7,0,BELOW+280
; .long #LINECP8,0,BELOW
; .long #LINECP9,0,BELOW
; .long #LINECP10,0,BELOW+280
.long -1
#SETUP_LINE
JAM_STR osgemd_ascii,10,0,200,-30,RUBYPAL,print_string_C2
#LINESD
.byte "SOFTWARE & DESIGN",0,0
.even
#LINESD1
.byte "MARK TURMELL",0,0
.even
#LINESD2
.byte "JASON SKILES",0,0
.even
#LINESD3
.byte "JAMIE RIVETT",0,0
.even
#LINESD4
.byte "JAKE SIMPSON",0,0
.even
#LINESD5
.byte "SHAWN LIPTAK",0,0
.even
#LINESD6
.byte "MIKE LYNCH",0,0
.even
#LINEAD
.byte "ART & DESIGN",0,0
.even
#LINEAD1
.byte "SAL DIVITA",0,0
.even
#LINEAD2
.byte "JOSH TSUI",0,0
.even
#LINEAD3
.byte "EUGENE GEER",0,0
.even
#LINEAD4
.byte "TONY GOSKIE",0,0
.even
#LINEMS
.byte "MUSIC & SOUND EFFECTS",0,0
.even
#LINEMS1
.byte "CHRIS GRANNER",0,0
.even
#LINEHD
.byte "HARDWARE DESIGN",0,0
.even
#LINEHD1
.byte "MARK LOFFREDO",0,0
.even
#LINEHD2
.byte "CARY MEDNICK",0,0
.even
#LINEHD3
.byte "STEVE CORRELL",0,0
.even
#LINEHD4
.byte "JOE KALINOWSKI",0,0
.even
#LINEHD5
.byte "JOHN LOWES",0,0
.even
#LINEAT
.string "ARTWORK TOOLS",0,0
.even
#LINEAT1
.string "WARREN DAVIS",0,0
.even
#LINEAT2
.string "SHAWN LIPTAK",0,0
.even
#LINEAT3
.string "TODD ALLEN",0,0
.even
#LINEAT4
.string "ALIAS RESEARCH",0,0
.even
#LINEHS
.byte "HARDWARE SUPPORT",0,0
.even
#LINEHS1
.byte "PAT COX",0,0
.even
#LINEHS2
.byte "SHERIDAN OURSLER",0,0
.even
#LINEHS3
.byte "AL LASKO",0,0
.even
#LINEHS4
.byte "JEFF PETERS",0,0
.even
#LINESS
.byte "DCS SOUND SYSTEM",0,0
.even
#LINESS1
.byte "MATT BOOTY",0,0
.even
#LINESS2
.byte "ED KEENAN",0,0
.even
#LINEGT
.byte "GAME TESTERS",0,0
.even
#LINEGT1
.byte "EDDIE FERRIER",0,0
.even
#LINEGT2
.byte "MIKE VINIKOUR",0,0
.even
#LINEST
.byte "SPECIAL THANKS",0,0
.even
#LINEST1
.byte "JOHN TOBIAS",0,0
.even
#LINEST2
.byte "MARK PENACHO",0,0
.even
#LINEST3
.byte "ED BOON",0,0
.even
#LINEST4
.byte "EUGENE JARVIS",0,0
.even
#LINEST5
.byte "L.E.D.",0,0
.even
#LINEST6
.byte "GEORGE PETRO",0,0
.even
#LINEST7
.byte "JEFF JOHNSON",0,0
.even
#LINEST8
.byte "JOHN NEWCOMER",0,0
.even
#LINEST9
.byte "JON HEY",0,0
.even
#LINEST10
.byte "MIDWAY MANAGEMENT",0,0
.even
#LINECP
.byte "A SPECIAL THANK YOU",0,0
.even
#LINECP1
.BYTE "CATHY SIMPSON",0,0
.EVEN
#LINECP2
.BYTE "CRISTY TSUI",0,0
.EVEN
#LINECP3
.BYTE "WEI LIN GEER",0,0
.EVEN
;#LINECP8
; .BYTE "ZIPPER & KASHA",0,0
; .EVEN
;#LINECP9
; .BYTE "KRALOR EMP TASS & EVIL",0,0
; .EVEN
;#LINECP10
; .BYTE "AND ALL THE CSERVE GUYS",0,0
; .EVEN
#hstd_mod
.long slateBMOD
.word 0,0
.long 0
;#title_mod
; .long LAVAPGBMOD
; .word 0,0
.long 0
#LIST_START .equ PDATA+20H
SUBR CREATE_TEXT_LINE
JSRP GENERIC_DISPLAY
MOVI TEXT_LIST,A8
MOVI TYPTEXT+1,A10
CREATE0 ck_octopus2
MOVI #SETUP_LINE,A2
CALLA setup_message
small_loop
MOVE *A8+,A4,L
INC A4
JRZ LAST_ONE
DEC A4
MOVE A10,@mess_objid
MOVI GOLD,A3
MOVE *A8(-040H),A0
CMPI NEXT,A0
JRNE PAL_IS_SET
MOVI RUBYPAL,A3
PAL_IS_SET
MOVE A3,@message_palette,L
CALLA print_string_C2
MOVI 179,A9
CREATE MESSAGE_PID,MAKE_TEXT_MOVE
MOVE *A8+,A5,L
JRZ NO_NEW_BACK
CALLA CLEAR_BAKGROUND_OBJ
NO_NEW_BACK
MOVE *A8+,A0,L
CALLA PRCSLP
INC A10
jruc small_loop
LAST_ONE
RETP
CLEAR_BAKGROUND_OBJ
PUSH A8
CALLA ZERO_BITS
move @BAKLST,A0,L ;Null backgnd object list
MOVE *A0,A0,L
JRZ NO_DELETE_IT
MORE_TO_DELETE
MOVE *A0,A9,L
CALLA DELBOBJ
MOVE A9,A0
JRNZ MORE_TO_DELETE
NO_DELETE_IT
MOVE A5,@BAKMODS,L
CALLA BGND_UD1
PULL A8
RETS
MAKE_TEXT_MOVE
; MOVE @mess_objid,A10
CALLR FIND_ALL_TEXT
ROTATE_TEXT
SLEEP 2
CALLR WORK_OUT_LINE_Y_AND_SCALE
CALLR PUT_IN_SCALE_AND_YPOS
DEC A9
JRNN ROTATE_TEXT
MOVE A10,A0
CALLA obj_del1c
DIE
FIND_ALL_TEXT
MOVI OBJLST,A14
MOVE A13,A2
ADDI #LIST_START,A2
JRUC PICK_UP_NEXT
CHECK_AGAINST_NEXT
MOVE *A14(OID),A1
CMP A10,A1
JRNE PICK_UP_NEXT
MOVE A14,*A2+,L
MOVE *A14(OXPOS),A1
SUBI 200,A1
MOVE A1,*A14(OMISC)
PICK_UP_NEXT
MOVE *A14,A14,L
JRNZ CHECK_AGAINST_NEXT
MOVE A14,*A2,L
RETS
PUT_IN_SCALE_AND_YPOS
MOVE A13,A2
ADDI #LIST_START,A2
POS_NEXT_OBJ
MOVE *A2+,A8,L
JRZ REACHED_END_OF_LIST
MOVE A1,*A8(OYPOS)
MOVE A3,*A8(OSCALE+010H)
MOVE A4,*A8(OSCALE)
MOVE *A8(OMISC),A7
MOVI 10000H,A5
DIVU A4,A5
MPYU A5,A7
SRL 8,A7
ADDI 200,A7
MOVE A7,*A8(OXPOS)
JRUC POS_NEXT_OBJ
REACHED_END_OF_LIST
RETS
;IN
;A9=ANGLE
;OUT
;A1=Y_COOR
;A3=Y SCALE
;A4=X SCALE
Y_CENTER .EQU 070H
WORK_OUT_LINE_Y_AND_SCALE
MOVE A9,A14
SLL 4,A14
ADDI SIN_TABLE,A14
MOVE *A14,A1
NEG A1
SLL 32-8,A1
SRL 32-8,A1
MOVE A1,A5
MOVI Y_CENTER,A3
MPYS A3,A1
SRL 8,A1
CMPI 90,A9
JRLT Y_POSITION_CORRECT
MOVI Y_CENTER,A0
SUB A1,A0
MOVE A0,A1
ADDI Y_CENTER,A1
Y_POSITION_CORRECT
ADDI 10,A1
MOVI 10000H,A3
DIVU A5,A3
CMPI 0B00H,A3
JRLT NO_SCALE_PROBLEM
MOVI 0B00H,A3
NO_SCALE_PROBLEM
MOVE A3,A5
SUBI 100H,A5
movk 18H,A7
DIVU A7,A5
ADDI 100H,A5
MOVE A5,A4
RETS
;this sin table is in decimal and goes from sin(0) to sin (89). It has been
;multiplyed by 256 in order to get an interger figure for each value. To
;implement, use the angle as an offset into the table and then multiply
;radius by value gained. Then divide result by 256 (ie rotate right 8 bits)
;and you have your value. To use as a cosine table use offset as a negative
;offset (-1) and come in from end of table backwards.O.K.!!!
SIN_TABLE:
.WORD 255,255,255,255,254,254,253,253,252,252
.WORD 251,250,249,248,247,246,244,243,242,240
.WORD 238,237,235,233,232,230,228,226,223,221
.WORD 219,217,214,212,209,207,204,201,198,196
.WORD 193,190,187,184,181,177,174,171,167,164
.WORD 161,157,154,150,146,143,139,135,131,128
.WORD 124,120,116,112,108,104,100,95,91,87
.WORD 83,79,74,70,66,61,57,53,48,44
.WORD 40,35,31,26,22,17,13,8,4,1
.WORD 4,8,13,17,22,26,31,35,40
.WORD 44,48,53,57,61,66,70,74,79,83
.WORD 87,91,95,100,104,108,112,116,120,124
.WORD 128,131,135,139,143,146,150,154,157,161
.WORD 164,167,171,174,177,181,184,187,190,193
.WORD 196,198,201,204,207,209,212,214,217,219
.WORD 221,223,226,228,230,232,233,235,237,238
.WORD 240,242,243,244,246,247,248,249,250,251
.WORD 252,252,253,253,254,254,255,255,255,255
.WORD 255
#*******************************
* Look at the buttons, read a sequence table,
* and set octopus2 flag if sequence successful
SUBR ck_octopus2
clr a10
movi butn_lst,a9
#lp SLEEPK 1
; move @SWITCH,a0
move @_switch_addr,a0,L
move *a0,a0
zext a0
cmpi >ffff,a0
jrnz #tag1
clr a11
jruc #lp
#tag1 move a11,a11
jrnz #lp
inc a11
move *a9,a1,W
zext a1
cmp a0,a1
jrz #yes
movi butn_lst,a9
jruc #lp
#yes addk 16,a9
move *a9,a0
jrnz #lp
movk 1,a0
move a0,@octopus2
DIE
butn_lst
;Buttons required for 2nd octopus:
P1_P .EQU 0FFEFH
P1_PP .EQU 0FFBFH
P1_B .EQU 0FFDFH
P2_P .EQU 0EFFFH
P2_PP .EQU 0BFFFH
P2_B .EQU 0DFFFH
.word P1_P,P1_P,P1_P,P1_PP,P1_PP,P1_B
.word P2_PP,P2_PP,P2_PP,P2_P,P2_P,P2_B,0
******************************************************************************
*
* Called every tick by wrestler_main
*
* Figure out if we should be getting hurt for being out of the ring. If
* we should, administer the damage and, if we die from it, fire off the
* round end stuff.
*
* Old method: DEC_TIMER is ticks before you start taking hurts. When you're
* thrown from the ring, it's set. Also, when anyone else climbs into the
* ring, it's reset. If you're out alone and this is zero, you take hurts
* on every eighth tick.
*
* New method: RING_TIME holds the number of consecutive ticks you've been
* inside the ring. If you're outside, the count is negative. If you've been
* outside the ring for #out_time ticks and every member of the other team
* has been inside for #out_time, you take hurts. Note that this includes
* both live and dead members of the other team. If someone dies while
* outside the ring, their RING_TIME is set to 1 and increments from there
* as though he was inside the ring, so that when you kill one member of
* a team outside, you don't immediately start taking damage if all his
* teammates are cowering inside the ring. The clock is ticking, though.
* As before, lose one health point every eight ticks.
*
* Complications: Sometimes dead drones get their processes KO'd. This means
* that their RING_TIMEs stop incrementing. In the loop where we check
* opponent RING_TIMEs, check for sleeping drones and subtract their PTIME
* from 7FFF (the initial KO value) and add this value to their RING_TIME.
*
#out_time .equ TSEC*7
SUBRP do_ringout_dufus
move @ring_out_on,a14
jrnz #drd_exit
cmpi -(#out_time-(TSEC*3)),a0 ; Has he been out for 4 secs?
jrge #drd_exit ; br = no
PUSH a0,a1,a2,a3,a7,a9,a10
move *a13(PLYR_SIDE),a0 ; Check to see if opp are out?
movk NUM_WRES,a1
movi process_ptrs,a2
#loopa move *a2+,a3,L
jrz #nxta ;skip - inactive
move *a3(PLYR_SIDE),a14
cmp a14,a0
jreq #nxta ;skip - teammate
move *a3(RING_TIME),a14
cmpi #out_time-(TSEC*3),a14 ;In ring > 4 seconds?
jrle #drd_done ;no pain - opponent not inside long enough
#nxta
dsj a1,#loopa
#do_dufus
; move a1,a1
; jrz #drd_done
movk 3,a9 ;msg number "Get back in dummy"
move a13,a10 ;Player process ptr
CREATE 4000h|AWARD_PID,dufus_msg_on
#drd_done
PULL a0,a1,a2,a3,a7,a9,a10
#drd_exit
rets
;a9 = *player going over ropes
SUBRP kill_when_hit_ground
move *a9(GROUND_Y),a10
move *a9(OBJ_YPOSINT),a11
cmp a10,a11
jrz #kill_him
SLEEPK 1
jruc kill_when_hit_ground
#kill_him
movi -150,a0
move *a9(PLYRNUM),a1
clr a10
calla adjust_health
DIE
SUBR ARE_WE_IN_RING
;don't do anthing if HALT is set
move @HALT,a14
jrnz #done
;first see if we're dead - that uses a special routine
move *a13(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #dead
;see if all our opponents are dead - the short way to do this
; is to check closest_num, since dead ones will never be picked
; if there are any live ones.
move *a13(CLOSEST_NUM),a14
X32 a14
addi process_ptrs,a14
move *a14,a14,L
move *a14(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #done
;adjust RING_TIME
move *a13(RING_TIME),a0
jrn #p_out
;we were inside last tick
inc a0
move *a13(INRING),a14
jrz #rt_ok
;we've moved outside. init to -1
movi -1,a0
move @ring_out_on,a14
jrz #ring_outs_off
move a13,a9
CREATE0 kill_when_hit_ground
#ring_outs_off
jruc #rt_ok
#p_out ;we were outside last tick
dec a0
move *a13(INRING),a14
jrnz #rt_ok
;we've moved inside. init to 1
movk 1,a0
; jruc #rt_ok
#rt_ok ;a0 is now set to new RING_TIME. write it back
move a0,*a13(RING_TIME)
;quit if RING_TIME is greater than (or equal to) #out_time, which
; means we're either inside our haven't been outside long enough
; to get hurt.
callr do_ringout_dufus
cmpi -#out_time,a0
jrge #done
;proceed only on every eighth tick, for a loss rate of around
; 7 pixels per second.
move @PCNT,a14 ;check low three bits of PCNT
sll 32-3,a14
jrnz #done
;uh-oh. potential pain here. loop through wrestler procs, and
; quit if we spot anyone from the other team with a RING_TIME less
; than or equal to #out_time, means that they're either outside
; or haven't been inside long enough for us to get hurt.
move *a13(PLYR_SIDE),a0
movk NUM_WRES,a1
movi process_ptrs,a2
#loop0 move *a2+,a3,L
jrz #nxt0 ;skip - inactive
move *a3(PLYR_SIDE),a14
cmp a14,a0
jreq #nxt0 ;skip - teammate
move *a3(RING_TIME),a14
;if opponent is a sleeping drone, add (7fff-PTIME) to a14.
move *a3(PTIME),a4
cmpi 1,a4
jreq #nosleephack
;sleeping drone
neg a4
addi >7FFF,a4
add a4,a14
#nosleephack
cmpi #out_time,a14
jrle #done ;no pain - opponent not inside long enough
#nxt0 dsj a1,#loop0
;if we've fallen through to here, it's time to take some hurt.
movi -1,a0
move *a13(PLYRNUM),a1
clr a10
calla adjust_health
jrnc #done ;still alive
;DEATH BY RING-OUT!
;do we need to start an animation here or does adjust_health take
; care of that for us?
#ring_out_death
SETMODE DEAD
;if we have any living teammates, go home right now. if we're
; the only one left, do the disqual stuff.
;loop through processes looking for a living teammate (or a zombie)
move *a13(PLYR_SIDE),a0
movk NUM_WRES,a1
movi process_ptrs,a2
#loop1 move *a2+,a3,L
jrz #nxt1 ;skip - inactive
cmp a3,a13
jreq #nxt1 ;skip - self
move *a3(PLYR_SIDE),a14
cmp a14,a0
jrne #nxt1 ;skip - not a teammate
move *a3(PLYRMODE),a14
cmpi MODE_DEAD,a14
jrne #done ;found a living teammate - skip disqual
move *a3(STATUS_FLAGS),a14
btst B_ZOMBIE,a14
jrnz #done ;found a zombie - skip disqual
#nxt1 dsj a1,#loop1
CREATE CYCPID,CREATE_DISQUAL
CREATE ANNC_PID,announce_rnd_winner
.if DEBUG
move a13,*a0(PDATA),L ;#CREATOR (pdata)
movi $,a14
move a14,*a0(PDATA+20h),L ;#ORIGIN
.endif
#done rets
#dead ;oops - we're dead. If RING_TIME is negative, we've just died
; outside the ring and we need to set it to 1. If it's positive,
; just increment it and go home
move *a13(RING_TIME),a0
jrp #inc
clr a0
#inc inc a0
move a0,*a13(RING_TIME)
rets
#*****************************************************************************
* Stuff to deal with changed skirt pallettes
SUBR INIT_SKIRTS
MOVI SKIRTS_DEST,A9
MOVK 4,A10
INIT_NEXT_SKIRT_PAL
MOVE *A9+,A0,L
CALLA pal_getf
DSJS A10,INIT_NEXT_SKIRT_PAL
RETS
SUBR CHANGE_SKIRTS2
; move @match_cnt,a14
; dec a14
; andi 07h,a14
; janz SUCIDE
MOVE @WHICH_SKIRT_PAL,A0
JRUC SKIRT_RENTER
SUBR CHANGE_SKIRTS
; move @match_cnt,a14
; dec a14
; andi 07h,a14
; janz SUCIDE
MOVE @WHICH_SKIRT_PAL,A0
JRZ RANDOM_SKIRT
DEC A0
JRUC NO_NEED_TO_RAND_SKIRT
RANDOM_SKIRT
MOVK 1,A0
MOVE A0,@WHICH_SKIRT_PAL
movi 50,a0
calla RNDPER
jals SUCIDE
MOVK 8,A0
CALLA RNDRNG0
NO_NEED_TO_RAND_SKIRT
MOVE A0,@WHICH_SKIRT_PAL
SKIRT_RENTER
SLL 7,A0
ADDI SKIRTS,A0
MOVE A0,A8
MOVI SKIRTS_DEST,A9
MOVI CHANGE_NUMBERS,A11
MOVK 4,A10
CHANGE_NEXT_PAL
MOVE *A9+,A0,L
CALLA pal_find
SRL 7,A0
SLL 7,A0
MOVE *A11+,A1
OR A0,A1
MOVE *A8+,A0,L
ADDI 010H,A0
MOVE *A11+,A2
DO_PAL_AGAIN
CALLA pal_set
JRNZ SETUP_NEXT_ONE
;FOR SOME REASON WE CANT SEEM TO RE-DO THIS PAL
;JUST HIT "GO"
.IF DEBUG
LOCKUP
.ENDIF
PUSHP A0,A1,A2
SLEEPK 1
PULLP A0,A1,A2
JRUC DO_PAL_AGAIN
SETUP_NEXT_ONE
DSJS A10,CHANGE_NEXT_PAL
DIE
CHANGE_NUMBERS
.WORD 0,21
.WORD 0,32
.WORD 30,48
.WORD 0,38
SKIRTS_DEST
.LONG matl_P,NUGRND_P,NUGRND_P,DKCUR_P ;purple
SKIRTS
;BLUE_SKIRT
.LONG matl_P,NUGRND_P,CURTREDP,DKCURRP ;red
.LONG matl_P,NUGRND_P,NUGRND_P+(30*16),DKCUR_P ;purple
;RED_SKIRT
.LONG MTRIMRP,RSKIRTRP,CURTBLUP,DKCURBP ;blue
.LONG MTRIMRP,RSKIRTRP,NUGRND_P+(30*16),DKCUR_P ;purple
;BLACK_SKIRT
.LONG MTRIMWP,RSKIRTWP,CURTBLUP,DKCURBP ;blue
.LONG MTRIMWP,RSKIRTWP,NUGRND_P+(30*16),DKCUR_P ;purple
.LONG MTRIMWP,RSKIRTWP,CURTREDP,DKCURRP ;red
;PURPLE_SKIRT
.LONG MTRIMPP,RSKIRTPP,CURTBLUP,DKCURBP ;blue
.LONG MTRIMPP,RSKIRTPP,CURTREDP,DKCURRP ;red
CURTBLUP:
.word 48
.word 00000h,02112h,01d12h,01cf1h,018d1h,018d0h,014d0h,014b0h
.word 010afh,0108fh,00c8eh,00c6eh,00c6eh,0084dh,0084dh,0084ch
.word 0042ch,0042ch,0042bh,0042bh,0042bh,0000bh,0000bh,0000ah
.word 0000ah,0000ah,0000ah,0000ah,0000ah,00009h,00009h,00009h
.word 00009h,00009h,00008h,00008h,00008h,00007h,00007h,00007h
.word 00007h,00006h,00006h,00006h,00005h,00005h,00005h,00005h
CURTREDP:
.word 48
.word 00000h,04508h,044e7h,040c6h,040c6h,040a5h,03c84h,03c84h
.word 03c63h,03863h,03842h,03842h,03421h,03421h,03400h,03000h
.word 03000h,03000h,02c00h,02c00h,02c00h,02c00h,02c00h,02800h
.word 02800h,02800h,02800h,02800h,02400h,02400h,02400h,02400h
.word 02400h,02400h,02000h,02000h,02000h,01c00h,01c00h,01c00h
.word 01800h,01800h,01800h,01400h,01400h,01400h,01000h,01000h
DKCURBP:
.word 38
.word 00000h,004aah,0048ah,00469h,0048ah,00469h,00449h,00448h
.word 0044ah,00449h,00427h,00448h,00428h,00427h,00407h,00428h
.word 00406h,00426h,00406h,00406h,00405h,00407h,00405h,00406h
.word 00405h,00404h,00406h,00405h,00404h,00405h,00403h,00404h
.word 00403h,00404h,00402h,00404h,00403h,00403h
DKCURRP:
.word 38
.word 00000h,02400h,02400h,02400h,02400h,02400h,02400h,02400h
.word 01c00h,01c00h,02400h,01c00h,01c00h,01c00h,01c00h,01c00h
.word 01c00h,01c00h,01c00h,01c00h,01c00h,01400h,01c00h,01400h
.word 01c00h,01c00h,01400h,01400h,01400h,01400h,01400h,01400h
.word 01400h,01400h,01400h,00c00h,00c00h,00c00h
MTRIMPP:
.word 21
.word 00000h,06ebeh,06a5dh,0661ch,061bch,05d7bh,0593ah,054f9h
.word 054b8h,05078h,05037h,04c16h,03c14h,03811h,0300fh,02c0dh
.word 0280ch,0240bh,0200ah,01c09h,01c08h
MTRIMRP:
.word 21
.word 00000h,07f39h,07ab5h,07652h,071efh,06d8ch,06929h,064c6h
.word 06084h,05c21h,05800h,05000h,04800h,04000h,03400h,03000h
.word 03000h,02c00h,02800h,02800h,02400h
MTRIMWP:
.word 21
.word 00000h,06f7bh,06739h,05ef8h,056b6h,04e74h,04633h,041f1h
.word 039afh,0318eh,02d4ch,0294bh,0252ah,02509h,02108h,01ce8h
.word 018c7h,018c6h,014a5h,01084h,00c63h
RSKIRTPP:
.word 31
.word 00000h,06ebeh,06a7dh,0663ch,065fch,061bbh,0619ah,05d5ah
.word 05d39h,058f8h,054d8h,05497h,05077h,05036h,04c16h,04c15h
.word 04414h,04012h,03811h,0340fh,0300eh,0280ch,0240bh,01c0ah
.word 0200ah,01c09h,01408h,01007h,00805h,00804h,00803h
RSKIRTRP:
.word 31
.word 00000h,076b5h,07273h,07231h,06defh,06dadh,0698ch,0694ah
.word 06529h,064e7h,060c6h,06084h,05c63h,05c42h,05800h,05800h
.word 05000h,04c00h,04400h,04000h,03c00h,03400h,03000h,02800h
.word 02400h,02000h,01800h,01400h,00c00h,00800h,00400h
RSKIRTWP:
.word 31
.word 00000h,06b59h,06718h,05ef7h,05ad6h,05294h,04e73h,04a32h
.word 04611h,03df0h,039cfh,035aeh,0316ch,02d4bh,0292ah,02509h
.word 02109h,020e8h,01ce7h,01ce7h,01cc6h,018c6h,018c5h,014a5h
.word 014a4h,01084h,01083h,01083h,00c63h,00c63h,00c63h
#********************************
SUBR BROKEN_ARM_BLOOD
move @no_debris,a14
jrnz #no_bab
move @reduce_bog,a14
jrnz #no_bab
MOVE *A13(WHOIHIT),A11,L
movk M_FLIPH,A9
CREATE DEBRIS_PID,DO_BLOOD_1
CLR A9
CREATE DEBRIS_PID,DO_BLOOD_1
MOVK 2,A0
CALLA RNDRNG0
INC A0
INC A0
MOVE A0,A9
DO_ANOTHER_GLOBB
CREATE DEBRIS_PID,GLOB_BLOOD
DSJS A9,DO_ANOTHER_GLOBB
#no_bab RETS
DO_BLOOD_1
PUSH A9
CLR A0
CLR A1
movi SPITUP01,a2
CLR A3
movi DMAWNZ,a4 ;DMA flags
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
CALLA BEGINOBJ
move a8,*a13(SP_OBJ),L
MOVI SPITPUS_P,A0
CALLA pal_getf
MOVE A0,*A8(OPAL)
move *a11(WRESTLERNUM),A10
SLL 6,A10
MOVI ARM_TBL,A7
ADD A10,A7
MOVE *A8(OCTRL),A14
PULL A1
OR A1,A14
MOVE A14,*A8(OCTRL)
move a14,*a13(SP_OBJCONTROL)
MOVI [0,8000h],A0
ANDI M_FLIPH,A14
JRZ IF_WE_NEED_TOB
NEG A0
IF_WE_NEED_TOB
MOVE A0,*A13(SP_OBJ_XVEL),L
move *a11(OBJ_ZPOS),A0,L
SUBI 2,A0
move A0,*A13(SP_OBJ_ZPOS),L
move *a11(OBJ_XPOS),a0,L
MOVE *A7+,A1,L
MOVE *A11(OBJ_CONTROL),A14
ANDI M_FLIPH,A14
JRZ NO_NEG_XPOS
NEG A1
NO_NEG_XPOS
add A1,a0
move a0,*a13(SP_OBJ_XPOS),L
MOVE *a11(OBJ_YPOS),a0,L
MOVE *A7+,A1,L
sub A1,a0
move a0,*a13(SP_OBJ_YPOS),L
MOVI 40000H,A0
move A0,*a13(SP_OBJ_YVEL),L
MOVI ARM_BLOOD,A9
JRUC RE_ENTER_FOR_BLOOD
SUBRP CREATE_SWEAT
MOVE @NUM_OPPS,A14
CMPI 3,A14
JREQ NO_DO_SWEAT
MOVE *A8(010H),A0
calla RNDPER
JRLS NO_DO_SWEAT
SUBRP AUTOMATIC_SWEAT
move @no_debris,a14
jrnz NO_DO_SWEAT
move @reduce_bog,a14
jrnz NO_DO_SWEAT
movk 2,A0
CALLA RNDRNG0
INC A0
MOVE @NUM_OPPS,A14
CMPI 2,A14
JRGT NOT_SO_MUCH
INC A0
NOT_SO_MUCH
MOVE A0,A9
DO_ANOTHER_GLOB
CREATE DEBRIS_PID,GLOB_SWEAT
DSJS A9,DO_ANOTHER_GLOB
push a8
CLR A0
CLR A1
movi SPITUP01,a2
CLR A3
movi DMAWNZ,a4 ;DMA flags
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
CALLA BEGINOBJ
move a8,*a13(SP_OBJ),L
; CALLR WHICH_SWEAT_PAL
pull a7
move *a7,a9
move *a11(WRESTLERNUM),A10
SLL 6,A10
addi WHICH_SWEAT,A9
MOVE *A9(020H),A7,L
ADD A10,A7
MOVE *A9,A0,L
CMPI SPRAYB,A0
JRNE NORMAL_SWEAT
MOVE *A11(OBJ_CONTROL),A14
XORI M_FLIPH,A14
ORI DMAWNZ,A14
move a14,*a13(SP_OBJCONTROL)
MOVE A14,*A8(OCTRL)
MOVI [3,0],A0
ANDI M_FLIPH,A14
JRZ IF_WE_NEED_TO
NEG A0
IF_WE_NEED_TO
MOVE A0,*A13(SP_OBJ_XVEL),L
move *a11(OBJ_ZPOS),A0,L
SUBI 2,A0
move A0,*A13(SP_OBJ_ZPOS),L
move *a11(OBJ_XPOS),a0,L
MOVE *A7+,A1,L
MOVE *A11(OBJ_CONTROL),A14
ANDI M_FLIPH,A14
jrz NO_FLIP_X_POS
NEG A1
NO_FLIP_X_POS
add A1,a0
move a0,*a13(SP_OBJ_XPOS),L
MOVE *a11(OBJ_YPOS),a0,L
MOVE *A7+,A1,L
sub A1,a0
move a0,*a13(SP_OBJ_YPOS),L
clr a0
move a0,*a13(SP_OBJ_YVEL),L
RE_ENTER_FOR_BLOOD
clr a0
move a0,*a13(SP_SHADOW_OBJ),L
MOVI [2,0],A0
CALLA RNDRNG0
SUBI [1,0],A0
MOVE A0,*A13(SP_OBJ_ZVEL),L
movi 0200h,a0
move a0,*a13(SP_GRAVITY),L
clr a0
move a0,*a13(SP_DIE)
movi 60,a0
move a0,*a13(SP_LIFESPAN)
move *a13(SP_OBJ),a8,L
MOVE *A9,A0,L
calla sp_change_anim
#lp2
SLEEPK 2
CALLR sp_velocity_add
CALLR sp_update_pos_single
callr sp_animate
move *a13(SP_DIE),a0
jrz #lp2
move *a13(SP_OBJ),a0,L
calla DELOBJ
NO_DO_SWEAT
DIE
NORMAL_SWEAT
MOVE *A11(OBJ_CONTROL),A14
ANDI M_FLIPH,A14
ORI DMAWNZ,A14
move a14,*a13(SP_OBJCONTROL)
MOVE A14,*A8(OCTRL)
move *a11(OBJ_ZPOS),A0,L
SUBI 2,A0
move A0,*A13(SP_OBJ_ZPOS),L
move *a11(OBJ_XPOS),a0,L
MOVE *A7+,A1,L
MOVE *A11(OBJ_CONTROL),A14
ANDI M_FLIPH,A14
jrz NO_FLIP_X_POS4
NEG A1
NO_FLIP_X_POS4
add A1,a0
move a0,*a13(SP_OBJ_XPOS),L
MOVE *a11(OBJ_YPOS),a0,L
MOVE *A7+,A1,L
sub A1,a0
move a0,*a13(SP_OBJ_YPOS),L
clr a0
move a0,*a13(SP_SHADOW_OBJ),L
move a0,*a13(SP_OBJ_YVEL),L
MOVE A0,*A13(SP_OBJ_XVEL),L
MOVI [2,0],A0
CALLA RNDRNG0
SUBI [1,0],A0
MOVE A0,*A13(SP_OBJ_ZVEL),L
movi 0200h,a0
move a0,*a13(SP_GRAVITY),L
clr a0
move a0,*a13(SP_DIE)
movi 60,a0
move a0,*a13(SP_LIFESPAN)
move *a13(SP_OBJ),a8,L
MOVE *A9,A0,L
CMPI COUGH,A0
JRNE NO_RAND_COUGH
MOVE @ROLLING_COUNT,A14
SRL 1,A14
JRNC NO_RAND_COUGH
MOVI SPITAN,A0
NO_RAND_COUGH
calla sp_change_anim
JRUC #lp2
WHICH_SWEAT_PAL
MOVE *A11(WRESTLERNUM),A0
CMPI 2,A0
JREQ DO_BILE_PAL
CMPI 5,A0
JRNE NO_NEW_SWEAT_PAL
MOVI SPITPUS_P,A0
JRUC GOT_NEW_PAL
DO_BILE_PAL
MOVI SPITBLE_P,A0
GOT_NEW_PAL
CALLA pal_getf
MOVE A0,*A8(OPAL)
NO_NEW_SWEAT_PAL
RETS
GLOB_BLOOD
CLR A0
CLR A1
movi SPITUP01,a2
CLR A3
movi DMAWNZ,a4 ;DMA flags
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
CALLA BEGINOBJ
move a8,*a13(SP_OBJ),L
MOVI SPITPUS_P,A0
CALLA pal_getf
MOVE A0,*A8(OPAL)
MOVE *A11(OBJ_CONTROL),A14
ANDI M_FLIPH,A14
ORI DMAWNZ,A14
move a14,*a13(SP_OBJCONTROL)
MOVE A14,*A8(OCTRL)
move *a11(WRESTLERNUM),A10
SLL 6,A10
MOVI ARM_TBL,A7
ADD A10,A7
move *a11(OBJ_ZPOS),*A13(SP_OBJ_ZPOS),L
move *a11(OBJ_XPOS),a0,L
MOVE *A7+,A1,L
MOVE *A11(OBJ_CONTROL),A14
ANDI M_FLIPH,A14
PUSHST
jrz NO_FLIP_X_POS2BB
NEG A1
NO_FLIP_X_POS2BB
add A1,a0
move a0,*a13(SP_OBJ_XPOS),L
MOVE *a11(OBJ_YPOS),a0,L
MOVE *A7+,A1,L
sub A1,a0
move a0,*a13(SP_OBJ_YPOS),L
clr a0
move a0,*a13(SP_SHADOW_OBJ),L
movi [4,0],a0
calla RNDRNG0
SUBI [2,0],A0
move a0,*a13(SP_OBJ_XVEL),L
movi [2,0],a0
calla RNDRNGS
move a0,*a13(SP_OBJ_ZVEL),L
movi [3,0],a0
calla RNDRNGS
addi [6,0],a0
move a0,*a13(SP_OBJ_YVEL),L
movi GRAVITY,a0
move a0,*a13(SP_GRAVITY),L
move *a11(GROUND_Y),a0
sll 16,a0
move a0,*a13(SP_GROUND_Y),L
clr a0
move a0,*a13(SP_DIE)
movi 60,a0
move a0,*a13(SP_LIFESPAN)
move *a13(SP_OBJ),a8,L
movk 11,A0
CALLA RNDRNG0
SLL 6,A0
POPST
JRN NO_NEED_TO_USE_RIGHT_ANIMB
ADDI 020H,A0
NO_NEED_TO_USE_RIGHT_ANIMB
ADDI WHICH_GLOB,A0
MOVE *A0,A0,L
calla sp_change_anim
jruc glob_loop
SUBR SPIN_SWEAT
move @no_debris,a14
jrnz NO_DO_SWEAT
move @reduce_bog,a14
jrnz NO_DO_SWEAT
MOVE *A8(010H),A9
JRZ NO_DO_SWEAT
ANOTHER_GLOB
CREATE DEBRIS_PID,SPECIAL_GLOB_SWEAT
DSJS A9,ANOTHER_GLOB
DIE
SUBRP SPECIAL_GLOB_SWEAT ;process
movi SPECIAL_GLOB_SWEAT,a14
move a14,*a13(PROC_ORIGIN),L
push a8
CLR A0
CLR A1
movi SPITUP01,a2
CLR A3
movi DMAWNZ,a4 ;DMA flags
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
CALLA BEGINOBJ
move a8,*a13(SP_OBJ),L
move *A8(OCTRL),*a13(SP_OBJCONTROL)
pull a7
move *a7,a7
SLL 7,A7
ADDI SPIN_SWEAT_ORIG,A7
MOVE *A7+,A1,L
MOVE *A11(OBJ_CONTROL),A14,L
ANDI M_FLIPH,A14
JRNZ NO_NEG_XPOS_START
NEG A1
NO_NEG_XPOS_START
move *a11(OBJ_XPOS),a0,L
PUSHST
add A1,a0
move a0,*a13(SP_OBJ_XPOS),L
MOVE *a11(OBJ_ZPOS),a0,L
MOVE *A7+,A1,L
ADD A1,a0
move a0,*a13(SP_OBJ_ZPOS),L
MOVE *a11(OBJ_YPOS),a0,L
ADDI [64,0],A0
MOVE A0,*A13(SP_OBJ_YPOS),L
MOVE *A7+,A1,L
MOVE *A11(OBJ_CONTROL),A14,L
ANDI M_FLIPH,A14
JRNZ NO_NEG_XVEL_START
NEG A1
NO_NEG_XVEL_START
move a1,*a13(SP_OBJ_XVEL),L
MOVE *A7+,A0,L
move a1,*a13(SP_OBJ_ZVEL),L
JRUC GLOB_SWEAT_REENTER
SPIN_SWEAT_ORIG
.LONG [-120,0],[1,0],[-4,0],[0,0]
.LONG [-60,0],[-1,0],[-2,0],[-3,0]
.LONG [-30,0],[-1,0],[-1,0],[-6,0]
.LONG [0,0],[-1,0],[0,0],[-10,0]
.LONG [30,0],[-1,0],[1,0],[-6,0]
.LONG [70,0],[-1,0],[2,0],[-3,0]
.LONG [120,0],[1,0],[4,0],[0,0]
.LONG [70,0],[3,0],[2,0],[3,0]
.LONG [30,0],[3,0],[1,0],[6,0]
.LONG [0,0],[3,0],[0,0],[10,0]
.LONG [-50,0],[3,0],[-2,0],[6,0]
#*****************************************************************************
SUBRP GLOB_SWEAT ;process
movi GLOB_SWEAT,a14
move a14,*a13(PROC_ORIGIN),L
push a8
CLR A0
CLR A1
movi SPITUP01,a2
CLR A3
movi DMAWNZ,a4 ;DMA flags
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
CALLA BEGINOBJ
move a8,*a13(SP_OBJ),L
; CALLR WHICH_SWEAT_PAL
MOVE *A11(OBJ_CONTROL),A14
ANDI M_FLIPH,A14
ORI DMAWNZ,A14
move a14,*a13(SP_OBJCONTROL)
MOVE A14,*A8(OCTRL)
pull a7
move *a7,a9
move *a11(WRESTLERNUM),A10
SLL 6,A10
addi WHICH_SWEAT,A9
MOVE *A9(020H),A7,L
ADD A10,A7
move *a11(OBJ_ZPOS),*A13(SP_OBJ_ZPOS),L
move *a11(OBJ_XPOS),a0,L
MOVE *A7+,A1,L
MOVE *A11(OBJ_CONTROL),A14
ANDI M_FLIPH,A14
PUSHST
jrz #NO_FLIP_X_POS2
NEG A1
#NO_FLIP_X_POS2
add A1,a0
move a0,*a13(SP_OBJ_XPOS),L
MOVE *a11(OBJ_YPOS),a0,L
MOVE *A7+,A1,L
sub A1,a0
move a0,*a13(SP_OBJ_YPOS),L
movi [4,0],a0
calla RNDRNG0
ADDI [1,0],A0
POPST
JRNZ #NO_FLIP_ANIM_XVEL
NEG A0
#NO_FLIP_ANIM_XVEL
MOVE A0,A0
move a0,*a13(SP_OBJ_XVEL),L
PUSHST
movi [2,0],a0
calla RNDRNGS
move a0,*a13(SP_OBJ_ZVEL),L
GLOB_SWEAT_REENTER
clr a0
move a0,*a13(SP_SHADOW_OBJ),L
movi [3,0],a0
calla RNDRNGS
addi [6,0],a0
move a0,*a13(SP_OBJ_YVEL),L
movi GRAVITY,a0
move a0,*a13(SP_GRAVITY),L
move *a11(GROUND_Y),a0
sll 16,a0
move a0,*a13(SP_GROUND_Y),L
clr a0
move a0,*a13(SP_DIE)
movi 60,a0
move a0,*a13(SP_LIFESPAN)
move *a13(SP_OBJ),a8,L
movk 11,A0
CALLA RNDRNG0
SLL 6,A0
POPST
JRN #NO_NEED_TO_USE_RIGHT_ANIM
ADDI 020H,A0
#NO_NEED_TO_USE_RIGHT_ANIM
ADDI WHICH_GLOB,A0
MOVE *A0,A0,L
calla sp_change_anim
glob_loop
SLEEPK 1
CALLR sp_velocity_add
CALLR sp_update_pos_single
callr sp_animate
move *a13(SP_OBJ_YVEL),a0,L ;must have down velocity
JRZ #no_gnd
move *a13(SP_OBJ_YPOSINT),a0
move *a13(SP_GROUND_Y+10h),a1
cmp a1,a0 ;a0-a1
jrgt #no_gnd
sll 16,a1
move a1,*a13(SP_OBJ_YPOS),L
CLR A0
MOVE A0,*A13(SP_OBJ_YVEL),L
MOVE A0,*A13(SP_OBJ_XVEL),L
MOVE A0,*A13(SP_OBJ_ZVEL),L
move a0,*a13(SP_GRAVITY),L
MOVI SPLASH_A,A0
move @ROLLING_COUNT,A14
SRL 1,A14
JRNC #GOT_RIGHT_SPLASH_ANIM
MOVI SPLASH_B,A0
#GOT_RIGHT_SPLASH_ANIM
calla sp_change_anim
#no_gnd
move *a13(SP_DIE),a0
jrz glob_loop
move *a13(SP_OBJ),a0,L
calla DELOBJ
DIE
#*****************************************************************************
WHICH_GLOB
.LONG WAD_AL,WAD_AR
.LONG WAD_AL,WAD_AR
.LONG WAD_AL,WAD_AR
.LONG WAD_BL,WAD_BR
.LONG WAD_BL,WAD_BR
.LONG WAD_CL,WAD_CR
.LONG WAD_DL,WAD_DR
.LONG WAD_DL,WAD_DR
.LONG WAD_EL,WAD_ER
.LONG WAD_FL,WAD_FR
.LONG WAD_FL,WAD_FR
.LONG WAD_FL,WAD_FR
WHICH_SWEAT
.LONG SPITUP,SPITUP_TBL
.LONG SPRAYB,SPRAYA_TBL
ARM_BLOOD
.LONG SPRAYB,SPRAYA_TBL
.LONG SPRAYC,SPRAYA_TBL
.LONG COUGH,COUGH_TBL
.LONG SPRAYC,SPRAYD_TBL
SPITUP
WL 1,SPITUP01
WL 1,SPITUP02
WL 1,SPITUP03
WL 1,SPITUP04
WL 1,SPITUP05
WL 1,SPITUP06
WL 1,SPITUP07
WL 1,SPITUP08
WL 1,SPITUP09
.WORD 08002h
SPITUP_TBL
.LONG [19,0],[-41,0] ;BRET
.LONG [37,0],[-35,0] ;RAZOR
.LONG [33,0],[-31,0] ;TAKER
.LONG [47,0],[-31,0] ;YOKO
.LONG [37,0],[-27,0] ;SHAWN
.LONG [55,0],[-35,0] ;BAM BAM
.LONG [45,0],[-29,0] ;DOINK
.LONG 0,0 ;SPARE
.LONG [25,0],[-31,0] ;LEX
SPRAYA_TBL
.LONG [-5,0],[-109,0] ;BRET
.LONG [0,0],[-109,0] ;RAZOR
.LONG [-2,0],[-109,0] ;TAKER
.LONG [-7,0],[-97,0] ;YOKO
.LONG [-6,0],[-98,0] ;SHAWN
.LONG [-3,0],[-109,0] ;BAM BAM
.LONG [11,0],[-90,0] ;DOINK
.LONG 0,0 ;SPARE
.LONG [-9,0],[-103,0] ;LEX
SPRAYD_TBL
.LONG [-60,0],[-40,0] ;BRET
.LONG [-50,0],[-80,0] ;RAZOR
.LONG [60,0],[-100,0] ;TAKER
.LONG [-40,0],[-100,0] ;YOKO
.LONG [-60,0],[-40,0] ;SHAWN
.LONG [-60,0],[-40,0] ;BAM BAM
.LONG [-60,0],[-40,0] ;DOINK
.LONG 0,0 ;SPARE
.LONG [-60,0],[-40,0] ;LEX
ARM_TBL
.LONG [18,0],[-124,0] ;BRET
.LONG [24,0],[-120,0] ;RAZOR
.LONG [30,0],[-124,0] ;TAKER
.LONG [22,0],[-110,0] ;YOKO
.LONG [14,0],[-118,0] ;SHAWN
.LONG [20,0],[-120,0] ;BAM BAM
.LONG [16,0],[-110,0] ;DOINK
.LONG 0,0 ;SPARE
.LONG [16,0],[-128,0] ;LEX
SPRAYB
WL 1,SPRAYB01
WL 1,SPRAYB02
WL 1,SPRAYB03
WL 1,SPRAYB04
WL 1,SPRAYB05
WL 1,SPRAYB06
WL 1,SPRAYB07
WL 1,SPRAYB08
.WORD 08002h
SPRAYC
WL 1,SPRAYC01
WL 1,SPRAYC02
WL 1,SPRAYC03
WL 1,SPRAYC04
WL 1,SPRAYC05
WL 1,SPRAYC06
WL 1,SPRAYC07
WL 1,SPRAYC08
WL 1,SPRAYC09
WL 1,SPRAYC10
.WORD 08002h
COUGH
WL 1,COUGHA01
WL 1,COUGHA02
WL 1,COUGHA03
WL 1,COUGHA04
WL 1,COUGHA05
WL 1,COUGHA06
WL 1,COUGHA07
WL 1,COUGHA08
WL 1,COUGHA09
.WORD 08002h
SPITAN
WL 1,SPITAN01
WL 1,SPITAN02
WL 1,SPITAN03
WL 1,SPITAN04
WL 1,SPITAN05
WL 1,SPITAN06
WL 1,SPITAN07
WL 1,SPITAN08
WL 1,SPITAN09
.WORD 08002h
COUGH_TBL
.LONG [23,0],[-71,0] ;BRET
.LONG [33,0],[-81,0] ;RAZOR
.LONG [21,0],[-93,0] ;TAKER
.LONG [33,0],[-77,0] ;YOKO
.LONG [27,0],[-73,0] ;SHAWN
.LONG [33,0],[-77,0] ;BAM BAM
.LONG [29,0],[-77,0] ;DOINK
.LONG 0,0 ;SPARE
.LONG [33,0],[-73,0] ;LEX
WAD_AL
WL 2,WAD_A_01
WL 2,WAD_A_02
WL 2,WAD_A_03
WL 2,WAD_A_04
WL 2,WAD_A_05
WL 2,WAD_A_06
WL 2,WAD_A_07
WL 2,WAD_A_08
WL 2,WAD_A_09
.word ASP_REPEAT
WAD_BL
WL 2,WAD_B_01
WL 2,WAD_B_02
WL 2,WAD_B_03
WL 2,WAD_B_04
WL 2,WAD_B_05
WL 2,WAD_B_06
WL 2,WAD_B_07
WL 2,WAD_B_08
WL 2,WAD_B_09
.word ASP_REPEAT
WAD_CL
WL 2,WAD_C_01
WL 2,WAD_C_02
WL 2,WAD_C_03
WL 2,WAD_C_04
WL 2,WAD_C_05
WL 2,WAD_C_06
WL 2,WAD_C_07
WL 2,WAD_C_08
WL 2,WAD_C_09
WL 2,WAD_C_11
WL 2,WAD_C_12
.word ASP_REPEAT
WAD_DL
WL 2,WAD_D_01
WL 2,WAD_D_02
WL 2,WAD_D_03
WL 2,WAD_D_04
.word ASP_REPEAT
WAD_EL
WL 2,WAD_E_01
WL 2,WAD_E_02
WL 2,WAD_E_03
WL 2,WAD_E_04
WL 2,WAD_E_05
WL 2,WAD_E_06
WL 2,WAD_E_07
WL 2,WAD_E_08
WL 2,WAD_E_09
WL 2,WAD_E_10
WL 2,WAD_E_11
.word ASP_REPEAT
WAD_FL
WL 2,WAD_F_01
WL 2,WAD_F_02
WL 2,WAD_F_03
WL 2,WAD_F_04
WL 2,WAD_F_05
WL 2,WAD_F_06
WL 2,WAD_F_07
WL 2,WAD_F_08
WL 2,WAD_F_09
.word ASP_REPEAT
WAD_AR
WL 2,WAD_A_09
WL 2,WAD_A_08
WL 2,WAD_A_07
WL 2,WAD_A_06
WL 2,WAD_A_05
WL 2,WAD_A_04
WL 2,WAD_A_03
WL 2,WAD_A_02
WL 2,WAD_A_01
.word ASP_REPEAT
WAD_BR
WL 2,WAD_B_09
WL 2,WAD_B_08
WL 2,WAD_B_07
WL 2,WAD_B_06
WL 2,WAD_B_05
WL 2,WAD_B_04
WL 2,WAD_B_03
WL 2,WAD_B_02
WL 2,WAD_B_01
.word ASP_REPEAT
WAD_CR
WL 2,WAD_C_12
WL 2,WAD_C_11
WL 2,WAD_C_09
WL 2,WAD_C_08
WL 2,WAD_C_07
WL 2,WAD_C_06
WL 2,WAD_C_05
WL 2,WAD_C_04
WL 2,WAD_C_03
WL 2,WAD_C_02
WL 2,WAD_C_01
.word ASP_REPEAT
WAD_DR
WL 2,WAD_D_04
WL 2,WAD_D_03
WL 2,WAD_D_02
WL 2,WAD_D_01
.word ASP_REPEAT
WAD_ER
WL 2,WAD_E_11
WL 2,WAD_E_10
WL 2,WAD_E_09
WL 2,WAD_E_08
WL 2,WAD_E_07
WL 2,WAD_E_06
WL 2,WAD_E_05
WL 2,WAD_E_04
WL 2,WAD_E_03
WL 2,WAD_E_02
WL 2,WAD_E_01
.word ASP_REPEAT
WAD_FR
WL 2,WAD_F_09
WL 2,WAD_F_08
WL 2,WAD_F_07
WL 2,WAD_F_06
WL 2,WAD_F_05
WL 2,WAD_F_04
WL 2,WAD_F_03
WL 2,WAD_F_02
WL 2,WAD_F_01
.word ASP_REPEAT
SPLASH_A
WL 2,SPLSHA01
WL 2,SPLSHA02
WL 2,SPLSHA03
WL 2,SPLSHA04
WL 2,SPLSHA05
WL 2,SPLSHA06
.WORD 08002h
SPLASH_B
WL 2,SPLSHB01
WL 2,SPLSHB02
WL 2,SPLSHB03
WL 2,SPLSHB04
WL 2,SPLSHB05
WL 2,SPLSHB06
.WORD 08002h
SUBR DO_EYES
;quit if no_debris is set
; move @no_debris,a14
; jrnz #rets
; move @reduce_bog,a14
; jrnz #rets
MOVE A13,A11
movk 3,A0
CALLA RNDRNG0
INC A0
INC A0
MOVE A0,A9
DO_ANOTHER_EYE
CREATE DEBRIS_PID,CREATE_EYES
DSJS A9,DO_ANOTHER_EYE
#rets RETS
CREATE_EYES
CLR A0
CLR A1
movi SPITUP01,a2
CLR A3
movi DMAWNZ,a4 ;DMA flags
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
CALLA BEGINOBJ
move a8,*a13(SP_OBJ),L
MOVE *A11(OBJ_CONTROL),A14
ANDI M_FLIPH,A14
ORI DMAWNZ,A14
move a14,*a13(SP_OBJCONTROL)
MOVE A14,*A8(OCTRL)
move *a11(OBJ_ZPOS),*A13(SP_OBJ_ZPOS),L
move *a11(OBJ_XPOS),a0,L
MOVI [30H,0],A1
MOVE *A11(OBJ_CONTROL),A14
BTST B_FLIPH,A14
PUSHST
jrz NO_FLIP_X_POS2E
NEG A1
NO_FLIP_X_POS2E
add A1,a0
move a0,*a13(SP_OBJ_XPOS),L
MOVE *a11(OBJ_YPOS),a0,L
MOVI [-100,0],A1
sub A1,a0
move a0,*a13(SP_OBJ_YPOS),L
clr a0
move a0,*a13(SP_SHADOW_OBJ),L
movi [1,0],a0
calla RNDRNG0
ADDI [1,0],A0
POPST
JRNZ NO_FLIP_ANIM_XVELE
NEG A0
NO_FLIP_ANIM_XVELE
MOVE A0,A0
move a0,*a13(SP_OBJ_XVEL),L
PUSHST
CLR A0
move a0,*a13(SP_OBJ_ZVEL),L
movi [3,0],a0
calla RNDRNGS
addi [6,0],a0
move a0,*a13(SP_OBJ_YVEL),L
movi GRAVITY,a0
move a0,*a13(SP_GRAVITY),L
move *a11(GROUND_Y),a0
sll 16,a0
move a0,*a13(SP_GROUND_Y),L
clr a0
move a0,*a13(SP_DIE)
movi 120,a0
move a0,*a13(SP_LIFESPAN)
move *a13(SP_OBJ),a8,L
movk 1,A0
CALLA RNDRNG0
SLL 6,A0
POPST
JRN NO_NEED_TO_USE_RIGHT_ANIME
ADDI 020H,A0
NO_NEED_TO_USE_RIGHT_ANIME
ADDI WHICH_EYE,A0
MOVE *A0,A0,L
calla sp_change_anim
#lp4
SLEEPK 1
CALLR sp_velocity_add
CALLR sp_update_pos_single
callr sp_animate
move *a13(SP_OBJ_YPOSINT),a0
move *a13(SP_GROUND_Y+10h),a1
cmp a1,a0 ;a0-a1
jrgt #no_gnd2
MOVE A1,*A13(SP_OBJ_YPOSINT)
MOVE *A13(SP_OBJ_YVEL),A1,L
MOVE A1,A0
SRA 2,A1
SUB A1,A0
NEG A0
MOVE A0,*A13(SP_OBJ_YVEL),L
#no_gnd2
move *a13(SP_LIFESPAN),a0
DEC A0
move A0,*a13(SP_LIFESPAN)
jrnz #lp4
move *a13(SP_OBJ),a0,L
calla DELOBJ
DIE
WHICH_EYE
.LONG SMALL_EYE_L,SMALL_EYE_R
.LONG BIG_EYE_L,BIG_EYE_R
SMALL_EYE_L
WL 2,BIGEYE01
WL 2,BIGEYE02
WL 2,BIGEYE03
WL 2,BIGEYE04
WL 2,BIGEYE05
WL 2,BIGEYE06
WL 2,BIGEYE07
WL 2,BIGEYE08
.word ASP_REPEAT
SMALL_EYE_R
WL 2,BIGEYE08
WL 2,BIGEYE07
WL 2,BIGEYE06
WL 2,BIGEYE05
WL 2,BIGEYE04
WL 2,BIGEYE03
WL 2,BIGEYE02
WL 2,BIGEYE01
.word ASP_REPEAT
BIG_EYE_L
WL 2,BIGEYE01
WL 2,BIGEYE02
WL 2,BIGEYE03
WL 2,BIGEYE04
WL 2,BIGEYE05
WL 2,BIGEYE06
WL 2,BIGEYE07
WL 2,BIGEYE08
.word ASP_REPEAT
BIG_EYE_R
WL 2,BIGEYE08
WL 2,BIGEYE07
WL 2,BIGEYE06
WL 2,BIGEYE05
WL 2,BIGEYE04
WL 2,BIGEYE03
WL 2,BIGEYE02
WL 2,BIGEYE01
.word ASP_REPEAT
******************************************************************************
;we need these
SPITPUS_P:
.word 22
.word 00H,07FD8H,07B95H,07752H,07331H,06F0FH,06AEEH,066CCH
.word 066CBH,062AAH,05E88H,05A67H,05A66H,05645H,05224H,04E03H
.word 049E2H,045C2H,041A1H,03D80H,03960H,03940H
SPITBLE_P:
.word 22
.word 00H,06FB5H,06B93H,06371H,05F4FH,05B4DH,0572BH,05309H
.word 04EE8H,04AC6H,046A5H,04283H,03E62H,03A41H,03640H,03220H
.word 02E00H,029E0H,025C0H,021A0H,01D80H,01D80H
******************************************************************************
.end