Browse Source

can shoot and score large spheres

Thomas B 1 month ago
parent
commit
94d87687eb
1 changed files with 32 additions and 6 deletions
  1. 32
    6
      src/obj.c

+ 32
- 6
src/obj.c View File

@@ -54,13 +54,20 @@
54 54
 #define MAX_SHOT_LIGHT 3
55 55
 #define MAX_OBJ ((4 * MAX_DARK) + (4 * MAX_LIGHT) + MAX_SHOT + MAX_SHOT_DARK + MAX_SHOT_LIGHT)
56 56
 
57
-#define MAX_TRAVEL 32
57
+#define MAX_TRAVEL 128
58 58
 
59 59
 #define GRAVITY_RANGE (32 << POS_SCALE_OBJS)
60 60
 #define GRAVITY_SHIFT (POS_SCALE_OBJS + 4)
61 61
 #define DAMAGE_RANGE (16 << POS_SCALE_OBJS)
62 62
 #define DAMAGE_INC 3
63 63
 
64
+#define PICKUP_SMALL_RANGE (10 << POS_SCALE_OBJS)
65
+#define PICKUP_LARGE_RANGE (16 << POS_SCALE_OBJS)
66
+#define SHOT_RANGE (10 << POS_SCALE_OBJS)
67
+
68
+#define SCORE_SMALL 5
69
+#define SCORE_LARGE 10
70
+
64 71
 struct obj {
65 72
     uint8_t active;
66 73
     enum SPRITES sprite;
@@ -122,9 +129,6 @@ enum OBJ_STATE obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_
122 129
     return OBJ_ADDED;
123 130
 }
124 131
 
125
-#define PICKUP_SMALL_RANGE (10 << POS_SCALE_OBJS)
126
-#define PICKUP_LARGE_RANGE (16 << POS_SCALE_OBJS)
127
-
128 132
 int16_t obj_act(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score) NONBANKED {
129 133
     int16_t damage = 0;
130 134
 
@@ -174,18 +178,40 @@ int16_t obj_act(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score) NONBANKE
174 178
 
175 179
             case SPR_SHOT_DARK:
176 180
                 if ((abs(objs[i].off_x) <= PICKUP_SMALL_RANGE) && (abs(objs[i].off_y) <= PICKUP_SMALL_RANGE)) {
177
-                    (*score) -= 5;
181
+                    (*score) -= SCORE_SMALL;
178 182
                     objs[i].active = 0;
179 183
                 }
180 184
                 break;
181 185
 
182 186
             case SPR_SHOT_LIGHT:
183 187
                 if ((abs(objs[i].off_x) <= PICKUP_SMALL_RANGE) && (abs(objs[i].off_y) <= PICKUP_SMALL_RANGE)) {
184
-                    (*score) += 5;
188
+                    (*score) += SCORE_SMALL;
185 189
                     objs[i].active = 0;
186 190
                 }
187 191
                 break;
188 192
 
193
+            case SPR_SHOT:
194
+                for (uint8_t j = 0; j < MAX_OBJ; j++) {
195
+                    if ((!objs[j].active) || ((objs[j].sprite != SPR_LIGHT) && (objs[j].sprite != SPR_DARK))) {
196
+                        continue;
197
+                    }
198
+
199
+                    if ((abs(objs[i].off_x - objs[j].off_x) <= SHOT_RANGE)
200
+                            && (abs(objs[i].off_y - objs[j].off_y) <= SHOT_RANGE)) {
201
+                        objs[i].active = 0;
202
+                        objs[j].active = 0;
203
+
204
+                        if (objs[j].sprite == SPR_LIGHT) {
205
+                            (*score) += SCORE_LARGE;
206
+                        } else {
207
+                            (*score) -= SCORE_LARGE;
208
+                        }
209
+
210
+                        break;
211
+                    }
212
+                }
213
+                break;
214
+
189 215
             default:
190 216
                 break;
191 217
         }

Loading…
Cancel
Save