X-Git-Url: http://git.rohieb.name/hackover2013-badge-firmware.git/blobdiff_plain/2fb9f70df407a731f55952a7e70eea641ad275d9..5337261a68ea89b88624ca6fd7319cadd662e057:/badge/jumpnrun/enemies.h diff --git a/badge/jumpnrun/enemies.h b/badge/jumpnrun/enemies.h index 9c08f68..c66a28e 100644 --- a/badge/jumpnrun/enemies.h +++ b/badge/jumpnrun/enemies.h @@ -14,11 +14,10 @@ struct jumpnrun_tile_range; struct jumpnrun_enemy; typedef struct jumpnrun_enemy_type { - unsigned animation_ticks_per_frame; - size_t animation_length; + uint8_t animation_ticks_per_frame; + uint8_t animation_length; badge_sprite const *animation_frames; - vec2d extent; rectangle hitbox; vec2d spawn_inertia; @@ -29,7 +28,10 @@ typedef struct jumpnrun_enemy_type { void (*collision_player)(struct jumpnrun_enemy *self, struct jumpnrun_game_state *state, vec2d *player_inertia_mod); - void (*game_tick)(struct jumpnrun_enemy *self, + void (*collision_shots)(struct jumpnrun_enemy *self, + struct jumpnrun_game_state *state); + + void (*move_tick)(struct jumpnrun_enemy *self, struct jumpnrun_game_state *state, struct jumpnrun_level *lv, struct jumpnrun_tile_range const *visible_tiles, @@ -39,24 +41,21 @@ typedef struct jumpnrun_enemy_type { typedef struct jumpnrun_enemy { jumpnrun_moveable base; vec2d spawn_pos; - unsigned flags; jumpnrun_enemy_type const *type; } jumpnrun_enemy; enum { - JUMPNRUN_ENEMY_SPAWNED = 1, - JUMPNRUN_ENEMY_UNAVAILABLE = 2, - JUMPNRUN_ENEMY_FACING_RIGHT = 4 +// Do not collide with JUMPNRUN_MOVEABLE_* flags + JUMPNRUN_ENEMY_SPAWNED = 128, + JUMPNRUN_ENEMY_UNAVAILABLE = 64, + JUMPNRUN_ENEMY_MOVING = 32, + JUMPNRUN_ENEMY_EVENT_TRIGGER1 = 16 }; -static inline rectangle const *enemy_box (jumpnrun_enemy const *enemy) { return &enemy->base.current_box ; } -static inline vec2d enemy_position (jumpnrun_enemy const *enemy) { return enemy->base.current_box.pos; } -static inline rectangle enemy_hitbox (jumpnrun_enemy const *enemy) { rectangle r = enemy->type->hitbox; rectangle_move_rel(&r, enemy_position(enemy)); return r; } -static inline badge_sprite const *enemy_sprite (jumpnrun_enemy const *enemy) { return &enemy->type->animation_frames[enemy->base.anim_frame]; } - -static inline bool enemy_facing_right(jumpnrun_enemy const *enemy) { return (enemy->flags & JUMPNRUN_ENEMY_FACING_RIGHT) || fixed_point_gt(enemy->base.inertia.x, FIXED_INT(0)); } -static inline uint8_t enemy_render_flags(jumpnrun_enemy const *enemy) { return enemy_facing_right(enemy) ? BADGE_BLT_MIRRORED : 0; } +static inline rectangle const *enemy_hitbox(jumpnrun_enemy const *enemy) { return &enemy->base.hitbox; } +void jumpnrun_enemy_despawn(jumpnrun_enemy *self); +void jumpnrun_enemy_reset (jumpnrun_enemy *self); enum { JUMPNRUN_ENEMY_TYPE_CAT, @@ -68,6 +67,8 @@ enum { JUMPNRUN_ENEMY_TYPE_DOG, JUMPNRUN_ENEMY_TYPE_GIRAFFE, JUMPNRUN_ENEMY_TYPE_BIRD, + JUMPNRUN_ENEMY_TYPE_BIRD_STRAIGHT, + JUMPNRUN_ENEMY_TYPE_BIRD_DIP, JUMPNRUN_ENEMY_TYPE_COUNT };