#include "app/globals.h"
#include "sector.h"
+#include "player_status.h"
#include "object/gameobjs.h"
#include "object/camera.h"
#include "object/background.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 "special/collision.h"
+#include "object_factory.h"
+#include "collision.h"
#include "math/rectangle.h"
#include "math/aatriangle.h"
#include "object/coin.h"
#include "object/block.h"
#include "object/invisible_block.h"
-#include "object/platform.h"
#include "object/bullet.h"
#include "badguy/jumpy.h"
-#include "badguy/snowball.h"
-#include "badguy/bouncing_snowball.h"
-#include "badguy/flame.h"
-#include "badguy/flyingsnowball.h"
-#include "badguy/mriceblock.h"
-#include "badguy/mrbomb.h"
-#include "badguy/dispenser.h"
#include "badguy/spike.h"
-#include "badguy/spiky.h"
-#include "badguy/nolok_01.h"
-#include "trigger/door.h"
#include "trigger/sequence_trigger.h"
-#include "trigger/secretarea_trigger.h"
+#include "player_status.h"
+
+//#define USE_GRID
Sector* Sector::_current = 0;
currentmusic(LEVEL_MUSIC)
{
song_title = "Mortimers_chipdisko.mod";
- player = new Player();
+ player = new Player(&player_status);
add_object(player);
grid = new CollisionGrid(32000, 32000);
GameObject*
Sector::parse_object(const std::string& name, const lisp::Lisp& reader)
{
- if(name == "background") {
- return new Background(reader);
- } else if(name == "camera") {
+ if(name == "camera") {
Camera* camera = new Camera(this);
camera->parse(reader);
return camera;
- } else if(name == "tilemap") {
- return new TileMap(reader);
} else if(name == "particles-snow") {
SnowParticleSystem* partsys = new SnowParticleSystem();
partsys->parse(reader);
return partsys;
+ } else if(name == "particles-rain") {
+ RainParticleSystem* partsys = new RainParticleSystem();
+ partsys->parse(reader);
+ return partsys;
} else if(name == "particles-clouds") {
CloudParticleSystem* partsys = new CloudParticleSystem();
partsys->parse(reader);
return partsys;
- } else if(name == "door") {
- return new Door(reader);
- } else if(name == "secretarea") {
- return new SecretAreaTrigger(reader);
- } else if(name == "sequencetrigger") {
- return new SequenceTrigger(reader);
- } else if(name == "platform") {
- return new Platform(reader);
- } else if(name == "jumpy" || name == "money") {
+ } else if(name == "money") { // for compatibility with old maps
return new Jumpy(reader);
- } else if(name == "snowball") {
- return new SnowBall(reader);
- } else if(name == "bouncingsnowball") {
- return new BouncingSnowball(reader);
- } else if(name == "flame") {
- return new Flame(reader);
- } else if(name == "flyingsnowball") {
- return new FlyingSnowBall(reader);
- } else if(name == "mriceblock") {
- return new MrIceBlock(reader);
- } else if(name == "mrbomb") {
- return new MrBomb(reader);
- } else if(name == "dispenser") {
- return new Dispenser(reader);
- } else if(name == "spike") {
- return new Spike(reader);
- } else if(name == "spiky") {
- return new Spiky(reader);
- } else if(name == "nolok_01") {
- return new Nolok_01(reader);
- }
-
- std::cerr << "Unknown object type '" << name << "'.\n";
+ }
+
+ try {
+ return create_object(name, reader);
+ } catch(std::exception& e) {
+ std::cerr << e.what() << "\n";
+ }
+
return 0;
}
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
add_object(new CloudParticleSystem());
else if(particlesystem == "snow")
add_object(new SnowParticleSystem());
+ else if(particlesystem == "rain")
+ add_object(new RainParticleSystem());
Vector startpos(100, 170);
reader.get("start_pos_x", startpos.x);
add_object(new Brick(pos, tile->getData()));
solids->change(x, y, 0);
} else if(tile->getAttributes() & Tile::GOAL) {
- add_object(new SequenceTrigger(pos, "endsequence"));
+ std::string sequence = tile->getData() == 0 ? "endsequence" : "stoptux";
+ add_object(new SequenceTrigger(pos, sequence));
solids->change(x, y, 0);
}
}
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
void
Sector::collision_handler()
{
-#if 0
+#ifdef USE_GRID
grid->check_collisions();
#else
for(std::vector<GameObject*>::iterator i = gameobjects.begin();
bool
Sector::add_bullet(const Vector& pos, float xm, Direction dir)
{
- if(player->got_power == Player::FIRE_POWER) {
+ // 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;
+
+ 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;
Sector::get_total_badguys()
{
int total_badguys = 0;
-#if 0
- for(GameObjects::iterator i = gameobjects_new.begin(); i != gameobjects_new.end(); ++i)
- {
+ for(GameObjects::iterator i = gameobjects.begin();
+ i != gameobjects.end(); ++i) {
BadGuy* badguy = dynamic_cast<BadGuy*> (*i);
if(badguy)
total_badguys++;
- }
-#endif
+ }
+
return total_badguys;
}