ToLive misc component
This commit is contained in:
parent
bba3e9d15b
commit
f70bf85ec2
@ -28,6 +28,7 @@ void misc_DeleteComponent(Component_Misc *misc) {
|
||||
void misc_thinker_HazardRespawn(App *app, Entity *e, Duration deltaTime) {
|
||||
if (!e->misc || !e->misc->respawn) {
|
||||
WARN("called on an entity without misc or misc.respawn", 0);
|
||||
e->thinker = NULL;
|
||||
return;
|
||||
}
|
||||
if (app->player->player == NULL) // No player
|
||||
@ -52,6 +53,7 @@ void misc_thinker_HazardRespawn(App *app, Entity *e, Duration deltaTime) {
|
||||
void misc_thinker_Hazard(App *app, Entity *e, Duration deltaTime) {
|
||||
if (!e->misc || !e->misc->hazard) {
|
||||
WARN("called on an entity without misc or misc.textbox", 0);
|
||||
e->thinker = NULL;
|
||||
return;
|
||||
}
|
||||
if (app->player->player == NULL) // No player
|
||||
@ -72,6 +74,7 @@ void misc_thinker_Hazard(App *app, Entity *e, Duration deltaTime) {
|
||||
void misc_thinker_Textbox(App *app, Entity *e, Duration deltaTime) {
|
||||
if (!e->misc || !e->misc->textbox) {
|
||||
WARN("called on an entity without misc or misc.textbox", 0);
|
||||
e->thinker = NULL;
|
||||
return;
|
||||
}
|
||||
misc_Textbox *t = e->misc->textbox;
|
||||
@ -94,6 +97,19 @@ void misc_thinker_Textbox(App *app, Entity *e, Duration deltaTime) {
|
||||
t->progress = fmaxf(0.0f, t->progress - duration_Seconds(deltaTime) * MISC_TEXTBOX_FADEIN_SPEED);
|
||||
}
|
||||
|
||||
void misc_thinker_ToLive(App *app, Entity *e, Duration deltaTime) {
|
||||
if (!e->misc || e->misc->tolive.microseconds == 0) {
|
||||
WARN("called on an entity without misc or misc.tolive", 0);
|
||||
e->thinker = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (e->misc->tolive.microseconds < time_Now().microseconds) {
|
||||
// After its allocated time
|
||||
entity_Delete(app->entity, e->id);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Utility functions for creating misc entities
|
||||
void misc_InstantiateTextbox(App *app, Entity *e, const char *text, Box2 trigger_box, float offset) {
|
||||
@ -131,3 +147,11 @@ void misc_InstantiateHazard(App *app, Entity *e, Box2 trigger_box) {
|
||||
|
||||
e->thinker = &misc_thinker_Hazard;
|
||||
}
|
||||
|
||||
void misc_InstantiateToLive(App *app, Entity *e, Duration duration, TimePoint since) {
|
||||
ASSERT(e->misc == NULL && "Instantiate must be called with e.misc not set");
|
||||
e->misc = zero_malloc(sizeof(Component_Misc));
|
||||
e->misc->tolive = time_After(since, duration);
|
||||
|
||||
e->thinker = &misc_thinker_ToLive;
|
||||
}
|
||||
|
@ -43,6 +43,10 @@ void misc_thinker_HazardRespawn(App *app, Entity *e, Duration deltaTime);
|
||||
// Tracks the player & harms on contact
|
||||
void misc_thinker_Hazard(App *app, Entity *e, Duration deltaTime);
|
||||
|
||||
// Thinker for tolive
|
||||
// Kills itself after some time
|
||||
void misc_thinker_ToLive(App *app, Entity *e, Duration deltaTime);
|
||||
|
||||
|
||||
// Misc data an entity in the map might want.
|
||||
// Used as patches for quick logic like hazard respawn & textbox
|
||||
@ -50,6 +54,7 @@ typedef struct {
|
||||
misc_Textbox *textbox;
|
||||
misc_HazardRespawn *respawn;
|
||||
Box2 *hazard; // Harms the player on contact if not null, relative
|
||||
TimePoint tolive; // Deletes itself after this time if it is not 0
|
||||
} Component_Misc;
|
||||
|
||||
// Deletes everything nested in misc, and then itself.
|
||||
@ -68,6 +73,13 @@ void misc_InstantiateHazardRespawn(App *app, Entity *e, Box2 trigger_box, Vec2 r
|
||||
// Creates misc & sets the thinker.
|
||||
void misc_InstantiateHazard(App *app, Entity *e, Box2 trigger_box);
|
||||
|
||||
// Inserts the components for the entity to kill itself after some time.
|
||||
// Creates misc & sets the thinker.
|
||||
//
|
||||
// You would normally want to set duration to a fixed amount,
|
||||
// and since to time_Now().
|
||||
void misc_InstantiateToLive(App *app, Entity *e, Duration duration, TimePoint since);
|
||||
|
||||
|
||||
static inline Box2 misc_TextboxUpright(double width, double height) {
|
||||
Box2 b = {
|
||||
|
6
types.c
6
types.c
@ -170,6 +170,12 @@ TimePoint time_Now() {
|
||||
return t;
|
||||
}
|
||||
|
||||
TimePoint time_After(TimePoint now, Duration after) {
|
||||
TimePoint p = {
|
||||
.microseconds = now.microseconds + after.microseconds};
|
||||
return p;
|
||||
}
|
||||
|
||||
Duration time_Since(TimePoint prev) {
|
||||
return time_Difference(time_Now(), prev);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user