00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <string>
00034 #include <stdlib.h>
00035 #include <iostream>
00036 #include <fstream>
00037 using namespace std;
00038 using std::string;
00039
00040 #include "SDL.h"
00041 #include "SDL_image.h"
00042
00043 #include "sound.h"
00044 #include "misc.h"
00045 #include "tiledata.h"
00046 #include "tiles.h"
00047 #include "screen.h"
00048 #include "menu.h"
00049 #include "fgentity.h"
00050 #include "character.h"
00051 #include "fgitem.h"
00052 #include "player.h"
00053 #include "stats.h"
00054 #include "fgentitylist.h"
00055 #include "bgentity.h"
00056 #include "bgdraw.h"
00057
00058 #ifdef main
00059 #undef main
00060 #endif
00061
00062
00063 #define window_width 640
00064 #define window_height 480
00065 #define play_width 560
00066 #define play_height 480
00067 #define bit_depth 16
00068 #define default_level1_mapfile "maps/level1.ppm"
00069
00070 int main( int argc, char* argv[] )
00071 {
00072 ios::sync_with_stdio();
00073
00074 int text_width;
00075 ifstream level_file;
00076 string level_filename;
00077 string fileline;
00078 char *charline, *tmpstring;
00079 int tile_size = TILESIZE;
00080 string bgm_file;
00081 int input_state = 0;
00082 int map_width, map_height;
00083 int char_x, char_y;
00084 int tile_x, tile_y, tile_index, wflag, hitpoints, damage;
00085 int done = 0;
00086 int direction = -1;
00087 Uint8 *keys;
00088 paul_info *pinfo = new paul_info;
00089 tile_info *info;
00090
00091 Tiles tiles;
00092 FGEntityList fge_list;
00093 Player player;
00094 Stats stats;
00095 BGEntity *bge;
00096 BGDraw bgdraw;
00097
00098
00099 pinfo->base_health = 200;
00100 pinfo->hitpoints = 200;
00101 pinfo->damage = 2;
00102 pinfo->ranged = 1;
00103 pinfo->keys = 0;
00104 pinfo->level = 1;
00105 pinfo->score = 0;
00106 pinfo->direction = 4;
00107
00108
00109 tiles.load_tileimages("tilefile");
00110
00111
00112 Screen screen;
00113
00114
00115 atexit ( SDL_Quit );
00116
00117
00118 if(!screen.configure(window_width, window_height, bit_depth)) exit(1);
00119
00121
00123 ifstream samplelist_file;
00124 int NUM_SAMPLES = 0;
00125 samplelist_file.open("data/sounds/samplelist", ios::in);
00126 if (samplelist_file.is_open()){
00127 while (! samplelist_file.eof() ){
00128 getline (samplelist_file, fileline);
00129 if(fileline[0] != '#'){
00130 NUM_SAMPLES++;
00131 }
00132 }
00133 samplelist_file.clear();
00134 samplelist_file.seekg(0);
00135 }
00136
00137
00138 Sound sound(NUM_SAMPLES);
00139
00140 if (NUM_SAMPLES){
00141 while (! samplelist_file.eof() ){
00142 getline (samplelist_file, fileline);
00143 if(fileline[0] != '#'){
00144 fileline = "data/sounds/" + fileline;
00145
00146
00147 sound.load_sfx(fileline);
00148 }
00149 }
00150 }
00151 samplelist_file.close();
00152 sound.load_bgm("data/sounds/back2.mod");
00153 sound.play_bgm();
00154 sound.play_sample_name("data/sounds/shot.wav");
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 level_filename = get_level_filename(pinfo->level);
00185 level_file.open(level_filename.c_str(), ios::in);
00186 if (level_file.is_open()){
00187 while (! level_file.eof() ){
00188 getline(level_file, fileline);
00189 charline = (char*) fileline.c_str();
00190 if(fileline[0] != '#'){
00191 if(fileline[0] == 'L' && fileline[1] == '1'){
00192 input_state = 4;
00193 }else{
00194 switch(input_state){
00195 case 0:
00196 sscanf(charline, "%d %d", &map_width, &map_height);
00197 input_state = 1;
00198
00199 bge = new BGEntity[map_width*map_height];
00200 fge_list.set_bgentity(bge);
00201 break;
00202 case 1:
00203 sscanf(charline, "%d %d", &char_x, &char_y);
00204
00205 player.set_paul_info(pinfo);
00206 tile_index = 255;
00207 player.set_index(tile_index);
00208 player.set_tiledata(*tiles.get_tiledata(tile_index));
00209 player.set_location(tile_x, tile_y);
00210 player.set_screen(screen);
00211 fge_list.set_player(player);
00212 fge_list.set_paul_info(pinfo);
00213 input_state = 2;
00214 break;
00215 case 2:
00216 sscanf(charline, "%s", tmpstring);
00217 bgm_file = tmpstring;
00218
00219 input_state = 3;
00220 break;
00221 case 3:
00222 sscanf(charline, "%d %d %d %d %d %d", &tile_x, &tile_y, &tile_index,
00223 &wflag, &hitpoints, &damage);
00224
00225 info = process_tile(tile_index, wflag, "dummy");
00226 bge[(tile_y*map_width)+tile_x].set_tileinfo(info);
00227 bge[(tile_y*map_width)+tile_x].set_tile_props(wflag, hitpoints);
00228 bge[(tile_y*map_width)+tile_x].set_tiledata(tiles.get_tiledata(tile_index));
00229
00230 bge[(tile_y*map_width)+tile_x].set_index(tile_index);
00231 bge[(tile_y*map_width)+tile_x].set_location(tile_x, tile_y);
00232 break;
00233 case 4:
00234 sscanf(charline, "%d %d %d %d %d %d", &tile_x, &tile_y, &tile_index,
00235 &wflag, &hitpoints, &damage);
00236
00237 info = process_tile(tile_index, wflag, "dummy");
00238 if(tile_index >= ENEMY_BEGIN && tile_index <= ENEMY_END){
00239 Character *character = new Character;
00240 character->set_tileinfo(wflag, hitpoints, damage);
00241 character->set_index(tile_index);
00242 character->set_tiledata(*tiles.get_tiledata(tile_index));
00243 character->set_paul_info(pinfo);
00244 character->set_location(tile_x, tile_y);
00245 fge_list.add_fgentity(character);
00246
00247 }else if(tile_index >= KEY_BEGIN && tile_index <= KEY_END){
00248 FGItem *key = new FGItem;
00249 key->set_numframes(1);
00250 key->set_walkable(1);
00251 key->set_index(tile_index);
00252 key->set_tiledata(*tiles.get_tiledata(tile_index));
00253 key->set_paul_info(pinfo);
00254 key->set_location(tile_x, tile_y);
00255 fge_list.add_fgentity(key);
00256 }else if(tile_index >= TELEPORTER_BEGIN && tile_index <= TELEPORTER_END){
00257 FGItem *teleporter = new FGItem;
00258 teleporter->set_numframes(3);
00259 teleporter->set_walkable(1);
00260 teleporter->set_teleporterinfo(wflag, hitpoints);
00261 teleporter->set_index(tile_index);
00262 teleporter->set_tiledata(*tiles.get_tiledata(tile_index));
00263 teleporter->set_paul_info(pinfo);
00264 teleporter->set_location(tile_x, tile_y);
00265 fge_list.add_fgentity(teleporter);
00266 }else if(tile_index >= EXIT_BEGIN && tile_index <= EXIT_END){
00267 FGItem *exit = new FGItem;
00268 exit->set_numframes(1);
00269 exit->set_walkable(1);
00270 exit->set_nextlevel(wflag);
00271 exit->set_index(tile_index);
00272 exit->set_tiledata(*tiles.get_tiledata(tile_index));
00273 exit->set_paul_info(pinfo);
00274 exit->set_location(tile_x, tile_y);
00275 fge_list.add_fgentity(exit);
00276 }else if(tile_index >= SCROLL_BEGIN && tile_index <= SCROLL_END){
00277 FGItem *scroll = new FGItem;
00278 scroll->set_index(tile_index);
00279 scroll->set_numframes(1);
00280 scroll->set_walkable(1);
00281 scroll->set_tiledata(*tiles.get_tiledata(tile_index));
00282 scroll->set_paul_info(pinfo);
00283 scroll->set_location(tile_x, tile_y);
00284 fge_list.add_fgentity(scroll);
00285 }else if(tile_index >= DOOR_BEGIN && tile_index <= DOOR_END){
00286 FGItem *door = new FGItem;
00287 door->set_numframes(2);
00288 door->set_needkey(wflag);
00289 door->set_index(tile_index);
00290 door->set_tiledata(*tiles.get_tiledata(tile_index));
00291 door->set_paul_info(pinfo);
00292 door->set_location(tile_x, tile_y);
00293 fge_list.add_fgentity(door);
00294 }else if(tile_index >= POWERUP_BEGIN && tile_index <= POWERUP_END){
00295 FGItem *powerup = new FGItem;
00296 powerup->set_numframes(1);
00297 powerup->set_walkable(1);
00298 powerup->set_pointchange(wflag);
00299 powerup->set_index(tile_index);
00300 powerup->set_tiledata(*tiles.get_tiledata(tile_index));
00301 powerup->set_paul_info(pinfo);
00302 powerup->set_location(tile_x, tile_y);
00303 fge_list.add_fgentity(powerup);
00304 }else if(tile_index >= GOLD_BEGIN && tile_index <= GOLD_END){
00305 FGItem *gold = new FGItem;
00306 gold->set_numframes(1);
00307 gold->set_walkable(1);
00308 gold->set_scorechange(wflag);
00309 gold->set_index(tile_index);
00310 gold->set_tiledata(*tiles.get_tiledata(tile_index));
00311 gold->set_paul_info(pinfo);
00312 gold->set_location(tile_x, tile_y);
00313 fge_list.add_fgentity(gold);
00314 }else if(tile_index >= GENERATOR_BEGIN && tile_index <= GENERATOR_END){
00315 FGItem *generator = new FGItem;
00316 generator->set_numframes(1);
00317 generator->set_generatorinfo(wflag, hitpoints);
00318 generator->set_index(tile_index);
00319 generator->set_tiledata(*tiles.get_tiledata(tile_index));
00320 generator->set_paul_info(pinfo);
00321 generator->set_location(tile_x, tile_y);
00322 fge_list.add_fgentity(generator);
00323 }else if(tile_index >= TRAPS_BEGIN && tile_index <= TRAPS_END){
00324 FGItem *trap = new FGItem;
00325 trap->set_numframes(1);
00326 trap->set_walkable(1);
00327 trap->set_damage(wflag);
00328 trap->set_index(tile_index);
00329 trap->set_tiledata(*tiles.get_tiledata(tile_index));
00330 trap->set_paul_info(pinfo);
00331 trap->set_location(tile_x, tile_y);
00332 fge_list.add_fgentity(trap);
00333 }else{
00334 }
00335 break;
00336 }
00337 }
00338 }
00339 }
00340 }
00341 level_file.close();
00342 fge_list.set_screen(screen);
00343 stats.set_paul_info(pinfo);
00344 stats.set_stats_display(screen);
00345 SDL_ShowCursor(0);
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 bgdraw.set_display(screen);
00371 bgdraw.set_background(bge);
00372 bgdraw.set_paul_info(pinfo);
00373 bgdraw.set_size(window_width, window_height, map_width, map_height, tile_size, char_x, char_y);
00374 bgdraw.initialize();
00375 fge_list.set_background_draw(bgdraw);
00376 printf("tilesize: %d win:%d %d\n", pinfo->tilesize, pinfo->win_width, pinfo->win_height);
00377 screen.update_screen();
00378
00379
00380 SDL_Event event ;
00381 SDL_EventState(SDL_KEYUP, SDL_IGNORE);
00382 SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
00383 SDL_EventState(SDL_MOUSEBUTTONDOWN, SDL_IGNORE);
00384 SDL_EventState(SDL_MOUSEBUTTONUP, SDL_IGNORE);
00385 SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
00386 SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
00387 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
00388
00389 sound.load_bgm(bgm_file);
00390 sound.play_bgm();
00391 while( !done )
00392 {
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 SDL_PumpEvents();
00404 keys = SDL_GetKeyState(NULL);
00405 direction = -1;
00406 if((keys[SDLK_UP] == SDL_PRESSED) && (keys[SDLK_RIGHT] == SDL_PRESSED)){
00407 direction = 1;
00408 }else if((keys[SDLK_DOWN] == SDL_PRESSED) && (keys[SDLK_RIGHT] == SDL_PRESSED)){
00409 direction = 3;
00410 }else if((keys[SDLK_DOWN] == SDL_PRESSED) && (keys[SDLK_LEFT] == SDL_PRESSED)){
00411 direction = 5;
00412 }else if((keys[SDLK_UP] == SDL_PRESSED) && (keys[SDLK_LEFT] == SDL_PRESSED)){
00413 direction = 7;
00414 }else if(keys[SDLK_UP] == SDL_PRESSED){
00415 direction = 0;
00416 }else if(keys[SDLK_RIGHT] == SDL_PRESSED){
00417 direction = 2;
00418 }else if(keys[SDLK_DOWN] == SDL_PRESSED){
00419 direction = 4;
00420 }else if(keys[SDLK_LEFT] == SDL_PRESSED){
00421 direction = 6;
00422 }
00423 if(keys[SDLK_SPACE] == SDL_PRESSED){}
00424
00425 fge_list.test(direction);
00426 if(keys[SDLK_ESCAPE] == SDL_PRESSED)
00427 done = 1;
00428 if(!strcmp(SDL_GetKeyName(event.key.keysym.sym), "escape"))
00429 done = 1 ;
00430 stats.update();
00431 screen.update_screen();
00432 wait_frame();
00433 }
00434
00435
00436 printf("all done!\n");
00437 SDL_Quit();
00438 return ( 0 ) ;
00439 }
00440