1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-21 21:17:49 +02:00

* first version of player interface displaying

* taking some txt files from lods
* some minor changes
This commit is contained in:
mateuszb 2007-08-04 19:01:22 +00:00
parent 0ea7a46309
commit ae279c79c5
18 changed files with 525 additions and 521 deletions

@ -1,81 +1,24 @@
#include "stdafx.h"
#include "CAbilityHandler.h"
#include "CGameInfo.h"
#include "CGeneralTextHandler.h"
void CAbilityHandler::loadAbilities()
{
std::ifstream inp("H3bitmap.lod\\SSTRAITS.TXT", std::ios::in);
std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("SSTRAITS.TXT");
int it=0;
std::string dump;
for(int i=0; i<5; ++i)
for(int i=0; i<2; ++i)
{
inp>>dump;
CGeneralTextHandler::loadToIt(dump,buf,it,3);
}
inp.ignore();
while(!inp.eof())
for (int i=0; i<SKILL_QUANTITY; i++)
{
CAbility * nab = new CAbility; //new creature, that will be read
std::string base;
char * tab = new char[500];
int iitBef = 0;
int iit = 0;
inp.getline(tab, 500);
base = std::string(tab);
if(base.size()<2) //ended, but some rubbish could still stay end we have something useless
{
inp.close();
return; //add counter
}
while(base[iit]!='\t')
{
++iit;
}
nab->name = base.substr(0, iit);
++iit;
iitBef=iit;
nab->basicText = base.substr(iitBef, base.size()-iitBef);
inp.getline(tab, 500);
inp.getline(tab, 500);
base = std::string(tab);
iitBef = 0;
iit = 0;
while(base[iit]!='\t')
{
++iit;
}
nab->basicText2 = base.substr(0, iit);
++iit;
iitBef=iit;
nab->advText = base.substr(iitBef, base.size()-iitBef);
inp.getline(tab, 500);
inp.getline(tab, 500);
base = std::string(tab);
iitBef = 0;
iit = 0;
while(base[iit]!='\t')
{
++iit;
}
nab->advText2 = base.substr(0, iit);
++iit;
iitBef=iit;
nab->expText = base.substr(iitBef, base.size()-iitBef);
inp.getline(tab, 500);
inp.getline(tab, 500);
base = std::string(tab);
nab->expText2 = base;
CAbility * nab = new CAbility; //new skill, that will be read
CGeneralTextHandler::loadToIt(nab->name,buf,it,4);
CGeneralTextHandler::loadToIt(nab->basicText,buf,it,4);
CGeneralTextHandler::loadToIt(nab->advText,buf,it,4);
CGeneralTextHandler::loadToIt(nab->expText,buf,it,3);
nab->idNumber = abilities.size();
abilities.push_back(nab);
delete [500] tab;
}
}

@ -8,9 +8,9 @@ class CAbility
{
public:
std::string name;
std::string basicText, basicText2;
std::string advText, advText2;
std::string expText, expText2;
std::string basicText;
std::string advText;
std::string expText;
int idNumber;
bool isAllowed; //true if we can use this hero's ability (map information)
};

@ -6,6 +6,18 @@ CAdvMapInt::CAdvMapInt(int Player)
{
bg = CGI->bitmaph->loadBitmap("ADVMAP.bmp");
blueToPlayersAdv(bg,player);
scrollingLeft = false;
scrollingRight = false;
scrollingUp = false ;
scrollingDown = false ;
updateScreen = false;
anim=0;
animValHitCount=0; //animation frame
gems.push_back(CGI->spriteh->giveDef("agemLL.def"));
gems.push_back(CGI->spriteh->giveDef("agemLR.def"));
gems.push_back(CGI->spriteh->giveDef("agemUL.def"));
gems.push_back(CGI->spriteh->giveDef("agemUR.def"));
}
CAdvMapInt::~CAdvMapInt()
{
@ -68,4 +80,45 @@ void CList::deactivate()
};
void CList::clickLeft(tribool down)
{
};
};
void CTerrainRect::activate()
{
ClickableL::activate();
ClickableR::activate();
Hoverable::activate();
KeyInterested::activate();
};
void CTerrainRect::deactivate()
{
ClickableL::deactivate();
ClickableR::deactivate();
Hoverable::deactivate();
KeyInterested::deactivate();
};
void CTerrainRect::clickLeft(tribool down){}
void CTerrainRect::clickRight(tribool down){}
void CTerrainRect::hover(bool on){}
void CTerrainRect::keyPressed (SDL_KeyboardEvent & key){}
void CTerrainRect::show()
{
SDL_Surface * teren = CGI->mh->terrainRect
(CURPLINT->adventureInt->position.x,CURPLINT->adventureInt->position.y,
19,18,CURPLINT->adventureInt->position.z,CURPLINT->adventureInt->anim);
SDL_BlitSurface(teren,&genRect(547,594,0,0),ekran,&genRect(547,594,7,6));
SDL_FreeSurface(teren);
}
void CAdvMapInt::show()
{
blitAt(bg,0,0);
SDL_Flip(ekran);
}
void CAdvMapInt::update()
{
terrain.show();
blitAt(gems[2]->ourImages[CURPLINT->playerID].bitmap,6,6);
blitAt(gems[0]->ourImages[CURPLINT->playerID].bitmap,6,508);
blitAt(gems[1]->ourImages[CURPLINT->playerID].bitmap,556,508);
blitAt(gems[3]->ourImages[CURPLINT->playerID].bitmap,556,6);
updateRect(&genRect(550,600,6,6));
}

@ -71,7 +71,9 @@ class CDataBar
void refresh();
};
class CStatusBar
: public CIntObject
{
public:
SDL_Surface * bg;
std::string current;
void print(std::string text);
@ -79,6 +81,7 @@ class CStatusBar
class CMinimap
: public ClickableL, public ClickableR, public Hoverable, public CIntObject
{
public:
SDL_Surface * radar; //radar.def
SDL_Surface * terrainMap;
SDL_Surface * undTerrainMap; //underground
@ -87,15 +90,41 @@ class CMinimap
bool underground;
int3 position; //top left corner of visible map part
};
class CTerrainRect
: public ClickableL, public ClickableR, public Hoverable, public CIntObject, public KeyInterested
{
public:
void activate();
void deactivate();
void clickLeft(tribool down);
void clickRight(tribool down);
void hover(bool on);
void keyPressed (SDL_KeyboardEvent & key);
void show();
};
/*****************************/
class CAdvMapInt : public CGameInterface //adventure map interface
class CAdvMapInt //adventure map interface
{
public:
CAdvMapInt(int Player);
~CAdvMapInt();
int3 position; //top left corner of visible map part
int player;
std::vector<CDefHandler *> gems;
bool scrollingLeft ;
bool scrollingRight ;
bool scrollingUp ;
bool scrollingDown ;
bool updateScreen ;
unsigned char anim, animValHitCount; //animation frame
SDL_Surface * bg;
AdventureMapButton kingOverview,//- kingdom overview
undeground,//- underground switch
@ -108,9 +137,13 @@ class CAdvMapInt : public CGameInterface //adventure map interface
nextHero, //- next hero
endTurn;//- end turn
//CHeroList herolist;
CTerrainRect terrain;
void show();
void update();
};
#endif //CADVENTUREMAPINTERFACE_H

@ -2499,9 +2499,9 @@ void CAmbarCendamo::processMap(std::vector<std::string> & defsToUnpack)
}
else
{
if(CGI->scenarioOps.playerInfos[((CCastleObjInfo*)CGI->objh->objInstances[j].info)->player].castle>-1)
if(CGI->scenarioOps.getIthPlayersSettings(((CCastleObjInfo*)CGI->objh->objInstances[j].info)->player).castle>-1)
{
nxt.bytes[20] = CGI->scenarioOps.playerInfos[((CCastleObjInfo*)CGI->objh->objInstances[j].info)->player].castle;
nxt.bytes[20] = CGI->scenarioOps.getIthPlayersSettings(((CCastleObjInfo*)CGI->objh->objInstances[j].info)->player).castle;
}
else
{

@ -1,233 +1,105 @@
#include "stdafx.h"
#include "CArtHandler.h"
#include "CGameInfo.h"
#include "CGeneralTextHandler.h"
void CArtHandler::loadArtifacts()
{
std::ifstream inp("H3bitmap.lod\\ARTRAITS.TXT", std::ios::in);
std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("ARTRAITS.TXT");
int it=0;
std::string dump;
for(int i=0; i<44; ++i)
for(int i=0; i<2; ++i)
{
inp>>dump;
CGeneralTextHandler::loadToIt(dump,buf,it,3);
}
inp.ignore();
int numberlet = 0; //numer of artifact
while(!inp.eof())
for (int i=0; i<ARTIFACTS_QUANTITY; i++)
{
CArtifact nart;
nart.number = numberlet++;
char * read = new char[10000]; //here we'll have currently read character
inp.getline(read, 10000);
int eol=0; //end of looking
std::string ss = std::string(read);
if(ss==std::string("") && inp.eof())
{
delete [10000] read;
loadArtEvents();
return;
}
for(int i=0; i<200; ++i)
{
if(ss[i]=='\t')
{
nart.name = ss.substr(0, i);
eol=i+1;
break;
}
}
if(nart.name==std::string("-1") || nart.name==std::string("-2"))
{
artifacts.push_back(nart);
continue;
}
for(int i=eol; i<eol+200; ++i)
{
if(ss[i]=='\t')
{
nart.price = atoi(ss.substr(eol, i).c_str());
eol=i+1;
break;
}
}
if(ss[eol]=='x')
nart.spellBook = true;
else
nart.spellBook = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.warMachine4 = true;
else
nart.warMachine4 = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.warMachine3 = true;
else
nart.warMachine3 = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.warMachine2 = true;
else
nart.warMachine2 = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.warMachine1 = true;
else
nart.warMachine1 = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.misc5 = true;
else
nart.misc5 = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.misc4 = true;
else
nart.misc4 = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.misc3 = true;
else
nart.misc3 = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.misc2 = true;
else
nart.misc2 = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.misc1 = true;
else
nart.misc1 = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.feet = true;
else
nart.feet = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.lRing = true;
else
nart.lRing = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.rRing = true;
else
nart.rRing = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.torso = true;
else
nart.torso = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.lHand = true;
else
nart.lHand = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.rHand = true;
else
nart.rHand = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.neck = true;
else
nart.neck = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.shoulders = true;
else
nart.shoulders = false;
if(ss[eol++]!='\t')
eol++;
if(ss[eol]=='x')
nart.head = true;
else
nart.head = false;
if(ss[eol++]!='\t')
eol++;
switch(ss[eol])
{
case 'J':
nart.aClass = EartClass::JartClass;
break;
case 'N':
nart.aClass = EartClass::NartClass;
break;
case 'R':
nart.aClass = EartClass::RartClass;
break;
case 'S':
nart.aClass = EartClass::SartClass;
break;
case 'T':
nart.aClass = EartClass::TartClass;
break;
}
if(ss[eol++]!='\t')
eol++;
nart.description = ss.substr(eol, ss.size());
inp.getline(read, 10000);
int bowCounter=0;
nart.desc2 = "";
do //do - while begin
{
++bowCounter;
inp.getline(read, 10000);
//inp.ignore();
ss = std::string(read);
nart.desc2 += ss;
}
while(nart.desc2[nart.desc2.size()-1]!='"' ||
( (nart.name==std::string("£uk Penetracji")||nart.name==std::string("Bow of Seeking")) && bowCounter<4) ); //do - while end
//if(nart.name!=std::string("-1") && nart.name!=std::string("-2"))
nart.description += "\n\n";
nart.description += nart.desc2;
this->artifacts.push_back(nart);
delete[10000] read;
}
loadArtEvents();
}
std::string pom;
CGeneralTextHandler::loadToIt(nart.name,buf,it,4);
CGeneralTextHandler::loadToIt(pom,buf,it,4);
nart.price=atoi(pom.c_str());
bool CArtHandler::loadArtEvents()
{
std::ifstream inp("H3bitmap.lod\\ARTEVENT.TXT", std::ios::in);
if(!inp.is_open())
{
return false;
}
for(int i=0; i<this->artifacts.size(); ++i)
{
char * tab = new char[1000];
inp.getline(tab, 1000);
std::string spo = std::string("\42-1\42");
if(std::string(tab).substr(0, std::string(tab).size()-1)==std::string("\42-1\42")
|| std::string(tab).substr(0, std::string(tab).size()-1)==std::string("\"-2\""))
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.spellBook=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.warMachine4=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.warMachine3=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.warMachine2=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.warMachine1=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.misc5=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.misc4=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.misc3=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.misc2=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.misc1=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.feet=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.lRing=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.rRing=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.torso=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.lHand=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.rHand=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.neck=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.shoulders=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
if (pom.length())
nart.head=true;
CGeneralTextHandler::loadToIt(pom,buf,it,4);
switch (pom[0])
{
continue;
case 'S':
nart.aClass=EartClass::SartClass;
break;
case 'T':
nart.aClass=EartClass::TartClass;
break;
case 'N':
nart.aClass=EartClass::NartClass;
break;
case 'J':
nart.aClass=EartClass::JartClass;
break;
case 'R':
nart.aClass=EartClass::RartClass;
break;
}
artifacts[i].eventText = std::string(tab).substr(0, std::string(tab).size()-1);
delete[1000] tab;
CGeneralTextHandler::loadToIt(nart.description,buf,it,3);
nart.id=artifacts.size();
artifacts.push_back(nart);
}
return true;
}

@ -12,12 +12,12 @@ public:
bool isAllowed; //true if we can use this artifact (map information)
std::string name;
std::string description;
std::string desc2;
//std::string desc2;
std::string eventText;
unsigned int price;
bool spellBook, warMachine1, warMachine2, warMachine3, warMachine4, misc1, misc2, misc3, misc4, misc5, feet, lRing, rRing, torso, lHand, rHand, neck, shoulders, head;
EartClass aClass;
int number;
int id;
};
class CArtHandler //handles artifacts

@ -1,5 +1,7 @@
#include "stdafx.h"
#include "CDefObjInfoHandler.h"
#include "CGameInfo.h"
#include <sstream>
bool DefObjInfo::operator==(const std::string & por) const
{
@ -8,7 +10,7 @@ bool DefObjInfo::operator==(const std::string & por) const
void CDefObjInfoHandler::load()
{
std::ifstream inp("H3bitmap.lod\\ZOBJCTS.TXT", std::ios::in | std::ios::binary);
std::istringstream inp(CGameInfo::mainObj->bitmaph->getTextFile("ZOBJCTS.TXT"));
int objNumber;
inp>>objNumber;
for(int hh=0; hh<objNumber; ++hh)
@ -24,5 +26,4 @@ void CDefObjInfoHandler::load()
inp>>nobj.priority;
objs.push_back(nobj);
}
inp.close();
}

@ -18,6 +18,8 @@
#include "CTownHandler.h"
#include "CGeneralTextHandler.h"
#include "CGameInterface.h"
#include "CGameState.h"
#include "mapHandler.h"
#include "SDL.h"
#include <vector>
@ -25,15 +27,19 @@
CGameInfo class
for allowing different functions for modifying game informations
*/
class CMapHandler;
class CGameInfo
{
public:
static CGameInfo * mainObj; //pointer to main CGameInfo object
CGameState * state;
CArtHandler * arth;
CHeroHandler * heroh;
CCreatureHandler * creh;
CAbilityHandler * abilh;
CSpellHandler * spellh;
CMapHandler * mh;
CAmbarCendamo * ac;
CBuildingHandler * buildh;
CObjectHandler * objh;
@ -44,7 +50,7 @@ public:
CLodHandler * spriteh;
CLodHandler * bitmaph;
CGeneralTextHandler * generaltexth;
CPlayerInterface * playerint;
std::vector<CGameInterface *> playerint;
std::vector<SDL_Color> playerColors;
SDL_Color neutralColor;
StartInfo scenarioOps;

@ -1,11 +1,10 @@
#include "stdafx.h"
#include "CGameInterface.h"
#include "CAdvMapInterface.h"
#include "CMessage.h"
#include "SDL_Extensions.h"
#include "SDL_framerate.h"
using namespace CSDL_Ext;
CButtonBase::CButtonBase()
{
type=-1;
@ -30,34 +29,222 @@ void CButtonBase::show()
}
void ClickableL::activate()
{
CGI->playerint->lclickable.push_back(this);
CURPLINT->lclickable.push_back(this);
}
void ClickableL::deactivate()
{
CGI->playerint->lclickable.erase(std::find(CGI->playerint->lclickable.begin(),CGI->playerint->lclickable.end(),this));
CURPLINT->lclickable.erase
(std::find(CURPLINT->lclickable.begin(),CURPLINT->lclickable.end(),this));
}
void ClickableR::activate()
{
CGI->playerint->rclickable.push_back(this);
CURPLINT->rclickable.push_back(this);
}
void ClickableR::deactivate()
{
CGI->playerint->rclickable.erase(std::find(CGI->playerint->rclickable.begin(),CGI->playerint->rclickable.end(),this));
CURPLINT->rclickable.erase(std::find(CURPLINT->rclickable.begin(),CURPLINT->rclickable.end(),this));
}
void Hoverable::activate()
{
CGI->playerint->hoverable.push_back(this);
CURPLINT->hoverable.push_back(this);
}
void Hoverable::deactivate()
{
CGI->playerint->hoverable.erase(std::find(CGI->playerint->hoverable.begin(),CGI->playerint->hoverable.end(),this));
CURPLINT->hoverable.erase(std::find(CURPLINT->hoverable.begin(),CURPLINT->hoverable.end(),this));
}
void KeyInterested::activate()
{
CGI->playerint->keyinterested.push_back(this);
CURPLINT->keyinterested.push_back(this);
}
void KeyInterested::deactivate()
{
CGI->playerint->
keyinterested.erase(std::find(CGI->playerint->keyinterested.begin(),CGI->playerint->keyinterested.end(),this));
}
CURPLINT->
keyinterested.erase(std::find(CURPLINT->keyinterested.begin(),CURPLINT->keyinterested.end(),this));
}
CPlayerInterface::CPlayerInterface(int Player)
{
playerID=Player;
human=true;
adventureInt = new CAdvMapInt(Player);
}
void CPlayerInterface::yourTurn()
{
unsigned char & animVal = CURPLINT->adventureInt->anim; //for animations handling
adventureInt->show();
//show rest of things
//initializing framerate keeper
FPSmanager * mainLoopFramerateKeeper = new FPSmanager;
SDL_initFramerate(mainLoopFramerateKeeper);
SDL_setFramerate(mainLoopFramerateKeeper, 30);
SDL_Event sEvent;
//framerate keeper initialized
for(;;) // main loop
{
CURPLINT->adventureInt->updateScreen = false;
if(SDL_PollEvent(&sEvent)) //wait for event...
{
handleEvent(&sEvent);
}
++CURPLINT->adventureInt->animValHitCount; //for animations
if(CURPLINT->adventureInt->animValHitCount == 2)
{
CURPLINT->adventureInt->animValHitCount = 0;
++animVal;
CURPLINT->adventureInt->updateScreen = true;
}
if(CURPLINT->adventureInt->scrollingLeft)
{
if(CURPLINT->adventureInt->position.x>0)
{
CURPLINT->adventureInt->position.x--;
CURPLINT->adventureInt->updateScreen = true;
}
}
if(CURPLINT->adventureInt->scrollingRight)
{
if(CURPLINT->adventureInt->position.x<CGI->ac->map.width-19+8)
{
CURPLINT->adventureInt->position.x++;
CURPLINT->adventureInt->updateScreen = true;
}
}
if(CURPLINT->adventureInt->scrollingUp)
{
if(CURPLINT->adventureInt->position.y>0)
{
CURPLINT->adventureInt->position.y--;
CURPLINT->adventureInt->updateScreen = true;
}
}
if(CURPLINT->adventureInt->scrollingDown)
{
if(CURPLINT->adventureInt->position.y<CGI->ac->map.height-18+8)
{
CURPLINT->adventureInt->position.y++;
CURPLINT->adventureInt->updateScreen = true;
}
}
if(CURPLINT->adventureInt->updateScreen)
{
adventureInt->update();
CURPLINT->adventureInt->updateScreen=false;
}
SDL_Delay(5); //give time for other apps
SDL_framerateDelay(mainLoopFramerateKeeper);
}
}
void CPlayerInterface::handleEvent(SDL_Event *sEvent)
{
if(sEvent->type==SDL_QUIT)
exit(0);
else if (sEvent->type==SDL_KEYDOWN)
{
switch (sEvent->key.keysym.sym)
{
case SDLK_LEFT:
{
CURPLINT->adventureInt->scrollingLeft = true;
break;
}
case (SDLK_RIGHT):
{
CURPLINT->adventureInt->scrollingRight = true;
break;
}
case (SDLK_UP):
{
CURPLINT->adventureInt->scrollingUp = true;
break;
}
case (SDLK_DOWN):
{
CURPLINT->adventureInt->scrollingDown = true;
break;
}
case (SDLK_q):
{
exit(0);
break;
}
case (SDLK_u):
{
if(!CGI->ac->map.twoLevel)
break;
if (adventureInt->position.z)
adventureInt->position.z--;
else adventureInt->position.z++;
CURPLINT->adventureInt->updateScreen = true;
break;
}
}
} //keydown end
else if(sEvent->type==SDL_KEYUP)
{
switch (sEvent->key.keysym.sym)
{
case SDLK_LEFT:
{
CURPLINT->adventureInt->scrollingLeft = false;
break;
}
case (SDLK_RIGHT):
{
CURPLINT->adventureInt->scrollingRight = false;
break;
}
case (SDLK_UP):
{
CURPLINT->adventureInt->scrollingUp = false;
break;
}
case (SDLK_DOWN):
{
CURPLINT->adventureInt->scrollingDown = false;
break;
}
}
}//keyup end
else if(sEvent->type==SDL_MOUSEMOTION)
{
if(sEvent->motion.x<15)
{
CURPLINT->adventureInt->scrollingLeft = true;
}
else
{
CURPLINT->adventureInt->scrollingLeft = false;
}
if(sEvent->motion.x>ekran->w-15)
{
CURPLINT->adventureInt->scrollingRight = true;
}
else
{
CURPLINT->adventureInt->scrollingRight = false;
}
if(sEvent->motion.y<15)
{
CURPLINT->adventureInt->scrollingUp = true;
}
else
{
CURPLINT->adventureInt->scrollingUp = false;
}
if(sEvent->motion.y>ekran->h-15)
{
CURPLINT->adventureInt->scrollingDown = true;
}
else
{
CURPLINT->adventureInt->scrollingDown = false;
}
}
} //event end

@ -62,21 +62,31 @@ public:
};
class CGameInterface
{
};
class CAICallback : public CGameInterface // callback for AI
{
};
public:
bool human;
int playerID;
class CPlayerInterface
virtual void yourTurn()=0{};
};
class CGlobalAI : public CGameInterface // callback for AI
{
public:
static CAdvMapInt * adventureInt;
virtual void yourTurn(){};
};
class CPlayerInterface : public CGameInterface
{
public:
CAdvMapInt * adventureInt;
//TODO: town interace, battle interface, other interfaces
std::vector<ClickableL*> lclickable;
std::vector<ClickableR*> rclickable;
std::vector<Hoverable*> hoverable;
std::vector<KeyInterested*> keyinterested;
void yourTurn();
void handleEvent(SDL_Event * sEvent);
CPlayerInterface(int Player);
};
#endif //CGAMEINTERFACE_H

@ -17,8 +17,9 @@
struct PlayerState
{
public:
int color;
vector<vector<bool> > fogOfWarMap;
std::vector<std::vector<std::vector<bool> > >fogOfWarMap;
std::vector<int> resources;
std::vector<CHeroInstance> heroes;
std::vector<CTownInstance> towns;
@ -26,6 +27,8 @@ struct PlayerState
class CGameState
{
public:
int currentPlayer;
std::map<int,PlayerState> players; //color <-> playerstate
};

@ -253,6 +253,18 @@ void CGeneralTextHandler::loadToIt(std::string &dest, std::string &src, int &ite
iter+=2;
break;
}
case 4:
{
int befi=iter;
for(iter; iter<src.size(); ++iter)
{
if(src[iter]=='\t')
break;
}
dest = src.substr(befi, iter-befi);
iter++;
break;
}
}
}

@ -22,7 +22,7 @@ public:
std::string somethingsRiseFromDeath, somethingRisesFormDeath, somethingDiesUnderGaze, somethingsDieUnderGaze, somethingTakesDefensiveStance, somethingsTakeDefensiveStance, somethingExp, nearestTownOccupied, noAvailableTown, heroTooTiredSpell, townGateCannotBeUsed, youHaveNoHeroes, heroHasCastSpell;
std::string doYouWishToSaveSomethingsArmy, problemsWithInputDevices, problemsWithSound, problemsWithMouse, problemsWithWindows, abandonedShipyard, spellFailed, somethingPauses, somethingsPause, somethingLevelSomething, somethingStudiedMagic, learnsSpeced, andSpaced, fromSomethingSpaced;*/
void loadToIt(std::string & dest, std::string & src, int & iter, int mode = 0); //mode 0 - dump to tab, dest to tab, dump to eol //mode 1 - dump to tab, src to eol //mode 2 - copy to tab, dump to eol //mode 3 - copy to eol
static void loadToIt(std::string & dest, std::string & src, int & iter, int mode = 0); //mode 0 - dump to tab, dest to tab, dump to eol //mode 1 - dump to tab, src to eol //mode 2 - copy to tab, dump to eol //mode 3 - copy to eol //mode 4 - copy to tab
void load();
};

@ -2,6 +2,9 @@
#include "CHeroHandler.h"
#include "CGameInfo.h"
#include <sstream>
#include "CGameInfo.h"
#include "CGeneralTextHandler.h"
#define CGI (CGameInfo::mainObj)
CHeroHandler::~CHeroHandler()
@ -31,13 +34,14 @@ void CHeroHandler::loadPortraits()
void CHeroHandler::loadHeroes()
{
int ID=0;
std::ifstream inp("H3bitmap.lod\\HOTRAITS.TXT", std::ios::in);
std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("HOTRAITS.TXT");
int it=0;
std::string dump;
for(int i=0; i<25; ++i)
for(int i=0; i<2; ++i)
{
inp>>dump;
CGeneralTextHandler::loadToIt(dump,buf,it,3);
}
inp.ignore();
int numberOfCurrentClassHeroes = 0;
int currentClass = 0;
int additHero = 0;
@ -55,7 +59,8 @@ void CHeroHandler::loadHeroes()
addTab[10] = HERO_BARBARIAN;
addTab[11] = HERO_DEMONIAC;
while(!inp.eof())
for (int i=0; i<HEROES_QUANTITY; i++)
{
CHero * nher = new CHero;
if(currentClass<18)
@ -72,196 +77,67 @@ void CHeroHandler::loadHeroes()
{
nher->heroType = addTab[additHero++];
}
std::string base;
char * tab = new char[500];
int iit = 0;
inp.getline(tab, 500);
base = std::string(tab);
if(base.size()<2) //ended, but some rubbish could still stay end we have something useless
{
loadSpecialAbilities();
loadBiographies();
loadHeroClasses();
initHeroClasses();
inp.close();
return;
}
while(base[iit]!='\t')
{
++iit;
}
nher->name = base.substr(0, iit);
++iit;
for(int i=iit; i<iit+100; ++i)
{
if(base[i]==(char)(10) || base[i]==(char)(9))
{
nher->low1stack = atoi(base.substr(iit, i).c_str());
iit=i+1;
break;
}
}
for(int i=iit; i<iit+100; ++i)
{
if(base[i]==(char)(10) || base[i]==(char)(9))
{
nher->high1stack = atoi(base.substr(iit, i).c_str());
iit=i+1;
break;
}
}
int ipom=iit;
while(base[ipom]!='\t')
{
++ipom;
}
nher->refType1stack = base.substr(iit, ipom-iit);
iit=ipom+1;
for(int i=iit; i<iit+100; ++i)
{
if(base[i]==(char)(10) || base[i]==(char)(9))
{
nher->low2stack = atoi(base.substr(iit, i-iit).c_str());
iit=i+1;
break;
}
}
for(int i=iit; i<iit+100; ++i)
{
if(base[i]==(char)(10) || base[i]==(char)(9))
{
nher->high2stack = atoi(base.substr(iit, i-iit).c_str());
iit=i+1;
break;
}
}
ipom=iit;
while(base[ipom]!='\t')
{
++ipom;
}
nher->refType2stack = base.substr(iit, ipom-iit);
iit=ipom+1;
for(int i=iit; i<iit+100; ++i)
{
if(base[i]==(char)(10) || base[i]==(char)(9))
{
nher->low3stack = atoi(base.substr(iit, i-iit).c_str());
iit=i+1;
break;
}
}
for(int i=iit; i<iit+100; ++i)
{
if(base[i]==(char)(10) || base[i]==(char)(9))
{
nher->high3stack = atoi(base.substr(iit, i-iit).c_str());
iit=i+1;
break;
}
}
nher->refType3stack = base.substr(iit, base.size()-iit);
nher->ID=ID++;
std::string pom ;
CGeneralTextHandler::loadToIt(nher->name,buf,it,4);
CGeneralTextHandler::loadToIt(pom,buf,it,4);
nher->low1stack = atoi(pom.c_str());
CGeneralTextHandler::loadToIt(pom,buf,it,4);
nher->high1stack = atoi(pom.c_str());
CGeneralTextHandler::loadToIt(nher->refType1stack,buf,it,4);
CGeneralTextHandler::loadToIt(pom,buf,it,4);
nher->low2stack = atoi(pom.c_str());
CGeneralTextHandler::loadToIt(pom,buf,it,4);
nher->high2stack = atoi(pom.c_str());
CGeneralTextHandler::loadToIt(nher->refType2stack,buf,it,4);
CGeneralTextHandler::loadToIt(pom,buf,it,4);
nher->low3stack = atoi(pom.c_str());
CGeneralTextHandler::loadToIt(pom,buf,it,4);
nher->high3stack = atoi(pom.c_str());
CGeneralTextHandler::loadToIt(nher->refType3stack,buf,it,3);
nher->ID = heroes.size();
heroes.push_back(nher);
delete[500] tab;
}
loadSpecialAbilities();
loadBiographies();
loadHeroClasses();
initHeroClasses();
return;
}
void CHeroHandler::loadSpecialAbilities()
{
std::ifstream inp("H3bitmap.lod\\HEROSPEC.txt", std::ios::in);
std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("HEROSPEC.TXT");
int it=0;
std::string dump;
for(int i=0; i<7; ++i)
for(int i=0; i<2; ++i)
{
inp>>dump;
CGeneralTextHandler::loadToIt(dump,buf,it,3);
}
inp.ignore();
int whHero=0;
while(!inp.eof() && whHero<heroes.size())
for (int i=0;i<heroes.size();i++)
{
std::string base;
char * tab = new char[500];
int iitBef = 0;
int iit = 0;
inp.getline(tab, 500);
base = std::string(tab);
if(base.size()<2) //ended, but some rubbish could still stay end we have something useless
{
inp.close();
return; //add counter
}
while(base[iit]!='\t')
{
++iit;
}
heroes[whHero]->bonusName = base.substr(0, iit);
++iit;
iitBef=iit;
if(heroes[whHero]->bonusName == std::string("Ogry"))
{
char * tab2 = new char[500];
inp.getline(tab2, 500);
base += std::string(tab2);
delete [500] tab2;
}
while(base[iit]!='\t')
{
++iit;
}
heroes[whHero]->shortBonus = base.substr(iitBef, iit-iitBef);
++iit;
iitBef=iit;
while(base[iit]!='\t' && iit<base.size())
{
++iit;
}
heroes[whHero]->longBonus = base.substr(iitBef, iit-iitBef);
++whHero;
delete [500] tab;
CGeneralTextHandler::loadToIt(heroes[i]->bonusName,buf,it,4);
CGeneralTextHandler::loadToIt(heroes[i]->shortBonus,buf,it,4);
CGeneralTextHandler::loadToIt(heroes[i]->longBonus,buf,it,3);
}
inp.close();
}
void CHeroHandler::loadBiographies()
{
std::ifstream inp("H3bitmap.lod\\HEROBIOS.TXT", std::ios::in | std::ios::binary);
inp.seekg(0,std::ios::end); // na koniec
int andame = inp.tellg(); // read length
inp.seekg(0,std::ios::beg); // wracamy na poczatek
char * bufor = new char[andame]; // allocate memory
inp.read((char*)bufor, andame); // read map file to buffer
inp.close();
std::string buf = std::string(bufor);
delete [andame] bufor;
int i = 0; //buf iterator
for(int q=0; q<heroes.size(); ++q)
{
std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("HEROBIOS.TXT");
int it=0;
for (int i=0;i<heroes.size();i++)
{
int befi=i;
for(i; i<andame; ++i)
{
if(buf[i]=='\r')
break;
}
heroes[q]->biography = buf.substr(befi, i-befi);
i+=2;
CGeneralTextHandler::loadToIt(heroes[i]->biography,buf,it,3);
}
}
void CHeroHandler::loadHeroClasses()
{
//std::ifstream inp("H3bitmap.lod\\HCTRAITS.TXT", std::ios::in | std::ios::binary);
//inp.seekg(0,std::ios::end); // na koniec
//int andame = inp.tellg(); // read length
//inp.seekg(0,std::ios::beg); // wracamy na poczatek
//char * bufor = new char[andame]; // allocate memory
//inp.read((char*)bufor, andame); // read map file to buffer
//inp.close();
//std::string buf = std::string(bufor);
//delete [andame] bufor;
std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("HCTRAITS.TXT");
int andame = buf.size();
for(int y=0; y<andame; ++y)

48
CMT.cpp

@ -288,30 +288,7 @@ int _tmain(int argc, _TCHAR* argv[])
cgi->scenarioOps = cpg->runLoop();
THC tmh.getDif();
//////////////////////////////////////////////////////////////////////////////// lod testing
//CLodHandler * clod = new CLodHandler;
//clod->loadLod("h3abp_bm.lod");
//CLodHandler * test = new CLodHandler;
//test->init(std::string("h3abp_bm.lod"));
//CDefHandler * tdef = new CDefHandler;
//tdef->openDef(std::string("newh3sprite\\AVLSPTR3.DEF"));
//tdef->getSprite(0);
//CLodHandler * bitmapLod = new CLodHandler;
//bitmapLod->init(std::string("newH3bitmap.lod"));
//CPCXConv * tconv = new CPCXConv;
//tconv->fromFile(std::string("newh3bitmap\\ADOPBPNL.PCX"));
//tconv->convert();
//tconv->saveBMP(std::string("tesciczekConva.bmp"));
//CSemiDefHandler * semek = new CSemiDefHandler;
//semek->openDef(std::string("EDG.DEF"), std::string("H3sprite.lod"));
//////////////////////////////////////////////////////////////////////////////// lod testing end
cgi->sspriteh = new CSemiLodHandler();
cgi->sspriteh->openLod("H3sprite.lod");
@ -335,8 +312,11 @@ int _tmain(int argc, _TCHAR* argv[])
cgi->generaltexth->load();
cgi->dobjinfo = new CDefObjInfoHandler;
cgi->dobjinfo->load();
cgi->state = new CGameState();
THC std::cout<<"Handlers initailization: "<<tmh.getDif()<<std::endl;
std::string mapname;
if(CPG->ourScenSel->mapsel.selected==0) CPG->ourScenSel->mapsel.selected = 1; //only for tests
if (CPG) mapname = CPG->ourScenSel->mapsel.ourMaps[CPG->ourScenSel->mapsel.selected].filename;
@ -366,6 +346,7 @@ int _tmain(int argc, _TCHAR* argv[])
ac->loadDefs();
THC std::cout<<"Reading terrain defs: "<<tmh.getDif()<<std::endl;
CMapHandler * mh = new CMapHandler();
cgi->mh = mh;
mh->reader = ac;
THC std::cout<<"Creating mapHandler: "<<tmh.getDif()<<std::endl;
mh->init();
@ -378,6 +359,25 @@ int _tmain(int argc, _TCHAR* argv[])
SDL_UpdateRect(ekran, 0, 0, ekran->w, ekran->h);
THC std::cout<<"Displaying terrain: "<<tmh.getDif()<<std::endl;
for (int i=0; i<cgi->scenarioOps.playerInfos.size();i++)
{
if(cgi->scenarioOps.playerInfos[i].name=="AI")
cgi->playerint.push_back(new CGlobalAI());
else cgi->playerint.push_back(new CPlayerInterface(cgi->scenarioOps.playerInfos[i].color));
}
while(1)
{
for (int i=0;i<cgi->playerint.size();i++)
{
cgi->state->currentPlayer=cgi->playerint[i]->playerID;
cgi->playerint[i]->yourTurn();
}
}
//SDL_Surface * ss = ac->defs[0]->ourImages[0].bitmap;
//SDL_BlitSurface(ss, NULL, ekran, NULL);

@ -19,6 +19,12 @@ struct StartInfo
};
std::vector<PlayerSettings> playerInfos;
int turnTime; //in minutes, 0=unlimited
PlayerSettings & getIthPlayersSettings(int no)
{
for(int i=0; i<playerInfos.size(); ++i)
if(playerInfos[i].color == no)
return playerInfos[i];
}
};
#endif

@ -19,11 +19,13 @@ enum ElossCon {lossCastle, lossHero, timeExpires, lossStandard=255};
enum EHeroClasses {HERO_KNIGHT, HERO_CLERIC, HERO_RANGER, HERO_DRUID, HREO_ALCHEMIST, HERO_WIZARD,
HERO_DEMONIAC, HERO_HERETIC, HERO_DEATHKNIGHT, HERO_NECROMANCER, HERO_WARLOCK, HERO_OVERLORD,
HERO_BARBARIAN, HERO_BATTLEMAGE, HERO_BEASTMASTER, HERO_WITCH, HERO_PLANESWALKER, HERO_ELEMENTALIST};
#define CURPLINT (((CPlayerInterface*)(CGI->playerint[CGI->state->currentPlayer]))) //interface of current player (only human)
const int F_NUMBER = 9; //factions quantity
const int PLAYER_LIMIT = 8; //player limit per map
const int HEROES_PER_TYPE=8; //amount of heroes of each type
const int SKILL_QUANTITY=28;
const int ARTIFACTS_QUANTITY=171;
const int HEROES_QUANTITY=156;