aboutsummaryrefslogtreecommitdiff
path: root/enemiesattacks/walkaway.gbasm
blob: 60851a4abf0b1799b3f72fdd1c2374632db458b9 (plain)
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
131
132
133
134
135
136
137
138
139
140
141
142
143
Walking_Away: ; entity XY in BC, Breaks DE
	; Is Bunny close enough to follow
	LD A, $mem_bunny_x
	SUB B
	.ABS
	CP $08
	JR NC, =.Random_walker

	LD A, $mem_bunny_y
	SUB C
	.ABS
	CP $08
	JR NC, =.Random_walker

	JR =.Follow_bunny

	.Random_walker:
	CALL =RNG_Step
	LD E, $00
	RR A
	RR E
	SWAP E
	AND $03
	INC A
	OR E
	LD D, A
	AND $07
	SWAP A
	OR D
	LD D, A
	JP =.Check_Collision

	.Follow_bunny:
	LD A, $mem_bunny_predicted_x
	LD $tmp_var_1, A

	LD A, $mem_bunny_predicted_y
	LD $tmp_var_2, A

	CALL =RNG_Step
	AND $02
	LD $tmp_var_3, A

	CP $00
	JR Z, =.skip_invert_axis

	LD A, $mem_bunny_predicted_y
	LD $tmp_var_1, A

	LD A, $mem_bunny_predicted_x
	LD $tmp_var_2, A

	LD E, B
	LD B, C
	LD C, E

	.skip_invert_axis:

	; Choose direction
	LD A, B
	ADD $80
	LD E, A
	LD A, $tmp_var_1
	ADD $80
	CP E
	JR Z =.Vertical
	JR C =.Go_Left

	.Go_Right:
	LD A, $enum_direction_left
	JR =.Check_Horizontal_Collision
	.Go_Left:
	LD A, $enum_direction_right

	.Check_Horizontal_Collision:
	LD E, A
	DEC E
	LD A, $tmp_var_3
	XOR E
	INC E
	INC A
	OR $08
	PUSH BC
	CALL =Get_Position_After_Move
	CALL =Is_Collisionable
	POP BC
	CP $00
	LD A, E
	JR Z, =.Direction_check_end

	.Vertical:
	LD A, C
	ADD $80
	LD E, A
	LD A, $tmp_var_2
	ADD $80
	CP E

	JR Z =.No_movement
	JR C =.Go_Up
	.Go_Down:
	LD A, $enum_direction_up
	JR =.Direction_check_end
	.Go_Up:
	LD A, $enum_direction_down

	.Direction_check_end:

	DEC A
	LD E, A
	LD A, $tmp_var_3
	XOR E
	INC A
	OR $08
	LD D, A
	AND $07
	SWAP A
	OR D
	LD D, A

	; Check collision

	.No_movement:
	LD A, $tmp_var_3
	CP $00
	JR Z, =.skip_invert_axis2
	LD E, B
	LD B, C
	LD C, E
	.skip_invert_axis2:

	.Check_Collision:
	PUSH BC
	LD A, D
	CALL =Get_Position_After_Move
	CALL =Is_Collisionable
	CALL =Carve_Entity_Collision_Map
	POP BC
	CP $00
	RET Z
	RES 3, D

	RET