1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Slowly recovering object scripts.

This commit is contained in:
Michał W. Urbańczyk 2008-07-30 17:51:19 +00:00
parent add34b26ed
commit b4f383f196
20 changed files with 1068 additions and 858 deletions

View File

@ -8,7 +8,6 @@
#include "mapHandler.h"
#include "CGameState.h"
#include "CPlayerInterface.h"
#include "CLua.h"
#include "hch/CGeneralTextHandler.h"
#include "CAdvmapInterface.h"
#include "CPlayerInterface.h"
@ -99,8 +98,8 @@ bool CCallback::moveHero(int ID, CPath * path, int idtype, int pathType)
void CCallback::selectionMade(int selection, int asker)
{
//todo - jak bedzie multiplayer po sieci, to moze wymagac przerobek zaleznych od obranego modelu
IChosen * ask = (IChosen *)asker;
ask->chosen(selection);
//IChosen * ask = (IChosen *)asker;
//ask->chosen(selection);
}
void CCallback::recruitCreatures(const CGObjectInstance *obj, int ID, int amount)
{
@ -295,19 +294,8 @@ int CCallback::getDate(int mode)
std::vector < std::string > CCallback::getObjDescriptions(int3 pos)
{
std::vector<std::string> ret;
//BOOST_FOREACH(const CGObjectInstance * obj, gs->map->terrain[i][j]
//{
// if( (5-(objs[g].first->pos.y-pos.y)) >= 0 && (5-(objs[g].first->pos.y-pos.y)) < 6 && (objs[g].first->pos.x-pos.x) >= 0 && (objs[g].first->pos.x-pos.x)<7 && objs[g].first->defInfo &&
// (((objs[g].first->defInfo->blockMap[5-(objs[g].first->pos.y-pos.y)])>>((objs[g].first->pos.x-pos.x)))&1)==0
// ) //checking position blocking
// {
// //unsigned char * blm = objs[g].first->defInfo->blockMap;
// if (objs[g].first->state)
// ret.push_back(objs[g].first->state->hoverText(objs[g].first));
// else
// ret.push_back(CGI->objh->objects[objs[g].first->ID].name);
// }
//}
BOOST_FOREACH(const CGObjectInstance * obj, gs->map->terrain[pos.x][pos.y][pos.z].blockingObjects)
ret.push_back(obj->hoverName);
return ret;
}
bool CCallback::verifyPath(CPath * path, bool blockSea)
@ -646,250 +634,4 @@ bool CCallback::battleIsStackMine(int ID)
return CGI->state->curB->stacks[h]->owner == player;
}
return false;
}
int3 CScriptCallback::getPos(CGObjectInstance * ob)
{
return ob->pos;
}
void CScriptCallback::changePrimSkill(int ID, int which, int val)
{
CGHeroInstance * hero = gs->map->getHero(ID,0);
if (which<PRIMARY_SKILLS)
{
hero->primSkills[which]+=val;
cl->playerint[hero->getOwner()]->heroPrimarySkillChanged(hero, which, val);
}
else if (which==4)
{
hero->exp+=val;
if(hero->exp >= CGI->heroh->reqExp(hero->level+1)) //new level
{
hero->level++;
std::cout << hero->name <<" got level "<<hero->level<<std::endl;
int r = rand()%100, pom=0, x=0;
int std::pair<int,int>::*g = (hero->level>9) ? (&std::pair<int,int>::second) : (&std::pair<int,int>::first);
for(;x<PRIMARY_SKILLS;x++)
{
pom += hero->type->heroClass->primChance[x].*g;
if(r<pom)
break;
}
std::cout << "Bohater dostaje umiejetnosc pierwszorzedna " << x << " (wynik losowania "<<r<<")"<<std::endl;
hero->primSkills[x]++;
//TODO: dac dwie umiejetnosci 2-rzedne to wyboru
}
//TODO - powiadomic interfejsy, sprawdzic czy nie ma awansu itp
}
}
int CScriptCallback::getHeroOwner(int heroID)
{
CGHeroInstance * hero = CGI->state->map->getHero(heroID,0);
return hero->getOwner();
}
void CScriptCallback::showInfoDialog(int player, std::string text, std::vector<SComponent*> * components)
{
//TODO: upewniac sie ze mozemy to zrzutowac (przy customowych interfejsach cos moze sie kopnac)
if (player>=0)
{
CGameInterface * temp = cl->playerint[player];
if (temp->human)
((CPlayerInterface*)(temp))->showInfoDialog(text,*components);
return;
}
else
{
typedef std::pair<const ui8, CGameInterface*> intf;
BOOST_FOREACH(intf & i, cl->playerint)
{
if (i.second->human)
((CPlayerInterface*)(i.second))->showInfoDialog(text,*components);
}
}
}
void CScriptCallback::showSelDialog(int player, std::string text, std::vector<CSelectableComponent*>*components, IChosen * asker)
{
CGameInterface * temp = cl->playerint[player];
if (temp->human)
((CPlayerInterface*)(temp))->showSelDialog(text,*components,(int)asker);
return;
}
int CScriptCallback::getSelectedHero()
{
int ret;
if (LOCPLINT->adventureInt->selection.type == HEROI_TYPE)
ret = ((CGHeroInstance*)(LOCPLINT->adventureInt->selection.selected))->subID;
else
ret = -1;;
return ret;
}
int CScriptCallback::getDate(int mode)
{
int temp;
switch (mode)
{
case 0:
return gs->day;
break;
case 1:
temp = (gs->day)%7;
if (temp)
return temp;
else return 7;
break;
case 2:
temp = ((gs->day-1)/7)+1;
if (!(temp%4))
return 4;
else
return (temp%4);
break;
case 3:
return ((gs->day-1)/28)+1;
break;
}
return 0;
}
void CScriptCallback::giveResource(int player, int which, int val)
{
gs->players[player].resources[which]+=val;
cl->playerint[player]->receivedResource(which,val);
}
void CScriptCallback::showCompInfo(int player, SComponent * comp)
{
CPlayerInterface * i = dynamic_cast<CPlayerInterface*>(cl->playerint[player]);
if(i)
i->showComp(*comp);
}
void CScriptCallback::heroVisitCastle(CGObjectInstance * ob, int heroID)
{
CGTownInstance * n;
if(n = dynamic_cast<CGTownInstance*>(ob))
{
n->visitingHero = CGI->state->map->getHero(heroID,0);
gs->map->getHero(heroID,0)->visitedTown = n;
cl->playerint[getHeroOwner(heroID)]->heroVisitsTown(CGI->state->map->getHero(heroID,0),n);
}
else
return;
}
void CScriptCallback::stopHeroVisitCastle(CGObjectInstance * ob, int heroID)
{
CGTownInstance * n;
if(n = dynamic_cast<CGTownInstance*>(ob))
{
CGI->state->map->getHero(heroID,0)->visitedTown = NULL;
if(n->visitingHero && n->visitingHero->type->ID == heroID)
n->visitingHero = NULL;
return;
}
else
return;
}
void CScriptCallback::giveHeroArtifact(int artid, int hid, int position) //pos==-1 - first free slot in backpack
{
CGHeroInstance* h = gs->map->getHero(hid,0);
if(position<0)
{
for(int i=0;i<h->artifacts.size();i++)
{
if(!h->artifacts[i])
{
h->artifacts[i] = artid;
return;
}
}
h->artifacts.push_back(artid);
return;
}
else
{
if(h->artifWorn[position]) //slot is occupied
{
giveHeroArtifact(h->artifWorn[position],hid,-1);
}
h->artifWorn[position] = artid;
}
}
void CScriptCallback::startBattle(CCreatureSet * army1, CCreatureSet * army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2) //use hero=NULL for no hero
{
gs->battle(army1,army2,tile,hero1,hero2);
}
void CScriptCallback::startBattle(int heroID, CCreatureSet * army, int3 tile) //for hero<=>neutral army
{
CGHeroInstance* h = gs->map->getHero(heroID,0);
gs->battle(&h->army,army,tile,h,NULL);
}
void CLuaCallback::registerFuncs(lua_State * L)
{
// lua_newtable(L);
//
//#define REGISTER_C_FUNC(x) \
// lua_pushstring(L, #x); \
// lua_pushcfunction(L, x); \
// lua_rawset(L, -3)
//
// REGISTER_C_FUNC(getPos);
// REGISTER_C_FUNC(changePrimSkill);
// REGISTER_C_FUNC(getGnrlText);
// REGISTER_C_FUNC(getSelectedHero);
//
// lua_setglobal(L, "vcmi");
// #undef REGISTER_C_FUNC
}
int CLuaCallback::getPos(lua_State * L)//(CGObjectInstance * object);
{
//const int args = lua_gettop(L); // number of arguments
//if ((args < 1) || !lua_isnumber(L, 1) )
// luaL_error(L,
// "Incorrect arguments to getPos([Object address])");
//CGObjectInstance * object = (CGObjectInstance *)(lua_tointeger(L, 1));
//lua_pushinteger(L,object->pos.x);
//lua_pushinteger(L,object->pos.y);
//lua_pushinteger(L,object->pos.z);
return 3;
}
int CLuaCallback::changePrimSkill(lua_State * L)//(int ID, int which, int val);
{
//const int args = lua_gettop(L); // number of arguments
//if ((args < 1) || !lua_isnumber(L, 1) ||
// ((args >= 2) && !lua_isnumber(L, 2)) ||
// ((args >= 3) && !lua_isnumber(L, 3)) )
//{
// luaL_error(L,
// "Incorrect arguments to changePrimSkill([Hero ID], [Which Primary skill], [Change by])");
//}
//int ID = lua_tointeger(L, 1),
// which = lua_tointeger(L, 2),
// val = lua_tointeger(L, 3);
//CScriptCallback::changePrimSkill(ID,which,val);
return 0;
}
int CLuaCallback::getGnrlText(lua_State * L) //(int which),returns string
{
//const int args = lua_gettop(L); // number of arguments
//if ((args < 1) || !lua_isnumber(L, 1) )
// luaL_error(L,
// "Incorrect arguments to getGnrlText([Text ID])");
//int which = lua_tointeger(L,1);
//lua_pushstring(L,CGI->generaltexth->allTexts[which].c_str());
return 1;
}
int CLuaCallback::getSelectedHero(lua_State * L) //(),returns int (ID of hero, -1 if no hero is seleceted)
{
//int ret;
//if (LOCPLINT->adventureInt->selection.type == HEROI_TYPE)
// ret = ((CGHeroInstance*)(LOCPLINT->adventureInt->selection.selected))->subID;
//else
// ret = -1;
//lua_pushinteger(L,ret);
return 1;
}
}

View File

@ -152,46 +152,4 @@ public:
//friends
friend class CClient;
};
class CScriptCallback
{
CScriptCallback(){};
public:
CGameState * gs;
CClient *cl;
//get info
static int3 getPos(CGObjectInstance * ob);
int getHeroOwner(int heroID);
int getSelectedHero();
int getDate(int mode=0);
//do sth
void changePrimSkill(int ID, int which, int val);
void showInfoDialog(int player, std::string text, std::vector<SComponent*> * components); //TODO: obslugiwac nulle
void showSelDialog(int player, std::string text, std::vector<CSelectableComponent*>*components, IChosen * asker);
void giveResource(int player, int which, int val);
void showCompInfo(int player, SComponent * comp);
void heroVisitCastle(CGObjectInstance * ob, int heroID);
void stopHeroVisitCastle(CGObjectInstance * ob, int heroID);
void giveHeroArtifact(int artid, int hid, int position); //pos==-1 - first free slot in backpack
void startBattle(CCreatureSet * army1, CCreatureSet * army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2); //use hero=NULL for no hero
void startBattle(int heroID, CCreatureSet * army, int3 tile); //for hero<=>neutral army
//friends
friend class CGameState;
friend class CClient;
};
class CLuaCallback : public CScriptCallback
{
private:
static void registerFuncs(lua_State * L);
static int getPos(lua_State * L);//(CGObjectInstance * object);
static int changePrimSkill(lua_State * L);//(int ID, int which, int val);
static int getGnrlText(lua_State * L);//(int ID, int which, int val);
static int getSelectedHero(lua_State * L);//()
friend class CGameState;
friend class CClient;
};
#endif //CCALLBACK_H

View File

@ -3,10 +3,6 @@
#include <queue>
#include <fstream>
#include "CGameState.h"
#include "CGameInterface.h"
#include "CPlayerInterface.h"
#include "SDL_Extensions.h"
#include "CBattleInterface.h" //for CBattleHex
#include <boost/random/linear_congruential.hpp>
#include "hch/CDefObjInfoHandler.h"
#include "hch/CArtHandler.h"
@ -17,14 +13,10 @@
#include "lib/VCMI_Lib.h"
#include "map.h"
#include "StartInfo.h"
#include "CLua.h"
#include "CCallback.h"
#include "CLuaHandler.h"
#include "lib/NetPacks.h"
#include <boost/foreach.hpp>
#include <boost/thread.hpp>
#include <boost/thread/shared_mutex.hpp>
boost::rand48 ran;
class CMP_stack
{
@ -143,6 +135,28 @@ void CGameState::apply(IPack * pack)
players[h->getOwner()].fogOfWarMap[t.x][t.y][t.z] = 1;
break;
}
case 1001://set object property
{
SetObjectProperty *p = static_cast<SetObjectProperty*>(pack);
int CGObjectInstance::*point;
switch(p->what)
{
case 1:
point = &CGObjectInstance::tempOwner;
break;
case 2:
point = &CGObjectInstance::blockVisit;
break;
}
map->objects[p->id]->*point = p->val;
break;
}
//case 1002://set hover name
// {
// SetHoverName * shn = static_cast<SetHoverName*>(pack);
// map->objects[shn->id]->hoverName = toString(shn->name);
// break;
// }
}
mx->unlock();
}
@ -395,18 +409,6 @@ CGameState::~CGameState()
{
delete mx;
}
bool CGameState::checkFunc(int obid, std::string name)
{
if (objscr.find(obid)!=objscr.end())
{
if(objscr[obid].find(name)!=objscr[obid].end())
{
return true;
}
}
return false;
}
void CGameState::init(StartInfo * si, Mapa * map, int Seed)
{
day = 0;
@ -441,6 +443,7 @@ void CGameState::init(StartInfo * si, Mapa * map, int Seed)
randomizeObject(map->objects[no]);
if(map->objects[no]->ID==26)
map->objects[no]->defInfo->handler=NULL;
map->objects[no]->hoverName = VLC->objh->names[map->objects[no]->ID];
}
//std::cout<<"\tRandomizing objects: "<<th.getDif()<<std::endl;
@ -651,67 +654,6 @@ void CGameState::init(StartInfo * si, Mapa * map, int Seed)
}
}
}
///****************************SCRIPTS************************************************/
//std::map<int, std::map<std::string, CObjectScript*> > * skrypty = &objscr; //alias for easier access
///****************************C++ OBJECT SCRIPTS************************************************/
//std::map<int,CCPPObjectScript*> scripts;
//CScriptCallback * csc = new CScriptCallback();
//csc->gs = this;
//handleCPPObjS(&scripts,new CVisitableOPH(csc));
//handleCPPObjS(&scripts,new CVisitableOPW(csc));
//handleCPPObjS(&scripts,new CPickable(csc));
//handleCPPObjS(&scripts,new CMines(csc));
//handleCPPObjS(&scripts,new CTownScript(csc));
//handleCPPObjS(&scripts,new CHeroScript(csc));
//handleCPPObjS(&scripts,new CMonsterS(csc));
//handleCPPObjS(&scripts,new CCreatureGen(csc));
////created map
///****************************LUA OBJECT SCRIPTS************************************************/
//std::vector<std::string> * lf = CLuaHandler::searchForScripts("scripts/lua/objects"); //files
//for (int i=0; i<lf->size(); i++)
//{
// try
// {
// std::vector<std::string> * temp = CLuaHandler::functionList((*lf)[i]);
// CLuaObjectScript * objs = new CLuaObjectScript((*lf)[i]);
// CLuaCallback::registerFuncs(objs->is);
// //objs
// for (int j=0; j<temp->size(); j++)
// {
// int obid ; //obj ID
// int dspos = (*temp)[j].find_first_of('_');
// obid = atoi((*temp)[j].substr(dspos+1,(*temp)[j].size()-dspos-1).c_str());
// std::string fname = (*temp)[j].substr(0,dspos);
// if (skrypty->find(obid)==skrypty->end())
// skrypty->insert(std::pair<int, std::map<std::string, CObjectScript*> >(obid,std::map<std::string,CObjectScript*>()));
// (*skrypty)[obid].insert(std::pair<std::string, CObjectScript*>(fname,objs));
// }
// delete temp;
// }HANDLE_EXCEPTION
//}
///****************************INITIALIZING OBJECT SCRIPTS************************************************/
//std::string temps("newObject");
//for (int i=0; i<map->objects.size(); i++)
//{
// //c++ scripts
// if (scripts.find(map->objects[i]->ID) != scripts.end())
// {
// map->objects[i]->state = scripts[map->objects[i]->ID];
// map->objects[i]->state->newObject(map->objects[i]);
// }
// else
// {
// map->objects[i]->state = NULL;
// }
// // lua scripts
// if(checkFunc(map->objects[i]->ID,temps))
// (*skrypty)[map->objects[i]->ID][temps]->newObject(map->objects[i]);
//}
//delete lf;
}
void CGameState::battle(CCreatureSet * army1, CCreatureSet * army2, int3 tile, CArmedInstance *hero1, CArmedInstance *hero2)
{/*

View File

@ -78,8 +78,6 @@ private:
ui32 day; //total number of days in game
Mapa * map;
std::map<ui8,PlayerState> players; //ID <-> playerstate
std::set<CCPPObjectScript *> cppscripts; //C++ scripts
std::map<int, std::map<std::string, CObjectScript*> > objscr; //non-C++ scripts
std::map<int, CGDefInfo*> villages, forts, capitols; //def-info for town graphics
@ -87,7 +85,6 @@ private:
CGameState();
~CGameState();
bool checkFunc(int obid, std::string name);
void init(StartInfo * si, Mapa * map, int Seed);
void apply(IPack * pack);
void randomizeObject(CGObjectInstance *cur);

707
CLua.cpp
View File

@ -1,29 +1,26 @@
#include "stdafx.h"
#include "CLua.h"
#include "CLuaHandler.h"
#include <sstream>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/replace.hpp>
#include "hch/CHeroHandler.h"
#include "hch/CObjectHandler.h"
#include "hch/CTownHandler.h"
#include "hch/CArtHandler.h"
#include "hch/CDefObjInfoHandler.h"
//#include "lua.h"
//#include "lualib.h"
//#include "lauxlib.h"
//#include "lobject.h"
//#include "lgc.h"
//#include "lapi.h"
#include "CGameInfo.h"
#include "CLua.h"
#include "CGameState.h"
#include <sstream>
#include "hch/CObjectHandler.h"
#include "hch/CTownHandler.h"
#include "hch/CArtHandler.h"
#include "CCallback.h"
#include "hch/CGeneralTextHandler.h"
#include <sstream>
#include "CPlayerInterface.h"
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/replace.hpp>
#include "hch/CDefObjInfoHandler.h"
#include "lib/VCMI_Lib.h"
#include "map.h"
#include "maphandler.h"
#include "server/CScriptCallback.h"
#include "lib/NetPacks.h"
#pragma warning (disable : 4311)
#define DEFOS const CGObjectInstance *os = cb->getObj(objid)
bool getGlobalFunc(lua_State * L, std::string fname)
{
//unsigned int hash = lua_calchash(fname.c_str(), fname.size());
@ -138,7 +135,7 @@ std::string CLuaObjectScript::genFN(std::string base, int ID)
return sts.str();
}
void CLuaObjectScript::newObject(CGObjectInstance *os)
void CLuaObjectScript::newObject(int objid)
{
//findF(genFN("newObject",os->ID));
//lua_pushinteger(is, (int)os);
@ -150,7 +147,7 @@ void CLuaObjectScript::newObject(CGObjectInstance *os)
//lua_settop(is, 0);
return;
}
void CLuaObjectScript::onHeroVisit(CGObjectInstance *os, int heroID)
void CLuaObjectScript::onHeroVisit(int objid, int heroID)
{
//findF(genFN("heroVisit",os->ID));
//lua_pushinteger(is, (int)os);
@ -162,43 +159,75 @@ void CLuaObjectScript::onHeroVisit(CGObjectInstance *os, int heroID)
//}
//lua_settop(is, 0);
}
std::string CLuaObjectScript::hoverText(CGObjectInstance *os)
{
//findF(genFN("hoverText",os->ID));
//lua_pushinteger(is, (int)os);
//if (lua_pcall (is, 1, 1, 0))
//{
// lua_settop(is, 0);
// throw new std::exception(("Failed to call "+genFN("hoverText",os->ID)+" function in lua script.").c_str());
//}
//std::string ret = lua_tostring(is,1);
//lua_settop(is, 0);
return "";
}
//std::string CLuaObjectScript::hoverText(int objid)
//{
// //findF(genFN("hoverText",os->ID));
// //lua_pushinteger(is, (int)os);
// //if (lua_pcall (is, 1, 1, 0))
// //{
// // lua_settop(is, 0);
// // throw new std::exception(("Failed to call "+genFN("hoverText",os->ID)+" function in lua script.").c_str());
// //}
// //std::string ret = lua_tostring(is,1);
// //lua_settop(is, 0);
// return "";
//}
std::string CCPPObjectScript::hoverText(CGObjectInstance *os)
{
return CGI->objh->objects[os->defInfo->id].name;
}
void CVisitableOPH::newObject(CGObjectInstance *os)
void CVisitableOPH::newObject(int objid)
{
visitors.insert
(std::pair<CGObjectInstance*,std::set<int> >(os,std::set<int>()));
(std::pair<int,std::set<int> >(objid,std::set<int>()));
DEFOS;
MetaString hovername;
int pom;
switch(os->ID)
{
case 51:
pom = 8;
break;
case 23:
pom = 7;
break;
case 61:
pom = 11;
break;
case 32:
pom = 4;
break;
case 100:
pom = 5;
break;
default:
throw new std::exception("Unsupported ID in CVisitableOPH::hoverText");
}
hovername << std::pair<ui8,ui32>(3,os->ID) << " " << std::pair<ui8,ui32>(2,pom);
cb->setHoverName(objid,&hovername);
//int heroID = cb->getSelectedHero();
//if (heroID>=0)
//{
//add += ( (visitors[os].find(heroID) == visitors[os].end())
// ?
// (VLC->generaltexth->allTexts[353]) //not visited
// :
// ( VLC->generaltexth->allTexts[352]) ); //visited
//}
};
void CVisitableOPH::onHeroVisit(CGObjectInstance *os, int heroID)
void CVisitableOPH::onHeroVisit(int objid, int heroID)
{
if (visitors.find(os)!=visitors.end())
if (visitors.find(objid)!=visitors.end())
{
if(visitors[os].find(heroID)==visitors[os].end())
if(visitors[objid].find(heroID)==visitors[objid].end())
{
onNAHeroVisit(os,heroID, false);
visitors[os].insert(heroID);
onNAHeroVisit(objid,heroID, false);
visitors[objid].insert(heroID);
}
else
{
onNAHeroVisit(os,heroID, true);
onNAHeroVisit(objid,heroID, true);
}
}
else
@ -206,8 +235,9 @@ void CVisitableOPH::onHeroVisit(CGObjectInstance *os, int heroID)
throw new std::exception("Skrypt nie zainicjalizowal instancji tego obiektu. :(");
}
};
void CVisitableOPH::onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited)
void CVisitableOPH::onNAHeroVisit(int objid, int heroID, bool alreadyVisited)
{
const CGObjectInstance *os = cb->getObj(objid);
int w=0, ot=0, vvv=1;
switch(os->ID)
{
@ -242,30 +272,26 @@ void CVisitableOPH::onNAHeroVisit(CGObjectInstance *os, int heroID, bool already
case 61:
case 32:
{
cb->changePrimSkill(heroID,w,vvv);
std::vector<SComponent*> weko;
weko.push_back(new SComponent(SComponent::primskill,w,vvv));
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[ot],&weko);
//for (int ii=0; ii<weko.size();ii++)
// delete weko[ii];
break;
//cb->changePrimSkill(heroID,w,vvv);
//std::vector<SComponent*> weko;
//weko.push_back(new SComponent(SComponent::primskill,w,vvv));
//cb->showInfoDialog(cb->getHeroOwner(heroID),VLC->objh->advobtxt[ot],&weko);
//break;
}
case 100:
{
cb->changePrimSkill(heroID,w,vvv);
std::vector<SComponent*> weko;
weko.push_back(new SComponent(SComponent::experience,0,vvv));
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[ot],&weko);
//for (int ii=0; ii<weko.size();ii++)
// delete weko[ii];
break;
//cb->changePrimSkill(heroID,w,vvv);
//std::vector<SComponent*> weko;
//weko.push_back(new SComponent(SComponent::experience,0,vvv));
//cb->showInfoDialog(cb->getHeroOwner(heroID),VLC->objh->advobtxt[ot],&weko);
//break;
}
}
}
else
{
ot++;
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[ot],&std::vector<SComponent*>());
cb->showInfoDialog(cb->getHeroOwner(heroID),VLC->objh->advobtxt[ot],&std::vector<SComponent*>());
}
}
@ -280,126 +306,93 @@ std::vector<int> CVisitableOPH::yourObjects()
return ret;
}
std::string CVisitableOPH::hoverText(CGObjectInstance *os)
void CVisitableOPW::onNAHeroVisit(int objid, int heroID, bool alreadyVisited)
{
std::string add;
int pom;
switch(os->ID)
{
case 51:
pom = 8;
break;
case 23:
pom = 7;
break;
case 61:
pom = 11;
break;
case 32:
pom = 4;
break;
case 100:
pom = 5;
break;
default:
throw new std::exception("Unsupported ID in CVisitableOPH::hoverText");
}
add = " " + CGI->objh->xtrainfo[pom] + " ";
int heroID = cb->getSelectedHero();
if (heroID>=0)
{
add += ( (visitors[os].find(heroID) == visitors[os].end())
?
(CGI->generaltexth->allTexts[353]) //not visited
:
( CGI->generaltexth->allTexts[352]) ); //visited
}
return CGI->objh->objects[os->defInfo->id].name + add;
}
void CVisitableOPW::onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited)
{
int mid;
switch (os->ID)
{
case 55:
mid = 92;
break;
case 112:
mid = 170;
break;
case 109:
mid = 164;
break;
}
if (alreadyVisited)
{
if (os->ID!=112)
mid++;
else
mid--;
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[mid],&std::vector<SComponent*>()); //TODO: maybe we have memory leak with these windows
}
else
{
int type, sub, val;
type = SComponent::resource;
switch (os->ID)
{
case 55:
if (rand()%2)
{
sub = 5;
val = 5;
}
else
{
sub = 6;
val = 500;
}
break;
case 112:
mid = 170;
sub = (rand() % 5) + 1;
val = (rand() % 4) + 3;
break;
case 109:
mid = 164;
sub = 6;
if(cb->getDate(2)<2)
val = 500;
else
val = 1000;
}
SComponent * com = new SComponent((SComponent::Etype)type,sub,val);
std::vector<SComponent*> weko;
weko.push_back(com);
cb->giveResource(cb->getHeroOwner(heroID),sub,val);
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[mid],&weko);
visited[os] = true;
}
//int mid;
//switch (os->ID)
//{
//case 55:
// mid = 92;
// break;
//case 112:
// mid = 170;
// break;
//case 109:
// mid = 164;
// break;
//}
//if (alreadyVisited)
//{
// if (os->ID!=112)
// mid++;
// else
// mid--;
// cb->showInfoDialog(cb->getHeroOwner(heroID),VLC->objh->advobtxt[mid],&std::vector<SComponent*>()); //TODO: maybe we have memory leak with these windows
//}
//else
//{
// int type, sub, val;
// type = SComponent::resource;
// switch (os->ID)
// {
// case 55:
// if (rand()%2)
// {
// sub = 5;
// val = 5;
// }
// else
// {
// sub = 6;
// val = 500;
// }
// break;
// case 112:
// mid = 170;
// sub = (rand() % 5) + 1;
// val = (rand() % 4) + 3;
// break;
// case 109:
// mid = 164;
// sub = 6;
// if(cb->getDate(2)<2)
// val = 500;
// else
// val = 1000;
// }
// SComponent * com = new SComponent((SComponent::Etype)type,sub,val);
// std::vector<SComponent*> weko;
// weko.push_back(com);
// cb->giveResource(cb->getHeroOwner(heroID),sub,val);
// cb->showInfoDialog(cb->getHeroOwner(heroID),VLC->objh->advobtxt[mid],&weko);
// visited[os] = true;
//}
}
void CVisitableOPW::newTurn ()
{
if (cb->getDate(1)==1)
{
for (std::map<CGObjectInstance*,bool>::iterator i = visited.begin(); i != visited.end(); i++)
for (std::map<int,bool>::iterator i = visited.begin(); i != visited.end(); i++)
{
(*i).second = false;
}
}
}
void CVisitableOPW::newObject(CGObjectInstance *os)
void CVisitableOPW::newObject(int objid)
{
visited.insert(std::pair<CGObjectInstance*,bool>(os,false));
visited.insert(std::pair<int,bool>(objid,false));
DEFOS;
MetaString ms;
ms << std::pair<ui8,ui32>(3,os->ID) << " " << std::pair<ui8,ui32>(1,visited[objid] ? 352 : 353);
cb->setHoverName(objid,&ms);
}
void CVisitableOPW::onHeroVisit(CGObjectInstance *os, int heroID)
void CVisitableOPW::onHeroVisit(int objid, int heroID)
{
if(visited[os])
onNAHeroVisit(os,heroID,true);
if(visited[objid])
onNAHeroVisit(objid,heroID,true);
else
onNAHeroVisit(os,heroID,false);
onNAHeroVisit(objid,heroID,false);
}
std::vector<int> CVisitableOPW::yourObjects() //returns IDs of objects which are handled by script
@ -411,38 +404,43 @@ std::vector<int> CVisitableOPW::yourObjects() //returns IDs of objects which are
return ret;
}
std::string CVisitableOPW::hoverText(CGObjectInstance *os)
void CMines::newObject(int objid)
{
return CGI->objh->objects[os->defInfo->id].name + " " + ( (visited[os]) ? (CGI->generaltexth->allTexts[352]) : (CGI->generaltexth->allTexts[353])) ;
ourObjs.push_back(objid);
cb->setOwner(objid,NEUTRAL_PLAYER);
DEFOS;
MetaString ms;
ms << std::pair<ui8,ui32>(3,os->ID);
cb->setHoverName(objid,&ms);
}
void CMines::newObject(CGObjectInstance *os)
void CMines::onHeroVisit(int objid, int heroID)
{
ourObjs.push_back(os);
os->tempOwner = NEUTRAL_PLAYER;
}
void CMines::onHeroVisit(CGObjectInstance *os, int heroID)
{
int vv = 1;
if (os->subID==0 || os->subID==2)
vv++;
else if (os->subID==6)
vv = 1000;
if (os->tempOwner == cb->getHeroOwner(heroID))
{
//TODO: garrison
}
else
{
if (os->subID==7)
return; //TODO: support for abandoned mine
os->tempOwner = cb->getHeroOwner(heroID);
SComponent * com = new SComponent(SComponent::Etype::resource,os->subID,vv);
com->subtitle+=CGI->generaltexth->allTexts[3].substr(2,CGI->generaltexth->allTexts[3].length()-2);
std::vector<SComponent*> weko;
weko.push_back(com);
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->mines[os->subID].second,&weko);
}
DEFOS;
const CGHeroInstance *h = cb->getHero(heroID);
cb->setOwner(objid,h->tempOwner);
MetaString ms;
ms << std::pair<ui8,ui32>(9,os->subID) << " " << std::pair<ui8,ui32>(6,23+h->tempOwner);
cb->setHoverName(objid,&ms);
//int vv = 1;
//if (os->subID==0 || os->subID==2)
// vv++;
//else if (os->subID==6)
// vv = 1000;
//if (os->tempOwner == cb->getHeroOwner(heroID))
//{
// //TODO: garrison
//}
//else
//{
// if (os->subID==7)
// return; //TODO: support for abandoned mine
// os->tempOwner = cb->getHeroOwner(heroID);
// SComponent * com = new SComponent(SComponent::Etype::resource,os->subID,vv);
// com->subtitle+=VLC->generaltexth->allTexts[3].substr(2,VLC->generaltexth->allTexts[3].length()-2);
// std::vector<SComponent*> weko;
// weko.push_back(com);
// cb->showInfoDialog(cb->getHeroOwner(heroID),VLC->objh->mines[os->subID].second,&weko);
//}
}
std::vector<int> CMines::yourObjects()
{
@ -450,36 +448,48 @@ std::vector<int> CMines::yourObjects()
ret.push_back(53);
return ret;
}
std::string CMines::hoverText(CGObjectInstance *os)
{
if (os->tempOwner == NEUTRAL_PLAYER)
return CGI->objh->mines[os->subID].first;
else
return CGI->objh->mines[os->subID].first + " " + CGI->generaltexth->arraytxt[23+os->tempOwner];
}
void CMines::newTurn ()
{
for (int i=0;i<ourObjs.size();i++)
const CGObjectInstance * obj;
for (unsigned i=0;i<ourObjs.size();i++)
{
if (ourObjs[i]->tempOwner == NEUTRAL_PLAYER)
obj = cb->getObj(ourObjs[i]);
if (obj->tempOwner == NEUTRAL_PLAYER)
continue;
int vv = 1;
if (ourObjs[i]->subID==0 || ourObjs[i]->subID==2)
if (obj->subID==0 || obj->subID==2)
vv++;
else if (ourObjs[i]->subID==6)
else if (obj->subID==6)
vv = 1000;
cb->giveResource(ourObjs[i]->tempOwner,ourObjs[i]->subID,vv);
cb->giveResource(obj->tempOwner,obj->subID,vv);
}
}
void CPickable::newObject(CGObjectInstance *os)
void CPickable::newObject(int objid)
{
os->blockVisit = true;
cb->setBlockVis(objid,true);
MetaString ms;
DEFOS;
switch (os->ID)
{
case 79:
ms << std::pair<ui8,ui32>(4,os->ID);
break;
case 5:
ms << std::pair<ui8,ui32>(5,os->ID);
break;
default:
ms << std::pair<ui8,ui32>(3,os->ID);
break;
}
cb->setHoverName(objid,&ms);
}
void CPickable::onHeroVisit(CGObjectInstance *os, int heroID)
void CPickable::onHeroVisit(int objid, int heroID)
{
DEFOS;
switch(os->ID)
{
case 5:
@ -489,109 +499,93 @@ void CPickable::onHeroVisit(CGObjectInstance *os, int heroID)
}
case 79:
{
//TODO: handle guards (when battles are finished)
CResourceObjInfo * t2 = static_cast<CResourceObjInfo *>(os->info);
int val;
if(t2->amount)
val = t2->amount;
else
{
switch(os->subID)
{
case 6:
val = 500 + (rand()%6)*100;
break;
case 0: case 2:
val = 6 + (rand()%5);
break;
default:
val = 3 + (rand()%3);
break;
}
}
if(t2->message.length())
cb->showInfoDialog(cb->getHeroOwner(heroID),t2->message,&std::vector<SComponent*>());
SComponent ccc(SComponent::resource,os->subID,val);
ccc.description = CGI->objh->advobtxt[113];
boost::algorithm::replace_first(ccc.description,"%s",CGI->objh->restypes[os->subID]);
cb->giveResource(cb->getHeroOwner(heroID),os->subID,val);
cb->showCompInfo(cb->getHeroOwner(heroID),&ccc);
////TODO: handle guards (when battles are finished)
//CResourceObjInfo * t2 = static_cast<CResourceObjInfo *>(os->info);
//int val;
//if(t2->amount)
// val = t2->amount;
//else
//{
// switch(os->subID)
// {
// case 6:
// val = 500 + (rand()%6)*100;
// break;
// case 0: case 2:
// val = 6 + (rand()%5);
// break;
// default:
// val = 3 + (rand()%3);
// break;
// }
//}
//if(t2->message.length())
// cb->showInfoDialog(cb->getHeroOwner(heroID),t2->message,&std::vector<SComponent*>());
//SComponent ccc(SComponent::resource,os->subID,val);
//ccc.description = VLC->objh->advobtxt[113];
//boost::algorithm::replace_first(ccc.description,"%s",VLC->objh->restypes[os->subID]);
//cb->giveResource(cb->getHeroOwner(heroID),os->subID,val);
//cb->showCompInfo(cb->getHeroOwner(heroID),&ccc);
break;
}
case 101:
{
if (os->subID)
break; //not OH3 treasure chest
int wyn = rand()%100;
if (wyn<32)
{
tempStore.push_back(new CSelectableComponent(SComponent::resource,6,1000));
tempStore.push_back(new CSelectableComponent(SComponent::experience,0,500));
}//1k/0.5k
else if(wyn<64)
{
tempStore.push_back(new CSelectableComponent(SComponent::resource,6,1500));
tempStore.push_back(new CSelectableComponent(SComponent::experience,0,1000));
}//1.5k/1k
else if(wyn<95)
{
tempStore.push_back(new CSelectableComponent(SComponent::resource,6,2000));
tempStore.push_back(new CSelectableComponent(SComponent::experience,0,1500));
}//2k/1.5k
else
{
if (1/*TODO: backpack is full*/)
{
tempStore.push_back(new CSelectableComponent(SComponent::resource,6,1000));
tempStore.push_back(new CSelectableComponent(SComponent::experience,0,500));
}
else
{
//TODO: give treasure artifact
break;
}
}//random treasure artifact, or (if backapack is full) 1k/0.5k
tempStore[1]->ID = heroID;
player = cb->getHeroOwner(heroID);
cb->showSelDialog(player,CGI->objh->advobtxt[146],&tempStore,this);
//if (os->subID)
// break; //not OH3 treasure chest
//int wyn = rand()%100;
//if (wyn<32)
//{
// tempStore.push_back(new CSelectableComponent(SComponent::resource,6,1000));
// tempStore.push_back(new CSelectableComponent(SComponent::experience,0,500));
//}//1k/0.5k
//else if(wyn<64)
//{
// tempStore.push_back(new CSelectableComponent(SComponent::resource,6,1500));
// tempStore.push_back(new CSelectableComponent(SComponent::experience,0,1000));
//}//1.5k/1k
//else if(wyn<95)
//{
// tempStore.push_back(new CSelectableComponent(SComponent::resource,6,2000));
// tempStore.push_back(new CSelectableComponent(SComponent::experience,0,1500));
//}//2k/1.5k
//else
//{
// if (1/*TODO: backpack is full*/)
// {
// tempStore.push_back(new CSelectableComponent(SComponent::resource,6,1000));
// tempStore.push_back(new CSelectableComponent(SComponent::experience,0,500));
// }
// else
// {
// //TODO: give treasure artifact
// break;
// }
//}//random treasure artifact, or (if backapack is full) 1k/0.5k
//tempStore[1]->ID = heroID;
//player = cb->getHeroOwner(heroID);
//cb->showSelDialog(player,VLC->objh->advobtxt[146],&tempStore,this);
break;
}
}
CGI->mh->removeObject(os);
//VLC->mh->removeObject(os);
}
void CPickable::chosen(int which)
{
switch(tempStore[which]->type)
{
case SComponent::resource:
cb->giveResource(player,tempStore[which]->subtype,tempStore[which]->val);
break;
case SComponent::experience:
cb->changePrimSkill(tempStore[which]->ID,4,tempStore[which]->val);
break;
default:
throw new std::exception("Unhandled choice");
}
for (int i=0;i<tempStore.size();i++)
delete tempStore[i];
tempStore.clear();
}
std::string CPickable::hoverText(CGObjectInstance *os)
{
switch (os->ID)
{
case 79:
return CGI->objh->restypes[os->subID];
break;
case 5:
return CGI->arth->artifacts[os->subID].name;
break;
default:
return CGI->objh->objects[os->defInfo->id].name;
break;
}
//switch(tempStore[which]->type)
//{
//case SComponent::resource:
// cb->giveResource(player,tempStore[which]->subtype,tempStore[which]->val);
// break;
//case SComponent::experience:
// cb->changePrimSkill(tempStore[which]->ID,4,tempStore[which]->val);
// break;
//default:
// throw new std::exception("Unhandled choice");
//
//}
//for (int i=0;i<tempStore.size();i++)
// delete tempStore[i];
//tempStore.clear();
}
std::vector<int> CPickable::yourObjects() //returns IDs of objects which are handled by script
@ -603,20 +597,22 @@ std::vector<int> CPickable::yourObjects() //returns IDs of objects which are han
return ret;
}
void CTownScript::onHeroVisit(CGObjectInstance *os, int heroID)
void CTownScript::onHeroVisit(int objid, int heroID)
{
cb->heroVisitCastle(os,heroID);
cb->heroVisitCastle(objid,heroID);
}
void CTownScript::onHeroLeave(CGObjectInstance *os, int heroID)
void CTownScript::newObject(int objid)
{
cb->stopHeroVisitCastle(os,heroID);
MetaString ms;
const CGTownInstance * n = cb->getTown(objid);
ms << n->name << ", " << n->town->name;
cb->setHoverName(objid,&ms);
}
std::string CTownScript::hoverText(CGObjectInstance *os)
void CTownScript::onHeroLeave(int objid, int heroID)
{
CGTownInstance * n;
if(n = dynamic_cast<CGTownInstance*>(os))
return n->name + ", " + n->town->name;
else return "";
cb->stopHeroVisitCastle(objid,heroID);
}
std::vector<int> CTownScript::yourObjects() //returns IDs of objects which are handled by script
@ -626,27 +622,28 @@ std::vector<int> CTownScript::yourObjects() //returns IDs of objects which are h
return ret;
}
void CHeroScript::newObject(CGObjectInstance *os)
void CHeroScript::newObject(int objid)
{
os->blockVisit = true;
heroes.insert(std::pair<int,CGObjectInstance*>(os->subID,os));
cb->setBlockVis(objid,true);
}
void CHeroScript::onHeroVisit(CGObjectInstance *os, int heroID)
void CHeroScript::onHeroVisit(int objid, int heroID)
{
//TODO: check for allies
if(static_cast<CGHeroInstance*>(heroes[heroID])->tempOwner == static_cast<CGHeroInstance*>(os)->tempOwner) //one of allied cases
const CGHeroInstance *my = cb->getHero(objid),
*vis = cb->getHero(objid);
if(my->tempOwner == vis->tempOwner) //one of allied cases
{
//exchange
}
else
{
cb->startBattle(
&(static_cast<CGHeroInstance*>(heroes[heroID]))->army,
&(static_cast<CGHeroInstance*>(os))->army,
os->pos,
static_cast<CGHeroInstance*>(heroes[heroID]),
static_cast<CGHeroInstance*>(os));
&my->army,
&vis->army,
my->pos,
my,
vis);
}
}
std::vector<int> CHeroScript::yourObjects() //returns IDs of objects which are handled by script
@ -655,64 +652,66 @@ std::vector<int> CHeroScript::yourObjects() //returns IDs of objects which are h
ret.push_back(34); //hero
return ret;
}
std::string CHeroScript::hoverText(CGObjectInstance *os)
{
CGHeroInstance* h = static_cast<CGHeroInstance*>(os);
std::string ret = CGI->generaltexth->allTexts[15];
boost::algorithm::replace_first(ret,"%s",h->name);
boost::algorithm::replace_first(ret,"%s",h->type->heroClass->name);
return ret;
}
void CMonsterS::newObject(CGObjectInstance *os)
//std::string CHeroScript::hoverText(int objid)
//{
// //CGHeroInstance* h = static_cast<CGHeroInstance*>(os);
// //std::string ret = VLC->generaltexth->allTexts[15];
// //boost::algorithm::replace_first(ret,"%s",h->name);
// //boost::algorithm::replace_first(ret,"%s",h->type->heroClass->name);
// //return ret;
// return "";
//}
void CMonsterS::newObject(int objid)
{
//os->blockVisit = true;
switch(CGI->creh->creatures[os->subID].level)
DEFOS;
switch(VLC->creh->creatures[os->subID].level)
{
case 1:
((CCreatureObjInfo*)os->info)->number = rand()%31+20;
amounts[objid] = rand()%31+20;
break;
case 2:
((CCreatureObjInfo*)os->info)->number = rand()%16+15;
amounts[objid] = rand()%16+15;
break;
case 3:
((CCreatureObjInfo*)os->info)->number = rand()%16+10;
amounts[objid] = rand()%16+10;
break;
case 4:
((CCreatureObjInfo*)os->info)->number = rand()%11+10;
amounts[objid] = rand()%11+10;
break;
case 5:
((CCreatureObjInfo*)os->info)->number = rand()%9+8;
amounts[objid] = rand()%9+8;
break;
case 6:
((CCreatureObjInfo*)os->info)->number = rand()%8+5;
amounts[objid] = rand()%8+5;
break;
case 7:
((CCreatureObjInfo*)os->info)->number = rand()%7+3;
amounts[objid] = rand()%7+3;
break;
case 8:
((CCreatureObjInfo*)os->info)->number = rand()%4+2;
amounts[objid] = rand()%4+2;
break;
case 9:
((CCreatureObjInfo*)os->info)->number = rand()%3+2;
amounts[objid] = rand()%3+2;
break;
case 10:
((CCreatureObjInfo*)os->info)->number = rand()%3+1;
amounts[objid] = rand()%3+1;
break;
}
}
std::string CMonsterS::hoverText(CGObjectInstance *os)
{
int pom = CCreature::getQuantityID(((CCreatureObjInfo*)os->info)->number);
MetaString ms;
int pom = CCreature::getQuantityID(amounts[objid]);
pom = 174 + 3*pom + 1;
return CGI->generaltexth->arraytxt[pom] + " " + CGI->creh->creatures[os->subID].namePl;
ms << std::pair<ui8,ui32>(6,pom) << " " << std::pair<ui8,ui32>(7,os->subID);
cb->setHoverName(objid,&ms);
}
void CMonsterS::onHeroVisit(CGObjectInstance *os, int heroID)
void CMonsterS::onHeroVisit(int objid, int heroID)
{
DEFOS;
CCreatureSet set;
//TODO: zrobic secik w sposob wyrafinowany
set.slots[0] = std::pair<CCreature*,int>(&CGI->creh->creatures[os->subID],((CCreatureObjInfo*)os->info)->number);
set.slots[0] = std::pair<CCreature*,int>(&VLC->creh->creatures[os->subID],((CCreatureObjInfo*)os->info)->number);
cb->startBattle(heroID,&set,os->pos);
}
std::vector<int> CMonsterS::yourObjects() //returns IDs of objects which are handled by script
@ -723,15 +722,15 @@ std::vector<int> CMonsterS::yourObjects() //returns IDs of objects which are han
}
void CCreatureGen::newObject(CGObjectInstance *os)
void CCreatureGen::newObject(int objid)
{
amount[os] = CGI->creh->creatures[CGI->objh->cregens[os->subID]].growth;
DEFOS;
amount[objid] = VLC->creh->creatures[VLC->objh->cregens[os->subID]].growth;
MetaString ms;
ms << std::pair<ui8,ui32>(8,os->subID);
cb->setHoverName(objid,&ms);
}
std::string CCreatureGen::hoverText(CGObjectInstance *os)
{
return CGI->objh->creGens[os->subID];
}
void CCreatureGen::onHeroVisit(CGObjectInstance *os, int heroID)
void CCreatureGen::onHeroVisit(int objid, int heroID)
{
}
std::vector<int> CCreatureGen::yourObjects() //returns IDs of objects which are handled by script

99
CLua.h
View File

@ -28,10 +28,10 @@ public:
//functions to be called in script
//virtual void init(){};
virtual void newObject(CGObjectInstance *os){};
virtual void onHeroVisit(CGObjectInstance *os, int heroID){};
virtual void onHeroLeave(CGObjectInstance *os, int heroID){};
virtual std::string hoverText(CGObjectInstance *os){return "";};
virtual void newObject(int objid){};
virtual void onHeroVisit(int objid, int heroID){};
virtual void onHeroLeave(int objid, int heroID){};
virtual std::string hoverText(int objid){return "";};
virtual void newTurn (){};
@ -83,122 +83,101 @@ public:
static std::string genFN(std::string base, int ID);
void init();
void newObject(CGObjectInstance *os);
void onHeroVisit(CGObjectInstance *os, int heroID);
std::string hoverText(CGObjectInstance *os);
friend CGameState;
void newObject(int objid);
void onHeroVisit(int objid, int heroID);
};
class CCPPObjectScript: public CObjectScript
{
protected:
public:
CScriptCallback * cb;
CCPPObjectScript(CScriptCallback * CB){cb=CB;};
public:
virtual std::vector<int> yourObjects()=0; //returns IDs of objects which are handled by script
virtual std::string hoverText(CGObjectInstance *os);
};
class CVisitableOPH : public CCPPObjectScript //once per hero
{
public:
CVisitableOPH(CScriptCallback * CB):CCPPObjectScript(CB){};
std::map<CGObjectInstance*,std::set<int> > visitors;
std::map<int,std::set<int> > visitors;
void onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited);
void newObject(CGObjectInstance *os);
void onHeroVisit(CGObjectInstance *os, int heroID);
void onNAHeroVisit(int objid, int heroID, bool alreadyVisited);
void newObject(int objid);
void onHeroVisit(int objid, int heroID);
std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
std::string hoverText(CGObjectInstance *os);
friend CGameState;
};
class CVisitableOPW : public CCPPObjectScript //once per week
{
public:
CVisitableOPW(CScriptCallback * CB):CCPPObjectScript(CB){};
std::map<CGObjectInstance*,bool> visited;
void onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited);
void newObject(CGObjectInstance *os);
void onHeroVisit(CGObjectInstance *os, int heroID);
std::map<int,bool> visited;
void onNAHeroVisit(int objid, int heroID, bool alreadyVisited);
void newObject(int objid);
void onHeroVisit(int objid, int heroID);
std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
std::string hoverText(CGObjectInstance *os);
void newTurn ();
friend CGameState;
};
class CMines : public CCPPObjectScript //flaggable, and giving resource at each day
{
public:
CMines(CScriptCallback * CB):CCPPObjectScript(CB){};
std::vector<CGObjectInstance*> ourObjs;
std::vector<int> ourObjs;
void newObject(CGObjectInstance *os);
void onHeroVisit(CGObjectInstance *os, int heroID);
void newObject(int objid);
void onHeroVisit(int objid, int heroID);
std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
std::string hoverText(CGObjectInstance *os);
void newTurn ();
friend CGameState;
};
class CPickable : public CCPPObjectScript, public IChosen //pickable - resources, artifacts, etc
{
public:
std::vector<CSelectableComponent*> tempStore;
int player;
CPickable(CScriptCallback * CB):CCPPObjectScript(CB){};
void chosen(int which);
void newObject(CGObjectInstance *os);
void onHeroVisit(CGObjectInstance *os, int heroID);
std::string hoverText(CGObjectInstance *os);
void newObject(int objid);
void onHeroVisit(int objid, int heroID);
std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
friend CGameState;
};
class CTownScript : public CCPPObjectScript //pickable - resources, artifacts, etc
{
public:
CTownScript(CScriptCallback * CB):CCPPObjectScript(CB){};
void onHeroVisit(CGObjectInstance *os, int heroID);
void onHeroLeave(CGObjectInstance *os, int heroID);
std::string hoverText(CGObjectInstance *os);
void onHeroVisit(int objid, int heroID);
void onHeroLeave(int objid, int heroID);
void newObject(int objid);
std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
friend CGameState;
};
class CHeroScript : public CCPPObjectScript
{
std::map<int, CGObjectInstance*> heroes;
public:
CHeroScript(CScriptCallback * CB):CCPPObjectScript(CB){};
void newObject(CGObjectInstance *os);
void onHeroVisit(CGObjectInstance *os, int heroID);
void newObject(int objid);
void onHeroVisit(int objid, int heroID);
std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
std::string hoverText(CGObjectInstance *os);
friend CGameState;
};
class CMonsterS : public CCPPObjectScript
{
std::map<int, CGObjectInstance*> heroes;
public:
std::map<int, int> amounts; //monster id -> stack quantity
CMonsterS(CScriptCallback * CB):CCPPObjectScript(CB){};
void newObject(CGObjectInstance *os);
std::string hoverText(CGObjectInstance *os);
void onHeroVisit(CGObjectInstance *os, int heroID);
void newObject(int objid);
void onHeroVisit(int objid, int heroID);
std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
friend CGameState;
};
class CCreatureGen : public CCPPObjectScript
{
std::map<CGObjectInstance*, int> amount; //amount of creatures in each dwelling
public:
std::map<int, int> amount; //amount of creatures in each dwelling
CCreatureGen(CScriptCallback * CB):CCPPObjectScript(CB){};
void newObject(CGObjectInstance *os);
std::string hoverText(CGObjectInstance *os);
void onHeroVisit(CGObjectInstance *os, int heroID);
void newObject(int objid);
void onHeroVisit(int objid, int heroID);
std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
friend CGameState;
};

10
CMT.cpp
View File

@ -50,15 +50,7 @@ std::queue<SDL_Event> events;
boost::mutex eventsM;
TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM, *GEOR16;
void handleCPPObjS(std::map<int,CCPPObjectScript*> * mapa, CCPPObjectScript * script)
{
std::vector<int> tempv = script->yourObjects();
for (int i=0;i<tempv.size();i++)
{
(*mapa)[tempv[i]]=script;
}
CGI->state->cppscripts.insert(script);
}
int _tmain(int argc, _TCHAR* argv[])
{
std::cout.flags(ios::unitbuf);

View File

@ -213,7 +213,7 @@ void CPathfinder::CalcH(Coordinate* node)
y = CGI->mh->map->height-1;
//Get the movement cost.
ret = Hero->getTileCost(CGI->mh->ttiles[x][y][node->z].tileInfo->tertype, CGI->mh->map->terrain[x][y][0].malle,CGI->mh->map->terrain[x][y][0].nuine);
ret = Hero->getTileCost(CGI->mh->ttiles[x][y][node->z].tileInfo->tertype, CGI->mh->map->terrain[x][y][node->z].malle,CGI->mh->map->terrain[x][y][node->z].nuine);
node->h = ret;
}

View File

@ -12,8 +12,69 @@
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include "../hch/CObjectHandler.h"
#include "../hch/CGeneralTextHandler.h"
#include "../hch/CArtHandler.h"
#include <boost/thread/shared_mutex.hpp>
CSharedCond<std::set<IPack*> > mess(new std::set<IPack*>);
std::string toString(MetaString &ms)
{
std::string ret;
for(int i=0;i<ms.message.size();i++)
{
if(ms.message[i]>0)
{
ret += ms.strings[ms.message[i]-1];
}
else
{
std::vector<std::string> *vec;
int type = ms.texts[-ms.message[i]-1].first;
if(type == 5)
{
ret += CGI->arth->artifacts[ms.texts[-ms.message[i]-1].second].name;
continue;
}
else if(type == 7)
{
ret += CGI->creh->creatures[ms.texts[-ms.message[i]-1].second].namePl;
continue;
}
else if(type == 9)
{
ret += CGI->objh->mines[ms.texts[-ms.message[i]-1].second].first;
continue;
}
else
{
switch(type)
{
case 1:
vec = &CGI->generaltexth->allTexts;
break;
case 2:
vec = &CGI->objh->xtrainfo;
break;
case 3:
vec = &CGI->objh->names;
break;
case 4:
vec = &CGI->objh->restypes;
break;
case 6:
vec = &CGI->generaltexth->arraytxt;
break;
case 8:
vec = &CGI->objh->creGens;
break;
}
ret += (*vec)[ms.texts[-ms.message[i]-1].second];
}
}
}
return ret;
}
CClient::CClient(void)
{
}
@ -100,7 +161,7 @@ void CClient::process(int what)
}
case 501: //hero movement response - we have to notify interfaces and callback
{
TryMoveHero *th = new TryMoveHero;
TryMoveHero *th = new TryMoveHero; //will be deleted by callback after processing
*serv >> *th;
std::cout << "HeroMove: id="<<th->id<<"\tResult: "<<(unsigned)th->result<<"\tPosition "<<th->end<<std::endl;
@ -134,6 +195,26 @@ void CClient::process(int what)
mess.cv->notify_all();
break;
}
case 1001:
{
SetObjectProperty sop;
*serv >> sop;
std::cout << "Setting " << (unsigned)sop.what << " property of " << sop.id <<" object to "<<sop.val<<std::endl;
gs->apply(&sop);
break;
}
case 1002:
{
SetHoverName shn;
*serv >> shn;
std::cout << "Setting a name of " << shn.id <<" object to "<< toString(shn.name) <<std::endl;
gs->mx->lock();
gs->map->objects[shn.id]->hoverName = toString(shn.name);
gs->mx->unlock();
break;
}
case 9999:
break;
default:
throw std::exception("Not supported server message!");
break;

View File

@ -319,10 +319,6 @@
RelativePath=".\Client.cpp"
>
</File>
<File
RelativePath="..\CLua.cpp"
>
</File>
<File
RelativePath="..\CLuaHandler.cpp"
>

View File

@ -19,11 +19,11 @@ void CObjectHandler::loadObjects()
int it=0;
while (it<buf.length()-1)
{
CObject nobj;
loadToIt(nobj.name,buf,it,3);
if(nobj.name.size() && (nobj.name[nobj.name.size()-1]==(char)10 || nobj.name[nobj.name.size()-1]==(char)13 || nobj.name[nobj.name.size()-1]==(char)9))
nobj.name = nobj.name.substr(0, nobj.name.size()-1);
objects.push_back(nobj);
std::string nobj;
loadToIt(nobj,buf,it,3);
if(nobj.size() && (nobj[nobj.size()-1]==(char)10 || nobj[nobj.size()-1]==(char)13 || nobj[nobj.size()-1]==(char)9))
nobj = nobj.substr(0, nobj.size()-1);
names.push_back(nobj);
}
buf = bitmaph->getTextFile("ADVEVENT.TXT");

View File

@ -42,12 +42,6 @@ public:
}
};
class DLL_EXPORT CObject //typical object that can be encountered on a map
{
public:
std::string name; //object's name
};
class DLL_EXPORT CGObjectInstance
{
public:
@ -58,9 +52,10 @@ public:
CCPPObjectScript * state;
CSpecObjInfo * info;
unsigned char animPhaseShift;
std::string hoverName;
int tempOwner; //uzywane dla szybkosci, skrypt ma obowiazek aktualizowac te zmienna
bool blockVisit;
int blockVisit; //if non-zero then blocks the tile but is visitable from neighbouring tile
virtual bool isHero() const;
int getOwner() const;
@ -172,7 +167,7 @@ public:
class DLL_EXPORT CObjectHandler
{
public:
std::vector<CObject> objects; //vector of objects; i-th object in vector has subnumber i
std::vector<std::string> names; //vector of objects; i-th object in vector has subnumber i
std::vector<int> cregens; //type 17. dwelling subid -> creature ID
void loadObjects();

View File

@ -252,7 +252,16 @@ public:
data.insert(ins);
}
}
template <typename T1, typename T2>
void saveSerializable(const std::pair<T1,T2> &data)
{
*this << data.first << data.second;
}
template <typename T1, typename T2>
void loadSerializable(std::pair<T1,T2> &data)
{
*this >> data.first >> data.second;
}
template <typename T>
void save(const T &data)
{

View File

@ -72,4 +72,57 @@ struct TryMoveHero : public CPack<TryMoveHero> //501
{
h & id & result & start & end & movePoints & fowRevealed;
}
};
};
struct MetaString : public CPack<MetaString> //2001 helper for object scrips
{
std::vector<std::string> strings;
std::vector<std::pair<ui8,ui32> > texts; //pairs<text handler type, text number>; types: 1 - generaltexthandler->all; 2 - objh->xtrainfo; 3 - objh->names; 4 - objh->restypes; 5 - arth->artifacts[id].name; 6 - generaltexth->arraytxt; 7 - creh->creatures[os->subID].namePl; 8 - objh->creGens; 9 - objh->mines[ID].first
std::vector<si32> message;
template <typename Handler> void serialize(Handler &h, const int version)
{
h & strings & texts & message;
}
MetaString& operator<<(const std::pair<ui8,ui32> &txt)
{
message.push_back(-((si32)texts.size())-1);
texts.push_back(txt);
return *this;
}
MetaString& operator<<(const std::string &txt)
{
message.push_back(strings.size()+1);
strings.push_back(txt);
return *this;
}
MetaString(){type = 2001;};
};
struct SetObjectProperty : public CPack<SetObjectProperty>//1001
{
ui32 id;
ui8 what; //1 - owner; 2 - blockvis
ui32 val;
SetObjectProperty(){type = 1001;};
SetObjectProperty(ui32 ID, ui8 What, ui32 Val):id(ID),what(What),val(Val){type = 1001;};
template <typename Handler> void serialize(Handler &h, const int version)
{
h & id & what & val;
}
};
struct SetHoverName : public CPack<SetHoverName>//1002
{
ui32 id;
MetaString name;
SetHoverName(){type = 1002;};
SetHoverName(ui32 ID, MetaString& Name):id(ID),name(Name){type = 1002;};
template <typename Handler> void serialize(Handler &h, const int version)
{
h & id & name;
}
};

View File

@ -3,6 +3,7 @@
#include <boost/thread/shared_mutex.hpp>
#include <boost/bind.hpp>
#include "CGameHandler.h"
#include "CScriptCallback.h"
#include "../CLua.h"
#include "../CGameState.h"
#include "../StartInfo.h"
@ -24,6 +25,27 @@ double distance(int3 a, int3 b)
{
return std::sqrt( (double)(a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
}
//bool CGameState::checkFunc(int obid, std::string name)
//{
// if (objscr.find(obid)!=objscr.end())
// {
// if(objscr[obid].find(name)!=objscr[obid].end())
// {
// return true;
// }
// }
// return false;
//}
void CGameHandler::handleCPPObjS(std::map<int,CCPPObjectScript*> * mapa, CCPPObjectScript * script)
{
std::vector<int> tempv = script->yourObjects();
for (unsigned i=0;i<tempv.size();i++)
{
(*mapa)[tempv[i]]=script;
}
cppscripts.insert(script);
}
void CGameHandler::handleConnection(std::set<int> players, CConnection &c)
{
@ -51,7 +73,7 @@ void CGameHandler::handleConnection(std::set<int> players, CConnection &c)
int3 hmpos = end + int3(-1,0,0);
TerrainTile t = gs->map->terrain[hmpos.x][hmpos.y][hmpos.z];
CGHeroInstance *h = static_cast<CGHeroInstance *>(gs->map->objects[id]);
int cost = (double)h->getTileCost(t.tertype,t.malle,t.nuine) * distance(start,end);
int cost = (int)((double)h->getTileCost(t.tertype,t.malle,t.nuine) * distance(start,end));
TryMoveHero tmh;
tmh.id = id;
@ -85,16 +107,15 @@ void CGameHandler::handleConnection(std::set<int> players, CConnection &c)
//we start moving
if(blockvis)//interaction with blocking object (like resources)
{
gs->apply(&tmh);
sendToAllClients(&tmh); //failed to move to that tile but we visit object
sendAndApply(&tmh); //failed to move to that tile but we visit object
BOOST_FOREACH(CGObjectInstance *obj, t.visitableObjects)
{
if (obj->blockVisit)
{
if(gs->checkFunc(obj->ID,"heroVisit")) //script function
gs->objscr[obj->ID]["heroVisit"]->onHeroVisit(obj,h->subID);
//if(gs->checkFunc(obj->ID,"heroVisit")) //script function
// gs->objscr[obj->ID]["heroVisit"]->onHeroVisit(obj,h->subID);
if(obj->state) //hard-coded function
obj->state->onHeroVisit(obj,h->subID);
obj->state->onHeroVisit(obj->id,h->subID);
}
}
break;
@ -107,7 +128,7 @@ void CGameHandler::handleConnection(std::set<int> players, CConnection &c)
{
//TODO: allow to handle this in script-languages
if(obj->state) //hard-coded function
obj->state->onHeroLeave(obj,h->subID);
obj->state->onHeroLeave(obj->id,h->subID);
}
//reveal fog of war
@ -140,22 +161,19 @@ void CGameHandler::handleConnection(std::set<int> players, CConnection &c)
}
}
gs->apply(&tmh);
sendToAllClients(&tmh);
sendAndApply(&tmh);
//call objects if they arevisited
BOOST_FOREACH(CGObjectInstance *obj, t.visitableObjects)
BOOST_FOREACH(CGObjectInstance *obj, t.visitableObjects)//call objects if they are visited
{
if(gs->checkFunc(obj->ID,"heroVisit")) //script function
gs->objscr[obj->ID]["heroVisit"]->onHeroVisit(obj,h->subID);
//if(gs->checkFunc(obj->ID,"heroVisit")) //script function
// gs->objscr[obj->ID]["heroVisit"]->onHeroVisit(obj,h->subID);
if(obj->state) //hard-coded function
obj->state->onHeroVisit(obj,h->subID);
obj->state->onHeroVisit(obj->id,h->id);
}
}
break;
fail:
gs->apply(&tmh);
sendToAllClients(&tmh);
sendAndApply(&tmh);
break;
}
default:
@ -180,11 +198,6 @@ void CGameHandler::handleConnection(std::set<int> players, CConnection &c)
end = true;
}
}
template <typename T>void CGameHandler::sendToAllClients(CPack<T> * info)
{
BOOST_FOREACH(CConnection* c, conns)
*c << info->getType() << *info->This();
}
CGameHandler::CGameHandler(void)
{
gs = NULL;
@ -198,7 +211,68 @@ void CGameHandler::init(StartInfo *si, int Seed)
{
Mapa *map = new Mapa(si->mapname);
gs = new CGameState();
gs->init(si,map,Seed);
gs->init(si,map,Seed);
/****************************SCRIPTS************************************************/
//std::map<int, std::map<std::string, CObjectScript*> > * skrypty = &objscr; //alias for easier access
/****************************C++ OBJECT SCRIPTS************************************************/
std::map<int,CCPPObjectScript*> scripts;
CScriptCallback * csc = new CScriptCallback();
csc->gh = this;
handleCPPObjS(&scripts,new CVisitableOPH(csc));
handleCPPObjS(&scripts,new CVisitableOPW(csc));
handleCPPObjS(&scripts,new CPickable(csc));
handleCPPObjS(&scripts,new CMines(csc));
handleCPPObjS(&scripts,new CTownScript(csc));
handleCPPObjS(&scripts,new CHeroScript(csc));
handleCPPObjS(&scripts,new CMonsterS(csc));
handleCPPObjS(&scripts,new CCreatureGen(csc));
//created map
/****************************LUA OBJECT SCRIPTS************************************************/
//std::vector<std::string> * lf = CLuaHandler::searchForScripts("scripts/lua/objects"); //files
//for (int i=0; i<lf->size(); i++)
//{
// try
// {
// std::vector<std::string> * temp = CLuaHandler::functionList((*lf)[i]);
// CLuaObjectScript * objs = new CLuaObjectScript((*lf)[i]);
// CLuaCallback::registerFuncs(objs->is);
// //objs
// for (int j=0; j<temp->size(); j++)
// {
// int obid ; //obj ID
// int dspos = (*temp)[j].find_first_of('_');
// obid = atoi((*temp)[j].substr(dspos+1,(*temp)[j].size()-dspos-1).c_str());
// std::string fname = (*temp)[j].substr(0,dspos);
// if (skrypty->find(obid)==skrypty->end())
// skrypty->insert(std::pair<int, std::map<std::string, CObjectScript*> >(obid,std::map<std::string,CObjectScript*>()));
// (*skrypty)[obid].insert(std::pair<std::string, CObjectScript*>(fname,objs));
// }
// delete temp;
// }HANDLE_EXCEPTION
//}
/****************************INITIALIZING OBJECT SCRIPTS************************************************/
//std::string temps("newObject");
for (unsigned i=0; i<map->objects.size(); i++)
{
//c++ scripts
if (scripts.find(map->objects[i]->ID) != scripts.end())
{
map->objects[i]->state = scripts[map->objects[i]->ID];
map->objects[i]->state->newObject(map->objects[i]->id);
}
else
{
map->objects[i]->state = NULL;
}
//// lua scripts
//if(checkFunc(map->objects[i]->ID,temps))
// (*skrypty)[map->objects[i]->ID][temps]->newObject(map->objects[i]);
}
//delete lf;
}
int lowestSpeed(CGHeroInstance * chi)
{
@ -257,8 +331,7 @@ void CGameHandler::newTurn()
}
n.res.insert(r);
}
gs->apply(&n);
sendToAllClients(&n);
sendAndApply(&n);
//for (std::set<CCPPObjectScript *>::iterator i=gs->cppscripts.begin();i!=gs->cppscripts.end();i++)
//{
// (*i)->newTurn();

View File

@ -5,22 +5,45 @@ class CVCMIServer;
class CGameState;
class CConnection;
struct StartInfo;
class CCPPObjectScript;
class CScriptCallback;
template <typename T> struct CPack;
class CGameHandler
{
CGameState *gs;
std::set<CCPPObjectScript *> cppscripts; //C++ scripts
//std::map<int, std::map<std::string, CObjectScript*> > objscr; //non-C++ scripts
CVCMIServer *s;
std::map<int,CConnection*> connections;
std::set<CConnection*> conns;
void handleCPPObjS(std::map<int,CCPPObjectScript*> * mapa, CCPPObjectScript * script);
public:
CGameHandler(void);
~CGameHandler(void);
void init(StartInfo *si, int Seed);
void handleConnection(std::set<int> players, CConnection &c);
template <typename T>void sendToAllClients(CPack<T> * info);
template <typename T>void sendToAllClients(CPack<T> * info)
{
for(std::set<CConnection*>::iterator i=conns.begin(); i!=conns.end();i++)
{
(*i)->rmx->lock();
**i << info->getType() << *info->This();
(*i)->rmx->unlock();
}
}
template <typename T>void sendAndApply(CPack<T> * info)
{
gs->apply(info);
sendToAllClients(info);
}
void run();
void newTurn();
friend class CVCMIServer;
friend class CScriptCallback;
};

292
server/CScriptCallback.cpp Normal file
View File

@ -0,0 +1,292 @@
#include "CScriptCallback.h"
#include "../lib/Connection.h"
#include "CVCMIServer.h"
#include "CGameHandler.h"
#include "../CGameState.h"
#include "../map.h"
#include "../hch/CObjectHandler.h"
#include "../hch/CTownHandler.h"
#include "../hch/CHeroHandler.h"
#include "../lib/NetPacks.h"
#include <boost/foreach.hpp>
#include <boost/thread.hpp>
CScriptCallback::CScriptCallback(void)
{
}
CScriptCallback::~CScriptCallback(void)
{
}
void CScriptCallback::setBlockVis(int objid, bool bv)
{
SetObjectProperty sop(objid,2,bv);
gh->sendAndApply(&sop);
}
void CScriptCallback::setOwner(int objid, ui8 owner)
{
SetObjectProperty sop(objid,1,owner);
gh->sendAndApply(&sop);
}
const CGObjectInstance* CScriptCallback::getObj(int objid)
{
return gh->gs->map->objects[objid];
}
const CGHeroInstance* CScriptCallback::getHero(int objid)
{
return static_cast<const CGHeroInstance*>(gh->gs->map->objects[objid]);
}
const CGTownInstance* CScriptCallback::getTown(int objid)
{
return static_cast<const CGTownInstance*>(gh->gs->map->objects[objid]);
}
void CScriptCallback::setHoverName(int objid, MetaString* name)
{
SetHoverName shn(objid, *name);
gh->sendAndApply(&shn);
}
int3 CScriptCallback::getPos(CGObjectInstance * ob)
{
return ob->pos;
}
void CScriptCallback::changePrimSkill(int ID, int which, int val)
{
//CGHeroInstance * hero = gh->gs->map->getHero(ID,0);
//if (which<PRIMARY_SKILLS)
//{
// hero->primSkills[which]+=val;
// sv->playerint[hero->getOwner()]->heroPrimarySkillChanged(hero, which, val);
//}
//else if (which==4)
//{
// hero->exp+=val;
// if(hero->exp >= CGI->heroh->reqExp(hero->level+1)) //new level
// {
// hero->level++;
// std::cout << hero->name <<" got level "<<hero->level<<std::endl;
// int r = rand()%100, pom=0, x=0;
// int std::pair<int,int>::*g = (hero->level>9) ? (&std::pair<int,int>::second) : (&std::pair<int,int>::first);
// for(;x<PRIMARY_SKILLS;x++)
// {
// pom += hero->type->heroClass->primChance[x].*g;
// if(r<pom)
// break;
// }
// std::cout << "Bohater dostaje umiejetnosc pierwszorzedna " << x << " (wynik losowania "<<r<<")"<<std::endl;
// hero->primSkills[x]++;
// //TODO: dac dwie umiejetnosci 2-rzedne to wyboru
// }
// //TODO - powiadomic interfejsy, sprawdzic czy nie ma awansu itp
//}
}
int CScriptCallback::getHeroOwner(int heroID)
{
//CGHeroInstance * hero = CGI->state->map->getHero(heroID,0);
//return hero->getOwner();
return -1;
}
void CScriptCallback::showInfoDialog(int player, std::string text, std::vector<SComponent*> * components)
{
//TODO: upewniac sie ze mozemy to zrzutowac (przy customowych interfejsach cos moze sie kopnac)
//if (player>=0)
//{
// CGameInterface * temp = sv->playerint[player];
// if (temp->human)
// ((CPlayerInterface*)(temp))->showInfoDialog(text,*components);
// return;
//}
//else
//{
// typedef std::pair<const ui8, CGameInterface*> intf;
// BOOST_FOREACH(intf & i, sv->playerint)
// {
// if (i.second->human)
// ((CPlayerInterface*)(i.second))->showInfoDialog(text,*components);
// }
//}
}
void CScriptCallback::showSelDialog(int player, std::string text, std::vector<CSelectableComponent*>*components, IChosen * asker)
{
//CGameInterface * temp = sv->playerint[player];
//if (temp->human)
// ((CPlayerInterface*)(temp))->showSelDialog(text,*components,(int)asker);
return;
}
int CScriptCallback::getSelectedHero()
{
int ret;
//if (LOCPLINT->adventureInt->selection.type == HEROI_TYPE)
// ret = ((CGHeroInstance*)(LOCPLINT->adventureInt->selection.selected))->subID;
//else
// ret = -1;;
return ret;
}
int CScriptCallback::getDate(int mode)
{
int temp;
switch (mode)
{
case 0:
return gh->gs->day;
break;
case 1:
temp = (gh->gs->day)%7;
if (temp)
return temp;
else return 7;
break;
case 2:
temp = ((gh->gs->day-1)/7)+1;
if (!(temp%4))
return 4;
else
return (temp%4);
break;
case 3:
return ((gh->gs->day-1)/28)+1;
break;
}
return 0;
}
void CScriptCallback::giveResource(int player, int which, int val)
{
//gh->gs->players[player].resources[which]+=val;
//sv->playerint[player]->receivedResource(which,val);
}
void CScriptCallback::showCompInfo(int player, SComponent * comp)
{
//CPlayerInterface * i = dynamic_cast<CPlayerInterface*>(sv->playerint[player]);
//if(i)
// i->showComp(*comp);
}
void CScriptCallback::heroVisitCastle(int obj, int heroID)
{
//CGTownInstance * n;
//if(n = dynamic_cast<CGTownInstance*>(ob))
//{
// n->visitingHero = CGI->state->map->getHero(heroID,0);
// gh->gs->map->getHero(heroID,0)->visitedTown = n;
// sv->playerint[getHeroOwner(heroID)]->heroVisitsTown(CGI->state->map->getHero(heroID,0),n);
//}
//else
// return;
}
void CScriptCallback::stopHeroVisitCastle(int obj, int heroID)
{
//CGTownInstance * n;
//if(n = dynamic_cast<CGTownInstance*>(ob))
//{
// CGI->state->map->getHero(heroID,0)->visitedTown = NULL;
// if(n->visitingHero && n->visitingHero->type->ID == heroID)
// n->visitingHero = NULL;
// return;
//}
//else
// return;
}
void CScriptCallback::giveHeroArtifact(int artid, int hid, int position) //pos==-1 - first free slot in backpack
{
CGHeroInstance* h = gh->gs->map->getHero(hid,0);
if(position<0)
{
for(unsigned i=0;i<h->artifacts.size();i++)
{
if(!h->artifacts[i])
{
h->artifacts[i] = artid;
return;
}
}
h->artifacts.push_back(artid);
return;
}
else
{
if(h->artifWorn[position]) //slot is occupied
{
giveHeroArtifact(h->artifWorn[position],hid,-1);
}
h->artifWorn[position] = artid;
}
}
void CScriptCallback::startBattle(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2) //use hero=NULL for no hero
{
//gh->gs->battle(army1,army2,tile,hero1,hero2);
}
void CScriptCallback::startBattle(int heroID, CCreatureSet * army, int3 tile) //for hero<=>neutral army
{
//CGHeroInstance* h = gh->gs->map->getHero(heroID,0);
//gh->gs->battle(&h->army,army,tile,h,NULL);
}
void CLuaCallback::registerFuncs(lua_State * L)
{
// lua_newtable(L);
//
//#define REGISTER_C_FUNC(x) \
// lua_pushstring(L, #x); \
// lua_pushcfunction(L, x); \
// lua_rawset(L, -3)
//
// REGISTER_C_FUNC(getPos);
// REGISTER_C_FUNC(changePrimSkill);
// REGISTER_C_FUNC(getGnrlText);
// REGISTER_C_FUNC(getSelectedHero);
//
// lua_setglobal(L, "vcmi");
// #undef REGISTER_C_FUNC
}
int CLuaCallback::getPos(lua_State * L)//(CGObjectInstance * object);
{
//const int args = lua_gettop(L); // number of arguments
//if ((args < 1) || !lua_isnumber(L, 1) )
// luaL_error(L,
// "Incorrect arguments to getPos([Object address])");
//CGObjectInstance * object = (CGObjectInstance *)(lua_tointeger(L, 1));
//lua_pushinteger(L,object->pos.x);
//lua_pushinteger(L,object->pos.y);
//lua_pushinteger(L,object->pos.z);
return 3;
}
int CLuaCallback::changePrimSkill(lua_State * L)//(int ID, int which, int val);
{
//const int args = lua_gettop(L); // number of arguments
//if ((args < 1) || !lua_isnumber(L, 1) ||
// ((args >= 2) && !lua_isnumber(L, 2)) ||
// ((args >= 3) && !lua_isnumber(L, 3)) )
//{
// luaL_error(L,
// "Incorrect arguments to changePrimSkill([Hero ID], [Which Primary skill], [Change by])");
//}
//int ID = lua_tointeger(L, 1),
// which = lua_tointeger(L, 2),
// val = lua_tointeger(L, 3);
//CScriptCallback::changePrimSkill(ID,which,val);
return 0;
}
int CLuaCallback::getGnrlText(lua_State * L) //(int which),returns string
{
//const int args = lua_gettop(L); // number of arguments
//if ((args < 1) || !lua_isnumber(L, 1) )
// luaL_error(L,
// "Incorrect arguments to getGnrlText([Text ID])");
//int which = lua_tointeger(L,1);
//lua_pushstring(L,CGI->generaltexth->allTexts[which].c_str());
return 1;
}
int CLuaCallback::getSelectedHero(lua_State * L) //(),returns int (ID of hero, -1 if no hero is seleceted)
{
//int ret;
//if (LOCPLINT->adventureInt->selection.type == HEROI_TYPE)
// ret = ((CGHeroInstance*)(LOCPLINT->adventureInt->selection.selected))->subID;
//else
// ret = -1;
//lua_pushinteger(L,ret);
return 1;
}

62
server/CScriptCallback.h Normal file
View File

@ -0,0 +1,62 @@
#pragma once
#include "../global.h"
#include <vector>
class CVCMIServer;
class CGameHandler;
class SComponent;
class CSelectableComponent;
class IChosen;
class CCreatureSet;
class CGHeroInstance;
class CGObjectInstance;
class CGHeroInstance;
class CGTownInstance;
class CGameState;
struct lua_State;
struct MetaString;
class CScriptCallback
{
CScriptCallback(void);
public:
~CScriptCallback(void);
CGameHandler *gh;
//get info
static int3 getPos(CGObjectInstance * ob);
int getHeroOwner(int heroID);
int getSelectedHero();
int getDate(int mode=0);
const CGObjectInstance* getObj(int objid);
const CGHeroInstance* getHero(int objid);
const CGTownInstance* getTown(int objid);
//do sth
void setBlockVis(int objid, bool bv);
void setOwner(int objid, ui8 owner);
void setHoverName(int objid, MetaString * name);
void changePrimSkill(int ID, int which, int val);
void showInfoDialog(int player, std::string text, std::vector<SComponent*> * components); //TODO: obslugiwac nulle
void showSelDialog(int player, std::string text, std::vector<CSelectableComponent*>*components, IChosen * asker);
void giveResource(int player, int which, int val);
void showCompInfo(int player, SComponent * comp);
void heroVisitCastle(int obj, int heroID);
void stopHeroVisitCastle(int obj, int heroID);
void giveHeroArtifact(int artid, int hid, int position); //pos==-1 - first free slot in backpack
void startBattle(const CCreatureSet * army1, const CCreatureSet * army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2); //use hero=NULL for no hero
void startBattle(int heroID, CCreatureSet * army, int3 tile); //for hero<=>neutral army
//friends
friend class CGameHandler;
};
class CLuaCallback : public CScriptCallback
{
private:
static void registerFuncs(lua_State * L);
static int getPos(lua_State * L);//(CGObjectInstance * object);
static int changePrimSkill(lua_State * L);//(int ID, int which, int val);
static int getGnrlText(lua_State * L);//(int ID, int which, int val);
static int getSelectedHero(lua_State * L);//()
friend class CGameHandler;
};

View File

@ -1,6 +1,7 @@
#pragma once
#include "../global.h"
#include <set>
class CConnection;
namespace boost
{
namespace asio

View File

@ -175,6 +175,14 @@
RelativePath=".\CGameHandler.cpp"
>
</File>
<File
RelativePath="..\CLua.cpp"
>
</File>
<File
RelativePath=".\CScriptCallback.cpp"
>
</File>
<File
RelativePath=".\CVCMIServer.cpp"
>
@ -189,6 +197,14 @@
RelativePath=".\CGameHandler.h"
>
</File>
<File
RelativePath="..\CLua.h"
>
</File>
<File
RelativePath=".\CScriptCallback.h"
>
</File>
<File
RelativePath=".\CVCMIServer.h"
>