make level 1 compilable... of course it doesn't work yet :D

This commit is contained in:
Sebastian Krzyszkowiak 2013-06-04 01:37:50 +02:00
parent ced56209c1
commit f0c72edfd5
8 changed files with 233 additions and 206 deletions

View file

@ -1,4 +1,4 @@
add_library("libsuperderpy-muffinattack-levels" SHARED "actions.c" "../gamestates/level.c" "modules/moonwalk.c" "modules/dodger.c") add_library("libsuperderpy-muffinattack-levels" SHARED "actions.c" "../gamestates/level.c" "modules/moonwalk.c" "modules/dodger.c" "modules/dodger/actions.c" "modules/dodger/callbacks.c")
SET_TARGET_PROPERTIES("libsuperderpy-muffinattack-levels" PROPERTIES PREFIX "") SET_TARGET_PROPERTIES("libsuperderpy-muffinattack-levels" PROPERTIES PREFIX "")
@ -19,7 +19,7 @@ MACRO(GAMESTATE name)
ENDMACRO() ENDMACRO()
#GAMESTATE("level1") GAMESTATE("level1")
GAMESTATE("level2") GAMESTATE("level2")
GAMESTATE("level3") GAMESTATE("level3")
GAMESTATE("level4") GAMESTATE("level4")

View file

@ -19,14 +19,17 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
#include <stdio.h> #include <stdio.h>
#include "allegro5/allegro_ttf.h"
#include "../gamestates/level.h" #include "../gamestates/level.h"
#include "actions.h" #include "actions.h"
#include "../utils.h"
#include "modules/dodger.h" #include "modules/dodger.h"
#include "modules/dodger/actions.h" #include "modules/dodger/actions.h"
#include "level1.h" #include "level1.h"
void Level1_Load(struct Game *game) { int Gamestate_ProgressCount = 9001;
Dodger_Load(game, 1);
void Gamestate_Start(struct Game *game, struct Level1Resources* data) {
TM_AddBackgroundAction(&FadeIn, NULL, 0, "fadein"); TM_AddBackgroundAction(&FadeIn, NULL, 0, "fadein");
TM_AddDelay(1000); TM_AddDelay(1000);
TM_AddQueuedBackgroundAction(&Welcome, NULL, 0, "welcome"); TM_AddQueuedBackgroundAction(&Welcome, NULL, 0, "welcome");
@ -75,41 +78,43 @@ void Level1_Load(struct Game *game) {
obst->angle = 0; obst->angle = 0;
obst->callback = NULL; obst->callback = NULL;
obst->data = NULL; obst->data = NULL;
obst->bitmap = &(game->level.level1.owl); obst->bitmap = &(data->owl);
game->level.dodger.obstacles = obst; data->dodger->obstacles = obst;
} }
void Level1_Unload(struct Game *game) { void Gamestate_Reload(struct Game *game, struct Level1Resources* data) {}
Dodger_Unload(game);
void Gamestate_Stop(struct Game *game, struct Level1Resources* data) {
} }
void Level1_UnloadBitmaps(struct Game *game) { void Gamestate_Unload(struct Game *game, struct Level1Resources* data) {
Dodger_UnloadBitmaps(game); Dodger_Unload(game, data->dodger);
al_destroy_font(game->level.letter_font);
al_destroy_bitmap(game->level.letter);
al_destroy_bitmap(game->level.level1.owl);
} }
void Level1_Preload(struct Game *game) { void Gamestate_UnloadBitmaps(struct Game *game, struct Level1Resources* data) {
Dodger_Preload(game); Dodger_UnloadBitmaps(game, data->dodger);
al_destroy_font(data->letter_font);
al_destroy_bitmap(data->letter);
al_destroy_bitmap(data->owl);
} }
inline int Level1_PreloadSteps(void) {
return 4+Dodger_PreloadSteps();
}
void Level1_PreloadBitmaps(struct Game *game, void (*progress)(struct Game*, float)) { void Gamestate_PreloadBitmaps(struct Game *game, struct Level1Resources* data) {
PROGRESS_INIT(Level1_PreloadSteps()); data->welcome = al_create_bitmap(game->viewport.width, game->viewport.height/2);
game->level.level1.owl = LoadScaledBitmap("levels/1/owl.png", game->viewport.height*0.1275, game->viewport.height*0.1275);
PROGRESS; data->font_title = al_load_ttf_font(GetDataFilePath(game, "fonts/ShadowsIntoLight.ttf"),game->viewport.height*0.16,0 );
game->level.letter_font = al_load_ttf_font(GetDataFilePath("fonts/DejaVuSans.ttf"),game->viewport.height*0.0225,0 ); data->font_subtitle = al_load_ttf_font(GetDataFilePath(game, "fonts/ShadowsIntoLight.ttf"),game->viewport.height*0.08,0 );
PROGRESS; data->font = al_load_ttf_font(GetDataFilePath(game, "fonts/ShadowsIntoLight.ttf"),game->viewport.height*0.05,0 );
game->level.letter = LoadScaledBitmap("levels/1/letter.png", game->viewport.height*1.3, game->viewport.height*1.2);
al_set_target_bitmap(game->level.letter); data->owl = LoadScaledBitmap(game, "levels/1/owl.png", game->viewport.height*0.1275, game->viewport.height*0.1275);
data->letter_font = al_load_ttf_font(GetDataFilePath(game, "fonts/DejaVuSans.ttf"),game->viewport.height*0.0225,0 );
data->letter = LoadScaledBitmap(game, "levels/1/letter.png", game->viewport.height*1.3, game->viewport.height*1.2);
al_set_target_bitmap(data->letter);
float y = 0.20; float y = 0.20;
float x = 0.19; float x = 0.19;
void draw_text(char* text) { void draw_text(char* text) {
al_draw_text(game->level.letter_font, al_map_rgb(0,0,0), al_get_bitmap_width(game->level.letter)*x, game->viewport.height*y, ALLEGRO_ALIGN_LEFT, text); al_draw_text(data->letter_font, al_map_rgb(0,0,0), al_get_bitmap_width(data->letter)*x, game->viewport.height*y, ALLEGRO_ALIGN_LEFT, text);
y+=0.028; y+=0.028;
} }
draw_text("Dear Derpy,"); draw_text("Dear Derpy,");
@ -143,40 +148,62 @@ void Level1_PreloadBitmaps(struct Game *game, void (*progress)(struct Game*, flo
x = 0.26; x = 0.26;
draw_text("Yours,"); draw_text("Yours,");
draw_text("Twilight Sparkle"); draw_text("Twilight Sparkle");
al_draw_text_with_shadow(game->menu.font, al_map_rgb(255,255,255), al_get_bitmap_width(game->level.letter)*0.5, al_get_bitmap_height(game->level.letter)*0.8, ALLEGRO_ALIGN_CENTRE, "Press enter to continue..."); DrawTextWithShadow(data->font, al_map_rgb(255,255,255), al_get_bitmap_width(data->letter)*0.5, al_get_bitmap_height(data->letter)*0.8, ALLEGRO_ALIGN_CENTRE, "Press enter to continue...");
al_set_target_bitmap(al_get_backbuffer(game->display)); al_set_target_bitmap(al_get_backbuffer(game->display));
PROGRESS;
al_set_target_bitmap(game->level.welcome); al_set_target_bitmap(data->welcome);
al_clear_to_color(al_map_rgba(0,0,0,0)); al_clear_to_color(al_map_rgba(0,0,0,0));
al_draw_text_with_shadow(game->menu.font_title, al_map_rgb(255,255,255), game->viewport.width*0.5, game->viewport.height*0.1, ALLEGRO_ALIGN_CENTRE, "Level 1"); DrawTextWithShadow(data->font_title, al_map_rgb(255,255,255), game->viewport.width*0.5, game->viewport.height*0.1, ALLEGRO_ALIGN_CENTRE, "Level 1");
al_draw_text_with_shadow(game->menu.font_subtitle, al_map_rgb(255,255,255), game->viewport.width*0.5, game->viewport.height*0.275, ALLEGRO_ALIGN_CENTRE, "Fluttershy"); DrawTextWithShadow(data->font_subtitle, al_map_rgb(255,255,255), game->viewport.width*0.5, game->viewport.height*0.275, ALLEGRO_ALIGN_CENTRE, "Fluttershy");
PROGRESS;
al_set_target_bitmap(al_get_backbuffer(game->display)); al_set_target_bitmap(al_get_backbuffer(game->display));
Dodger_PreloadBitmaps(game, progress); Dodger_PreloadBitmaps(game, data->dodger);
} }
void Level1_Draw(struct Game *game) { struct Level1Resources* Gamestate_Load(struct Game *game) {
Dodger_Draw(game); TM_Init(game);
struct Level1Resources *data = malloc(sizeof(struct Level1Resources));
struct Character *character = CreateCharacter(game, "derpy");
RegisterSpritesheet(game, character, "walk");
RegisterSpritesheet(game, character, "stand");
RegisterSpritesheet(game, character, "fly");
RegisterSpritesheet(game, character, "run");
SelectSpritesheet(game, character, "stand");
data->dodger = Dodger_Load(game, character);
Gamestate_PreloadBitmaps(game, data);
LoadSpritesheets(game, character);
return data;
} }
void Level1_Logic(struct Game *game) {
Dodger_Logic(game); void Gamestate_Draw(struct Game *game, struct Level1Resources* data) {
Dodger_Draw(game, data->dodger);
} }
void Level1_Keydown(struct Game *game, ALLEGRO_EVENT *ev) { void Gamestate_Logic(struct Game *game, struct Level1Resources* data) {
Dodger_Keydown(game, ev); Dodger_Logic(game, data->dodger);
} }
void Level1_ProcessEvent(struct Game *game, ALLEGRO_EVENT *ev) { void Gamestate_Keydown(struct Game *game, struct Level1Resources* data, ALLEGRO_EVENT *ev) {
Dodger_ProcessEvent(game, ev); Dodger_Keydown(game, data->dodger, ev);
} }
void Level1_Resume(struct Game *game) { void Gamestate_ProcessEvent(struct Game *game, struct Level1Resources* data, ALLEGRO_EVENT *ev) {
Dodger_Resume(game); Dodger_ProcessEvent(game, data->dodger, ev);
if (ev->type == ALLEGRO_EVENT_KEY_DOWN) {
if (ev->keyboard.keycode == ALLEGRO_KEY_ESCAPE) {
SwitchGamestate(game, "level1", "map");
}
}
} }
void Level1_Pause(struct Game *game) { void Gamestate_Resume(struct Game *game, struct Level1Resources* data) {
Dodger_Pause(game); Dodger_Resume(game, data->dodger);
}
void Gamestate_Pause(struct Game *game, struct Level1Resources* data) {
Dodger_Pause(game, data->dodger);
} }

View file

@ -20,15 +20,62 @@
*/ */
#include "../main.h" #include "../main.h"
void Level1_Load(struct Game *game); struct Dodger;
void Level1_Unload(struct Game *game); struct Level1Resources {
void Level1_UnloadBitmaps(struct Game *game); struct Dodger *dodger;
void Level1_Preload(struct Game *game);
void Level1_PreloadBitmaps(struct Game *game, void (*progress)(struct Game*, float)); ALLEGRO_FONT *letter_font; /*!< Font used in letter from Twilight on first level. */
inline int Level1_PreloadSteps(void); ALLEGRO_SAMPLE *sample; /*!< Sample with background music. */
void Level1_Draw(struct Game *game); ALLEGRO_SAMPLE_INSTANCE *music; /*!< Sample instance with background music. */
void Level1_Logic(struct Game *game); unsigned int music_pos; /*!< Position of sample instance. Used when pausing game. */
void Level1_Keydown(struct Game *game, ALLEGRO_EVENT *ev); ALLEGRO_BITMAP *background; /*!< Bitmap of the background layer of the scene. */
void Level1_ProcessEvent(struct Game *game, ALLEGRO_EVENT *ev); ALLEGRO_BITMAP *stage; /*!< Bitmap of the stage layer of the scene. */
void Level1_Resume(struct Game *game); ALLEGRO_BITMAP *foreground; /*!< Bitmap of the foreground layer of the scene. */
void Level1_Pause(struct Game *game); ALLEGRO_BITMAP *clouds; /*!< Bitmap of the clouds layer of the scene. */
ALLEGRO_BITMAP *welcome; /*!< Bitmap of the welcome text (for instance "Level 1: Fluttershy"). */
ALLEGRO_BITMAP **derpy_sheet; /*!< Pointer to active Derpy sprite sheet. */
ALLEGRO_BITMAP *derpy_bmp; /*!< Derpy sprite. */
ALLEGRO_BITMAP *meter_bmp; /*!< Bitmap of the HP meter. */
ALLEGRO_BITMAP *meter_image; /*!< Derpy image used in the HP meter. */
ALLEGRO_BITMAP *letter; /*!< Bitmap with letter from Twilight. */
struct Character *derpy;
struct {
ALLEGRO_BITMAP *pie1; /*!< Pie bitmap. */
ALLEGRO_BITMAP *pie2; /*!< Pie bitmap (crossed). */
ALLEGRO_BITMAP *muffin; /*!< Good muffin bitmap. */
ALLEGRO_BITMAP *badmuffin; /*!< Bad muffin bitmap. */
ALLEGRO_BITMAP *cherry; /*!< Cherry bitmap. */
ALLEGRO_BITMAP *pig; /*!< Pig spritesheet bitmap. */
ALLEGRO_BITMAP *screwball; /*!< Screwball spritesheet bitmap. */
} obst_bmps; /*!< Obstacle bitmaps. */
float bg_pos; /*!< Position of the background layer of the scene. */
float st_pos; /*!< Position of the stage layer of the scene. */
float fg_pos; /*!< Position of the foreground layer of the scene. */
float cl_pos; /*!< Position of the clouds layer of the scene. */
ALLEGRO_FONT *font;
ALLEGRO_FONT *font_title;
ALLEGRO_FONT *font_subtitle;
bool handle_input; /*!< When false, player looses control over Derpy. */
bool failed; /*!< Indicates if player failed level. */
bool unloading; /*!< Indicated if level is already being unloaded. */
float meter_alpha; /*!< Alpha level of HP meter. */
//int sheet_rows; /*!< Number of rows in current spritesheet. */
//int sheet_cols; /*!< Number of cols in current spritesheet. */
//int sheet_pos; /*!< Frame position in current spritesheet. */
//int sheet_blanks; /*!< Number of blank frames at the end of current spritesheet. */
//char* sheet_successor; /*!< Successor of current animation. If blank, then it's looped. */
//float sheet_tmp; /*!< Temporary counter used to slow down spritesheet animation. */
//float sheet_speed; /*!< Current speed of Derpy animation. */
//float sheet_speed_modifier; /*!< Modifier of speed, specified by current spritesheet. */
//float sheet_scale; /*!< Scale modifier of current spritesheet. */
//struct Spritesheet* derpy_sheets; /*!< List of spritesheets of Derpy character. */
//struct Spritesheet* pony_sheets; /*!< List of spritesheets of character rescued by Derpy. */
ALLEGRO_BITMAP *owl; /*!< Owlicious bitmap. */
};

View file

@ -31,18 +31,16 @@ void Dodger_Logic(struct Game *game, struct Dodger* data) {
struct ALLEGRO_KEYBOARD_STATE keyboard; struct ALLEGRO_KEYBOARD_STATE keyboard;
al_get_keyboard_state(&keyboard); al_get_keyboard_state(&keyboard);
if (data->handle_input) { if (data->handle_input) {
if (data->derpy_angle > 0) { data->derpy_angle -= 0.02; if (data->derpy_angle < 0) data->derpy_angle = 0; } if (data->character->angle > 0) { data->character->angle -= 0.02; if (data->character->angle < 0) data->character->angle = 0; }
if (data->derpy_angle < 0) { data->derpy_angle += 0.02; if (data->derpy_angle > 0) data->derpy_angle = 0; } if (data->character->angle < 0) { data->character->angle += 0.02; if (data->character->angle > 0) data->character->angle = 0; }
if (al_key_down(&keyboard, ALLEGRO_KEY_UP)) { if (al_key_down(&keyboard, ALLEGRO_KEY_UP)) {
data->derpy_y -= 0.005; MoveCharacter(game, data->character, 0, -0.005, -0.03);
data->derpy_angle -= 0.03; if (data->character->angle < -0.15) data->character->angle = -0.15;
if (data->derpy_angle < -0.15) data->derpy_angle = -0.15;
/*PrintConsole(game, "Derpy Y position: %f", data->derpy_y);*/ /*PrintConsole(game, "Derpy Y position: %f", data->derpy_y);*/
} }
if (al_key_down(&keyboard, ALLEGRO_KEY_DOWN)) { if (al_key_down(&keyboard, ALLEGRO_KEY_DOWN)) {
data->derpy_y += 0.005; MoveCharacter(game, data->character, 0, 0.005, 0.03);
data->derpy_angle += 0.03; if (data->character->angle > 0.15) data->character->angle = 0.15;
if (data->derpy_angle > 0.15) data->derpy_angle = 0.15;
/*PrintConsole(game, "Derpy Y position: %f", data->derpy_y);*/ /*PrintConsole(game, "Derpy Y position: %f", data->derpy_y);*/
} }
/*if ((data->derpy_y > 0.6) && (data->flying)) { /*if ((data->derpy_y > 0.6) && (data->flying)) {
@ -56,18 +54,18 @@ void Dodger_Logic(struct Game *game, struct Dodger* data) {
data->sheet_speed = tps(game, 60*2.4); data->sheet_speed = tps(game, 60*2.4);
} }
if (!data->flying) data->sheet_speed = tps(game, 60*0.0020/data->speed); */ if (!data->flying) data->sheet_speed = tps(game, 60*0.0020/data->speed); */
if (data->derpy_y < 0) data->derpy_y=0; if ( data->character->y < 0) data->character->y=0;
else if (data->derpy_y > 0.8) data->derpy_y=0.8; else if ( data->character->y > 0.8) data->character->y=0.8;
data->derpy_y += data->derpy_angle / 30; data->character->y += data->character->angle / 30;
} }
int derpyx = data->derpy_x*game->viewport.height*1.6; int derpyx = data->character->x*game->viewport.height*1.6;
int derpyy = data->derpy_y*game->viewport.height; int derpyy = data->character->y*game->viewport.height;
int derpyw = al_get_bitmap_width(data->derpy); int derpyw = al_get_bitmap_width(data->character->bitmap);
int derpyh = al_get_bitmap_height(data->derpy); int derpyh = al_get_bitmap_height(data->character->bitmap);
int derpyo = game->viewport.height*1.6*0.1953125-al_get_bitmap_width(data->derpy); /* offset */ int derpyo = game->viewport.height*1.6*0.1953125-al_get_bitmap_width(data->character->bitmap); /* offset */
struct Obstacle *tmp = data->dodger.obstacles; struct Obstacle *tmp = data->obstacles;
while (tmp) { while (tmp) {
/*PrintConsole(game, "DRAWING %f %f", tmp->x, tmp->y);*/ /*PrintConsole(game, "DRAWING %f %f", tmp->x, tmp->y);*/
int x = (tmp->x/100.0)*game->viewport.width; int x = (tmp->x/100.0)*game->viewport.width;
@ -105,7 +103,7 @@ void Dodger_Logic(struct Game *game, struct Dodger* data) {
TM_AddBackgroundAction(&LevelFailed, NULL, 0, "levelfailed"); TM_AddBackgroundAction(&LevelFailed, NULL, 0, "levelfailed");
} }
} }
tmp->x -= data->speed*data->speed_modifier*tmp->speed*100*al_get_bitmap_width(data->stage)/(float)game->viewport.width; tmp->x -= data->speed*data->speed_modifier*tmp->speed*100*al_get_display_width(game->display)/(float)game->viewport.width;
if (tmp->callback) tmp->callback(game, tmp); if (tmp->callback) tmp->callback(game, tmp);
tmp = tmp->next; tmp = tmp->next;
} else { } else {
@ -114,7 +112,7 @@ void Dodger_Logic(struct Game *game, struct Dodger* data) {
if (tmp->prev) if (tmp->prev)
tmp->prev->next = tmp->next; tmp->prev->next = tmp->next;
else else
data->dodger.obstacles = tmp->next; data->obstacles = tmp->next;
struct Obstacle *t = tmp; struct Obstacle *t = tmp;
tmp = tmp->next; tmp = tmp->next;
free(t); free(t);
@ -125,13 +123,13 @@ void Dodger_Logic(struct Game *game, struct Dodger* data) {
} }
void Dodger_Draw(struct Game *game, struct Dodger* data) { void Dodger_Draw(struct Game *game, struct Dodger* data) {
int derpyx = data->derpy_x*game->viewport.height*1.6; int derpyx = data->character->x*game->viewport.height*1.6;
int derpyy = data->derpy_y*game->viewport.height; int derpyy = data->character->y*game->viewport.height;
int derpyw = al_get_bitmap_width(data->derpy); int derpyw = al_get_bitmap_width(data->character->bitmap);
int derpyh = al_get_bitmap_height(data->derpy); int derpyh = al_get_bitmap_height(data->character->bitmap);
int derpyo = game->viewport.height*1.6*0.1953125-al_get_bitmap_width(data->derpy); /* offset */ int derpyo = game->viewport.height*1.6*0.1953125-al_get_bitmap_width(data->character->bitmap); /* offset */
bool colision = false; bool colision = false;
struct Obstacle *tmp = data->dodger.obstacles; struct Obstacle *tmp = data->obstacles;
while (tmp) { while (tmp) {
/*PrintConsole(game, "DRAWING %f %f", tmp->x, tmp->y);*/ /*PrintConsole(game, "DRAWING %f %f", tmp->x, tmp->y);*/
int x = (tmp->x/100.0)*game->viewport.width; int x = (tmp->x/100.0)*game->viewport.width;
@ -162,7 +160,7 @@ void Dodger_Draw(struct Game *game, struct Dodger* data) {
if (tmp->prev) if (tmp->prev)
tmp->prev->next = tmp->next; tmp->prev->next = tmp->next;
else else
data->dodger.obstacles = tmp->next; data->obstacles = tmp->next;
struct Obstacle *t = tmp; struct Obstacle *t = tmp;
tmp = tmp->next; tmp = tmp->next;
free(t); free(t);
@ -170,12 +168,12 @@ void Dodger_Draw(struct Game *game, struct Dodger* data) {
} }
/*if (colision) data->hp-=tps(game, 60*0.002);*/ /*if (colision) data->hp-=tps(game, 60*0.002);*/
al_set_target_bitmap(data->derpy); al_set_target_bitmap(data->character->bitmap);
al_clear_to_color(al_map_rgba(0,0,0,0)); al_clear_to_color(al_map_rgba(0,0,0,0));
al_draw_bitmap_region(*(data->derpy_sheet),al_get_bitmap_width(data->derpy)*(data->sheet_pos%data->sheet_cols),al_get_bitmap_height(data->derpy)*(data->sheet_pos/data->sheet_cols),al_get_bitmap_width(data->derpy), al_get_bitmap_height(data->derpy),0,0,0); al_draw_bitmap_region(data->character->spritesheet->bitmap,al_get_bitmap_width(data->character->bitmap)*(data->character->pos%data->character->spritesheet->cols),al_get_bitmap_height(data->character->bitmap)*(data->character->pos/data->character->spritesheet->cols),al_get_bitmap_width(data->character->bitmap), al_get_bitmap_height(data->character->bitmap),0,0,0);
al_set_target_bitmap(al_get_backbuffer(game->display)); al_set_target_bitmap(al_get_backbuffer(game->display));
al_draw_tinted_rotated_bitmap(data->derpy, al_map_rgba(255,255-colision*255,255-colision*255,255), al_get_bitmap_width(data->derpy), al_get_bitmap_height(data->derpy)/2, derpyx+game->viewport.height*1.6*0.1953125, derpyy + al_get_bitmap_height(data->derpy)/2, data->derpy_angle, 0); al_draw_tinted_rotated_bitmap(data->character->bitmap, al_map_rgba(255,255-colision*255,255-colision*255,255), al_get_bitmap_width(data->character->bitmap), al_get_bitmap_height(data->character->bitmap)/2, derpyx+game->viewport.height*1.6*0.1953125, derpyy + al_get_bitmap_height(data->character->bitmap)/2, data->character->angle, 0);
/* if ((((x>=derpyx+0.36*derpyw) && (x<=derpyx+0.94*derpyw)) || ((x+w>=derpyx+0.36*derpyw) && (x+w<=derpyx+0.94*derpyw))) && /* if ((((x>=derpyx+0.36*derpyw) && (x<=derpyx+0.94*derpyw)) || ((x+w>=derpyx+0.36*derpyw) && (x+w<=derpyx+0.94*derpyw))) &&
(((y>=derpyy+0.26*derpyh) && (y<=derpyy+0.76*derpyh)) || ((y+h>=derpyy+0.26*derpyh) && (y+h<=derpyy+0.76*derpyh)))) { (((y>=derpyy+0.26*derpyh) && (y<=derpyy+0.76*derpyh)) || ((y+h>=derpyy+0.26*derpyh) && (y+h<=derpyy+0.76*derpyh)))) {
@ -186,14 +184,10 @@ void Dodger_Draw(struct Game *game, struct Dodger* data) {
} }
} }
struct Dodger* Dodger_Load(struct Game *game, int current_level) { struct Dodger* Dodger_Load(struct Game *game, struct Character *character) {
struct Dodger *data = malloc(sizeof(struct Dodger)); struct Dodger *data = malloc(sizeof(struct Dodger));
data->dodger.obstacles = NULL; data->obstacles = NULL;
data->character = CreateCharacter(game, "derpy"); data->character = character;
RegisterSpritesheet(game, data->character, "walk");
RegisterSpritesheet(game, data->character, "stand");
RegisterSpritesheet(game, data->character, "fly");
RegisterSpritesheet(game, data->character, "run");
return data; return data;
} }
@ -231,36 +225,36 @@ inline int Dodger_PreloadSteps(void) {
return 7; return 7;
} }
void Dodger_PreloadBitmaps(struct Game *game, struct Dodger* data, void (*progress)(struct Game*, float)) { void Dodger_PreloadBitmaps(struct Game *game, struct Dodger* data) {
//PROGRESS_INIT(Dodger_PreloadSteps()); //PROGRESS_INIT(Dodger_PreloadSteps());
data->dodger.obst_bmps.pie1 = LoadScaledBitmap(game, "levels/dodger/pie1.png", game->viewport.height*1.6*0.1, game->viewport.height*0.08); data->obst_bmps.pie1 = LoadScaledBitmap(game, "levels/dodger/pie1.png", game->viewport.height*1.6*0.1, game->viewport.height*0.08);
data->dodger.obst_bmps.pie2 = LoadScaledBitmap(game, "levels/dodger/pie2.png", game->viewport.height*1.6*0.1, game->viewport.height*0.08); data->obst_bmps.pie2 = LoadScaledBitmap(game, "levels/dodger/pie2.png", game->viewport.height*1.6*0.1, game->viewport.height*0.08);
data->dodger.obst_bmps.pig = LoadScaledBitmap(game, "levels/dodger/pig.png", (int)(game->viewport.height*1.6*0.15)*3, (int)(game->viewport.height*0.2)*3); data->obst_bmps.pig = LoadScaledBitmap(game, "levels/dodger/pig.png", (int)(game->viewport.height*1.6*0.15)*3, (int)(game->viewport.height*0.2)*3);
data->dodger.obst_bmps.screwball = LoadScaledBitmap(game, "levels/dodger/screwball.png", (int)(game->viewport.height*0.2)*4*1.4, (int)(game->viewport.height*0.2)*4); data->obst_bmps.screwball = LoadScaledBitmap(game, "levels/dodger/screwball.png", (int)(game->viewport.height*0.2)*4*1.4, (int)(game->viewport.height*0.2)*4);
data->dodger.obst_bmps.muffin = LoadScaledBitmap(game, "levels/dodger/muffin.png", game->viewport.height*1.6*0.07, game->viewport.height*0.1); data->obst_bmps.muffin = LoadScaledBitmap(game, "levels/dodger/muffin.png", game->viewport.height*1.6*0.07, game->viewport.height*0.1);
data->dodger.obst_bmps.cherry = LoadScaledBitmap(game, "levels/dodger/cherry.png", game->viewport.height*1.6*0.03, game->viewport.height*0.08); data->obst_bmps.cherry = LoadScaledBitmap(game, "levels/dodger/cherry.png", game->viewport.height*1.6*0.03, game->viewport.height*0.08);
data->dodger.obst_bmps.badmuffin = LoadScaledBitmap(game, "levels/dodger/badmuffin.png", game->viewport.height*1.6*0.07, game->viewport.height*0.1); data->obst_bmps.badmuffin = LoadScaledBitmap(game, "levels/dodger/badmuffin.png", game->viewport.height*1.6*0.07, game->viewport.height*0.1);
} }
void Dodger_UnloadBitmaps(struct Game *game, struct Dodger* data) { void Dodger_UnloadBitmaps(struct Game *game, struct Dodger* data) {
al_destroy_bitmap(data->dodger.obst_bmps.pie1); al_destroy_bitmap(data->obst_bmps.pie1);
al_destroy_bitmap(data->dodger.obst_bmps.pie2); al_destroy_bitmap(data->obst_bmps.pie2);
al_destroy_bitmap(data->dodger.obst_bmps.pig); al_destroy_bitmap(data->obst_bmps.pig);
al_destroy_bitmap(data->dodger.obst_bmps.cherry); al_destroy_bitmap(data->obst_bmps.cherry);
al_destroy_bitmap(data->dodger.obst_bmps.muffin); al_destroy_bitmap(data->obst_bmps.muffin);
al_destroy_bitmap(data->dodger.obst_bmps.badmuffin); al_destroy_bitmap(data->obst_bmps.badmuffin);
al_destroy_bitmap(data->dodger.obst_bmps.screwball); al_destroy_bitmap(data->obst_bmps.screwball);
} }
void Dodger_Unload(struct Game *game, struct Dodger* data) { void Dodger_Unload(struct Game *game, struct Dodger* data) {
struct Obstacle *t = data->dodger.obstacles; struct Obstacle *t = data->obstacles;
if (t) { if (t) {
while (t->next) { while (t->next) {
if (t->prev) free(t->prev); if (t->prev) free(t->prev);
@ -268,13 +262,7 @@ void Dodger_Unload(struct Game *game, struct Dodger* data) {
} }
free(t); free(t);
} }
struct Spritesheet *tmp, *s = data->derpy_sheets;
tmp = s;
while (s) {
tmp = s;
s = s->next;
free(tmp);
}
DestroyCharacter(game, data->character); DestroyCharacter(game, data->character);
free(data); free(data);
} }

View file

@ -20,72 +20,6 @@
*/ */
#include "../../main.h" #include "../../main.h"
struct Dodger {
struct Character *character; /* TODO: move to level */
struct {
struct {
ALLEGRO_BITMAP *pie1; /*!< Pie bitmap. */
ALLEGRO_BITMAP *pie2; /*!< Pie bitmap (crossed). */
ALLEGRO_BITMAP *muffin; /*!< Good muffin bitmap. */
ALLEGRO_BITMAP *badmuffin; /*!< Bad muffin bitmap. */
ALLEGRO_BITMAP *cherry; /*!< Cherry bitmap. */
ALLEGRO_BITMAP *pig; /*!< Pig spritesheet bitmap. */
ALLEGRO_BITMAP *screwball; /*!< Screwball spritesheet bitmap. */
} obst_bmps; /*!< Obstacle bitmaps. */
struct Obstacle *obstacles; /*!< List of obstacles being currently rendered. */
} dodger;
struct {
int current_level; /*!< Level number. */
} input; /*!< Gamestate input data. */
int current_level; /*!< Level number. */
float speed; /*!< Speed of the player. */
float speed_modifier; /*!< Modifier of the speed of the player. */
float bg_pos; /*!< Position of the background layer of the scene. */
float st_pos; /*!< Position of the stage layer of the scene. */
float fg_pos; /*!< Position of the foreground layer of the scene. */
float cl_pos; /*!< Position of the clouds layer of the scene. */
float derpy_x; /*!< Horizontal position of Derpy (0-1). */
float derpy_y; /*!< Vertical position of Derpy (0-1). */
float derpy_angle; /*!< Angle of Derpy sprite on screen (radians). */
float hp; /*!< Player health points (0-1). */
bool handle_input; /*!< When false, player looses control over Derpy. */
bool failed; /*!< Indicates if player failed level. */
bool unloading; /*!< Indicated if level is already being unloaded. */
float meter_alpha; /*!< Alpha level of HP meter. */
int sheet_rows; /*!< Number of rows in current spritesheet. */
int sheet_cols; /*!< Number of cols in current spritesheet. */
int sheet_pos; /*!< Frame position in current spritesheet. */
int sheet_blanks; /*!< Number of blank frames at the end of current spritesheet. */
char* sheet_successor; /*!< Successor of current animation. If blank, then it's looped. */
float sheet_tmp; /*!< Temporary counter used to slow down spritesheet animation. */
float sheet_speed; /*!< Current speed of Derpy animation. */
float sheet_speed_modifier; /*!< Modifier of speed, specified by current spritesheet. */
float sheet_scale; /*!< Scale modifier of current spritesheet. */
ALLEGRO_FONT *letter_font; /*!< Font used in letter from Twilight on first level. */
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; /*!< Bitmap of the background layer of the scene. */
ALLEGRO_BITMAP *stage; /*!< Bitmap of the stage layer of the scene. */
ALLEGRO_BITMAP *foreground; /*!< Bitmap of the foreground layer of the scene. */
ALLEGRO_BITMAP *clouds; /*!< Bitmap of the clouds layer of the scene. */
ALLEGRO_BITMAP *welcome; /*!< Bitmap of the welcome text (for instance "Level 1: Fluttershy"). */
ALLEGRO_BITMAP **derpy_sheet; /*!< Pointer to active Derpy sprite sheet. */
ALLEGRO_BITMAP *derpy; /*!< Derpy sprite. */
ALLEGRO_BITMAP *meter_bmp; /*!< Bitmap of the HP meter. */
ALLEGRO_BITMAP *meter_image; /*!< Derpy image used in the HP meter. */
ALLEGRO_BITMAP *letter; /*!< Bitmap with letter from Twilight. */
bool debug_show_sprite_frames; /*!< When true, displays colorful borders around spritesheets and their active areas. */
struct Spritesheet* derpy_sheets; /*!< List of spritesheets of Derpy character. */
//struct Spritesheet* pony_sheets; /*!< List of spritesheets of character rescued by Derpy. */
struct {
ALLEGRO_BITMAP *owl; /*!< Owlicious bitmap. */
} level1; /*!< Resources used by level 1. */
};
/*! \brief Structure representing obstacles and power-ups flying through the level. */ /*! \brief Structure representing obstacles and power-ups flying through the level. */
struct Obstacle { struct Obstacle {
@ -110,12 +44,38 @@ struct Obstacle {
struct Obstacle *next; /*!< Next obstacle on the list. */ struct Obstacle *next; /*!< Next obstacle on the list. */
}; };
struct Dodger {
struct Obstacle *obstacles; /*!< List of obstacles being currently rendered. */
struct Obstacle *possible_obstacles; /* TODO: make list of used obstacles dynamic */
float speed; /*!< Speed of the player. */
float speed_modifier; /*!< Modifier of the speed of the player. */
float hp; /*!< Player health points (0-1). */
bool debug_show_sprite_frames; /*!< When true, displays colorful borders around spritesheets and their active areas. */
struct Character *character;
bool failed;
bool handle_input; /*!< When false, player looses control over Derpy. */
struct {
ALLEGRO_BITMAP *pie1; /*!< Pie bitmap. */
ALLEGRO_BITMAP *pie2; /*!< Pie bitmap (crossed). */
ALLEGRO_BITMAP *muffin; /*!< Good muffin bitmap. */
ALLEGRO_BITMAP *badmuffin; /*!< Bad muffin bitmap. */
ALLEGRO_BITMAP *cherry; /*!< Cherry bitmap. */
ALLEGRO_BITMAP *pig; /*!< Pig spritesheet bitmap. */
ALLEGRO_BITMAP *screwball; /*!< Screwball spritesheet bitmap. */
} obst_bmps; /*!< Obstacle bitmaps. */
};
void Dodger_PreloadBitmaps(struct Game *game, struct Dodger* data);
void Dodger_Keydown(struct Game *game, struct Dodger* data, ALLEGRO_EVENT *ev);
void Dodger_Draw(struct Game *game, struct Dodger *data); void Dodger_Draw(struct Game *game, struct Dodger *data);
void Dodger_Logic(struct Game *game, struct Dodger *data); void Dodger_Logic(struct Game *game, struct Dodger *data);
void Dodger_Start(struct Game *game, struct Dodger *data);
void Dodger_Stop(struct Game *game, struct Dodger *data);
void Dodger_Unload(struct Game *game, struct Dodger *data); void Dodger_Unload(struct Game *game, struct Dodger *data);
struct Dodger* Dodger_Load(struct Game *game, int current_level); struct Dodger* Dodger_Load(struct Game *game, struct Character *character);
void Dodger_UnloadBitmaps(struct Game *game, struct Dodger *data); void Dodger_UnloadBitmaps(struct Game *game, struct Dodger *data);
void Dodger_LoadBitmaps(struct Game *game, struct Dodger *data, void (*progress)(struct Game*, float)); void Dodger_LoadBitmaps(struct Game *game, struct Dodger *data, void (*progress)(struct Game*, float));
void Dodger_ProcessEvent(struct Game *game, struct Dodger *data, ALLEGRO_EVENT *ev); void Dodger_ProcessEvent(struct Game *game, struct Dodger *data, ALLEGRO_EVENT *ev);

View file

@ -24,11 +24,15 @@
#include "../../actions.h" #include "../../actions.h"
#include "../../../gamestates/level.h" #include "../../../gamestates/level.h"
void SelectDerpySpritesheet(void* a, void* b) {
}
// TODO: make it configurable and move to generic actions // TODO: make it configurable and move to generic actions
bool Accelerate(struct Game *game, struct TM_Action *action, enum TM_ActionState state) { bool Accelerate(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state != TM_ACTIONSTATE_RUNNING) return false; if (state != TM_ACTIONSTATE_RUNNING) return false;
game->level.speed+=0.000015; //game->level.speed+=0.000015;
if (game->level.speed>=0.0025) return true; //if (game->level.speed>=0.0025) return true;
return false; return false;
} }
@ -36,48 +40,48 @@ 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) { bool Walk(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state == TM_ACTIONSTATE_START) SelectDerpySpritesheet(game, "walk"); if (state == TM_ACTIONSTATE_START) SelectDerpySpritesheet(game, "walk");
else if (state != TM_ACTIONSTATE_RUNNING) return false; else if (state != TM_ACTIONSTATE_RUNNING) return false;
game->level.derpy_x+=(0.00125*1280)/(float)game->viewportWidth; //game->level.derpy_x+=(0.00125*1280)/(float)game->viewportWidth;
if (game->level.derpy_x>=(0.05*1280)/(float)game->viewportWidth) return true; //if (game->level.derpy_x>=(0.05*1280)/(float)game->viewportWidth) return true;
return false; return false;
} }
// TODO: make it configurable and move to generic actions // TODO: make it configurable and move to generic actions
bool Move(struct Game *game, struct TM_Action *action, enum TM_ActionState state) { bool Move(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state != TM_ACTIONSTATE_RUNNING) return false; if (state != TM_ACTIONSTATE_RUNNING) return false;
game->level.speed=0.000345; // game->level.speed=0.000345;
if (game->level.st_pos>=0.275) return true; // if (game->level.st_pos>=0.275) return true;
return false; return false;
} }
bool Fly(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_START) { if (state == TM_ACTIONSTATE_START) {
SelectDerpySpritesheet(game, "fly"); SelectDerpySpritesheet(game, "fly");
game->level.derpy_angle = -0.15; // game->level.derpy_angle = -0.15;
TM_AddBackgroundAction(&ShowMeter, NULL, 0, "showmeter"); TM_AddBackgroundAction(&ShowMeter, NULL, 0, "showmeter");
} }
else if (state == TM_ACTIONSTATE_DESTROY) { else if (state == TM_ACTIONSTATE_DESTROY) {
game->level.handle_input = true; // game->level.handle_input = true;
} }
else if (state != TM_ACTIONSTATE_RUNNING) return false; else if (state != TM_ACTIONSTATE_RUNNING) return false;
game->level.derpy_y-=0.004; // game->level.derpy_y-=0.004;
if (game->level.derpy_y<=0.2) return true; // if (game->level.derpy_y<=0.2) return true;
return false; return false;
} }
bool Run(struct Game *game, struct TM_Action *action, enum TM_ActionState state) { bool Run(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state == TM_ACTIONSTATE_START) { if (state == TM_ACTIONSTATE_START) {
game->level.handle_input=false; // game->level.handle_input=false;
game->level.speed_modifier=1; // game->level.speed_modifier=1;
} }
else if (state == TM_ACTIONSTATE_DESTROY) { else if (state == TM_ACTIONSTATE_DESTROY) {
game->level.derpy_angle = 0; // game->level.derpy_angle = 0;
SelectDerpySpritesheet(game, "run"); SelectDerpySpritesheet(game, "run");
} }
else if (state != TM_ACTIONSTATE_RUNNING) return false; else if (state != TM_ACTIONSTATE_RUNNING) return false;
game->level.derpy_y+=0.0042; // game->level.derpy_y+=0.0042;
if (game->level.derpy_angle > 0) { game->level.derpy_angle -= 0.02; if (game->level.derpy_angle < 0) game->level.derpy_angle = 0; } // if (game->level.derpy_angle > 0) { game->level.derpy_angle -= 0.02; if (game->level.derpy_angle < 0) game->level.derpy_angle = 0; }
if (game->level.derpy_angle < 0) { game->level.derpy_angle += 0.02; if (game->level.derpy_angle > 0) game->level.derpy_angle = 0; } // if (game->level.derpy_angle < 0) { game->level.derpy_angle += 0.02; if (game->level.derpy_angle > 0) game->level.derpy_angle = 0; }
if (game->level.derpy_y>=0.65) return true; // if (game->level.derpy_y>=0.65) return true;
return false; return false;
} }
@ -91,7 +95,7 @@ bool GenerateObstacles(struct Game *game, struct TM_Action *action, enum TM_Acti
*count = 0; *count = 0;
} }
else if (state == TM_ACTIONSTATE_RUNNING) { else if (state == TM_ACTIONSTATE_RUNNING) {
if (rand()%(10000/(int)(85*game->level.speed_modifier))<=3) { /* if (rand()%(10000/(int)(85*game->level.speed_modifier))<=3) {
PrintConsole(game, "OBSTACLE %d", *count); PrintConsole(game, "OBSTACLE %d", *count);
(*count)++; (*count)++;
struct Obstacle *obst = malloc(sizeof(struct Obstacle)); struct Obstacle *obst = malloc(sizeof(struct Obstacle));
@ -165,7 +169,7 @@ bool GenerateObstacles(struct Game *game, struct TM_Action *action, enum TM_Acti
} }
game->level.dodger.obstacles = obst; game->level.dodger.obstacles = obst;
if (*count > 128) return true; if (*count > 128) return true;
} }*/
} else if (state == TM_ACTIONSTATE_DESTROY) { } else if (state == TM_ACTIONSTATE_DESTROY) {
free(action->arguments->value); free(action->arguments->value);
TM_DestroyArgs(action->arguments); TM_DestroyArgs(action->arguments);

View file

@ -30,7 +30,7 @@ void Obst_MoveUpDown(struct Game *game, struct Obstacle *obstacle) {
} }
} else { } else {
obstacle->y += 0.5; obstacle->y += 0.5;
if (obstacle->y>=((game->viewportHeight-al_get_bitmap_height(*(obstacle->bitmap))/obstacle->rows)/(float)game->viewportHeight)*100) { if (obstacle->y>=((game->viewport.height-al_get_bitmap_height(*(obstacle->bitmap))/obstacle->rows)/(float)game->viewport.height)*100) {
*((bool*)obstacle->data)=true; *((bool*)obstacle->data)=true;
} }
} }

View file

@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
#include "../dodger.h"
#include "../../../main.h" #include "../../../main.h"
/*! \brief Move up or down until reaching the edge of the screen. After that - change direction. */ /*! \brief Move up or down until reaching the edge of the screen. After that - change direction. */