mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
parent
47945383da
commit
613172fa45
@ -896,7 +896,7 @@ void VCAI::makeTurn()
|
||||
{
|
||||
MAKING_TURN;
|
||||
boost::shared_lock<boost::shared_mutex> gsLock(cb->getGsMutex());
|
||||
setThreadName(-1, "VCAI::makeTurn");
|
||||
setThreadName("VCAI::makeTurn");
|
||||
|
||||
BNLOG("Player %d starting turn", playerID);
|
||||
INDENT;
|
||||
@ -2178,7 +2178,7 @@ void VCAI::requestActionASAP(boost::function<void()> whatToDo)
|
||||
boost::barrier b(2);
|
||||
boost::thread newThread([&b,this,whatToDo]()
|
||||
{
|
||||
setThreadName(-1, "VCAI::requestActionASAP::helper");
|
||||
setThreadName("VCAI::requestActionASAP::helper");
|
||||
SET_GLOBAL_STATE(this);
|
||||
boost::shared_lock<boost::shared_mutex> gsLock(cb->getGsMutex());
|
||||
b.wait();
|
||||
|
10
README.linux
10
README.linux
@ -1,8 +1,12 @@
|
||||
This readme covers VCMI compilation on Unix-like systems.
|
||||
|
||||
For complete installation instructions see VCMI wiki:
|
||||
http://wiki.vcmi.eu/index.php?title=Installation_on_Linux
|
||||
To run the game you will need:
|
||||
1) Heroes 3 data files (SoD or Complete editions);
|
||||
2) Unofficial WoG addon
|
||||
2) VCMI data pack (http://download.vcmi.eu/vcmi-data_0.89.tar.gz)
|
||||
|
||||
For complete installation instructions see VCMI wiki:
|
||||
http://wiki.vcmi.eu/index.php?title=Installation_on_Linux#Preparing_data
|
||||
|
||||
I. Prerequisites
|
||||
|
||||
@ -80,7 +84,7 @@ Since VCMI is still in development, there's no install procedure, although this
|
||||
make install
|
||||
You also need to update configuration files:
|
||||
cp /PATH_TO_SOURCE/config /DATA_PATH/vcmi
|
||||
In this case you'll have to manually update after any changes.
|
||||
In this case you'll have to manually update these files after any changes.
|
||||
For more permament solution you should use links as described below.
|
||||
|
||||
For development puposes, it's better to use links. Go
|
||||
|
@ -1345,12 +1345,15 @@ CCreatureAnim::CCreatureAnim(int x, int y, std::string name, Rect picPos, ui8 fl
|
||||
pos.h = picPos.h;
|
||||
};
|
||||
|
||||
void CCreatureAnim::loopPreview()
|
||||
void CCreatureAnim::loopPreview(bool warMachine)
|
||||
{
|
||||
std::vector<EAnimType> available;
|
||||
static const EAnimType previewList[] = {HOLDING, HITTED, DEFENCE, ATTACK_FRONT, CAST_FRONT};
|
||||
|
||||
for (size_t i=0; i<5; i++)
|
||||
static const EAnimType creaPreviewList[] = {HOLDING, HITTED, DEFENCE, ATTACK_FRONT, CAST_FRONT};
|
||||
static const EAnimType machPreviewList[] = {HOLDING, MOVING, SHOOT_UP, SHOOT_FRONT, SHOOT_DOWN};
|
||||
auto & previewList = warMachine ? machPreviewList : creaPreviewList;
|
||||
|
||||
for (size_t i=0; i<ARRAY_COUNT(previewList); i++)
|
||||
if (anim.size(previewList[i]))
|
||||
available.push_back(previewList[i]);
|
||||
|
||||
@ -1358,10 +1361,15 @@ void CCreatureAnim::loopPreview()
|
||||
|
||||
if (rnd >= available.size())
|
||||
{
|
||||
EAnimType type;
|
||||
if ( anim.size(MOVING) == 0 )//no moving animation present
|
||||
addLast( HOLDING );
|
||||
type = HOLDING;
|
||||
else
|
||||
addLast( MOVING ) ;
|
||||
type = MOVING;
|
||||
|
||||
//display this anim for ~1 second (time is random, but it looks good)
|
||||
for (size_t i=0; i< 12/anim.size(type) + 1; i++)
|
||||
addLast(type);
|
||||
}
|
||||
else
|
||||
addLast(available[rnd]);
|
||||
@ -1410,9 +1418,9 @@ void CCreatureAnim::reset()
|
||||
set(HOLDING);
|
||||
}
|
||||
|
||||
void CCreatureAnim::startPreview()
|
||||
void CCreatureAnim::startPreview(bool warMachine)
|
||||
{
|
||||
callback = boost::bind(&CCreatureAnim::loopPreview,this);
|
||||
callback = boost::bind(&CCreatureAnim::loopPreview, this, warMachine);
|
||||
}
|
||||
|
||||
void CCreatureAnim::clearAndSet(EAnimType type)
|
||||
|
@ -352,8 +352,8 @@ private:
|
||||
//queue of animations waiting to be displayed
|
||||
std::queue<EAnimType> queue;
|
||||
|
||||
//this funcction is used as callback if preview flag was set during construction
|
||||
void loopPreview();
|
||||
//this function is used as callback if preview flag was set during construction
|
||||
void loopPreview(bool warMachine);
|
||||
|
||||
public:
|
||||
//change anim to next if queue is not empty, call callback othervice
|
||||
@ -362,7 +362,7 @@ public:
|
||||
//add sequence to the end of queue
|
||||
void addLast(EAnimType newType);
|
||||
|
||||
void startPreview();
|
||||
void startPreview(bool warMachine);
|
||||
|
||||
//clear queue and set animation to this sequence
|
||||
void clearAndSet(EAnimType type);
|
||||
|
@ -878,7 +878,7 @@ void CSelectionScreen::difficultyChange( int to )
|
||||
|
||||
void CSelectionScreen::handleConnection()
|
||||
{
|
||||
setThreadName(-1, "CSelectionScreen::handleConnection");
|
||||
setThreadName("CSelectionScreen::handleConnection");
|
||||
try
|
||||
{
|
||||
assert(serv);
|
||||
|
@ -133,7 +133,7 @@ void CClient::waitForMoveAndSend(int color)
|
||||
|
||||
void CClient::run()
|
||||
{
|
||||
setThreadName(-1, "CClient::run");
|
||||
setThreadName("CClient::run");
|
||||
try
|
||||
{
|
||||
CPack *pack = NULL;
|
||||
@ -614,7 +614,7 @@ void CClient::calculatePaths(const CGHeroInstance *h)
|
||||
|
||||
void CClient::commenceTacticPhaseForInt(CBattleGameInterface *battleInt)
|
||||
{
|
||||
setThreadName(-1, "CClient::commenceTacticPhaseForInt");
|
||||
setThreadName("CClient::commenceTacticPhaseForInt");
|
||||
try
|
||||
{
|
||||
battleInt->yourTacticPhase(gs->curB->tacticDistance);
|
||||
@ -708,7 +708,7 @@ CServerHandler::~CServerHandler()
|
||||
|
||||
void CServerHandler::callServer()
|
||||
{
|
||||
setThreadName(-1, "CServerHandler::callServer");
|
||||
setThreadName("CServerHandler::callServer");
|
||||
std::string logName = GVCMIDirs.UserPath + "/server_log.txt";
|
||||
std::string comm = GameConstants::BIN_DIR + GameConstants::PATH_SEPARATOR + GameConstants::SERVER_NAME + " " + port + " > " + logName;
|
||||
int result = std::system(comm.c_str());
|
||||
|
@ -1037,8 +1037,8 @@ CCreaturePic::CCreaturePic(int x, int y, const CCreature *cre, bool Big, bool An
|
||||
bg = new CPicture(graphics->backgroundsm[cre->faction],0,0,false);
|
||||
bg->needRefresh = true;
|
||||
anim = new CCreatureAnim(0, 0, cre->animDefName, Rect());
|
||||
anim->clipRect(cre->doubleWide?170:150, 155, bg->pos.w, bg->pos.h);
|
||||
anim->startPreview();
|
||||
anim->clipRect(cre->isDoubleWide()?170:150, 155, bg->pos.w, bg->pos.h);
|
||||
anim->startPreview(cre->hasBonusOfType(Bonus::SIEGE_WEAPON));
|
||||
|
||||
pos.w = bg->pos.w;
|
||||
pos.h = bg->pos.h;
|
||||
@ -1201,9 +1201,6 @@ void CRecruitmentWindow::buy()
|
||||
onRecruit(crid, slider->value);
|
||||
if(level >= 0)
|
||||
close();
|
||||
else
|
||||
slider->moveTo(0);
|
||||
|
||||
}
|
||||
|
||||
void CRecruitmentWindow::showAll(SDL_Surface * to)
|
||||
@ -1261,13 +1258,14 @@ void CRecruitmentWindow::availableCreaturesChanged()
|
||||
{
|
||||
OBJ_CONSTRUCTION_CAPTURING_ALL;
|
||||
|
||||
size_t selectedIndex = 0;
|
||||
|
||||
if (!cards.empty() && selected) // find position of selected item
|
||||
selectedIndex = std::find(cards.begin(), cards.end(), selected) - cards.begin();
|
||||
|
||||
//deselect card
|
||||
select(nullptr);
|
||||
|
||||
static const int SPACE_BETWEEN = 18;
|
||||
static const int CREATURE_WIDTH = 102;
|
||||
static const int TOTAL_CREATURE_WIDTH = SPACE_BETWEEN + CREATURE_WIDTH;
|
||||
|
||||
//delete old cards
|
||||
BOOST_FOREACH(auto & card, cards)
|
||||
delete card;
|
||||
@ -1288,15 +1286,33 @@ void CRecruitmentWindow::availableCreaturesChanged()
|
||||
|
||||
assert(!cards.empty());
|
||||
|
||||
const int creatureWidth = 102;
|
||||
|
||||
//normal distance between cards - 18px
|
||||
int requiredSpace = 18;
|
||||
//maximum distance we can use without reaching window borders
|
||||
int availableSpace = pos.w - 50 - creatureWidth * cards.size();
|
||||
|
||||
if (cards.size() > 1) // avoid division by zero
|
||||
availableSpace /= cards.size() - 1;
|
||||
else
|
||||
availableSpace = 0;
|
||||
|
||||
assert(availableSpace >= 0);
|
||||
|
||||
const int spaceBetween = std::min(requiredSpace, availableSpace);
|
||||
const int totalCreatureWidth = spaceBetween + creatureWidth;
|
||||
|
||||
//now we know total amount of cards and can move them to correct position
|
||||
int curx = 192 + 50 - (CREATURE_WIDTH*cards.size()/2) - (SPACE_BETWEEN*(cards.size()-1)/2);
|
||||
int curx = pos.w / 2 - (creatureWidth*cards.size()/2) - (spaceBetween*(cards.size()-1)/2);
|
||||
BOOST_FOREACH(auto & card, cards)
|
||||
{
|
||||
card->moveBy(Point(curx, 64));
|
||||
curx += TOTAL_CREATURE_WIDTH;
|
||||
curx += totalCreatureWidth;
|
||||
}
|
||||
|
||||
select(cards.front());
|
||||
//restore selection
|
||||
select(cards[selectedIndex]);
|
||||
|
||||
if(slider->value)
|
||||
slider->moveTo(0);
|
||||
|
@ -342,7 +342,7 @@ void CGuiHandler::fakeMouseMove()
|
||||
|
||||
void CGuiHandler::run()
|
||||
{
|
||||
setThreadName(-1, "CGuiHandler::run");
|
||||
setThreadName("CGuiHandler::run");
|
||||
inGuiThread.reset(new bool(true));
|
||||
try
|
||||
{
|
||||
|
@ -1943,7 +1943,9 @@
|
||||
"level": 0,
|
||||
"name": [ "SylvanCentaur" ],
|
||||
"faction": -1,
|
||||
"defname": "ZM192Z.DEF"
|
||||
"defname": "ZM192Z.DEF",
|
||||
"projectile_defname": "PELFX.DEF",
|
||||
"projectile_spin": false
|
||||
},
|
||||
|
||||
{
|
||||
|
@ -180,7 +180,7 @@ void CConsoleHandler::setColor(int level)
|
||||
|
||||
int CConsoleHandler::run()
|
||||
{
|
||||
setThreadName(-1, "CConsoleHandler::run");
|
||||
setThreadName("CConsoleHandler::run");
|
||||
//disabling sync to make in_avail() work (othervice always returns 0)
|
||||
std::ios::sync_with_stdio(false);
|
||||
std::string buffer;
|
||||
|
@ -74,10 +74,18 @@ class CGameInterface : public CBattleGameInterface, public IGameEventsReceiver
|
||||
public:
|
||||
virtual void init(CCallback * CB){};
|
||||
virtual void yourTurn(){}; //called AFTER playerStartsTurn(player)
|
||||
virtual void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback)=0; //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id
|
||||
|
||||
//pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id
|
||||
virtual void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback)=0;
|
||||
virtual void commanderGotLevel (const CCommanderInstance * commander, std::vector<ui32> skills, boost::function<void(ui32)> &callback)=0;
|
||||
virtual void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, const int soundID, bool selection, bool cancel) = 0; //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.
|
||||
virtual void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, boost::function<void()> &onEnd) = 0; //all stacks operations between these objects become allowed, interface has to call onEnd when done
|
||||
|
||||
// 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.
|
||||
virtual void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, const int soundID, bool selection, bool cancel) = 0;
|
||||
|
||||
// all stacks operations between these objects become allowed, interface has to call onEnd when done
|
||||
virtual void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, boost::function<void()> &onEnd) = 0;
|
||||
virtual void serialize(COSer<CSaveFile> &h, const int version){}; //saving
|
||||
virtual void serialize(CISer<CLoadFile> &h, const int version){}; //loading
|
||||
virtual void finish(){}; //if for some reason we want to end
|
||||
|
@ -45,7 +45,9 @@ void CThreadHelper::processTasks()
|
||||
}
|
||||
}
|
||||
|
||||
void setThreadName(long threadID, const std::string &name)
|
||||
// set name for this thread.
|
||||
// NOTE: on *nix string will be trimmed to 16 symbols
|
||||
void setThreadName(const std::string &name)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
//follows http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
|
||||
@ -62,7 +64,7 @@ void setThreadName(long threadID, const std::string &name)
|
||||
THREADNAME_INFO info;
|
||||
info.dwType = 0x1000;
|
||||
info.szName = name.c_str();
|
||||
info.dwThreadID = threadID;
|
||||
info.dwThreadID = -1;
|
||||
info.dwFlags = 0;
|
||||
|
||||
__try
|
||||
|
@ -34,7 +34,7 @@ template <typename T> inline void setData(T * data, boost::function<T()> func)
|
||||
*data = func();
|
||||
}
|
||||
|
||||
void DLL_LINKAGE setThreadName(long threadID, const std::string &name);
|
||||
void DLL_LINKAGE setThreadName(const std::string &name);
|
||||
|
||||
#define GET_DATA(TYPE,DESTINATION,FUNCTION_TO_GET) \
|
||||
(boost::bind(&setData<TYPE>,&DESTINATION,FUNCTION_TO_GET))
|
||||
|
@ -847,7 +847,7 @@ void CGameHandler::applyBattleEffects(BattleAttack &bat, const CStack *att, cons
|
||||
}
|
||||
void CGameHandler::handleConnection(std::set<int> players, CConnection &c)
|
||||
{
|
||||
setThreadName(-1, "CGameHandler::handleConnection");
|
||||
setThreadName("CGameHandler::handleConnection");
|
||||
srand(time(NULL));
|
||||
|
||||
try
|
||||
|
Loading…
Reference in New Issue
Block a user