X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmain.cpp;h=ff49b66bb578b11a9536fb476abcb7b868d6b75d;hb=9f352d64f920f46a2d5b4fe67408154629933293;hp=2117a02efbe471437a050869d2c80f3200876546;hpb=ac3755adc509404528ef7de58695bf8e3bfb7dcd;p=l2e.git diff --git a/src/main.cpp b/src/main.cpp index 2117a02..ff49b66 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,17 +6,20 @@ */ #include "app/Application.h" +#include "app/Arguments.h" #include "app/Input.h" #include "battle/BattleState.h" #include "battle/Hero.h" #include "battle/Monster.h" #include "battle/PartyLayout.h" #include "battle/Resources.h" -#include "battle/Stats.h" +#include "common/GameState.h" +#include "common/Hero.h" #include "common/Ikari.h" #include "common/Inventory.h" #include "common/Item.h" #include "common/Spell.h" +#include "common/Stats.h" #include "geometry/Vector.h" #include "graphics/ComplexAnimation.h" #include "graphics/Font.h" @@ -25,32 +28,43 @@ #include "graphics/Menu.h" #include "graphics/SimpleAnimation.h" #include "graphics/Sprite.h" +#include "loader/Caster.h" #include "loader/Interpreter.h" #include "loader/ParsedSource.h" #include "loader/Parser.h" #include "loader/TypeDescription.h" +#include "map/Area.h" +#include "map/Entity.h" +#include "map/Map.h" +#include "map/MapState.h" +#include "map/Tile.h" +#include "map/Trigger.h" #include "sdl/InitImage.h" #include "sdl/InitScreen.h" #include "sdl/InitSDL.h" #include +#include #include #include #include +#include #include #include 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::GameState; +using common::Hero; using common::Ikari; using common::Inventory; using common::Item; using common::Spell; +using common::Stats; using geometry::Vector; using graphics::ComplexAnimation; using graphics::Font; @@ -59,10 +73,17 @@ using graphics::Gauge; using graphics::Menu; using graphics::SimpleAnimation; using graphics::Sprite; +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; @@ -71,11 +92,18 @@ using std::cerr; using std::cout; using std::endl; using std::exception; +using std::string; +using std::vector; int main(int argc, char **argv) { const int width = 800; const int height = 480; + const int tileSize = 32; + const float walkSpeed = 128.0f; + + const bool battle(false); + // std::srand(std::time(0)); try { @@ -89,8 +117,10 @@ int main(int argc, char **argv) { Gauge::CreateTypeDescription(); Hero::CreateTypeDescription(); Ikari::CreateTypeDescription(); + Interpreter::CreateTypeDescriptions(); Item::CreateTypeDescription(); graphics::MenuProperties::CreateTypeDescription(); + Monster::CreateTypeDescription(); PartyLayout::CreateTypeDescription(); SimpleAnimation::CreateTypeDescription(); Spell::CreateTypeDescription(); @@ -98,102 +128,452 @@ int main(int argc, char **argv) { Stats::CreateTypeDescription(); common::TargetingMode::CreateTypeDescription(); + Arguments args; + args.Read(argc, argv); + ParsedSource source; - Parser("test-data/test.l2s", source).Parse(); - Parser("test-data/ikaris.l2s", source).Parse(); - Parser("test-data/items.l2s", source).Parse(); - Parser("test-data/spells.l2s", source).Parse(); + + for (vector::const_iterator i(args.Infiles().begin()), end(args.Infiles().end()); i != end; ++i) { + Parser(*i, source).Parse(); + } + + switch (args.DetectRunLevel()) { + case Arguments::WRITE: + { + int length(std::strlen(args.OutfilePath())); + switch (args.OutfilePath()[length - 1]) { + case 'h': { + std::ofstream outstream(args.OutfilePath()); + source.WriteHeader(outstream); + break; + } + default: { + throw std::runtime_error(string("don't know how to write file ") + args.OutfilePath()); + } + } + return 0; + } + case Arguments::DUMP: { + std::cout << source << std::endl; + return 0; + } + case Arguments::PLAY: + break; + } + Interpreter intp(source); intp.ReadSource(); - int battleResId(TypeDescription::GetTypeId("BattleResources")); - int heroId(TypeDescription::GetTypeId("Hero")); - int itemId(TypeDescription::GetTypeId("Item")); - int monsterId(TypeDescription::GetTypeId("Monster")); - int partyLayoutId(TypeDescription::GetTypeId("PartyLayout")); - int spellId(TypeDescription::GetTypeId("Spell")); + if (intp.PostponedDefinitions().size() > 0) { + for (vector::const_iterator i(intp.PostponedDefinitions().begin()), end(intp.PostponedDefinitions().end()); i != end; ++i) { + std::cerr << "missing definition of " << TypeDescription::Get(i->linkedType).TypeName() << " " << i->identifier << std::endl; + } + return 3; + } + + 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]; // temporary test data SDL_Surface *bg(IMG_Load("test-data/battle-bg.png")); - PartyLayout monstersLayout(*reinterpret_cast(intp.GetObject(partyLayoutId, "monstersLayout"))); - PartyLayout heroesLayout(*reinterpret_cast(intp.GetObject(partyLayoutId, "heroesLayout"))); - - Monster monster(*reinterpret_cast(intp.GetObject(monsterId, "lizard"))); - Hero maxim(*reinterpret_cast(intp.GetObject(heroId, "maxim"))); - Hero selan(*reinterpret_cast(intp.GetObject(heroId, "selan"))); - Hero guy(*reinterpret_cast(intp.GetObject(heroId, "guy"))); - Hero dekar(*reinterpret_cast(intp.GetObject(heroId, "dekar"))); - - battle::Resources *battleRes(reinterpret_cast(intp.GetObject(battleResId, "battleResources"))); - - maxim.AddSpell(reinterpret_cast(intp.GetObject(spellId, "resetSpell"))); - Spell *strongSpell(reinterpret_cast(intp.GetObject(spellId, "strongSpell"))); - maxim.AddSpell(strongSpell); - selan.AddSpell(strongSpell); - Spell *strongerSpell(reinterpret_cast(intp.GetObject(spellId, "strongerSpell"))); - maxim.AddSpell(strongerSpell); - selan.AddSpell(strongerSpell); - Spell *championSpell(reinterpret_cast(intp.GetObject(spellId, "championSpell"))); - maxim.AddSpell(championSpell); - selan.AddSpell(championSpell); - Spell *rallySpell(reinterpret_cast(intp.GetObject(spellId, "rallySpell"))); - maxim.AddSpell(rallySpell); - selan.AddSpell(rallySpell); - selan.AddSpell(reinterpret_cast(intp.GetObject(spellId, "escapeSpell"))); - Spell *valorSpell(reinterpret_cast(intp.GetObject(spellId, "valorSpell"))); - maxim.AddSpell(valorSpell); - selan.AddSpell(valorSpell); + PartyLayout monstersLayout(*caster.GetPartyLayout("monstersLayout")); + PartyLayout heroesLayout(*caster.GetPartyLayout("heroesLayout")); + + Monster monster(*caster.GetMonster("lizard")); + + battle::Resources *battleRes(caster.GetBattleResources("battleResources")); + + gameState.heroes[0].AddSpell(caster.GetSpell("resetSpell")); + Spell *strongSpell(caster.GetSpell("strongSpell")); + gameState.heroes[0].AddSpell(strongSpell); + gameState.heroes[1].AddSpell(strongSpell); + Spell *strongerSpell(caster.GetSpell("strongerSpell")); + gameState.heroes[0].AddSpell(strongerSpell); + gameState.heroes[1].AddSpell(strongerSpell); + Spell *championSpell(caster.GetSpell("championSpell")); + gameState.heroes[0].AddSpell(championSpell); + gameState.heroes[1].AddSpell(championSpell); + Spell *rallySpell(caster.GetSpell("rallySpell")); + gameState.heroes[0].AddSpell(rallySpell); + gameState.heroes[1].AddSpell(rallySpell); + gameState.heroes[1].AddSpell(caster.GetSpell("escapeSpell")); + Spell *valorSpell(caster.GetSpell("valorSpell")); + gameState.heroes[0].AddSpell(valorSpell); + gameState.heroes[1].AddSpell(valorSpell); Inventory inventory; - inventory.Add(reinterpret_cast(intp.GetObject(itemId, "antidoteItem")), 9); - inventory.Add(reinterpret_cast(intp.GetObject(itemId, "magicJarItem")), 4); - inventory.Add(reinterpret_cast(intp.GetObject(itemId, "hiPotionItem")), 4); - inventory.Add(reinterpret_cast(intp.GetObject(itemId, "powerPotionItem")), 4); - inventory.Add(reinterpret_cast(intp.GetObject(itemId, "escapeItem")), 2); - inventory.Add(reinterpret_cast(intp.GetObject(itemId, "sleepBallItem")), 1); + 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(reinterpret_cast(intp.GetObject(itemId, "zircoSwordItem"))); - maxim.SetArmor(reinterpret_cast(intp.GetObject(itemId, "zirconArmorItem"))); - maxim.SetShield(reinterpret_cast(intp.GetObject(itemId, "holyShieldItem"))); - maxim.SetHelmet(reinterpret_cast(intp.GetObject(itemId, "legendHelmItem"))); - maxim.SetRing(reinterpret_cast(intp.GetObject(itemId, "sProRingItem"))); - maxim.SetJewel(reinterpret_cast(intp.GetObject(itemId, "evilJewelItem"))); - -// selan.SetWeapon(reinterpret_cast(intp.GetObject(itemId, "zircoWhipItem"))); - selan.SetArmor(reinterpret_cast(intp.GetObject(itemId, "zirconPlateItem"))); - selan.SetShield(reinterpret_cast(intp.GetObject(itemId, "zircoGlovesItem"))); - selan.SetHelmet(reinterpret_cast(intp.GetObject(itemId, "holyCapItem"))); - selan.SetRing(reinterpret_cast(intp.GetObject(itemId, "ghostRingItem"))); - selan.SetJewel(reinterpret_cast(intp.GetObject(itemId, "eagleRockItem"))); - -// guy.SetWeapon(reinterpret_cast(intp.GetObject(itemId, "zircoAxItem"))); - guy.SetArmor(reinterpret_cast(intp.GetObject(itemId, "zirconArmorItem"))); - guy.SetShield(reinterpret_cast(intp.GetObject(itemId, "megaShieldItem"))); - guy.SetHelmet(reinterpret_cast(intp.GetObject(itemId, "zircoHelmetItem"))); - guy.SetRing(reinterpret_cast(intp.GetObject(itemId, "powerRingItem"))); - guy.SetJewel(reinterpret_cast(intp.GetObject(itemId, "evilJewelItem"))); + gameState.heroes[0].SetWeapon(caster.GetItem("zircoSwordItem")); + gameState.heroes[0].SetArmor(caster.GetItem("zirconArmorItem")); + gameState.heroes[0].SetShield(caster.GetItem("holyShieldItem")); + gameState.heroes[0].SetHelmet(caster.GetItem("legendHelmItem")); + gameState.heroes[0].SetRing(caster.GetItem("sProRingItem")); + gameState.heroes[0].SetJewel(caster.GetItem("evilJewelItem")); + +// gameState.heroes[1].SetWeapon(cst.GetItem("zircoWhipItem")); + gameState.heroes[1].SetArmor(caster.GetItem("zirconPlateItem")); + gameState.heroes[1].SetShield(caster.GetItem("zircoGlovesItem")); + gameState.heroes[1].SetHelmet(caster.GetItem("holyCapItem")); + gameState.heroes[1].SetRing(caster.GetItem("ghostRingItem")); + gameState.heroes[1].SetJewel(caster.GetItem("eagleRockItem")); + +// gameState.heroes[2].SetWeapon(cst.GetItem("zircoAxItem")); + gameState.heroes[2].SetArmor(caster.GetItem("zirconArmorItem")); + gameState.heroes[2].SetShield(caster.GetItem("megaShieldItem")); + gameState.heroes[2].SetHelmet(caster.GetItem("zircoHelmetItem")); + gameState.heroes[2].SetRing(caster.GetItem("powerRingItem")); + gameState.heroes[2].SetJewel(caster.GetItem("evilJewelItem")); // NOTE: this is actually Artea equipment -// dekar.SetWeapon(reinterpret_cast(intp.GetObject(itemId, "lizardBlowItem"))); - dekar.SetArmor(reinterpret_cast(intp.GetObject(itemId, "holyRobeItem"))); - dekar.SetShield(reinterpret_cast(intp.GetObject(itemId, "zircoGlovesItem"))); - dekar.SetHelmet(reinterpret_cast(intp.GetObject(itemId, "holyCapItem"))); - dekar.SetRing(reinterpret_cast(intp.GetObject(itemId, "rocketRingItem"))); - dekar.SetJewel(reinterpret_cast(intp.GetObject(itemId, "krakenRockItem"))); +// gameState.heroes[3].SetWeapon(cst.GetItem("lizardBlowItem")); + gameState.heroes[3].SetArmor(caster.GetItem("holyRobeItem")); + gameState.heroes[3].SetShield(caster.GetItem("zircoGlovesItem")); + gameState.heroes[3].SetHelmet(caster.GetItem("holyCapItem")); + gameState.heroes[3].SetRing(caster.GetItem("rocketRingItem")); + gameState.heroes[3].SetJewel(caster.GetItem("krakenRockItem")); + + Tile tiles1[64]; + + tiles1[ 0].SetOffset(Vector(2, 1)); + tiles1[ 1].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_NORTH | Tile::BLOCK_WEST); + tiles1[ 2].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles1[ 3].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH | Tile::BLOCK_EAST); + tiles1[ 4].SetOffset(Vector(0, 1)); + tiles1[ 5].SetOffset(Vector(2, 0)); + tiles1[ 6].SetOffset(Vector(2, 0)); + tiles1[ 7].SetOffset(Vector(2, 0)); + + tiles1[ 8].SetOffset(Vector(2, 1)); + tiles1[ 9].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_WEST); + tiles1[10].SetOffset(Vector(3, 0)); + tiles1[11].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST); + tiles1[12].SetOffset(Vector(0, 2)); + tiles1[13].SetOffset(Vector(1, 2)); + tiles1[14].SetOffset(Vector(1, 2)); + tiles1[15].SetOffset(Vector(1, 2)); + + tiles1[16].SetOffset(Vector(2, 1)); + tiles1[17].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_WEST); + tiles1[18].SetOffset(Vector(3, 0)); + tiles1[19].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST); + tiles1[20].SetOffset(Vector(0, 3)); + tiles1[21].SetOffset(Vector(1, 3)); + tiles1[22].SetOffset(Vector(1, 3)); + tiles1[23].SetOffset(Vector(2, 3)); + + tiles1[24].SetOffset(Vector(2, 1)); + tiles1[25].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_WEST); + tiles1[26].SetOffset(Vector(3, 0)); + tiles1[27].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST); + tiles1[28].SetOffset(Vector(0, 4)); + tiles1[29].SetOffset(Vector(1, 4)); + tiles1[30].SetOffset(Vector(1, 4)); + tiles1[31].SetOffset(Vector(2, 4)); + + tiles1[32].SetOffset(Vector(2, 1)); + tiles1[33].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_WEST); + tiles1[34].SetOffset(Vector(3, 0)); + tiles1[35].SetOffset(Vector(3, 0)); + tiles1[36].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles1[37].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles1[38].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles1[39].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + + tiles1[40].SetOffset(Vector(2, 1)); + tiles1[41].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_WEST); + tiles1[42].SetOffset(Vector(3, 0)); + tiles1[43].SetOffset(Vector(3, 0)); + tiles1[44].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_SOUTH); + tiles1[45].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_SOUTH); + tiles1[46].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_SOUTH); + tiles1[47].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_SOUTH); + + tiles1[48].SetOffset(Vector(2, 1)); + tiles1[49].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_WEST); + tiles1[50].SetOffset(Vector(3, 0)); + tiles1[51].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST); + tiles1[52].SetOffset(Vector(0, 0)); + tiles1[53].SetOffset(Vector(1, 0)); + tiles1[54].SetOffset(Vector(1, 0)); + tiles1[55].SetOffset(Vector(1, 0)); + + tiles1[56].SetOffset(Vector(2, 1)); + tiles1[57].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_SOUTH | Tile::BLOCK_WEST); + tiles1[58].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_SOUTH); + tiles1[59].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_SOUTH | Tile::BLOCK_EAST); + tiles1[60].SetOffset(Vector(0, 1)); + tiles1[61].SetOffset(Vector(1, 1)); + tiles1[62].SetOffset(Vector(1, 1)); + tiles1[63].SetOffset(Vector(1, 1)); + + Tile tiles2[64]; + + tiles2[ 0].SetOffset(Vector(2, 0)); + tiles2[ 1].SetOffset(Vector(2, 0)); + tiles2[ 2].SetOffset(Vector(2, 0)); + tiles2[ 3].SetOffset(Vector(2, 0)); + tiles2[ 4].SetOffset(Vector(2, 0)); + tiles2[ 5].SetOffset(Vector(2, 0)); + tiles2[ 6].SetOffset(Vector(2, 0)); + tiles2[ 7].SetOffset(Vector(2, 0)); + + tiles2[ 8].SetOffset(Vector(1, 2)); + tiles2[ 9].SetOffset(Vector(1, 2)); + tiles2[10].SetOffset(Vector(5, 3)); + tiles2[11].SetOffset(Vector(2, 0)); + tiles2[12].SetOffset(Vector(2, 0)); + tiles2[13].SetOffset(Vector(2, 0)); + tiles2[14].SetOffset(Vector(2, 0)); + tiles2[15].SetOffset(Vector(2, 0)); + + tiles2[16].SetOffset(Vector(3, 3)); + tiles2[17].SetOffset(Vector(0, 3)); + tiles2[18].SetOffset(Vector(0, 1)); + tiles2[19].SetOffset(Vector(2, 0)); + tiles2[20].SetOffset(Vector(2, 0)); + tiles2[21].SetOffset(Vector(2, 0)); + tiles2[22].SetOffset(Vector(2, 0)); + tiles2[23].SetOffset(Vector(2, 0)); + + tiles2[24].SetOffset(Vector(3, 4)).SetFlags(Tile::BLOCK_NORTH | Tile::BLOCK_EAST | Tile::BLOCK_WEST); + tiles2[25].SetOffset(Vector(0, 4)); + tiles2[26].SetOffset(Vector(0, 1)); + tiles2[27].SetOffset(Vector(2, 0)); + tiles2[28].SetOffset(Vector(2, 0)); + tiles2[29].SetOffset(Vector(2, 0)); + tiles2[30].SetOffset(Vector(2, 0)); + tiles2[31].SetOffset(Vector(2, 0)); + + tiles2[32].SetOffset(Vector(5, 0)); + tiles2[33].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH | Tile::BLOCK_EAST); + tiles2[34].SetOffset(Vector(0, 1)); + tiles2[35].SetOffset(Vector(2, 0)); + tiles2[36].SetOffset(Vector(2, 0)); + tiles2[37].SetOffset(Vector(2, 0)); + tiles2[38].SetOffset(Vector(2, 0)); + tiles2[39].SetOffset(Vector(2, 0)); + + tiles2[40].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_SOUTH); + tiles2[41].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_SOUTH | Tile::BLOCK_EAST); + tiles2[42].SetOffset(Vector(0, 1)); + tiles2[43].SetOffset(Vector(2, 0)); + tiles2[44].SetOffset(Vector(2, 0)); + tiles2[45].SetOffset(Vector(2, 0)); + tiles2[46].SetOffset(Vector(2, 0)); + tiles2[47].SetOffset(Vector(2, 0)); + + tiles2[48].SetOffset(Vector(1, 0)); + tiles2[49].SetOffset(Vector(1, 0)); + tiles2[50].SetOffset(Vector(5, 4)); + tiles2[51].SetOffset(Vector(2, 0)); + tiles2[52].SetOffset(Vector(2, 0)); + tiles2[53].SetOffset(Vector(2, 0)); + tiles2[54].SetOffset(Vector(2, 0)); + tiles2[55].SetOffset(Vector(2, 0)); + + tiles2[56].SetOffset(Vector(2, 0)); + tiles2[57].SetOffset(Vector(2, 0)); + tiles2[58].SetOffset(Vector(2, 0)); + tiles2[59].SetOffset(Vector(2, 0)); + tiles2[60].SetOffset(Vector(2, 0)); + tiles2[61].SetOffset(Vector(2, 0)); + tiles2[62].SetOffset(Vector(2, 0)); + tiles2[63].SetOffset(Vector(2, 0)); + + Area areas1[2]; + areas1[0].SetTiles(tiles1, 64); + areas1[0].SetWidth(8); + areas1[1].SetTiles(tiles2, 64); + areas1[1].SetWidth(8); + + Trigger triggers1[1]; + triggers1[0].SetTilePosition(Vector(8, 3)); + + SDL_Surface *tilesetImg(IMG_Load("test-data/tileset.png")); + Sprite tileset(tilesetImg, tileSize, tileSize); + + Map map1; + map1.SetAreas(areas1, 2); + map1.SetTileset(&tileset); + map1.SetTriggers(triggers1, 1); + map1.SetWidth(2); + + Tile tiles3[64]; + + tiles3[ 0].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH | Tile::BLOCK_WEST); + tiles3[ 1].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles3[ 2].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles3[ 3].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles3[ 4].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles3[ 5].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles3[ 6].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH); + tiles3[ 7].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_NORTH | Tile::BLOCK_EAST); + + tiles3[ 8].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_WEST); + tiles3[ 9].SetOffset(Vector(3, 0)); + tiles3[10].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_SOUTH); + tiles3[11].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_SOUTH); + tiles3[12].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_SOUTH); + tiles3[13].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_SOUTH); + tiles3[14].SetOffset(Vector(4, 0)); + tiles3[15].SetOffset(Vector(4, 0)).SetFlags(Tile::BLOCK_EAST | Tile::BLOCK_SOUTH); + + tiles3[16].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_WEST); + tiles3[17].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST); + tiles3[18].SetOffset(Vector(0, 0)); + tiles3[19].SetOffset(Vector(1, 0)); + tiles3[20].SetOffset(Vector(1, 0)); + tiles3[21].SetOffset(Vector(3, 2)); + tiles3[22].SetOffset(Vector(4, 2)).SetFlags(Tile::BLOCK_EAST | Tile::BLOCK_SOUTH | Tile::BLOCK_WEST); + tiles3[23].SetOffset(Vector(5, 2)); + + tiles3[24].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_WEST); + tiles3[25].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST); + tiles3[26].SetOffset(Vector(0, 1)); + tiles3[27].SetOffset(Vector(2, 0)); + tiles3[28].SetOffset(Vector(2, 0)); + tiles3[29].SetOffset(Vector(1, 2)); + tiles3[30].SetOffset(Vector(1, 2)); + tiles3[31].SetOffset(Vector(1, 2)); + + tiles3[32].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_WEST); + tiles3[33].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST); + tiles3[34].SetOffset(Vector(0, 1)); + tiles3[35].SetOffset(Vector(2, 0)); + tiles3[36].SetOffset(Vector(2, 0)); + tiles3[37].SetOffset(Vector(2, 3)); + tiles3[38].SetOffset(Vector(3, 3)); + tiles3[39].SetOffset(Vector(0, 3)); + + tiles3[40].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_WEST); + tiles3[41].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST); + tiles3[42].SetOffset(Vector(0, 1)); + tiles3[43].SetOffset(Vector(2, 0)); + tiles3[44].SetOffset(Vector(2, 0)); + tiles3[45].SetOffset(Vector(2, 4)); + tiles3[46].SetOffset(Vector(3, 4)); + tiles3[47].SetOffset(Vector(0, 4)); + + tiles3[48].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_WEST); + tiles3[49].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST); + tiles3[50].SetOffset(Vector(0, 1)); + tiles3[51].SetOffset(Vector(2, 0)); + tiles3[52].SetOffset(Vector(2, 0)); + tiles3[53].SetOffset(Vector(4, 1)); + tiles3[54].SetOffset(Vector(5, 1)); + tiles3[55].SetOffset(Vector(3, 1)); + + tiles3[56].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_SOUTH | Tile::BLOCK_WEST); + tiles3[57].SetOffset(Vector(3, 0)).SetFlags(Tile::BLOCK_EAST | Tile::BLOCK_SOUTH); + tiles3[58].SetOffset(Vector(0, 1)); + tiles3[59].SetOffset(Vector(2, 0)); + tiles3[60].SetOffset(Vector(2, 0)); + tiles3[61].SetOffset(Vector(2, 0)); + tiles3[62].SetOffset(Vector(2, 0)); + tiles3[63].SetOffset(Vector(2, 0)); + + Area areas2[1]; + areas2[0].SetTiles(tiles3, 64); + areas2[0].SetWidth(8); + + Trigger triggers2[1]; + triggers2[0].SetTilePosition(Vector(6, 2)); + + Map map2; + map2.SetAreas(areas2, 1); + map2.SetTileset(&tileset); + map2.SetTriggers(triggers2, 1); + map2.SetWidth(1); + + triggers1[0].map = &map2; + triggers1[0].target = Vector(6, 2); + + triggers2[0].map = &map1; + triggers2[0].target = Vector(8, 3); + + SimpleAnimation mapMaximAnimation(gameState.heroes[0].MapSprite(), (tileSize/walkSpeed) / 2 * 1000, 2, 0, 0, true); + Entity mapMaxim; + mapMaxim.SetAnimation(&mapMaximAnimation); + mapMaxim.Position() = Vector(64, 128); + mapMaxim.SpriteOffset() = Vector(0, -32); + + SimpleAnimation mapSelanAnimation(gameState.heroes[1].MapSprite(), (tileSize/walkSpeed) / 2 * 1000, 2, 0, 0, true); + Entity mapSelan; + mapSelan.SetAnimation(&mapSelanAnimation); + mapSelan.Position() = Vector(64, 128); + mapSelan.SpriteOffset() = Vector(0, -32); + mapSelan.SetFlags(Entity::FLAG_NONBLOCKING); + mapMaxim.AddFollower(&mapSelan); + + SimpleAnimation mapGuyAnimation(gameState.heroes[2].MapSprite(), (tileSize/walkSpeed) / 2 * 1000, 2, 0, 0, true); + Entity mapGuy; + mapGuy.SetAnimation(&mapGuyAnimation); + mapGuy.Position() = Vector(64, 128); + mapGuy.SpriteOffset() = Vector(0, -32); + mapGuy.SetFlags(Entity::FLAG_NONBLOCKING); + mapSelan.AddFollower(&mapGuy); + + SimpleAnimation mapDekarAnimation(gameState.heroes[3].MapSprite(), (tileSize/walkSpeed) / 2 * 1000, 2, 0, 0, true); + Entity mapDekar; + mapDekar.SetAnimation(&mapDekarAnimation); + mapDekar.Position() = Vector(64, 128); + mapDekar.SpriteOffset() = Vector(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(64, 32); + mapMonster.SetOrientation(Entity::ORIENTATION_SOUTH); + map1.SetEntities(&mapMonster, 1); InitScreen screen(width, height); - BattleState *battleState(new BattleState(bg, monstersLayout, heroesLayout, battleRes)); - battleState->AddMonster(monster); - battleState->AddMonster(monster); - battleState->AddMonster(monster); - battleState->AddMonster(monster); - battleState->AddHero(maxim); - battleState->AddHero(selan); - battleState->AddHero(guy); - battleState->AddHero(dekar); - Application app(&screen, battleState); + app::State *state(0); + + if (battle) { + BattleState *battleState(new BattleState(bg, monstersLayout, heroesLayout, battleRes)); + battleState->AddMonster(monster); + battleState->AddMonster(monster); + battleState->AddMonster(monster); + battleState->AddMonster(monster); + 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(&map1)); + + mapState->ControlEntity(&mapMaxim); + mapState->SetWalkingSpeed(walkSpeed); + 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); @@ -206,12 +586,16 @@ int main(int argc, char **argv) { app.Buttons().MapKey(SDLK_SPACE, Input::SELECT); app.Buttons().MapKey(SDLK_RSHIFT, Input::SHOULDER_RIGHT); app.Buttons().MapKey(SDLK_LSHIFT, Input::SHOULDER_LEFT); + app.Buttons().MapKey(SDLK_1, Input::DEBUG_1); + app.Buttons().MapKey(SDLK_2, Input::DEBUG_2); + app.Buttons().MapKey(SDLK_3, Input::DEBUG_3); + app.Buttons().MapKey(SDLK_4, Input::DEBUG_4); app.Run(); return 0; } catch (Parser::Error &e) { cerr << "parsing exception in file " << e.File() << " on line " << e.Line() << ": " << e.what() << endl; - return 1; + return 2; } catch (exception &e) { cerr << "exception in main(): " << e.what() << endl; return 1;