#include <fstream>
#include <stdexcept>
-#include "app/globals.h"
#include "sector.h"
#include "player_status.h"
#include "object/gameobjs.h"
#include "lisp/list_iterator.h"
#include "tile.h"
#include "audio/sound_manager.h"
-#include "gameloop.h"
+#include "game_session.h"
#include "resources.h"
#include "statistics.h"
#include "collision_grid.h"
#include "collision_grid_iterator.h"
#include "object_factory.h"
-#include "special/collision.h"
+#include "collision.h"
#include "math/rectangle.h"
#include "math/aatriangle.h"
#include "object/coin.h"
#include "badguy/jumpy.h"
#include "badguy/spike.h"
#include "trigger/sequence_trigger.h"
+#include "player_status.h"
//#define USE_GRID
currentmusic(LEVEL_MUSIC)
{
song_title = "Mortimers_chipdisko.mod";
- player = new Player();
+ player = new Player(&player_status);
add_object(player);
grid = new CollisionGrid(32000, 32000);
update_game_objects();
fix_old_tiles();
- update_game_objects();
if(!camera) {
std::cerr << "sector '" << name << "' does not contain a camera.\n";
- camera = new Camera(this);
- add_object(camera);
+ update_game_objects();
+ add_object(new Camera(this));
}
if(!solids)
throw std::runtime_error("sector does not contain a solid tile layer.");
+
+ update_game_objects();
}
void
void
Sector::activate(const std::string& spawnpoint)
{
- _current = this;
-
- // Apply bonuses from former levels
- switch (player_status.bonus)
- {
- case PlayerStatus::NO_BONUS:
- break;
-
- case PlayerStatus::FLOWER_BONUS:
- player->got_power = Player::FIRE_POWER; // FIXME: add ice power to here
- // fall through
-
- case PlayerStatus::GROWUP_BONUS:
- player->grow(false);
- break;
- }
-
SpawnPoint* sp = 0;
for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end();
++i) {
sp = *i;
break;
}
- }
+ }
if(!sp) {
std::cerr << "Spawnpoint '" << spawnpoint << "' not found.\n";
+ if(spawnpoint != "main") {
+ activate("main");
+ } else {
+ activate(Vector(0, 0));
+ }
} else {
- player->move(sp->pos);
+ activate(sp->pos);
}
-
- camera->reset(player->get_pos());
}
-Vector
-Sector::get_best_spawn_point(Vector pos)
+void
+Sector::activate(const Vector& player_pos)
{
- Vector best_reset_point = Vector(-1,-1);
-
- for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end();
- ++i) {
- if((*i)->name != "main")
- continue;
- if((*i)->pos.x > best_reset_point.x && (*i)->pos.x < pos.x)
- best_reset_point = (*i)->pos;
- }
+ _current = this;
- return best_reset_point;
+ player->move(player_pos);
+ camera->reset(player->get_pos());
}
Rectangle
// TODO remove this function and move these checks elsewhere...
static const size_t MAX_FIRE_BULLETS = 2;
static const size_t MAX_ICE_BULLETS = 1;
-
- if(player->got_power == Player::FIRE_POWER) {
+
+ Bullet* new_bullet = 0;
+ if(player_status.bonus == FIRE_BONUS) {
if(bullets.size() > MAX_FIRE_BULLETS-1)
return false;
- } else if(player->got_power == Player::ICE_POWER) {
+ new_bullet = new Bullet(pos, xm, dir, FIRE_BULLET);
+ } else if(player_status.bonus == ICE_BONUS) {
if(bullets.size() > MAX_ICE_BULLETS-1)
return false;
- }
-
- Bullet* new_bullet = 0;
- if(player->got_power == Player::FIRE_POWER)
- new_bullet = new Bullet(pos, xm, dir, FIRE_BULLET);
- else if(player->got_power == Player::ICE_POWER)
new_bullet = new Bullet(pos, xm, dir, ICE_BULLET);
- else
- throw std::runtime_error("wrong bullet type.");
+ } else {
+ return false;
+ }
add_object(new_bullet);
- SoundManager::get()->play_sound(IDToSound(SND_SHOOT));
+ sound_manager->play_sound("shoot");
return true;
}
void
Sector::load_music()
{
- char* song_path;
- char* song_subtitle;
-
- level_song = SoundManager::get()->load_music(datadir + "/music/" + song_title);
-
- song_path = (char *) malloc(sizeof(char) * datadir.length() +
- strlen(song_title.c_str()) + 8 + 5);
- song_subtitle = strdup(song_title.c_str());
- strcpy(strstr(song_subtitle, "."), "\0");
- sprintf(song_path, "%s/music/%s-fast%s", datadir.c_str(),
- song_subtitle, strstr(song_title.c_str(), "."));
- if(!SoundManager::get()->exists_music(song_path)) {
- level_song_fast = level_song;
- } else {
- level_song_fast = SoundManager::get()->load_music(song_path);
- }
- free(song_subtitle);
- free(song_path);
+ level_song = sound_manager->load_music(
+ get_resource_filename("/music/" + song_title));
}
void
-Sector::play_music(int type)
+Sector::play_music(MusicType type)
{
currentmusic = type;
switch(currentmusic) {
- case HURRYUP_MUSIC:
- SoundManager::get()->play_music(level_song_fast);
- break;
case LEVEL_MUSIC:
- SoundManager::get()->play_music(level_song);
+ sound_manager->play_music(level_song);
break;
case HERRING_MUSIC:
- SoundManager::get()->play_music(herring_song);
+ sound_manager->play_music(herring_song);
break;
default:
- SoundManager::get()->halt_music();
+ sound_manager->halt_music();
break;
}
}
-int
+MusicType
Sector::get_music_type()
{
return currentmusic;