1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
Laser_sight_check: ; BC = XY of the enemy. D is unchanged. Direction to face in E (or 0 if not)
LD A, E
DEC A
DEC D
XOR D
INC D
CP $00
JR Z, =.attack
BIT 1, A
JR NZ, =.attack
LD A, E
OR $00
LD D, A
RET
.attack:
LD E, $00
; straight line + distance <= 4
LD A, $mem_bunny_predicted_x
CP B
JR Z, =.vertical_distance_check
LD A, $mem_bunny_predicted_y
CP C
RET NZ
.horizontal_distance_check:
LD A, $mem_bunny_predicted_x
CP B
JR C, =.left
.right:
SUB $05
CP B
RET NC
LD E, $enum_direction_right
RET
.left:
ADD $04
CP B
RET C
LD E, $enum_direction_left
RET
.vertical_distance_check:
LD A, $mem_bunny_predicted_y
CP C
JR C, =.up
.down:
SUB $05
CP C
RET NC
LD E, $enum_direction_down
RET
.up:
ADD $04
CP C
RET C
LD E, $enum_direction_up
RET
Laser_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
PUSH DE
PUSH BC
LD A, E
DEC A
AND $03
SWAP A
SLA A
SLA A
OR $03 ; Laser_Animation
LD D, A
LD A, C
ADD B
LD B, A
LD A, $mem_bunny_x
LD C, A
LD A, $mem_bunny_y
ADD C
SUB B
.ABS
SWAP A
LD E, A
POP BC
LD A, D
LD D, $10
CALL =Try_Launch_Animation
LD A, $enum_animation_wait_mode
LD $mem_requested_mode, A
LD $mem_current_mode, A
CALL =Update_VBlank_Handler
LD A, E
SUB $f
LD E, A
LD A, $mem_animation_wait_frames
CP E
JR NC, =.skip_animation_wait_frames_update
LD A, E
LD $mem_animation_wait_frames, A
.skip_animation_wait_frames_update:
LD A, $mem_animation_wait_frames
POP DE
LD A, $mem_bunny_health
SUB $01
JR C, =.health_underflow_fix
DAA
LD $mem_bunny_health, A
JR =.Skip_health_underflow_fix
.health_underflow_fix:
LD A, $00
LD $mem_bunny_health, A
.Skip_health_underflow_fix:
RET
|