· 8 years ago · Apr 04, 2018, 12:08 AM
1<MK2 - 2V2 TAG MODE V2>
2#MK2.INI#
3// ==========================
4// ** AUTHOR: ZPAUL2FRESH8 **
5// ==========================
6// THIS WATCHES FOR START PRESS DURING 2V2 MODE AND JUMPS 2ND CHARACTERS
7// IN IF PRESSED.
8
9// TO DO:
10// Fix: Camera forcing character movement on transitions.
11// Fix: Velocity inverting upon 2nd char entering on opposite side
12// Fix: Tagging on Finish Him
13// Fix: Uppercut recovery delay
14// Fix: Add smoke effect back to Smoke
15// Fix: Old bug exists on knock-back combo in the air, if winner
16// lands first, he will die and CPU will jump in.
17
18[FFD6E600H]
19// ========================================
20// ** PREROUND CREATE AND FLIP OUT CHARS **
21// ========================================
22
23//CREATE P1
24CLR A2
25MOVE @CHAR_ID_P1_2,A0,0
26CALLA @CUSTOM_SPAWN_CHAR
27MOVE A8,@TABLE_OBJECT_P1_2ND,1
28
29MOVK 3H,A0
30MOVE A0,*A8(1C0H),0 //ASSIGNS INSTANCE
31
32MOVI 8012H,A4 // FACE RIGHT
33MOVE A4,*A8(F0H),0 // STORES FACING DIRECTION
34MOVK 15H,A0
35CALLA FF905E30H // COMPOUND/VERTICAL POS
36
37MOVI A1H,A1
38MOVE A1,@HEALTH_P1_2ND,0 // GIVE OUR 2ND CHAR HEALTH
39
40MOVI 3H,A1
41MOVI @ROUND_INTRODUCTION,A7
42CALLA @THREAD_CREATE
43
44// CREATE P2
45MOVK 1H,A2
46MOVE @CHAR_ID_P2_2,A0,0
47CALLA @CUSTOM_SPAWN_CHAR
48MOVE A8,@TABLE_OBJECT_P2_2ND,1
49
50MOVK 4H,A0
51MOVE A0,*A8(1C0H),0 // ASSIGNS INSTANCE
52
53MOVI 8002H,A4 // FACE LEFT
54MOVE A4,*A8(F0H),0 // STORES FACING DIRECTION
55MOVI 16BH,A0 // SET H-POS
56CALLA FF905E30H // OMPOUND/VERTICAL POS
57
58MOVI A1H,A1
59MOVE A1,@HEALTH_P2_2ND,0 // GIVE OUR 2ND CHAR HEALTH
60
61MOVI 4H,A1
62MOVI @ROUND_INTRODUCTION,A7
63CALLA @THREAD_CREATE
64
65// DELAY UNTIL ROUND BEINGS
66MOVI 60H,A0
67CALLA @THREAD_DELAY
68
69// LAUNCH P1 LISTENER
70MOVI 230H,A1
71MOVI @P1_LISTENER,A7
72CALLA @THREAD_CREATE
73
74// LAUNCH P2 LISTENER
75MOVI 240H,A1
76MOVI @P2_LISTENER,A7
77CALLA @THREAD_CREATE
78
79// MAKE SURE THIS DOESN'T KILL OUR OBJECTS (PROB NOT)
80JA @THREAD_END
81
82
83
84// =============================================
85// ** THREAD: P1_LISTENER (230) **
86// =============================================
87// THIS IS A LOOP THAT CHECKS FOR START BEING PRESSED. IF YES THEN IT CHECKS THE
88// COOL DOWN VALUE TO ENSURE ONLY ONE INSTANCE IS CALLED EACH TIME. ALSO CHECKS
89// HEALTH OF RESERVED CHAR AND IF NOT EMPTY THEN IT LAUNCHES THE P1_TAG THREAD.
90P1_LISTENER:
91MOVI 1H,A0
92CALLA @THREAD_DELAY
93
94// CHECK FOR START PRESS
95MOVE @INPUT_CONTROLS_P1_START,A1,0
96NOT A1
97ANDI FH,A1
98CMPI 4H,A1 // CHECK IF P1 INPUT WAS START
99JRNE @P1_LISTENER
100
101// CHECK IF COOLDOWN IS OVER
102MOVE *A13(100H),A0,0 // GET TIMESTAMP
103CALLR @GET_TIMESTAMP
104JRLT @P1_LISTENER
105
106// CHECK THERE'S HEALTH IN 2ND CHAR
107MOVE @HEALTH_P1_2ND,A11,0 // CHECKS IF OUR 2ND CHAR HAS HEALTH LEFT
108JREQ @P1_LISTENER
109
110// CHECK IF ENDURANCE IS IN TRANSITION ALREADY
111MOVE @ENDURANCE_TRANSITION_FLAG,A0,0
112JRNE @P1_LISTENER
113
114MOVE @ROUND_STATUS,A0,0
115CMPI 1H,A0
116JREQ @P1_LISTENER
117
118//CHECK IF CHARACTER IS NOT BEING DAMAGED
119MOVE @TABLE_CONTROL_P1,A2,1
120MOVE *A2(250H),A0, 0 //CHECK PUSHBACK FLAG
121JRNE @P1_LISTENER
122
123MOVE *A2(210H),A0,0 //GET CHARACTER STATUS
124CMPI 5H,A0
125JREQ @P1_LISTENER
126
127CMPI 11H,A0 // ATTACKING
128JREQ @P1_TAG
129
130CMPI 1H,A0 // IDLE
131JRNE @P1_LISTENER
132
133// ========================
134// ** PLAYER 1 TAG START **
135// ========================
136//HALT PLAYER REPOSITIONING
137P1_TAG:
138MOVK 1H,A0
139MOVE A0,@CAMERA_HOLD_POSITION,0 //HALT PLAYER REPOSITIONING
140
141MOVE A1,*A13(100H),0 // UPDATE TIME STAMP
142
143// SWAP CHAR IDS
144MOVE @CHAR_ID_P1,A0,0 // GET CURRENT CHAR ID
145MOVE @CHAR_ID_P1_2,A1,0 // GET NEXT CHAR ID
146MOVE A0,@CHAR_ID_P1_2,0 // SET CURRENT CHAR AS NEXT
147MOVE A1,@CHAR_ID_P1,0 // SET NEXT CHAR AS CURRENT
148
149// HEALTH SWAP AND REFILL
150MOVE @HEALTH_P1_2ND,A11,0 // USED FOR HEALTH REFILL (MIGHT BE ALREADY IN A11)
151MOVE @HEALTH_P1,A0,0 // STORE EXITING CHAR HEALTH
152MOVE A0,@HEALTH_P1_2ND,0
153MOVK 1H,A1 // DESIGNATE WHICH PLAYER TO CHANGE
154CALLR @SWAP_HEALTH_AND_NAME
155
156// SET OBJECTS UP FOR UPCOMING THREAD
157MOVE @TABLE_OBJECT_P1_2ND,A8,1 // GET NEXT OBJECT
158MOVE @TABLE_OBJECT_P1,A3,1 // GET CURRENT OBJECT FOR LOCATIONAL PURPOSES
159
160// LAUNCH THREAD FOR FLIP-IN WITH HUMAN CONTROL
161CALLR @SUBR_HUMAN_FLIP_IN
162
163// SWAP CONTROL TABLES, ASSIGN FOCUS (MIGHT WANT TO DELAY THIS TO PREVENT CAMERA BULLYING)
164MOVE @TABLE_CONTROL_P1,A1,1
165MOVE A1,@TABLE_CONTROL_P1_2ND,1
166MOVE A0,@TABLE_CONTROL_P1,1
167
168CALLR @SET_GROUND_POSITION
169
170// ASSIGN INPUTS. EXPECTED A0=CONTROL THREAD
171ASSIGN_P1_CONTROL:
172MOVI @INPUT_CONTROLS_P1_JOYSTICK,A1
173MOVE A1,*A0(100H),1
174MOVI @INPUT_CONTROLS_P1_HP_BL_HK,A1
175MOVI @INPUT_CONTROLS_P1_LP_LK,A1
176MOVI 1600021H,A1
177MOVE A1,*A0(120H),1
178
179// CLEARS CONTROLS FROM OLD CHARACTER
180MOVE @TABLE_CONTROL_P1_2ND,A2,1 //GET P1 CONTROL THREAD LOCATION
181CLR A1
182MOVE A1,*A2(100H),1
183MOVE A1,*A2(120H),1
184
185<TRIED SWAPPING HERE BUT NOT GOOD>
186// SWAP NEW OBJECT INTO 1ST SLOT, OLD OBJECT IN 2ND SLOT
187//CONTROL THREAD CHANGED ALREADY ABOVE HERE.
188MOVE @TABLE_OBJECT_P1,A1,1
189MOVE A1,@TABLE_OBJECT_P1_2ND,1
190MOVE A8,@TABLE_OBJECT_P1,1
191
192// CHECK IF EXITING CHARACTER IS IN MOVE THAT CAUSES ISSUES
193MOVE @TABLE_CONTROL_P1_2ND,A11,1
194JREQ @ASSIGNMENT_SETUP
195
196MOVE A0,A10 //PRESERVES OUR NEW CONTROL THREAD IN A0
197
198ASSIGNMENT_DELAY:
199MOVI 1H,A0
200CALLA @THREAD_DELAY
201
202MOVE *A11(1F0H),A1,0 //GET MOVE TYPE
203CALLR @ASSIGNMENT_DELAY_MOVES
204JREQ @ASSIGNMENT_DELAY
205
206ASSIGNMENT_SETUP:
207// TURN OFF EDGE COLLISION
208// MOVI 50H,A0
209// MOVE A0,@10619D0H,0
210
211// SETUP REGISTERS FOR OPPOSING TABLE ASSIGNMENTS
212MOVE A10,A0
213
214MOVE @TABLE_CONTROL_P2,A1,1
215MOVE @TABLE_OBJECT_P2,A9,1
216MOVE @TABLE_OBJECT_P1,A8,1 //CHANGED TO 2ND CHAR SINCE WE MOVED SWAPPING DOWN
217CALLR @ASSIGN_OPPOSING_TABLES
218
219// WANT TO ENSURE NO CRASHES YET
220MOVK 12H,A0
221MOVE A0,*A8(160H),0 //UPDATE DRAW TYPE FOR SHADOWS
222
223// PUTS EXITING CHAR INTO FLIP OUT ONCE IN FIGHT STANCE
224FLIP_OUT_OLD_CHAR:
225MOVI 1H,A0
226CALLA @THREAD_DELAY
227
228MOVE @TABLE_CONTROL_P1_2ND,A1,1 //GET OLD CHARS CONTROL THREAD
229MOVE *A1(1F0H),A0,0
230CMPI 303H,A0 //CHECKS IF IN FIGHT STANCE
231JRNE @FOC_CHECK_MOVE_ID_0
232JR @FOC_APPLY_FLIP_TO_OLD_CHAR
233
234FOC_CHECK_MOVE_ID_0:
235MOVE A0,A0
236JRNE @FLIP_OUT_OLD_CHAR
237
238
239FOC_APPLY_FLIP_TO_OLD_CHAR:
240// PUT FLIP ROUTINE INTO EXITING CHARACTERS THREAD
241// THAT FLIP OUT ROUTINE SHOULD END EXITING CHAR'S CONTROL THREAD
242MOVI @FLIP_SPIN,A5
243MOVE A5,*A1(E0H),1
244
245MOVI 80H,A0
246CALLA @THREAD_DELAY
247
248//CLEAR PLAYER REPOSITION FLAG
249CLR A0
250MOVE A0,@CAMERA_HOLD_POSITION,0 //HOLD CAMERA POSITION FLAG
251
252JR @P1_LISTENER
253
254
255// =============================================
256// ** THREAD: P2_LISTENER (240) **
257// =============================================
258// THIS IS A LOOP THAT CHECKS FOR START BEING PRESSED. IF YES THEN IT CHECKS THE
259// COOL DOWN VALUE TO ENSURE ONLY ONE INSTANCE IS CALLED EACH TIME. ALSO CHECKS
260// HEALTH OF RESERVED CHAR AND IF NOT EMPTY THEN IT LAUNCHES THE P2_TAG THREAD.
261P2_LISTENER:
262MOVI 1H,A0
263CALLA @THREAD_DELAY
264
265// CHECK FOR START PRESS
266MOVE @INPUT_CONTROLS_P2_START,A1,0
267NOT A1
268ANDI FH,A1
269CMPI 2H,A1 // CHECK IF P2 INPUT WAS START
270JRNE @P2_LISTENER
271
272// CHECK IF COOLDOWN IS OVER
273MOVE *A13(100H),A0,0 // GET TIMESTAMP
274CALLR @GET_TIMESTAMP
275JRLT @P2_LISTENER
276
277// CHECK THERE'S HEALTH IN 2ND CHAR
278MOVE @HEALTH_P2_2ND,A11,0 // CHECKS IF OUR 2ND CHAR HAS HEALTH LEFT
279JREQ @P2_LISTENER
280
281// CHECK IF ENDURANCE IS IN TRANSITION ALREADY
282MOVE @ENDURANCE_TRANSITION_FLAG,A0,0
283JRNE @P2_LISTENER
284
285MOVE @ROUND_STATUS,A0,0
286CMPI 1H,A0
287JREQ @P2_LISTENER
288
289MOVE *A13(250H),A0,0 //CHECKS FOR PUSHBACK FLAG TO DISABLE TAG
290JRNE @P1_LISTENER
291
292//CHECK IF CHARACTER IS NOT BEING DAMAGED
293MOVE @TABLE_CONTROL_P2,A2,1
294MOVE *A2(250H),A0, 0 //CHECK PUSHBACK FLAG
295JRNE @P2_LISTENER
296
297MOVE *A2(210H),A0,0 //GET CHARACTER STATUS
298CMPI 5H,A0
299JREQ @P2_LISTENER
300
301CMPI 11H,A0 // ATTACKING
302JREQ @P2_TAG
303
304CMPI 1H,A0 // IDLE
305JRNE @P2_LISTENER
306
307// ===================
308// ** P2 TAG THREAD **
309// ===================
310//SHOULD NOT NEED DESTROYED AS THE COOLDOWN SHOULD BE LONGER THAN THREAD
311P2_TAG:
312MOVK 1H,A0
313MOVE A0,@CAMERA_HOLD_POSITION,0 //HALT PLAYER REPOSITIONING
314
315MOVE A1,*A13(100H),0 // UPDATE TIME STAMP
316
317// SWAP CHAR IDS
318MOVE @CHAR_ID_P2,A0,0 // GET CURRENT CHAR ID
319MOVE @CHAR_ID_P2_2,A1,0 // GET NEXT CHAR ID
320MOVE A0,@CHAR_ID_P2_2,0 // SET CURRENT CHAR AS NEXT
321MOVE A1,@CHAR_ID_P2,0 // SET NEXT CHAR AS CURRENT
322
323// HEALTH SWAP AND REFILL
324MOVE @HEALTH_P2_2ND,A11,0 // USED FOR HEALTH REFILL (MIGHT BE ALREADY IN A11)
325MOVE @HEALTH_P2,A0,0 // STORE EXITING CHAR HEALTH
326MOVE A0,@HEALTH_P2_2ND,0
327MOVK 2H,A1 // DESIGNATE WHICH PLAYER TO CHANGE
328CALLR @SWAP_HEALTH_AND_NAME
329
330// SET OBJECTS UP FOR UPCOMING THREAD
331MOVE @TABLE_OBJECT_P2_2ND,A8,1 // GET NEXT OBJECT
332MOVE @TABLE_OBJECT_P2,A3,1 // GET CURRENT OBJECT FOR LOCATIONAL PURPOSES
333
334// LAUNCH THREAD FOR FLIP-IN WITH HUMAN CONTROL
335CALLR @SUBR_HUMAN_FLIP_IN
336
337// SWAP CONTROL TABLES, ASSIGN FOCUS (MIGHT WANT TO DELAY THIS TO PREVENT CAMERA BULLYING)
338MOVE @TABLE_CONTROL_P2,A1,1
339MOVE A1,@TABLE_CONTROL_P2_2ND,1
340MOVE A0,@TABLE_CONTROL_P2,1
341
342CALLR @SET_GROUND_POSITION
343
344// ASSIGN INPUTS. EXPECTED A0=CONTROL THREAD
345ASSIGN_P2_CONTROL:
346MOVI @INPUT_CONTROLS_P2_JOYSTICK,A1
347MOVE A1,*A0(100H),1
348MOVI @INPUT_CONTROLS_P2_HP_BL_HK,A1
349MOVI @INPUT_CONTROLS_P2_LP_LK,A1
350MOVI 1600019H,A1
351MOVE A1,*A0(120H),1
352
353// CLEARS CONTROLS FROM OLD CHARACTER
354MOVE @TABLE_CONTROL_P2_2ND,A2,1 //GET P2 CONTROL THREAD LOCATION
355CLR A1
356MOVE A1,*A2(100H),1
357MOVE A1,*A2(120H),1
358
359// SWAP NEW OBJECT INTO 1ST SLOT, OLD OBJECT IN 2ND SLOT
360//CONTROL THREAD CHANGED ALREADY ABOVE HERE.
361MOVE @TABLE_OBJECT_P2,A1,1
362MOVE A1,@TABLE_OBJECT_P2_2ND,1
363MOVE A8,@TABLE_OBJECT_P2,1
364
365// CHECK IF EXITING CHARACTER IS IN MOVE THAT CAUSES ISSUES
366MOVE @TABLE_CONTROL_P2_2ND,A11,1
367JREQ @ASSIGNMENT_SETUP2
368
369MOVE A0,A10 //PRESERVES OUR NEW CONTROL THREAD IN A0
370
371ASSIGNMENT_DELAY2:
372MOVI 1H,A0
373CALLA @THREAD_DELAY
374
375MOVE *A11(1F0H),A1,0 //GET MOVE TYPE
376CALLR @ASSIGNMENT_DELAY_MOVES
377JREQ @ASSIGNMENT_DELAY2
378
379ASSIGNMENT_SETUP2:
380// TURN OFF EDGE COLLISION
381// MOVI 50H,A0
382// MOVE A0,@10619D0H,0
383
384// SETUP REGISTERS FOR OPPSING TABLE ASSIGNMENTS
385MOVE A10,A0
386
387MOVE @TABLE_CONTROL_P1,A1,1
388MOVE @TABLE_OBJECT_P1,A9,1
389MOVE @TABLE_OBJECT_P2,A8,1 //CHANGED TO 2ND CHAR SINCE WE MOVED SWAPPING DOWN
390CALLR @ASSIGN_OPPOSING_TABLES
391
392// WANT TO ENSURE NO CRASHES YET
393MOVK 12H,A0
394MOVE A0,*A8(160H),0 //UPDATE DRAW TYPE FOR SHADOWS
395
396// PUTS EXITING CHAR INTO FLIP OUT ONCE IN FIGHT STANCE
397FLIP_OUT_OLD_CHAR2:
398MOVI 1H,A0
399CALLA @THREAD_DELAY
400
401MOVE @TABLE_CONTROL_P2_2ND,A1,1 //GET OLD CHARS CONTROL THREAD
402MOVE *A1(1F0H),A0,0
403CMPI 303H,A0 //CHECKS IF IN FIGHT STANCE
404JRNE @FOC_CHECK_MOVE_ID_02
405JR @FOC_APPLY_FLIP_TO_OLD_CHAR2
406
407FOC_CHECK_MOVE_ID_02:
408MOVE A0,A0
409JRNE @FLIP_OUT_OLD_CHAR2
410
411
412FOC_APPLY_FLIP_TO_OLD_CHAR2:
413// PUT FLIP ROUTINE INTO EXITING CHARACTERS THREAD
414// THAT FLIP OUT ROUTINE SHOULD END EXITING CHAR'S CONTROL THREAD
415MOVI @FLIP_SPIN,A5
416MOVE A5,*A1(E0H),1
417
418MOVI 80H,A0
419CALLA @THREAD_DELAY
420
421//CLEAR PLAYER REPOSITION FLAG
422CLR A0
423MOVE A0,@CAMERA_HOLD_POSITION,0 //HOLD CAMERA POSITION FLAG
424
425JR @P2_LISTENER
426
427
428
429// ===================================================================================
430//
431// ** SHARED THREADS **
432//
433// ===================================================================================
434
435ROUND_INTRODUCTION:
436// THIS CREATES THE FIGHT STANCE ANIMATION AT ROUND START
437// FOR THE 2ND SET OF CHARACTERS
438CALLA @SMOKE_FX_TOGGLE
439CALLA FF906590H //FIGHT STANCE ANIMATION LOAD
440
441FS_LOOP:
442MOVK 1H,A0 //DELAY BEFORE NEXT SPRITE IS DISPLAYED
443CALLA @THREAD_DELAY
444CALLA @ANIMATION_RIP_SPRITE_TO_RAM //RIPS SPRITES INTO RAM
445MOVE @GAME_MODE_TIMER,A0,0
446CMPI 3FH,A0 //OUR DURATION BEFORE MOVING ON
447JRLT @FS_LOOP
448CALLA @SMOKE_FX_TOGGLE
449JR @FLIP_SPIN_AFTER_INTRO //JUMP THE SMOKE FX CALL ON INTRO
450
451FLIP_SPIN:
452//TOGGLES SMOKE OFF OUTCOMING CHAR IS E
453CALLA @SMOKE_FX_TOGGLE
454
455FLIP_SPIN_AFTER_INTRO:
456// CALCULATE SPIN DIRECTION HERE
457CALLR @CALCULATE_AREAS
458CMP A1,A4 //A1=LH EDGE A4=RH EDGE
459JRGT @FS_GO_LEFT
460
461// CHARACTER ON RIGHT SIDE OF SCREEN
462MOVK 1H,A11
463MOVE *A8(F0H),A4,0 //CHECK FACING DIRECTION
464BTST 4H,A4 //FACING RIGHT = 0/TRUE
465JREQ @FS_FORWARDS_ANIMATION //IF 0 THEN CHAR FACING RIGHT AND FLIP FORWARD
466JR @FS_BACKWARDS_ANIMATION //ELSE CHAR FACING LEFT AND FLIP BACKWARDS
467
468FS_GO_LEFT:
469// CHARACTER ON LEFT SIDE OF SCREEN
470CLR A11
471MOVE *A8(F0H),A4,0 //CHECK FACING DIRECTION
472BTST 4H,A4 //FACING RIGHT = 0/TRUE
473JRNE @FS_FORWARDS_ANIMATION
474
475FS_BACKWARDS_ANIMATION:
476MOVK 8H,A9 //FLIP BACKWARDS ANIMATION ID
477JR @ANIMATE_FLIP
478
479FS_FORWARDS_ANIMATION:
480MOVK 7H,A9 //FLIP FORWARDS ANIMATION ID
481
482ANIMATE_FLIP:
483CALLA @ANIMATION_CALCULATION_BASIC
484MOVK 3H,A0 //ANIMATION SPEED
485CALLA @ANIMATION_SPEED_SET //SETS ANIMATION IN RAM
486
487// CREATE CHAR MOVEMENT THREAD
488MOVI 280H,A1
489CALLR @CALCULATE_INSTANCE
490MOVI @FLIP_MOVE,A7 //MOVE CHAR THREAD
491CALLA @THREAD_CREATE
492
493MOVI 20H,A11
494
495FLIP_LOOP:
496MOVK 1H,A0
497CALLA @THREAD_DELAY
498CALLA @ANIMATION_RIP_SPRITE_TO_RAM //RIPS SPRITES INTO RAM
499
500DEC A11
501JRNE @FLIP_LOOP
502JA @THREAD_END
503
504FLIP_MOVE:
505// THIS MOVES OUR CHARACTER WHEN FLIPPING
506// 9F = LENGTH OF FLIP, HALF IS 4F
507// A11 HOLD DIRECTION. 0=LEFT; 1=RIGHT
508MOVE *A8(80H),A4,1 //X-POS
509MOVE *A8(A0H),A5,1 //Y-POS
510
511MOVI 80000H,A1 //SETS GRAVITY
512MOVE A1,*A8(20H),1
513
514MOVI 40000H,A1 //SETS HORIZONTAL VELOCITY
515MOVE A11,A11
516JRNE @SET_VELOCITY
517NOT A1 //INVERSES VELOCITY VALUE FOR P1
518SET_VELOCITY:
519MOVE A1,*A8(40H),1
520
521MOVI FFFA0000H,A3
522MOVI A0000H,A2 //CHAR HEIGHT MODIFIER
523MOVI 20H,A6 //OUR FRAME LIMIT
524
525MOVE_LOOP:
526SUBI 00008000H,A2 //UPDATES OUR MODIFIER
527SUB A2,A5 //SUBTRACTS MODIFIER FROM CHAR Y-POS
528ADDI 60000H,A4 //MOVE CHAR RIGHT
529MOVE A11,A11
530JRNE @WRITE_NEW_VALUES
531SUBI C0000H,A4 //MOVE CHAR LEFT
532
533WRITE_NEW_VALUES:
534MOVE A3,*A8(60H),1 //Y-VEL
535MOVE A4,*A8(80H),1 //CHAR HORIZONTAL LOC
536MOVE A5,*A8(A0H),1 //CHAR VERTICAL LOC
537
538MOVI 105FC00H,A1 //OUR CUSTOM RAM LOC FOR OUR 3RD CHARACTER
539MOVE *A8(1C0H),A9,0 //GET CHAR INSTANCE
540CMPI 2H,A9 //P2 CHAR INSTANCE
541JREQ @SAVE_REGISTERS
542CMPI 4H,A9 //P2 2ND CHAR INSTANCE
543JREQ @SAVE_REGISTERS
544MOVI 105FB00H,A1
545
546SAVE_REGISTERS:
547MMTM A1,A1-A8
548MOVK 1H,A0
549CALLA @THREAD_DELAY
550
551MOVI 105FB00H,A1
552CMPI 2H,A9
553JREQ @RESTORE_REGISTERS
554CMPI 4H,A9
555JREQ @RESTORE_REGISTERS
556MOVI 105FA00H,A1
557RESTORE_REGISTERS:
558MMFM A1,A1-A8
559
560DEC A6
561MOVE A6,A6
562JRNE @MOVE_LOOP
563
564MOVE A8,A0
565CALLA @TABLE_OBJECT_MAKE_INVISIBLE
566CALLA @OBJECT_CLEAR_ALL_VELOCITIES
567
568CLR A0
569MOVE A0,*A8(80H),0 //ELIMINATES ANY ODD LOCATION VALUE
570CALLA @CHAR_SET_GROUND_VALUE //PUTS CHARACTER ON GROUND
571
572JA @THREAD_END
573
574
575
576FLIP_IN_HUMAN:
577// SHARED THREAD SO NO STATIC ASSIGNMENTS!
578// SET LOCATION OF NEW CHAR. MAKE SURE OLD OBJECT IS IN A3.
579// TURNS OBJECT VISIBLE THAT'S FLIPPING IN.
580MOVE A8,A0
581CALLA @TABLE_OBJECT_MAKE_VISIBLE
582
583MOVK 1H,A1
584MOVE A1,*A13(210H),0 //UPDATE NEW THREAD AS PLAYER CONTROLLED
585
586//TOGGLES SMOKE ON IF CHAR E IS INCOMING
587CALLA @SMOKE_FX_TOGGLE
588
589MOVE @INPUT_CONTROLS_P1_JOYSTICK,A1,0 //P1 JOYSTICK INPUT ADDRESS
590MOVE *A3(1C0H),A0,0 //GET PLAYER INSTANCE
591CMPI 1H,A0 //P1 CHAR 1 INSTANCE ID
592JREQ @FIH_GET_INPUT_DESIRED_SIDE
593CMPI 3H,A0 //P1 CHAR 2 INSTANCE ID
594JREQ @FIH_GET_INPUT_DESIRED_SIDE
595MOVE @INPUT_CONTROLS_P2_JOYSTICK,A1,0 //P2 JOYSTICK INPUT ADDRESS
596
597FIH_GET_INPUT_DESIRED_SIDE:
598NOT A1
599ANDI FH,A1
600
601CMPI 4H,A1
602JREQ @FIH_LEFT_TO_RIGHT
603CMPI 8H,A1
604JREQ @FIH_RIGHT_TO_LEFT
605
606FIH_NONE_CHOSEN:
607MOVE *A3(F0H),A4,0
608BTST 4H,A4
609JRNE @FIH_RIGHT_TO_LEFT
610
611FIH_LEFT_TO_RIGHT:
612MOVE @CAMERA_HORIZONTAL_LONG,A1,1
613SUBI 320000H,A1
614MOVE A1,*A8(80H),1
615MOVK 7H,A0
616MOVI 8H,A1
617MOVI 40000H,A11
618JR @FIH_DO_FLIP
619
620FIH_RIGHT_TO_LEFT:
621MOVE @CAMERA_HORIZONTAL_LONG,A1,1
622ADDI 1C20000H,A1
623MOVE A1,*A8(80H),1
624MOVK 7H,A1
625MOVK 8H,A0
626MOVI FFFC0000H,A11
627
628FIH_DO_FLIP:
629GETPC A7
630ADDI 60H,A7
631MOVE A7,-*A12,1
632JA FF831190H
633JA FF82EE20H //JUMP TO START HUMAN CONTROL
634
635
636
637// ===================================================================================
638//
639// ** SHARED SUBROUTINES **
640//
641// ===================================================================================
642
643GET_TIMESTAMP:
644// GETS CURRENT GAME MODE TIME AND SUBTRACTS IT FROM LAST TIME STAMP TO CHECK COOL DOWN
645MOVE @GAME_MODE_TIMER,A1,0 //GET TIME
646SUB A1,A0
647ABS A0
648CMPI 50H,A0
649RETS
650
651SWAP_HEALTH_AND_NAME:
652// SWAPS NAMEPLATE AND HEALTH AMOUNT. A1 SHOULD BE 1 FOR P1 SIDE.
653MOVE A1,@WHICH_PLAYER_FLAG,0
654CALLA FFC8F380H //REFILL HEALTH
655CALLA FFC90480H //NAMEPLATE SWAP
656CALLA FFC8FD00H //NAME ANNOUNCEMENT
657RETS
658
659SET_GROUND_POSITION:
660// SETS CHARACTER'S FLOOR POSITION WITHIN THEIR CONTROL THREAD
661MMTM SP,A0
662CALLA @CHAR_SET_GROUND_VALUE
663MMFM SP,A0
664MOVE A1,*A0(200H),0
665RETS
666
667ASSIGN_OPPOSING_TABLES:
668// THIS SHARES OUR TABLES TO THE OPPOSING PLAYERS TABLES SO THEY PLAY TOGETHER.
669// A0=OUR CONTROL THREAD A8=OUR OBJECT TABLE A1=THEIR CONTROL TABLE A9=THEIR OBJECT TABLE
670// SEEMS TO ONLY BE A PROBLEM UPON CHAR CHANGING FACING DIRECTIONS...
671// STOP CHAR FROM TURNING? WILL NEED TO MODIFY CORE ROUTINE OR....
672// DELAY ASSIGNMENT OF A8 TABLE UNTIL MOVE IS FINISHED...SOUNDS BETTER...
673
674// LOOKS LIKE CONTROL THREAD IS GOING INTO OPPONENTS TABLE TOO FAST.
675// A0=OUR CONTROL THREAD A8=OUR OBJECT TABLE A1=THEIR CONTROL TABLE A9=THEIR OBJECT TABLE
676<2>
677MOVE A1,*A0(170H),1
678MOVE A8,*A1(140H),1 //FORCE OUR OPPONENT TO FOCUS ON NEW CHARACTER
679MOVE A9,*A0(140H),1
680MOVE A0,*A1(170H),1 //FORCE OUR CONTROL THREAD INTO OPPONETS THREAD. MAKES OPPONENT OBJECT COLLIDE
681RETS
682
683
684CALCULATE_INSTANCE:
685// THIS CREATES EVERY AN INSTANCE ID FOR EVERY THREAD FROM IT'S BASE AND OUR CHAR INSTANCE ID
686MOVE *A8(1C0H),A0,0
687ADD A0,A1
688RETS
689
690CALCULATE_AREAS:
691// THIS CALCULATES DISTANCE BETWEEN SCREEN EDGES FROM OBJECT ID IN A3
692// A1=LH EDGE A4=RH EDGE
693MOVE @CAMERA_HORIZONTAL,A4,0 //GET CAMERA LOCATION
694MOVE A4,A1
695
696MOVE *A8(90H),A2,0 //GET OLD CHARS LOCATION
697ADDI 1EH,A2 //CENTERS MASS
698
699// GET DISTANCE FROM LH EDGE TO CHAR IN A1
700SUB A2,A1
701ABS A1
702
703// GETS DISTANCE FROM RH TO CHAR BY LH EDGE DIFFERENCE FROM SCREEN WIDTH
704MOVI 190H,A4
705SUB A1,A4 //GETS THE SPACE BETWEEN THE RH EDGE AND CENTER OF CHARACTER
706ABS A4
707RETS
708
709ASSIGNMENT_DELAY_MOVES:
710// THIS RETURNS Z-FLAG IS CURRENT MOVE IS UNDERWAY AND DELAYS OUR CONTROL THREAD ASSIGNMENT UNTIL MOVE IS OVER.
711
712//ATTACK TYPES
713CMPI 122H,A1 //JAX'S GOTCHA PUNCHES
714JREQ @ASSIGNMENT_DELAY_MOVES_RET
715CMPI 507H,A1 //THROW
716JREQ @ASSIGNMENT_DELAY_MOVES_RET
717CMPI 604H,A1 //SPEARING
718JREQ @ASSIGNMENT_DELAY_MOVES_RET
719CMPI 405H,A1 //SPEARED
720JREQ @ASSIGNMENT_DELAY_MOVES_RET
721CMPI 20BH,A1 //LEG TAKEDOWN
722
723//REACTION TYPES
724// CMPI 401H,A1 //FROZEN
725// JREQ @ASSIGNMENT_DELAY_MOVES_RET
726// CMPI 60EH,A1 //SLIPPING ON ICE
727// JREQ @ASSIGNMENT_DELAY_MOVES_RET
728// CMPI 503H //SWEPT, UPPERCUT, SLID INTO
729
730ASSIGNMENT_DELAY_MOVES_RET:
731RETS
732
733SUBR_HUMAN_FLIP_IN:
734MOVE *A8(1C0H),A1,0
735ADDI 270H,A1
736MOVI @FLIP_IN_HUMAN,A7
737CALLA @THREAD_CREATE
738
739//ASSIGN OUR HUMAN FLIP-IN INSTANCE OF 1 FOR P1 SIDE
740// MOVK 1H,A1
741// MOVE A1,*A0(20H),0
742
743// HAD A BLOOD INSTANCE IN THAT OLD TABLE...CAN'T FIND WHAT WROTE IT ATM
744// TEMP FIX FOR OLD DATA NOT BEING WIPE OUT OF RECYCLED THREAD
745CLR A1
746MOVE A1,*A0(190H),1
747MOVE A1,*A0(250H),0 //ENSURE PUSHBACK FLAG ISN'T OCCUPIED IN NEW THREAD
748RETS