From d614201a714f4d958ff4e97fa105131beed3561a Mon Sep 17 00:00:00 2001 From: ketmar Date: Sun, 20 May 2012 03:18:09 +0300 Subject: [PATCH] added simple 'condition scripts' --- Script/dungeons/UT.dat | 16 +- Script/dungeons/new_attnam.dat | 16 +- src/felib/fesave.cpp | 55 ++++ src/felib/fesave.h | 1 + src/felib/festring.h | 17 ++ src/game/game.cpp | 90 ++++++- src/game/game.h | 6 +- src/game/level.cpp | 17 +- src/game/lsquare.cpp | 27 +- src/game/script.cpp | 572 ++++++++++++++++++----------------------- src/game/script.h | 319 ++++++++++++----------- 11 files changed, 610 insertions(+), 526 deletions(-) diff --git a/Script/dungeons/UT.dat b/Script/dungeons/UT.dat index 6618a1c..116cbb4 100644 --- a/Script/dungeons/UT.dat +++ b/Script/dungeons/UT.dat @@ -177,10 +177,18 @@ Dungeon UNDER_WATER_TUNNEL; { Items == lantern; } - if @player_name == "_k8_"; - Square, Pos 2,1; { Items == holyhandgrenade; } - //Square, Pos 2,3; { Items = { 3, moneybag, BONE bone, OMMEL_BONE bone; } } - endif + + Square, Pos 2,1; + { + Items == holyhandgrenade [ + if @has_item "superkawai"; + AddMessage "Nya!"; + else + Disallow; + endif + ]; + } + //Square, Pos 2,3; { Items = { 3, moneybag, BONE bone, OMMEL_BONE bone; } } } } diff --git a/Script/dungeons/new_attnam.dat b/Script/dungeons/new_attnam.dat index 375ae2b..791be82 100644 --- a/Script/dungeons/new_attnam.dat +++ b/Script/dungeons/new_attnam.dat @@ -501,16 +501,22 @@ Dungeon NEW_ATTNAM; //Square, Pos 11,8; { Items == kawai; } //Square, Pos 13,8; { Items == kawai; } - Square, Pos 3,35; - { - Character = vampire { Inventory = { 3, scrollofenchantweapon, scrollofenchantarmor, solstone; } } - } - Square, Random NOT_IN_ROOM|HAS_NO_OTERRAIN; { Character = doctor { Team = NEW_ATTNAM_TEAM; } } endif + + Square, Pos 3,35; + { + Character [ + if @has_item "light"; + AddMessage "Nya!"; + else + Disallow; + endif + ] = vampire { Inventory = { 3, scrollofenchantweapon, scrollofenchantarmor, solstone; } } + } } Level 1; diff --git a/src/felib/fesave.cpp b/src/felib/fesave.cpp index 2adaa43..49c0a9c 100644 --- a/src/felib/fesave.cpp +++ b/src/felib/fesave.cpp @@ -712,6 +712,61 @@ festring inputfile::ReadNumberIntr (int CallLevel, sLong *num, truth *isString, } +festring inputfile::ReadCode (truth AbortOnEOF) { + int sqLevel = 1; + char inString = 0; + festring res; + // + for (char Char = fgetc(Buffer); !feof(Buffer); Char = fgetc(Buffer)) { + //fprintf(stderr, "char: [%c]; inString: %d; sqLevel: %d\n", (Char < 32 || Char > 126 ? '?' : Char), inString, sqLevel); + if (inString) { + res << Char; + if (Char == inString) { + inString = 0; + } else if (Char == '\\') { + if (feof(Buffer)) break; + Char = fgetc(Buffer); + res << Char; + } + } else { + if (Char == '[') { + ++sqLevel; + res << Char; + } else if (Char == ']') { + if (--sqLevel == 0) break; + res << Char; + } else if (Char == '/') { + if (feof(Buffer)) { res << Char; break; } + switch ((Char = fgetc(Buffer))) { + case '/': // eol comment + while (!feof(Buffer)) if (fgetc(Buffer) == '\n') break; + break; + case '*': // c-like comment + while (!feof(Buffer)) { + if (fgetc(Buffer) == '*') { + if (feof(Buffer)) break; + if (fgetc(Buffer) == '/') break; + } + } + break; + default: + res << '/'; + res << Char; + break; + } + } else if (Char == '"' || Char == '\'') { + res << Char; + inString = Char; + } else { + res << Char; + } + } + } + if (AbortOnEOF && feof(Buffer)) ABORT("Unexpected end of file %s!", FileName.CStr()); + return res; +} + + sLong inputfile::ReadNumber (int CallLevel, truth PreserveTerminator) { sLong num = 0; truth isString = false; diff --git a/src/felib/fesave.h b/src/felib/fesave.h index 5b58879..2246001 100644 --- a/src/felib/fesave.h +++ b/src/felib/fesave.h @@ -73,6 +73,7 @@ public: void SkipSpaces (); + festring ReadCode (truth AbortOnEOF=true); festring ReadWord (truth AbortOnEOF=true); void ReadWord (festring &str, truth AbortOnEOF=true, truth skipIt=false); char ReadLetter (truth AbortOnEOF=true); diff --git a/src/felib/festring.h b/src/felib/festring.h index 9d9e1ba..405b582 100644 --- a/src/felib/festring.h +++ b/src/felib/festring.h @@ -12,6 +12,7 @@ #ifndef __FELIB_FESTRING_H__ #define __FELIB_FESTRING_H__ +#include #include #include @@ -86,6 +87,7 @@ public: truth operator == (cchar*) const; truth operator != (cchar*) const; int Compare (cfestring &) const; + int CompareIgnoreCase (cfestring &) const; cchar *CStr () const; sizetype GetSize () const { return Size; } void Empty (); @@ -265,6 +267,21 @@ inline int festring::Compare (cfestring &Str) const { } +inline int festring::CompareIgnoreCase (cfestring &Str) const { + sizetype ThisSize = Size; + sizetype StrSize = Str.Size; + if (ThisSize && StrSize) { + for (sizetype Pos = 0; Pos < GetSize(); ++Pos) { + char Char1 = toupper(Data[Pos]); + char Char2 = toupper(Str[Pos]); + if (Char1 != Char2) return Char1-Char2; + } + return 0; + } + return ThisSize < StrSize ? -1 : ThisSize != StrSize; +} + + inline cchar *festring::CStr() const { char *Ptr = Data; if (Ptr) { diff --git a/src/game/game.cpp b/src/game/game.cpp index 2556a90..b781c02 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -3074,11 +3074,15 @@ void game::ClearEventData () { } -int game::ParseFuncArgs (cfestring &types, std::vector &args) { +// '.': string or number +// 'n': number +// 's': string +// '*': collect all args +int game::ParseFuncArgs (cfestring &types, std::vector &args, inputfile *fl, truth noterm) { festring s; sLong n; truth isStr; - inputfile *fl = mFEStack.top(); + if (!fl) fl = mFEStack.top(); args.clear(); for (unsigned int f = 0; f < types.GetSize(); f++) { switch (types[f]) { @@ -3098,15 +3102,22 @@ int game::ParseFuncArgs (cfestring &types, std::vector &args) { if (s == ";") return args.size(); if (s != ",") ABORT("',' expected in file %s line %d!", fl->GetFileName().CStr(), fl->TellLine()); } + // never reached case 's': default: s = fl->ReadWord(true); args.push_back(FuncArg(s)); break; } - fl->ReadWord(s, true); - if (s == ";") break; - if (s != ",") ABORT("',' expected in file %s line %d!", fl->GetFileName().CStr(), fl->TellLine()); + if (f == types.GetSize()-1) { + if (noterm) break; + fl->ReadWord(s, true); + if (s != ";") ABORT("';' expected in file %s line %d!", fl->GetFileName().CStr(), fl->TellLine()); + break; + } else { + fl->ReadWord(s, true); + if (s != ",") ABORT("',' expected in file %s line %d!", fl->GetFileName().CStr(), fl->TellLine()); + } } return args.size(); } @@ -3159,18 +3170,24 @@ void game::SkipBlock (truth brcEaten) { } -truth game::DoOnEvent (truth brcEaten) { +truth game::DoOnEvent (truth brcEaten, truth AllowScript) { // do; only funcalls for now - truth eaten = false; + truth eaten = AllowScript ? true : false; festring w; if (!brcEaten) { mFEStack.top()->ReadWord(w, true); if (w != "{") ABORT("'{' expected in file %s at line %d!", mFEStack.top()->GetFileName().CStr(), mFEStack.top()->TellLine()); } for (;;) { - if (!GetWord(w)) ABORT("Unexpected end of file %s!", mFEStack.top()->GetFileName().CStr()); + if (!GetWord(w)) { + if (AllowScript) break; + ABORT("Unexpected end of file %s!", mFEStack.top()->GetFileName().CStr()); + } //fprintf(stderr, " :[%s]\n", w.CStr()); - if (w == "}") break; + if (w == "}") { + if (AllowScript) ABORT("Unexpected '}' in AllowScript file %s at line %d!", mFEStack.top()->GetFileName().CStr(), mFEStack.top()->TellLine()); + break; + } if (w == ";") continue; if (w == "@") { mFEStack.top()->ReadWord(w, true); @@ -3215,9 +3232,15 @@ truth game::DoOnEvent (truth brcEaten) { continue; } if (w == "EatThisEvent") { + if (AllowScript) ABORT("'EatThisEvent' forbidden in AllowScripts in file %s at line %d!", mFEStack.top()->GetFileName().CStr(), mFEStack.top()->TellLine()); eaten = true; continue; } + if (w == "Disallow") { + if (!AllowScript) ABORT("'Disallow' forbidden in not-AllowScripts in file %s at line %d!", mFEStack.top()->GetFileName().CStr(), mFEStack.top()->TellLine()); + eaten = false; + continue; + } ABORT("Unknown function [%s] in file %s at line %d!", w.CStr(), mFEStack.top()->GetFileName().CStr(), mFEStack.top()->TellLine()); //if (mFEStack.top()->ReadWord() != ";") ABORT("';' expected in file %s line %d!", mFEStack.top()->GetFileName().CStr(), mFEStack.top()->TellLine()); } @@ -3372,6 +3395,42 @@ festring game::ldrGetVar (inputfile *fl, cfestring &name) { if (mChar->GetRelation(PLAYER) == HOSTILE) return "tan"; return ""; } + if (name == "has_item") { + std::vector args; + ParseFuncArgs("s", args, fl, true); + // + if (PLAYER) { + itemvector items; + festring s = args[0].sval; + // + //fprintf(stderr, "looking for [%s]\n", s.CStr()); + PLAYER->GetStack()->FillItemVector(items); + for (unsigned int f = 0; f < items.size(); ++f) { + for (uInt c = 0; c < items[f]->GetDataBase()->Alias.Size; ++c) { + //fprintf(stderr, "%u:%u: [%s]\n", f, c, items[f]->GetDataBase()->Alias[c].CStr()); + if (s.CompareIgnoreCase(items[f]->GetDataBase()->Alias[c]) == 0) { + //fprintf(stderr, " FOUND!\n"); + return "tan"; + } + } + } + //fprintf(stderr, "checking equipment...\n"); + for (int f = 0; f < PLAYER->GetEquipments(); ++f) { + item *it = PLAYER->GetEquipment(f); + // + if (it) { + for (uInt c = 0; c < it->GetDataBase()->Alias.Size; ++c) { + //fprintf(stderr, "%u:%u: [%s]\n", f, c, it->GetDataBase()->Alias[c].CStr()); + if (s.CompareIgnoreCase(it->GetDataBase()->Alias[c]) == 0) { + //fprintf(stderr, " FOUND!\n"); + return "tan"; + } + } + } + } + } + return ""; + } //if (name == "type") return mVarType; ABORT("unknown variable: %s", name.CStr()); return ""; @@ -3384,3 +3443,16 @@ truth game::CheckDropLeftover (item *i) { if (!ivanconfig::GetAutoDropLeftOvers()) return false; return true; } + + +truth game::RunAllowScriptStr (cfestring &str) { + truth res = true; + if (str.GetSize() < 1) return true; + //fprintf(stderr, "====\n%s\n====\n", str.CStr()); + inputfile *ifl = new meminputfile(str, &game::GetGlobalValueMap()); + ifl->setGetVarCB(game::ldrGetVar); + mFEStack.push(ifl); + res = DoOnEvent(true, true); + //fprintf(stderr, "mFEStack: %u\n", mFEStack.size()); + return res; +} diff --git a/src/game/game.h b/src/game/game.h index b467d9e..437462b 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -475,6 +475,8 @@ public: static truth RunOnCharEvent (character *who, cfestring &ename); static truth RunOnItemEvent (item *what, cfestring &ename); + static truth RunAllowScriptStr (cfestring &str); + static festring ldrGetVar (inputfile *fl, cfestring &name); private: @@ -482,8 +484,8 @@ private: static truth GetWord (festring &w); static void SkipBlock (truth brcEaten); static void UpdateCameraCoordinate (int &, int, int, int); - static truth DoOnEvent (truth brcEaten); - static int ParseFuncArgs (cfestring &types, std::vector &args); + static truth DoOnEvent (truth brcEaten, truth AllowScript=false); + static int ParseFuncArgs (cfestring &types, std::vector &args, inputfile *fl=0, truth noterm=false); private: static cchar* const Alignment[]; diff --git a/src/game/level.cpp b/src/game/level.cpp index 731495d..03d5132 100644 --- a/src/game/level.cpp +++ b/src/game/level.cpp @@ -347,13 +347,16 @@ truth level::MakeRoom (const roomscript *RoomScript) { game::BusyAnimation(); for (int y = 0; y < CharacterMap->GetSize()->Y; ++y) { if (IsValidScript(CharacterScript = CharacterMap->GetContentScript(x, y))) { - character* Char = CharacterScript->Instantiate(); - Char->SetGenerationDanger(Difficulty); - if (!Char->GetTeam()) Char->SetTeam(game::GetTeam(*LevelScript->GetTeamDefault())); - if (CharacterScript->GetFlags()&IS_LEADER) Char->GetTeam()->SetLeader(Char); - Char->PutTo(CharPos+v2(x, y)); - Char->CreateHomeData(); - if (CharacterScript->GetFlags()&IS_MASTER) RoomClass->SetMasterID(Char->GetID()); + character *Char = CharacterScript->Instantiate(); + // + if (Char) { + Char->SetGenerationDanger(Difficulty); + if (!Char->GetTeam()) Char->SetTeam(game::GetTeam(*LevelScript->GetTeamDefault())); + if (CharacterScript->GetFlags()&IS_LEADER) Char->GetTeam()->SetLeader(Char); + Char->PutTo(CharPos+v2(x, y)); + Char->CreateHomeData(); + if (CharacterScript->GetFlags()&IS_MASTER) RoomClass->SetMasterID(Char->GetID()); + } } } } diff --git a/src/game/lsquare.cpp b/src/game/lsquare.cpp index f2794b6..daf8e8e 100644 --- a/src/game/lsquare.cpp +++ b/src/game/lsquare.cpp @@ -938,22 +938,17 @@ void lsquare::ApplyScript(const squarescript* SquareScript, room* Room) const contentscript* CharacterScript = SquareScript->GetCharacter(); - if(CharacterScript) - { - character* Char = CharacterScript->Instantiate(); - Char->SetGenerationDanger(GetLevel()->GetDifficulty()); - - if(!Char->GetTeam()) - Char->SetTeam(game::GetTeam(*GetLevel()->GetLevelScript()->GetTeamDefault())); - - if(CharacterScript->GetFlags() & IS_LEADER) - Char->GetTeam()->SetLeader(Char); - - Char->PutToOrNear(Pos); - Char->CreateHomeData(); - - if(Room && CharacterScript->GetFlags() & IS_MASTER) - Room->SetMasterID(Char->GetID()); + if (CharacterScript) { + character *Char = CharacterScript->Instantiate(); + // + if (Char) { + Char->SetGenerationDanger(GetLevel()->GetDifficulty()); + if (!Char->GetTeam()) Char->SetTeam(game::GetTeam(*GetLevel()->GetLevelScript()->GetTeamDefault())); + if (CharacterScript->GetFlags() & IS_LEADER) Char->GetTeam()->SetLeader(Char); + Char->PutToOrNear(Pos); + Char->CreateHomeData(); + if (Room && CharacterScript->GetFlags() & IS_MASTER) Room->SetMasterID(Char->GetID()); + } } const fearray >* Items = SquareScript->GetItems(); diff --git a/src/game/script.cpp b/src/game/script.cpp index 9b9907e..861278e 100644 --- a/src/game/script.cpp +++ b/src/game/script.cpp @@ -30,6 +30,7 @@ script::datamap levelscript::DataMap; script::datamap dungeonscript::DataMap; script::datamap teamscript::DataMap; script::datamap gamescript::DataMap; + template script::datamap contentmap::DataMap; template void scriptmember::ReadFrom (inputfile &SaveFile) { @@ -38,38 +39,33 @@ template void scriptmember::ReadFrom (inputfile &SaveFile) { } -template void scriptmember::Replace(scriptmemberbase& Base) -{ - scriptmember& Data = static_cast&>(Base); - - if(Data.Member) - { +template void scriptmember::Replace (scriptmemberbase &Base) { + scriptmember &Data = static_cast &>(Base); + if (Data.Member) { delete Member; Member = Data.Member; Data.Member = 0; } } -template void scriptmember::Save(outputfile& SaveFile) const -{ - if(Member) - { + +template void scriptmember::Save(outputfile &SaveFile) const { + if (Member) { SaveFile.Put(1); SaveFile << *Member; - } - else + } else { SaveFile.Put(0); + } } -template void scriptmember::Load(inputfile& SaveFile) -{ - if(SaveFile.Get()) - { +template void scriptmember::Load(inputfile &SaveFile) { + if (SaveFile.Get()) { Member = new type; SaveFile >> *Member; } } + #define INST_SCRIPT_MEMBER(type)\ template void scriptmember< type >::ReadFrom(inputfile&);\ template void scriptmember< type >::Replace(scriptmemberbase&);\ @@ -101,27 +97,28 @@ INST_SCRIPT_MEMBER(glterraincontentmap); INST_SCRIPT_MEMBER(olterraincontentmap); INST_SCRIPT_MEMBER(fearray); -template void fastscriptmember::ReadFrom(inputfile& SaveFile) -{ + +template void fastscriptmember::ReadFrom(inputfile &SaveFile) { ReadData(*&Member, SaveFile); // gcc 3.4.1 sucks } -template void fastscriptmember::Replace(scriptmemberbase& Base) -{ - fastscriptmember& Data = static_cast&>(Base); + +template void fastscriptmember::Replace(scriptmemberbase &Base) { + fastscriptmember& Data = static_cast &>(Base); Member = Data.Member; } -template void fastscriptmember::Save(outputfile& SaveFile) const -{ + +template void fastscriptmember::Save(outputfile &SaveFile) const { SaveFile << Member; } -template void fastscriptmember::Load(inputfile& SaveFile) -{ + +template void fastscriptmember::Load(inputfile &SaveFile) { SaveFile >> *&Member; // gcc 3.4.1 sucks } + #define INST_FAST_SCRIPT_MEMBER(type)\ template void fastscriptmember< type >::ReadFrom(inputfile&);\ template void fastscriptmember< type >::Replace(scriptmemberbase&);\ @@ -135,39 +132,34 @@ INST_FAST_SCRIPT_MEMBER(int); INST_FAST_SCRIPT_MEMBER(uLong); INST_FAST_SCRIPT_MEMBER(packv2); -truth script::ReadMember(inputfile& SaveFile, cfestring& Word) -{ - scriptmemberbase* Data = GetData(Word.CStr()); - if(Data) - { +truth script::ReadMember (inputfile &SaveFile, cfestring &Word) { + scriptmemberbase *Data = GetData(Word.CStr()); + if (Data) { Data->ReadFrom(SaveFile); return true; } - else - return false; + return false; } -scriptmemberbase* script::GetDataFromMap(const datamap& DataMap, cchar* Identifier) -{ + +scriptmemberbase *script::GetDataFromMap (const datamap &DataMap, cchar *Identifier) { datamap::const_iterator i = DataMap.find(Identifier); return i != DataMap.end() ? &(this->*i->second) : 0; } -void script::SaveDataMap(const datamap& DataMap, outputfile& SaveFile) const -{ - for(datamap::const_iterator i = DataMap.begin(); i != DataMap.end(); ++i) - (this->*i->second).Save(SaveFile); + +void script::SaveDataMap (const datamap &DataMap, outputfile &SaveFile) const { + for (datamap::const_iterator i = DataMap.begin(); i != DataMap.end(); ++i) (this->*i->second).Save(SaveFile); } -void script::LoadDataMap(const datamap& DataMap, inputfile& SaveFile) -{ - for(datamap::const_iterator i = DataMap.begin(); i != DataMap.end(); ++i) - (this->*i->second).Load(SaveFile); + +void script::LoadDataMap (const datamap &DataMap, inputfile &SaveFile) { + for (datamap::const_iterator i = DataMap.begin(); i != DataMap.end(); ++i) (this->*i->second).Load(SaveFile); } -template void InitMember(script::datamap& DataMap, cchar* Identifier, scriptmemberptr DataMember) -{ + +template void InitMember (script::datamap &DataMap, cchar *Identifier, scriptmemberptr DataMember) { DataMap[Identifier] = reinterpret_cast(DataMember); } @@ -175,96 +167,87 @@ template void InitMember(script::datamap& DataMap, cchar #define INIT(name, value) name##Holder(value) -void posscript::InitDataMap() -{ + +void posscript::InitDataMap () { INIT_ENTRY(Vector); INIT_ENTRY(Flags); INIT_ENTRY(Borders); } -void posscript::ReadFrom(inputfile& SaveFile) -{ + +void posscript::ReadFrom (inputfile &SaveFile) { static festring Word; SaveFile.ReadWord(Word); - if(Word == "Pos") - { + if (Word == "Pos") { Random = false; VectorHolder.ReadFrom(SaveFile); } - if(Word == "Random") - { + if (Word == "Random") { Random = true; FlagsHolder.ReadFrom(SaveFile); } - if(Word == "BoundedRandom") - { + if (Word == "BoundedRandom") { Random = true; BordersHolder.ReadFrom(SaveFile); FlagsHolder.ReadFrom(SaveFile); } } -void posscript::Save(outputfile& SaveFile) const -{ + +void posscript::Save (outputfile &SaveFile) const { script::Save(SaveFile); SaveFile << Random; } -void posscript::Load(inputfile& SaveFile) -{ + +void posscript::Load (inputfile &SaveFile) { script::Load(SaveFile); SaveFile >> Random; } -void materialscript::InitDataMap() -{ + +void materialscript::InitDataMap () { INIT_ENTRY(Volume); } -void materialscript::ReadFrom(inputfile& SaveFile) -{ + +void materialscript::ReadFrom (inputfile &SaveFile) { static festring Word; + // SaveFile.ReadWord(Word); - - if(Word == "=") - SaveFile.ReadWord(Word); - - if(Word == "0") + if (Word == "=") SaveFile.ReadWord(Word); + if (Word == "0") { Config = 0; - else - { + } else { valuemap::const_iterator i = game::GetGlobalValueMap().find(Word); - - if(i != game::GetGlobalValueMap().end()) - Config = i->second; - else - ABORT("Unconfigured material script detected at line %d!", SaveFile.TellLine()); + // + if (i != game::GetGlobalValueMap().end()) Config = i->second; + else ABORT("Unconfigured material script detected at line %d!", SaveFile.TellLine()); } - - if(SaveFile.ReadWord() != "{") - return; - - for(SaveFile.ReadWord(Word); Word != "}"; SaveFile.ReadWord(Word)) - if(!ReadMember(SaveFile, Word)) + if (SaveFile.ReadWord() != "{") return; + for (SaveFile.ReadWord(Word); Word != "}"; SaveFile.ReadWord(Word)) { + if (!ReadMember(SaveFile, Word)) { ABORT("Odd script term %s encountered in material script line %d!", Word.CStr(), SaveFile.TellLine()); + } + } } -material* materialscript::Instantiate() const -{ + +material *materialscript::Instantiate () const { return MAKE_MATERIAL(Config, GetVolume() ? GetVolume()->Randomize() : 0); } -void materialscript::Save(outputfile& SaveFile) const -{ + +void materialscript::Save (outputfile &SaveFile) const { script::Save(SaveFile); SaveFile << (uShort)Config; } -void materialscript::Load(inputfile& SaveFile) -{ + +void materialscript::Load (inputfile &SaveFile) { script::Load(SaveFile); Config = 0; uShort s2; @@ -272,96 +255,79 @@ void materialscript::Load(inputfile& SaveFile) Config = s2; } -void basecontentscript::InitDataMap() -{ + +void basecontentscript::InitDataMap () { INIT_ENTRY(MainMaterial); INIT_ENTRY(SecondaryMaterial); INIT_ENTRY(Parameters); } -basecontentscript::basecontentscript() -: ContentType(0), Random(false), Config(0), - INIT(Parameters, NO_PARAMETERS) -{ } -void basecontentscript::ReadFrom(inputfile& SaveFile) -{ +basecontentscript::basecontentscript () : ContentType(0), Random(false), Config(0), INIT(Parameters, NO_PARAMETERS) { +} + + +void basecontentscript::ReadFrom (inputfile &SaveFile) { static festring Word; + // SaveFile.ReadWord(Word); - - if(Word == "=" || Word == ",") + if (Word == "[") { + mCode = SaveFile.ReadCode(); SaveFile.ReadWord(Word); - + } + if (Word == "=" || Word == ",") SaveFile.ReadWord(Word); valuemap::const_iterator i = game::GetGlobalValueMap().find(Word); - - if(i != game::GetGlobalValueMap().end()) - { - if(!GetMainMaterial()) - MainMaterialHolder.Member = new materialscript; - + if (i != game::GetGlobalValueMap().end()) { + if (!GetMainMaterial()) MainMaterialHolder.Member = new materialscript; MainMaterialHolder.Member->SetConfig(i->second); SaveFile.ReadWord(Word); i = game::GetGlobalValueMap().find(Word); - - if(i != game::GetGlobalValueMap().end()) - { - if(!GetSecondaryMaterial()) - SecondaryMaterialHolder.Member = new materialscript; - + if (i != game::GetGlobalValueMap().end()) { + if (!GetSecondaryMaterial()) SecondaryMaterialHolder.Member = new materialscript; SecondaryMaterialHolder.Member->SetConfig(i->second); SaveFile.ReadWord(Word); } } - - if(Word == "NaturalMaterialForm") - { + if (Word == "NaturalMaterialForm") { Random = false; ContentType = NATURAL_MATERIAL_FORM; SaveFile.ReadWord(Word); - } - else if(Word == "Random") - { + } else if (Word == "Random") { Random = true; SaveFile.ReadWord(Word); - } - else - { + } else { Random = false; ContentType = SearchCodeName(Word); - - if(ContentType || Word == "0") - SaveFile.ReadWord(Word); - else - ABORT("Odd script term %s encountered in %s content script, file %s line %d!", Word.CStr(), GetClassID(), SaveFile.GetFileName().CStr(), SaveFile.TellLine()); + if (ContentType || Word == "0") SaveFile.ReadWord(Word); + else ABORT("Odd script term %s encountered in %s content script, file %s line %d!", Word.CStr(), GetClassID(), SaveFile.GetFileName().CStr(), SaveFile.TellLine()); } - - if(Word == "(") - { + if (Word == "(") { Config = SaveFile.ReadNumber(); SaveFile.ReadWord(Word); - } - else + } else { Config = 0; - - if(Word == "{") - for(SaveFile.ReadWord(Word); Word != "}"; SaveFile.ReadWord(Word)) - { - if(!ReadMember(SaveFile, Word)) - ABORT("Odd script term %s encountered in %s content script, file %s line %d!", Word.CStr(), GetClassID(), SaveFile.GetFileName().CStr(), SaveFile.TellLine()); + } + if (Word == "{") { + for (SaveFile.ReadWord(Word); Word != "}"; SaveFile.ReadWord(Word)) { + if (!ReadMember(SaveFile, Word)) ABORT("Odd script term %s encountered in %s content script, file %s line %d!", Word.CStr(), GetClassID(), SaveFile.GetFileName().CStr(), SaveFile.TellLine()); } - else - if(Word != ";" && Word != ",") - ABORT("Odd terminator %s encountered in %s content script, file %s line %d!", Word.CStr(), GetClassID(), SaveFile.GetFileName().CStr(), SaveFile.TellLine()); + } else { + if (Word == "[") { + mCode = SaveFile.ReadCode(); + SaveFile.ReadWord(Word); + } + if (Word != ";" && Word != ",") ABORT("Odd terminator %s encountered in %s content script, file %s line %d!", Word.CStr(), GetClassID(), SaveFile.GetFileName().CStr(), SaveFile.TellLine()); + } } -scriptmemberbase* basecontentscript::GetData(cchar* String) -{ - scriptmemberbase* Return = GetDataFromMap(GetDataMap(), String); + +scriptmemberbase *basecontentscript::GetData (cchar *String) { + scriptmemberbase *Return = GetDataFromMap(GetDataMap(), String); return Return ? Return : GetDataFromMap(DataMap, String); } -void basecontentscript::Save(outputfile& SaveFile) const -{ + +void basecontentscript::Save (outputfile &SaveFile) const { SaveDataMap(GetDataMap(), SaveFile); SaveDataMap(DataMap, SaveFile); SaveFile << ContentType; @@ -369,8 +335,8 @@ void basecontentscript::Save(outputfile& SaveFile) const SaveFile << Config; } -void basecontentscript::Load(inputfile& SaveFile) -{ + +void basecontentscript::Load (inputfile &SaveFile) { LoadDataMap(GetDataMap(), SaveFile); LoadDataMap(DataMap, SaveFile); ContentType = ReadType(SaveFile); @@ -378,127 +344,113 @@ void basecontentscript::Load(inputfile& SaveFile) SaveFile >> Config; } -template type* contentscripttemplate::BasicInstantiate(int SpecialFlags) const -{ - type* Instance = 0; - const typename type::prototype* Proto = protocontainer::GetProto(ContentType); - const typename type::database*const* ConfigData = Proto->GetConfigData(); - const materialscript* MainMaterial = GetMainMaterial(); - const materialscript* SecondaryMaterial = GetSecondaryMaterial(); - const typename type::database* DataBase = *ConfigData; - truth UseOverriddenMaterials = false; - - if(!Config && DataBase->IsAbstract) - { - while(!Instance) - { - DataBase = ConfigData[1 + RAND() % (Proto->GetConfigSize() - 1)]; - - if(DataBase->AllowRandomInstantiation()) - { - if(!(SpecialFlags & NO_MATERIALS) - && MainMaterial - && (!DataBase->HasSecondaryMaterial || SecondaryMaterial)) - { - SpecialFlags |= NO_MATERIALS; - UseOverriddenMaterials = true; - } - Instance = Proto->Spawn(DataBase->Config, SpecialFlags|NO_PIC_UPDATE); +template type *contentscripttemplate::BasicInstantiate (int SpecialFlags) const { + type *Instance = 0; + const typename type::prototype *Proto = protocontainer::GetProto(ContentType); + const typename type::database *const *ConfigData = Proto->GetConfigData(); + const materialscript *MainMaterial = GetMainMaterial(); + const materialscript *SecondaryMaterial = GetSecondaryMaterial(); + const typename type::database *DataBase = *ConfigData; + truth UseOverriddenMaterials = false; + // + if (!Config && DataBase->IsAbstract) { + while (!Instance) { + DataBase = ConfigData[1+RAND()%(Proto->GetConfigSize()-1)]; + if (DataBase->AllowRandomInstantiation()) { + if (!(SpecialFlags & NO_MATERIALS) && MainMaterial && (!DataBase->HasSecondaryMaterial || SecondaryMaterial)) { + SpecialFlags |= NO_MATERIALS; + UseOverriddenMaterials = true; + } + Instance = Proto->Spawn(DataBase->Config, SpecialFlags|NO_PIC_UPDATE); } } - } - else - { - if(!(SpecialFlags & NO_MATERIALS) - && MainMaterial - && (!DataBase->HasSecondaryMaterial || SecondaryMaterial)) - { + } else { + if (!(SpecialFlags & NO_MATERIALS) && MainMaterial && (!DataBase->HasSecondaryMaterial || SecondaryMaterial)) { SpecialFlags |= NO_MATERIALS; UseOverriddenMaterials = true; } - Instance = Proto->Spawn(Config, SpecialFlags|NO_PIC_UPDATE); } - - if(GetParameters() != NO_PARAMETERS) - Instance->SetParameters(GetParameters()); - - if(UseOverriddenMaterials) + if (GetParameters() != NO_PARAMETERS) Instance->SetParameters(GetParameters()); + if (UseOverriddenMaterials) { Instance->InitMaterials(MainMaterial, SecondaryMaterial, false); - else - { - if(MainMaterial) - Instance->ChangeMainMaterial(MainMaterial->Instantiate(), SpecialFlags|NO_PIC_UPDATE); - - if(SecondaryMaterial) - Instance->ChangeSecondaryMaterial(SecondaryMaterial->Instantiate(), SpecialFlags|NO_PIC_UPDATE); + } else { + if (MainMaterial) Instance->ChangeMainMaterial(MainMaterial->Instantiate(), SpecialFlags|NO_PIC_UPDATE); + if (SecondaryMaterial) Instance->ChangeSecondaryMaterial(SecondaryMaterial->Instantiate(), SpecialFlags|NO_PIC_UPDATE); } - - if(!(SpecialFlags & NO_PIC_UPDATE)) - Instance->UpdatePictures(); - + if (!(SpecialFlags & NO_PIC_UPDATE)) Instance->UpdatePictures(); return Instance; } + /* Called by an inline function in script.h... */ -template glterrain* contentscripttemplate::BasicInstantiate(int) const; +template glterrain *contentscripttemplate::BasicInstantiate (int) const; -template int contentscripttemplate::SearchCodeName(cfestring& String) const -{ +template int contentscripttemplate::SearchCodeName (cfestring &String) const { return protocontainer::SearchCodeName(String); } /* GCC 2.952 SUCKS!!! IT MUST BURN!!! */ -template int contentscripttemplate::SearchCodeName(cfestring&) const; -template int contentscripttemplate::SearchCodeName(cfestring&) const; -template int contentscripttemplate::SearchCodeName(cfestring&) const; -template int contentscripttemplate::SearchCodeName(cfestring&) const; +template int contentscripttemplate::SearchCodeName(cfestring &) const; +template int contentscripttemplate::SearchCodeName(cfestring &) const; +template int contentscripttemplate::SearchCodeName(cfestring &) const; +template int contentscripttemplate::SearchCodeName(cfestring &) const; -cchar* contentscript::GetClassID() const { return "character"; } -cchar* contentscript::GetClassID() const { return "item"; } -cchar* contentscript::GetClassID() const { return "glterrain"; } -cchar* contentscript::GetClassID() const { return "olterrain"; } +cchar *contentscript::GetClassID () const { return "character"; } +cchar *contentscript::GetClassID () const { return "item"; } +cchar *contentscript::GetClassID () const { return "glterrain"; } +cchar *contentscript::GetClassID () const { return "olterrain"; } -void contentscript::InitDataMap() -{ + +void contentscript::InitDataMap () { INIT_ENTRY(Inventory); INIT_ENTRY(WayPoint); INIT_ENTRY(Team); INIT_ENTRY(Flags); } -contentscript::contentscript() -: INIT(Team, DEFAULT_TEAM), - INIT(Flags, 0) -{ } - -character* contentscript::Instantiate(int SpecialFlags) const -{ - character* Instance = contentscripttemplate::BasicInstantiate(SpecialFlags); - - if(GetTeam() != DEFAULT_TEAM) - Instance->SetTeam(game::GetTeam(GetTeam())); - const fearray >* Inventory = GetInventory(); - - if(Inventory) - Instance->AddToInventory(*Inventory, SpecialFlags); - - const fearray* WayPoint = GetWayPoint(); +contentscript::contentscript () : INIT(Team, DEFAULT_TEAM), INIT(Flags, 0) { +} - if(WayPoint) - Instance->SetWayPoints(*WayPoint); +character *contentscript::Instantiate (int SpecialFlags) const { + character *Instance = contentscripttemplate::BasicInstantiate(SpecialFlags); + // + //fprintf(stderr, "instantiating character '%s'\n", Instance->GetNameSingular().CStr()); + // + /* + if (Instance->GetNameSingular() == "vampire") { + delete Instance; + return 0; + } + */ + // + if (!mCode.IsEmpty()) { + game::ClearEventData(); + if (!game::RunAllowScriptStr(mCode)) { + //fprintf(stderr, "dropping character '%s'\n", Instance->GetNameSingular().CStr()); + delete Instance; + return 0; + } + } + // + if (GetTeam() != DEFAULT_TEAM) Instance->SetTeam(game::GetTeam(GetTeam())); + const fearray > *Inventory = GetInventory(); + if (Inventory) Instance->AddToInventory(*Inventory, SpecialFlags); + const fearray *WayPoint = GetWayPoint(); + if (WayPoint) Instance->SetWayPoints(*WayPoint); Instance->RestoreHP(); Instance->RestoreStamina(); return Instance; } -contentscript::contentscript() -: INIT(Category, ANY_CATEGORY), + +contentscript::contentscript () : + INIT(Category, ANY_CATEGORY), INIT(MinPrice, 0), INIT(MaxPrice, MAX_PRICE), INIT(Team, DEFAULT_TEAM), @@ -508,10 +460,11 @@ contentscript::contentscript() INIT(SpoilPercentage, 0), INIT(Enchantment, 0), INIT(IsActive, false) -{ } - -void contentscript::InitDataMap() { +} + + +void contentscript::InitDataMap () { INIT_ENTRY(ItemsInside); INIT_ENTRY(Times); INIT_ENTRY(MinPrice); @@ -527,78 +480,63 @@ void contentscript::InitDataMap() INIT_ENTRY(IsActive); } -item* contentscript::InstantiateBasedOnMaterial(int MaterialConfig, int SpecialFlags) const -{ - if(ContentType == NATURAL_MATERIAL_FORM) - { - const materialscript* MainMaterial = GetMainMaterial(); - sLong Volume = MainMaterial && MainMaterial->GetVolume() - ? MainMaterial->GetVolume()->Randomize() : 0; + +item *contentscript::InstantiateBasedOnMaterial (int MaterialConfig, int SpecialFlags) const { + if (ContentType == NATURAL_MATERIAL_FORM) { + const materialscript *MainMaterial = GetMainMaterial(); + sLong Volume = MainMaterial && MainMaterial->GetVolume() ? MainMaterial->GetVolume()->Randomize() : 0; return material::CreateNaturalForm(MaterialConfig, Volume); } - else - return Instantiate(SpecialFlags); + return Instantiate(SpecialFlags); } -item* contentscript::Instantiate(int SpecialFlags) const -{ - int Chance = GetChance(); - - if(Chance != 100 && Chance <= RAND_N(100)) - return 0; - item* Instance; - - if(Random) +item *contentscript::Instantiate (int SpecialFlags) const { + int Chance = GetChance(); + item *Instance; + // + if (!mCode.IsEmpty()) { + game::ClearEventData(); + if (!game::RunAllowScriptStr(mCode)) return 0; + } + // + if (Chance != 100 && Chance <= RAND_N(100)) return 0; + if (Random) { Instance = protosystem::BalancedCreateItem(GetMinPrice(), GetMaxPrice(), GetCategory(), SpecialFlags, GetConfigFlags()); - else + } else { Instance = contentscripttemplate::BasicInstantiate(SpecialFlags); - - if(GetLifeExpectancy()) - Instance->SetLifeExpectancy(GetLifeExpectancy()->Min, (GetLifeExpectancy()->Max - GetLifeExpectancy()->Min) + 1); - - if(GetTeam() != DEFAULT_TEAM) - Instance->SetTeam(GetTeam()); - - if(IsActive()) - Instance->SetIsActive(true); - - if(GetEnchantment() != 0) - Instance->SetEnchantment(GetEnchantment()); - - const fearray >* ItemsInside = GetItemsInside(); - - if(ItemsInside) - Instance->SetItemsInside(*ItemsInside, SpecialFlags); - - if(GetSpoilPercentage() != 0) - Instance->SetSpoilPercentage(GetSpoilPercentage()); - + } + if (GetLifeExpectancy()) Instance->SetLifeExpectancy(GetLifeExpectancy()->Min, (GetLifeExpectancy()->Max - GetLifeExpectancy()->Min) + 1); + if (GetTeam() != DEFAULT_TEAM) Instance->SetTeam(GetTeam()); + if (IsActive()) Instance->SetIsActive(true); + if (GetEnchantment() != 0) Instance->SetEnchantment(GetEnchantment()); + const fearray > *ItemsInside = GetItemsInside(); + if (ItemsInside) Instance->SetItemsInside(*ItemsInside, SpecialFlags); + if (GetSpoilPercentage() != 0) Instance->SetSpoilPercentage(GetSpoilPercentage()); return Instance; } -truth IsValidScript(const fearray > *Array) -{ - for(uInt c = 0; c < Array->Size; ++c) - if(IsValidScript(&Array->Data[c])) - return true; +truth IsValidScript (const fearray > *Array) { + for (uInt c = 0; c < Array->Size; ++c) if (IsValidScript(&Array->Data[c])) return true; return false; } -void contentscript::InitDataMap() -{ + +void contentscript::InitDataMap () { INIT_ENTRY(IsInside); } -contentscript::contentscript() -: INIT(VisualEffects, 0), + +contentscript::contentscript () : + INIT(VisualEffects, 0), INIT(AttachedArea, DEFAULT_ATTACHED_AREA), INIT(AttachedEntry, DEFAULT_ATTACHED_ENTRY) -{ } - -void contentscript::InitDataMap() { +} + + +void contentscript::InitDataMap () { INIT_ENTRY(ItemsInside); INIT_ENTRY(Text); INIT_ENTRY(VisualEffects); @@ -606,45 +544,29 @@ void contentscript::InitDataMap() INIT_ENTRY(AttachedEntry); } -olterrain* contentscript::Instantiate(int SpecialFlags) const -{ - if(!ContentType) - return 0; - olterrain* Instance = contentscripttemplate::BasicInstantiate(SpecialFlags); - - if(GetVisualEffects()) - { +olterrain *contentscript::Instantiate (int SpecialFlags) const { + if (!ContentType) return 0; + olterrain *Instance = contentscripttemplate::BasicInstantiate(SpecialFlags); + if (GetVisualEffects()) { Instance->SetVisualEffects(GetVisualEffects()); Instance->UpdatePictures(); } + if (GetAttachedArea() != DEFAULT_ATTACHED_AREA) Instance->SetAttachedArea(GetAttachedArea()); + if (GetAttachedEntry() != DEFAULT_ATTACHED_ENTRY) Instance->SetAttachedEntry(GetAttachedEntry()); + cfestring *Text = GetText(); + if (Text) Instance->SetText(*Text); + const fearray > *ItemsInside = GetItemsInside(); + if (ItemsInside) Instance->SetItemsInside(*ItemsInside, SpecialFlags); + return Instance; +} - if(GetAttachedArea() != DEFAULT_ATTACHED_AREA) - Instance->SetAttachedArea(GetAttachedArea()); - - if(GetAttachedEntry() != DEFAULT_ATTACHED_ENTRY) - Instance->SetAttachedEntry(GetAttachedEntry()); - - cfestring* Text = GetText(); - - if(Text) - Instance->SetText(*Text); - - const fearray >* ItemsInside = GetItemsInside(); - - if(ItemsInside) - Instance->SetItemsInside(*ItemsInside, SpecialFlags); - return Instance; +squarescript::squarescript () : INIT(EntryIndex, NO_ENTRY), INIT(AttachRequired, false) { } -squarescript::squarescript() -: INIT(EntryIndex, NO_ENTRY), - INIT(AttachRequired, false) -{ } -void squarescript::InitDataMap() -{ +void squarescript::InitDataMap () { INIT_ENTRY(Position); INIT_ENTRY(Character); INIT_ENTRY(Items); @@ -655,24 +577,18 @@ void squarescript::InitDataMap() INIT_ENTRY(AttachRequired); } -void squarescript::ReadFrom(inputfile& SaveFile) -{ + +void squarescript::ReadFrom (inputfile &SaveFile) { static festring Word; + // SaveFile.ReadWord(Word); - - if(Word != "=") - { + if (Word != "=") { PositionHolder.ReadFrom(SaveFile); - - if(SaveFile.ReadWord() != "{") - ABORT("Bracket missing in square script line %d!", SaveFile.TellLine()); - - for(SaveFile.ReadWord(Word); Word != "}"; SaveFile.ReadWord(Word)) - if(!ReadMember(SaveFile, Word)) - ABORT("Odd script term %s encountered in square script line %d!", Word.CStr(), SaveFile.TellLine()); - } - else - { + if (SaveFile.ReadWord() != "{") ABORT("Bracket missing in square script line %d!", SaveFile.TellLine()); + for (SaveFile.ReadWord(Word); Word != "}"; SaveFile.ReadWord(Word)) { + if (!ReadMember(SaveFile, Word)) ABORT("Odd script term %s encountered in square script line %d!", Word.CStr(), SaveFile.TellLine()); + } + } else { GTerrainHolder.ReadFrom(SaveFile); OTerrainHolder.ReadFrom(SaveFile); } diff --git a/src/game/script.h b/src/game/script.h index 18f0090..34b4041 100644 --- a/src/game/script.h +++ b/src/game/script.h @@ -21,39 +21,39 @@ #define SCRIPT_MEMBER(type, name)\ - public:\ +public:\ const type* Get##name() const { return name##Holder.Member; }\ - protected:\ +protected:\ scriptmember< type > name##Holder #define SCRIPT_MEMBER_WITH_BASE(type, name)\ - public:\ +public:\ const type* Get##name() const { return GetMemberOf(name##Holder, Base, &scripttype::Get##name); }\ - protected:\ +protected:\ scriptmember< type > name##Holder #define FAST_SCRIPT_MEMBER(type, name)\ - public:\ +public:\ type Get##name() const { return name##Holder.Member; }\ - protected:\ +protected:\ fastscriptmember< type > name##Holder #define SCRIPT_TRUTH(name)\ - public:\ +public:\ ctruth* name() const { return name##Holder.Member; }\ - protected:\ +protected:\ scriptmember name##Holder #define SCRIPT_TRUTH_WITH_BASE(name)\ - public:\ +public:\ ctruth* name() const { return GetMemberOf(name##Holder, Base, &scripttype::name); }\ - protected:\ +protected:\ scriptmember name##Holder #define FAST_SCRIPT_TRUTH(name)\ - public:\ +public:\ truth name() const { return name##Holder.Member; }\ - protected:\ +protected:\ fastscriptmember name##Holder @@ -100,8 +100,7 @@ template inline scriptmember& scriptmember::operator = if (Member) { if (Data.Member) { *Member = *Data.Member; - } else - { + } else { delete Member; Member = 0; } @@ -141,9 +140,9 @@ protected: }; -inline void ReadData (script& Type, inputfile &SaveFile) { Type.ReadFrom (SaveFile); } -inline outputfile &operator<< (outputfile &SaveFile, const script &Script) { Script.Save (SaveFile); return SaveFile; } -inline inputfile &operator>> (inputfile &SaveFile, script &Script) { Script.Load (SaveFile); return SaveFile; } +inline void ReadData (script &Type, inputfile &SaveFile) { Type.ReadFrom (SaveFile); } +inline outputfile &operator << (outputfile &SaveFile, const script &Script) { Script.Save (SaveFile); return SaveFile; } +inline inputfile &operator >> (inputfile &SaveFile, script &Script) { Script.Load (SaveFile); return SaveFile; } class scriptwithbase : public script { @@ -211,7 +210,7 @@ public: static void InitDataMap (); protected: - virtual const datamap& GetDataMap () const { return DataMap; } + virtual const datamap &GetDataMap () const { return DataMap; } virtual scriptmemberbase *GetData (cchar *); virtual int SearchCodeName (cfestring &) const = 0; virtual cchar *GetClassID () const = 0; @@ -224,6 +223,7 @@ protected: truth Random : 1; uShort Config; FAST_SCRIPT_MEMBER(uChar, Parameters); + festring mCode; }; @@ -251,19 +251,19 @@ protected: virtual const datamap& GetDataMap () const { return DataMap; } virtual cchar *GetClassID () const; static datamap DataMap; - SCRIPT_MEMBER (fearray >, ItemsInside); - SCRIPT_MEMBER (interval, Times); - SCRIPT_MEMBER (interval, LifeExpectancy); - FAST_SCRIPT_MEMBER (uLong, Category); - FAST_SCRIPT_MEMBER (sLong, MinPrice); - FAST_SCRIPT_MEMBER (sLong, MaxPrice); - FAST_SCRIPT_MEMBER (uChar, Team); - FAST_SCRIPT_MEMBER (uChar, SquarePosition); - FAST_SCRIPT_MEMBER (uChar, Chance); - FAST_SCRIPT_MEMBER (uChar, ConfigFlags); - FAST_SCRIPT_MEMBER (uChar, SpoilPercentage); - FAST_SCRIPT_MEMBER (char, Enchantment); - FAST_SCRIPT_TRUTH (IsActive); + SCRIPT_MEMBER(fearray >, ItemsInside); + SCRIPT_MEMBER(interval, Times); + SCRIPT_MEMBER(interval, LifeExpectancy); + FAST_SCRIPT_MEMBER(uLong, Category); + FAST_SCRIPT_MEMBER(sLong, MinPrice); + FAST_SCRIPT_MEMBER(sLong, MaxPrice); + FAST_SCRIPT_MEMBER(uChar, Team); + FAST_SCRIPT_MEMBER(uChar, SquarePosition); + FAST_SCRIPT_MEMBER(uChar, Chance); + FAST_SCRIPT_MEMBER(uChar, ConfigFlags); + FAST_SCRIPT_MEMBER(uChar, SpoilPercentage); + FAST_SCRIPT_MEMBER(char, Enchantment); + FAST_SCRIPT_TRUTH(IsActive); }; @@ -281,10 +281,10 @@ protected: virtual const datamap& GetDataMap () const { return DataMap; } virtual cchar *GetClassID () const; static datamap DataMap; - SCRIPT_MEMBER (fearray >, Inventory); - SCRIPT_MEMBER (fearray, WayPoint); - FAST_SCRIPT_MEMBER (uChar, Team); - FAST_SCRIPT_MEMBER (uChar, Flags); + SCRIPT_MEMBER(fearray >, Inventory); + SCRIPT_MEMBER(fearray, WayPoint); + FAST_SCRIPT_MEMBER(uChar, Team); + FAST_SCRIPT_MEMBER(uChar, Flags); }; @@ -298,51 +298,52 @@ protected: virtual const datamap& GetDataMap () const { return DataMap; } static datamap DataMap; virtual cchar *GetClassID () const; - SCRIPT_TRUTH (IsInside); + SCRIPT_TRUTH(IsInside); }; -template <> -class contentscript : public contentscripttemplate -{ - public: + +template <> class contentscript : public contentscripttemplate { +public: typedef contentscript scripttype; contentscript (); olterrain *Instantiate (int = 0) const; static void InitDataMap (); - protected: + +protected: virtual const datamap& GetDataMap () const { return DataMap; } static datamap DataMap; virtual cchar *GetClassID () const; - SCRIPT_MEMBER (fearray >, ItemsInside); - SCRIPT_MEMBER (festring, Text); - FAST_SCRIPT_MEMBER (uChar, VisualEffects); - FAST_SCRIPT_MEMBER (uChar, AttachedArea); - FAST_SCRIPT_MEMBER (uChar, AttachedEntry); + SCRIPT_MEMBER(fearray >, ItemsInside); + SCRIPT_MEMBER(festring, Text); + FAST_SCRIPT_MEMBER(uChar, VisualEffects); + FAST_SCRIPT_MEMBER(uChar, AttachedArea); + FAST_SCRIPT_MEMBER(uChar, AttachedEntry); }; -class squarescript : public script -{ - public: + +class squarescript : public script { +public: typedef squarescript scripttype; squarescript (); virtual void ReadFrom (inputfile &); static void InitDataMap (); - protected: + +protected: virtual const datamap& GetDataMap () const { return DataMap; } static datamap DataMap; - SCRIPT_MEMBER (posscript, Position); - SCRIPT_MEMBER (contentscript, Character); - SCRIPT_MEMBER (fearray >, Items); - SCRIPT_MEMBER (contentscript, GTerrain); - SCRIPT_MEMBER (contentscript, OTerrain); - SCRIPT_MEMBER (interval, Times); - FAST_SCRIPT_MEMBER (uChar, EntryIndex); - FAST_SCRIPT_TRUTH (AttachRequired); + SCRIPT_MEMBER(posscript, Position); + SCRIPT_MEMBER(contentscript, Character); + SCRIPT_MEMBER(fearray >, Items); + SCRIPT_MEMBER(contentscript, GTerrain); + SCRIPT_MEMBER(contentscript, OTerrain); + SCRIPT_MEMBER(interval, Times); + FAST_SCRIPT_MEMBER(uChar, EntryIndex); + FAST_SCRIPT_TRUTH(AttachRequired); }; -template > class contentmap : public script -{ - public: + +template > class contentmap : public script { +public: typedef contentmap scripttype; contentmap (); virtual ~contentmap (); @@ -351,62 +352,65 @@ template > class contentmap virtual void Save (outputfile &) const; virtual void Load (inputfile &); static void InitDataMap (); - protected: + +protected: virtual const datamap& GetDataMap () const { return DataMap; } static datamap DataMap; std::pair **ContentMap; std::map SymbolMap; - SCRIPT_MEMBER (v2, Size); - SCRIPT_MEMBER (v2, Pos); + SCRIPT_MEMBER(v2, Size); + SCRIPT_MEMBER(v2, Pos); }; + typedef contentmap > > itemcontentmap; typedef contentmap charactercontentmap; typedef contentmap glterraincontentmap; typedef contentmap olterraincontentmap; -class roomscript : public scriptwithbase -{ - public: + +class roomscript : public scriptwithbase { +public: typedef roomscript scripttype; void ReadFrom (inputfile &); const std::list& GetSquare () const; virtual void Save (outputfile &) const; virtual void Load (inputfile &); static void InitDataMap (); - protected: + +protected: virtual const datamap& GetDataMap () const { return DataMap; } static datamap DataMap; std::list Square; - SCRIPT_MEMBER_WITH_BASE (charactercontentmap, CharacterMap); - SCRIPT_MEMBER_WITH_BASE (itemcontentmap, ItemMap); - SCRIPT_MEMBER_WITH_BASE (glterraincontentmap, GTerrainMap); - SCRIPT_MEMBER_WITH_BASE (olterraincontentmap, OTerrainMap); - SCRIPT_MEMBER_WITH_BASE (squarescript, WallSquare); - SCRIPT_MEMBER_WITH_BASE (squarescript, FloorSquare); - SCRIPT_MEMBER_WITH_BASE (squarescript, DoorSquare); - SCRIPT_MEMBER_WITH_BASE (region, Size); - SCRIPT_MEMBER_WITH_BASE (region, Pos); - SCRIPT_TRUTH_WITH_BASE (AltarPossible); - SCRIPT_TRUTH_WITH_BASE (GenerateDoor); - SCRIPT_TRUTH_WITH_BASE (GenerateTunnel); - SCRIPT_MEMBER_WITH_BASE (int, DivineMaster); - SCRIPT_TRUTH_WITH_BASE (GenerateLanterns); - SCRIPT_MEMBER_WITH_BASE (int, Type); - SCRIPT_TRUTH_WITH_BASE (GenerateFountains); - SCRIPT_TRUTH_WITH_BASE (AllowLockedDoors); - SCRIPT_TRUTH_WITH_BASE (AllowBoobyTrappedDoors); - SCRIPT_MEMBER_WITH_BASE (int, Shape); - SCRIPT_TRUTH_WITH_BASE (IsInside); - SCRIPT_TRUTH_WITH_BASE (GenerateWindows); - SCRIPT_TRUTH_WITH_BASE (UseFillSquareWalls); - SCRIPT_MEMBER_WITH_BASE (uLong, Flags); + SCRIPT_MEMBER_WITH_BASE(charactercontentmap, CharacterMap); + SCRIPT_MEMBER_WITH_BASE(itemcontentmap, ItemMap); + SCRIPT_MEMBER_WITH_BASE(glterraincontentmap, GTerrainMap); + SCRIPT_MEMBER_WITH_BASE(olterraincontentmap, OTerrainMap); + SCRIPT_MEMBER_WITH_BASE(squarescript, WallSquare); + SCRIPT_MEMBER_WITH_BASE(squarescript, FloorSquare); + SCRIPT_MEMBER_WITH_BASE(squarescript, DoorSquare); + SCRIPT_MEMBER_WITH_BASE(region, Size); + SCRIPT_MEMBER_WITH_BASE(region, Pos); + SCRIPT_TRUTH_WITH_BASE(AltarPossible); + SCRIPT_TRUTH_WITH_BASE(GenerateDoor); + SCRIPT_TRUTH_WITH_BASE(GenerateTunnel); + SCRIPT_MEMBER_WITH_BASE(int, DivineMaster); + SCRIPT_TRUTH_WITH_BASE(GenerateLanterns); + SCRIPT_MEMBER_WITH_BASE(int, Type); + SCRIPT_TRUTH_WITH_BASE(GenerateFountains); + SCRIPT_TRUTH_WITH_BASE(AllowLockedDoors); + SCRIPT_TRUTH_WITH_BASE(AllowBoobyTrappedDoors); + SCRIPT_MEMBER_WITH_BASE(int, Shape); + SCRIPT_TRUTH_WITH_BASE(IsInside); + SCRIPT_TRUTH_WITH_BASE(GenerateWindows); + SCRIPT_TRUTH_WITH_BASE(UseFillSquareWalls); + SCRIPT_MEMBER_WITH_BASE(uLong, Flags); SCRIPT_TRUTH_WITH_BASE(GenerateWards); }; -class levelscript : public scriptwithbase -{ - public: + +class levelscript : public scriptwithbase { +public: typedef levelscript scripttype; void ReadFrom (inputfile &); const std::list& GetSquare () const; @@ -416,49 +420,50 @@ class levelscript : public scriptwithbase virtual void Load (inputfile &); virtual void SetBase (const scriptwithbase *); static void InitDataMap (); - protected: + +protected: virtual const datamap& GetDataMap () const { return DataMap; } static datamap DataMap; std::list Square; std::list Room; - SCRIPT_MEMBER_WITH_BASE (roomscript, RoomDefault); - SCRIPT_MEMBER_WITH_BASE (squarescript, FillSquare); - SCRIPT_MEMBER_WITH_BASE (squarescript, TunnelSquare); - SCRIPT_MEMBER_WITH_BASE (festring, LevelMessage); - SCRIPT_MEMBER_WITH_BASE (v2, Size); - SCRIPT_MEMBER_WITH_BASE (interval, Items); - SCRIPT_MEMBER_WITH_BASE (interval, Rooms); - SCRIPT_TRUTH_WITH_BASE (GenerateMonsters); - SCRIPT_TRUTH_WITH_BASE (IsOnGround); - SCRIPT_MEMBER_WITH_BASE (int, TeamDefault); - SCRIPT_MEMBER_WITH_BASE (festring, Description); - SCRIPT_MEMBER_WITH_BASE (int, LOSModifier); - SCRIPT_TRUTH_WITH_BASE (IgnoreDefaultSpecialSquares); - SCRIPT_MEMBER_WITH_BASE (int, DifficultyBase); - SCRIPT_MEMBER_WITH_BASE (int, DifficultyDelta); - SCRIPT_MEMBER_WITH_BASE (int, MonsterAmountBase); - SCRIPT_MEMBER_WITH_BASE (int, MonsterAmountDelta); - SCRIPT_MEMBER_WITH_BASE (int, MonsterGenerationIntervalBase); - SCRIPT_MEMBER_WITH_BASE (int, MonsterGenerationIntervalDelta); - SCRIPT_TRUTH_WITH_BASE (AutoReveal); - SCRIPT_MEMBER_WITH_BASE (festring, ShortDescription); - SCRIPT_TRUTH_WITH_BASE (CanGenerateBone); - SCRIPT_MEMBER_WITH_BASE (int, ItemMinPriceBase); - SCRIPT_MEMBER_WITH_BASE (int, ItemMinPriceDelta); - SCRIPT_MEMBER_WITH_BASE (int, Type); - SCRIPT_MEMBER_WITH_BASE (int, EnchantmentMinusChanceBase); - SCRIPT_MEMBER_WITH_BASE (int, EnchantmentMinusChanceDelta); - SCRIPT_MEMBER_WITH_BASE (int, EnchantmentPlusChanceBase); - SCRIPT_MEMBER_WITH_BASE (int, EnchantmentPlusChanceDelta); - SCRIPT_MEMBER_WITH_BASE (int, BackGroundType); - SCRIPT_TRUTH_WITH_BASE (IsCatacomb); - SCRIPT_MEMBER_WITH_BASE (festring, EnterImage); - SCRIPT_MEMBER_WITH_BASE (v2, EnterTextDisplacement); + SCRIPT_MEMBER_WITH_BASE(roomscript, RoomDefault); + SCRIPT_MEMBER_WITH_BASE(squarescript, FillSquare); + SCRIPT_MEMBER_WITH_BASE(squarescript, TunnelSquare); + SCRIPT_MEMBER_WITH_BASE(festring, LevelMessage); + SCRIPT_MEMBER_WITH_BASE(v2, Size); + SCRIPT_MEMBER_WITH_BASE(interval, Items); + SCRIPT_MEMBER_WITH_BASE(interval, Rooms); + SCRIPT_TRUTH_WITH_BASE(GenerateMonsters); + SCRIPT_TRUTH_WITH_BASE(IsOnGround); + SCRIPT_MEMBER_WITH_BASE(int, TeamDefault); + SCRIPT_MEMBER_WITH_BASE(festring, Description); + SCRIPT_MEMBER_WITH_BASE(int, LOSModifier); + SCRIPT_TRUTH_WITH_BASE(IgnoreDefaultSpecialSquares); + SCRIPT_MEMBER_WITH_BASE(int, DifficultyBase); + SCRIPT_MEMBER_WITH_BASE(int, DifficultyDelta); + SCRIPT_MEMBER_WITH_BASE(int, MonsterAmountBase); + SCRIPT_MEMBER_WITH_BASE(int, MonsterAmountDelta); + SCRIPT_MEMBER_WITH_BASE(int, MonsterGenerationIntervalBase); + SCRIPT_MEMBER_WITH_BASE(int, MonsterGenerationIntervalDelta); + SCRIPT_TRUTH_WITH_BASE(AutoReveal); + SCRIPT_MEMBER_WITH_BASE(festring, ShortDescription); + SCRIPT_TRUTH_WITH_BASE(CanGenerateBone); + SCRIPT_MEMBER_WITH_BASE(int, ItemMinPriceBase); + SCRIPT_MEMBER_WITH_BASE(int, ItemMinPriceDelta); + SCRIPT_MEMBER_WITH_BASE(int, Type); + SCRIPT_MEMBER_WITH_BASE(int, EnchantmentMinusChanceBase); + SCRIPT_MEMBER_WITH_BASE(int, EnchantmentMinusChanceDelta); + SCRIPT_MEMBER_WITH_BASE(int, EnchantmentPlusChanceBase); + SCRIPT_MEMBER_WITH_BASE(int, EnchantmentPlusChanceDelta); + SCRIPT_MEMBER_WITH_BASE(int, BackGroundType); + SCRIPT_TRUTH_WITH_BASE(IsCatacomb); + SCRIPT_MEMBER_WITH_BASE(festring, EnterImage); + SCRIPT_MEMBER_WITH_BASE(v2, EnterTextDisplacement); }; -class dungeonscript : public script -{ - public: + +class dungeonscript : public script { +public: typedef dungeonscript scripttype; dungeonscript (); virtual ~dungeonscript (); @@ -469,58 +474,62 @@ class dungeonscript : public script virtual void Load (inputfile &); virtual const datamap& GetDataMap () const { return DataMap; } static void InitDataMap (); - protected: + +protected: static datamap DataMap; std::map Level; std::list > RandomLevel; - SCRIPT_MEMBER (levelscript, LevelDefault); - SCRIPT_MEMBER (int, Levels); - SCRIPT_MEMBER (festring, Description); - SCRIPT_MEMBER (festring, ShortDescription); + SCRIPT_MEMBER(levelscript, LevelDefault); + SCRIPT_MEMBER(int, Levels); + SCRIPT_MEMBER(festring, Description); + SCRIPT_MEMBER(festring, ShortDescription); }; -class teamscript : public script -{ - public: + +class teamscript : public script { +public: typedef teamscript scripttype; virtual void ReadFrom (inputfile &); const std::vector >& GetRelation () const; virtual void Save (outputfile &) const; virtual void Load (inputfile &); static void InitDataMap (); - protected: + +protected: virtual const datamap& GetDataMap () const { return DataMap; } static datamap DataMap; std::vector > Relation; - SCRIPT_MEMBER (int, KillEvilness); + SCRIPT_MEMBER(int, KillEvilness); }; -class gamescript : public script -{ - public: + +class gamescript : public script { +public: typedef gamescript scripttype; virtual void ReadFrom (inputfile &); - const std::list >& GetTeam () const; - const std::map& GetDungeon () const; + const std::list > &GetTeam () const; + const std::map &GetDungeon () const; void RandomizeLevels (); virtual void Save (outputfile &) const; virtual void Load (inputfile &); static void InitDataMap (); - protected: - virtual const datamap& GetDataMap () const { return DataMap; } + +protected: + virtual const datamap &GetDataMap () const { return DataMap; } static datamap DataMap; std::list > Team; std::map Dungeon; - SCRIPT_MEMBER (int, Dungeons); - SCRIPT_MEMBER (int, Teams); + SCRIPT_MEMBER(int, Dungeons); + SCRIPT_MEMBER(int, Teams); }; -outputfile& operator<< (outputfile&, const gamescript *); -inputfile& operator>> (inputfile&, gamescript *&); -class scriptsystem -{ - public: +outputfile &operator << (outputfile &, const gamescript *); +inputfile &operator >> (inputfile &, gamescript *&); + + +class scriptsystem { +public: static void Initialize (); }; -- 2.11.4.GIT