mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
* partial support for grail digging
This commit is contained in:
parent
e6f31b7500
commit
b2aa0e5930
@ -936,6 +936,13 @@ int3 CCallback::getGrailPos( float &outKnownRatio )
|
||||
return gs->map->grailPos;
|
||||
}
|
||||
|
||||
void CCallback::dig( const CGObjectInstance *hero )
|
||||
{
|
||||
DigWithHero dwh;
|
||||
dwh.id = hero->id;
|
||||
sendRequest(&dwh);
|
||||
}
|
||||
|
||||
InfoAboutTown::InfoAboutTown()
|
||||
{
|
||||
tType = NULL;
|
||||
|
@ -127,6 +127,7 @@ public:
|
||||
virtual bool getPath2(int3 dest, CGPath &ret)=0; //uses main, client pathfinder info
|
||||
virtual void calculatePaths(const CGHeroInstance *hero, CPathsInfo &out, int3 src = int3(-1,-1,-1), int movement = -1) =0;
|
||||
virtual void recalculatePaths()=0; //updates main, client pathfinder info (should be called when moving hero is over)
|
||||
virtual void dig(const CGObjectInstance *hero)=0;
|
||||
|
||||
//map
|
||||
virtual std::vector < const CGObjectInstance * > getBlockingObjs(int3 pos)const =0;
|
||||
@ -223,6 +224,7 @@ public:
|
||||
void save(const std::string &fname);
|
||||
void sendMessage(const std::string &mess);
|
||||
void buildBoat(const IShipyard *obj);
|
||||
void dig(const CGObjectInstance *hero);
|
||||
|
||||
//get info
|
||||
bool verifyPath(CPath * path, bool blockSea) const;
|
||||
|
@ -578,7 +578,9 @@ void CTerrainRect::clickRight(tribool down, bool previousState)
|
||||
const TerrainTile * tile = LOCPLINT->cb->getTileInfo(mp);
|
||||
if (tile)
|
||||
{
|
||||
CSimpleWindow * temp = CMessage::genWindow(VLC->generaltexth->terrainNames[tile->tertype], LOCPLINT->playerID, true);
|
||||
std::string hlp;
|
||||
CGI->mh->getTerrainDescr(mp, hlp, true);
|
||||
CSimpleWindow * temp = CMessage::genWindow(hlp, LOCPLINT->playerID, true);
|
||||
CRClickPopupInt *rcpi = new CRClickPopupInt(temp,true);
|
||||
GH.pushInt(rcpi);
|
||||
}
|
||||
@ -706,7 +708,10 @@ void CTerrainRect::mouseMoved (const SDL_MouseMotionEvent & sEvent)
|
||||
}
|
||||
else
|
||||
{
|
||||
adventureInt->statusbar.clear();
|
||||
std::string hlp;
|
||||
CGI->mh->getTerrainDescr(pom, hlp, false);
|
||||
adventureInt->statusbar.print(hlp);
|
||||
//adventureInt->statusbar.clear();
|
||||
}
|
||||
|
||||
const CGPathNode *pnode = LOCPLINT->cb->getPathInfo(pom);
|
||||
|
@ -2064,8 +2064,8 @@ CHotSeatPlayers::CHotSeatPlayers(const std::string &firstPlayer)
|
||||
txt[0]->setText(firstPlayer);
|
||||
txt[0]->giveFocus();
|
||||
|
||||
ok = new AdventureMapButton(CGI->generaltexth->zelp[560], bind(&CHotSeatPlayers::enterSelectionScreen, this), 95, 338, "MUBCHCK.DEF");
|
||||
cancel = new AdventureMapButton(CGI->generaltexth->zelp[561], bind(&CGuiHandler::popIntTotally, ref(GH), this), 205, 338, "MUBCANC.DEF");
|
||||
ok = new AdventureMapButton(CGI->generaltexth->zelp[560], bind(&CHotSeatPlayers::enterSelectionScreen, this), 95, 338, "MUBCHCK.DEF", SDLK_RETURN);
|
||||
cancel = new AdventureMapButton(CGI->generaltexth->zelp[561], bind(&CGuiHandler::popIntTotally, ref(GH), this), 205, 338, "MUBCANC.DEF", SDLK_ESCAPE);
|
||||
bar = new CGStatusBar(new CPicture(Rect(7, 381, 348, 18), 0));//226, 472
|
||||
}
|
||||
|
||||
@ -2313,6 +2313,10 @@ CBonusSelection::CRegion::~CRegion()
|
||||
void CBonusSelection::CRegion::clickLeft( tribool down, bool previousState )
|
||||
{
|
||||
//select if selectable & clicked inside our graphic
|
||||
if ( indeterminate(down) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if( !down && selectable && !CSDL_Ext::isTransparent(graphics[0], GH.current->motion.x-pos.x, GH.current->motion.y-pos.y) )
|
||||
{
|
||||
owner->selectMap(myNumber);
|
||||
|
@ -116,6 +116,17 @@ void CDefObjInfoHandler::load()
|
||||
if(nobj->id==TOWNI_TYPE)
|
||||
castles[nobj->subid]=nobj;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 8 ; i++)
|
||||
{
|
||||
|
||||
static const char *holeDefs[] = {"AVLHOLD0.DEF", "AVLHLDS0.DEF", "AVLHOLG0.DEF", "AVLHLSN0.DEF",
|
||||
"AVLHOLS0.DEF", "AVLHOLR0.DEF", "AVLHOLX0.DEF", "AVLHOLL0.DEF"};
|
||||
|
||||
CGDefInfo * tmp = gobjs[124][0];
|
||||
gobjs[124][i] = gobjs[124][0];
|
||||
gobjs[124][i]->name = holeDefs[i];
|
||||
}
|
||||
}
|
||||
|
||||
CDefObjInfoHandler::~CDefObjInfoHandler()
|
||||
|
@ -1411,6 +1411,18 @@ struct MakeCustomAction : public CPackForServer
|
||||
}
|
||||
};
|
||||
|
||||
struct DigWithHero : public CPackForServer
|
||||
{
|
||||
DigWithHero(){}
|
||||
si32 id; //digging hero id
|
||||
|
||||
bool applyGh(CGameHandler *gh);
|
||||
template <typename Handler> void serialize(Handler &h, const int version)
|
||||
{
|
||||
h & id;
|
||||
}
|
||||
};
|
||||
|
||||
/***********************************************************************************************************/
|
||||
|
||||
struct SaveGame : public CPackForClient, public CPackForServer
|
||||
|
@ -574,6 +574,13 @@ DLL_EXPORT void NewObject::applyGs( CGameState *gs )
|
||||
id = o->id = gs->map->objects.size();
|
||||
o->hoverName = VLC->generaltexth->names[ID];
|
||||
|
||||
if(ID == 124) // hole
|
||||
{
|
||||
const TerrainTile &t = gs->map->getTile(pos);
|
||||
o->defInfo = VLC->dobjinfo->gobjs[ID][t.tertype];
|
||||
assert(o->defInfo);
|
||||
}
|
||||
|
||||
gs->map->objects.push_back(o);
|
||||
gs->map->addBlockVisTiles(o);
|
||||
o->initObj();
|
||||
|
@ -1264,7 +1264,7 @@ void Mapa::readTerrain( const unsigned char * bufor, int &i)
|
||||
void Mapa::readDefInfo( const unsigned char * bufor, int &i)
|
||||
{
|
||||
int defAmount = readNormalNr(bufor,i); i+=4;
|
||||
defy.reserve(defAmount);
|
||||
defy.reserve(defAmount+8);
|
||||
for (int idd = 0 ; idd<defAmount; idd++) // reading defs
|
||||
{
|
||||
CGDefInfo * vinya = new CGDefInfo(); // info about new def
|
||||
@ -1334,6 +1334,12 @@ void Mapa::readDefInfo( const unsigned char * bufor, int &i)
|
||||
|
||||
defy.push_back(vinya); // add this def to the vector
|
||||
}
|
||||
|
||||
//add holes - they always can appear
|
||||
for (int i = 0; i < 8 ; i++)
|
||||
{
|
||||
defy.push_back(VLC->dobjinfo->gobjs[124][i]);
|
||||
}
|
||||
}
|
||||
|
||||
void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "hch/CDefHandler.h"
|
||||
#include "client/CConfigHandler.h"
|
||||
#include <boost/assign/list_of.hpp>
|
||||
#include "hch/CGeneralTextHandler.h"
|
||||
|
||||
/*
|
||||
* mapHandler.cpp, part of VCMI engine
|
||||
@ -308,7 +309,14 @@ static void processDef (CGDefInfo* def)
|
||||
{
|
||||
if(def->name.size())
|
||||
{
|
||||
def->handler = CDefHandler::giveDefEss(def->name);
|
||||
if(vstd::contains(CGI->mh->loadedDefs, def->name))
|
||||
{
|
||||
def->handler = CGI->mh->loadedDefs[def->name];
|
||||
}
|
||||
else
|
||||
{
|
||||
CGI->mh->loadedDefs[def->name] = def->handler = CDefHandler::giveDefEss(def->name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -316,9 +324,11 @@ static void processDef (CGDefInfo* def)
|
||||
def->handler = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
def->width = def->handler->ourImages[0].bitmap->w/32;
|
||||
def->height = def->handler->ourImages[0].bitmap->h/32;
|
||||
}
|
||||
|
||||
CGDefInfo* pom = CGI->dobjinfo->gobjs[def->id][def->subid];
|
||||
if(pom && def->id!=TOWNI_TYPE)
|
||||
{
|
||||
@ -417,16 +427,20 @@ void CMapHandler::init()
|
||||
|
||||
|
||||
|
||||
for(size_t h=0; h<map->defy.size(); ++h) //initializing loaded def handler's info {
|
||||
CGI->mh->loadedDefs.insert(std::make_pair(map->defy[h]->name, map->defy[h]->handler));
|
||||
tlog0<<"\tCollecting loaded def's handlers: "<<th.getDif()<<std::endl;
|
||||
|
||||
prepareFOWDefs();
|
||||
roadsRiverTerrainInit(); //road's and river's DefHandlers; and simple values initialization
|
||||
borderAndTerrainBitmapInit();
|
||||
tlog0<<"\tPreparing FoW, roads, rivers,borders: "<<th.getDif()<<std::endl;
|
||||
initObjectRects();
|
||||
tlog0<<"\tMaking object rects: "<<th.getDif()<<std::endl;
|
||||
|
||||
|
||||
for (int i = 0; i < 8 ; i++)
|
||||
{
|
||||
TerrainTile2 &t = ttiles[24+i][0][0];
|
||||
tlog0 << t.objects.front().first->defInfo->name << ' ';
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Update map window screen
|
||||
@ -1324,6 +1338,23 @@ CMapHandler::CMapHandler()
|
||||
partialHide = NULL;
|
||||
}
|
||||
|
||||
void CMapHandler::getTerrainDescr( const int3 &pos, std::string & out, bool terName )
|
||||
{
|
||||
out.clear();
|
||||
TerrainTile2 &t = ttiles[pos.x][pos.y][pos.z];
|
||||
for(std::vector < std::pair<const CGObjectInstance*,SDL_Rect> >::const_iterator i = t.objects.begin(); i != t.objects.end(); i++)
|
||||
{
|
||||
if(i->first->ID == 124)
|
||||
{
|
||||
out = i->first->hoverName;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(terName)
|
||||
out = CGI->generaltexth->terrainNames[t.tileInfo->tertype];
|
||||
}
|
||||
|
||||
TerrainTile2::TerrainTile2()
|
||||
:tileInfo(0),terbitmap(0)
|
||||
{}
|
||||
|
@ -114,10 +114,10 @@ public:
|
||||
CMapHandler(); //c-tor
|
||||
~CMapHandler(); //d-tor
|
||||
|
||||
void loadDefs();
|
||||
SDL_Surface * getVisBitmap(int x, int y, const std::vector< std::vector< std::vector<unsigned char> > > & visibilityMap, int lvl);
|
||||
|
||||
std::vector< std::string > getObjDescriptions(int3 pos); //returns desriptions of objects blocking given position
|
||||
void getTerrainDescr(const int3 &pos, std::string & out, bool terName); //if tername == false => empty string when tile is clear
|
||||
CGObjectInstance * createObject(int id, int subid, int3 pos, int owner=254); //creates a new object with a certain id and subid
|
||||
bool printObject(const CGObjectInstance * obj); //puts appropriate things to ttiles, so obj will be visible on map
|
||||
bool hideObject(const CGObjectInstance * obj); //removes appropriate things from ttiles, so obj will be no longer visible on map (but still will exist)
|
||||
|
@ -3885,4 +3885,23 @@ void CGameHandler::getLossVicMessage( ui8 player, ui8 standard, bool victory, In
|
||||
out.text.addTxt(MetaString::GENERAL_TXT, 660); //All your forces have been defeated, and you are banished from this land!
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CGameHandler::dig( const CGHeroInstance *h )
|
||||
{
|
||||
for (std::vector<CGObjectInstance*>::const_iterator i = gs->map->objects.begin(); i != gs->map->objects.end(); i++) //unflag objs
|
||||
{
|
||||
if((*i)->ID == 124 && (*i)->pos == h->getPosition(false))
|
||||
{
|
||||
complain("Cannot dig - there is already a hole under the hero!");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
NewObject no;
|
||||
no.ID = 124;
|
||||
no.pos = h->getPosition(false);
|
||||
no.subID = 0;
|
||||
sendAndApply(&no);
|
||||
return true;
|
||||
}
|
@ -179,6 +179,7 @@ public:
|
||||
bool complain(const std::string &problem); //sends message to all clients, prints on the logs and return true
|
||||
void objectVisited( const CGObjectInstance * obj, const CGHeroInstance * h );
|
||||
void engageIntoBattle( ui8 player );
|
||||
bool dig(const CGHeroInstance *h);
|
||||
|
||||
template <typename Handler> void serialize(Handler &h, const int version)
|
||||
{
|
||||
|
@ -154,6 +154,12 @@ bool MakeCustomAction::applyGh( CGameHandler *gh )
|
||||
return gh->makeCustomAction(ba);
|
||||
}
|
||||
|
||||
bool DigWithHero::applyGh( CGameHandler *gh )
|
||||
{
|
||||
ERROR_IF_NOT_OWNS(id);
|
||||
return gh->dig(gh->getHero(id));
|
||||
}
|
||||
|
||||
bool PlayerMessage::applyGh( CGameHandler *gh )
|
||||
{
|
||||
if(gh->getPlayerAt(c) != player) ERROR_AND_RETURN;
|
||||
|
Loading…
Reference in New Issue
Block a user