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

* enter can be used to open window with selected hero/town

* fixed slider behavior when showing less maps/games than available slots
* added a few missing sounds for creatures
* fixed problems with artifacts info caused by bug in serialization
* fixed bug in Scholar's serializetion
* all stacks features will be serialized (should fix problems with missing premies from artifacts)
* proper serialization of HeroBonus, fixes some problems/crashes
* resource silos won't give resources on the first day
* fixed problems with removing artifacts when all visiblebackpack slots are full
This commit is contained in:
Michał W. Urbańczyk 2009-05-30 16:00:26 +00:00
parent 5b25b21a15
commit cff70406f1
14 changed files with 65 additions and 67 deletions

View File

@ -1534,6 +1534,16 @@ void CAdvMapInt::keyPressed(const SDL_KeyboardEvent & key)
}
}
return;
case SDLK_RETURN:
{
if(!active || !selection || key.state != SDL_PRESSED)
return;
if(selection->ID == 34)
LOCPLINT->openHeroWindow(static_cast<const CGHeroInstance*>(selection));
else if(selection->ID == 98)
LOCPLINT->openTownWindow(static_cast<const CGTownInstance*>(selection));
return;
}
default:
return;
}

View File

@ -127,6 +127,10 @@ void CBuildingRect::hover(bool on)
{
LOCPLINT->castleInt->hBuild = NULL;
LOCPLINT->statusbar->clear();
//call mouseMoved in other buildings, cursor might have been moved while they were inactive (eg. because of r-click popup)
for(size_t i = 0; i < LOCPLINT->castleInt->buildings.size(); i++)
LOCPLINT->castleInt->buildings[i]->mouseMoved(LOCPLINT->current->motion);
}
}
}
@ -166,7 +170,7 @@ void CBuildingRect::clickRight (tribool down)
}
void CBuildingRect::mouseMoved (const SDL_MouseMotionEvent & sEvent)
{
if(area)
if(area && isItIn(&pos,sEvent.x, sEvent.y))
{
if(CSDL_Ext::SDL_GetPixel(area,sEvent.x-pos.x,sEvent.y-pos.y) == 0) //hovered pixel is inside this building
{

View File

@ -710,7 +710,7 @@ void CArtPlace::clickLeft(boost::logic::tribool down)
{
if(ourArt && ourArt->id == 0)
return; //this is handled separately
if(!ourWindow->activeArtPlace) //nothing has benn clicked
if(!ourWindow->activeArtPlace) //nothing has bewn clicked
{
if(ourArt) //to prevent selecting empty slots (bugfix to what GrayFace reported)
{
@ -720,47 +720,22 @@ void CArtPlace::clickLeft(boost::logic::tribool down)
}
else //perform artifact substitution
{
//chceck if swap is possible
if(this->fitsHere(ourWindow->activeArtPlace->ourArt) && ourWindow->activeArtPlace->fitsHere(this->ourArt))
if(slotID >= 19) //we are an backpack slot - remove active artifact and put it to the last free pos in backpack
{ //TODO: putting artifacts in the middle of backpack (pushing following arts)
LOCPLINT->cb->swapArtifacts(ourWindow->curHero,ourWindow->activeArtPlace->slotID,ourWindow->curHero,ourWindow->curHero->artifacts.size()+19);
}
//check if swap is possible
else if(this->fitsHere(ourWindow->activeArtPlace->ourArt) && ourWindow->activeArtPlace->fitsHere(this->ourArt))
{
int destSlot = slotID,
srcSlot = ourWindow->activeArtPlace->slotID;
LOCPLINT->cb->swapArtifacts(ourWindow->curHero,destSlot,ourWindow->curHero,srcSlot);
//const CArtifact * pmh = ourArt;
//ourArt = ourWindow->activeArtPlace->ourArt;
//ourWindow->activeArtPlace->ourArt = pmh;
////set texts
//if(pmh)
// ourWindow->activeArtPlace->text = pmh->Description();
//else
// ourWindow->activeArtPlace->text = std::string();
//if(ourArt)
// text = ourArt->Description();
//else
// text = std::string();
ourWindow->activeArtPlace->clicked = false;
ourWindow->activeArtPlace = NULL;
}
else
{
int backID = -1;
for(size_t g=0; g<ourWindow->backpack.size(); ++g)
{
if(ourWindow->backpack[g]==this) //if user wants to put something to backpack
{
backID = g;
break;
}
}
if(backID>=0) //put to backpack
{
LOCPLINT->cb->swapArtifacts(ourWindow->curHero,ourWindow->activeArtPlace->slotID,ourWindow->curHero,ourWindow->curHero->artifacts.size()+19);
}
}
}
}
else if(!down && clicked)

View File

@ -189,7 +189,11 @@ void Button::select(bool on)
void Slider::updateSlid()
{
float perc = ((float)whereAreWe)/((float)positionsAmnt-capacity);
float perc = -1.0f;
if(positionsAmnt > capacity)
perc = ((float)whereAreWe)/((float)positionsAmnt-capacity);
else
perc = 0;
float myh;
if (vertical)
{
@ -1570,7 +1574,7 @@ void CPreGame::printMapsFrom(int from)
}
void CPreGame::showScenList()
{
if (currentTab!=&ourScenSel->mapsel)
if (currentTab != &ourScenSel->mapsel)
{
ourScenSel->listShowed=true;
ourScenSel->mapsel.show();

View File

@ -100,6 +100,7 @@ Nosferatu NOSFATTK.wav NOSFDFND.wav NOSFKILL.wav NOSFMOVE.wav NOSFSHOT.wav NOSFW
ObsidianGargoyle OGRGATTK.wav OGRGDFND.wav OGRGKILL.wav OGRGMOVE.wav invalid OGRGWNCE.wav
Ogre OGREATTK.wav OGREDFND.wav OGREKILL.wav OGREMOVE.wav invalid OGREWNCE.wav
OgreMage OGRMATTK.wav OGRMDFND.wav OGRMKILL.wav OGRMMOVE.wav OGRMSHOT.wav OGRMWNCE.wav
OgreShaman TRLLATTK.wav TRLLDFND.wav TRLLKILL.wav TRLLMOVE.wav invalid TRLLWNCE.wav
Orc OORCATTK.wav OORCDFND.wav OORCKILL.wav OORCMOVE.wav OORCSHOT.wav OORCWNCE.wav
OrcChieftain ORCCATTK.wav ORCCDFND.wav ORCCKILL.wav ORCCMOVE.wav ORCCSHOT.wav ORCCWNCE.wav
Peasant PSNTATTK.wav PSNTDFND.wav PSNTKILL.wav PSNTMOVE.wav invalid PSNTWNCE.wav
@ -123,6 +124,7 @@ Single-HornedDemon SHDMATTK.wav SHDMDFND.wav SHDMKILL.wav SHDMMOVE.wav invalid S
Skeleton SKELATTK.wav SKELDFND.wav SKELKILL.wav SKELMOVE.wav invalid SKELWNCE.wav
SkeletonWarrior SKLWATTK.wav SKLWDFND.wav SKLWKILL.wav SKLWMOVE.wav invalid SKLWWNCE.wav
Sprite SPRTATTK.wav SPRTDFND.wav SPRTKILL.wav SPRTMOVE.wav invalid SPRTWNCE.wav
StoneElemental MAGMATTK.wav MAGMDFND.wav MAGMKILL.wav MAGMMOVE.wav invalid MAGMWNCE.wav
StoneGargoyle SGRGATTK.wav SGRGDFND.wav SGRGKILL.wav SGRGMOVE.wav invalid SGRGWNCE.wav
StoneGolem SGLMATTK.wav SGLMDFND.wav SGLMKILL.wav SGLMMOVE.wav invalid SGLMWNCE.wav
StormElemental STORATTK.wav STORDFND.wav STORKILL.wav STORMOVE.wav STORSHOT.wav STORWNCE.wav
@ -132,6 +134,7 @@ Treefolk TREEATTK.wav TREEDFND.wav TREEKILL.wav TREEMOVE.wav invalid TREEWNCE.wa
Troglodyte TROGATTK.wav TROGDFND.wav TROGKILL.wav TROGMOVE.wav invalid TROGWNCE.wav
Unicorn UNICATTK.wav UNICDFND.wav UNICKILL.wav UNICMOVE.wav invalid UNICWNCE.wav
Vampire VAMPATTK.wav VAMPDFND.wav VAMPKILL.wav VAMPMOVE.wav invalid VAMPWNCE.wav VAMPEXT1.wav VAMPEXT2.wav
warrior NMADATTK.wav NMADDFND.wav NMADKILL.wav NMADMOVE.wav invalid NMADWNCE.wav
WarUnicorn WUNCATTK.wav WUNCDFND.wav WUNCKILL.wav WUNCMOVE.wav WUNCSHOT.wav WUNCWNCE.wav
WaterElemental WELMATTK.wav WELMDFND.wav WELMKILL.wav WELMMOVE.wav invalid WELMWNCE.wav
Wight WGHTATTK.wav WGHTDFND.wav WGHTKILL.wav WGHTMOVE.wav invalid WGHTWNCE.wav
@ -144,23 +147,9 @@ Zealot ZELTATTK.wav ZELTDFND.wav ZELTKILL.wav ZELTMOVE.wav ZELTSHOT.wav ZELTWNCE
Zombie ZOMBATTK.wav ZOMBDFND.wav ZOMBKILL.wav ZOMBMOVE.wav invalid ZOMBWNCE.wav
ZombieLord ZMBLATTK.wav ZMBLDFND.wav ZMBLKILL.wav ZMBLMOVE.wav invalid ZMBLWNCE.wav
# todo - troll ?
# TRLLATTK.wav TRLLDFND.wav TRLLKILL.wav TRLLMOVE.wav invalid TRLLWNCE.wav
# todo - nomad ?
# NMADATTK.wav NMADDFND.wav NMADKILL.wav NMADMOVE.wav invalid NMADWNCE.wav
# todo - magma ?
# MAGMATTK.wav MAGMDFND.wav MAGMKILL.wav MAGMMOVE.wav invalid MAGMWNCE.wav
# Missing entries
# 125 StoneElemental
# 128 FireElemental
# 129 FireElemental
# 137 Sharpshooter
# 142 warrior
# 144 OgreShaman
# 149 ArrowTower
# 150 SupremeArchangel
# 151 DiamondDragon

View File

@ -131,10 +131,8 @@
123 IceElemental
124 NOTUSED
125 StoneElemental
126 ElectricityElemental
127 StormElemental
128 FireElemental
129 FireElemental
129 ElectricityElemental
130 Firebird
131 Pheonix
132 AzureDragon

View File

@ -78,6 +78,7 @@ void CArtHandler::loadArtifacts(bool onlyTxt)
artifacts.push_back(nart);
}
sortArts();
if(!onlyTxt)
addBonuses();
}
@ -319,3 +320,12 @@ void CArtHandler::addBonuses()
giveArtBonus(125,HeroBonus::ENEMY_CANT_ESCAPE,0); //Shackles of War
giveArtBonus(126,HeroBonus::BLOCK_SPELLS_ABOVE_LEVEL,0);//Orb of Inhibition
}
void CArtHandler::clear()
{
artifacts.clear();
treasures.clear();
minors.clear();
majors.clear();
relics.clear();
}

View File

@ -47,6 +47,7 @@ public:
void loadArtifacts(bool onlyTxt);
void sortArts();
void addBonuses();
void clear();
static int convertMachineID(int id, bool creToArt);
CArtHandler();

View File

@ -168,7 +168,17 @@ void CSoundHandler::initCreaturesSounds(std::vector<CCreature> &creatures)
if (str.good() || (str.eof() && wince != ""))
{
int id = CGI->creh->nameToID[cname];
int id = -1;
std::map<std::string,int>::iterator i = CGI->creh->nameToID.find(cname);
if(i != CGI->creh->nameToID.end())
id = i->second;
else
{
tlog1 << "Sound info for an unknown creature: " << cname << std::endl;
continue;
}
CCreature &c = creatures[id];
if (c.sounds.killed != soundBase::invalid)

View File

@ -504,7 +504,7 @@ public:
template <typename Handler> void serialize(Handler &h, const int version)
{
h & static_cast<CGObjectInstance&>(*this);
h & bonusType & id;
h & bonusType & bonusID;
}
};

View File

@ -154,9 +154,6 @@ public:
ui16 position; //position on battlefield
ui8 counterAttacks; //how many counter attacks can be performed more in this turn (by default set at the beginning of the round to 1)
si16 shots; //how many shots left
//ui8 speed; //speed of stack with hero bonus
//si32 attack; //attack of stack with hero bonus
//si32 defense; //defense of stack with hero bonus
si8 morale, luck; //base stack luck/morale
std::vector<StackFeature> features;
@ -195,12 +192,12 @@ public:
ui32 id;
h & id;
creature = &VLC->creh->creatures[id];
features = creature->abilities;
//features = creature->abilities;
}
template <typename Handler> void serialize(Handler &h, const int version)
{
h & ID & amount & baseAmount & firstHPleft & owner & slot & attackerOwned & position & state & counterAttacks
& shots & morale & luck;
& shots & morale & luck & features;
if(h.saving)
save(h,version);
else

View File

@ -66,7 +66,7 @@ struct DLL_EXPORT HeroBonus
}
template <typename Handler> void serialize(Handler &h, const int version)
{
h & duration & type & source & val & id & description;
h & duration & type & subtype & source & val & id & description;
}
static bool OneDay(const HeroBonus &hb)

View File

@ -76,9 +76,9 @@ struct StackFeature
SPELL_EFFECT
};
ECombatFeatures type;
EDuration duration;
ESource source;
ui8 type;//ECombatFeatures
ui8 duration;//EDuration
ui8 source;//ESource
ui16 turnsRemain; //if duration is N_TURNS it describes how long the effect will last
si16 subtype; //subtype of bonus/feature
si32 value;

View File

@ -690,7 +690,7 @@ void CGameHandler::newTurn()
}
for(std::vector<CGTownInstance *>::iterator j=i->second.towns.begin();j!=i->second.towns.end();j++)//handle towns
{
if(vstd::contains((**j).builtBuildings,15)) //there is resource silo
if(gs->day && vstd::contains((**j).builtBuildings,15)) //not first day and there is resource silo
{
if((**j).town->primaryRes == 127) //we'll give wood and ore
{
@ -718,7 +718,7 @@ void CGameHandler::newTurn()
}
n.cres.push_back(sac);
}
if((gs->day) && i->first<PLAYER_LIMIT)//not the first day and town not neutral
if(gs->day && i->first<PLAYER_LIMIT)//not the first day and town not neutral
r.res[6] += (**j).dailyIncome();
}
n.res.push_back(r);