2012-02-17 20:32:58 +01:00
# include <allegro5/allegro.h>
# include <allegro5/allegro_font.h>
2012-02-18 04:14:35 +01:00
# include <math.h>
2012-02-19 20:18:28 +01:00
# include <stdio.h>
2012-02-17 20:32:58 +01:00
# include "intro.h"
2012-02-22 10:19:02 +01:00
# include "map.h"
2012-02-17 20:32:58 +01:00
void Intro_Draw ( struct Game * game ) {
al_clear_to_color ( al_map_rgb ( 0 , 0 , 0 ) ) ;
2012-02-18 04:14:35 +01:00
//printf("%f\n", ((-1*((game->intro.position)%al_get_display_width(game->display)))/(float)al_get_display_width(game->display)));
if ( game - > intro . in_animation )
2012-02-22 14:55:21 +01:00
al_draw_bitmap ( game - > intro . table , - 1 * ( game - > intro . page ) * al_get_display_width ( game - > display ) + ( cos ( ( ( - 1 * ( ( game - > intro . position ) % al_get_display_width ( game - > display ) ) ) / ( float ) al_get_display_width ( game - > display ) ) * ( ALLEGRO_PI ) ) / 2.0 ) * al_get_display_width ( game - > display ) + al_get_display_width ( game - > display ) / 2.0 , 0 , 0 ) ; //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0);
2012-02-18 04:14:35 +01:00
else
2012-02-18 05:10:42 +01:00
al_draw_bitmap ( game - > intro . table , - 1 * ( game - > intro . page ) * al_get_display_width ( game - > display ) , 0 , 0 ) ; //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0);
2012-02-18 11:16:30 +01:00
//al_draw_text(game->font, al_map_rgb(255,255,255), al_get_display_width(game->display)/2, al_get_display_height(game->display)/2, ALLEGRO_ALIGN_CENTRE, "Not implemented yet!");
2012-02-24 23:58:18 +01:00
al_draw_text_with_shadow ( game - > intro . font , al_map_rgb ( 255 , 255 , 255 ) , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) * 0.90 , ALLEGRO_ALIGN_CENTRE , " Press any key to continue or escape to skip... " ) ;
2012-02-18 04:14:35 +01:00
//PrintConsole(game, "drawing");
if ( game - > intro . in_animation ) {
//PrintConsole(game, "animating");
2012-02-18 05:10:42 +01:00
game - > intro . position - = 10 ;
2012-02-18 04:14:35 +01:00
if ( game - > intro . position % al_get_display_width ( game - > display ) = = 0 ) {
game - > intro . in_animation = false ;
PrintConsole ( game , " Animation finished. " ) ;
}
2012-02-22 10:22:48 +01:00
else if ( game - > intro . position < = - 4 * al_get_display_width ( game - > display ) ) {
2012-02-18 04:14:35 +01:00
PrintConsole ( game , " This was the last page. " ) ;
UnloadGameState ( game ) ;
2012-02-18 05:53:39 +01:00
game - > loadstate = GAMESTATE_MAP ;
2012-02-22 11:53:26 +01:00
PrintConsole ( game , " Chainloading GAMESTATE_MAP... " ) ;
LoadGameState ( game ) ;
2012-02-18 04:14:35 +01:00
}
}
2012-02-17 20:32:58 +01:00
}
2012-02-18 04:41:45 +01:00
void Intro_Load ( struct Game * game ) {
2012-02-19 20:18:28 +01:00
al_play_sample ( game - > intro . sample , 1.0 , 0.0 , 1.0 , ALLEGRO_PLAYMODE_LOOP , NULL ) ;
2012-02-18 04:41:45 +01:00
ALLEGRO_EVENT ev ;
for ( int fadeloop = 0 ; fadeloop < 256 ; fadeloop + = 10 ) {
al_wait_for_event ( game - > event_queue , & ev ) ;
2012-02-18 06:45:15 +01:00
al_draw_tinted_bitmap ( game - > intro . table , al_map_rgba_f ( fadeloop / 255.0 , fadeloop / 255.0 , fadeloop / 255.0 , 1 ) , 0 , 0 , 0 ) ;
2012-02-18 04:41:45 +01:00
DrawConsole ( game ) ;
al_flip_display ( ) ;
}
2012-02-19 22:20:05 +01:00
Intro_Draw ( game ) ;
2012-02-18 04:41:45 +01:00
}
2012-02-18 04:14:35 +01:00
int Intro_Keydown ( struct Game * game , ALLEGRO_EVENT * ev ) {
if ( ev - > keyboard . keycode = = ALLEGRO_KEY_ESCAPE ) {
UnloadGameState ( game ) ;
2012-02-18 05:53:39 +01:00
game - > loadstate = GAMESTATE_MAP ;
2012-02-22 10:19:02 +01:00
PrintConsole ( game , " Chainloading GAMESTATE_MAP... " ) ;
LoadGameState ( game ) ;
2012-02-18 04:14:35 +01:00
return 0 ;
}
if ( ! game - > intro . in_animation ) {
2012-02-19 22:54:33 +01:00
PrintConsole ( game , " Animate page (was on %d)... " , + + game - > intro . page ) ;
2012-02-18 04:14:35 +01:00
game - > intro . in_animation = true ;
}
return 0 ;
}
void Intro_Preload ( struct Game * game ) {
game - > intro . position = 0 ;
game - > intro . page = 0 ;
game - > intro . in_animation = false ;
2012-02-24 23:58:18 +01:00
game - > intro . table_bitmap = al_load_bitmap ( " data/paper.png " ) ;
2012-02-19 20:18:28 +01:00
game - > intro . sample = al_load_sample ( " data/intro.flac " ) ;
if ( ! game - > intro . sample ) {
fprintf ( stderr , " Audio clip sample not loaded! \n " ) ;
exit ( - 1 ) ;
}
2012-02-22 10:22:48 +01:00
game - > intro . table = al_create_bitmap ( al_get_display_width ( game - > display ) * 5 , al_get_display_height ( game - > display ) ) ;
2012-02-19 18:10:08 +01:00
game - > intro . font = al_load_ttf_font ( " data/ShadowsIntoLight.ttf " , al_get_display_height ( game - > display ) * 0.045 , 0 ) ;
2012-02-18 04:14:35 +01:00
al_set_target_bitmap ( game - > intro . table ) ;
2012-02-24 23:58:18 +01:00
al_draw_scaled_bitmap ( game - > intro . table_bitmap , 0 , 0 , al_get_bitmap_width ( game - > intro . table_bitmap ) , al_get_bitmap_height ( game - > intro . table_bitmap ) , 0 , 0 , al_get_display_width ( game - > display ) , al_get_display_height ( game - > display ) , 0 ) ;
al_draw_scaled_bitmap ( game - > intro . table_bitmap , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , 0 , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , al_get_bitmap_height ( game - > intro . table_bitmap ) , al_get_display_width ( game - > display ) * 1 , 0 , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) , 0 ) ;
al_draw_scaled_bitmap ( game - > intro . table_bitmap , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , 0 , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , al_get_bitmap_height ( game - > intro . table_bitmap ) , al_get_display_width ( game - > display ) * 1.5 , 0 , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) , 0 ) ;
al_draw_scaled_bitmap ( game - > intro . table_bitmap , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , 0 , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , al_get_bitmap_height ( game - > intro . table_bitmap ) , al_get_display_width ( game - > display ) * 2 , 0 , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) , 0 ) ;
al_draw_scaled_bitmap ( game - > intro . table_bitmap , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , 0 , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , al_get_bitmap_height ( game - > intro . table_bitmap ) , al_get_display_width ( game - > display ) * 2.5 , 0 , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) , 0 ) ;
al_draw_scaled_bitmap ( game - > intro . table_bitmap , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , 0 , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , al_get_bitmap_height ( game - > intro . table_bitmap ) , al_get_display_width ( game - > display ) * 3 , 0 , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) , 0 ) ;
al_draw_scaled_bitmap ( game - > intro . table_bitmap , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , 0 , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , al_get_bitmap_height ( game - > intro . table_bitmap ) , al_get_display_width ( game - > display ) * 3.5 , 0 , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) , 0 ) ;
al_draw_scaled_bitmap ( game - > intro . table_bitmap , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , 0 , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , al_get_bitmap_height ( game - > intro . table_bitmap ) , al_get_display_width ( game - > display ) * 4 , 0 , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) , 0 ) ;
al_draw_scaled_bitmap ( game - > intro . table_bitmap , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , 0 , al_get_bitmap_width ( game - > intro . table_bitmap ) / 2 , al_get_bitmap_height ( game - > intro . table_bitmap ) , al_get_display_width ( game - > display ) * 4.5 , 0 , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) , 0 ) ;
2012-02-18 04:14:35 +01:00
2012-02-23 12:23:19 +01:00
float y ;
float oldx = - 1 ;
void draw_text ( int page , char * text ) {
float x = page - 1 + 0.45 ;
if ( x ! = oldx ) { y = 0.2 ; oldx = x ; }
2012-02-24 23:58:18 +01:00
al_draw_text_with_shadow ( game - > intro . font , al_map_rgb ( 255 , 255 , 255 ) , al_get_display_width ( game - > display ) * x , al_get_display_height ( game - > display ) * y , ALLEGRO_ALIGN_LEFT , text ) ;
2012-02-23 12:23:19 +01:00
y + = 0.07 ;
}
draw_text ( 1 , " Since Twilight Sparkle and her five best " ) ;
draw_text ( 1 , " friends defeated Discord and imprisoned " ) ;
draw_text ( 1 , " him in a stone using the Elements of " ) ;
draw_text ( 1 , " Harmony, Equestia has been a peaceful " ) ;
draw_text ( 1 , " place for a quite long time. " ) ;
draw_text ( 2 , " Suddenly, one day some reckless pony " ) ;
draw_text ( 2 , " accidentally introduced a tiny little " ) ;
draw_text ( 2 , " bit of chaos near Discords figure. " ) ;
2012-02-18 11:16:30 +01:00
2012-02-23 12:23:19 +01:00
draw_text ( 3 , " A tiny little bit of chaos turned not to " ) ;
draw_text ( 3 , " be enough for Discord to escape from rock, " ) ;
draw_text ( 3 , " but enough to turn nearly dropped muffins " ) ;
draw_text ( 3 , " into muffinzombies, with aim to destroy all " ) ;
draw_text ( 3 , " the harmony in Equestria. " ) ;
2012-02-18 11:16:30 +01:00
2012-02-23 12:23:19 +01:00
draw_text ( 4 , " Discord, who has learned his lession after " ) ;
draw_text ( 4 , " last failure, turned his muffinzombie-gang " ) ;
draw_text ( 4 , " against the same mares who previously " ) ;
draw_text ( 4 , " defeated him, prisoning them in their own " ) ;
draw_text ( 4 , " houses. Thanks to that, he's now able to " ) ;
2012-02-23 23:30:37 +01:00
draw_text ( 4 , " wait until the world is again chaotic enough " ) ;
draw_text ( 4 , " for him to escape and rule Equestria " ) ;
2012-02-23 12:23:19 +01:00
draw_text ( 4 , " once again. " ) ;
2012-02-18 11:16:30 +01:00
2012-02-23 12:23:19 +01:00
draw_text ( 5 , " Who is able to defeat Discord when the " ) ;
draw_text ( 5 , " Elements of Harmony are unavailable? " ) ;
draw_text ( 5 , " " ) ;
draw_text ( 5 , " Well... There is somepony who knows " ) ;
draw_text ( 5 , " everything about muffins... " ) ;
2012-02-18 11:16:30 +01:00
2012-02-18 04:14:35 +01:00
al_set_target_bitmap ( al_get_backbuffer ( game - > display ) ) ;
2012-02-22 10:19:02 +01:00
PrintConsole ( game , " Chainpreloading GAMESTATE_MAP... " ) ;
Map_Preload ( game ) ;
2012-02-18 04:14:35 +01:00
}
void Intro_Unload ( struct Game * game ) {
2012-02-18 04:41:45 +01:00
ALLEGRO_EVENT ev ;
for ( int fadeloop = 255 ; fadeloop > = 0 ; fadeloop - = 10 ) {
al_wait_for_event ( game - > event_queue , & ev ) ;
if ( game - > intro . in_animation )
2012-02-18 05:10:42 +01:00
al_draw_tinted_bitmap ( game - > intro . table , al_map_rgba_f ( fadeloop / 255.0 , fadeloop / 255.0 , fadeloop / 255.0 , 1 ) , - 1 * ( game - > intro . page ) * al_get_display_width ( game - > display ) + ( cos ( ( ( - 1 * ( ( game - > intro . position ) % al_get_display_width ( game - > display ) ) ) / ( float ) al_get_display_width ( game - > display ) ) * ( 3.1415 ) ) / 2.0 ) * al_get_display_width ( game - > display ) + al_get_display_width ( game - > display ) / 2.0 , 0 , 0 ) ; //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0);
2012-02-18 04:41:45 +01:00
else
2012-02-18 05:10:42 +01:00
al_draw_tinted_bitmap ( game - > intro . table , al_map_rgba_f ( fadeloop / 255.0 , fadeloop / 255.0 , fadeloop / 255.0 , 1 ) , - 1 * ( game - > intro . page ) * al_get_display_width ( game - > display ) , 0 , 0 ) ; //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0);
2012-02-18 04:41:45 +01:00
//al_draw_tinted_bitmap(game->intro.table_bitmap,al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1),-1*(game->intro.page)*al_get_display_width(game->display), al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)),0);
DrawConsole ( game ) ;
al_flip_display ( ) ;
}
2012-02-18 04:14:35 +01:00
al_destroy_bitmap ( game - > intro . table_bitmap ) ;
al_destroy_bitmap ( game - > intro . table ) ;
2012-02-18 05:53:39 +01:00
al_destroy_font ( game - > intro . font ) ;
2012-02-19 20:18:28 +01:00
al_destroy_sample ( game - > intro . sample ) ;
2012-02-22 10:19:02 +01:00
2012-02-18 04:14:35 +01:00
}