1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-27 22:49:25 +02:00

Update for previous rev. Support for synchronous building demolition.

This commit is contained in:
DjWarmonger
2009-09-22 14:27:46 +00:00
parent 1f92b2af2c
commit 7c2b54844f
7 changed files with 65 additions and 6 deletions

View File

@@ -208,6 +208,19 @@ void NewStructures::applyCl( CClient *cl )
cl->playerint[town->tempOwner]->buildChanged(town,id,1); cl->playerint[town->tempOwner]->buildChanged(town,id,1);
} }
} }
void RazeStructures::applyCl (CClient *cl)
{
CGTownInstance *town = GS(cl)->getTown(tid);
BOOST_FOREACH(si32 id, bid)
{
if (id == 13) //fort or capitol
{
town->defInfo = GS(cl)->forts[town->subID];
}
if(vstd::contains (cl->playerint,town->tempOwner))
cl->playerint[town->tempOwner]->buildChanged (town,id,2);
}
}
void SetAvailableCreatures::applyCl( CClient *cl ) void SetAvailableCreatures::applyCl( CClient *cl )
{ {

View File

@@ -1553,6 +1553,7 @@ void CGTownInstance::onHeroVisit(const CGHeroInstance * h) const
else else
{ {
cb->setOwner(id, h->tempOwner); cb->setOwner(id, h->tempOwner);
removeCapitols (h->getOwner(), true);
} }
} }
cb->heroVisitCastle(id, h->id); cb->heroVisitCastle(id, h->id);
@@ -1618,11 +1619,16 @@ void CGTownInstance::removeCapitols (ui8 owner, bool me) const
{ {
if (me) if (me)
{ {
cb->gameState()->getTown(id)->builtBuildings.erase(13); //destroy local capitol RazeStructures rs;
rs.tid = id;
rs.bid.insert(13);
si16 builded = destroyed;
cb->sendAndApply(&rs);
//cb->gameState()->getTown(id)->builtBuildings.erase(13); //destroy local capitol
return; return;
} }
else else
(*i)->builtBuildings.erase(13); //destroy all other capitols (*i)->builtBuildings.erase(13); //destroy all other capitols at the beginning of game
} }
} }
} }

View File

@@ -442,7 +442,7 @@ struct NewStructures : public CPackForClient //504
{ {
NewStructures(){type = 504;}; NewStructures(){type = 504;};
void applyCl(CClient *cl); void applyCl(CClient *cl);
DLL_EXPORT void applyGs(CGameState *gs); DLL_EXPORT virtual void applyGs(CGameState *gs);
si32 tid; si32 tid;
std::set<si32> bid; std::set<si32> bid;
@@ -452,7 +452,18 @@ struct NewStructures : public CPackForClient //504
{ {
h & tid & bid & builded; h & tid & bid & builded;
} }
}; };
struct RazeStructures : public NewStructures //505
{
RazeStructures() {type = 505;};
void applyCl (CClient *cl);
DLL_EXPORT void applyGs(CGameState *gs);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & tid & bid & builded;
}
};
struct SetAvailableCreatures : public CPackForClient //506 struct SetAvailableCreatures : public CPackForClient //506
{ {
SetAvailableCreatures(){type = 506;}; SetAvailableCreatures(){type = 506;};
@@ -1145,7 +1156,13 @@ struct BuildStructure : public CPackForServer
h & tid & bid; h & tid & bid;
} }
}; };
struct RazeStructure : public BuildStructure
{
RazeStructure(){};
//RazeStructure(si32 TID, si32 BID):bid(BID),tid(TID){};
bool applyGh(CGameHandler *gh);
};
struct RecruitCreatures : public CPackForServer struct RecruitCreatures : public CPackForServer
{ {
RecruitCreatures(){}; RecruitCreatures(){};

View File

@@ -352,7 +352,15 @@ DLL_EXPORT void NewStructures::applyGs( CGameState *gs )
} }
t->builded = builded; t->builded = builded;
} }
DLL_EXPORT void RazeStructures::applyGs( CGameState *gs )
{
CGTownInstance *t = gs->getTown(tid);
BOOST_FOREACH(si32 id,bid)
{
t->builtBuildings.erase(id);
}
t->destroyed = builded; //yeaha
}
DLL_EXPORT void SetAvailableCreatures::applyGs( CGameState *gs ) DLL_EXPORT void SetAvailableCreatures::applyGs( CGameState *gs )
{ {
CGDwelling *dw = dynamic_cast<CGDwelling*>(gs->map->objects[tid]); CGDwelling *dw = dynamic_cast<CGDwelling*>(gs->map->objects[tid]);

View File

@@ -80,6 +80,7 @@ void registerTypes2(Serializer &s)
s.template registerType<TryMoveHero>(); s.template registerType<TryMoveHero>();
s.template registerType<SetGarrisons>(); s.template registerType<SetGarrisons>();
s.template registerType<NewStructures>(); s.template registerType<NewStructures>();
s.template registerType<RazeStructures>();
s.template registerType<SetAvailableCreatures>(); s.template registerType<SetAvailableCreatures>();
s.template registerType<SetHeroesInTown>(); s.template registerType<SetHeroesInTown>();
s.template registerType<SetHeroArtifacts>(); s.template registerType<SetHeroArtifacts>();

View File

@@ -1984,7 +1984,7 @@ bool CGameHandler::buildStructure( si32 tid, si32 bid )
if(gs->canBuildStructure(t,bid) != 7) if(gs->canBuildStructure(t,bid) != 7)
{ {
complain("Cannot build that building!"); complain("Cannot raze that building!");
return false; return false;
} }
@@ -2035,6 +2035,19 @@ bool CGameHandler::buildStructure( si32 tid, si32 bid )
return true; return true;
} }
bool CGameHandler::razeStructure (si32 tid, si32 bid)
{
///incomplete, simply erases target building
CGTownInstance * t = static_cast<CGTownInstance*>(gs->map->objects[tid]);
if (t->builtBuildings.find(bid) == t->builtBuildings.end())
return false;
RazeStructures rs;
rs.tid = tid;
rs.bid.insert(bid);
rs.builded = t->destroyed + 1; //define TRUE FALSE?
sendAndApply(&rs);
return true;
}
void CGameHandler::sendMessageToAll( const std::string &message ) void CGameHandler::sendMessageToAll( const std::string &message )
{ {

View File

@@ -153,6 +153,7 @@ public:
bool upgradeCreature( ui32 objid, ui8 pos, ui32 upgID ); bool upgradeCreature( ui32 objid, ui8 pos, ui32 upgID );
bool recruitCreatures(si32 objid, ui32 crid, ui32 cram); bool recruitCreatures(si32 objid, ui32 crid, ui32 cram);
bool buildStructure(si32 tid, si32 bid); bool buildStructure(si32 tid, si32 bid);
bool razeStructure(si32 tid, si32 bid);
bool disbandCreature( si32 id, ui8 pos ); bool disbandCreature( si32 id, ui8 pos );
bool arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2, si32 val ); bool arrangeStacks( si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2, si32 val );
void save(const std::string &fname); void save(const std::string &fname);