X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fgameloop.cpp;h=ba8ec364a3b6ecb2c135b9bdba032f87825e2000;hb=2ff56876fda7b93e8baf779a1e785e9fc9386c9b;hp=13347ad459a2b314cea96ce3b1894e044707add5;hpb=c8ad8bb328dd90c0ab00e4c375b9a4b8f8df6e73;p=supertux.git diff --git a/src/gameloop.cpp b/src/gameloop.cpp index 13347ad45..ba8ec364a 100644 --- a/src/gameloop.cpp +++ b/src/gameloop.cpp @@ -100,26 +100,16 @@ void start_timers(void) void activate_bad_guys(void) { - int x,y; - - /* Activate bad guys: */ - - for (y = 0; y < 15; y++) + for (std::vector::iterator i = current_level.badguy_data.begin(); + i != current_level.badguy_data.end(); + ++i) { - for (x = 0; x < current_level.width; x++) - { - if (current_level.dn_tiles[y][x] >= '0' && current_level.dn_tiles[y][x] <= '9') - { - add_bad_guy(x * 32, y * 32, static_cast(current_level.dn_tiles[y][x] - '0')); - current_level.dn_tiles[y][x] = 0; - } - } + add_bad_guy(i->x, i->y, i->kind); } } void activate_particle_systems(void) { - printf("PSys: %s\n", current_level.particle_system.c_str()); if(current_level.particle_system == "clouds") { particle_systems.push_back(new CloudParticleSystem); @@ -140,6 +130,9 @@ void game_event(void) { while (SDL_PollEvent(&event)) { + /* Check for menu-events, if the menu is shown */ + if(show_menu) + menu_event(event); switch(event.type) { case SDL_QUIT: /* Quit event - quit: */ @@ -148,10 +141,6 @@ void game_event(void) case SDL_KEYDOWN: /* A keypress! */ key = event.key.keysym.sym; - /* Check for menu-events, if the menu is shown */ - if(show_menu) - menu_event(&event.key.keysym); - if(tux.key_event(key,DOWN)) break; @@ -276,16 +265,8 @@ void game_event(void) tux.input.down = UP; else tux.input.down = UP; - - /* Handle joystick for the menu */ - if(show_menu) - { - if(tux.input.down == DOWN) - menuaction = MENU_ACTION_DOWN; - else - menuaction = MENU_ACTION_UP; - } - break; + + break; default: break; } @@ -301,9 +282,7 @@ void game_event(void) tux.input.up = UP; else if (event.jbutton.button == JOY_B) tux.input.fire = UP; - - if(show_menu) - menuaction = MENU_ACTION_HIT; + break; default: @@ -487,7 +466,7 @@ int game_action(void) void game_draw(void) { -int y,x; + int y,x; /* Draw screen: */ if (tux.dying && (global_frame_counter % 4) == 0) @@ -528,7 +507,6 @@ int y,x; } /* Draw interactive tiles: */ - for (y = 0; y < 15; ++y) { for (x = 0; x < 21; ++x) @@ -539,7 +517,6 @@ int y,x; } /* (Bouncy bricks): */ - for (unsigned int i = 0; i < bouncy_bricks.size(); ++i) bouncy_brick_draw(&bouncy_bricks[i]); @@ -558,13 +535,12 @@ int y,x; upgrade_draw(&upgrades[i]); for (unsigned int i = 0; i < bouncy_distros.size(); ++i) - bouncy_distro_draw(&bouncy_distros[i]); + bouncy_distro_draw(&bouncy_distros[i]); for (unsigned int i = 0; i < broken_bricks.size(); ++i) broken_brick_draw(&broken_bricks[i]); /* Draw foreground: */ - for (y = 0; y < 15; ++y) { for (x = 0; x < 21; ++x) @@ -1154,7 +1130,21 @@ void loadshared(void) "/images/shared/bag-right-1.png", USE_ALPHA); + /* Mr. Bomb */ + for(int i=0; i<4; ++i) { + char num[4]; + snprintf(num, 4, "%d", i); + texture_load(&img_mrbomb_left[i], + datadir + "/images/shared/mrbomb-left-" + num + ".png", USE_ALPHA); + texture_load(&img_mrbomb_right[i], + datadir + "/images/shared/mrbomb-right-" + num + ".png", USE_ALPHA); + } + /* stalactite */ + texture_load(&img_stalactite, + datadir + "/images/shared/stalactite.png", USE_ALPHA); + texture_load(&img_stalactite_broken, + datadir + "/images/shared/stalactite-broken.png", USE_ALPHA); /* Upgrades: */ @@ -1281,6 +1271,14 @@ void unloadshared(void) texture_free(&img_money_right[i]); } + for(i = 0; i < 4; i++) { + texture_free(&img_mrbomb_left[i]); + texture_free(&img_mrbomb_right[i]); + } + + texture_free(&img_stalactite); + texture_free(&img_stalactite_broken); + texture_free(&img_box_full); texture_free(&img_box_empty); @@ -1318,19 +1316,23 @@ void unloadshared(void) void drawshape(float x, float y, unsigned int c) { - int z; - - Tile* ptile = TileManager::instance()->get - (c); - if(ptile) + if (c != 0) { - if(ptile->images.size() > 1) + Tile* ptile = TileManager::instance()->get(c); + if(ptile) { - texture_draw(&ptile->images[( ((global_frame_counter*25) / ptile->anim_speed) % (ptile->images.size()))],x,y); - } - else - { - texture_draw(&ptile->images[0],x,y); + if(ptile->images.size() > 1) + { + texture_draw(&ptile->images[( ((global_frame_counter*25) / ptile->anim_speed) % (ptile->images.size()))],x,y); + } + else if (ptile->images.size() == 1) + { + texture_draw(&ptile->images[0],x,y); + } + else + { + printf("Tile not dravable %u\n", c); + } } } @@ -1396,7 +1398,6 @@ void drawshape(float x, float y, unsigned int c) /* What shape is at some position? */ - unsigned int shape(float x, float y) { @@ -1411,13 +1412,15 @@ unsigned int shape(float x, float y) c = current_level.ia_tiles[yy][xx]; } else - c = '.'; + c = 0; return(c); } -/* Is is ground? */ - +Tile* gettile(float x, float y) +{ + return TileManager::instance()->get(shape(x, y)); +} bool issolid(float x, float y) { @@ -1494,16 +1497,22 @@ bool isfullbox(float x, float y) } } +bool isdistro(float x, float y) +{ + Tile* tile = TileManager::instance()->get(shape(x,y)); + return tile && tile->distro; +} + /* Break a brick: */ void trybreakbrick(float x, float y) { - if (isbrick(x, y)) + Tile* tile = gettile(x, y); + if (tile->brick) { - if (shape(x, y) == 'x' || shape(x, y) == 'y') + if (tile->data > 0) { /* Get a distro from it: */ - add_bouncy_distro(((int)(x + 1) / 32) * 32, (int)(y / 32) * 32); @@ -1514,7 +1523,7 @@ void trybreakbrick(float x, float y) } if (distro_counter <= 0) - level_change(¤t_level,x, y, TM_IA, 'a'); + level_change(¤t_level,x, y, TM_IA, tile->next_tile2); play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER); score = score + SCORE_DISTRO; @@ -1523,8 +1532,7 @@ void trybreakbrick(float x, float y) else { /* Get rid of it: */ - - level_change(¤t_level,x, y, TM_IA, '.'); + level_change(¤t_level,x, y, TM_IA, tile->next_tile); } @@ -1555,35 +1563,36 @@ void bumpbrick(float x, float y) /* Empty a box: */ - void tryemptybox(float x, float y, int col_side) { - if (!isfullbox(x, y)) + Tile* tile = gettile(x,y); + if (!tile->fullbox) return; // according to the collision side, set the upgrade direction - if(col_side == LEFT) col_side = RIGHT; else col_side = LEFT; - switch(shape(x,y)) + switch(tile->data) { - case 'A': /* Box with a distro! */ + case 1: //'A': /* Box with a distro! */ add_bouncy_distro(((int)(x + 1) / 32) * 32, (int)(y / 32) * 32 - 32); play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER); score = score + SCORE_DISTRO; distros++; break; - case 'B': /* Add an upgrade! */ + + case 2: // 'B': /* Add an upgrade! */ if (tux.size == SMALL) /* Tux is small, add mints! */ add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_MINTS); else /* Tux is big, add coffee: */ add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_COFFEE); play_sound(sounds[SND_UPGRADE], SOUND_CENTER_SPEAKER); break; - case '!': /* Add a golden herring */ + + case 3:// '!': /* Add a golden herring */ add_upgrade((int)((x + 1) / 32) * 32, (int)(y / 32) * 32 - 32, col_side, UPGRADE_HERRING); break; default: @@ -1591,17 +1600,16 @@ void tryemptybox(float x, float y, int col_side) } /* Empty the box: */ - level_change(¤t_level,x, y, TM_IA, 'a'); + level_change(¤t_level,x, y, TM_IA, tile->next_tile); } - /* Try to grab a distro: */ - void trygrabdistro(float x, float y, int bounciness) { - if (shape(x, y) == '$') + Tile* tile = gettile(x, y); + if (tile && tile->distro) { - level_change(¤t_level,x, y, TM_IA, '.'); + level_change(¤t_level,x, y, TM_IA, tile->next_tile); play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER); if (bounciness == BOUNCE) @@ -1616,30 +1624,21 @@ void trygrabdistro(float x, float y, int bounciness) } /* Try to bump a bad guy from below: */ - void trybumpbadguy(float x, float y) { - unsigned int i; - /* Bad guys: */ - for (i = 0; i < bad_guys.size(); i++) + for (unsigned int i = 0; i < bad_guys.size(); i++) { if (bad_guys[i].base.x >= x - 32 && bad_guys[i].base.x <= x + 32 && bad_guys[i].base.y >= y - 16 && bad_guys[i].base.y <= y + 16) { - if (bad_guys[i].kind == BAD_BSOD || - bad_guys[i].kind == BAD_LAPTOP) - { - bad_guys[i].dying = DYING_FALLING; - bad_guys[i].base.ym = -8; - play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER); - } + bad_guys[i].collision(&tux, CO_PLAYER, COLLISION_BUMP); } } /* Upgrades: */ - for (i = 0; i < upgrades.size(); i++) + for (unsigned int i = 0; i < upgrades.size(); i++) { if (upgrades[i].base.height == 32 && upgrades[i].base.x >= x - 32 && upgrades[i].base.x <= x + 32 && @@ -1748,7 +1747,6 @@ void savegame(int slot) if (fi == NULL) { fprintf(stderr, "Warning: I could not open the slot file "); - } else {