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:
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user