enemy: remove logic rule and args

This commit is contained in:
Andrei Alexeyev 2023-02-24 02:50:00 +01:00
parent 68abee46c2
commit ee2ed10400
No known key found for this signature in database
GPG key ID: 72D26128040B9690
7 changed files with 21 additions and 55 deletions

View file

@ -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;
}

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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);