1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-09-16 09:26:28 +02:00

* new files (CAdvmapInterface.h and CAdvmapInterface.cpp)

* more player interface (but it's still beginning)
* int3 members public
* more usage of int3
* adjusted animation speed
* reversed changes from rev.165 in CPreGame - it wasn't bug, it just works so. That change was breaking a few things in CPreGame and was needless - Player ID == Player's Color. I thought it was obvious.
* minor stuff
This commit is contained in:
Michał W. Urbańczyk
2007-08-03 21:47:34 +00:00
parent 9b5686b40c
commit 0ea7a46309
16 changed files with 307 additions and 42 deletions

71
CAdvmapInterface.cpp Normal file
View File

@@ -0,0 +1,71 @@
#include "stdafx.h"
#include "CAdvmapInterface.h"
CAdvMapInt::CAdvMapInt(int Player)
:player(Player)
{
bg = CGI->bitmaph->loadBitmap("ADVMAP.bmp");
blueToPlayersAdv(bg,player);
}
CAdvMapInt::~CAdvMapInt()
{
SDL_FreeSurface(bg);
}
void AdventureMapButton::clickLeft (tribool down)
{
if (down)
state=1;
else state=0;
show();
int i;
}
void AdventureMapButton::clickRight (tribool down)
{
//TODO: show/hide infobox
}
void AdventureMapButton::hover (bool on)
{
//TODO: print info in statusbar
}
void AdventureMapButton::activate()
{
ClickableL::activate();
Hoverable::activate();
KeyInterested::activate();
}
void AdventureMapButton::keyPressed (SDL_KeyboardEvent & key)
{
//TODO: check if it's shortcut
}
void AdventureMapButton::deactivate()
{
ClickableL::deactivate();
Hoverable::deactivate();
KeyInterested::deactivate();
}
AdventureMapButton::AdventureMapButton ()
{
type=2;
abs=true;
active=false;
ourObj=NULL;
state=0;
}
void CList::activate()
{
ClickableL::activate();
ClickableR::activate();
Hoverable::activate();
KeyInterested::activate();
};
void CList::deactivate()
{
ClickableL::deactivate();
ClickableR::deactivate();
Hoverable::deactivate();
KeyInterested::deactivate();
};
void CList::clickLeft(tribool down)
{
};

116
CAdvmapInterface.h Normal file
View File

@@ -0,0 +1,116 @@
#ifndef CADVENTUREMAPINTERFACE_H
#define CADVENTUREMAPINTERFACE_H
#include "SDL.h"
#include "CDefHandler.h"
#include "SDL_Extensions.h"
#include "CGameInterface.h"
#include "CGameInfo.h"
#include "SDL_Extensions.h"
#include <boost/logic/tribool.hpp>
#define CGI (CGameInfo::mainObj)
using namespace boost::logic;
using namespace CSDL_Ext;
class AdventureMapButton
: public ClickableL, public ClickableR, public Hoverable, public KeyInterested, public CButtonBase
{
public:
std::string name; //for status bar
std::string helpBox; //for right-click help
char key; //key shortcut
void (CAdvMapInt::*function)(); //function in CAdvMapInt called when this button is pressed, different for each button
void clickRight (tribool down);
void clickLeft (tribool down);
void hover (bool on);
void keyPressed (SDL_KeyboardEvent & key);
void activate(); // makes button active
void deactivate(); // makes button inactive (but don't deletes)
AdventureMapButton(); //c-tor
AdventureMapButton( std::string Name, std::string HelpBox, void(CAdvMapInt::*Function)() );//c-tor
};
/*****************************/
class CList
: public ClickableL, public ClickableR, public Hoverable, public KeyInterested, public CIntObject
{
SDL_Surface * bg;
//arrow up, arrow down
int posw, posh; //position width/height
void clickLeft(tribool down);
void activate();
void deactivate();
virtual void select(int which)=0;
};
class CHeroList
: public CList
{
void select(int which);
void clickRight(tribool down);
};
class CTownList
: public CList
{
void select(int which);
void clickRight(tribool down);
};
class CResourceBar
:public ClickableR, public CIntObject
{
SDL_Surface * bg;
void clickRight(tribool down);
void refresh();
};
class CDataBar
:public ClickableR, public CIntObject
{
SDL_Surface * bg;
void clickRight(tribool down);
void refresh();
};
class CStatusBar
{
SDL_Surface * bg;
std::string current;
void print(std::string text);
};
class CMinimap
: public ClickableL, public ClickableR, public Hoverable, public CIntObject
{
SDL_Surface * radar; //radar.def
SDL_Surface * terrainMap;
SDL_Surface * undTerrainMap; //underground
//TODO flagged buildings
bool underground;
int3 position; //top left corner of visible map part
};
/*****************************/
class CAdvMapInt : public CGameInterface //adventure map interface
{
CAdvMapInt(int Player);
~CAdvMapInt();
int player;
SDL_Surface * bg;
AdventureMapButton kingOverview,//- kingdom overview
undeground,//- underground switch
questlog,//- questlog
sleepWake, //- sleep/wake hero
moveHero, //- move hero
spellbook,//- spellbook
advOptions, //- adventure options
sysOptions,//- system options
nextHero, //- next hero
endTurn;//- end turn
//CHeroList herolist;
void show();
};
#endif //CADVENTUREMAPINTERFACE_H

View File

@@ -465,9 +465,9 @@ void CAmbarCendamo::deh3m()
//std::cout << "object nr "<<ww<<"\ti= "<<i<<std::endl; //std::cout << "object nr "<<ww<<"\ti= "<<i<<std::endl;
CObjectInstance nobj; //we will read this object CObjectInstance nobj; //we will read this object
nobj.id = CGameInfo::mainObj->objh->objInstances.size(); nobj.id = CGameInfo::mainObj->objh->objInstances.size();
nobj.x = bufor[i++]; nobj.pos.x = bufor[i++];
nobj.y = bufor[i++]; nobj.pos.y = bufor[i++];
nobj.z = bufor[i++]; nobj.pos.z = bufor[i++];
nobj.defNumber = readNormalNr(i, 4); i+=4; nobj.defNumber = readNormalNr(i, 4); i+=4;
//if (((nobj.x==0)&&(nobj.y==0)) || nobj.x>map.width || nobj.y>map.height || nobj.z>1 || nobj.defNumber>map.defy.size()) //if (((nobj.x==0)&&(nobj.y==0)) || nobj.x>map.width || nobj.y>map.height || nobj.z>1 || nobj.defNumber>map.defy.size())

View File

@@ -17,6 +17,7 @@
#include "CLodHandler.h" #include "CLodHandler.h"
#include "CTownHandler.h" #include "CTownHandler.h"
#include "CGeneralTextHandler.h" #include "CGeneralTextHandler.h"
#include "CGameInterface.h"
#include "SDL.h" #include "SDL.h"
#include <vector> #include <vector>
@@ -43,6 +44,7 @@ public:
CLodHandler * spriteh; CLodHandler * spriteh;
CLodHandler * bitmaph; CLodHandler * bitmaph;
CGeneralTextHandler * generaltexth; CGeneralTextHandler * generaltexth;
CPlayerInterface * playerint;
std::vector<SDL_Color> playerColors; std::vector<SDL_Color> playerColors;
SDL_Color neutralColor; SDL_Color neutralColor;
StartInfo scenarioOps; StartInfo scenarioOps;

View File

@@ -1,8 +1,63 @@
#include "stdafx.h" #include "stdafx.h"
#include "CGameInterface.h" #include "CGameInterface.h"
#include "CMessage.h"
#include "SDL_Extensions.h"
using namespace CSDL_Ext; using namespace CSDL_Ext;
CButtonBase::CButtonBase()
{
type=-1;
abs=false;
active=false;
ourObj=NULL;
state=0;
}
void CButtonBase::show() void CButtonBase::show()
{
if (!abs)
{ {
blitAt(imgs[state],pos.x,pos.y); blitAt(imgs[state],pos.x,pos.y);
updateRect(&pos); updateRect(&pos);
} }
else
{
blitAt(imgs[state],pos.x+ourObj->pos.x,pos.y+ourObj->pos.y);
updateRect(&genRect(pos.h,pos.w,pos.x+ourObj->pos.x,pos.y+ourObj->pos.y));
}
}
void ClickableL::activate()
{
CGI->playerint->lclickable.push_back(this);
}
void ClickableL::deactivate()
{
CGI->playerint->lclickable.erase(std::find(CGI->playerint->lclickable.begin(),CGI->playerint->lclickable.end(),this));
}
void ClickableR::activate()
{
CGI->playerint->rclickable.push_back(this);
}
void ClickableR::deactivate()
{
CGI->playerint->rclickable.erase(std::find(CGI->playerint->rclickable.begin(),CGI->playerint->rclickable.end(),this));
}
void Hoverable::activate()
{
CGI->playerint->hoverable.push_back(this);
}
void Hoverable::deactivate()
{
CGI->playerint->hoverable.erase(std::find(CGI->playerint->hoverable.begin(),CGI->playerint->hoverable.end(),this));
}
void KeyInterested::activate()
{
CGI->playerint->keyinterested.push_back(this);
}
void KeyInterested::deactivate()
{
CGI->playerint->
keyinterested.erase(std::find(CGI->playerint->keyinterested.begin(),CGI->playerint->keyinterested.end(),this));
}

View File

@@ -4,16 +4,11 @@
#include "SDL.h" #include "SDL.h"
#include "CDefHandler.h" #include "CDefHandler.h"
#include "SDL_Extensions.h" #include "SDL_Extensions.h"
class CGameInterface #include <boost/logic/tribool.hpp>
{ BOOST_TRIBOOL_THIRD_STATE(outOfRange)
}; using namespace boost::logic;
class CAdvMapInt : public CGameInterface //adventure map interface class CAdvMapInt;
{
SDL_Surface * bg;
};
class CAICallback : public CGameInterface // callback for AI
{
};
class CIntObject //interface object class CIntObject //interface object
{ {
public: public:
@@ -23,45 +18,65 @@ public:
class CButtonBase : public CIntObject class CButtonBase : public CIntObject
{ {
public: public:
int type; int type; //advmapbutton=2
bool abs; bool abs;
struct Offset bool active;
{
int x, y;
} *offset;
CIntObject * ourObj; CIntObject * ourObj;
int state; int state;
std::vector<SDL_Surface*> imgs; std::vector<SDL_Surface*> imgs;
virtual void show() ; virtual void show() ;
CButtonBase(){abs=true;ourObj=NULL;} virtual void activate()=0;
virtual void deactivate()=0;
CButtonBase();
}; };
class ClickableL : public virtual CButtonBase //for left-clicks class ClickableL //for left-clicks
{ {
public:
bool pressed; bool pressed;
virtual void press (bool down)=0; virtual void clickLeft (tribool down)=0;
virtual void activate()=0;
virtual void deactivate()=0;
}; };
class ClickableR : public virtual CButtonBase //for right-clicks class ClickableR //for right-clicks
{ {
public:
bool pressed; bool pressed;
virtual void click (bool down)=0; virtual void clickRight (tribool down)=0;
virtual void activate()=0;
virtual void deactivate()=0;
}; };
class Hoverable : public virtual CButtonBase class Hoverable
{ {
public:
bool hovered; bool hovered;
virtual void hover (bool on)=0; virtual void hover (bool on)=0;
virtual void activate()=0;
virtual void deactivate()=0;
}; };
class KeyInterested : public virtual CButtonBase class KeyInterested
{ {
public:
virtual void keyPressed (SDL_KeyboardEvent & key)=0; virtual void keyPressed (SDL_KeyboardEvent & key)=0;
virtual void activate()=0;
virtual void deactivate()=0;
}; };
class CGameInterface
{
};
class CAICallback : public CGameInterface // callback for AI
{
};
class CPlayerInterface class CPlayerInterface
{ {
static CGameInterface * gamein; public:
static CAdvMapInt * adventureInt;
std::vector<ClickableL*> lclickable; std::vector<ClickableL*> lclickable;
std::vector<ClickableR*> rclickable; std::vector<ClickableR*> rclickable;
std::vector<Hoverable*> hoverable; std::vector<Hoverable*> hoverable;
std::vector<KeyInterested*> keyinterested; std::vector<KeyInterested*> keyinterested;
void handleEvent(SDL_Event * sEvent); void handleEvent(SDL_Event * sEvent);
}; };
#endif //CGAMEINTERFACE_H #endif //CGAMEINTERFACE_H

View File

@@ -44,17 +44,17 @@ class CHeroInstance
{ {
public: public:
int owner; int owner;
CHero type;
int exp; //experience point int exp; //experience point
int level; //current level of hero int level; //current level of hero
std::string name; //may be custom std::string name; //may be custom
std::string biography; //may be custom std::string biography; //may be custom
int portrait; //may be custom int portrait; //may be custom
CHero type;
int3 pos; //position on adventure map int3 pos; //position on adventure map
CCreatureSet army; //army CCreatureSet army; //army
int mana; // remaining spell points int mana; // remaining spell points
int movement; //remaining movement points int movement; //remaining movement points
//TODO: artifacts, primary and secondary skills, known spells, commander, blessings, curses, morale/luck modifiers //TODO: artifacts, primary and secondary skills, known spells, commander, blessings, curses, morale/luck special modifiers
}; };
class CHeroHandler class CHeroHandler

View File

@@ -237,6 +237,7 @@ int _tmain(int argc, _TCHAR* argv[])
CGameInfo * cgi = new CGameInfo; //contains all global informations about game (texts, lodHandlers, map handler itp.) CGameInfo * cgi = new CGameInfo; //contains all global informations about game (texts, lodHandlers, map handler itp.)
CGameInfo::mainObj = cgi; CGameInfo::mainObj = cgi;
cgi->mush = mush; cgi->mush = mush;
THC std::cout<<"Initializing screen, fonts and sound handling: "<<tmh.getDif()<<std::endl; THC std::cout<<"Initializing screen, fonts and sound handling: "<<tmh.getDif()<<std::endl;
cgi->spriteh = new CLodHandler; cgi->spriteh = new CLodHandler;
cgi->spriteh->init(std::string("newH3sprite.lod")); cgi->spriteh->init(std::string("newH3sprite.lod"));

View File

@@ -27,8 +27,8 @@ public:
static SDL_Surface * drawBox1(int w, int h, int playerColor=1); static SDL_Surface * drawBox1(int w, int h, int playerColor=1);
static std::vector<std::string> * breakText(std::string text, int line=30, bool userBreak=true); //line - chars per line static std::vector<std::string> * breakText(std::string text, int line=30, bool userBreak=true); //line - chars per line
CMessage(); CMessage();
void init(); static void init();
void dispose(); static void dispose();
}; };
// //

View File

@@ -292,7 +292,7 @@ class CObjectInstance //instance of object
public: public:
int defNumber; //specifies number of def file with animation of this object int defNumber; //specifies number of def file with animation of this object
int id; //number of object in CObjectHandler's vector int id; //number of object in CObjectHandler's vector
int x, y, z; // position int3 pos; // position
CSpecObjInfo * info; //pointer to something with additional information CSpecObjInfo * info; //pointer to something with additional information
}; };

Binary file not shown.

View File

@@ -74,6 +74,8 @@ void CSDL_Ext::printAtMiddle(std::string text, int x, int y, TTF_Font * font, SD
} }
void CSDL_Ext::printAt(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality) void CSDL_Ext::printAt(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality)
{ {
if (text.length()==0)
return;
SDL_Surface * temp; SDL_Surface * temp;
switch (quality) switch (quality)
{ {

View File

@@ -9,6 +9,7 @@ extern SDL_Color tytulowy, tlo, zwykly ;
void blitAtWR(SDL_Surface * src, int x, int y, SDL_Surface * dst=ekran); void blitAtWR(SDL_Surface * src, int x, int y, SDL_Surface * dst=ekran);
void blitAt(SDL_Surface * src, int x, int y, SDL_Surface * dst=ekran); void blitAt(SDL_Surface * src, int x, int y, SDL_Surface * dst=ekran);
void updateRect (SDL_Rect * rect, SDL_Surface * scr = ekran); void updateRect (SDL_Rect * rect, SDL_Surface * scr = ekran);
SDL_Rect genRect(int hh, int ww, int xx, int yy);
namespace CSDL_Ext namespace CSDL_Ext
{ {
void SDL_PutPixel(SDL_Surface *ekran, int x, int y, Uint8 R, Uint8 G, Uint8 B, int myC=0, Uint8 A = 255); //myC influences the start of reading pixels void SDL_PutPixel(SDL_Surface *ekran, int x, int y, Uint8 R, Uint8 G, Uint8 B, int myC=0, Uint8 A = 255); //myC influences the start of reading pixels

View File

@@ -9,7 +9,8 @@ struct StartInfo
{ {
struct PlayerSettings struct PlayerSettings
{ {
int castle, hero, heroPortrait; //ID, if -1 then random, if -2 then none int castle, hero, //ID, if -1 then random, if -2 then none
heroPortrait; //-1 if default, else ID
std::string heroName; std::string heroName;
Ebonus bonus; Ebonus bonus;
Ecolor color; //from 0 - Ecolor color; //from 0 -

1
int3.h
View File

@@ -3,6 +3,7 @@
class int3 class int3
{ {
public:
int x,y,z; int x,y,z;
inline int3():x(0),y(0),z(0){}; //c-tor, x/y/z initialized to 0 inline int3():x(0),y(0),z(0){}; //c-tor, x/y/z initialized to 0
inline int3(const int X, const int Y, const int Z):x(X),y(Y),z(Z){}; //c-tor inline int3(const int X, const int Y, const int Z):x(X),y(Y),z(Z){}; //c-tor

View File

@@ -684,14 +684,14 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
std::vector<ObjSorter> highPrObjsVis; std::vector<ObjSorter> highPrObjsVis;
for(int gg=0; gg<CGameInfo::mainObj->objh->objInstances.size(); ++gg) for(int gg=0; gg<CGameInfo::mainObj->objh->objInstances.size(); ++gg)
{ {
if(CGameInfo::mainObj->objh->objInstances[gg].x >= x-Woff-4 && CGameInfo::mainObj->objh->objInstances[gg].x < dx+x-Hoff+4 && CGameInfo::mainObj->objh->objInstances[gg].y >= y-Hoff-4 && CGameInfo::mainObj->objh->objInstances[gg].y < dy+y-Hoff+4 && CGameInfo::mainObj->objh->objInstances[gg].z == level) if(CGameInfo::mainObj->objh->objInstances[gg].pos.x >= x-Woff-4 && CGameInfo::mainObj->objh->objInstances[gg].pos.x < dx+x-Hoff+4 && CGameInfo::mainObj->objh->objInstances[gg].pos.y >= y-Hoff-4 && CGameInfo::mainObj->objh->objInstances[gg].pos.y < dy+y-Hoff+4 && CGameInfo::mainObj->objh->objInstances[gg].pos.z == level)
{ {
if(!CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].isOnDefList) if(!CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].isOnDefList)
{ {
ObjSorter os; ObjSorter os;
os.bitmap = CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[anim%CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages.size()].bitmap; os.bitmap = CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[anim%CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages.size()].bitmap;
os.xpos = (CGameInfo::mainObj->objh->objInstances[gg].x-x+Woff)*32; os.xpos = (CGameInfo::mainObj->objh->objInstances[gg].pos.x-x+Woff)*32;
os.ypos = (CGameInfo::mainObj->objh->objInstances[gg].y-y+Hoff)*32; os.ypos = (CGameInfo::mainObj->objh->objInstances[gg].pos.y-y+Hoff)*32;
highPrObjsVis.push_back(os); highPrObjsVis.push_back(os);
} }
else if(CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].printPriority==0) else if(CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].printPriority==0)
@@ -703,8 +703,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
os.bitmap = CGameInfo::mainObj->ac->map.defy[defyod].handler->ourImages[ourimagesod].bitmap; os.bitmap = CGameInfo::mainObj->ac->map.defy[defyod].handler->ourImages[ourimagesod].bitmap;
os.xpos = (CGameInfo::mainObj->objh->objInstances[gg].x-x+Woff)*32; os.xpos = (CGameInfo::mainObj->objh->objInstances[gg].pos.x-x+Woff)*32;
os.ypos = (CGameInfo::mainObj->objh->objInstances[gg].y-y+Hoff)*32; os.ypos = (CGameInfo::mainObj->objh->objInstances[gg].pos.y-y+Hoff)*32;
if (CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].isVisitable()) if (CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].isVisitable())
highPrObjsVis.push_back(os); highPrObjsVis.push_back(os);
else else
@@ -714,8 +714,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
{ {
ObjSorter os; ObjSorter os;
os.bitmap = CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[anim%CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages.size()].bitmap; os.bitmap = CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[anim%CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages.size()].bitmap;
os.xpos = (CGameInfo::mainObj->objh->objInstances[gg].x-x+Woff)*32; os.xpos = (CGameInfo::mainObj->objh->objInstances[gg].pos.x-x+Woff)*32;
os.ypos = (CGameInfo::mainObj->objh->objInstances[gg].y-y+Hoff)*32; os.ypos = (CGameInfo::mainObj->objh->objInstances[gg].pos.y-y+Hoff)*32;
lowPrObjs.push_back(os); lowPrObjs.push_back(os);
} }
} }