make TM_AddToArgs variadic function

This commit is contained in:
Sebastian Krzyszkowiak 2013-06-05 23:59:02 +02:00
parent 001ed62181
commit f73b9abd26
7 changed files with 34 additions and 41 deletions

View file

@ -64,8 +64,7 @@ bool Stop(struct Game *game, struct TM_Action *action, enum TM_ActionState state
bool FadeIn(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (!action->arguments) {
action->arguments = TM_AddToArgs(action->arguments, malloc(sizeof(float)));
action->arguments = TM_AddToArgs(action->arguments, (void*)al_create_bitmap(game->viewport.width, game->viewport.height));
action->arguments = TM_AddToArgs(action->arguments, 2, malloc(sizeof(float)), (void*)al_create_bitmap(game->viewport.width, game->viewport.height));
}
float* fadeloop;
ALLEGRO_BITMAP* fade_bitmap;
@ -94,8 +93,7 @@ bool FadeIn(struct Game *game, struct TM_Action *action, enum TM_ActionState sta
bool FadeOut(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (!action->arguments) {
action->arguments = TM_AddToArgs(action->arguments, malloc(sizeof(float)));
action->arguments = TM_AddToArgs(action->arguments, (void*)al_create_bitmap(game->viewport.width, game->viewport.height));
action->arguments = TM_AddToArgs(action->arguments, 2, malloc(sizeof(float)), (void*)al_create_bitmap(game->viewport.width, game->viewport.height));
}
float* fadeloop;
ALLEGRO_BITMAP* fade_bitmap;
@ -126,8 +124,7 @@ bool FadeOut(struct Game *game, struct TM_Action *action, enum TM_ActionState st
bool Welcome(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
float* tmp; bool* in;
if (!action->arguments) {
action->arguments = TM_AddToArgs(action->arguments, malloc(sizeof(float)));
action->arguments = TM_AddToArgs(action->arguments, malloc(sizeof(bool)));
action->arguments = TM_AddToArgs(action->arguments, 2, malloc(sizeof(float)), malloc(sizeof(bool)));
}
tmp = (float*)action->arguments->value;
in = (bool*)action->arguments->next->value;
@ -184,17 +181,14 @@ bool PassLevel(struct Game *game, struct TM_Action *action, enum TM_ActionState
bool Letter(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state == TM_ACTIONSTATE_INIT) {
float* f = (float*)malloc(sizeof(float));
*f = 0;
ALLEGRO_AUDIO_STREAM** stream = (ALLEGRO_AUDIO_STREAM**)malloc(sizeof(ALLEGRO_AUDIO_STREAM*));
TM_WrapArg(float, f, 0);
TM_WrapArg(ALLEGRO_AUDIO_STREAM*, stream, al_load_audio_stream(GetDataFilePath(game, "levels/1/letter.flac"), 4, 1024));
//FIXME: GetLevelFilename
//*stream = al_load_audio_stream(GetDataFilePath(game, GetLevelFilename(game, "levels/?/letter.flac")), 4, 1024);
*stream = al_load_audio_stream(GetDataFilePath(game, "levels/1/letter.flac"), 4, 1024);
al_attach_audio_stream_to_mixer(*stream, game->audio.voice);
al_set_audio_stream_playing(*stream, false);
al_set_audio_stream_gain(*stream, 2.00); // FIXME: fix audio file instead of gaining it here...
action->arguments = TM_AddToArgs(action->arguments, (void*)f);
action->arguments = TM_AddToArgs(action->arguments, (void*)stream);
action->arguments = TM_AddToArgs(action->arguments, 2, f, stream);
action->arguments->next->next = NULL;
} else if (state == TM_ACTIONSTATE_DESTROY) {
ALLEGRO_AUDIO_STREAM** stream = (ALLEGRO_AUDIO_STREAM**)action->arguments->next->value;

View file

@ -60,10 +60,8 @@ void Gamestate_Start(struct Game *game, struct Level1Resources* data) {
// cutscene goes here */
struct TM_Arguments *args = TM_AddToArgs(NULL, strdup("level1"));
TM_WrapArg(int, level, 1);
TM_AddToArgs(args, level);
TM_AddAction(&PassLevel, args, "passlevel");
TM_AddAction(&PassLevel, TM_AddToArgs(NULL, 2, strdup("level1"), level), "passlevel");
// init level specific obstacle (owl) for Dodger module
struct Obstacle *obst = malloc(sizeof(struct Obstacle));

View file

@ -45,11 +45,8 @@ void* Gamestate_Load(struct Game *game, void (*progress)(struct Game*)) {
data->moonwalk = Moonwalk_Load(game, LEVEL);
(*progress)(game);
struct TM_Arguments *args = TM_AddToArgs(NULL, strdup(levelx));
int* level = malloc(sizeof(int));
*level=LEVEL;
TM_AddToArgs(args, level);
TM_AddAction(&PassLevel, args, "passlevel");
TM_WrapArg(int, level, LEVEL);
TM_AddAction(&PassLevel, TM_AddToArgs(NULL, 2, strdup(levelx), level), "passlevel");
(*progress)(game);
data->font = al_load_ttf_font(GetDataFilePath(game, "fonts/ShadowsIntoLight.ttf"),game->viewport.height*0.09,0 );

View file

@ -93,7 +93,7 @@ bool Run(struct Game *game, struct TM_Action *action, enum TM_ActionState state)
bool GenerateObstacles(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
int* count;
if (!action->arguments) {
action->arguments = TM_AddToArgs(action->arguments, malloc(sizeof(int)));
action->arguments = TM_AddToArgs(action->arguments, 1, malloc(sizeof(int)));
}
count = (int*)action->arguments->value;
if (state == TM_ACTIONSTATE_INIT) {

View file

@ -86,7 +86,7 @@ struct Moonwalk* Moonwalk_Load(struct Game *game, int current_level) {
al_set_sample_instance_playmode(data->music, ALLEGRO_PLAYMODE_LOOP);
TM_Init(game);
TM_AddAction(&DoMoonwalk, TM_AddToArgs(NULL, data->derpy), "moonwalk");
TM_AddAction(&DoMoonwalk, TM_AddToArgs(NULL, 1, data->derpy), "moonwalk");
return data;
}

View file

@ -266,12 +266,8 @@ bool runinbackground(struct Game* game, struct TM_Action* action, enum TM_Action
}
struct TM_Action* TM_AddQueuedBackgroundAction(bool (*func)(struct Game*, struct TM_Action*, enum TM_ActionState), struct TM_Arguments* args, int delay, char* name) {
struct TM_Arguments* arguments = TM_AddToArgs(NULL, (void*) func);
arguments = TM_AddToArgs(arguments, malloc(sizeof(int)));
arguments = TM_AddToArgs(arguments, NULL);
*(int*)(arguments->next->value) = delay;
arguments->next->next->value = strdup(name);
TM_WrapArg(int, del, delay);
struct TM_Arguments* arguments = TM_AddToArgs(NULL, 3, (void*) func, del, strdup(name));
arguments->next->next->next = args;
return TM_AddAction(*runinbackground, arguments, "TM_BackgroundAction");
}
@ -343,20 +339,28 @@ void TM_Destroy(void) {
game = NULL;
}
struct TM_Arguments* TM_AddToArgs(struct TM_Arguments* args, void* arg) {
struct TM_Arguments* TM_AddToArgs(struct TM_Arguments* args, int num, ...) {
va_list ap;
int i;
va_start(ap, num);
struct TM_Arguments* tmp = args;
if (!args) {
tmp = malloc(sizeof(struct TM_Arguments));
tmp->value = arg;
tmp->next = NULL;
return tmp;
for(i = 0; i < num; i++) {
if (!tmp) {
tmp = malloc(sizeof(struct TM_Arguments));
tmp->value = va_arg(ap, void*);
tmp->next = NULL;
args = tmp;
} else {
while (tmp->next) {
tmp = tmp->next;
}
tmp->next = malloc(sizeof(struct TM_Arguments));
tmp->next->value = va_arg(ap, void*);
tmp->next->next = NULL;
}
}
while (tmp->next) {
tmp = tmp->next;
}
tmp->next = malloc(sizeof(struct TM_Arguments));
tmp->next->value = arg;
tmp->next->next = NULL;
va_end(ap);
return args;
}

View file

@ -78,7 +78,7 @@ void TM_AddDelay(int delay);
/*! \brief Destroy timeline. */
void TM_Destroy(void);
/*! \brief Add data to TM_Arguments queue. */
struct TM_Arguments* TM_AddToArgs(struct TM_Arguments* args, void* arg);
struct TM_Arguments* TM_AddToArgs(struct TM_Arguments* args, int num, ...);
/*! \brief Destroy TM_Arguments queue. */
void TM_DestroyArgs(struct TM_Arguments* args);
/*! \brief Check if timeline is initialised. */