mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
* next part of bonus selection screen (including Ivan's config)
This commit is contained in:
parent
4035155969
commit
968148c4dc
@ -2058,13 +2058,16 @@ void CHotSeatPlayers::enterSelectionScreen()
|
||||
GH.pushInt(new CSelectionScreen(CMenuScreen::newGame));
|
||||
}
|
||||
|
||||
CBonusSelection::CBonusSelection( const CCampaign * ourCampaign, int whichMap )
|
||||
CBonusSelection::CBonusSelection( const CCampaign * _ourCampaign, int _whichMap )
|
||||
: ourCampaign(_ourCampaign), whichMap(_whichMap), highlightedRegion(NULL)
|
||||
{
|
||||
OBJ_CONSTRUCTION;
|
||||
static const std::string bgNames [] = {"E1_BG.BMP", "G2_BG.BMP", "E2_BG.BMP", "G1_BG.BMP", "G3_BG.BMP", "N1_BG.BMP",
|
||||
"S1_BG.BMP", "BR_BG.BMP", "IS_BG.BMP", "KR_BG.BMP", "NI_BG.BMP", "TA_BG.BMP", "AR_BG.BMP", "HS_BG.BMP",
|
||||
"BB_BG.BMP", "NB_BG.BMP", "EL_BG.BMP", "RN_BG.BMP", "UA_BG.BMP", "SP_BG.BMP"};
|
||||
|
||||
loadPositionsOfGraphics();
|
||||
|
||||
background = BitmapHandler::loadBitmap(bgNames[ourCampaign->header.mapVersion]);
|
||||
|
||||
SDL_Surface * panel = BitmapHandler::loadBitmap("CAMPBRF.BMP");
|
||||
@ -2145,6 +2148,29 @@ CBonusSelection::CBonusSelection( const CCampaign * ourCampaign, int whichMap )
|
||||
}*/
|
||||
|
||||
SDL_FreeSurface(panel);
|
||||
|
||||
//bonus choosing
|
||||
printAtLoc(CGI->generaltexth->allTexts[71], 510, 431, FONT_MEDIUM, zwykly, background); //Choose a bonus:
|
||||
|
||||
//difficulty
|
||||
printAtLoc("Difficulty", 691, 431, FONT_MEDIUM, zwykly, background); //Difficulty
|
||||
|
||||
//set left part of window
|
||||
for (int g=0; g<ourCampaign->scenarios.size(); ++g)
|
||||
{
|
||||
if(ourCampaign->conquerable(g))
|
||||
{
|
||||
regions.push_back(new CRegion(this, true, true, g));
|
||||
if (highlightedRegion == NULL)
|
||||
{
|
||||
highlightedRegion = regions.back();
|
||||
}
|
||||
}
|
||||
else if (ourCampaign->scenarios[g].conquered) //display as striped
|
||||
{
|
||||
regions.push_back(new CRegion(this, false, false, g));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -2163,3 +2189,103 @@ void CBonusSelection::showAll( SDL_Surface * to )
|
||||
CIntObject::showAll(to);
|
||||
blitAt(background, pos.x, pos.y, to);
|
||||
}
|
||||
|
||||
void CBonusSelection::loadPositionsOfGraphics()
|
||||
{
|
||||
std::ifstream is((GVCMIDirs.UserPath + "/config/campaign_regions.txt").c_str(), std::ios_base::binary | std::ios_base::in);
|
||||
|
||||
assert(is.is_open());
|
||||
|
||||
for (int g=0; g<CGI->generaltexth->campaignMapNames.size(); ++g)
|
||||
{
|
||||
SCampPositions sc;
|
||||
is >> sc.campPrefix;
|
||||
is >> sc.colorSuffixLength;
|
||||
bool contReading = true;
|
||||
while(contReading)
|
||||
{
|
||||
SCampPositions::SRegionDesc rd;
|
||||
is >> rd.infix;
|
||||
if(rd.infix == "END")
|
||||
{
|
||||
contReading = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
is >> rd.xpos >> rd.ypos;
|
||||
sc.regions.push_back(rd);
|
||||
}
|
||||
}
|
||||
|
||||
campDescriptions.push_back(sc);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
CBonusSelection::CRegion::CRegion( CBonusSelection * _owner, bool _accessible, bool _selectable, int _myNumber )
|
||||
: owner(_owner), accessible(_accessible), selectable(_selectable), myNumber(_myNumber)
|
||||
{
|
||||
OBJ_CONSTRUCTION;
|
||||
static const std::string colors[2][8] = {
|
||||
{"R", "B", "N", "G", "O", "V", "T", "P"},
|
||||
{"Re", "Bl", "Br", "Gr", "Or", "Vi", "Te", "Pi"}};
|
||||
|
||||
const SCampPositions & campDsc = owner->campDescriptions[owner->ourCampaign->header.mapVersion];
|
||||
const SCampPositions::SRegionDesc & desc = campDsc.regions[myNumber];
|
||||
pos.x = desc.xpos;
|
||||
pos.y = desc.ypos;
|
||||
|
||||
//loading of graphics
|
||||
|
||||
std::string prefix = campDsc.campPrefix + desc.infix + "_";
|
||||
std::string suffix = colors[campDsc.colorSuffixLength - 1][owner->ourCampaign->scenarios[myNumber].regionColor];
|
||||
|
||||
static const std::string infix [] = {"En", "Se", "Co"};
|
||||
for (int g = 0; g < ARRAY_COUNT(infix); g++)
|
||||
{
|
||||
graphics[g] = BitmapHandler::loadBitmap(prefix + infix[g] + suffix + ".BMP");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
CBonusSelection::CRegion::~CRegion()
|
||||
{
|
||||
for (int g=0; g<ARRAY_COUNT(graphics); ++g)
|
||||
{
|
||||
SDL_FreeSurface(graphics[g]);
|
||||
}
|
||||
}
|
||||
|
||||
void CBonusSelection::CRegion::clickLeft( tribool down, bool previousState )
|
||||
{
|
||||
//select if selectable & clicked inside our graphic
|
||||
if(!down && selectable)
|
||||
{
|
||||
//owner->highlightedRegion = this;
|
||||
}
|
||||
}
|
||||
|
||||
void CBonusSelection::CRegion::clickRight( tribool down, bool previousState )
|
||||
{
|
||||
//show r-click text
|
||||
}
|
||||
|
||||
void CBonusSelection::CRegion::show( SDL_Surface * to )
|
||||
{
|
||||
const SCampPositions::SRegionDesc & desc = owner->campDescriptions[owner->ourCampaign->header.mapVersion].regions[myNumber];
|
||||
if (!accessible)
|
||||
{
|
||||
//show as striped
|
||||
blitAt(graphics[2], pos.x, pos.y, to);
|
||||
}
|
||||
else if (this == owner->highlightedRegion)
|
||||
{
|
||||
//show as selected
|
||||
blitAt(graphics[1], pos.x, pos.y, to);
|
||||
}
|
||||
else
|
||||
{
|
||||
//show as not selected selected
|
||||
blitAt(graphics[0], pos.x, pos.y, to);
|
||||
}
|
||||
}
|
||||
|
@ -256,8 +256,48 @@ class CBonusSelection : public CIntObject
|
||||
{
|
||||
SDL_Surface * background;
|
||||
AdventureMapButton * startB, * backB;
|
||||
|
||||
struct SCampPositions
|
||||
{
|
||||
std::string campPrefix;
|
||||
int colorSuffixLength;
|
||||
|
||||
struct SRegionDesc
|
||||
{
|
||||
std::string infix;
|
||||
int xpos, ypos;
|
||||
};
|
||||
|
||||
std::vector<SRegionDesc> regions;
|
||||
|
||||
};
|
||||
|
||||
std::vector<SCampPositions> campDescriptions;
|
||||
|
||||
class CRegion : public CIntObject
|
||||
{
|
||||
CBonusSelection * owner;
|
||||
SDL_Surface * graphics[3]; //[0] - not selected, [1] - selected, [2] - striped
|
||||
bool accessible; //false if region should be striped
|
||||
bool selectable; //true if region should be selectable
|
||||
int myNumber; //number of region
|
||||
public:
|
||||
CRegion(CBonusSelection * _owner, bool _accessible, bool _selectable, int _myNumber);
|
||||
~CRegion();
|
||||
|
||||
void clickLeft(tribool down, bool previousState);
|
||||
void clickRight(tribool down, bool previousState);
|
||||
void show(SDL_Surface * to);
|
||||
};
|
||||
|
||||
std::vector<CRegion *> regions;
|
||||
CRegion * highlightedRegion;
|
||||
|
||||
void loadPositionsOfGraphics();
|
||||
const CCampaign * ourCampaign;
|
||||
int whichMap;
|
||||
public:
|
||||
CBonusSelection(const CCampaign * ourCampaign, int whichMap);
|
||||
CBonusSelection(const CCampaign * _ourCampaign, int _whichMap);
|
||||
~CBonusSelection();
|
||||
|
||||
void showAll(SDL_Surface * to);
|
||||
|
131
config/campaign_regions.txt
Normal file
131
config/campaign_regions.txt
Normal file
@ -0,0 +1,131 @@
|
||||
E1 1
|
||||
A 270 332
|
||||
B 138 113
|
||||
C 26 70
|
||||
P1 256 127
|
||||
P2 57 314
|
||||
P3 137 310
|
||||
P4 44 163
|
||||
END
|
||||
G2 1
|
||||
A 56 90
|
||||
B 316 49
|
||||
C 54 378
|
||||
D 151 126
|
||||
END
|
||||
E2 1
|
||||
A 131 202
|
||||
B 60 145
|
||||
C 92 261
|
||||
D 218 307
|
||||
END
|
||||
G1 1
|
||||
A 57 314
|
||||
B 137 309
|
||||
C 44 163
|
||||
END
|
||||
G3 1
|
||||
A 289 376
|
||||
B 60 147
|
||||
C 131 202
|
||||
END
|
||||
N1 1
|
||||
A 42 94
|
||||
B 309 290
|
||||
CD 188 202
|
||||
END
|
||||
S1 1
|
||||
A 263 199
|
||||
B 182 210
|
||||
C 82 152
|
||||
END
|
||||
BR 2
|
||||
A 18 233
|
||||
B 125 381
|
||||
C 224 357
|
||||
D 192 320
|
||||
END
|
||||
IS 2
|
||||
A 294 399
|
||||
B 183 293
|
||||
C 40 92
|
||||
D 294 398
|
||||
END
|
||||
KR 2
|
||||
A 148 323
|
||||
B 192 235
|
||||
C 136 158
|
||||
D 87 107
|
||||
END
|
||||
NI 2
|
||||
A 118 111
|
||||
B 223 145
|
||||
C 320 213
|
||||
D 233 250
|
||||
END
|
||||
TA 2
|
||||
A 228 233
|
||||
B 147 194
|
||||
C 112 97
|
||||
END
|
||||
AR 2
|
||||
A 135 238
|
||||
B 135 121
|
||||
C 206 155
|
||||
D 105 397
|
||||
E 109 275
|
||||
F 158 188
|
||||
G 200 261
|
||||
H 232 197
|
||||
END
|
||||
HS 2
|
||||
A 140 326
|
||||
B 238 275
|
||||
C 22 161
|
||||
D 5 9
|
||||
END
|
||||
BB 2
|
||||
A 167 342
|
||||
B 217 263
|
||||
C 0 71
|
||||
D 291 79
|
||||
E 316 199
|
||||
END
|
||||
NB 2
|
||||
A 6 292
|
||||
B 161 334
|
||||
C 63 195
|
||||
D 56 46
|
||||
END
|
||||
EL 2
|
||||
A 11 73
|
||||
B 0 241
|
||||
C 254 34
|
||||
D 91 144
|
||||
END
|
||||
RN 2
|
||||
A 84 319
|
||||
B 194 275
|
||||
C 67 185
|
||||
D 77 30
|
||||
END
|
||||
UA 2
|
||||
A 157 409
|
||||
B 62 346
|
||||
C 8 8
|
||||
D 206 1
|
||||
E 132 357
|
||||
F 184 83
|
||||
G 159 263
|
||||
H 108 173
|
||||
I 55 127
|
||||
J 9 252
|
||||
K 210 176
|
||||
L 260 210
|
||||
END
|
||||
SP 2
|
||||
A 7 295
|
||||
B 44 141
|
||||
C 141 21
|
||||
D 243 156
|
||||
END
|
@ -79,17 +79,20 @@ CCampaign * CCampaignHandler::getCampaign( const std::string & name )
|
||||
|
||||
std::vector<ui32> h3mStarts = locateH3mStarts(cmpgn, it, realSize);
|
||||
|
||||
if(h3mStarts.size() != howManyScenarios)
|
||||
{
|
||||
tlog1<<"Our heuristic for h3m start points gave wrong results for campaign " << name <<std::endl;
|
||||
tlog1<<"Please send this campaign to VCMI Project team to help us fix this problem" << std::endl;
|
||||
delete [] cmpgn;
|
||||
return NULL;
|
||||
}
|
||||
assert(h3mStarts.size() <= howManyScenarios);
|
||||
//it looks like we can have less scenarios than we should..
|
||||
//if(h3mStarts.size() != howManyScenarios)
|
||||
//{
|
||||
// tlog1<<"Our heuristic for h3m start points gave wrong results for campaign " << name <<std::endl;
|
||||
// tlog1<<"Please send this campaign to VCMI Project team to help us fix this problem" << std::endl;
|
||||
// delete [] cmpgn;
|
||||
// assert(0);
|
||||
// return NULL;
|
||||
//}
|
||||
|
||||
for (int g=0; g<howManyScenarios; ++g)
|
||||
for (int g=0; g<h3mStarts.size(); ++g)
|
||||
{
|
||||
if(g == howManyScenarios - 1)
|
||||
if(g == h3mStarts.size() - 1)
|
||||
{
|
||||
ret->mapPieces.push_back(std::string( cmpgn + h3mStarts[g], cmpgn + realSize ));
|
||||
}
|
||||
@ -141,11 +144,17 @@ CCampaignScenario CCampaignHandler::readScenarioFromMemory( const unsigned char
|
||||
}
|
||||
};
|
||||
CCampaignScenario ret;
|
||||
ret.conquered = false;
|
||||
ret.mapName = readString(buffer, outIt);
|
||||
ret.packedMapSize = readNormalNr(buffer, outIt); outIt += 4;
|
||||
if(mapVersion == 18)//unholy alliance
|
||||
outIt++;
|
||||
ret.preconditionRegion = buffer[outIt++];
|
||||
{
|
||||
ret.preconditionRegion = readNormalNr(buffer, outIt, 2); outIt += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.preconditionRegion = buffer[outIt++];
|
||||
}
|
||||
ret.regionColor = buffer[outIt++];
|
||||
ret.difficulty = buffer[outIt++];
|
||||
ret.regionText = readString(buffer, outIt);
|
||||
@ -181,6 +190,9 @@ CScenarioTravel CCampaignHandler::readScenarioTravelFromMemory( const unsigned c
|
||||
|
||||
switch(ret.startOptions)
|
||||
{
|
||||
case 0:
|
||||
//no bonuses. Seems to be OK
|
||||
break;
|
||||
case 1: //reading of bonuses player can choose
|
||||
{
|
||||
ret.playerColor = buffer[outIt++];
|
||||
@ -368,4 +380,20 @@ bool CCampaignHandler::startsAt( const unsigned char * buffer, int size, int pos
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool CCampaign::conquerable( int whichScenario ) const
|
||||
{
|
||||
if (scenarios[whichScenario].conquered)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
//check preconditioned regions
|
||||
for (int g=0; g<scenarios.size(); ++g)
|
||||
{
|
||||
if(( (1 << g) & scenarios[whichScenario].preconditionRegion ) && !scenarios[g].conquered)
|
||||
return false; //prerequisite does not met
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -66,10 +66,11 @@ class DLL_EXPORT CCampaignScenario
|
||||
{
|
||||
public:
|
||||
std::string mapName;
|
||||
ui32 packedMapSize;
|
||||
ui8 preconditionRegion;
|
||||
ui32 packedMapSize; //generally not used
|
||||
ui16 preconditionRegion; //what we need to conquer to conquer this one (bitfield!)
|
||||
ui8 regionColor;
|
||||
ui8 difficulty;
|
||||
ui8 conquered;
|
||||
|
||||
std::string regionText;
|
||||
|
||||
@ -92,7 +93,8 @@ public:
|
||||
|
||||
template <typename Handler> void serialize(Handler &h, const int formatVersion)
|
||||
{
|
||||
h & mapName & packedMapSize & preconditionRegion & regionColor & difficulty & regionText & prolog & epilog & travelOptions;
|
||||
h & mapName & packedMapSize & preconditionRegion & regionColor & difficulty & conquered & regionText &
|
||||
prolog & epilog & travelOptions;
|
||||
}
|
||||
};
|
||||
|
||||
@ -107,6 +109,8 @@ public:
|
||||
{
|
||||
h & header & scenarios & mapPieces;
|
||||
}
|
||||
|
||||
bool conquerable(int whichScenario) const;
|
||||
};
|
||||
|
||||
class DLL_EXPORT CCampaignHandler
|
||||
|
Loading…
Reference in New Issue
Block a user