2012-02-28 13:09:12 +01:00
/*! \file level.c
* \ brief Playable Level code .
*/
2012-03-04 13:32:42 +01:00
/*
* Copyright ( c ) Sebastian Krzyszkowiak < dos @ dosowisko . net >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*/
2012-02-22 12:43:14 +01:00
# include <stdio.h>
2012-03-01 10:49:20 +01:00
# include <math.h>
2012-03-02 16:52:13 +01:00
# include "pause.h"
2012-02-22 12:43:14 +01:00
# include "level.h"
void Level_Draw ( struct Game * game ) {
2012-03-02 17:47:02 +01:00
if ( ! al_get_sample_instance_playing ( game - > level . music ) & & ( game - > loadstate = = GAMESTATE_LEVEL ) ) {
al_set_sample_instance_playing ( game - > level . music , true ) ;
al_set_sample_instance_position ( game - > level . music , game - > level . music_pos ) ;
}
2012-02-25 16:46:25 +01:00
al_set_target_bitmap ( game - > level . derpy ) ;
al_clear_to_color ( al_map_rgba ( 0 , 0 , 0 , 0 ) ) ;
2012-03-01 23:03:07 +01:00
al_draw_bitmap_region ( game - > level . derpy_walkcycle , al_get_bitmap_width ( game - > level . derpy ) * ( game - > level . derpy_frame % 6 ) , al_get_bitmap_height ( game - > level . derpy ) * ( game - > level . derpy_frame / 6 ) , al_get_bitmap_width ( game - > level . derpy ) , al_get_bitmap_height ( game - > level . derpy ) , 0 , 0 , 0 ) ;
2012-02-25 16:46:25 +01:00
al_set_target_bitmap ( al_get_backbuffer ( game - > display ) ) ;
2012-03-01 10:49:20 +01:00
game - > level . derpy_pos = game - > level . derpy_pos + tps ( game , 60 * 0.00092 ) ;
2012-02-28 14:13:49 +01:00
if ( game - > level . derpy_pos > 1 ) { UnloadGameState ( game ) ;
2012-02-29 23:00:59 +01:00
game - > loadstate = GAMESTATE_MENU ;
LoadGameState ( game ) ; return ; }
2012-03-01 10:49:20 +01:00
int i ;
for ( i = 0 ; i < tps ( game , 60 ) ; i + + ) {
2012-02-25 16:46:25 +01:00
game - > level . derpy_frame_tmp + + ;
if ( game - > level . derpy_frame_tmp % 3 = = 0 ) {
2012-02-28 14:13:49 +01:00
if ( game - > level . derpy_frame_tmp % 5 = = 0 ) game - > level . derpy_frame + + ;
2012-03-04 17:37:44 +01:00
if ( game - > level . derpy_frame_tmp % 22 = = 21 ) game - > level . derpy_frame - - ;
2012-02-25 16:46:25 +01:00
game - > level . derpy_frame + + ;
2012-02-28 14:13:49 +01:00
if ( game - > level . derpy_frame > = 24 ) game - > level . derpy_frame = 0 ;
2012-02-25 16:46:25 +01:00
}
2012-03-01 10:49:20 +01:00
}
2012-02-22 12:43:14 +01:00
al_draw_scaled_bitmap ( game - > level . image , 0 , 0 , al_get_bitmap_width ( game - > level . image ) , al_get_bitmap_height ( game - > level . image ) , 0 , 0 , al_get_display_width ( game - > display ) , al_get_display_height ( game - > display ) , 0 ) ;
2012-02-28 14:13:49 +01:00
al_draw_bitmap ( game - > level . derpy , game - > level . derpy_pos * al_get_display_width ( game - > display ) , al_get_display_height ( game - > display ) - al_get_bitmap_height ( game - > level . derpy ) , ALLEGRO_FLIP_HORIZONTAL ) ;
al_draw_textf ( game - > font , al_map_rgb ( 255 , 255 , 255 ) , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) / 2.2 , ALLEGRO_ALIGN_CENTRE , " Level %d: Not implemented yet! " , game - > level . current_level ) ;
al_draw_text ( game - > font , al_map_rgb ( 255 , 255 , 255 ) , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) / 1.8 , ALLEGRO_ALIGN_CENTRE , " Have some moonwalk instead. " ) ;
2012-02-22 12:43:14 +01:00
}
void Level_Load ( struct Game * game ) {
2012-03-08 20:55:18 +01:00
game - > level . derpy_frame = 0 ;
game - > level . derpy_frame_tmp = 0 ;
game - > level . derpy_pos = - 0.2 ;
2012-03-05 21:07:42 +01:00
al_play_sample_instance ( game - > level . music ) ;
2012-02-22 12:43:14 +01:00
ALLEGRO_EVENT ev ;
2012-02-29 12:16:11 +01:00
int fadeloop ;
2012-03-01 10:49:20 +01:00
for ( fadeloop = 0 ; fadeloop < 256 ; fadeloop + = tps ( game , 600 ) ) {
2012-02-22 12:43:14 +01:00
al_wait_for_event ( game - > event_queue , & ev ) ;
al_draw_tinted_bitmap ( game - > level . fade_bitmap , al_map_rgba_f ( fadeloop / 255.0 , fadeloop / 255.0 , fadeloop / 255.0 , 1 ) , 0 , 0 , 0 ) ;
DrawConsole ( game ) ;
al_flip_display ( ) ;
}
al_destroy_bitmap ( game - > level . fade_bitmap ) ;
Level_Draw ( game ) ;
}
2012-02-25 22:26:31 +01:00
2012-02-22 12:43:14 +01:00
int Level_Keydown ( struct Game * game , ALLEGRO_EVENT * ev ) {
2012-03-03 21:58:14 +01:00
if ( ev - > keyboard . keycode = = ALLEGRO_KEY_ESCAPE ) {
2012-03-02 17:47:02 +01:00
game - > level . music_pos = al_get_sample_instance_position ( game - > level . music ) ;
al_set_sample_instance_playing ( game - > level . music , false ) ;
2012-03-02 16:52:13 +01:00
game - > gamestate = GAMESTATE_PAUSE ;
game - > loadstate = GAMESTATE_LEVEL ;
Pause_Load ( game ) ;
2012-02-22 15:21:28 +01:00
}
return 0 ;
2012-02-22 12:43:14 +01:00
}
2012-02-25 22:26:31 +01:00
2012-03-08 22:21:02 +01:00
void Level_PreloadBitmaps ( struct Game * game ) {
2012-03-04 15:57:23 +01:00
game - > level . image = LoadScaledBitmap ( " table.png " , al_get_display_width ( game - > display ) , al_get_display_height ( game - > display ) ) ;
game - > level . derpy_walkcycle = LoadScaledBitmap ( " derpcycle.png " , al_get_display_width ( game - > display ) * 0.1953125 * 6 , al_get_display_height ( game - > display ) * 0.25 * 4 ) ;
2012-03-02 17:47:02 +01:00
2012-02-25 16:46:25 +01:00
game - > level . derpy = al_create_bitmap ( al_get_display_width ( game - > display ) * 0.1953125 , al_get_display_height ( game - > display ) * 0.25 ) ;
2012-02-22 12:43:14 +01:00
game - > level . fade_bitmap = al_create_bitmap ( al_get_display_width ( game - > display ) , al_get_display_height ( game - > display ) ) ;
al_set_target_bitmap ( game - > level . fade_bitmap ) ;
2012-03-01 01:14:24 +01:00
al_draw_bitmap ( game - > level . image , 0 , 0 , 0 ) ;
2012-02-28 14:13:49 +01:00
al_draw_textf ( game - > font , al_map_rgb ( 255 , 255 , 255 ) , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) / 2.2 , ALLEGRO_ALIGN_CENTRE , " Level %d: Not implemented yet! " , game - > level . current_level ) ;
al_draw_text ( game - > font , al_map_rgb ( 255 , 255 , 255 ) , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) / 1.8 , ALLEGRO_ALIGN_CENTRE , " Have some moonwalk instead. " ) ;
2012-02-22 12:43:14 +01:00
al_set_target_bitmap ( al_get_backbuffer ( game - > display ) ) ;
2012-03-08 22:21:02 +01:00
}
void Level_Preload ( struct Game * game ) {
PrintConsole ( game , " Initializing level %d... " , game - > level . current_level ) ;
game - > level . sample = al_load_sample ( " data/moonwalk.flac " ) ;
game - > level . music = al_create_sample_instance ( game - > level . sample ) ;
al_attach_sample_instance_to_mixer ( game - > level . music , game - > audio . music ) ;
al_set_sample_instance_playmode ( game - > level . music , ALLEGRO_PLAYMODE_LOOP ) ;
if ( ! game - > level . sample ) {
fprintf ( stderr , " Audio clip sample not loaded! \n " ) ;
exit ( - 1 ) ;
}
Level_PreloadBitmaps ( game ) ;
2012-03-04 13:24:35 +01:00
Pause_Preload ( game ) ;
2012-02-22 12:43:14 +01:00
}
2012-02-25 22:26:31 +01:00
2012-03-08 22:21:02 +01:00
void Level_UnloadBitmaps ( struct Game * game ) {
al_destroy_bitmap ( game - > level . image ) ;
al_destroy_bitmap ( game - > level . derpy ) ;
al_destroy_bitmap ( game - > level . derpy_walkcycle ) ;
}
2012-02-22 12:43:14 +01:00
void Level_Unload ( struct Game * game ) {
2012-03-04 13:24:35 +01:00
Pause_Unload_Real ( game ) ;
2012-02-22 12:43:14 +01:00
ALLEGRO_EVENT ev ;
game - > level . fade_bitmap = al_create_bitmap ( al_get_display_width ( game - > display ) , al_get_display_height ( game - > display ) ) ;
al_set_target_bitmap ( game - > level . fade_bitmap ) ;
2012-03-04 16:52:05 +01:00
al_draw_bitmap ( game - > level . image , 0 , 0 , 0 ) ;
2012-02-28 14:43:47 +01:00
al_draw_bitmap ( game - > level . derpy , game - > level . derpy_pos * al_get_display_width ( game - > display ) , al_get_display_height ( game - > display ) - al_get_bitmap_height ( game - > level . derpy ) , ALLEGRO_FLIP_HORIZONTAL ) ;
2012-02-28 14:13:49 +01:00
al_draw_textf ( game - > font , al_map_rgb ( 255 , 255 , 255 ) , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) / 2.2 , ALLEGRO_ALIGN_CENTRE , " Level %d: Not implemented yet! " , game - > level . current_level ) ;
al_draw_text ( game - > font , al_map_rgb ( 255 , 255 , 255 ) , al_get_display_width ( game - > display ) / 2 , al_get_display_height ( game - > display ) / 1.8 , ALLEGRO_ALIGN_CENTRE , " Have some moonwalk instead. " ) ;
2012-02-22 12:43:14 +01:00
al_set_target_bitmap ( al_get_backbuffer ( game - > display ) ) ;
2012-02-29 12:16:11 +01:00
int fadeloop ;
2012-03-01 10:49:20 +01:00
for ( fadeloop = 255 ; fadeloop > = 0 ; fadeloop - = tps ( game , 600 ) ) {
2012-02-22 12:43:14 +01:00
al_wait_for_event ( game - > event_queue , & ev ) ;
al_draw_tinted_bitmap ( game - > level . fade_bitmap , al_map_rgba_f ( fadeloop / 255.0 , fadeloop / 255.0 , fadeloop / 255.0 , 1 ) , 0 , 0 , 0 ) ;
DrawConsole ( game ) ;
al_flip_display ( ) ;
}
2012-03-08 22:21:02 +01:00
Level_UnloadBitmaps ( game ) ;
2012-02-22 12:43:14 +01:00
al_destroy_bitmap ( game - > level . fade_bitmap ) ;
2012-03-05 21:07:42 +01:00
al_destroy_sample_instance ( game - > level . music ) ;
2012-02-22 12:43:14 +01:00
al_destroy_sample ( game - > level . sample ) ;
}