enemy: remove logic rule and args
This commit is contained in:
parent
68abee46c2
commit
ee2ed10400
7 changed files with 21 additions and 55 deletions
43
src/enemy.c
43
src/enemy.c
|
@ -73,27 +73,17 @@ static void signal_event_once_with_damage_info(Enemy *e, CoEvent *evt, DamageInf
|
|||
_signal_event_with_damage_info(e, evt, dmg, coevent_signal_once);
|
||||
}
|
||||
|
||||
static inline int enemy_call_logic_rule(Enemy *e, int t) {
|
||||
static inline void enemy_update(Enemy *e, int t) {
|
||||
assert(e->damage_info == NULL);
|
||||
assert(t >= 0);
|
||||
|
||||
if(t == EVENT_KILLED) {
|
||||
signal_event_once_with_damage_info(e, &e->events.killed, NULL);
|
||||
}
|
||||
|
||||
if(e->logic_rule) {
|
||||
return e->logic_rule(e, t);
|
||||
} else if(t >= 0) {
|
||||
// TODO: backport unified left/right move animations from the obsolete `newart` branch
|
||||
cmplx v = move_update(&e->pos, &e->move);
|
||||
e->moving = fabs(creal(v)) >= 1;
|
||||
e->dir = creal(v) < 0;
|
||||
}
|
||||
|
||||
return ACTION_NONE;
|
||||
// TODO: backport unified left/right move animations from the obsolete `newart` branch
|
||||
cmplx v = move_update(&e->pos, &e->move);
|
||||
e->moving = fabs(creal(v)) >= 1;
|
||||
e->dir = creal(v) < 0;
|
||||
}
|
||||
|
||||
Enemy *create_enemy_p(EnemyList *enemies, cmplx pos, float hp, EnemyVisualRule visual_rule, EnemyLogicRule logic_rule,
|
||||
cmplx a1, cmplx a2, cmplx a3, cmplx a4) {
|
||||
Enemy *create_enemy_p(EnemyList *enemies, cmplx pos, float hp, EnemyVisualRule visual_rule) {
|
||||
if(IN_DRAW_CODE) {
|
||||
log_fatal("Tried to spawn an enemy while in drawing code");
|
||||
}
|
||||
|
@ -101,26 +91,15 @@ Enemy *create_enemy_p(EnemyList *enemies, cmplx pos, float hp, EnemyVisualRule v
|
|||
Enemy *e = alist_append(enemies, (Enemy*)objpool_acquire(stage_object_pools.enemies));
|
||||
e->moving = false;
|
||||
e->dir = 0;
|
||||
|
||||
e->birthtime = global.frames;
|
||||
e->pos = pos;
|
||||
e->pos0 = pos;
|
||||
e->pos0_visual = pos;
|
||||
|
||||
e->spawn_hp = hp;
|
||||
e->hp = hp;
|
||||
e->alpha = 1.0;
|
||||
|
||||
e->flags = 0;
|
||||
|
||||
e->logic_rule = logic_rule;
|
||||
e->visual_rule = visual_rule;
|
||||
|
||||
e->args[0] = a1;
|
||||
e->args[1] = a2;
|
||||
e->args[2] = a3;
|
||||
e->args[3] = a4;
|
||||
|
||||
e->hurt_radius = 7;
|
||||
e->hit_radius = 30;
|
||||
|
||||
|
@ -132,7 +111,6 @@ Enemy *create_enemy_p(EnemyList *enemies, cmplx pos, float hp, EnemyVisualRule v
|
|||
fix_pos0_visual(e);
|
||||
ent_register(&e->ent, ENT_TYPE_ID(Enemy));
|
||||
|
||||
enemy_call_logic_rule(e, EVENT_BIRTH);
|
||||
return e;
|
||||
}
|
||||
|
||||
|
@ -188,7 +166,6 @@ static void *_delete_enemy(ListAnchor *enemies, List* enemy, void *arg) {
|
|||
}
|
||||
|
||||
COEVENT_CANCEL_ARRAY(e->events);
|
||||
enemy_call_logic_rule(e, EVENT_DEATH);
|
||||
ent_unregister(&e->ent);
|
||||
objpool_release(stage_object_pools.enemies, alist_unlink(enemies, enemy));
|
||||
|
||||
|
@ -341,12 +318,12 @@ void process_enemies(EnemyList *enemies) {
|
|||
next = enemy->next;
|
||||
|
||||
if(enemy->flags & EFLAG_KILLED) {
|
||||
enemy_call_logic_rule(enemy, EVENT_KILLED);
|
||||
signal_event_once_with_damage_info(enemy, &enemy->events.killed, NULL);
|
||||
delete_enemy(enemies, enemy);
|
||||
continue;
|
||||
}
|
||||
|
||||
int action = enemy_call_logic_rule(enemy, global.frames - enemy->birthtime);
|
||||
enemy_update(enemy, global.frames - enemy->birthtime);
|
||||
|
||||
float hurt_radius = enemy_get_hurt_radius(enemy);
|
||||
|
||||
|
@ -356,7 +333,7 @@ void process_enemies(EnemyList *enemies) {
|
|||
|
||||
enemy->alpha = approach(enemy->alpha, 1.0, 1.0/60.0);
|
||||
|
||||
if(action == ACTION_DESTROY || should_auto_kill(enemy)) {
|
||||
if(should_auto_kill(enemy)) {
|
||||
delete_enemy(enemies, enemy);
|
||||
continue;
|
||||
}
|
||||
|
|
22
src/enemy.h
22
src/enemy.h
|
@ -27,7 +27,6 @@
|
|||
#endif
|
||||
|
||||
typedef LIST_ANCHOR(Enemy) EnemyList;
|
||||
typedef int (*EnemyLogicRule)(Enemy*, int t);
|
||||
typedef void (*EnemyVisualRule)(Enemy*, int t, bool render);
|
||||
|
||||
typedef enum EnemyFlag {
|
||||
|
@ -54,13 +53,7 @@ DEFINE_ENTITY_TYPE(Enemy, {
|
|||
cmplx pos;
|
||||
cmplx pos0;
|
||||
cmplx pos0_visual;
|
||||
|
||||
union {
|
||||
cmplx args[PROJ_DRAWRULE_NUMARGS];
|
||||
MoveParams move;
|
||||
};
|
||||
|
||||
EnemyLogicRule logic_rule;
|
||||
MoveParams move;
|
||||
EnemyVisualRule visual_rule;
|
||||
|
||||
COEVENTS_ARRAY(
|
||||
|
@ -115,21 +108,16 @@ DEFINE_ENTITY_TYPE(Enemy, {
|
|||
)
|
||||
});
|
||||
|
||||
#define create_enemy4c(p,h,d,l,a1,a2,a3,a4) create_enemy_p(&global.enemies,p,h,d,l,a1,a2,a3,a4)
|
||||
#define create_enemy3c(p,h,d,l,a1,a2,a3) create_enemy_p(&global.enemies,p,h,d,l,a1,a2,a3,0)
|
||||
#define create_enemy2c(p,h,d,l,a1,a2) create_enemy_p(&global.enemies,p,h,d,l,a1,a2,0,0)
|
||||
#define create_enemy1c(p,h,d,l,a1) create_enemy_p(&global.enemies,p,h,d,l,a1,0,0,0)
|
||||
|
||||
Enemy *create_enemy_p(
|
||||
EnemyList *enemies, cmplx pos, float hp, EnemyVisualRule draw_rule, EnemyLogicRule logic_rule,
|
||||
cmplx a1, cmplx a2, cmplx a3, cmplx a4
|
||||
);
|
||||
Enemy *create_enemy_p(EnemyList *enemies, cmplx pos, float hp, EnemyVisualRule draw_rule);
|
||||
|
||||
#ifdef ENEMY_DEBUG
|
||||
Enemy *_enemy_attach_dbginfo(Enemy *p, DebugInfo *dbg);
|
||||
#define create_enemy_p(...) _enemy_attach_dbginfo(create_enemy_p(__VA_ARGS__), _DEBUG_INFO_PTR_)
|
||||
#endif
|
||||
|
||||
#define create_enemy(pos, hp, draw_rule) \
|
||||
create_enemy_p(&global.enemies, pos, hp, draw_rule)
|
||||
|
||||
void delete_enemy(EnemyList *enemies, Enemy* enemy);
|
||||
void delete_enemies(EnemyList *enemies);
|
||||
|
||||
|
|
|
@ -196,7 +196,7 @@ TASK(enemy_drop_items, { BoxedEnemy e; ItemCounts items; }) {
|
|||
}
|
||||
|
||||
static Enemy *spawn(cmplx pos, const ItemCounts *item_drops, real hp, EnemyVisualRule visual) {
|
||||
Enemy *e = create_enemy_p(&global.enemies, pos, hp, visual, NULL, 0, 0, 0, 0);
|
||||
Enemy *e = create_enemy(pos, hp, visual);
|
||||
|
||||
if(item_drops) {
|
||||
INVOKE_TASK_WHEN(&e->events.killed, enemy_drop_items, ENT_BOX(e), *item_drops);
|
||||
|
|
|
@ -77,7 +77,7 @@ TASK(amulet, {
|
|||
MoveParams move;
|
||||
CoEvent *death_event;
|
||||
}) {
|
||||
Enemy *core = create_enemy_p(&global.enemies, ARGS.pos, 2000, amulet_visual, NULL, 0, 0, 0, 0);
|
||||
Enemy *core = create_enemy(ARGS.pos, 2000, amulet_visual);
|
||||
core->hurt_radius = 18;
|
||||
core->hit_radius = 36;
|
||||
core->flags |= EFLAG_NO_VISUAL_CORRECTION;
|
||||
|
|
|
@ -119,7 +119,7 @@ TASK(kurumi_vladsarmy_shield, { BoxedBoss boss; real angle; }) {
|
|||
int hp = 1500;
|
||||
Boss *b = NOT_NULL(ENT_UNBOX(ARGS.boss));
|
||||
|
||||
Enemy *e = create_enemy2c(b->pos, hp, kurumi_extra_shield_visual, NULL, 0, 0);
|
||||
Enemy *e = create_enemy(b->pos, hp, kurumi_extra_shield_visual);
|
||||
e->flags = EFLAG_IMPENETRABLE;
|
||||
|
||||
int timeout = 800;
|
||||
|
|
|
@ -444,7 +444,8 @@ TASK(scythe_post_mid, { cmplx pos; int fleetime; }) {
|
|||
|
||||
struct projentry *pe = &projs[i % (sizeof(projs)/sizeof(struct projentry))];
|
||||
|
||||
double ca = creal(e->args[1]) + i/60.0;
|
||||
// FIXME: find out what the args[1] was for
|
||||
double ca = /*creal(e->args[1]) +*/ i/60.0;
|
||||
Color *c = RGB(cos(ca), sin(ca), cos(ca+2.1));
|
||||
|
||||
play_sfx_ex(pe->snd, 3, true);
|
||||
|
|
|
@ -78,7 +78,7 @@ TASK(lightning_slave_move, { BoxedEnemy e; cmplx velocity; }) {
|
|||
}
|
||||
|
||||
TASK(lightning_slave, { cmplx pos; cmplx move_arg; }) {
|
||||
Enemy *e = TASK_BIND(create_enemy1c(ARGS.pos, 1, NULL, NULL, 0));
|
||||
Enemy *e = TASK_BIND(create_enemy(ARGS.pos, 1, NULL));
|
||||
e->flags = EFLAGS_GHOST;
|
||||
|
||||
INVOKE_TASK(lightning_slave_move, ENT_BOX(e), ARGS.move_arg);
|
||||
|
|
Loading…
Reference in a new issue