|
@@ -28,16 +28,16 @@
|
28
|
28
|
#include "obj.h"
|
29
|
29
|
|
30
|
30
|
/*
|
31
|
|
- * sprite budget:
|
|
31
|
+ * sprite budget: TODO
|
32
|
32
|
*
|
33
|
33
|
* fixed:
|
34
|
|
- * ship: 4
|
35
|
|
- * thruster: 1
|
|
34
|
+ * ship: 4 + 5
|
|
35
|
+ * thruster: 1 - 1
|
36
|
36
|
* health: 4
|
37
|
37
|
* power: 4
|
38
|
|
- * --> 13 fixed
|
|
38
|
+ * --> 17 fixed
|
39
|
39
|
*
|
40
|
|
- * hardware tiles: 40 - 13 = 27
|
|
40
|
+ * hardware tiles: 40 - 13 = 27 - 4 = 23
|
41
|
41
|
*
|
42
|
42
|
* dynamic:
|
43
|
43
|
* shot: 1
|
|
@@ -84,19 +84,6 @@ void obj_init(void) NONBANKED {
|
84
|
84
|
memset(objs, 0, sizeof(objs));
|
85
|
85
|
}
|
86
|
86
|
|
87
|
|
-static uint8_t cnt_sprite(enum SPRITES sprite) NONBANKED {
|
88
|
|
- uint8_t cnt = 0;
|
89
|
|
- for (uint8_t i = 0; i < MAX_OBJ; i++) {
|
90
|
|
- if (!objs[i].active) {
|
91
|
|
- continue;
|
92
|
|
- }
|
93
|
|
- if (objs[i].sprite == sprite) {
|
94
|
|
- cnt++;
|
95
|
|
- }
|
96
|
|
- }
|
97
|
|
- return cnt;
|
98
|
|
-}
|
99
|
|
-
|
100
|
87
|
enum OBJ_STATE obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_t spd_x, int16_t spd_y) NONBANKED {
|
101
|
88
|
uint8_t obj_cnt = 0xFF;
|
102
|
89
|
for (uint8_t i = 0; i < MAX_OBJ; i++) {
|
|
@@ -109,14 +96,6 @@ enum OBJ_STATE obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_
|
109
|
96
|
return OBJ_LIST_FULL;
|
110
|
97
|
}
|
111
|
98
|
|
112
|
|
- if (((sprite == SPR_DARK) && (cnt_sprite(sprite) >= MAX_DARK))
|
113
|
|
- || ((sprite == SPR_LIGHT) && (cnt_sprite(sprite) >= MAX_LIGHT))
|
114
|
|
- || ((sprite == SPR_SHOT) && (cnt_sprite(sprite) >= MAX_SHOT))
|
115
|
|
- || ((sprite == SPR_SHOT_DARK) && (cnt_sprite(sprite) >= MAX_SHOT_DARK))
|
116
|
|
- || ((sprite == SPR_SHOT_LIGHT) && (cnt_sprite(sprite) >= MAX_SHOT_LIGHT))) {
|
117
|
|
- return OBJ_TYPE_FULL;
|
118
|
|
- }
|
119
|
|
-
|
120
|
99
|
objs[obj_cnt].active = 1;
|
121
|
100
|
objs[obj_cnt].sprite = sprite;
|
122
|
101
|
objs[obj_cnt].off_x = off_x << POS_SCALE_OBJS;
|
|
@@ -129,8 +108,10 @@ enum OBJ_STATE obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_
|
129
|
108
|
return OBJ_ADDED;
|
130
|
109
|
}
|
131
|
110
|
|
132
|
|
-int16_t obj_act(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score) NONBANKED {
|
|
111
|
+int16_t obj_do(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score, uint8_t *hiwater) NONBANKED {
|
133
|
112
|
int16_t damage = 0;
|
|
113
|
+
|
|
114
|
+ // initial speed
|
134
|
115
|
int16_t spd_x = *spd_off_x;
|
135
|
116
|
int16_t spd_y = *spd_off_y;
|
136
|
117
|
|
|
@@ -154,10 +135,13 @@ int16_t obj_act(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score) NONBANKE
|
154
|
135
|
continue;
|
155
|
136
|
}
|
156
|
137
|
|
157
|
|
- // handle collission
|
|
138
|
+ int abs_off_x = abs(objs[i].off_x);
|
|
139
|
+ int abs_off_y = abs(objs[i].off_y);
|
|
140
|
+
|
|
141
|
+ // handle collision
|
158
|
142
|
switch (objs[i].sprite) {
|
159
|
143
|
case SPR_DARK:
|
160
|
|
- if ((abs(objs[i].off_x) <= GRAVITY_RANGE) && (abs(objs[i].off_y) <= GRAVITY_RANGE)) {
|
|
144
|
+ if ((abs_off_x <= GRAVITY_RANGE) && (abs_off_y <= GRAVITY_RANGE)) {
|
161
|
145
|
if (objs[i].off_x > 0) {
|
162
|
146
|
*spd_off_x += (GRAVITY_RANGE - objs[i].off_x) >> GRAVITY_SHIFT;
|
163
|
147
|
} else if (objs[i].off_x < 0) {
|
|
@@ -170,13 +154,13 @@ int16_t obj_act(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score) NONBANKE
|
170
|
154
|
}
|
171
|
155
|
}
|
172
|
156
|
|
173
|
|
- if ((abs(objs[i].off_x) <= DAMAGE_RANGE) && (abs(objs[i].off_y) <= DAMAGE_RANGE)) {
|
|
157
|
+ if ((abs_off_x <= DAMAGE_RANGE) && (abs_off_y <= DAMAGE_RANGE)) {
|
174
|
158
|
damage += DAMAGE_INC;
|
175
|
159
|
}
|
176
|
160
|
break;
|
177
|
161
|
|
178
|
162
|
case SPR_LIGHT:
|
179
|
|
- if ((abs(objs[i].off_x) <= GRAVITY_RANGE) && (abs(objs[i].off_y) <= GRAVITY_RANGE)) {
|
|
163
|
+ if ((abs_off_x <= GRAVITY_RANGE) && (abs_off_y <= GRAVITY_RANGE)) {
|
180
|
164
|
if (objs[i].off_x > 0) {
|
181
|
165
|
*spd_off_x -= (GRAVITY_RANGE - objs[i].off_x) >> GRAVITY_SHIFT;
|
182
|
166
|
} else if (objs[i].off_x < 0) {
|
|
@@ -189,20 +173,20 @@ int16_t obj_act(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score) NONBANKE
|
189
|
173
|
}
|
190
|
174
|
}
|
191
|
175
|
|
192
|
|
- if ((abs(objs[i].off_x) <= PICKUP_LARGE_RANGE) && (abs(objs[i].off_y) <= PICKUP_LARGE_RANGE)) {
|
|
176
|
+ if ((abs_off_x <= PICKUP_LARGE_RANGE) && (abs_off_y <= PICKUP_LARGE_RANGE)) {
|
193
|
177
|
damage -= HEALTH_MAX;
|
194
|
178
|
}
|
195
|
179
|
break;
|
196
|
180
|
|
197
|
181
|
case SPR_SHOT_DARK:
|
198
|
|
- if ((abs(objs[i].off_x) <= PICKUP_SMALL_RANGE) && (abs(objs[i].off_y) <= PICKUP_SMALL_RANGE)) {
|
|
182
|
+ if ((abs_off_x <= PICKUP_SMALL_RANGE) && (abs_off_y <= PICKUP_SMALL_RANGE)) {
|
199
|
183
|
(*score) -= SCORE_SMALL;
|
200
|
184
|
objs[i].active = 0;
|
201
|
185
|
}
|
202
|
186
|
break;
|
203
|
187
|
|
204
|
188
|
case SPR_SHOT_LIGHT:
|
205
|
|
- if ((abs(objs[i].off_x) <= PICKUP_SMALL_RANGE) && (abs(objs[i].off_y) <= PICKUP_SMALL_RANGE)) {
|
|
189
|
+ if ((abs_off_x <= PICKUP_SMALL_RANGE) && (abs_off_y <= PICKUP_SMALL_RANGE)) {
|
206
|
190
|
(*score) += SCORE_SMALL;
|
207
|
191
|
objs[i].active = 0;
|
208
|
192
|
}
|
|
@@ -233,6 +217,8 @@ int16_t obj_act(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score) NONBANKE
|
233
|
217
|
default:
|
234
|
218
|
break;
|
235
|
219
|
}
|
|
220
|
+
|
|
221
|
+ spr_draw(objs[i].sprite, FLIP_NONE, objs[i].off_x >> POS_SCALE_OBJS, objs[i].off_y >> POS_SCALE_OBJS, 0, hiwater);
|
236
|
222
|
}
|
237
|
223
|
|
238
|
224
|
return damage;
|