1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-17 00:07:41 +02:00

Entities redesign and a few ERM features

* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
This commit is contained in:
AlexVinS
2018-03-17 17:58:30 +03:00
committed by AlexVinS
parent 11bb46780a
commit ecaa9f5d0b
475 changed files with 22491 additions and 7123 deletions

View File

@ -33,14 +33,14 @@ DLL_LINKAGE void SetResources::applyGs(CGameState *gs)
{
assert(player < PlayerColor::PLAYER_LIMIT);
if(abs)
gs->getPlayer(player)->resources = res;
gs->getPlayerState(player)->resources = res;
else
gs->getPlayer(player)->resources += res;
gs->getPlayerState(player)->resources += res;
//just ensure that player resources are not negative
//server is responsible to check if player can afford deal
//but events on server side are allowed to take more than player have
gs->getPlayer(player)->resources.positive();
gs->getPlayerState(player)->resources.positive();
}
DLL_LINKAGE void SetPrimSkill::applyGs(CGameState *gs)
@ -206,7 +206,7 @@ DLL_LINKAGE void FoWChange::applyGs(CGameState *gs)
DLL_LINKAGE void SetAvailableHeroes::applyGs(CGameState *gs)
{
PlayerState *p = gs->getPlayer(player);
PlayerState *p = gs->getPlayerState(player);
p->availableHeroes.clear();
for (int i = 0; i < GameConstants::AVAILABLE_HEROES_PER_PLAYER; i++)
@ -227,7 +227,7 @@ DLL_LINKAGE void GiveBonus::applyGs(CGameState *gs)
cbsn = gs->getHero(ObjectInstanceID(id));
break;
case PLAYER:
cbsn = gs->getPlayer(PlayerColor(id));
cbsn = gs->getPlayerState(PlayerColor(id));
break;
case TOWN:
cbsn = gs->getTown(ObjectInstanceID(id));
@ -288,14 +288,14 @@ DLL_LINKAGE void ChangeObjectVisitors::applyGs(CGameState *gs)
switch (mode) {
case VISITOR_ADD:
gs->getHero(hero)->visitedObjects.insert(object);
gs->getPlayer(gs->getHero(hero)->tempOwner)->visitedObjects.insert(object);
gs->getPlayerState(gs->getHero(hero)->tempOwner)->visitedObjects.insert(object);
break;
case VISITOR_ADD_TEAM:
{
TeamState *ts = gs->getPlayerTeam(gs->getHero(hero)->tempOwner);
for (auto & color : ts->players)
{
gs->getPlayer(color)->visitedObjects.insert(object);
gs->getPlayerState(color)->visitedObjects.insert(object);
}
}
break;
@ -322,7 +322,7 @@ DLL_LINKAGE void ChangeObjectVisitors::applyGs(CGameState *gs)
DLL_LINKAGE void PlayerEndsGame::applyGs(CGameState *gs)
{
PlayerState *p = gs->getPlayer(player);
PlayerState *p = gs->getPlayerState(player);
if(victoryLossCheckResult.victory())
{
p->status = EPlayerStatus::WINNER;
@ -368,7 +368,7 @@ DLL_LINKAGE void RemoveBonus::applyGs(CGameState *gs)
if (who == HERO)
node = gs->getHero(ObjectInstanceID(whoID));
else
node = gs->getPlayer(PlayerColor(whoID));
node = gs->getPlayerState(PlayerColor(whoID));
BonusList &bonuses = node->getExportedBonusList();
@ -395,7 +395,7 @@ DLL_LINKAGE void RemoveObject::applyGs(CGameState *gs)
if(obj->ID==Obj::HERO)
{
CGHeroInstance *h = static_cast<CGHeroInstance*>(obj);
PlayerState *p = gs->getPlayer(h->tempOwner);
PlayerState *p = gs->getPlayerState(h->tempOwner);
gs->map->heroesOnMap -= h;
p->heroes -= h;
h->detachFrom(h->whereShouldBeAttached(gs));
@ -642,7 +642,7 @@ DLL_LINKAGE void HeroRecruited::applyGs(CGameState *gs)
assert(vstd::contains(gs->hpool.heroesPool, hid));
CGHeroInstance *h = gs->hpool.heroesPool[hid];
CGTownInstance *t = gs->getTown(tid);
PlayerState *p = gs->getPlayer(player);
PlayerState *p = gs->getPlayerState(player);
assert(!h->boat);
@ -684,14 +684,14 @@ DLL_LINKAGE void GiveHero::applyGs(CGameState *gs)
//bonus system
h->detachFrom(&gs->globalEffects);
h->attachTo(gs->getPlayer(player));
h->appearance = VLC->objtypeh->getHandlerFor(Obj::HERO, h->type->heroClass->id)->getTemplates().front();
h->attachTo(gs->getPlayerState(player));
h->appearance = VLC->objtypeh->getHandlerFor(Obj::HERO, h->type->heroClass->getIndex())->getTemplates().front();
gs->map->removeBlockVisTiles(h,true);
h->setOwner(player);
h->movement = h->maxMovePoints(true);
gs->map->heroesOnMap.push_back(h);
gs->getPlayer(h->getOwner())->heroes.push_back(h);
gs->getPlayerState(h->getOwner())->heroes.push_back(h);
gs->map->addBlockVisTiles(h);
h->inTownGarrison = false;
}
@ -707,7 +707,7 @@ DLL_LINKAGE void NewObject::applyGs(CGameState *gs)
testObject.appearance = VLC->objtypeh->getHandlerFor(ID, subID)->getTemplates(ETerrainType::WATER).front();
const int3 previousXAxisTile = int3(pos.x - 1, pos.y, pos.z);
assert(gs->isInTheMap(previousXAxisTile) && (testObject.visitablePos() == previousXAxisTile));
assert(gs->isInTheMap(previousXAxisTile) && (testObject.visitablePos() == previousXAxisTile));
}
else
{
@ -1031,7 +1031,7 @@ DLL_LINKAGE void EraseArtifact::applyGs(CGameState *gs)
auto slot = al.getSlot();
if(slot->locked)
{
logGlobal->debug("Erasing locked artifact: %s", slot->artifact->artType->Name());
logGlobal->debug("Erasing locked artifact: %s", slot->artifact->artType->getName());
DisassembledArtifact dis;
dis.al.artHolder = al.artHolder;
auto aset = al.getHolderArtSet();
@ -1051,12 +1051,12 @@ DLL_LINKAGE void EraseArtifact::applyGs(CGameState *gs)
}
}
assert(found && "Failed to determine the assembly this locked artifact belongs to");
logGlobal->debug("Found the corresponding assembly: %s", dis.al.getSlot()->artifact->artType->Name());
logGlobal->debug("Found the corresponding assembly: %s", dis.al.getSlot()->artifact->artType->getName());
dis.applyGs(gs);
}
else
{
logGlobal->debug("Erasing artifact %s", slot->artifact->artType->Name());
logGlobal->debug("Erasing artifact %s", slot->artifact->artType->getName());
}
al.removeArtifact();
}
@ -1188,7 +1188,7 @@ DLL_LINKAGE void NewTurn::applyGs(CGameState *gs)
for(auto i = res.cbegin(); i != res.cend(); i++)
{
assert(i->first < PlayerColor::PLAYER_LIMIT);
gs->getPlayer(i->first)->resources = i->second;
gs->getPlayerState(i->first)->resources = i->second;
}
for(auto creatureSet : cres) //set available creatures in towns
@ -1237,10 +1237,10 @@ DLL_LINKAGE void SetObjectProperty::applyGs(CGameState *gs)
{
CGTownInstance *t = static_cast<CGTownInstance*>(obj);
if(t->tempOwner < PlayerColor::PLAYER_LIMIT)
gs->getPlayer(t->tempOwner)->towns -= t;
gs->getPlayerState(t->tempOwner)->towns -= t;
if(val < PlayerColor::PLAYER_LIMIT_I)
{
PlayerState * p = gs->getPlayer(PlayerColor(val));
PlayerState * p = gs->getPlayerState(PlayerColor(val));
p->towns.push_back(t);
//reset counter before NewTurn to avoid no town message if game loaded at turn when one already captured
@ -1389,6 +1389,16 @@ void BattleResult::applyGs(CGameState *gs)
gs->curB.dellNull();
}
DLL_LINKAGE void BattleLogMessage::applyGs(CGameState *gs)
{
//nothing
}
DLL_LINKAGE void BattleLogMessage::applyBattle(IBattleState * battleState)
{
//nothing
}
DLL_LINKAGE void BattleStackMoved::applyGs(CGameState *gs)
{
applyBattle(gs->curB);
@ -1445,7 +1455,7 @@ DLL_LINKAGE void StartAction::applyGs(CGameState *gs)
}
else
{
gs->curB->sides[ba.side].usedSpellsHistory.push_back(SpellID(ba.actionSubtype).toSpell());
gs->curB->sides[ba.side].usedSpellsHistory.push_back(SpellID(ba.actionSubtype));
}
switch(ba.actionType)
@ -1532,6 +1542,9 @@ DLL_LINKAGE void BattleUnitsChanged::applyBattle(IBattleState * battleState)
case BattleChanges::EOperation::ADD:
battleState->addUnit(elem.id, elem.data);
break;
case BattleChanges::EOperation::UPDATE:
battleState->updateUnit(elem.id, elem.data);
break;
default:
logNetwork->error("Unknown unit operation %d", (int)elem.operation);
break;
@ -1644,8 +1657,8 @@ DLL_LINKAGE void PlayerCheated::applyGs(CGameState *gs)
if(!player.isValidPlayer())
return;
gs->getPlayer(player)->enteredLosingCheatCode = losingCheatCode;
gs->getPlayer(player)->enteredWinningCheatCode = winningCheatCode;
gs->getPlayerState(player)->enteredLosingCheatCode = losingCheatCode;
gs->getPlayerState(player)->enteredWinningCheatCode = winningCheatCode;
}
DLL_LINKAGE void YourTurn::applyGs(CGameState *gs)
@ -1660,3 +1673,9 @@ DLL_LINKAGE Component::Component(const CStackBasicDescriptor &stack)
: id(CREATURE), subtype(stack.type->idNumber), val(stack.count), when(0)
{
}
DLL_LINKAGE void EntitiesChanged::applyGs(CGameState * gs)
{
for(const auto & change : changes)
gs->updateEntity(change.metatype, change.entityIndex, change.data);
}