diff --git a/build b/build index 0b78e85..35a28da 100755 --- a/build +++ b/build @@ -1,4 +1,4 @@ #!/bin/sh echo run $@ > gdb.tmp -make -j10 && gdb bin/superderpy -x gdb.tmp +make -j12 && gdb bin/superderpy -x gdb.tmp rm gdb.tmp diff --git a/src/about.c b/src/about.c index fd4fc6f..ce2a826 100644 --- a/src/about.c +++ b/src/about.c @@ -25,6 +25,7 @@ void About_Draw(struct Game *game) { /*PrintConsole(game, "%d", al_get_sample_instance_position(game->about.music));*/ if (al_get_sample_instance_position(game->about.music)<700000) { al_clear_to_color(al_map_rgba(0,0,0,0)); return; } if (game->about.fadeloop>=0) { + if (game->about.fadeloop==0) PrintConsole(game, "Fade in"); al_draw_tinted_bitmap(game->about.fade_bitmap,al_map_rgba_f(game->about.fadeloop/255.0,game->about.fadeloop/255.0,game->about.fadeloop/255.0,1),0,0,0); game->about.fadeloop+=tps(game, 300); if (game->about.fadeloop>=256) { diff --git a/src/level.c b/src/level.c index eeeba93..a330166 100644 --- a/src/level.c +++ b/src/level.c @@ -27,6 +27,44 @@ /* TODO: check if spritesheet speed still depends on FPS */ +void SelectDerpySpritesheet(struct Game *game, char* name) { + struct Spritesheet *tmp = game->level.derpy_sheets; + if (!tmp) { + PrintConsole(game, "ERROR: No spritesheets registered for Derpy!"); + return; + } + while (tmp) { + if (!strcmp(tmp->name, name)) { + PrintConsole(game, "Selecting Derpy spritesheet: %s", name); + game->level.derpy_sheet = &(tmp->bitmap); + game->level.sheet_rows = tmp->rows; + game->level.sheet_cols = tmp->cols; + game->level.sheet_speed_modifier = tmp->speed; + game->level.sheet_pos = 0; + return; + } + tmp = tmp->next; + } + PrintConsole(game, "ERROR: No spritesheets registered for Derpy with given name: %s", name); + return; +} + +void RegisterDerpySpritesheet(struct Game *game, char* name) { + char filename[255] = { }; + sprintf(filename, "data/levels/derpy/%s.ini", name); + ALLEGRO_CONFIG *config = al_load_config_file(filename); + struct Spritesheet *s = malloc(sizeof(struct Spritesheet)); + s->name = malloc((strlen(name)+1)*sizeof(char)); + strcpy(s->name, name); + s->bitmap = NULL; + s->cols = atoi(al_get_config_value(config, "", "cols")); + s->rows = atoi(al_get_config_value(config, "", "rows")); + s->speed = atof(al_get_config_value(config, "", "speed")); + s->next = game->level.derpy_sheets; + game->level.derpy_sheets = s; + al_destroy_config(config); +} + void Level_Passed(struct Game *game) { if (game->level.current_level<6) { int available = atoi(GetConfigOptionDefault("MuffinAttack", "level", "1")); @@ -51,7 +89,10 @@ bool Accelerate(struct Game *game, struct TM_Action *action, enum TM_ActionState } bool Walk(struct Game *game, struct TM_Action *action, enum TM_ActionState state) { + if (state == TM_ACTIONSTATE_INIT) action->arguments = NULL; if (state != TM_ACTIONSTATE_RUNNING) return false; + if (!(action->arguments)) SelectDerpySpritesheet(game, "walk"); + action->arguments++; game->level.derpy_x+=tps(game, 60*0.001); if (game->level.derpy_x<0.05) return false; return true; @@ -65,7 +106,10 @@ bool Move(struct Game *game, struct TM_Action *action, enum TM_ActionState state } bool Fly(struct Game *game, struct TM_Action *action, enum TM_ActionState state) { + if (state == TM_ACTIONSTATE_INIT) action->arguments = NULL; if (state != TM_ACTIONSTATE_RUNNING) return false; + if (!(action->arguments)) SelectDerpySpritesheet(game, "fly"); + action->arguments++; game->level.derpy_y-=tps(game, 60*0.004); if (game->level.derpy_y>0.2) return false; game->level.handle_input=true; @@ -134,7 +178,8 @@ bool GenerateObstracles(struct Game *game, struct TM_Action *action, enum TM_Act bool Stop(struct Game *game, struct TM_Action *action, enum TM_ActionState state) { if (state != TM_ACTIONSTATE_RUNNING) return false; game->level.speed=0; - game->level.sheet_speed = 0; + SelectDerpySpritesheet(game, "stand"); + /*game->level.sheet_speed = 0;*/ return true; } @@ -168,8 +213,8 @@ void Level_Draw(struct Game *game) { game->level.derpy_y += 0.005; /*PrintConsole(game, "Derpy Y position: %f", game->level.derpy_y);*/ } - if (game->level.derpy_y > 0.5) game->level.sheet_speed = 0.0020/game->level.speed; - else game->level.sheet_speed=0; + if ((game->level.derpy_y > 0.5) && (!game->level.sheet_speed)) { SelectDerpySpritesheet(game, "run"); game->level.sheet_speed = 0.0020/game->level.speed; } + else if ((game->level.derpy_y <= 0.5) && (game->level.sheet_speed)) { SelectDerpySpritesheet(game, "fly"); game->level.sheet_speed=0; } if (game->level.derpy_y < 0) game->level.derpy_y=0; else if (game->level.derpy_y > 0.75) game->level.derpy_y=0.75; } @@ -219,7 +264,7 @@ void Level_Draw(struct Game *game) { al_set_target_bitmap(game->level.derpy); al_clear_to_color(al_map_rgba(0,0,0,0)); - al_draw_bitmap_region(game->level.derpy_walkcycle,al_get_bitmap_width(game->level.derpy)*(game->level.sheet_pos%game->level.sheet_cols),al_get_bitmap_height(game->level.derpy)*(game->level.sheet_pos/game->level.sheet_cols),al_get_bitmap_width(game->level.derpy), al_get_bitmap_height(game->level.derpy),0,0,0); + al_draw_bitmap_region(*(game->level.derpy_sheet),al_get_bitmap_width(game->level.derpy)*(game->level.sheet_pos%game->level.sheet_cols),al_get_bitmap_height(game->level.derpy)*(game->level.sheet_pos/game->level.sheet_cols),al_get_bitmap_width(game->level.derpy), al_get_bitmap_height(game->level.derpy),0,0,0); if (game->level.sheet_speed) { game->level.sheet_tmp+=tps(game, 60); if (game->level.sheet_tmp >= game->level.sheet_speed) { @@ -357,9 +402,7 @@ void Level_Load(struct Game *game) { game->level.speed = 0; game->level.derpy_x = -0.2; game->level.derpy_y = 0.6; - game->level.sheet_rows = 4; - game->level.sheet_cols = 6; - game->level.sheet_pos = 0; + SelectDerpySpritesheet(game, "stand"); game->level.sheet_speed = 2.4; game->level.sheet_tmp = 0; game->level.handle_input = false; @@ -427,7 +470,12 @@ void Level_ProcessLogic(struct Game *game, ALLEGRO_EVENT *ev) { } void Level_Preload(struct Game *game) { + game->level.derpy_sheets = NULL; Pause_Preload(game); + RegisterDerpySpritesheet(game, "walk"); + RegisterDerpySpritesheet(game, "fly"); + RegisterDerpySpritesheet(game, "run"); + RegisterDerpySpritesheet(game, "stand"); if (game->level.current_level!=1) Moonwalk_Preload(game); else { game->level.sample = al_load_sample( "data/levels/1/music.flac" ); @@ -451,19 +499,31 @@ void Level_Unload(struct Game *game) { else { TM_Destroy(); } - struct Obstracle *tmp, *t = game->level.obstracles; - if (t) tmp = t->prev; - while (t) { - if (tmp) free(tmp); - tmp = t; - t = t->next; + struct Obstracle *t = game->level.obstracles; + if (t) { + while (t->next) { + if (t->prev) free(t->prev); + t = t->next; + } + free(t); } Level_UnloadBitmaps(game); + struct Spritesheet *tmp, *s = game->level.derpy_sheets; + tmp = s; + while (s) { + tmp = s; + s = s->next; + free(tmp); + } } void Level_UnloadBitmaps(struct Game *game) { al_destroy_bitmap(game->level.derpy); - al_destroy_bitmap(game->level.derpy_walkcycle); + struct Spritesheet *tmp = game->level.derpy_sheets; + while (tmp) { + al_destroy_bitmap(tmp->bitmap); + tmp = tmp->next; + } if (game->level.current_level!=1) Moonwalk_UnloadBitmaps(game); else { al_destroy_bitmap(game->level.foreground); @@ -476,7 +536,14 @@ void Level_UnloadBitmaps(struct Game *game) { } void Level_PreloadBitmaps(struct Game *game) { - game->level.derpy_walkcycle = LoadScaledBitmap("levels/derpcycle.png", al_get_display_width(game->display)*0.1953125*6, al_get_display_height(game->display)*0.25*4); + struct Spritesheet *tmp = game->level.derpy_sheets; + while (tmp) { + char filename[255] = { }; + sprintf(filename, "levels/derpy/%s.png", tmp->name); + tmp->bitmap = LoadScaledBitmap(filename, al_get_display_width(game->display)*0.1953125*tmp->cols, al_get_display_height(game->display)*0.25*tmp->rows); + tmp = tmp->next; + } + game->level.derpy = al_create_bitmap(al_get_display_width(game->display)*0.1953125, al_get_display_height(game->display)*0.25); if (game->level.current_level!=1) Moonwalk_PreloadBitmaps(game); else { diff --git a/src/level.h b/src/level.h index 27160ed..f379c01 100644 --- a/src/level.h +++ b/src/level.h @@ -20,6 +20,7 @@ */ #include "main.h" +void SelectDerpySpritesheet(struct Game *game, char* name); void Level_Passed(struct Game *game); void Level_Draw(struct Game *game); void Level_Preload(struct Game *game); diff --git a/src/main.h b/src/main.h index e91d038..79eb3d4 100644 --- a/src/main.h +++ b/src/main.h @@ -61,6 +61,14 @@ struct Obstracle { struct Obstracle *prev, *next; }; +struct Spritesheet { + char* name; + ALLEGRO_BITMAP* bitmap; + int rows, cols; + float speed; + struct Spritesheet* next; +}; + /*! \brief Resources used by Level state. */ struct Level { int current_level; /*!< Level number. */ @@ -69,14 +77,16 @@ struct Level { float derpy_x, derpy_y; bool handle_input; int sheet_rows, sheet_cols, sheet_pos; - float sheet_tmp, sheet_speed; + float sheet_tmp, sheet_speed, sheet_speed_modifier; ALLEGRO_SAMPLE *sample; /*!< Sample with background music. */ ALLEGRO_SAMPLE_INSTANCE *music; /*!< Sample instance with background music. */ unsigned int music_pos; /*!< Position of sample instance. Used when pausing game. */ ALLEGRO_BITMAP *background, *stage, *foreground, *clouds; ALLEGRO_BITMAP *welcome; - ALLEGRO_BITMAP *derpy_walkcycle; /*!< Derpy walk cycle spritesheet. */ + ALLEGRO_BITMAP **derpy_sheet; /*!< Active Derpy sprite sheet. */ ALLEGRO_BITMAP *derpy; /*!< Derpy sprite. */ + struct Spritesheet* derpy_sheets; /*!< List of sprite sheets of Derpy character. */ + struct Spritesheet* pony_sheets; /*!< List of sprite sheets of character rescued by Derpy. */ struct { ALLEGRO_BITMAP *pie; } obst_bmps; diff --git a/src/moonwalk.c b/src/moonwalk.c index 8142175..d265242 100644 --- a/src/moonwalk.c +++ b/src/moonwalk.c @@ -26,7 +26,7 @@ void Moonwalk_Draw(struct Game *game) { al_set_target_bitmap(game->level.derpy); al_clear_to_color(al_map_rgba(0,0,0,0)); - al_draw_bitmap_region(game->level.derpy_walkcycle,al_get_bitmap_width(game->level.derpy)*(game->level.moonwalk.derpy_frame%6),al_get_bitmap_height(game->level.derpy)*(game->level.moonwalk.derpy_frame/6),al_get_bitmap_width(game->level.derpy), al_get_bitmap_height(game->level.derpy),0,0,0); + al_draw_bitmap_region(*(game->level.derpy_sheet),al_get_bitmap_width(game->level.derpy)*(game->level.moonwalk.derpy_frame%6),al_get_bitmap_height(game->level.derpy)*(game->level.moonwalk.derpy_frame/6),al_get_bitmap_width(game->level.derpy), al_get_bitmap_height(game->level.derpy),0,0,0); al_set_target_bitmap(al_get_backbuffer(game->display)); game->level.moonwalk.derpy_pos=game->level.moonwalk.derpy_pos+tps(game, 60*0.00092); @@ -57,6 +57,7 @@ void Moonwalk_Draw(struct Game *game) { } void Moonwalk_Load(struct Game *game) { + SelectDerpySpritesheet(game, "walk"); game->level.moonwalk.derpy_frame = 0; game->level.moonwalk.derpy_frame_tmp = 0; game->level.moonwalk.derpy_pos = -0.2; @@ -79,7 +80,7 @@ int Moonwalk_Keydown(struct Game *game, ALLEGRO_EVENT *ev) { void Moonwalk_PreloadBitmaps(struct Game *game) { game->level.moonwalk.image =LoadScaledBitmap("levels/disco.jpg", al_get_display_width(game->display), al_get_display_height(game->display)); - game->level.derpy_walkcycle = LoadScaledBitmap("levels/derpcycle.png", al_get_display_width(game->display)*0.1953125*6, al_get_display_height(game->display)*0.25*4); + /*game->level.derpy_sheet = LoadScaledBitmap("levels/derpcycle.png", al_get_display_width(game->display)*0.1953125*6, al_get_display_height(game->display)*0.25*4);*/ game->level.derpy = al_create_bitmap(al_get_display_width(game->display)*0.1953125, al_get_display_height(game->display)*0.25);