X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmain.cpp;h=965da00e56eb871bd7e5345dd101c40668cf81ad;hb=f6085f8568f2c754ed2eac294171e542139581f4;hp=4280985185a5e8e144aa6f46d855c463dcf635d1;hpb=a55d4589da1a0cdec73c0bcf69a2af6bccf868cb;p=l2e.git diff --git a/src/main.cpp b/src/main.cpp index 4280985..965da00 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,6 +6,7 @@ */ #include "app/Application.h" +#include "app/Arguments.h" #include "app/Input.h" #include "battle/BattleState.h" #include "battle/Hero.h" @@ -25,21 +26,26 @@ #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 "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; @@ -58,9 +64,11 @@ 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 sdl::InitImage; using sdl::InitScreen; using sdl::InitSDL; @@ -69,6 +77,8 @@ 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; @@ -80,84 +90,139 @@ 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(); + 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(); - InitScreen screen(width, height); + 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); // temporary test data SDL_Surface *bg(IMG_Load("test-data/battle-bg.png")); - PartyLayout monstersLayout(*intp.GetPartyLayout("monstersLayout")); - PartyLayout heroesLayout(*intp.GetPartyLayout("heroesLayout")); + PartyLayout monstersLayout(*caster.GetPartyLayout("monstersLayout")); + PartyLayout heroesLayout(*caster.GetPartyLayout("heroesLayout")); - Monster monster(*intp.GetMonster("lizard")); - Hero maxim(*intp.GetHero("maxim")); - Hero selan(*intp.GetHero("selan")); - Hero guy(*intp.GetHero("guy")); - Hero dekar(*intp.GetHero("dekar")); + 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(intp.GetBattleResources("battleResources")); + battle::Resources *battleRes(caster.GetBattleResources("battleResources")); - maxim.AddSpell(intp.GetSpell("resetSpell")); - Spell *strongSpell(intp.GetSpell("strongSpell")); + maxim.AddSpell(caster.GetSpell("resetSpell")); + Spell *strongSpell(caster.GetSpell("strongSpell")); maxim.AddSpell(strongSpell); selan.AddSpell(strongSpell); - Spell *strongerSpell(intp.GetSpell("strongerSpell")); + Spell *strongerSpell(caster.GetSpell("strongerSpell")); maxim.AddSpell(strongerSpell); selan.AddSpell(strongerSpell); - Spell *championSpell(intp.GetSpell("championSpell")); + Spell *championSpell(caster.GetSpell("championSpell")); maxim.AddSpell(championSpell); selan.AddSpell(championSpell); - Spell *rallySpell(intp.GetSpell("rallySpell")); + Spell *rallySpell(caster.GetSpell("rallySpell")); maxim.AddSpell(rallySpell); selan.AddSpell(rallySpell); - selan.AddSpell(intp.GetSpell("escapeSpell")); - Spell *valorSpell(intp.GetSpell("valorSpell")); + selan.AddSpell(caster.GetSpell("escapeSpell")); + Spell *valorSpell(caster.GetSpell("valorSpell")); maxim.AddSpell(valorSpell); selan.AddSpell(valorSpell); Inventory inventory; - inventory.Add(intp.GetItem("antidoteItem"), 9); - inventory.Add(intp.GetItem("magicJarItem"), 4); - inventory.Add(intp.GetItem("hiPotionItem"), 4); - inventory.Add(intp.GetItem("powerPotionItem"), 4); - inventory.Add(intp.GetItem("escapeItem"), 2); - inventory.Add(intp.GetItem("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(intp.GetItem("zircoSwordItem")); - maxim.SetArmor(intp.GetItem("zirconArmorItem")); - maxim.SetShield(intp.GetItem("holyShieldItem")); - maxim.SetHelmet(intp.GetItem("legendHelmItem")); - maxim.SetRing(intp.GetItem("sProRingItem")); - maxim.SetJewel(intp.GetItem("evilJewelItem")); - -// selan.SetWeapon(intp.GetItem("zircoWhipItem")); - selan.SetArmor(intp.GetItem("zirconPlateItem")); - selan.SetShield(intp.GetItem("zircoGlovesItem")); - selan.SetHelmet(intp.GetItem("holyCapItem")); - selan.SetRing(intp.GetItem("ghostRingItem")); - selan.SetJewel(intp.GetItem("eagleRockItem")); - -// guy.SetWeapon(intp.GetItem("zircoAxItem")); - guy.SetArmor(intp.GetItem("zirconArmorItem")); - guy.SetShield(intp.GetItem("megaShieldItem")); - guy.SetHelmet(intp.GetItem("zircoHelmetItem")); - guy.SetRing(intp.GetItem("powerRingItem")); - guy.SetJewel(intp.GetItem("evilJewelItem")); + 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")); // NOTE: this is actually Artea equipment -// dekar.SetWeapon(intp.GetItem("lizardBlowItem")); - dekar.SetArmor(intp.GetItem("holyRobeItem")); - dekar.SetShield(intp.GetItem("zircoGlovesItem")); - dekar.SetHelmet(intp.GetItem("holyCapItem")); - dekar.SetRing(intp.GetItem("rocketRingItem")); - dekar.SetJewel(intp.GetItem("krakenRockItem")); +// 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")); + + InitScreen screen(width, height); BattleState *battleState(new BattleState(bg, monstersLayout, heroesLayout, battleRes)); battleState->AddMonster(monster); @@ -186,7 +251,7 @@ int main(int argc, char **argv) { 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;