support action names in timeline manager

This commit is contained in:
Sebastian Krzyszkowiak 2012-04-09 17:17:16 +02:00
parent 6e27c1e3b5
commit cd6e5a0ff9
3 changed files with 46 additions and 30 deletions

View file

@ -259,7 +259,7 @@ bool Welcome(struct Game *game, struct TM_Action *action, enum TM_ActionState st
bool PassLevel(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state == TM_ACTIONSTATE_DESTROY) {
Level_Passed(game);
TM_AddBackgroundAction(&FadeOut, NULL, 0);
TM_AddBackgroundAction(&FadeOut, NULL, 0, "fadeout");
}
return true;
}
@ -282,18 +282,18 @@ void Level_Load(struct Game *game) {
if (game->level.current_level!=1) Moonwalk_Load(game);
else {
TM_Init(game);
TM_AddBackgroundAction(&FadeIn, NULL, 0);
TM_AddBackgroundAction(&FadeIn, NULL, 0, "fadein");
TM_AddDelay(1000);
TM_AddQueuedBackgroundAction(&Welcome, NULL, 0);
TM_AddQueuedBackgroundAction(&Welcome, NULL, 0, "welcome");
TM_AddDelay(1000);
TM_AddAction(&Walk, NULL);
TM_AddAction(&Move, NULL);
TM_AddAction(&Stop, NULL);
TM_AddAction(&Walk, NULL, "walk");
TM_AddAction(&Move, NULL, "move");
TM_AddAction(&Stop, NULL, "stop");
TM_AddDelay(1000);
TM_AddAction(&Letter, NULL);
TM_AddAction(&Letter, NULL, "letter");
TM_AddDelay(500);
TM_AddQueuedBackgroundAction(&Accelerate, NULL, 0);
TM_AddAction(&Fly, NULL);
TM_AddQueuedBackgroundAction(&Accelerate, NULL, 0, "accelerate");
TM_AddAction(&Fly, NULL, "fly");
// Derpy walks in... (background - owl)
// Derpy reads a letter
// Letter on screen
@ -312,7 +312,7 @@ void Level_Load(struct Game *game) {
// cutscene goes here
//
TM_AddAction(&PassLevel, NULL);
TM_AddAction(&PassLevel, NULL, "passlevel");
}
}

View file

@ -45,19 +45,23 @@ void TM_Process() {
if (*queue->function) {
queue->active = true;
if ((*queue->function)(game, queue, TM_ACTIONSTATE_RUNNING)) {
PrintConsole(game, "Timeline Manager: destroy action (queue) %d", queue->id);
PrintConsole(game, "Timeline Manager: queue: destroy action (%d - %s)", queue->id, queue->name);
queue->active=false;
(*queue->function)(game, queue, TM_ACTIONSTATE_DESTROY);
struct TM_Action *tmp = queue;
queue = queue->next;
free(tmp->name);
free(tmp);
if (queue) PrintConsole(game, "Timeline Manager: queue: run action (%d - %s)", queue->id, queue->name);
}
} else {
// delay
if (queue->active) {
struct TM_Action *tmp = queue;
queue = queue->next;
free(tmp->name);
free(tmp);
if (queue) PrintConsole(game, "Timeline Manager: queue: run action (%d - %s)", queue->id, queue->name);
} else {
al_start_timer(queue->timer);
}
@ -71,7 +75,7 @@ void TM_Process() {
if (*pom->function) {
if ((*pom->function)(game, pom, TM_ACTIONSTATE_RUNNING)) {
pom->active=false;
PrintConsole(game, "Timeline Manager: destroy action (background) %d", pom->id);
PrintConsole(game, "Timeline Manager: background: destroy action (%d - %s)", pom->id, pom->name);
(*pom->function)(game, pom, TM_ACTIONSTATE_DESTROY);
if (tmp) {
tmp->next = pom->next;
@ -92,6 +96,7 @@ void TM_Process() {
tmp = pom;
pom = pom->next;
} else {
free(pom->name);
free(pom);
tmp2 = tmp;
if (!tmp) pom=background->next;
@ -107,15 +112,14 @@ void TM_HandleEvent(ALLEGRO_EVENT *ev) {
if (paused) return;
if (queue) {
if (ev->timer.source == queue->timer) {
PrintConsole(game, "Timeline Manager: event matched (queue) %d", queue->id);
queue->active=true;
al_destroy_timer(queue->timer);
queue->timer = NULL;
if (queue->function) {
PrintConsole(game, "Timeline Manager: init action (queue) %d", queue->id);
PrintConsole(game, "Timeline Manager: queue: init action (%d - %s)", queue->id, queue->name);
(*queue->function)(game, queue, TM_ACTIONSTATE_INIT);
} else {
PrintConsole(game, "Timeline Manager: delay reached (queue) %d", queue->id);
PrintConsole(game, "Timeline Manager: queue: delay reached (%d - %s)", queue->id, queue->name);
}
return;
}
@ -123,11 +127,10 @@ void TM_HandleEvent(ALLEGRO_EVENT *ev) {
struct TM_Action *pom = background;
while (pom) {
if (ev->timer.source == pom->timer) {
PrintConsole(game, "Timeline Manager: event matched (background) %d", pom->id);
PrintConsole(game, "Timeline Manager: background: delay reached, init and run action (%d - %s)", pom->id, pom->name);
pom->active=true;
al_destroy_timer(pom->timer);
pom->timer = NULL;
PrintConsole(game, "Timeline Manager: delay reached, init action (background) %d", pom->id);
(*pom->function)(game, pom, TM_ACTIONSTATE_INIT);
return;
}
@ -135,7 +138,7 @@ void TM_HandleEvent(ALLEGRO_EVENT *ev) {
}
}
struct TM_Action* TM_AddAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args) {
struct TM_Action* TM_AddAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, char* name) {
struct TM_Action *action = malloc(sizeof(struct TM_Action));
if (queue) {
struct TM_Action *pom = queue;
@ -149,18 +152,20 @@ struct TM_Action* TM_AddAction(bool (*func)(struct Game*, struct TM_Action*, enu
action->next = NULL;
action->function = func;
action->arguments = args;
action->name = malloc((strlen(name)+1)*sizeof(char));
strcpy(action->name, name);
action->timer = NULL;
action->active = false;
action->delay = 0;
action->id = ++lastid;
if (action->function) {
PrintConsole(game, "Timeline Manager: init action (queue) %d", action->id);
PrintConsole(game, "Timeline Manager: queue: init action (%d - %s)", action->id, action->name);
(*action->function)(game, action, TM_ACTIONSTATE_INIT);
}
return action;
}
struct TM_Action* TM_AddBackgroundAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, float delay) {
struct TM_Action* TM_AddBackgroundAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, float delay, char* name) {
struct TM_Action *action = malloc(sizeof(struct TM_Action));
if (background) {
struct TM_Action *pom = background;
@ -174,6 +179,8 @@ struct TM_Action* TM_AddBackgroundAction(bool (*func)(struct Game*, struct TM_Ac
action->next = NULL;
action->function = func;
action->arguments = args;
action->name = malloc((strlen(name)+1)*sizeof(char));
strcpy(action->name, name);
action->delay = delay;
action->id = ++lastid;
if (delay) {
@ -184,7 +191,7 @@ struct TM_Action* TM_AddBackgroundAction(bool (*func)(struct Game*, struct TM_Ac
} else {
action->timer = NULL;
action->active = true;
PrintConsole(game, "Timeline Manager: init action (background) %d", action->id);
PrintConsole(game, "Timeline Manager: background: init and run action (%d - %s)", action->id, action->name);
(*action->function)(game, action, TM_ACTIONSTATE_INIT);
}
return action;
@ -193,16 +200,22 @@ struct TM_Action* TM_AddBackgroundAction(bool (*func)(struct Game*, struct TM_Ac
bool runinbackground(struct Game* game, struct TM_Action* action, enum TM_ActionState state) {
if (state != TM_ACTIONSTATE_RUNNING) return false;
float* delay = (float*) action->arguments->next->value;
TM_AddBackgroundAction(action->arguments->value, action->arguments->next->next, *delay);
char* name = (char*) action->arguments->next->next->value;
TM_AddBackgroundAction(action->arguments->value, action->arguments->next->next->next, *delay, name);
free(name);
return true;
}
struct TM_Action* TM_AddQueuedBackgroundAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, float delay) {
struct TM_Action* TM_AddQueuedBackgroundAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, float delay, char* name) {
struct TM_Arguments* arguments = TM_AddToArgs(NULL, (void*) func);
arguments = TM_AddToArgs(arguments, malloc(sizeof(float)));
arguments = TM_AddToArgs(arguments, NULL);
*(float*)(arguments->next->value) = delay;
arguments->next->next = args;
return TM_AddAction(*runinbackground, arguments);
arguments->next->next->value = malloc((strlen(name)+1)*sizeof(char));
strcpy(arguments->next->next->value, name);
arguments->next->next->next = args;
return TM_AddAction(*runinbackground, arguments, "TM_BackgroundAction");
}
void TM_AddDelay(float delay) {
@ -210,8 +223,8 @@ void TM_AddDelay(float delay) {
tmp = malloc(sizeof(int));
*tmp = delay;
TM_AddAction(NULL, TM_AddToArgs(NULL, tmp));*/
struct TM_Action* tmp = TM_AddAction(NULL, NULL);
PrintConsole(game, "Timeline Manager: adding delay %f ms %d", delay, tmp->id);
struct TM_Action* tmp = TM_AddAction(NULL, NULL, "Delay");
PrintConsole(game, "Timeline Manager: queue: adding delay %f ms (%d)", delay, tmp->id);
tmp->delay = delay;
tmp->timer = al_create_timer(delay/1000.0);
al_register_event_source(game->event_queue, al_get_timer_event_source(tmp->timer));
@ -257,6 +270,7 @@ void TM_Destroy() {
tmp = pom;
pom = pom->next;
} else {
free(pom->name);
free(pom);
tmp2 = tmp;
if (!tmp) pom=background->next;
@ -280,6 +294,7 @@ void TM_Destroy() {
tmp = pom;
pom = pom->next;
} else {
free(pom->name);
free(pom);
tmp2 = tmp;
if (!tmp) pom=background->next;

View file

@ -41,18 +41,19 @@ struct TM_Action {
int delay;
struct TM_Action *next;
unsigned int id;
char* name;
//*prev;
};
void TM_Init(struct Game* game);
void TM_Process();
void TM_HandleEvent(ALLEGRO_EVENT *ev);
struct TM_Action* TM_AddAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args);
struct TM_Action* TM_AddBackgroundAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, float delay);
struct TM_Action* TM_AddAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, char* name);
struct TM_Action* TM_AddBackgroundAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, float delay, char* name);
struct TM_Action* TM_AddQueuedBackgroundAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, float delay, char* name);
void TM_AddDelay(float delay);
void TM_Pause(bool pause);
void TM_Destroy();
struct TM_Arguments* TM_AddToArgs(struct TM_Arguments* args, void* arg);
void TM_DestroyArgs(struct TM_Arguments* args);
bool TM_Initialized();
struct TM_Action* TM_AddQueuedBackgroundAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, float delay);