self->alive = new_array(sizeof(enemy_t*), 10);
self->breached = new_array(sizeof(enemy_t*), 20);
self->backfill = new_array(sizeof(enemy_t*), 10);
+ self->tmp_e = new_array(sizeof(enemy_t*), 10);
- self->projs = new_proj(-1, -1);
+ self->projs = new_proj(-1, -1); // fake item, HEAD
- if (!self->data || !self->paths || !self->towers
- || !self->alive || !self->breached || !self->backfill) {
+ if (!self->data || !self->paths || !self->towers || !self->alive
+ || !self->breached || !self->backfill || !self->tmp_e){
uninit_map(self);
return 0;
}
free_array(self->alive ); self->alive = NULL;
free_array(self->breached); self->breached = NULL;
free_array(self->backfill); self->backfill = NULL;
+ free_array(self->tmp_e ); self->tmp_e = NULL;
while (self->projs) {
proj_t *p = self->projs;
void map_move_1(map_t *self, array_t *events) {
int dead = 0;
-
array_deloop(self->alive, ptr, enemy_t*) {
enemy_t *alive = *ptr;
if (alive->alive)
dead++;
}
- if (dead > self->alive->count) {
- dead = 0;
- array_deloop(self->alive, ptr, enemy_t*) {
+ if (dead > (self->alive->count / 2)) {
+ array_clear(self->tmp_e);
+ array_loop(self->alive, ptr, enemy_t*) {
if((*ptr)->alive)
- break;
- dead++;
+ array_push(self->tmp_e, ptr);
}
-
- array_cut_at(self->alive, self->alive->count - dead);
+ array_steal_data(self->alive, self->tmp_e);
}
if (self->backfill->count) {
}
void map_fire_1(map_t *self, int current_tick, array_t *events) {
+ event_t event;
+ init_event(&event, FIRE);
+
array_loop(self->towers, tower, tower_t) {
tower_rearm(tower);
proj_t *target = tower_fire(tower, current_tick,
self->alive, self->paths);
if (!target)
continue;
+
target->next = self->projs->next;
self->projs->next = target;
+
+ event.x = tower->x;
+ event.y = tower->y;
+ event.move_to_x = target->x;
+ event.move_to_y = target->y;
+ array_push(events, &event);
}
}
fprintf(stderr, "\n");
}
-void display_event(event_t *self) {
+void output_event(event_t *self, FILE *file) {
const char *name = event_name(self);
switch (self->type) {
case FIRE: case HIT: case MOVE:
- fprintf(stderr, "[*] %s: (%d,%d) -> (%d,%d)\n", name,
+ fprintf(file, "EVENT:%s,%d,%d,%d,%d\n", name,
self->x, self->y, self->move_to_x, self->move_to_y);
break;
case BACKFILL: case DIE: case BREACH:
- fprintf(stderr, "[*] %s: (%d,%d)\n", name, self->x, self->y);
+ fprintf(file, "EVENT:%s,%d,%d\n", name, self->x, self->y);
break;
case ENTER: case WIN: case LOOSE:
- fprintf(stderr, "[*] %s\n", name);
+ fprintf(file, "EVENT:%s\n", name);
break;
}
}
-void output_event(event_t *self, FILE *file) {
- const char *name = event_name(self);
- fwrite(name, 1, strlen(name), file);
- fwrite("\n",1, 1, file);
-}
-
int main(int argc, char **argv) {
map_t *map = new_map(6, 4);
if (!map) {
if (displayMode) {
fprintf(stderr,
"Tick is: %d\n", engine->current_tick);
- array_loop(engine->events, event, event_t) {
- display_event(event);
- }
display(map);
}
break;