forked from mirror/openmw-tes3mp
Closes #1092: Implement sleep interruption. Fix levelled list flags for creatures. Change World::copyObjectToCell to search for the correct cell.
This commit is contained in:
parent
69381c49c7
commit
52b9ebff9d
13 changed files with 150 additions and 43 deletions
|
@ -717,16 +717,26 @@ std::string landFlags(int flags)
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string leveledListFlags(int flags)
|
std::string itemListFlags(int flags)
|
||||||
{
|
{
|
||||||
std::string properties = "";
|
std::string properties = "";
|
||||||
if (flags == 0) properties += "[None] ";
|
if (flags == 0) properties += "[None] ";
|
||||||
if (flags & ESM::LeveledListBase::AllLevels) properties += "AllLevels ";
|
if (flags & ESM::ItemLevList::AllLevels) properties += "AllLevels ";
|
||||||
// This flag apparently not present on creature lists...
|
if (flags & ESM::ItemLevList::Each) properties += "Each ";
|
||||||
if (flags & ESM::LeveledListBase::Each) properties += "Each ";
|
|
||||||
int unused = (0xFFFFFFFF ^
|
int unused = (0xFFFFFFFF ^
|
||||||
(ESM::LeveledListBase::AllLevels|
|
(ESM::ItemLevList::AllLevels|
|
||||||
ESM::LeveledListBase::Each));
|
ESM::ItemLevList::Each));
|
||||||
|
if (flags & unused) properties += "Invalid ";
|
||||||
|
properties += str(boost::format("(0x%08X)") % flags);
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string creatureListFlags(int flags)
|
||||||
|
{
|
||||||
|
std::string properties = "";
|
||||||
|
if (flags == 0) properties += "[None] ";
|
||||||
|
if (flags & ESM::CreatureLevList::AllLevels) properties += "AllLevels ";
|
||||||
|
int unused = (0xFFFFFFFF ^ ESM::CreatureLevList::AllLevels);
|
||||||
if (flags & unused) properties += "Invalid ";
|
if (flags & unused) properties += "Invalid ";
|
||||||
properties += str(boost::format("(0x%08X)") % flags);
|
properties += str(boost::format("(0x%08X)") % flags);
|
||||||
return properties;
|
return properties;
|
||||||
|
|
|
@ -50,7 +50,8 @@ std::string cellFlags(int flags);
|
||||||
std::string containerFlags(int flags);
|
std::string containerFlags(int flags);
|
||||||
std::string creatureFlags(int flags);
|
std::string creatureFlags(int flags);
|
||||||
std::string landFlags(int flags);
|
std::string landFlags(int flags);
|
||||||
std::string leveledListFlags(int flags);
|
std::string creatureListFlags(int flags);
|
||||||
|
std::string itemListFlags(int flags);
|
||||||
std::string lightFlags(int flags);
|
std::string lightFlags(int flags);
|
||||||
std::string magicEffectFlags(int flags);
|
std::string magicEffectFlags(int flags);
|
||||||
std::string npcFlags(int flags);
|
std::string npcFlags(int flags);
|
||||||
|
|
|
@ -834,7 +834,8 @@ template<>
|
||||||
void Record<ESM::CreatureLevList>::print()
|
void Record<ESM::CreatureLevList>::print()
|
||||||
{
|
{
|
||||||
std::cout << " Chance for None: " << (int)mData.mChanceNone << std::endl;
|
std::cout << " Chance for None: " << (int)mData.mChanceNone << std::endl;
|
||||||
std::cout << " Flags: " << leveledListFlags(mData.mFlags) << std::endl;
|
std::cout << " Flags: " << creatureListFlags(mData.mFlags) << std::endl;
|
||||||
|
std::cout << " Chance none: " << mData.mChanceNone << std::endl;
|
||||||
std::cout << " Number of items: " << mData.mList.size() << std::endl;
|
std::cout << " Number of items: " << mData.mList.size() << std::endl;
|
||||||
std::vector<ESM::LeveledListBase::LevelItem>::iterator iit;
|
std::vector<ESM::LeveledListBase::LevelItem>::iterator iit;
|
||||||
for (iit = mData.mList.begin(); iit != mData.mList.end(); iit++)
|
for (iit = mData.mList.begin(); iit != mData.mList.end(); iit++)
|
||||||
|
@ -846,11 +847,12 @@ template<>
|
||||||
void Record<ESM::ItemLevList>::print()
|
void Record<ESM::ItemLevList>::print()
|
||||||
{
|
{
|
||||||
std::cout << " Chance for None: " << (int)mData.mChanceNone << std::endl;
|
std::cout << " Chance for None: " << (int)mData.mChanceNone << std::endl;
|
||||||
std::cout << " Flags: " << leveledListFlags(mData.mFlags) << std::endl;
|
std::cout << " Flags: " << itemListFlags(mData.mFlags) << std::endl;
|
||||||
|
std::cout << " Chance none: " << mData.mChanceNone << std::endl;
|
||||||
std::cout << " Number of items: " << mData.mList.size() << std::endl;
|
std::cout << " Number of items: " << mData.mList.size() << std::endl;
|
||||||
std::vector<ESM::LeveledListBase::LevelItem>::iterator iit;
|
std::vector<ESM::LeveledListBase::LevelItem>::iterator iit;
|
||||||
for (iit = mData.mList.begin(); iit != mData.mList.end(); iit++)
|
for (iit = mData.mList.begin(); iit != mData.mList.end(); iit++)
|
||||||
std::cout << " Inventory: Count: " << iit->mLevel
|
std::cout << " Inventory: Level: " << iit->mLevel
|
||||||
<< " Item: " << iit->mId << std::endl;
|
<< " Item: " << iit->mId << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -460,6 +460,9 @@ namespace MWBase
|
||||||
virtual void confiscateStolenItems(const MWWorld::Ptr& ptr) = 0;
|
virtual void confiscateStolenItems(const MWWorld::Ptr& ptr) = 0;
|
||||||
|
|
||||||
virtual void goToJail () = 0;
|
virtual void goToJail () = 0;
|
||||||
|
|
||||||
|
/// Spawn a random creature from a levelled list next to the player
|
||||||
|
virtual void spawnRandomCreature(const std::string& creatureList) = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ namespace MWGui
|
||||||
, mRemainingTime(0.05)
|
, mRemainingTime(0.05)
|
||||||
, mCurHour(0)
|
, mCurHour(0)
|
||||||
, mManualHours(1)
|
, mManualHours(1)
|
||||||
|
, mInterruptAt(-1)
|
||||||
{
|
{
|
||||||
getWidget(mDateTimeText, "DateTimeText");
|
getWidget(mDateTimeText, "DateTimeText");
|
||||||
getWidget(mRestText, "RestText");
|
getWidget(mRestText, "RestText");
|
||||||
|
@ -156,7 +157,8 @@ namespace MWGui
|
||||||
|
|
||||||
void WaitDialog::startWaiting(int hoursToWait)
|
void WaitDialog::startWaiting(int hoursToWait)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getWorld ()->getFader ()->fadeOut(0.2);
|
MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||||
|
world->getFader ()->fadeOut(0.2);
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
mProgressBar.setVisible (true);
|
mProgressBar.setVisible (true);
|
||||||
|
|
||||||
|
@ -164,6 +166,30 @@ namespace MWGui
|
||||||
mCurHour = 0;
|
mCurHour = 0;
|
||||||
mHours = hoursToWait;
|
mHours = hoursToWait;
|
||||||
|
|
||||||
|
// FIXME: move this somewhere else?
|
||||||
|
mInterruptAt = -1;
|
||||||
|
MWWorld::Ptr player = world->getPlayerPtr();
|
||||||
|
if (mSleeping && player.getCell()->isExterior())
|
||||||
|
{
|
||||||
|
std::string regionstr = player.getCell()->mCell->mRegion;
|
||||||
|
if (!regionstr.empty())
|
||||||
|
{
|
||||||
|
const ESM::Region *region = world->getStore().get<ESM::Region>().find (regionstr);
|
||||||
|
if (!region->mSleepList.empty())
|
||||||
|
{
|
||||||
|
float fSleepRandMod = world->getStore().get<ESM::GameSetting>().find("fSleepRandMod")->getFloat();
|
||||||
|
int x = std::rand()/ (static_cast<double> (RAND_MAX) + 1) * hoursToWait; // [0, hoursRested]
|
||||||
|
float y = fSleepRandMod * hoursToWait;
|
||||||
|
if (x > y)
|
||||||
|
{
|
||||||
|
float fSleepRestMod = world->getStore().get<ESM::GameSetting>().find("fSleepRestMod")->getFloat();
|
||||||
|
mInterruptAt = int(fSleepRestMod * hoursToWait);
|
||||||
|
mInterruptCreatureList = region->mSleepList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mRemainingTime = 0.05;
|
mRemainingTime = 0.05;
|
||||||
mProgressBar.setProgress (0, mHours);
|
mProgressBar.setProgress (0, mHours);
|
||||||
}
|
}
|
||||||
|
@ -206,6 +232,13 @@ namespace MWGui
|
||||||
if (!mWaiting)
|
if (!mWaiting)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (mCurHour == mInterruptAt)
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->messageBox("#{sSleepInterrupt}");
|
||||||
|
MWBase::Environment::get().getWorld()->spawnRandomCreature(mInterruptCreatureList);
|
||||||
|
stopWaiting();
|
||||||
|
}
|
||||||
|
|
||||||
mRemainingTime -= dt;
|
mRemainingTime -= dt;
|
||||||
|
|
||||||
while (mRemainingTime < 0)
|
while (mRemainingTime < 0)
|
||||||
|
|
|
@ -51,6 +51,9 @@ namespace MWGui
|
||||||
int mManualHours; // stores the hours to rest selected via slider
|
int mManualHours; // stores the hours to rest selected via slider
|
||||||
float mRemainingTime;
|
float mRemainingTime;
|
||||||
|
|
||||||
|
int mInterruptAt;
|
||||||
|
std::string mInterruptCreatureList;
|
||||||
|
|
||||||
WaitDialogProgressBar mProgressBar;
|
WaitDialogProgressBar mProgressBar;
|
||||||
|
|
||||||
void onUntilHealedButtonClicked(MyGUI::Widget* sender);
|
void onUntilHealedButtonClicked(MyGUI::Widget* sender);
|
||||||
|
|
|
@ -515,7 +515,7 @@ namespace MWMechanics
|
||||||
if (magnitude > 0)
|
if (magnitude > 0)
|
||||||
{
|
{
|
||||||
ESM::Position ipos = ptr.getRefData().getPosition();
|
ESM::Position ipos = ptr.getRefData().getPosition();
|
||||||
Ogre::Vector3 pos(ipos.pos[0],ipos.pos[1],ipos.pos[2]);
|
Ogre::Vector3 pos(ipos.pos);
|
||||||
Ogre::Quaternion rot(Ogre::Radian(-ipos.rot[2]), Ogre::Vector3::UNIT_Z);
|
Ogre::Quaternion rot(Ogre::Radian(-ipos.rot[2]), Ogre::Vector3::UNIT_Z);
|
||||||
const float distance = 50;
|
const float distance = 50;
|
||||||
pos = pos + distance*rot.yAxis();
|
pos = pos + distance*rot.yAxis();
|
||||||
|
|
|
@ -860,6 +860,7 @@ void CharacterController::update(float duration)
|
||||||
bool onground = world->isOnGround(mPtr);
|
bool onground = world->isOnGround(mPtr);
|
||||||
bool inwater = world->isSwimming(mPtr);
|
bool inwater = world->isSwimming(mPtr);
|
||||||
bool isrunning = cls.getStance(mPtr, MWWorld::Class::Run);
|
bool isrunning = cls.getStance(mPtr, MWWorld::Class::Run);
|
||||||
|
isrunning = true;
|
||||||
bool sneak = cls.getStance(mPtr, MWWorld::Class::Sneak);
|
bool sneak = cls.getStance(mPtr, MWWorld::Class::Sneak);
|
||||||
bool flying = world->isFlying(mPtr);
|
bool flying = world->isFlying(mPtr);
|
||||||
Ogre::Vector3 vec = cls.getMovementVector(mPtr);
|
Ogre::Vector3 vec = cls.getMovementVector(mPtr);
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace MWMechanics
|
||||||
{
|
{
|
||||||
|
|
||||||
/// @return ID of resulting item, or empty if none
|
/// @return ID of resulting item, or empty if none
|
||||||
std::string getLevelledItem (const ESM::LeveledListBase* levItem, unsigned char failChance=0)
|
inline std::string getLevelledItem (const ESM::LeveledListBase* levItem, bool creature, unsigned char failChance=0)
|
||||||
{
|
{
|
||||||
const std::vector<ESM::LeveledListBase::LevelItem>& items = levItem->mList;
|
const std::vector<ESM::LeveledListBase::LevelItem>& items = levItem->mList;
|
||||||
|
|
||||||
|
@ -20,29 +20,33 @@ namespace MWMechanics
|
||||||
|
|
||||||
failChance += levItem->mChanceNone;
|
failChance += levItem->mChanceNone;
|
||||||
|
|
||||||
float random = static_cast<float> (std::rand()) / RAND_MAX;
|
int random = std::rand()/ (static_cast<double> (RAND_MAX) + 1) * 100; // [0, 99]
|
||||||
if (random < failChance/100.f)
|
if (random < failChance)
|
||||||
return std::string();
|
return std::string();
|
||||||
|
|
||||||
std::vector<std::string> candidates;
|
std::vector<std::string> candidates;
|
||||||
int highestLevel = 0;
|
int highestLevel = 0;
|
||||||
for (std::vector<ESM::LeveledListBase::LevelItem>::const_iterator it = items.begin(); it != items.end(); ++it)
|
for (std::vector<ESM::LeveledListBase::LevelItem>::const_iterator it = items.begin(); it != items.end(); ++it)
|
||||||
{
|
{
|
||||||
if (it->mLevel > highestLevel)
|
if (it->mLevel > highestLevel && it->mLevel <= playerLevel)
|
||||||
highestLevel = it->mLevel;
|
highestLevel = it->mLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For levelled creatures, the flags are swapped. This file format just makes so much sense.
|
||||||
|
bool allLevels = levItem->mFlags & ESM::ItemLevList::AllLevels;
|
||||||
|
if (creature)
|
||||||
|
allLevels = levItem->mFlags & ESM::CreatureLevList::AllLevels;
|
||||||
|
|
||||||
std::pair<int, std::string> highest = std::make_pair(-1, "");
|
std::pair<int, std::string> highest = std::make_pair(-1, "");
|
||||||
for (std::vector<ESM::LeveledListBase::LevelItem>::const_iterator it = items.begin(); it != items.end(); ++it)
|
for (std::vector<ESM::LeveledListBase::LevelItem>::const_iterator it = items.begin(); it != items.end(); ++it)
|
||||||
{
|
{
|
||||||
if (playerLevel >= it->mLevel
|
if (playerLevel >= it->mLevel
|
||||||
&& (levItem->mFlags & ESM::LeveledListBase::AllLevels || it->mLevel == highestLevel))
|
&& (allLevels || it->mLevel == highestLevel))
|
||||||
{
|
{
|
||||||
candidates.push_back(it->mId);
|
candidates.push_back(it->mId);
|
||||||
if (it->mLevel >= highest.first)
|
if (it->mLevel >= highest.first)
|
||||||
highest = std::make_pair(it->mLevel, it->mId);
|
highest = std::make_pair(it->mLevel, it->mId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (candidates.empty())
|
if (candidates.empty())
|
||||||
return std::string();
|
return std::string();
|
||||||
|
|
|
@ -321,7 +321,7 @@ void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string id = MWMechanics::getLevelledItem(ref.getPtr().get<ESM::ItemLevList>()->mBase);
|
std::string id = MWMechanics::getLevelledItem(ref.getPtr().get<ESM::ItemLevList>()->mBase, false);
|
||||||
if (id.empty())
|
if (id.empty())
|
||||||
return;
|
return;
|
||||||
addInitialItem(id, owner, faction, count, false);
|
addInitialItem(id, owner, faction, count, false);
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "../mwmechanics/movement.hpp"
|
#include "../mwmechanics/movement.hpp"
|
||||||
#include "../mwmechanics/npcstats.hpp"
|
#include "../mwmechanics/npcstats.hpp"
|
||||||
#include "../mwmechanics/spellcasting.hpp"
|
#include "../mwmechanics/spellcasting.hpp"
|
||||||
|
#include "../mwmechanics/levelledlist.hpp"
|
||||||
|
|
||||||
|
|
||||||
#include "../mwrender/sky.hpp"
|
#include "../mwrender/sky.hpp"
|
||||||
|
@ -1538,23 +1539,28 @@ namespace MWWorld
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Ptr World::copyObjectToCell(const Ptr &object, CellStore &cell, const ESM::Position &pos, bool adjustPos)
|
Ptr World::copyObjectToCell(const Ptr &object, CellStore &cell, ESM::Position pos, bool adjustPos)
|
||||||
{
|
{
|
||||||
/// \todo add searching correct cell for position specified
|
|
||||||
MWWorld::Ptr dropped =
|
|
||||||
MWWorld::Class::get(object).copyToCell(object, cell, pos);
|
|
||||||
|
|
||||||
if (object.getClass().isActor() || adjustPos)
|
if (object.getClass().isActor() || adjustPos)
|
||||||
{
|
{
|
||||||
Ogre::Vector3 min, max;
|
Ogre::Vector3 min, max;
|
||||||
if (mPhysics->getObjectAABB(object, min, max)) {
|
if (mPhysics->getObjectAABB(object, min, max)) {
|
||||||
float *pos = dropped.getRefData().getPosition().pos;
|
pos.pos[0] -= (min.x + max.x) / 2;
|
||||||
pos[0] -= (min.x + max.x) / 2;
|
pos.pos[1] -= (min.y + max.y) / 2;
|
||||||
pos[1] -= (min.y + max.y) / 2;
|
pos.pos[2] -= min.z;
|
||||||
pos[2] -= min.z;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cell.isExterior())
|
||||||
|
{
|
||||||
|
int cellX, cellY;
|
||||||
|
positionToIndex(pos.pos[0], pos.pos[1], cellX, cellY);
|
||||||
|
cell = *mCells.getExterior(cellX, cellY);
|
||||||
|
}
|
||||||
|
|
||||||
|
MWWorld::Ptr dropped =
|
||||||
|
MWWorld::Class::get(object).copyToCell(object, cell, pos);
|
||||||
|
|
||||||
if (mWorldScene->isCellActive(cell)) {
|
if (mWorldScene->isCellActive(cell)) {
|
||||||
if (dropped.getRefData().isEnabled()) {
|
if (dropped.getRefData().isEnabled()) {
|
||||||
mWorldScene->addObjectToScene(dropped);
|
mWorldScene->addObjectToScene(dropped);
|
||||||
|
@ -2571,4 +2577,37 @@ namespace MWWorld
|
||||||
MWBase::Environment::get().getWindowManager()->messageBox(message, buttons);
|
MWBase::Environment::get().getWindowManager()->messageBox(message, buttons);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void World::spawnRandomCreature(const std::string &creatureList)
|
||||||
|
{
|
||||||
|
const ESM::CreatureLevList* list = getStore().get<ESM::CreatureLevList>().find(creatureList);
|
||||||
|
|
||||||
|
int iNumberCreatures = getStore().get<ESM::GameSetting>().find("iNumberCreatures")->getInt();
|
||||||
|
int numCreatures = 1 + std::rand()/ (static_cast<double> (RAND_MAX) + 1) * iNumberCreatures; // [1, iNumberCreatures]
|
||||||
|
|
||||||
|
for (int i=0; i<numCreatures; ++i)
|
||||||
|
{
|
||||||
|
std::string selectedCreature = MWMechanics::getLevelledItem(list, true);
|
||||||
|
if (selectedCreature.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
ESM::Position ipos = mPlayer->getPlayer().getRefData().getPosition();
|
||||||
|
Ogre::Vector3 pos(ipos.pos);
|
||||||
|
Ogre::Quaternion rot(Ogre::Radian(-ipos.rot[2]), Ogre::Vector3::UNIT_Z);
|
||||||
|
const float distance = 50;
|
||||||
|
pos = pos + distance*rot.yAxis();
|
||||||
|
ipos.pos[0] = pos.x;
|
||||||
|
ipos.pos[1] = pos.y;
|
||||||
|
ipos.pos[2] = pos.z;
|
||||||
|
ipos.rot[0] = 0;
|
||||||
|
ipos.rot[1] = 0;
|
||||||
|
ipos.rot[2] = 0;
|
||||||
|
|
||||||
|
MWWorld::CellStore* cell = mPlayer->getPlayer().getCell();
|
||||||
|
MWWorld::ManualRef ref(getStore(), selectedCreature, 1);
|
||||||
|
ref.getPtr().getCellRef().mPos = ipos;
|
||||||
|
|
||||||
|
safePlaceObject(ref.getPtr(),*cell,ipos);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,7 +114,7 @@ namespace MWWorld
|
||||||
bool moveObjectImp (const Ptr& ptr, float x, float y, float z);
|
bool moveObjectImp (const Ptr& ptr, float x, float y, float z);
|
||||||
///< @return true if the active cell (cell player is in) changed
|
///< @return true if the active cell (cell player is in) changed
|
||||||
|
|
||||||
Ptr copyObjectToCell(const Ptr &ptr, CellStore &cell, const ESM::Position &pos, bool adjustPos=true);
|
Ptr copyObjectToCell(const Ptr &ptr, CellStore &cell, ESM::Position pos, bool adjustPos=true);
|
||||||
|
|
||||||
void updateWindowManager ();
|
void updateWindowManager ();
|
||||||
void performUpdateSceneQueries ();
|
void performUpdateSceneQueries ();
|
||||||
|
@ -546,6 +546,9 @@ namespace MWWorld
|
||||||
virtual void confiscateStolenItems(const MWWorld::Ptr& ptr);
|
virtual void confiscateStolenItems(const MWWorld::Ptr& ptr);
|
||||||
|
|
||||||
virtual void goToJail ();
|
virtual void goToJail ();
|
||||||
|
|
||||||
|
/// Spawn a random creature from a levelled list next to the player
|
||||||
|
virtual void spawnRandomCreature(const std::string& creatureList);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,20 +20,6 @@ class ESMWriter;
|
||||||
|
|
||||||
struct LeveledListBase
|
struct LeveledListBase
|
||||||
{
|
{
|
||||||
enum Flags
|
|
||||||
{
|
|
||||||
|
|
||||||
Each = 0x01, // Select a new item each time this
|
|
||||||
// list is instantiated, instead of
|
|
||||||
// giving several identical items
|
|
||||||
// (used when a container has more
|
|
||||||
// than one instance of one leveled
|
|
||||||
// list.)
|
|
||||||
AllLevels = 0x02 // Calculate from all levels <= player
|
|
||||||
// level, not just the closest below
|
|
||||||
// player.
|
|
||||||
};
|
|
||||||
|
|
||||||
int mFlags;
|
int mFlags;
|
||||||
unsigned char mChanceNone; // Chance that none are selected (0-100)
|
unsigned char mChanceNone; // Chance that none are selected (0-100)
|
||||||
std::string mId;
|
std::string mId;
|
||||||
|
@ -61,6 +47,14 @@ struct CreatureLevList: LeveledListBase
|
||||||
{
|
{
|
||||||
static unsigned int sRecordId;
|
static unsigned int sRecordId;
|
||||||
|
|
||||||
|
enum Flags
|
||||||
|
{
|
||||||
|
|
||||||
|
AllLevels = 0x01 // Calculate from all levels <= player
|
||||||
|
// level, not just the closest below
|
||||||
|
// player.
|
||||||
|
};
|
||||||
|
|
||||||
CreatureLevList()
|
CreatureLevList()
|
||||||
{
|
{
|
||||||
mRecName = "CNAM";
|
mRecName = "CNAM";
|
||||||
|
@ -71,6 +65,20 @@ struct ItemLevList: LeveledListBase
|
||||||
{
|
{
|
||||||
static unsigned int sRecordId;
|
static unsigned int sRecordId;
|
||||||
|
|
||||||
|
enum Flags
|
||||||
|
{
|
||||||
|
|
||||||
|
Each = 0x01, // Select a new item each time this
|
||||||
|
// list is instantiated, instead of
|
||||||
|
// giving several identical items
|
||||||
|
// (used when a container has more
|
||||||
|
// than one instance of one leveled
|
||||||
|
// list.)
|
||||||
|
AllLevels = 0x02 // Calculate from all levels <= player
|
||||||
|
// level, not just the closest below
|
||||||
|
// player.
|
||||||
|
};
|
||||||
|
|
||||||
ItemLevList()
|
ItemLevList()
|
||||||
{
|
{
|
||||||
mRecName = "INAM";
|
mRecName = "INAM";
|
||||||
|
|
Loading…
Reference in a new issue