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

[PLATFORM] MinGW support added

* disabled features unsupported by MinGW
* fixed issues with DLL_LINKAGE
! BOOST_THREAD_VERSION in now 3 workaround for existing code added, consider refactoring.
* some small tweaks ("-fpedantic" warnings)
This commit is contained in:
alexvins 2012-09-15 19:16:16 +00:00
parent 7087be1f02
commit 369f0ae9c6
19 changed files with 259 additions and 236 deletions

View File

@ -51,6 +51,9 @@
//The only available version is 3, as of Boost 1.50
#define BOOST_FILESYSTEM_VERSION 3
#define BOOST_THREAD_VERSION 3
#define BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE 1
//#define BOOST_SYSTEM_NO_DEPRECATED 1
#include <boost/algorithm/string.hpp>
#include <boost/assert.hpp>
@ -97,7 +100,11 @@ typedef boost::int8_t si8; //signed int 8 bits (1 byte)
// Import + Export macro declarations
#ifdef _WIN32
#ifdef __GNUC__
#define DLL_EXPORT __attribute__((dllexport))
#else
#define DLL_EXPORT __declspec(dllexport)
#endif
#else
#if defined(__GNUC__) && GCC_VERSION >= 400
#define DLL_EXPORT __attribute__ ((visibility("default")))
@ -107,7 +114,11 @@ typedef boost::int8_t si8; //signed int 8 bits (1 byte)
#endif
#ifdef _WIN32
#ifdef __GNUC__
#define DLL_IMPORT __attribute__((dllimport))
#else
#define DLL_IMPORT __declspec(dllimport)
#endif
#else
#if defined(__GNUC__) && GCC_VERSION >= 400
#define DLL_IMPORT __attribute__ ((visibility("default")))

View File

@ -29,7 +29,7 @@ struct BattleResult;
struct BattleSpellCast;
struct CObstacleInstance;
template <typename T> struct CondSh;
struct SetStackEffect;;
struct SetStackEffect;
struct BattleAction;
class CGTownInstance;
struct CatapultAttack;

View File

@ -27,4 +27,4 @@ namespace BitmapHandler
SDL_Surface * loadBitmapFromDir(std::string path, std::string fname, bool setKey=true);
//Load file from any LODs
SDL_Surface * loadBitmap(std::string fname, bool setKey=true);
};
}

View File

@ -351,7 +351,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, const ui8 * FDef, const BMPPal
Uint32 keycol = SDL_MapRGBA(ret->format, ttcol.r, ttcol.b, ttcol.g, ttcol.unused);
SDL_SetColorKey(ret, SDL_SRCCOLORKEY, keycol);
return ret;
};
}
CDefEssential * CDefHandler::essentialize()
{

View File

@ -7,7 +7,7 @@
#include "UIFramework/CIntObject.h"
#ifdef __GNUC__
#define sprintf_s snprintf
#define sprintf_s snprintf
#endif
#ifdef max
@ -69,9 +69,9 @@ namespace boost
{
class mutex;
class recursive_mutex;
};
}
enum
enum
{
/*CHANGE_SCREEN_RESOLUTION = 1,*/
RETURN_TO_MAIN_MENU = 2,
@ -100,7 +100,7 @@ public:
CCastleInterface * castleInt; //NULL if castle window isn't opened
static CBattleInterface * battleInt; //NULL if no battle
CInGameConsole * cingconsole;
CCallback * cb; //to communicate with engine
const BattleAction *curAction; //during the battle - action currently performed by active stack (or NULL)
@ -155,7 +155,7 @@ public:
void receivedResource(int type, int val) OVERRIDE;
void showInfoDialog(const std::string &text, const std::vector<Component*> &components, int soundID) OVERRIDE;
void showRecruitmentDialog(const CGDwelling *dwelling, const CArmedInstance *dst, int level) OVERRIDE;
void showShipyardDialog(const IShipyard *obj) OVERRIDE; //obj may be town or shipyard;
void showShipyardDialog(const IShipyard *obj) OVERRIDE; //obj may be town or shipyard;
void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, int soundID, bool selection, bool cancel) OVERRIDE; //Show a dialog, player must take decision. If selection then he has to choose between one of given components, if cancel he is allowed to not choose. After making choice, CCallback::selectionMade should be called with number of selected component (1 - n) or 0 for cancel (if allowed) and askID.
void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, int queryID) OVERRIDE;
void showPuzzleMap() OVERRIDE;
@ -234,7 +234,7 @@ public:
CGPath *getAndVerifyPath( const CGHeroInstance * h );
void acceptTurn(); //used during hot seat after your turn message is close
void tryDiggging(const CGHeroInstance *h);
void showShipyardDialogOrProblemPopup(const IShipyard *obj); //obj may be town or shipyard;
void showShipyardDialogOrProblemPopup(const IShipyard *obj); //obj may be town or shipyard;
void requestReturningToMainMenu();
void requestStoppingClient();
void sendCustomEvent(int code);

View File

@ -124,7 +124,7 @@ public:
CPicture *playerListBg;
CHighlightableButtonsGroup *difficulty;
CDefHandler *sizes, *sFlags;;
CDefHandler *sizes, *sFlags;
void changeSelection(const CMapInfo *to);
void showAll(SDL_Surface * to);

View File

@ -47,7 +47,7 @@ void checkForError(bool throwing = true)
void blitBuffer(char *buffer, int x, int y, int w, int h, SDL_Surface *dst)
{
const int bpp = dst->format->BytesPerPixel;
const int bpp = dst->format->BytesPerPixel;
char *dest;
for(int i = h; i > 0; i--)
{
@ -142,10 +142,13 @@ bool CBIKHandler::open(std::string name)
tlog1 << "BIK handler: failed to open " << name << std::endl;
goto checkErrorAndClean;
}
//GCC wants scope of waveout to dont cross labels/swith/goto
{
void *waveout = GetProcAddress(dll,"_BinkOpenWaveOut@4");
if(waveout)
binkSetSoundSystem(waveout,NULL);
void *waveout = GetProcAddress(dll,"_BinkOpenWaveOut@4");
if(waveout)
binkSetSoundSystem(waveout,NULL);
}
hBink = binkOpen(hBinkFile, 0x8a800000);
if(!hBink)
@ -166,8 +169,8 @@ checkErrorAndClean:
void CBIKHandler::show( int x, int y, SDL_Surface *dst, bool update )
{
const int w = hBink->width,
h = hBink->height,
const int w = hBink->width,
h = hBink->height,
Bpp = dst->format->BytesPerPixel;
int mode = -1;
@ -298,7 +301,7 @@ bool CSmackPlayer::open( std::string name )
Uint32 flags[2] = {0xff400, 0xfe400};
data = ptrSmackOpen( (void*)name.c_str(), flags[1], -1);
if (!data)
if (!data)
{
tlog1 << "Smack cannot open " << name << std::endl;
checkForError();
@ -337,9 +340,9 @@ void CSmackPlayer::redraw( int x, int y, SDL_Surface *dst, bool update )
{
int w = std::min<int>(data->width, dst->w - x), h = std::min<int>(data->height, dst->h - y);
/* Lock the screen for direct access to the pixels */
if ( SDL_MUSTLOCK(dst) )
if ( SDL_MUSTLOCK(dst) )
{
if ( SDL_LockSurface(dst) < 0 )
if ( SDL_LockSurface(dst) < 0 )
{
fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
return;
@ -374,7 +377,7 @@ void CSmackPlayer::redraw( int x, int y, SDL_Surface *dst, bool update )
//convert rgb 555 to 565
Uint16 pixel = *addr;
Uint16 *p = (Uint16 *)((Uint8 *)dst->pixels + (j+y) * dst->pitch + (i + x) * dst->format->BytesPerPixel);
*p = (pixel & 0x1F)
*p = (pixel & 0x1F)
+ ((pixel & 0x3e0) << 1)
+ ((pixel & 0x7c00) << 1);
@ -383,7 +386,7 @@ void CSmackPlayer::redraw( int x, int y, SDL_Surface *dst, bool update )
}
}
if ( SDL_MUSTLOCK(dst) )
if ( SDL_MUSTLOCK(dst) )
{
SDL_UnlockSurface(dst);
}
@ -425,7 +428,7 @@ bool CVideoPlayer::open(std::string name)
out.exceptions(std::ifstream::failbit | std::ifstream::badbit);
out.write(data.get(), myVideo->getSize());
}
current->open(name);
return true;
}
@ -526,7 +529,7 @@ void CVideoPlayer::update( int x, int y, SDL_Surface *dst, bool forceRedraw, boo
if(!w)
if(!w)
{
show(x,y,dst,update);
}
@ -700,7 +703,7 @@ bool CVideoPlayer::open(std::string fname)
bool CVideoPlayer::open(std::string fname, bool loop, bool useOverlay)
{
close();
this->fname = fname;
offset = 0;
refreshWait = 3;
@ -790,7 +793,7 @@ bool CVideoPlayer::open(std::string fname, bool loop, bool useOverlay)
// Unsupported codec
return false;
}
// Open codec
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(53, 6, 0)
if ( avcodec_open(codecContext, codec) < 0 )
@ -802,7 +805,7 @@ bool CVideoPlayer::open(std::string fname, bool loop, bool useOverlay)
codec = NULL;
return false;
}
// Allocate video frame
frame = avcodec_alloc_frame();
@ -826,8 +829,8 @@ bool CVideoPlayer::open(std::string fname, bool loop, bool useOverlay)
// Convert the image into YUV format that SDL uses
if (overlay)
{
sws = sws_getContext(codecContext->width, codecContext->height,
codecContext->pix_fmt, codecContext->width, codecContext->height,
sws = sws_getContext(codecContext->width, codecContext->height,
codecContext->pix_fmt, codecContext->width, codecContext->height,
PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
}
else
@ -842,8 +845,8 @@ bool CVideoPlayer::open(std::string fname, bool loop, bool useOverlay)
default: return false;
}
sws = sws_getContext(codecContext->width, codecContext->height,
codecContext->pix_fmt, codecContext->width, codecContext->height,
sws = sws_getContext(codecContext->width, codecContext->height,
codecContext->pix_fmt, codecContext->width, codecContext->height,
screenFormat, SWS_BICUBIC, NULL, NULL, NULL);
}
@ -905,7 +908,7 @@ bool CVideoPlayer::nextFrame()
if (overlay) {
SDL_LockYUVOverlay(overlay);
pict.data[0] = overlay->pixels[0];
pict.data[1] = overlay->pixels[2];
pict.data[2] = overlay->pixels[1];
@ -945,7 +948,7 @@ void CVideoPlayer::show( int x, int y, SDL_Surface *dst, bool update )
pos.x = x;
pos.y = y;
CSDL_Ext::blitSurface(dest, &destRect, dst, &pos);
if (update)
SDL_UpdateRect(dst, pos.x, pos.y, pos.w, pos.h);
}
@ -968,14 +971,14 @@ void CVideoPlayer::update( int x, int y, SDL_Surface *dst, bool forceRedraw, boo
else
{
open(fname);
nextFrame();
nextFrame();
// The y position is wrong at the first frame.
// Note: either the windows player or the linux player is
// broken. Compensate here until the bug is found.
// broken. Compensate here until the bug is found.
show(x, y--, dst, update);
}
}
}
else
{
redraw(x, y, dst, update);
@ -986,7 +989,7 @@ void CVideoPlayer::update( int x, int y, SDL_Surface *dst, bool forceRedraw, boo
void CVideoPlayer::close()
{
fname = "";
fname = "";
if (sws)
{
sws_freeContext(sws);
@ -1049,7 +1052,7 @@ bool CVideoPlayer::playVideo(int x, int y, SDL_Surface *dst, bool stopOnKey)
while(nextFrame())
{
if(stopOnKey && keyDown())
return false;
@ -1071,7 +1074,7 @@ bool CVideoPlayer::openAndPlayVideo(std::string name, int x, int y, SDL_Surface
close();
return ret;
}
CVideoPlayer::~CVideoPlayer()
{
close();

View File

@ -89,11 +89,11 @@ public:
ui8 defActionsDef; //default auto actions
ui8 captureChildren; //all newly created objects will get their parents from stack and will be added to parents children list
std::list<CIntObject *> createdObj; //stack of objs being created
static SDLKey arrowToNum(SDLKey key); //converts arrow key to according numpad key
static SDLKey numToDigit(SDLKey key);//converts numpad digit key to normal digit key
static bool isNumKey(SDLKey key, bool number = true); //checks if key is on numpad (numbers - check only for numpad digits)
static bool isArrowKey(SDLKey key);
static bool isArrowKey(SDLKey key);
static bool amIGuiThread();
static void pushSDLEvent(int type, int usercode = 0);
};
@ -122,8 +122,8 @@ struct SSetCaptureState
namespace Colors
{
};
}
#define OBJ_CONSTRUCTION SObjectConstruction obj__i(this)
#define OBJ_CONSTRUCTION_CAPTURING_ALL defActions = 255; SSetCaptureState obj__i1(true, 255); SObjectConstruction obj__i(this)

View File

@ -22,7 +22,7 @@
CPicture::CPicture( SDL_Surface *BG, int x, int y, bool Free )
{
init();
bg = BG;
bg = BG;
freeSurf = Free;
pos.x += x;
pos.y += y;
@ -33,7 +33,7 @@ CPicture::CPicture( SDL_Surface *BG, int x, int y, bool Free )
CPicture::CPicture( const std::string &bmpname, int x, int y )
{
init();
bg = BitmapHandler::loadBitmap(bmpname);
bg = BitmapHandler::loadBitmap(bmpname);
freeSurf = true;;
pos.x += x;
pos.y += y;
@ -315,12 +315,12 @@ void CAdventureMapButton::clickLeft(tribool down, bool previousState)
if(isBlocked())
return;
if (down)
if (down)
{
if (!soundDisabled)
CCS->soundh->playSound(soundBase::button);
setState(PRESSED);
}
}
else if(hoverable && hovered)
setState(HIGHLIGHTED);
else
@ -355,8 +355,8 @@ void CAdventureMapButton::hover (bool on)
if(pressedL && on)
setState(PRESSED);
std::string *name = (vstd::contains(hoverTexts,getState()))
? (&hoverTexts[getState()])
std::string *name = (vstd::contains(hoverTexts,getState()))
? (&hoverTexts[getState()])
: (vstd::contains(hoverTexts,0) ? (&hoverTexts[0]) : NULL);
if(name && name->size() && !isBlocked()) //if there is no name, there is nohing to display also
{
@ -533,7 +533,7 @@ void CHighlightableButtonsGroup::addButton(const std::map<int,std::string> &tool
bt->callback += boost::bind(&CHighlightableButtonsGroup::selectionChanged,this,bt->ID);
bt->onlyOn = true;
buttons.push_back(bt);
}
}
CHighlightableButtonsGroup::CHighlightableButtonsGroup(const CFunctionList2<void(int)> &OnChange, bool musicLikeButtons)
: onChange(OnChange), musicLike(musicLikeButtons)
@ -597,7 +597,7 @@ void CHighlightableButtonsGroup::showAll(SDL_Surface * to)
void CHighlightableButtonsGroup::block( ui8 on )
{
for(size_t i=0;i<buttons.size(); ++i)
for(size_t i=0;i<buttons.size(); ++i)
{
buttons[i]->block(on);
}
@ -614,7 +614,7 @@ void CSlider::mouseMoved (const SDL_MouseMotionEvent & sEvent)
double v = 0;
if(horizontal)
{
if( std::abs(sEvent.y-(pos.y+pos.h/2)) > pos.h/2+40 || std::abs(sEvent.x-(pos.x+pos.w/2)) > pos.w/2 )
if( std::abs(sEvent.y-(pos.y+pos.h/2)) > pos.h/2+40 || std::abs(sEvent.x-(pos.x+pos.w/2)) > pos.w/2 )
return;
v = sEvent.x - pos.x - 24;
v *= positions;
@ -622,7 +622,7 @@ void CSlider::mouseMoved (const SDL_MouseMotionEvent & sEvent)
}
else
{
if(std::abs(sEvent.x-(pos.x+pos.w/2)) > pos.w/2+40 || std::abs(sEvent.y-(pos.y+pos.h/2)) > pos.h/2 )
if(std::abs(sEvent.x-(pos.x+pos.w/2)) > pos.w/2+40 || std::abs(sEvent.y-(pos.y+pos.h/2)) > pos.h/2 )
return;
v = sEvent.y - pos.y - 24;
v *= positions;
@ -746,7 +746,7 @@ CSlider::CSlider(int x, int y, int totalw, boost::function<void(int)> Moved, int
left->pos.x = pos.x;
right->pos.x = pos.x + totalw - 16;
}
else
else
{
left->pos.x = slider->pos.x = right->pos.x = pos.x;
left->pos.y = pos.y;
@ -859,7 +859,7 @@ void CSlider::keyPressed(const SDL_KeyboardEvent & key)
return;
}
moveTo(moveDest);
moveTo(moveDest);
}
void CSlider::moveToMax()
@ -1270,7 +1270,7 @@ void CBoundedLabel::showAll(SDL_Surface * to)
CIntObject::showAll(to);
const Font &f = *graphics->fonts[font];
int lineHeight = f.height;
int lineHeight = f.height;
int lineCapacity = pos.h / lineHeight;
int dy = f.height; //line height
@ -1301,7 +1301,7 @@ void CBoundedLabel::recalculateLines(const std::string &Txt)
lines.clear();
const Font &f = *graphics->fonts[font];
int lineHeight = f.height;
int lineHeight = f.height;
lines = CMessage::breakText(Txt, pos.w, font);
@ -1313,13 +1313,13 @@ void CBoundedLabel::recalculateLines(const std::string &Txt)
CLabelGroup::CLabelGroup(EFonts Font, EAlignment Align, const SDL_Color &Color):
font(Font), align(Align), color(Color)
{};
{}
void CLabelGroup::add(int x, int y, const std::string &text)
{
OBJ_CONSTRUCTION_CAPTURING_ALL;
new CLabel(x, y, font, align, color, text);
};
}
CTextBox::CTextBox(std::string Text, const Rect &rect, int SliderStyle, EFonts Font /*= FONT_SMALL*/, EAlignment Align /*= TOPLEFT*/, const SDL_Color &Color /*= Colors::Cornsilk*/)
:CBoundedLabel(rect.x, rect.y, Font, Align, Color, Text), sliderStyle(SliderStyle), slider(NULL)
@ -1340,7 +1340,7 @@ void CTextBox::recalculateLines(const std::string &Txt)
vstd::clear_pointer(slider);
lines.clear();
const Font &f = *graphics->fonts[font];
int lineHeight = f.height;
int lineHeight = f.height;
int lineCapacity = pos.h / lineHeight;
lines = CMessage::breakText(Txt, pos.w, font);
@ -1535,7 +1535,7 @@ void CTextInput::clickLeft( tribool down, bool previousState )
void CTextInput::keyPressed( const SDL_KeyboardEvent & key )
{
if(!focus || key.state != SDL_PRESSED)
if(!focus || key.state != SDL_PRESSED)
return;
if(key.keysym.sym == SDLK_TAB)

View File

@ -193,4 +193,4 @@ namespace CSDL_Ext
void applyEffect(SDL_Surface * surf, const SDL_Rect * rect, int mode); //mode: 0 - sepia, 1 - grayscale
std::string trimToFit(std::string text, int widthLimit, EFonts font);
};
}

View File

@ -55,12 +55,12 @@ bool CArtifact::isBig () const
// {
// if (!vstd::contains(possibleSlots, slotID))
// return false;
//
//
// // Can't put an artifact in a locked slot.
// std::map<ui16, const CArtifact*>::const_iterator it = artifWorn.find(slotID);
// if (it != artifWorn.end() && it->second->id == 145)
// return false;
//
//
// // Check if a combination artifact fits.
// // TODO: Might want a more general algorithm?
// // Assumes that misc & rings fits only in their slots, and others in only one slot and no duplicates.
@ -71,14 +71,14 @@ bool CArtifact::isBig () const
// const ui16 miscSlots[] = {9, 10, 11, 12, 18};
// int rings = 0;
// int misc = 0;
//
//
// VLC->arth->unequipArtifact(tempArtifWorn, slotID);
//
// BOOST_FOREACH(ui32 constituentID, *constituents)
//
// BOOST_FOREACH(ui32 constituentID, *constituents)
// {
// const CArtifact& constituent = *VLC->arth->artifacts[constituentID];
// const int slot = constituent.possibleSlots[0];
//
//
// if (slot == 6 || slot == 7)
// rings++;
// else if ((slot >= 9 && slot <= 12) || slot == 18)
@ -86,18 +86,18 @@ bool CArtifact::isBig () const
// else if (tempArtifWorn.find(slot) != tempArtifWorn.end())
// return false;
// }
//
//
// // Ensure enough ring slots are free
// for (int i = 0; i < sizeof(ringSlots)/sizeof(*ringSlots); i++)
// for (int i = 0; i < sizeof(ringSlots)/sizeof(*ringSlots); i++)
// {
// if (tempArtifWorn.find(ringSlots[i]) == tempArtifWorn.end() || ringSlots[i] == slotID)
// rings--;
// }
// if (rings > 0)
// return false;
//
//
// // Ensure enough misc slots are free.
// for (int i = 0; i < sizeof(miscSlots)/sizeof(*miscSlots); i++)
// for (int i = 0; i < sizeof(miscSlots)/sizeof(*miscSlots); i++)
// {
// if (tempArtifWorn.find(miscSlots[i]) == tempArtifWorn.end() || miscSlots[i] == slotID)
// misc--;
@ -105,7 +105,7 @@ bool CArtifact::isBig () const
// if (misc > 0)
// return false;
// }
//
//
// return true;
// }
@ -113,16 +113,16 @@ bool CArtifact::isBig () const
// {
// if (constituentOf == NULL || !vstd::contains(*constituentOf, artifactID))
// return false;
//
//
// const CArtifact &artifact = *VLC->arth->artifacts[artifactID];
// assert(artifact.constituents);
//
// BOOST_FOREACH(ui32 constituentID, *artifact.constituents)
//
// BOOST_FOREACH(ui32 constituentID, *artifact.constituents)
// {
// bool found = false;
// for (std::map<ui16, const CArtifact*>::const_iterator it = artifWorn.begin(); it != artifWorn.end(); ++it)
// for (std::map<ui16, const CArtifact*>::const_iterator it = artifWorn.begin(); it != artifWorn.end(); ++it)
// {
// if (it->second->id == constituentID)
// if (it->second->id == constituentID)
// {
// found = true;
// break;
@ -131,7 +131,7 @@ bool CArtifact::isBig () const
// if (!found)
// return false;
// }
//
//
// return true;
// }
@ -237,7 +237,7 @@ void CArtHandler::loadArtifacts(bool onlyTxt)
std::vector<ui16> slots;
slots += 17, 16, 15, 14, 13, 18, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0;
growingArtifacts += 146, 147, 148, 150, 151, 152, 153;
static std::map<char, CArtifact::EartClass> classes =
static std::map<char, CArtifact::EartClass> classes =
map_list_of('S',CArtifact::ART_SPECIAL)('T',CArtifact::ART_TREASURE)('N',CArtifact::ART_MINOR)('J',CArtifact::ART_MAJOR)('R',CArtifact::ART_RELIC);
CLegacyConfigParser parser("DATA/ARTRAITS.TXT");
@ -287,7 +287,7 @@ void CArtHandler::loadArtifacts(bool onlyTxt)
// Fill in information about combined artifacts. Should perhaps be moved to a config file?
nart.constituentOf = NULL;
switch (nart.id)
switch (nart.id)
{
case 129: // Angelic Alliance
nart.constituents = new std::vector<ui32>();
@ -363,7 +363,7 @@ void CArtHandler::loadArtifacts(bool onlyTxt)
const JsonNode config(ResourceID("config/commanders.json"));
BOOST_FOREACH(const JsonNode &artifact, config["artifacts"].Vector())
{
auto ga = dynamic_cast <CGrowingArtifact *>(artifacts[artifact["id"].Float()].get());
auto ga = dynamic_cast <CGrowingArtifact *>(artifacts[artifact["id"].Float()].get());
BOOST_FOREACH (auto b, artifact["bonusesPerLevel"].Vector())
{
ga->bonusesPerLevel.push_back (std::pair <ui16, Bonus> (b["level"].Float(), *ParseBonus (b["bonus"].Vector())));
@ -382,11 +382,11 @@ void CArtHandler::loadArtifacts(bool onlyTxt)
addBonuses();
// Populate reverse mappings of combinational artifacts.
BOOST_FOREACH(CArtifact *artifact, artifacts)
BOOST_FOREACH(CArtifact *artifact, artifacts)
{
if (artifact->constituents != NULL)
if (artifact->constituents != NULL)
{
BOOST_FOREACH(ui32 constituentID, *artifact->constituents)
BOOST_FOREACH(ui32 constituentID, *artifact->constituents)
{
if (artifacts[constituentID]->constituentOf == NULL)
artifacts[constituentID]->constituentOf = new std::vector<ui32>();
@ -484,7 +484,7 @@ ui16 CArtHandler::getArtSync (ui32 rand, int flags)
std::vector<ConstTransitivePtr<CArtifact> > out;
getAllowed(out, flags);
CArtifact *art = out[rand % out.size()];
return art->id;
return art->id;
}
void CArtHandler::getAllowed(std::vector<ConstTransitivePtr<CArtifact> > &out, int flags)
{
@ -575,7 +575,7 @@ void CArtHandler::makeItCreatureArt (int aid, bool onlyCreature /*=true*/)
a->possibleSlots[ArtBearer::COMMANDER].clear();
}
a->possibleSlots[ArtBearer::CREATURE].push_back(ArtifactPosition::CREATURE_SLOT);
};
}
void CArtHandler::makeItCommanderArt (int aid, bool onlyCommander /*=true*/)
{
@ -587,7 +587,7 @@ void CArtHandler::makeItCommanderArt (int aid, bool onlyCommander /*=true*/)
}
for (int i = ArtifactPosition::COMMANDER1; i <= ArtifactPosition::COMMANDER6; ++i)
a->possibleSlots[ArtBearer::COMMANDER].push_back(i);
};
}
void CArtHandler::addBonuses()
{
@ -601,11 +601,11 @@ void CArtHandler::addBonuses()
//Propagators/limiters used more than once
auto battleWidePropagator = make_shared<CPropagatorNodeType>(CBonusSystemNode::BATTLE);
auto visitedTownPropagator = make_shared<CPropagatorNodeType>(CBonusSystemNode::TOWN_AND_VISITOR);
auto visitedTownPropagator = make_shared<CPropagatorNodeType>(CBonusSystemNode::TOWN_AND_VISITOR);
auto shooterOnlyLimiter = make_shared<HasAnotherBonusLimiter>(Bonus::SHOOTER);
auto dragonNatureLimiter = make_shared<HasAnotherBonusLimiter>(Bonus::DRAGON_NATURE);
//Attack bonus artifacts (Weapons)
ART_PRIM_SKILL(7,0,+2); //Centaur Axe
ART_PRIM_SKILL(8,0,+3); //Blackshard of the Dead Knight
@ -625,7 +625,7 @@ void CArtHandler::addBonuses()
ART_PRIM_SKILL(18,0,-3); //Sentinel's Shield
//Knowledge bonus artifacts (Helmets)
ART_PRIM_SKILL(19,3,+1); //Helm of the Alabaster Unicorn
ART_PRIM_SKILL(19,3,+1); //Helm of the Alabaster Unicorn
ART_PRIM_SKILL(20,3,+2); //Skull Helmet
ART_PRIM_SKILL(21,3,+3); //Helm of Chaos
ART_PRIM_SKILL(22,3,+4); //Crown of the Supreme Magi
@ -662,13 +662,13 @@ void CArtHandler::addBonuses()
ART_POWER_AND_KNOWLEDGE(43,+3); //Necklace of Dragonteeth
ART_POWER_AND_KNOWLEDGE(44,+4); //Crown of Dragontooth
//Luck and morale
//Luck and morale
ART_MORALE(45,+1); //Still Eye of the Dragon
ART_LUCK(45,+1); //Still Eye of the Dragon
ART_LUCK(46,+1); //Clover of Fortune
ART_LUCK(47,+1); //Cards of Prophecy
ART_LUCK(48,+1); //Ladybird of Luck
ART_MORALE(49,+1); //Badge of Courage -> +1 morale
ART_MORALE(49,+1); //Badge of Courage -> +1 morale
giveArtBonus(49,Bonus::MIND_IMMUNITY,0); //immunity to hostile mind spells:
ART_MORALE(50,+1); //Crest of Valor
ART_MORALE(51,+1); //Glyph of Gallantry
@ -772,11 +772,11 @@ void CArtHandler::addBonuses()
giveArtBonus(121,Bonus::CREATURE_GROWTH,+2,4, visitedTownPropagator); //Arms of Legion
giveArtBonus(122,Bonus::CREATURE_GROWTH,+1,5, visitedTownPropagator); //Head of Legion
//Sea Captain's Hat
giveArtBonus(123,Bonus::WHIRLPOOL_PROTECTION,0);
giveArtBonus(123,Bonus::SEA_MOVEMENT,+500);
giveArtBonus(123,Bonus::SPELL,3,0, Bonus::INDEPENDENT_MAX);
giveArtBonus(123,Bonus::SPELL,3,1, Bonus::INDEPENDENT_MAX);
//Sea Captain's Hat
giveArtBonus(123,Bonus::WHIRLPOOL_PROTECTION,0);
giveArtBonus(123,Bonus::SEA_MOVEMENT,+500);
giveArtBonus(123,Bonus::SPELL,3,0, Bonus::INDEPENDENT_MAX);
giveArtBonus(123,Bonus::SPELL,3,1, Bonus::INDEPENDENT_MAX);
giveArtBonus(124, Bonus::SPELLS_OF_LEVEL,3,1); //Spellbinder's Hat
giveArtBonus(125, Bonus::BATTLE_NO_FLEEING,0, 0, battleWidePropagator); //Shackles of War
@ -919,32 +919,32 @@ void CArtHandler::clear()
// void CArtHandler::equipArtifact( std::map<ui16, const CArtifact*> &artifWorn, ui16 slotID, const CArtifact* art ) const
// {
// unequipArtifact(artifWorn, slotID);
//
//
// if (art) //false when artifact is NULL -> slot set to empty
// {
// const CArtifact &artifact = *art;
//
//
// // Add artifact.
// artifWorn[slotID] = art;
//
//
// // Add locks, in reverse order of being removed.
// if (artifact.constituents != NULL)
// if (artifact.constituents != NULL)
// {
// bool destConsumed = false; // Determines which constituent that will be counted for together with the artifact.
//
// BOOST_FOREACH(ui32 constituentID, *artifact.constituents)
//
// BOOST_FOREACH(ui32 constituentID, *artifact.constituents)
// {
// const CArtifact &constituent = *artifacts[constituentID];
//
// if (!destConsumed && vstd::contains(constituent.possibleSlots, slotID))
//
// if (!destConsumed && vstd::contains(constituent.possibleSlots, slotID))
// {
// destConsumed = true;
// }
// else
// }
// else
// {
// BOOST_FOREACH(ui16 slot, constituent.possibleSlots)
// BOOST_FOREACH(ui16 slot, constituent.possibleSlots)
// {
// if (!vstd::contains(artifWorn, slot))
// if (!vstd::contains(artifWorn, slot))
// {
// artifWorn[slot] = VLC->arth->artifacts[145]; //lock
// break;
@ -955,7 +955,7 @@ void CArtHandler::clear()
// }
// }
// }
//
//
// /**
// * Locally unequips an artifact from a hero's worn slots.
// * Does not test if the operation is legal.
@ -966,30 +966,30 @@ void CArtHandler::clear()
// {
// if (!vstd::contains(artifWorn, slotID))
// return;
//
//
// const CArtifact &artifact = *artifWorn[slotID];
//
//
// // Remove artifact, if it's not already removed.
// artifWorn.erase(slotID);
//
//
// // Remove locks, in reverse order of being added.
// if (artifact.constituents != NULL)
// if (artifact.constituents != NULL)
// {
// bool destConsumed = false;
//
// BOOST_FOREACH(ui32 constituentID, *artifact.constituents)
//
// BOOST_FOREACH(ui32 constituentID, *artifact.constituents)
// {
// const CArtifact &constituent = *artifacts[constituentID];
//
// if (!destConsumed && vstd::contains(constituent.possibleSlots, slotID))
//
// if (!destConsumed && vstd::contains(constituent.possibleSlots, slotID))
// {
// destConsumed = true;
// }
// else
// }
// else
// {
// BOOST_REVERSE_FOREACH(ui16 slot, constituent.possibleSlots)
// BOOST_REVERSE_FOREACH(ui16 slot, constituent.possibleSlots)
// {
// if (vstd::contains(artifWorn, slot) && artifWorn[slot]->id == 145)
// if (vstd::contains(artifWorn, slot) && artifWorn[slot]->id == 145)
// {
// artifWorn.erase(slot);
// break;
@ -1152,7 +1152,7 @@ std::vector<const CArtifact *> CArtifactInstance::assemblyPossibilities(const CA
|| artType->constituents) //combined artifact already: no combining of combined artifacts... for now.
return ret;
BOOST_FOREACH(ui32 possibleCombinedArt, *artType->constituentOf)
BOOST_FOREACH(ui32 possibleCombinedArt, *artType->constituentOf)
{
const CArtifact * const artifact = VLC->arth->artifacts[possibleCombinedArt];
assert(artifact->constituents);
@ -1228,7 +1228,7 @@ bool CArtifactInstance::isPart(const CArtifactInstance *supposedPart) const
return supposedPart == this;
}
bool CCombinedArtifactInstance::canBePutAt(const CArtifactSet *artSet, int slot, bool assumeDestRemoved /*= false*/) const
bool CCombinedArtifactInstance::canBePutAt(const CArtifactSet *artSet, int slot, bool assumeDestRemoved /*= false*/) const
{
bool canMainArtifactBePlaced = CArtifactInstance::canBePutAt(artSet, slot, assumeDestRemoved);
if(!canMainArtifactBePlaced)
@ -1319,7 +1319,7 @@ void CCombinedArtifactInstance::putAt(ArtifactLocation al)
const bool suggestedPosValid = ci.art->canBePutAt(suggestedPos);
int pos = -1;
if(inActiveSlot && suggestedPosValid) //there is a valid suggestion where to place lock
if(inActiveSlot && suggestedPosValid) //there is a valid suggestion where to place lock
pos = ci.slot;
else
ci.slot = pos = ci.art->firstAvailableSlot(al.getHolderArtSet());
@ -1517,7 +1517,7 @@ CArtifactSet::~CArtifactSet()
ArtSlotInfo & CArtifactSet::retreiveNewArtSlot(ui16 slot)
{
assert(!vstd::contains(artifactsWorn, slot));
ArtSlotInfo &ret = slot < GameConstants::BACKPACK_START
ArtSlotInfo &ret = slot < GameConstants::BACKPACK_START
? artifactsWorn[slot]
: *artifactsInBackpack.insert(artifactsInBackpack.begin() + (slot - GameConstants::BACKPACK_START), ArtSlotInfo());

View File

@ -25,9 +25,10 @@
#else
#define WIN32_LEAN_AND_MEAN //excludes rarely used stuff from windows headers - delete this line if something is missing
#include <windows.h>
#ifndef __MINGW32__
#include <dbghelp.h>
#pragma comment(lib, "dbghelp.lib")
#endif
typedef WORD TColor;
HANDLE handleIn;
HANDLE handleOut;
@ -108,19 +109,20 @@ LONG WINAPI onUnhandledException(EXCEPTION_POINTERS* exception)
if (einfo->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
{
tlog1 << "Attempt to " << (einfo->ExceptionInformation[0] == 1 ? "write to " : "read from ")
tlog1 << "Attempt to " << (einfo->ExceptionInformation[0] == 1 ? "write to " : "read from ")
<< "0x" << std::setw(8) << (void*)einfo->ExceptionInformation[1] << std::endl;;
}
const DWORD threadId = ::GetCurrentThreadId();
tlog1 << "Thread ID: " << threadId << " [" << std::dec << std::setw(0) << threadId << "]\n";
#ifndef __MINGW32__
//exception info to be placed in the dump
MINIDUMP_EXCEPTION_INFORMATION meinfo = {threadId, exception, TRUE};
//create file where dump will be placed
char *mname = NULL;
char buffer[MAX_PATH + 1];
HMODULE hModule = NULL;
HMODULE hModule = NULL;
GetModuleFileNameA(hModule, buffer, MAX_PATH);
mname = strrchr(buffer, '\\');
if (mname != 0)
@ -132,6 +134,7 @@ LONG WINAPI onUnhandledException(EXCEPTION_POINTERS* exception)
HANDLE dfile = CreateFileA(mname, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
tlog1 << "Crash info will be put in " << mname << std::endl;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), dfile, MiniDumpWithDataSegs, &meinfo, 0, 0);
#endif
MessageBoxA(0, "VCMI has crashed. We are sorry. File with information about encountered problem has been created.", "VCMI Crashhandler", MB_OK | MB_ICONERROR);
return EXCEPTION_EXECUTE_HANDLER;
}
@ -233,7 +236,7 @@ CConsoleHandler::~CConsoleHandler()
}
void CConsoleHandler::end()
{
if (thread)
if (thread)
{
#ifndef _WIN32
thread->interrupt();

View File

@ -133,7 +133,7 @@ public:
class DLL_LINKAGE CCreatureSet : public IArmyDescriptor //seven combined creatures
{
CCreatureSet(const CCreatureSet&);;
CCreatureSet(const CCreatureSet&);
CCreatureSet &operator=(const CCreatureSet&);
public:
TSlots stacks; //slots[slot_id]->> pair(creature_id,creature_quantity)
@ -143,7 +143,7 @@ public:
virtual ~CCreatureSet();
virtual void armyChanged();
const CStackInstance &operator[](TSlot slot) const;
const CStackInstance &operator[](TSlot slot) const;
const TSlots &Slots() const {return stacks;}
@ -161,13 +161,13 @@ public:
void giveStackExp(expType exp);
void setStackExp(TSlot slot, expType exp);
//derivative
//derivative
void eraseStack(TSlot slot); //slot must be occupied
void joinStack(TSlot slot, CStackInstance * stack); //adds new stack to the existing stack of the same type
void changeStackCount(TSlot slot, TQuantity toAdd); //stack must exist!
bool setCreature (TSlot slot, TCreature type, TQuantity quantity) OVERRIDE; //replaces creature in stack; slots 0 to 6, if quantity=0 erases stack
void setToArmy(CSimpleArmy &src); //erases all our army and moves stacks from src to us; src MUST NOT be an armed object! WARNING: use it wisely. Or better do not use at all.
const CStackInstance& getStack(TSlot slot) const; //stack must exist
const CStackInstance* getStackPtr(TSlot slot) const; //if stack doesn't exist, returns NULL
const CCreature* getCreature(TSlot slot) const; //workaround of map issue;
@ -186,7 +186,7 @@ public:
ui64 getPower (TSlot slot) const; //value of specific stack
std::string getRoughAmount (TSlot slot) const; //rough size of specific stack
bool hasStackAtSlot(TSlot slot) const;
bool contains(const CStackInstance *stack) const;
bool canBeMergedWith(const CCreatureSet &cs, bool allowMergingStacks = true) const;

View File

@ -53,13 +53,13 @@ std::vector<const CArtifact *> CGTownInstance::merchantArtifacts;
std::vector<int> CGTownInstance::universitySkills;
void IObjectInterface::onHeroVisit(const CGHeroInstance * h) const
{};
{}
void IObjectInterface::onHeroLeave(const CGHeroInstance * h) const
{};
{}
void IObjectInterface::newTurn () const
{};
{}
IObjectInterface::~IObjectInterface()
{}

View File

@ -35,7 +35,7 @@ void CThreadHelper::processTasks()
while(true)
{
{
boost::unique_lock<boost::mutex> lock(rtinm);
boost::unique_lock<boost::mutex> lock(rtinm);
if((pom = currentTask) >= amount)
break;
else
@ -50,6 +50,7 @@ void CThreadHelper::processTasks()
void setThreadName(const std::string &name)
{
#ifdef _WIN32
#ifndef __GNUC__
//follows http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
const DWORD MS_VC_EXCEPTION=0x406D1388;
#pragma pack(push,8)
@ -67,6 +68,7 @@ void setThreadName(const std::string &name)
info.dwThreadID = -1;
info.dwFlags = 0;
__try
{
RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
@ -74,7 +76,11 @@ void setThreadName(const std::string &name)
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
#else
//not supported
#endif
#else
prctl(PR_SET_NAME, name.c_str(), 0, 0, 0);
#endif
}
}

View File

@ -5,8 +5,8 @@
#include <boost/type_traits/is_fundamental.hpp>
#include <boost/type_traits/is_enum.hpp>
#include <boost/type_traits/is_pointer.hpp>
#include <boost/type_traits/is_class.hpp>
#include <boost/type_traits/is_pointer.hpp>
#include <boost/type_traits/is_class.hpp>
#include <boost/type_traits/is_base_of.hpp>
#include <boost/type_traits/is_array.hpp>
#include <boost/type_traits/remove_pointer.hpp>
@ -66,7 +66,7 @@ namespace boost
class basic_socket_acceptor;
}
class mutex;
};
}
enum SerializationLvl
{
@ -200,7 +200,7 @@ struct LoadWrong
template<typename T>
struct SerializationLevel
{
{
typedef mpl::integral_c_tag tag;
typedef
typename mpl::eval_if<
@ -252,7 +252,7 @@ public:
TTypeVecMap vectors; //entry must be a pointer to vector containing pointers to the objects of key type
bool smartVectorMembersSerialization;
bool sendStackInstanceByIds;
bool sendStackInstanceByIds;
CSerializer();
~CSerializer();
@ -274,7 +274,7 @@ public:
const VectorisedObjectInfo<T> *getVectorisedTypeInfo()
{
const std::type_info *myType = NULL;
//
//
// if(boost::is_base_of<CGObjectInstance, T>::value) //ugly workaround to support also types derived from CGObjectInstance -> if we encounter one, treat it aas CGObj..
// myType = &typeid(CGObjectInstance);
// else
@ -342,7 +342,7 @@ public:
template <typename T> //metafunction returning CGObjectInstance if T is its derivate or T elsewise
struct VectorisedTypeFor
{
typedef typename
typedef typename
//if
mpl::eval_if<boost::is_base_of<CGObjectInstance,T>,
mpl::identity<CGObjectInstance>,
@ -471,8 +471,8 @@ public:
COSer & operator&(const T & t)
{
return * this->This() << t;
}
}
int write(const void * data, unsigned size);
@ -539,7 +539,7 @@ public:
//that part of ptr serialization was extracted to allow customization of its behavior in derived classes
template <typename T>
void savePointerHlp(ui16 tid, const T &data)
{
{
if(!tid)
*this << *data; //if type is unregistered simply write all data in a standard way
else
@ -556,7 +556,7 @@ public:
template <typename T>
void save(const T &data)
{
typedef
typedef
//if
typename mpl::eval_if< mpl::equal_to<SerializationLevel<T>,mpl::int_<Primitive> >,
mpl::identity<SavePrimitive<Serializer,T> >,
@ -703,7 +703,7 @@ public:
~CISer()
{
std::map<ui16,CBasicPointerLoader*>::iterator iter;
for(iter = loaders.begin(); iter != loaders.end(); iter++)
delete iter->second;
}
@ -725,18 +725,18 @@ public:
this->This()->load(t);
return * this->This();
}
template<class T>
CISer & operator&(T & t)
{
return * this->This() >> t;
}
}
int write(const void * data, unsigned size);
template <typename T>
void load(T &data)
{
typedef
typedef
//if
typename mpl::eval_if< mpl::equal_to<SerializationLevel<T>,mpl::int_<Primitive> >,
mpl::identity<LoadPrimitive<Serializer,T> >,
@ -782,7 +782,7 @@ public:
nonConstT &hlp = const_cast<nonConstT&>(data);
hlp.serialize(*this,fileVersion);
//data.serialize(*this,myVersion);
}
}
template <typename T>
void loadSerializable(T &data)
@ -806,7 +806,7 @@ public:
data = NULL;
return;
}
if(smartVectorMembersSerialization)
{
typedef typename boost::remove_const<typename boost::remove_pointer<T>::type>::type TObjectType; //eg: const CGHeroInstance * => CGHeroInstance
@ -830,7 +830,7 @@ public:
return;
}
ui32 pid = 0xffffffff; //pointer id (or maybe rather pointee id)
ui32 pid = 0xffffffff; //pointer id (or maybe rather pointee id)
if(smartPointerSerialization)
{
*this >> pid; //get the id
@ -1081,7 +1081,7 @@ template<typename T>
class CApplier
{
public:
std::map<ui16,T*> apps;
std::map<ui16,T*> apps;
~CApplier()
{

View File

@ -217,7 +217,7 @@ struct DLL_LINKAGE Bonus
enum BonusDuration //when bonus is automatically removed
{
PERMANENT = 1,
ONE_BATTLE = 2, //at the end of battle
ONE_BATTLE = 2, //at the end of battle
ONE_DAY = 4, //at the end of day
ONE_WEEK = 8, //at the end of week (bonus lasts till the end of week, thats NOT 7 days
N_TURNS = 16, //used during battles, after battle bonus is always removed
@ -236,7 +236,7 @@ struct DLL_LINKAGE Bonus
enum LimitEffect
{
NO_LIMIT = 0,
NO_LIMIT = 0,
ONLY_DISTANCE_FIGHT=1, ONLY_MELEE_FIGHT, //used to mark bonuses for attack/defense primary skills from spells like Precision (distance only)
ONLY_ENEMY_ARMY
};
@ -265,7 +265,7 @@ struct DLL_LINKAGE Bonus
TLimiterPtr limiter;
TPropagatorPtr propagator;
std::string description;
std::string description;
Bonus(ui16 Dur, ui8 Type, ui8 Src, si32 Val, ui32 ID, std::string Desc, si32 Subtype=-1);
Bonus(ui16 Dur, ui8 Type, ui8 Src, si32 Val, ui32 ID, si32 Subtype=-1, ui8 ValType = ADDITIVE_VALUE);
@ -357,7 +357,7 @@ private:
public:
BonusList(bool BelongsToTree = false);
BonusList(const BonusList &bonusList);
BonusList& operator=(const BonusList &bonusList);
BonusList& operator=(const BonusList &bonusList);
// wrapper functions of the STL vector container
std::vector<Bonus*>::size_type size() const { return bonuses.size(); }
@ -393,7 +393,7 @@ public:
//void limit(const CBonusSystemNode &node); //erases bonuses using limitor
void eliminateDuplicates();
// remove_if implementation for STL vector types
template <class Predicate>
void remove_if(Predicate pred)
@ -409,7 +409,7 @@ public:
bonuses.resize(newList.size());
std::copy(newList.begin(), newList.end(), bonuses.begin());
}
template <class InputIterator>
void insert(const int position, InputIterator first, InputIterator last);
@ -465,7 +465,7 @@ public:
CPropagatorNodeType();
CPropagatorNodeType(ui8 NodeType);
bool shouldBeAttached(CBonusSystemNode *dest);
//CBonusSystemNode *getDestNode(CBonusSystemNode *source, CBonusSystemNode *redParent, CBonusSystemNode *redChild) OVERRIDE;
//CBonusSystemNode *getDestNode(CBonusSystemNode *source, CBonusSystemNode *redParent, CBonusSystemNode *redChild) OVERRIDE;
template <typename Handler> void serialize(Handler &h, const int version)
{
@ -479,7 +479,7 @@ struct BonusLimitationContext
const CBonusSystemNode &node;
const BonusList &alreadyAccepted;
};
class DLL_LINKAGE ILimiter
{
public:
@ -500,7 +500,7 @@ public:
// * selector is predicate that tests if HeroBonus matches our criteria
// * root is node on which call was made (NULL will be replaced with this)
//interface
virtual const TBonusListPtr getAllBonuses(const CSelector &selector, const CSelector &limit, const CBonusSystemNode *root = NULL, const std::string &cachingStr = "") const = 0;
virtual const TBonusListPtr getAllBonuses(const CSelector &selector, const CSelector &limit, const CBonusSystemNode *root = NULL, const std::string &cachingStr = "") const = 0;
void getModifiersWDescr(TModDescr &out, const CSelector &selector, const std::string &cachingStr = "") const; //out: pairs<modifier value, modifier description>
int getBonusesCount(const CSelector &selector, const std::string &cachingStr = "") const;
int valOfBonuses(const CSelector &selector, const std::string &cachingStr = "") const;
@ -508,7 +508,7 @@ public:
const TBonusListPtr getBonuses(const CSelector &selector, const CSelector &limit, const std::string &cachingStr = "") const;
const TBonusListPtr getBonuses(const CSelector &selector, const std::string &cachingStr = "") const;
//legacy interface
//legacy interface
int valOfBonuses(Bonus::BonusType type, const CSelector &selector) const;
int valOfBonuses(Bonus::BonusType type, int subtype = -1) const; //subtype -> subtype of bonus, if -1 then anyt;
bool hasBonusOfType(Bonus::BonusType type, int subtype = -1) const;//determines if hero has a bonus of given type (and optionally subtype)
@ -540,16 +540,16 @@ private:
TNodesVector parents; //parents -> we inherit bonuses from them, we may attach our bonuses to them
TNodesVector children;
ui8 nodeType;
std::string description;
static const bool cachingEnabled;
static const bool cachingEnabled;
mutable BonusList cachedBonuses;
mutable int cachedLast;
mutable int cachedLast;
static int treeChanged;
// Setting a value to cachingStr before getting any bonuses caches the result for later requests.
// Setting a value to cachingStr before getting any bonuses caches the result for later requests.
// This string needs to be unique, that's why it has to be setted in the following manner:
// [property key]_[value] => only for selector
mutable std::map<std::string, TBonusListPtr > cachedRequests;
@ -562,7 +562,7 @@ public:
explicit CBonusSystemNode();
virtual ~CBonusSystemNode();
void limitBonuses(const BonusList &allBonuses, BonusList &out) const; //out will bo populed with bonuses that are not limited here
TBonusListPtr limitBonuses(const BonusList &allBonuses) const; //same as above, returns out by val for convienence
const TBonusListPtr getAllBonuses(const CSelector &selector, const CSelector &limit, const CBonusSystemNode *root = NULL, const std::string &cachingStr = "") const;
@ -573,8 +573,8 @@ public:
void getParents(TNodes &out); //retrieves list of parent nodes (nodes to inherit bonuses from)
void getRedParents(TNodes &out); //retrieves list of red parent nodes (nodes bonuses propagate from)
void getRedAncestors(TNodes &out);
void getRedChildren(TNodes &out);
void getRedDescendants(TNodes &out);
void getRedChildren(TNodes &out);
void getRedDescendants(TNodes &out);
Bonus *getBonus(const CSelector &selector);
void attachTo(CBonusSystemNode *parent);
@ -604,7 +604,7 @@ public:
void deserializationFix();
void exportBonus(Bonus * b);
void exportBonuses();
static void incrementTreeChangedNum();
BonusList &getBonusList();
const BonusList &getBonusList() const;
@ -628,7 +628,7 @@ public:
}
enum ENodeTypes
{
UNKNOWN, STACK_INSTANCE, STACK_BATTLE, SPECIALITY, ARTIFACT, CREATURE, ARTIFACT_INSTANCE, HERO, PLAYER, TEAM,
UNKNOWN, STACK_INSTANCE, STACK_BATTLE, SPECIALITY, ARTIFACT, CREATURE, ARTIFACT_INSTANCE, HERO, PLAYER, TEAM,
TOWN_AND_VISITOR, BATTLE
};
};
@ -641,7 +641,7 @@ namespace NBonus
//DLL_LINKAGE const HeroBonus * get(const CBonusSystemNode *obj, int from, int id );
DLL_LINKAGE void getModifiersWDescr(const CBonusSystemNode *obj, TModDescr &out, Bonus::BonusType type, int subtype = -1 ); //out: pairs<modifier value, modifier description>
DLL_LINKAGE int getCount(const CBonusSystemNode *obj, int from, int id);
};
}
/// generates HeroBonus from given data
inline Bonus makeFeatureVal(Bonus::BonusType type, ui8 duration, si16 subtype, si32 value, Bonus::BonusSource source, ui16 turnsRemain = 0, si32 additionalInfo = 0)
@ -725,7 +725,7 @@ public:
{
return turnsRequested <= 0 //every present effect will last zero (or "less") turns
|| !(bonus->duration & Bonus::N_TURNS) //so do every not expriing after N-turns effect
|| bonus->turnsRemain > turnsRequested;
|| bonus->turnsRemain > turnsRequested;
}
CWillLastTurns& operator()(const int &setVal)
{
@ -769,7 +769,7 @@ public:
}
};
class DLL_LINKAGE CreatureNativeTerrainLimiter : public ILimiter //applies only to creatures that are on their native terrain
class DLL_LINKAGE CreatureNativeTerrainLimiter : public ILimiter //applies only to creatures that are on their native terrain
{
public:
si8 terrainType;

View File

@ -48,7 +48,7 @@ struct CPack
{
tlog1 << "CPack serialized... this should not happen!\n";
}
DLL_LINKAGE void applyGs(CGameState *gs)
void applyGs(CGameState *gs)
{};
};
@ -60,7 +60,7 @@ struct CPackForClient : public CPack
void applyFirstCl(CClient *cl)//called before applying to gs
{};
void applyCl(CClient *cl)//called after applying to gs
{};
{};
};
struct CPackForServer : public CPack
@ -70,7 +70,7 @@ struct CPackForServer : public CPack
CGameState* GS(CGameHandler *gh);
CPackForServer()
{
type = 2;
type = 2;
c = NULL;
player = 255;
};
@ -82,7 +82,7 @@ struct CPackForServer : public CPack
struct Query : public CPackForClient
{
ui32 queryID; // equals to -1 if it is not an actual query (and should not be answered)
Query()
{
queryID = -1;
@ -95,7 +95,7 @@ struct MetaString : public CPack //2001 helper for object scrips
private:
enum EMessage {TEXACT_STRING, TLOCAL_STRING, TNUMBER, TREPLACE_ESTRING, TREPLACE_LSTRING, TREPLACE_NUMBER, TREPLACE_PLUSNUMBER};
public:
enum {GENERAL_TXT=1, XTRAINFO_TXT, OBJ_NAMES, RES_NAMES, ART_NAMES, ARRAY_TXT, CRE_PL_NAMES, CREGENS, MINE_NAMES,
enum {GENERAL_TXT=1, XTRAINFO_TXT, OBJ_NAMES, RES_NAMES, ART_NAMES, ARRAY_TXT, CRE_PL_NAMES, CREGENS, MINE_NAMES,
MINE_EVNTS, ADVOB_TXT, ART_EVNTS, SPELL_NAME, SEC_SKILL_NAME, CRE_SING_NAMES, CREGENS4, COLOR, ART_DESCR};
std::vector<ui8> message; //vector of EMessage
@ -169,7 +169,7 @@ public:
{
type = 2001;
}
};
};
struct StackLocation
{
@ -276,16 +276,16 @@ struct SetResource : public CPackForClient //102
{
h & player & resid & val;
}
};
};
struct SetResources : public CPackForClient //104
{
SetResources(){type = 104;};
void applyCl(CClient *cl);
DLL_LINKAGE void applyGs(CGameState *gs);
ui8 player;
TResources res; //res[resid] => res amount
template <typename Handler> void serialize(Handler &h, const int version)
{
h & player & res;
@ -307,7 +307,7 @@ struct SetPrimSkill : public CPackForClient //105
{
h & abs & id & which & val;
}
};
};
struct SetSecSkill : public CPackForClient //106
{
SetSecSkill(){type = 106;};
@ -344,7 +344,7 @@ struct HeroVisitCastle : public CPackForClient //108
{
h & flags & tid & hid;
}
};
};
struct ChangeSpells : public CPackForClient //109
{
ChangeSpells(){type = 109;};
@ -359,7 +359,7 @@ struct ChangeSpells : public CPackForClient //109
{
h & learn & hid & spells;
}
};
};
struct SetMana : public CPackForClient //110
{
@ -402,7 +402,7 @@ struct FoWChange : public CPackForClient //112
{
h & tiles & player & mode;
}
};
};
struct SetAvailableHeroes : public CPackForClient //113
{
@ -431,7 +431,7 @@ struct GiveBonus : public CPackForClient //115
{
GiveBonus(ui8 Who = 0)
{
who = Who;
who = Who;
type = 115;
}
@ -454,7 +454,7 @@ struct ChangeObjPos : public CPackForClient //116
{
ChangeObjPos()
{
type = 116;
type = 116;
flags = 0;
}
void applyFirstCl(CClient *cl);
@ -495,7 +495,7 @@ struct RemoveBonus : public CPackForClient //118
{
RemoveBonus(ui8 Who = 0)
{
who = Who;
who = Who;
type = 118;
}
@ -584,7 +584,7 @@ struct RemoveObject : public CPackForClient //500
{
h & id;
}
};
};
struct TryMoveHero : public CPackForClient //501
{
TryMoveHero(){type = 501;humanKnows=false; attackedFrom = int3(-1, -1, -1);};
@ -616,24 +616,24 @@ struct TryMoveHero : public CPackForClient //501
// SetGarrisons(){type = 502;};
// void applyCl(CClient *cl);
// DLL_LINKAGE void applyGs(CGameState *gs);
//
//
// std::map<ui32,CCreatureSet> garrs;
//
//
// template <typename Handler> void serialize(Handler &h, const int version)
// {
// h & garrs;
// }
// };
// };
struct NewStructures : public CPackForClient //504
{
NewStructures(){type = 504;};
void applyCl(CClient *cl);
DLL_LINKAGE virtual void applyGs(CGameState *gs);
DLL_LINKAGE void applyGs(CGameState *gs);
si32 tid;
std::set<si32> bid;
si16 builded;
si16 builded;
template <typename Handler> void serialize(Handler &h, const int version)
{
@ -648,7 +648,7 @@ struct RazeStructures : public CPackForClient //505
si32 tid;
std::set<si32> bid;
si16 destroyed;
si16 destroyed;
template <typename Handler> void serialize(Handler &h, const int version)
{
@ -668,7 +668,7 @@ struct SetAvailableCreatures : public CPackForClient //506
{
h & tid & creatures;
}
};
};
struct SetHeroesInTown : public CPackForClient //508
{
SetHeroesInTown(){type = 508;};
@ -689,19 +689,19 @@ struct SetHeroesInTown : public CPackForClient //508
// void applyCl(CClient *cl);
// DLL_LINKAGE void applyGs(CGameState *gs);
// DLL_LINKAGE void setArtAtPos(ui16 pos, const CArtifact* art);
//
//
// si32 hid;
// std::vector<const CArtifact*> artifacts; //hero's artifacts from bag
// std::map<ui16, const CArtifact*> artifWorn; //map<position,artifact_id>; positions: 0 - head; 1 - shoulders; 2 - neck; 3 - right hand; 4 - left hand; 5 - torso; 6 - right ring; 7 - left ring; 8 - feet; 9 - misc1; 10 - misc2; 11 - misc3; 12 - misc4; 13 - mach1; 14 - mach2; 15 - mach3; 16 - mach4; 17 - spellbook; 18 - misc5
//
//
// template <typename Handler> void serialize(Handler &h, const int version)
// {
// h & hid & artifacts & artifWorn;
// }
//
//
// std::vector<const CArtifact*> equipped, unequipped; //used locally
// BonusList gained, lost; //used locally as hlp when applying
// };
// };
struct HeroRecruited : public CPackForClient //515
{
@ -717,7 +717,7 @@ struct HeroRecruited : public CPackForClient //515
{
h & hid & tid & tile & player;
}
};
};
struct GiveHero : public CPackForClient //516
{
@ -733,7 +733,7 @@ struct GiveHero : public CPackForClient //516
{
h & id & player;
}
};
};
struct OpenWindow : public CPackForClient //517
{
@ -1072,7 +1072,7 @@ struct NewTurn : public CPackForClient //101
{
h & heroes & cres & res & day & resetBuilded & specialWeek & creatureid;
}
};
};
struct Component : public CPack //2002 helper for object scrips informations
{
@ -1110,10 +1110,10 @@ struct InfoWindow : public CPackForClient //103 - displays simple info window
{
h & text & components & player & soundID;
}
InfoWindow()
{
InfoWindow()
{
type = 103;
soundID = 0;
soundID = 0;
}
};
@ -1134,7 +1134,7 @@ struct SetObjectProperty : public CPackForClient//1001
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;
@ -1149,7 +1149,7 @@ struct SetHoverName : public CPackForClient//1002
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;
@ -1165,7 +1165,7 @@ struct HeroLevelUp : public Query//2000
std::vector<ui16> skills;
HeroLevelUp(){type = 2000;};
template <typename Handler> void serialize(Handler &h, const int version)
{
h & queryID & heroid & primskill & level & skills;
@ -1273,14 +1273,14 @@ struct BattleStart : public CPackForClient//3000
BattleInfo * info;
template <typename Handler> void serialize(Handler &h, const int version)
{
h & info;
}
};
struct BattleNextRound : public CPackForClient//3001
{
{
BattleNextRound(){type = 3001;};
void applyFirstCl(CClient *cl);
void applyCl(CClient *cl);
@ -1874,7 +1874,7 @@ struct GarrisonHeroSwap : public CPackForServer
{
GarrisonHeroSwap(){};
GarrisonHeroSwap(si32 TID):tid(TID){};
si32 tid;
si32 tid;
bool applyGh(CGameHandler *gh);
template <typename Handler> void serialize(Handler &h, const int version)
@ -1971,7 +1971,7 @@ struct HireHero : public CPackForServer
}
};
struct BuildBoat : public CPackForServer
struct BuildBoat : public CPackForServer
{
BuildBoat(){};
si32 objid; //where player wants to buy a boat
@ -2084,7 +2084,7 @@ struct PlayerMessage : public CPackForClient, public CPackForServer //513
{
h & text & player;
}
};
};
struct SetSelection : public CPackForClient, public CPackForServer //514
@ -2241,7 +2241,7 @@ struct RequestOptionsChange : public CPregamePackToHost
{
enum {TOWN, HERO, BONUS};
ui8 what;
si8 direction; //-1 or +1
si8 direction; //-1 or +1
ui8 playerID;
RequestOptionsChange(ui8 What, si8 Dir, ui8 Player)

View File

@ -10,7 +10,7 @@ namespace Res
class ResourceSet;
bool canAfford(const ResourceSet &res, const ResourceSet &price); //can a be used to pay price b
enum ERes
enum ERes
{
WOOD = 0, MERCURY, ORE, SULFUR, CRYSTAL, GEMS, GOLD, MITHRIL
};
@ -25,7 +25,7 @@ namespace Res
#define scalarOperator(OPSIGN) \
DLL_LINKAGE ResourceSet operator OPSIGN(const TResource &rhs) const \
ResourceSet operator OPSIGN(const TResource &rhs) const \
{ \
ResourceSet ret = *this; \
for(int i = 0; i < size(); i++) \
@ -37,7 +37,7 @@ namespace Res
#define vectorOperator(OPSIGN) \
DLL_LINKAGE ResourceSet operator OPSIGN(const ResourceSet &rhs) const \
ResourceSet operator OPSIGN(const ResourceSet &rhs) const \
{ \
ResourceSet ret = *this; \
for(int i = 0; i < size(); i++) \
@ -48,7 +48,7 @@ namespace Res
#define opEqOperator(OPSIGN, RHS_TYPE) \
DLL_LINKAGE ResourceSet& operator OPSIGN ## =(const RHS_TYPE &rhs) \
ResourceSet& operator OPSIGN ## =(const RHS_TYPE &rhs) \
{ \
return *this = *this OPSIGN rhs; \
}
@ -70,7 +70,7 @@ namespace Res
#undef opEqOperator
//to be used for calculations of type "how many units of sth can I afford?"
DLL_LINKAGE int operator/(const ResourceSet &rhs)
int operator/(const ResourceSet &rhs)
{
int ret = INT_MAX;
for(int i = 0; i < size(); i++)
@ -80,7 +80,7 @@ namespace Res
return ret;
}
DLL_LINKAGE ResourceSet & operator=(const TResource &rhs)
ResourceSet & operator=(const TResource &rhs)
{
for(int i = 0; i < size(); i++)
at(i) = rhs;
@ -88,14 +88,14 @@ namespace Res
return *this;
}
// WARNING: comparison operators are used for "can afford" relation: a <= b means that foreach i a[i] <= b[i]
// WARNING: comparison operators are used for "can afford" relation: a <= b means that foreach i a[i] <= b[i]
// that doesn't work the other way: a > b doesn't mean that a cannot be afforded with b, it's still b can afford a
// bool operator<(const ResourceSet &rhs)
// {
// for(int i = 0; i < size(); i++)
// if(at(i) >= rhs[i])
// return false;
//
//
// return true;
// }
@ -118,7 +118,7 @@ namespace Res
} cur;
const ResourceSet &rs;
void advance();
public:
nziterator(const ResourceSet &RS);
bool valid();
@ -126,7 +126,7 @@ namespace Res
nziterator operator++(int);
const ResEntry& operator*() const;
const ResEntry* operator->() const;
};
};
}