]> git.localhorst.tv Git - l2e.git/blobdiff - src/main.cpp
moved key mapping to a seperate file
[l2e.git] / src / main.cpp
index bf57b848a280d12fbb94b8b0ed179e18e211e24b..e0b7a47a3d1779eb4d290216b54326a210d38e3b 100644 (file)
@@ -1,24 +1,26 @@
-/*
- * main.cpp
- *
- *  Created on: Aug 1, 2012
- *      Author: holy
- */
-
+#include "keys.h"
 #include "app/Application.h"
 #include "app/Arguments.h"
 #include "app/Input.h"
 #include "battle/BattleState.h"
+#include "battle/Capsule.h"
 #include "battle/Hero.h"
 #include "battle/Monster.h"
 #include "battle/PartyLayout.h"
 #include "battle/Resources.h"
-#include "battle/Stats.h"
+#include "common/Capsule.h"
+#include "common/GameConfig.h"
+#include "common/GameState.h"
+#include "common/Hero.h"
 #include "common/Ikari.h"
 #include "common/Inventory.h"
 #include "common/Item.h"
+#include "common/Script.h"
 #include "common/Spell.h"
-#include "geometry/Vector.h"
+#include "common/Stats.h"
+#include "math/Fixed.h"
+#include "math/Vector.h"
+#include "graphics/CharSelect.h"
 #include "graphics/ComplexAnimation.h"
 #include "graphics/Font.h"
 #include "graphics/Frame.h"
@@ -26,6 +28,7 @@
 #include "graphics/Menu.h"
 #include "graphics/SimpleAnimation.h"
 #include "graphics/Sprite.h"
+#include "graphics/Texture.h"
 #include "loader/Caster.h"
 #include "loader/Interpreter.h"
 #include "loader/ParsedSource.h"
@@ -37,6 +40,7 @@
 #include "map/MapState.h"
 #include "map/Tile.h"
 #include "map/Trigger.h"
+#include "menu/Resources.h"
 #include "sdl/InitImage.h"
 #include "sdl/InitScreen.h"
 #include "sdl/InitSDL.h"
@@ -54,33 +58,23 @@ using app::Application;
 using app::Arguments;
 using app::Input;
 using battle::BattleState;
-using battle::Hero;
 using battle::Monster;
 using battle::PartyLayout;
-using battle::Stats;
-using common::Ikari;
-using common::Inventory;
-using common::Item;
+using common::Capsule;
+using common::GameConfig;
+using common::GameState;
+using common::Hero;
 using common::Spell;
-using geometry::Vector;
-using graphics::ComplexAnimation;
-using graphics::Font;
-using graphics::Frame;
-using graphics::Gauge;
-using graphics::Menu;
-using graphics::SimpleAnimation;
-using graphics::Sprite;
+using math::Fixed;
+using math::Vector;
+using graphics::Texture;
 using loader::Caster;
 using loader::Interpreter;
 using loader::ParsedSource;
 using loader::Parser;
 using loader::TypeDescription;
-using map::Area;
 using map::Entity;
-using map::Map;
 using map::MapState;
-using map::Tile;
-using map::Trigger;
 using sdl::InitImage;
 using sdl::InitScreen;
 using sdl::InitSDL;
@@ -93,13 +87,12 @@ using std::string;
 using std::vector;
 
 int main(int argc, char **argv) {
-       const int width = 800;
-       const int height = 480;
+       const int width = 512;
+       const int height = 448;
 
-       const int tileSize = 32;
-       const float walkSpeed = 128.0f;
+       const Fixed<8> walkSpeed = Fixed<8>(1, 8);
 
-       const bool battle(false);
+       bool battle(false);
 
 //     std::srand(std::time(0));
 
@@ -107,24 +100,39 @@ int main(int argc, char **argv) {
                InitSDL sdl;
                InitImage image(IMG_INIT_PNG);
 
-               battle::Resources::CreateTypeDescription();
-               ComplexAnimation::CreateTypeDescription();
-               Font::CreateTypeDescription();
-               Frame::CreateTypeDescription();
-               Gauge::CreateTypeDescription();
-               Hero::CreateTypeDescription();
-               Ikari::CreateTypeDescription();
                Interpreter::CreateTypeDescriptions();
-               Item::CreateTypeDescription();
-               graphics::MenuProperties::CreateTypeDescription();
-               Monster::CreateTypeDescription();
-               PartyLayout::CreateTypeDescription();
-               SimpleAnimation::CreateTypeDescription();
-               Spell::CreateTypeDescription();
-               Sprite::CreateTypeDescription();
-               Stats::CreateTypeDescription();
+
+               battle::Resources::CreateTypeDescription();
+               battle::Monster::CreateTypeDescription();
+               battle::PartyLayout::CreateTypeDescription();
+
+               common::Capsule::CreateTypeDescription();
+               common::Hero::CreateTypeDescription();
+               common::Ikari::CreateTypeDescription();
+               common::Item::CreateTypeDescription();
+               common::Stats::CreateTypeDescription();
+               common::Spell::CreateTypeDescription();
                common::TargetingMode::CreateTypeDescription();
 
+               graphics::Animation::CreateTypeDescription();
+               graphics::CharSelect::CreateTypeDescription();
+               graphics::ComplexAnimation::CreateTypeDescription();
+               graphics::Font::CreateTypeDescription();
+               graphics::Frame::CreateTypeDescription();
+               graphics::Gauge::CreateTypeDescription();
+               graphics::MenuProperties::CreateTypeDescription();
+               graphics::SimpleAnimation::CreateTypeDescription();
+               graphics::Sprite::CreateTypeDescription();
+               graphics::Texture::CreateTypeDescription();
+
+               map::Area::CreateTypeDescription();
+               map::Entity::CreateTypeDescription();
+               map::Map::CreateTypeDescription();
+               map::Tile::CreateTypeDescription();
+               map::Trigger::CreateTypeDescription();
+
+               menu::Resources::CreateTypeDescription();
+
                Arguments args;
                args.Read(argc, argv);
 
@@ -134,7 +142,7 @@ int main(int argc, char **argv) {
                        Parser(*i, source).Parse();
                }
 
-               switch (args.DetectRunLevel()) {
+               switch (args.GetRunLevel()) {
                        case Arguments::WRITE:
                        {
                                int length(std::strlen(args.OutfilePath()));
@@ -154,7 +162,15 @@ int main(int argc, char **argv) {
                                std::cout << source << std::endl;
                                return 0;
                        }
+                       case Arguments::SOURCE_WIKI: {
+                               TypeDescription::WriteSourceWiki(std::cout);
+                               return 0;
+                       }
+                       case Arguments::BATTLE:
+                               battle = true;
+                               break;
                        case Arguments::PLAY:
+                       case Arguments::MAP:
                                break;
                }
 
@@ -170,256 +186,142 @@ int main(int argc, char **argv) {
 
                Caster caster(intp);
 
+               GameState gameState;
+
+               gameState.heroes[0] = *caster.GetHero("maxim");
+               gameState.heroes[1] = *caster.GetHero("selan");
+               gameState.heroes[2] = *caster.GetHero("guy");
+               gameState.heroes[3] = *caster.GetHero("dekar");
+
+               gameState.party[0] = &gameState.heroes[0];
+               gameState.party[1] = &gameState.heroes[1];
+               gameState.party[2] = &gameState.heroes[2];
+               gameState.party[3] = &gameState.heroes[3];
+               gameState.partySize = 4;
+
+               gameState.capsules[1] = *caster.GetCapsule("flash");
+               gameState.capsules[1].UpgradeClass();
+               gameState.capsules[1].UpgradeClass();
+               gameState.capsules[1].UpgradeClass();
+               gameState.capsules[1].UpgradeClass();
+               gameState.capsule = 1;
+
+               GameConfig gameConfig;
+               gameConfig.state = &gameState;
+               gameConfig.heroesLayout = caster.GetPartyLayout("heroesLayout");
+               gameConfig.battleResources = caster.GetBattleResources("battleResources");
+               gameConfig.menuResources = caster.GetMenuResources("menuResources");
+
                // temporary test data
                SDL_Surface *bg(IMG_Load("test-data/battle-bg.png"));
                PartyLayout monstersLayout(*caster.GetPartyLayout("monstersLayout"));
-               PartyLayout heroesLayout(*caster.GetPartyLayout("heroesLayout"));
 
                Monster monster(*caster.GetMonster("lizard"));
-               Hero maxim(*caster.GetHero("maxim"));
-               Hero selan(*caster.GetHero("selan"));
-               Hero guy(*caster.GetHero("guy"));
-               Hero dekar(*caster.GetHero("dekar"));
-
-               battle::Resources *battleRes(caster.GetBattleResources("battleResources"));
 
-               maxim.AddSpell(caster.GetSpell("resetSpell"));
+               gameState.heroes[0].AddSpell(caster.GetSpell("resetSpell"));
                Spell *strongSpell(caster.GetSpell("strongSpell"));
-               maxim.AddSpell(strongSpell);
-               selan.AddSpell(strongSpell);
+               gameState.heroes[0].AddSpell(strongSpell);
+               gameState.heroes[1].AddSpell(strongSpell);
                Spell *strongerSpell(caster.GetSpell("strongerSpell"));
-               maxim.AddSpell(strongerSpell);
-               selan.AddSpell(strongerSpell);
+               gameState.heroes[0].AddSpell(strongerSpell);
+               gameState.heroes[1].AddSpell(strongerSpell);
                Spell *championSpell(caster.GetSpell("championSpell"));
-               maxim.AddSpell(championSpell);
-               selan.AddSpell(championSpell);
+               gameState.heroes[0].AddSpell(championSpell);
+               gameState.heroes[1].AddSpell(championSpell);
                Spell *rallySpell(caster.GetSpell("rallySpell"));
-               maxim.AddSpell(rallySpell);
-               selan.AddSpell(rallySpell);
-               selan.AddSpell(caster.GetSpell("escapeSpell"));
+               gameState.heroes[0].AddSpell(rallySpell);
+               gameState.heroes[1].AddSpell(rallySpell);
+               gameState.heroes[1].AddSpell(caster.GetSpell("escapeSpell"));
                Spell *valorSpell(caster.GetSpell("valorSpell"));
-               maxim.AddSpell(valorSpell);
-               selan.AddSpell(valorSpell);
-
-               Inventory inventory;
-               inventory.Add(caster.GetItem("antidoteItem"), 9);
-               inventory.Add(caster.GetItem("magicJarItem"), 4);
-               inventory.Add(caster.GetItem("hiPotionItem"), 4);
-               inventory.Add(caster.GetItem("powerPotionItem"), 4);
-               inventory.Add(caster.GetItem("escapeItem"), 2);
-               inventory.Add(caster.GetItem("sleepBallItem"), 1);
-               battleRes->inventory = &inventory;
-
-               maxim.SetWeapon(caster.GetItem("zircoSwordItem"));
-               maxim.SetArmor(caster.GetItem("zirconArmorItem"));
-               maxim.SetShield(caster.GetItem("holyShieldItem"));
-               maxim.SetHelmet(caster.GetItem("legendHelmItem"));
-               maxim.SetRing(caster.GetItem("sProRingItem"));
-               maxim.SetJewel(caster.GetItem("evilJewelItem"));
-
-//             selan.SetWeapon(cst.GetItem("zircoWhipItem"));
-               selan.SetArmor(caster.GetItem("zirconPlateItem"));
-               selan.SetShield(caster.GetItem("zircoGlovesItem"));
-               selan.SetHelmet(caster.GetItem("holyCapItem"));
-               selan.SetRing(caster.GetItem("ghostRingItem"));
-               selan.SetJewel(caster.GetItem("eagleRockItem"));
-
-//             guy.SetWeapon(cst.GetItem("zircoAxItem"));
-               guy.SetArmor(caster.GetItem("zirconArmorItem"));
-               guy.SetShield(caster.GetItem("megaShieldItem"));
-               guy.SetHelmet(caster.GetItem("zircoHelmetItem"));
-               guy.SetRing(caster.GetItem("powerRingItem"));
-               guy.SetJewel(caster.GetItem("evilJewelItem"));
+               gameState.heroes[0].AddSpell(valorSpell);
+               gameState.heroes[1].AddSpell(valorSpell);
+
+               gameState.inventory.Add(caster.GetItem("zirconPlateItem"), 32);
+               gameState.inventory.Add(caster.GetItem("holyFruitItem"));
+               gameState.inventory.Add(caster.GetItem("darkFruitItem"));
+               gameState.inventory.Add(caster.GetItem("antidoteItem"), 9);
+               gameState.inventory.Add(caster.GetItem("powerRingItem"));
+               gameState.inventory.Add(caster.GetItem("magicJarItem"), 4);
+               gameState.inventory.Add(caster.GetItem("sProRingItem"));
+               gameState.inventory.Add(caster.GetItem("hiPotionItem"), 4);
+               gameState.inventory.Add(caster.GetItem("powerRingItem"));
+               gameState.inventory.Add(caster.GetItem("powerPotionItem"), 4);
+               gameState.inventory.Add(caster.GetItem("zircoSwordItem"));
+               gameState.inventory.Add(caster.GetItem("escapeItem"), 2);
+               gameState.inventory.Add(caster.GetItem("zircoHelmetItem"));
+               gameState.inventory.Add(caster.GetItem("sleepBallItem"), 1);
+               gameState.inventory.Add(caster.GetItem("zirconPlateItem"));
+
+               gameState.heroes[0].SetEquipment(Hero::EQUIP_WEAPON, caster.GetItem("zircoSwordItem"));
+               gameState.heroes[0].SetEquipment(Hero::EQUIP_ARMOR, caster.GetItem("zirconArmorItem"));
+               gameState.heroes[0].SetEquipment(Hero::EQUIP_SHIELD, caster.GetItem("holyShieldItem"));
+               gameState.heroes[0].SetEquipment(Hero::EQUIP_HELMET, caster.GetItem("legendHelmItem"));
+               gameState.heroes[0].SetEquipment(Hero::EQUIP_RING, caster.GetItem("sProRingItem"));
+               gameState.heroes[0].SetEquipment(Hero::EQUIP_JEWEL, caster.GetItem("evilJewelItem"));
+
+//             gameState.heroes[1].SetEquipment(Hero::EQUIP_WEAPON, caster.GetItem("zircoWhipItem"));
+               gameState.heroes[1].SetEquipment(Hero::EQUIP_ARMOR, caster.GetItem("zirconPlateItem"));
+               gameState.heroes[1].SetEquipment(Hero::EQUIP_SHIELD, caster.GetItem("zircoGlovesItem"));
+               gameState.heroes[1].SetEquipment(Hero::EQUIP_HELMET, caster.GetItem("holyCapItem"));
+               gameState.heroes[1].SetEquipment(Hero::EQUIP_RING, caster.GetItem("ghostRingItem"));
+               gameState.heroes[1].SetEquipment(Hero::EQUIP_JEWEL, caster.GetItem("eagleRockItem"));
+
+//             gameState.heroes[2].SetEquipment(Hero::EQUIP_WEAPON, caster.GetItem("zircoAxItem"));
+               gameState.heroes[2].SetEquipment(Hero::EQUIP_ARMOR, caster.GetItem("zirconArmorItem"));
+               gameState.heroes[2].SetEquipment(Hero::EQUIP_SHIELD, caster.GetItem("megaShieldItem"));
+               gameState.heroes[2].SetEquipment(Hero::EQUIP_HELMET, caster.GetItem("zircoHelmetItem"));
+               gameState.heroes[2].SetEquipment(Hero::EQUIP_RING, caster.GetItem("powerRingItem"));
+               gameState.heroes[2].SetEquipment(Hero::EQUIP_JEWEL, caster.GetItem("evilJewelItem"));
 
                // NOTE: this is actually Artea equipment
-//             dekar.SetWeapon(cst.GetItem("lizardBlowItem"));
-               dekar.SetArmor(caster.GetItem("holyRobeItem"));
-               dekar.SetShield(caster.GetItem("zircoGlovesItem"));
-               dekar.SetHelmet(caster.GetItem("holyCapItem"));
-               dekar.SetRing(caster.GetItem("rocketRingItem"));
-               dekar.SetJewel(caster.GetItem("krakenRockItem"));
-
-               Tile tiles[64];
-
-               tiles[ 0].SetOffset(Vector<int>(2, 1));
-               tiles[ 1].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_NORTH | Tile::BLOCK_WEST);
-               tiles[ 2].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_NORTH);
-               tiles[ 3].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_NORTH | Tile::BLOCK_EAST);
-               tiles[ 4].SetOffset(Vector<int>(0, 1));
-               tiles[ 5].SetOffset(Vector<int>(2, 0));
-               tiles[ 6].SetOffset(Vector<int>(2, 0));
-               tiles[ 7].SetOffset(Vector<int>(2, 0));
-
-               tiles[ 8].SetOffset(Vector<int>(2, 1));
-               tiles[ 9].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_WEST);
-               tiles[10].SetOffset(Vector<int>(3, 0));
-               tiles[11].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_EAST);
-               tiles[12].SetOffset(Vector<int>(0, 2));
-               tiles[13].SetOffset(Vector<int>(1, 2));
-               tiles[14].SetOffset(Vector<int>(1, 2));
-               tiles[15].SetOffset(Vector<int>(1, 2));
-
-               tiles[16].SetOffset(Vector<int>(2, 1));
-               tiles[17].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_WEST);
-               tiles[18].SetOffset(Vector<int>(3, 0));
-               tiles[19].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_EAST);
-               tiles[20].SetOffset(Vector<int>(0, 3));
-               tiles[21].SetOffset(Vector<int>(1, 3));
-               tiles[22].SetOffset(Vector<int>(1, 3));
-               tiles[23].SetOffset(Vector<int>(2, 3));
-
-               tiles[24].SetOffset(Vector<int>(2, 1));
-               tiles[25].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_WEST);
-               tiles[26].SetOffset(Vector<int>(3, 0));
-               tiles[27].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_EAST);
-               tiles[28].SetOffset(Vector<int>(0, 4));
-               tiles[29].SetOffset(Vector<int>(1, 4));
-               tiles[30].SetOffset(Vector<int>(1, 4));
-               tiles[31].SetOffset(Vector<int>(2, 4));
-
-               tiles[32].SetOffset(Vector<int>(2, 1));
-               tiles[33].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_WEST);
-               tiles[34].SetOffset(Vector<int>(3, 0));
-               tiles[35].SetOffset(Vector<int>(3, 0));
-               tiles[36].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_NORTH);
-               tiles[37].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_NORTH);
-               tiles[38].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_NORTH);
-               tiles[39].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_NORTH | Tile::BLOCK_EAST);
-
-               tiles[40].SetOffset(Vector<int>(2, 1));
-               tiles[41].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_WEST);
-               tiles[42].SetOffset(Vector<int>(3, 0));
-               tiles[43].SetOffset(Vector<int>(3, 0));
-               tiles[44].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_SOUTH);
-               tiles[45].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_SOUTH);
-               tiles[46].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_SOUTH);
-               tiles[47].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_SOUTH | Tile::BLOCK_EAST);
-
-               tiles[48].SetOffset(Vector<int>(2, 1));
-               tiles[49].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_WEST);
-               tiles[50].SetOffset(Vector<int>(3, 0));
-               tiles[51].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_EAST);
-               tiles[52].SetOffset(Vector<int>(0, 0));
-               tiles[53].SetOffset(Vector<int>(1, 0));
-               tiles[54].SetOffset(Vector<int>(1, 0));
-               tiles[55].SetOffset(Vector<int>(1, 0));
-
-               tiles[56].SetOffset(Vector<int>(2, 1));
-               tiles[57].SetOffset(Vector<int>(4, 0)).SetFlags(Tile::BLOCK_SOUTH | Tile::BLOCK_WEST);
-               tiles[58].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_SOUTH);
-               tiles[59].SetOffset(Vector<int>(3, 0)).SetFlags(Tile::BLOCK_SOUTH | Tile::BLOCK_EAST);
-               tiles[60].SetOffset(Vector<int>(0, 1));
-               tiles[61].SetOffset(Vector<int>(1, 1));
-               tiles[62].SetOffset(Vector<int>(1, 1));
-               tiles[63].SetOffset(Vector<int>(1, 1));
-
-               Area areas[1];
-               areas[0].SetTiles(tiles, 64);
-               areas[0].SetWidth(8);
-
-               Trigger triggers[1];
-               triggers[0].SetTilePosition(Vector<int>(2, 0));
-
-               SDL_Surface *tilesetImg(IMG_Load("test-data/tileset.png"));
-               Sprite tileset(tilesetImg, tileSize, tileSize);
-
-               Map map;
-               map.SetAreas(areas, 1);
-               map.SetTileset(&tileset);
-               map.SetTriggers(triggers, 1);
-               map.SetWidth(1);
-
-               SDL_Surface *mapMaximImg(IMG_Load("test-data/maxim-map.png"));
-               Sprite mapMaximSprite(mapMaximImg, 32, 64);
-               SimpleAnimation mapMaximAnimation(&mapMaximSprite, (tileSize/walkSpeed) / 2 * 1000, 2, 0, 0, true);
-               Entity mapMaxim;
-               mapMaxim.SetAnimation(&mapMaximAnimation);
-               mapMaxim.Position() = Vector<float>(64, 128);
-               mapMaxim.SpriteOffset() = Vector<float>(0, -32);
-
-               SDL_Surface *mapSelanImg(IMG_Load("test-data/selan-map.png"));
-               Sprite mapSelanSprite(mapSelanImg, 32, 64);
-               SimpleAnimation mapSelanAnimation(&mapSelanSprite, (tileSize/walkSpeed) / 2 * 1000, 2, 0, 0, true);
-               Entity mapSelan;
-               mapSelan.SetAnimation(&mapSelanAnimation);
-               mapSelan.Position() = Vector<float>(64, 128);
-               mapSelan.SpriteOffset() = Vector<float>(0, -32);
-               mapSelan.SetFlags(Entity::FLAG_NONBLOCKING);
-               mapMaxim.AddFollower(&mapSelan);
-
-               SDL_Surface *mapGuyImg(IMG_Load("test-data/guy-map.png"));
-               Sprite mapGuySprite(mapGuyImg, 32, 64);
-               SimpleAnimation mapGuyAnimation(&mapGuySprite, (tileSize/walkSpeed) / 2 * 1000, 2, 0, 0, true);
-               Entity mapGuy;
-               mapGuy.SetAnimation(&mapGuyAnimation);
-               mapGuy.Position() = Vector<float>(64, 128);
-               mapGuy.SpriteOffset() = Vector<float>(0, -32);
-               mapGuy.SetFlags(Entity::FLAG_NONBLOCKING);
-               mapSelan.AddFollower(&mapGuy);
-
-               SDL_Surface *mapDekarImg(IMG_Load("test-data/dekar-map.png"));
-               Sprite mapDekarSprite(mapDekarImg, 32, 64);
-               SimpleAnimation mapDekarAnimation(&mapDekarSprite, (tileSize/walkSpeed) / 2 * 1000, 2, 0, 0, true);
-               Entity mapDekar;
-               mapDekar.SetAnimation(&mapDekarAnimation);
-               mapDekar.Position() = Vector<float>(64, 128);
-               mapDekar.SpriteOffset() = Vector<float>(0, -32);
-               mapDekar.SetFlags(Entity::FLAG_NONBLOCKING);
-               mapGuy.AddFollower(&mapDekar);
-
-               SDL_Surface *mapMonsterImg(IMG_Load("test-data/monster-map.png"));
-               Sprite mapMonsterSprite(mapMonsterImg, 32, 32);
-               SimpleAnimation mapMonsterAnimation(&mapMonsterSprite, 500, 2, 0, 0, true);
-               Entity mapMonster;
-               mapMonster.SetAnimation(&mapMonsterAnimation);
-               mapMonster.Position() = Vector<float>(64, 32);
-               mapMonster.SetOrientation(Entity::ORIENTATION_SOUTH);
+//             gameState.heroes[3].SetEquipment(Hero::EQUIP_WEAPON, caster.GetItem("lizardBlowItem"));
+               gameState.heroes[3].SetEquipment(Hero::EQUIP_ARMOR, caster.GetItem("holyRobeItem"));
+               gameState.heroes[3].SetEquipment(Hero::EQUIP_SHIELD, caster.GetItem("zircoGlovesItem"));
+               gameState.heroes[3].SetEquipment(Hero::EQUIP_HELMET, caster.GetItem("holyCapItem"));
+               gameState.heroes[3].SetEquipment(Hero::EQUIP_RING, caster.GetItem("rocketRingItem"));
+               gameState.heroes[3].SetEquipment(Hero::EQUIP_JEWEL, caster.GetItem("krakenRockItem"));
+
+               gameState.heroes[0].MapEntity().Position() = Vector<Fixed<8> >(64, 128);
+
+               gameState.heroes[1].MapEntity().Position() = Vector<Fixed<8> >(64, 128);
+               gameState.heroes[1].MapEntity().SetFlags(Entity::FLAG_NONBLOCKING);
+               gameState.heroes[0].MapEntity().AddFollower(&gameState.heroes[1].MapEntity());
+
+               gameState.heroes[2].MapEntity().Position() = Vector<Fixed<8> >(64, 128);
+               gameState.heroes[2].MapEntity().SetFlags(Entity::FLAG_NONBLOCKING);
+               gameState.heroes[1].MapEntity().AddFollower(&gameState.heroes[2].MapEntity());
+
+               gameState.heroes[3].MapEntity().Position() = Vector<Fixed<8> >(64, 128);
+               gameState.heroes[3].MapEntity().SetFlags(Entity::FLAG_NONBLOCKING);
+               gameState.heroes[2].MapEntity().AddFollower(&gameState.heroes[3].MapEntity());
 
                InitScreen screen(width, height);
 
                app::State *state(0);
 
                if (battle) {
-                       BattleState *battleState(new BattleState(bg, monstersLayout, heroesLayout, battleRes));
+                       BattleState *battleState(new BattleState(&gameConfig, bg, &monstersLayout));
                        battleState->AddMonster(monster);
                        battleState->AddMonster(monster);
                        battleState->AddMonster(monster);
                        battleState->AddMonster(monster);
-                       battleState->AddHero(maxim);
-                       battleState->AddHero(selan);
-                       battleState->AddHero(guy);
-                       battleState->AddHero(dekar);
+                       battleState->SetCapsule(caster.GetCapsule("flash"));
+                       battleState->AddHero(gameState.heroes[0]);
+                       battleState->AddHero(gameState.heroes[1]);
+                       battleState->AddHero(gameState.heroes[2]);
+                       battleState->AddHero(gameState.heroes[3]);
                        state = battleState;
                } else {
-                       MapState *mapState(new MapState(&map));
-
-                       mapState->AddEntity(&mapMaxim);
-                       mapState->AddEntity(&mapSelan);
-                       mapState->AddEntity(&mapGuy);
-                       mapState->AddEntity(&mapDekar);
+                       MapState *mapState(new MapState(&gameConfig, caster.GetMap("map1")));
 
-                       mapState->ControlEntity(&mapMaxim);
+                       mapState->ControlEntity(&gameState.heroes[0].MapEntity());
                        mapState->SetWalkingSpeed(walkSpeed);
 
-                       mapState->AddEntity(&mapMonster);
-                       mapMonster.StartAnimation(*mapState);
-
                        state = mapState;
                }
 
-               Application app(&screen, state);
-               app.Buttons().MapKey(SDLK_w, Input::PAD_UP);
-               app.Buttons().MapKey(SDLK_d, Input::PAD_RIGHT);
-               app.Buttons().MapKey(SDLK_s, Input::PAD_DOWN);
-               app.Buttons().MapKey(SDLK_a, Input::PAD_LEFT);
-               app.Buttons().MapKey(SDLK_RIGHT, Input::ACTION_A);
-               app.Buttons().MapKey(SDLK_DOWN, Input::ACTION_B);
-               app.Buttons().MapKey(SDLK_UP, Input::ACTION_X);
-               app.Buttons().MapKey(SDLK_LEFT, Input::ACTION_Y);
-               app.Buttons().MapKey(SDLK_RETURN, Input::START);
-               app.Buttons().MapKey(SDLK_SPACE, Input::SELECT);
-               app.Buttons().MapKey(SDLK_RSHIFT, Input::SHOULDER_RIGHT);
-               app.Buttons().MapKey(SDLK_LSHIFT, Input::SHOULDER_LEFT);
+               Application app(screen, state);
+               MapKeys(app.Buttons());
                app.Run();
 
                return 0;