1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-03-30 03:36:43 +00:00

Add OpenMW commits up to 7 Oct 2019

# Conflicts:
#	apps/openmw/mwmechanics/aiactivate.cpp
This commit is contained in:
David Cernat 2019-10-07 08:19:21 +03:00
commit 4a34666c59
36 changed files with 700 additions and 119 deletions

View file

@ -4,6 +4,7 @@
Bug #1515: Opening console masks dialogue, inventory menu
Bug #2395: Duplicated plugins in the launcher when multiple data directories provide the same plugin
Bug #2969: Scripted items can stack
Bug #2976: Data lines in global openmw.cfg take priority over user openmw.cfg
Bug #2987: Editor: some chance and AI data fields can overflow
Bug #3006: 'else if' operator breaks script compilation
Bug #3109: SetPos/Position handles actors differently
@ -26,6 +27,7 @@
Bug #4383: Bow model obscures crosshair when arrow is drawn
Bug #4384: Resist Normal Weapons only checks ammunition for ranged weapons
Bug #4411: Reloading a saved game while falling prevents damage in some cases
Bug #4456: AiActivate should not be cancelled after target activation
Bug #4540: Rain delay when exiting water
Bug #4600: Crash when no sound output is available or --no-sound is used.
Bug #4639: Black screen after completing first mages guild mission + training
@ -114,6 +116,7 @@
Bug #5050: Invalid spell effects are not handled gracefully
Bug #5055: Mark, Recall, Intervention magic effect abilities have no effect when added and removed in the same frame
Bug #5056: Calling Cast function on player doesn't equip the spell but casts it
Bug #5059: Modded animation with combined attack keys always does max damage and can double damage
Bug #5060: Magic effect visuals stop when death animation begins instead of when it ends
Bug #5063: Shape named "Tri Shadow" in creature mesh is visible if it isn't hidden
Bug #5067: Ranged attacks on unaware opponents ("critical hits") differ from the vanilla engine
@ -122,6 +125,7 @@
Bug #5075: Enchanting cast style can be changed if there's no object
Bug #5078: DisablePlayerLooking is broken
Bug #5082: Scrolling with controller in GUI mode is broken
Bug #5087: Some valid script names can't be used as string arguments
Bug #5089: Swimming/Underwater creatures only swim around ground level
Bug #5092: NPCs with enchanted weapons play sound when out of charges
Bug #5093: Hand to hand sound plays on knocked out enemies
@ -137,6 +141,7 @@
Bug #5124: Arrow remains attached to actor if pulling animation was cancelled
Bug #5126: Swimming creatures without RunForward animations are motionless during combat
Bug #5134: Doors rotation by "Lock" console command is inconsistent
Bug #5136: LegionUniform script: can not access local variables
Bug #5137: Textures with Clamp Mode set to Clamp instead of Wrap are too dark outside the boundaries
Bug #5149: Failing lock pick attempts isn't always a crime
Bug #5155: Lock/unlock behavior differs from vanilla
@ -145,6 +150,11 @@
Bug #5161: Creature companions can't be activated when they are knocked down
Bug #5164: Faction owned items handling is incorrect
Bug #5166: Scripts still should be executed after player's death
Bug #5167: Player can select and cast spells before magic menu is enabled
Bug #5168: Force1stPerson and Force3rdPerson commands are not really force view change
Bug #5169: Nested levelled items/creatures have significantly higher chance not to spawn
Bug #5175: Random script function returns an integer value
Bug #5177: Editor: Unexplored map tiles get corrupted after a file with terrain is saved
Feature #1774: Handle AvoidNode
Feature #2229: Improve pathfinding AI
Feature #3025: Analogue gamepad movement controls

View file

@ -102,6 +102,7 @@ Editor Bug Fixes:
- Cloned, added, or moved instances no longer disappear at load-time (#4748)
- "Clear" function in the content selector no longer tries to execute a "Remove" action on an empty file list (#4757)
- Engine no longer tries to swap buffers of windows which weren't exposed to Qt's window management system (#4911)
- Minimap doesn't get corrupted, when editing new omwgame (#5177)
Miscellaneous:
- Upgraded to FFMPEG3 for media decoding (#4686)

View file

@ -235,7 +235,7 @@ namespace MWBase
virtual bool isAggressive (const MWWorld::Ptr& ptr, const MWWorld::Ptr& target) = 0;
/// Resurrects the player if necessary
virtual void keepPlayerAlive() = 0;
virtual void resurrect(const MWWorld::Ptr& ptr) = 0;
virtual bool isCastingSpell (const MWWorld::Ptr& ptr) const = 0;
virtual bool isReadyToBlock (const MWWorld::Ptr& ptr) const = 0;

View file

@ -555,7 +555,7 @@ namespace MWBase
virtual osg::Matrixf getActorHeadTransform(const MWWorld::ConstPtr& actor) const = 0;
virtual void togglePOV() = 0;
virtual void togglePOV(bool force = false) = 0;
virtual bool isFirstPerson() const = 0;
virtual void togglePreviewMode(bool enable) = 0;
virtual bool toggleVanityMode(bool enable) = 0;

View file

@ -98,7 +98,7 @@ namespace MWGui
if (pickpocket.finish())
{
MWBase::Environment::get().getMechanicsManager()->commitCrime(
player, mActor, MWBase::MechanicsManager::OT_Pickpocket, 0, true);
player, mActor, MWBase::MechanicsManager::OT_Pickpocket, std::string(), 0, true);
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Container);
mPickpocketDetected = true;
}
@ -126,7 +126,7 @@ namespace MWGui
if (pickpocket.pick(item, count))
{
MWBase::Environment::get().getMechanicsManager()->commitCrime(
player, mActor, MWBase::MechanicsManager::OT_Pickpocket, 0, true);
player, mActor, MWBase::MechanicsManager::OT_Pickpocket, std::string(), 0, true);
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Container);
mPickpocketDetected = true;
return false;

View file

@ -484,19 +484,19 @@ namespace MWInput
quickLoad();
break;
case A_CycleSpellLeft:
if (checkAllowedToUseItems())
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
MWBase::Environment::get().getWindowManager()->cycleSpell(false);
break;
case A_CycleSpellRight:
if (checkAllowedToUseItems())
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
MWBase::Environment::get().getWindowManager()->cycleSpell(true);
break;
case A_CycleWeaponLeft:
if (checkAllowedToUseItems())
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
MWBase::Environment::get().getWindowManager()->cycleWeapon(false);
break;
case A_CycleWeaponRight:
if (checkAllowedToUseItems())
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
MWBase::Environment::get().getWindowManager()->cycleWeapon(true);
break;
case A_Sneak:
@ -1392,6 +1392,9 @@ namespace MWInput
if (!checkAllowedToUseItems())
return;
if (MWBase::Environment::get().getWorld()->getGlobalFloat ("chargenstate")!=-1)
return;
if (!MWBase::Environment::get().getWindowManager()->isGuiMode())
MWBase::Environment::get().getWindowManager()->activateQuickKey (index);
}

View file

@ -1867,6 +1867,20 @@ namespace MWMechanics
*/
}
void Actors::resurrect(const MWWorld::Ptr &ptr)
{
PtrActorMap::iterator iter = mActors.find(ptr);
if(iter != mActors.end())
{
if(iter->second->getCharacterController()->isDead())
{
// Actor has been resurrected. Notify the CharacterController and re-enable collision.
MWBase::Environment::get().getWorld()->enableActorCollision(iter->first, true);
iter->second->getCharacterController()->resurrect();
}
}
}
void Actors::killDeadActors()
{
for(PtrActorMap::iterator iter(mActors.begin()); iter != mActors.end(); ++iter)
@ -1875,17 +1889,7 @@ namespace MWMechanics
CreatureStats &stats = cls.getCreatureStats(iter->first);
if(!stats.isDead())
{
if(iter->second->getCharacterController()->isDead())
{
// Actor has been resurrected. Notify the CharacterController and re-enable collision.
MWBase::Environment::get().getWorld()->enableActorCollision(iter->first, true);
iter->second->getCharacterController()->resurrect();
}
if(!stats.isDead())
continue;
}
continue;
MWBase::Environment::get().getWorld()->removeActorPath(iter->first);
CharacterController::KillResult killResult = iter->second->getCharacterController()->kill();

View file

@ -94,6 +94,8 @@ namespace MWMechanics
///
/// \note Ignored, if \a ptr is not a registered actor.
void resurrect (const MWWorld::Ptr& ptr);
void castSpell(const MWWorld::Ptr& ptr, const std::string spellId, bool manualSpell=false);
void updateActor(const MWWorld::Ptr &old, const MWWorld::Ptr& ptr);

View file

@ -21,6 +21,7 @@
#include "creaturestats.hpp"
#include "movement.hpp"
#include "steering.hpp"
namespace MWMechanics
{
@ -67,12 +68,16 @@ namespace MWMechanics
if (target == MWWorld::Ptr() || !target.getRefData().getCount() || !target.getRefData().isEnabled())
return true;
//Set the target destination for the actor
const osg::Vec3f dest = target.getRefData().getPosition().asVec3();
// Turn to target and move to it directly, without pathfinding.
const osg::Vec3f targetDir = target.getRefData().getPosition().asVec3() - actor.getRefData().getPosition().asVec3();
if (pathTo(actor, dest, duration, MWBase::Environment::get().getWorld()->getMaxActivationDistance())) //Stop when you get in activation range
zTurn(actor, std::atan2(targetDir.x(), targetDir.y()), 0.f);
actor.getClass().getMovementSettings(actor).mPosition[1] = 1;
actor.getClass().getMovementSettings(actor).mPosition[0] = 0;
if (MWBase::Environment::get().getWorld()->getMaxActivationDistance() >= targetDir.length())
{
// activate when reached
// Note: we intentionally do not cancel package after activation here for backward compatibility with original engine.
/*
Start of tes3mp change (major)
@ -98,10 +103,7 @@ namespace MWMechanics
/*
End of tes3mp addition
*/
return true;
}
return false;
}

View file

@ -1,5 +1,7 @@
#include "aiavoiddoor.hpp"
#include <components/misc/rng.hpp>
#include "../mwbase/world.hpp"
#include "../mwbase/environment.hpp"
#include "../mwbase/mechanicsmanager.hpp"
@ -11,8 +13,10 @@
#include "actorutil.hpp"
#include "steering.hpp"
static const int MAX_DIRECTIONS = 4;
MWMechanics::AiAvoidDoor::AiAvoidDoor(const MWWorld::ConstPtr& doorPtr)
: AiPackage(), mDuration(1), mDoorPtr(doorPtr), mLastPos(ESM::Position()), mAdjAngle(0)
: AiPackage(), mDuration(1), mDoorPtr(doorPtr), mDirection(0)
{
}
@ -22,25 +26,18 @@ bool MWMechanics::AiAvoidDoor::execute (const MWWorld::Ptr& actor, CharacterCont
ESM::Position pos = actor.getRefData().getPosition();
if(mDuration == 1) //If it just started, get the actor position as the stuck detection thing
mLastPos = pos;
mLastPos = pos.asVec3();
mDuration -= duration; //Update timer
if(mDuration < 0) {
float x = pos.pos[0] - mLastPos.pos[0];
float y = pos.pos[1] - mLastPos.pos[1];
float z = pos.pos[2] - mLastPos.pos[2];
float distance = x * x + y * y + z * z;
if(distance < 10 * 10) { //Got stuck, didn't move
if(mAdjAngle == 0) //Try going in various directions
mAdjAngle = osg::PI / 2;
else if (mAdjAngle == osg::PI / 2)
mAdjAngle = -osg::PI / 2;
else
mAdjAngle = 0;
if (mDuration < 0)
{
if (isStuck(pos.asVec3()))
{
adjustDirection();
mDuration = 1; //reset timer
}
else //Not stuck
else
return true; // We have tried backing up for more than one second, we've probably cleared it
}
@ -54,7 +51,7 @@ bool MWMechanics::AiAvoidDoor::execute (const MWWorld::Ptr& actor, CharacterCont
actor.getClass().getCreatureStats(actor).setMovementFlag(CreatureStats::Flag_Run, true);
// Turn away from the door and move when turn completed
if (zTurn(actor, std::atan2(x,y) + mAdjAngle, osg::DegreesToRadians(5.f)))
if (zTurn(actor, std::atan2(x,y) + getAdjustedAngle(), osg::DegreesToRadians(5.f)))
actor.getClass().getMovementSettings(actor).mPosition[1] = 1;
else
actor.getClass().getMovementSettings(actor).mPosition[1] = 0;
@ -90,4 +87,17 @@ unsigned int MWMechanics::AiAvoidDoor::getPriority() const
return 2;
}
bool MWMechanics::AiAvoidDoor::isStuck(const osg::Vec3f& actorPos) const
{
return (actorPos - mLastPos).length2() < 10 * 10;
}
void MWMechanics::AiAvoidDoor::adjustDirection()
{
mDirection = Misc::Rng::rollDice(MAX_DIRECTIONS);
}
float MWMechanics::AiAvoidDoor::getAdjustedAngle() const
{
return 2 * osg::PI / MAX_DIRECTIONS * mDirection;
}

View file

@ -36,8 +36,14 @@ namespace MWMechanics
private:
float mDuration;
MWWorld::ConstPtr mDoorPtr;
ESM::Position mLastPos;
float mAdjAngle;
osg::Vec3f mLastPos;
int mDirection;
bool isStuck(const osg::Vec3f& actorPos) const;
void adjustDirection();
float getAdjustedAngle() const;
};
}
#endif

View file

@ -1718,7 +1718,9 @@ bool CharacterController::updateWeaponState(CharacterState& idle)
if(mUpperBodyState == UpperCharState_MinAttackToMaxAttack && !isKnockedDown())
{
float attackStrength = complete;
if (!mPtr.getClass().isNpc())
float minAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"min attack");
float maxAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"max attack");
if (minAttackTime == maxAttackTime)
{
// most creatures don't actually have an attack wind-up animation, so use a uniform random value
// (even some creatures that can use weapons don't have a wind-up animation either, e.g. Rieklings)
@ -1824,7 +1826,7 @@ bool CharacterController::updateWeaponState(CharacterState& idle)
{
// If actor is already stopped preparing attack, do not play the "min attack -> max attack" part.
// Happens if the player did not hold the attack button.
// Note: if the "min attack"->"max attack" is a stub, "play" it anyway. Attack strength will be 1.
// Note: if the "min attack"->"max attack" is a stub, "play" it anyway. Attack strength will be random.
float minAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"min attack");
float maxAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"max attack");
if (mAttackingOrSpell || minAttackTime == maxAttackTime)

View file

@ -209,9 +209,6 @@ namespace MWMechanics
mDynamic[index].setModifier(0);
mDynamic[index].setCurrentModifier(0);
mDynamic[index].setCurrent(0);
if (MWBase::Environment::get().getWorld()->getGodModeState())
MWBase::Environment::get().getMechanicsManager()->keepPlayerAlive();
}
}

View file

@ -19,16 +19,14 @@ namespace MWMechanics
{
/// @return ID of resulting item, or empty if none
inline std::string getLevelledItem (const ESM::LevelledListBase* levItem, bool creature, unsigned char failChance=0)
inline std::string getLevelledItem (const ESM::LevelledListBase* levItem, bool creature)
{
const std::vector<ESM::LevelledListBase::LevelItem>& items = levItem->mList;
const MWWorld::Ptr& player = getPlayer();
int playerLevel = player.getClass().getCreatureStats(player).getLevel();
failChance += levItem->mChanceNone;
if (Misc::Rng::roll0to99() < failChance)
if (Misc::Rng::roll0to99() < levItem->mChanceNone)
return std::string();
std::vector<std::string> candidates;
@ -76,9 +74,9 @@ namespace MWMechanics
else
{
if (ref.getPtr().getTypeName() == typeid(ESM::ItemLevList).name())
return getLevelledItem(ref.getPtr().get<ESM::ItemLevList>()->mBase, false, failChance);
return getLevelledItem(ref.getPtr().get<ESM::ItemLevList>()->mBase, false);
else
return getLevelledItem(ref.getPtr().get<ESM::CreatureLevList>()->mBase, true, failChance);
return getLevelledItem(ref.getPtr().get<ESM::CreatureLevList>()->mBase, true);
}
}

View file

@ -1913,12 +1913,14 @@ namespace MWMechanics
return (fight >= 100);
}
void MechanicsManager::keepPlayerAlive()
void MechanicsManager::resurrect(const MWWorld::Ptr &ptr)
{
MWWorld::Ptr player = getPlayer();
CreatureStats& stats = player.getClass().getCreatureStats(player);
CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
if (stats.isDead())
{
stats.resurrect();
mActors.resurrect(ptr);
}
}
bool MechanicsManager::isCastingSpell(const MWWorld::Ptr &ptr) const

View file

@ -207,7 +207,7 @@ namespace MWMechanics
virtual bool isAggressive (const MWWorld::Ptr& ptr, const MWWorld::Ptr& target) override;
virtual void keepPlayerAlive() override;
virtual void resurrect(const MWWorld::Ptr& ptr) override;
virtual bool isCastingSpell (const MWWorld::Ptr& ptr) const override;

View file

@ -1333,9 +1333,9 @@ namespace MWRender
return mCurrentCameraPos;
}
void RenderingManager::togglePOV()
void RenderingManager::togglePOV(bool force)
{
mCamera->toggleViewMode();
mCamera->toggleViewMode(force);
}
void RenderingManager::togglePreviewMode(bool enable)

View file

@ -204,7 +204,7 @@ namespace MWRender
float getCameraDistance() const;
Camera* getCamera();
const osg::Vec3f& getCameraPosition() const;
void togglePOV();
void togglePOV(bool force = false);
void togglePreviewMode(bool enable);
bool toggleVanityMode(bool enable);
void allowVanityMode(bool allow);

View file

@ -444,7 +444,7 @@ namespace MWScript
virtual void execute (Interpreter::Runtime& runtime)
{
if (!MWBase::Environment::get().getWorld()->isFirstPerson())
MWBase::Environment::get().getWorld()->togglePOV();
MWBase::Environment::get().getWorld()->togglePOV(true);
}
};
@ -453,7 +453,7 @@ namespace MWScript
virtual void execute (Interpreter::Runtime& runtime)
{
if (MWBase::Environment::get().getWorld()->isFirstPerson())
MWBase::Environment::get().getWorld()->togglePOV();
MWBase::Environment::get().getWorld()->togglePOV(true);
}
};

View file

@ -1319,7 +1319,7 @@ namespace MWScript
if (ptr == MWMechanics::getPlayer())
{
ptr.getClass().getCreatureStats(ptr).resurrect();
MWBase::Environment::get().getMechanicsManager()->resurrect(ptr);
if (MWBase::Environment::get().getStateManager()->getState() == MWBase::StateManager::State_Ended)
MWBase::Environment::get().getStateManager()->resumeGame();
}

View file

@ -569,50 +569,64 @@ void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::
int count, bool topLevel, const std::string& levItem)
{
if (count == 0) return; //Don't restock with nothing.
try {
try
{
ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), id, count);
if (ref.getPtr().getTypeName()==typeid (ESM::ItemLevList).name())
if (ref.getPtr().getClass().getScript(ref.getPtr()).empty())
{
const ESM::ItemLevList* levItemList = ref.getPtr().get<ESM::ItemLevList>()->mBase;
if (topLevel && std::abs(count) > 1 && levItemList->mFlags & ESM::ItemLevList::Each)
{
for (int i=0; i<std::abs(count); ++i)
addInitialItem(id, owner, count > 0 ? 1 : -1, true, levItemList->mId);
return;
}
else
{
std::string itemId = MWMechanics::getLevelledItem(ref.getPtr().get<ESM::ItemLevList>()->mBase, false);
if (itemId.empty())
return;
addInitialItem(itemId, owner, count, false, levItemList->mId);
}
addInitialItemImp(ref.getPtr(), owner, count, topLevel, levItem);
}
else
{
// A negative count indicates restocking items
// For a restocking levelled item, remember what we spawned so we can delete it later when the merchant restocks
if (!levItem.empty() && count < 0)
{
//If there is no item in map, insert it
std::map<std::pair<std::string, std::string>, int>::iterator itemInMap =
mLevelledItemMap.insert(std::make_pair(std::make_pair(id, levItem), 0)).first;
//Update spawned count
itemInMap->second += std::abs(count);
}
count = std::abs(count);
ref.getPtr().getCellRef().setOwner(owner);
addImp (ref.getPtr(), count);
// Adding just one item per time to make sure there isn't a stack of scripted items
for (int i = 0; i < abs(count); i++)
addInitialItemImp(ref.getPtr(), owner, count < 0 ? -1 : 1, topLevel, levItem);
}
}
catch (const std::exception& e)
{
Log(Debug::Warning) << "Warning: MWWorld::ContainerStore::addInitialItem: " << e.what();
}
}
void MWWorld::ContainerStore::addInitialItemImp(const MWWorld::Ptr& ptr, const std::string& owner,
int count, bool topLevel, const std::string& levItem)
{
if (ptr.getTypeName()==typeid (ESM::ItemLevList).name())
{
const ESM::ItemLevList* levItemList = ptr.get<ESM::ItemLevList>()->mBase;
if (topLevel && std::abs(count) > 1 && levItemList->mFlags & ESM::ItemLevList::Each)
{
for (int i=0; i<std::abs(count); ++i)
addInitialItem(ptr.getCellRef().getRefId(), owner, count > 0 ? 1 : -1, true, levItemList->mId);
return;
}
else
{
std::string itemId = MWMechanics::getLevelledItem(ptr.get<ESM::ItemLevList>()->mBase, false);
if (itemId.empty())
return;
addInitialItem(itemId, owner, count, false, levItemList->mId);
}
}
else
{
// A negative count indicates restocking items
// For a restocking levelled item, remember what we spawned so we can delete it later when the merchant restocks
if (!levItem.empty() && count < 0)
{
//If there is no item in map, insert it
std::map<std::pair<std::string, std::string>, int>::iterator itemInMap =
mLevelledItemMap.insert(std::make_pair(std::make_pair(ptr.getCellRef().getRefId(), levItem), 0)).first;
//Update spawned count
itemInMap->second += std::abs(count);
}
count = std::abs(count);
ptr.getCellRef().setOwner(owner);
addImp (ptr, count);
}
}
void MWWorld::ContainerStore::restock (const ESM::InventoryList& items, const MWWorld::Ptr& ptr, const std::string& owner)

View file

@ -94,6 +94,7 @@ namespace MWWorld
mutable bool mWeightUpToDate;
ContainerStoreIterator addImp (const Ptr& ptr, int count);
void addInitialItem (const std::string& id, const std::string& owner, int count, bool topLevel=true, const std::string& levItem = "");
void addInitialItemImp (const MWWorld::Ptr& ptr, const std::string& owner, int count, bool topLevel=true, const std::string& levItem = "");
template<typename T>
ContainerStoreIterator getState (CellRefList<T>& collection,

View file

@ -1127,6 +1127,18 @@ namespace MWWorld
return RecordId(dialogue.mId, isDeleted);
}
template<>
bool Store<ESM::Dialogue>::eraseStatic(const std::string &id)
{
auto it = mStatic.find(Misc::StringUtils::lowerCase(id));
if (it != mStatic.end() && Misc::StringUtils::ciEqual(it->second.mId, id)) {
mStatic.erase(it);
}
return true;
}
}
template class MWWorld::Store<ESM::Activator>;

View file

@ -1879,7 +1879,6 @@ namespace MWWorld
}
// we need to undo the rotation
rotateObject(door, objPos.rot[0], objPos.rot[1], oldRot);
reached = false;
}
}
@ -1901,6 +1900,8 @@ namespace MWWorld
if (!closeSound.empty() && MWBase::Environment::get().getSoundManager()->getSoundPlaying(door, closeSound))
MWBase::Environment::get().getSoundManager()->stopSound3D(door, closeSound);
}
rotateObject(door, objPos.rot[0], objPos.rot[1], oldRot);
}
// the rotation order we want to use
@ -2687,9 +2688,9 @@ namespace MWWorld
return mPhysics->isOnGround(ptr);
}
void World::togglePOV()
void World::togglePOV(bool force)
{
mRendering->togglePOV();
mRendering->togglePOV(force);
}
bool World::isFirstPerson() const

View file

@ -656,7 +656,7 @@ namespace MWWorld
osg::Matrixf getActorHeadTransform(const MWWorld::ConstPtr& actor) const override;
void togglePOV() override;
void togglePOV(bool force = false) override;
bool isFirstPerson() const override;

View file

@ -489,7 +489,7 @@ namespace Compiler
parseArguments ("l", scanner);
Generator::random (mCode);
mOperands.push_back ('l');
mOperands.push_back ('f');
mNextOperand = false;
return true;

View file

@ -56,6 +56,23 @@ namespace Compiler
}
}
if (keyword==Scanner::K_end || keyword==Scanner::K_begin ||
keyword==Scanner::K_short || keyword==Scanner::K_long ||
keyword==Scanner::K_float || keyword==Scanner::K_if ||
keyword==Scanner::K_endif || keyword==Scanner::K_else ||
keyword==Scanner::K_elseif || keyword==Scanner::K_while ||
keyword==Scanner::K_endwhile || keyword==Scanner::K_return ||
keyword==Scanner::K_messagebox || keyword==Scanner::K_set ||
keyword==Scanner::K_to || keyword==Scanner::K_startscript ||
keyword==Scanner::K_stopscript || keyword==Scanner::K_enable ||
keyword==Scanner::K_disable || keyword==Scanner::K_getdisabled ||
keyword==Scanner::K_getdistance || keyword==Scanner::K_scriptrunning ||
keyword==Scanner::K_getsquareroot || keyword==Scanner::K_menumode ||
keyword==Scanner::K_random || keyword==Scanner::K_getsecondspassed)
{
return parseName (loc.mLiteral, loc, scanner);
}
return Parser::parseKeyword (keyword, loc, scanner);
}

View file

@ -323,7 +323,9 @@ namespace ESM
: mFlags (land.mFlags), mX (land.mX), mY (land.mY), mPlugin (land.mPlugin),
mContext (land.mContext), mDataTypes (land.mDataTypes),
mLandData (land.mLandData ? new LandData (*land.mLandData) : 0)
{}
{
std::copy(land.mWnam, land.mWnam + LAND_GLOBAL_MAP_LOD_SIZE, mWnam);
}
Land& Land::operator= (Land land)
{
@ -340,6 +342,7 @@ namespace ESM
std::swap (mContext, land.mContext);
std::swap (mDataTypes, land.mDataTypes);
std::swap (mLandData, land.mLandData);
std::swap (mWnam, land.mWnam);
}
const Land::LandData *Land::getLandData (int flags) const

View file

@ -39,10 +39,7 @@ namespace Fallback
std::string key(temp.substr(0, sep));
std::string value(temp.substr(sep + 1));
if (map->mMap.find(key) == map->mMap.end())
{
map->mMap.insert(std::make_pair(key, value));
}
map->mMap[key] = value;
}
}
}

View file

@ -51,9 +51,6 @@ void ConfigurationManager::readConfiguration(boost::program_options::variables_m
bool silent = mSilent;
mSilent = quiet;
loadConfig(mFixedPath.getUserConfigPath(), variables, description);
boost::program_options::notify(variables);
// read either local or global config depending on type of installation
bool loaded = loadConfig(mFixedPath.getLocalPath(), variables, description);
boost::program_options::notify(variables);
@ -63,6 +60,10 @@ void ConfigurationManager::readConfiguration(boost::program_options::variables_m
boost::program_options::notify(variables);
}
// User config has the highest priority.
loadConfig(mFixedPath.getUserConfigPath(), variables, description);
boost::program_options::notify(variables);
mSilent = silent;
}

View file

@ -190,9 +190,7 @@ namespace Interpreter
throw std::runtime_error (
"random: argument out of range (Don't be so negative!)");
Type_Integer value = Misc::Rng::rollDice(limit); // [o, limit)
runtime[0].mInteger = value;
runtime[0].mFloat = static_cast<Type_Float>(Misc::Rng::rollDice(limit)); // [o, limit)
}
};

View file

@ -78,7 +78,7 @@ void fillTriangleMeshWithTransform(btTriangleMesh& mesh, const Nif::NiTriStripsD
continue;
unsigned short a = strip[0], b = strip[0], c = strip[1];
for (int i = 2; i < static_cast<int>(strip.size()); i++)
for (size_t i = 2; i < strip.size(); i++)
{
a = b;
b = c;
@ -86,9 +86,21 @@ void fillTriangleMeshWithTransform(btTriangleMesh& mesh, const Nif::NiTriStripsD
if (a != b && b != c && a != c)
{
if (i%2==0)
mesh.addTriangle(getbtVector(vertices[a]), getbtVector(vertices[b]), getbtVector(vertices[c]));
{
mesh.addTriangle(
getbtVector(vertices[a] * transform),
getbtVector(vertices[b] * transform),
getbtVector(vertices[c] * transform)
);
}
else
mesh.addTriangle(getbtVector(vertices[a]), getbtVector(vertices[c]), getbtVector(vertices[b]));
{
mesh.addTriangle(
getbtVector(vertices[a] * transform),
getbtVector(vertices[c] * transform),
getbtVector(vertices[b] * transform)
);
}
}
}
}

View file

@ -210,7 +210,6 @@ public:
private:
Terrain::Storage* mStorage;
float mLodFactor;
float mMinX, mMaxX, mMinY, mMaxY;
float mMinSize;

View file

@ -1,5 +1,5 @@
Shadow Settings
###############
Shadows Settings
################
Main settings
*************

View file

@ -13,6 +13,8 @@ script-blacklist=wereDreamScript2
script-blacklist=wereDreamScript3
# lighting
fallback=LightAttenuation_UseConstant,0
fallback=LightAttenuation_ConstantValue,0.0
fallback=LightAttenuation_UseLinear,1
fallback=LightAttenuation_LinearMethod,1
fallback=LightAttenuation_LinearValue,3.0

View file

@ -12,3 +12,490 @@ script-blacklist=doortestwarp
script-blacklist=WereChange2Script
script-blacklist=wereDreamScript2
script-blacklist=wereDreamScript3
# lighting
fallback=LightAttenuation_UseConstant,0
fallback=LightAttenuation_ConstantValue,0.0
fallback=LightAttenuation_UseLinear,1
fallback=LightAttenuation_LinearMethod,1
fallback=LightAttenuation_LinearValue,3.0
fallback=LightAttenuation_LinearRadiusMult,1.0
fallback=LightAttenuation_UseQuadratic,0
fallback=LightAttenuation_QuadraticMethod,2
fallback=LightAttenuation_QuadraticValue,16.0
fallback=LightAttenuation_QuadraticRadiusMult,1.0
fallback=LightAttenuation_OutQuadInLin,0
# inventory
fallback=Inventory_DirectionalDiffuseR,1.0
fallback=Inventory_DirectionalDiffuseG,1.0
fallback=Inventory_DirectionalDiffuseB,1.0
fallback=Inventory_DirectionalAmbientR,0.0
fallback=Inventory_DirectionalAmbientG,0.0
fallback=Inventory_DirectionalAmbientB,0.0
fallback=Inventory_DirectionalRotationX,110
fallback=Inventory_DirectionalRotationY,90
fallback=Inventory_UniformScaling,0
# water effects
fallback=Water_Map_Alpha,0.4
fallback=Water_World_Alpha,0.75
fallback=Water_SurfaceTextureSize,128
fallback=Water_SurfaceTileCount,10
fallback=Water_SurfaceFPS,12
fallback=Water_SurfaceTexture,water
fallback=Water_SurfaceFrameCount,32
fallback=Water_TileTextureDivisor,4.75
fallback=Water_RippleTexture,ripple
fallback=Water_RippleFrameCount,4
fallback=Water_RippleLifetime,3.0
fallback=Water_MaxNumberRipples,75
fallback=Water_RippleScale,0.15, 6.5
fallback=Water_RippleRotSpeed,0.5
fallback=Water_RippleAlphas,0.7, 0.1, 0.01
fallback=Water_NearWaterRadius,1000
fallback=Water_NearWaterPoints,8
fallback=Water_NearWaterUnderwaterFreq,0.3
fallback=Water_NearWaterUnderwaterVolume,0.9
fallback=Water_NearWaterIndoorTolerance,512.0
fallback=Water_NearWaterOutdoorTolerance,1024.0
fallback=Water_NearWaterIndoorID,Water Layer
fallback=Water_NearWaterOutdoorID,Water Layer
fallback=Water_UnderwaterSunriseFog,3
fallback=Water_UnderwaterDayFog,2.5
fallback=Water_UnderwaterSunsetFog,3
fallback=Water_UnderwaterNightFog,4
fallback=Water_UnderwaterIndoorFog,3
fallback=Water_UnderwaterColor,012,030,037
fallback=Water_UnderwaterColorWeight,0.85
# fonts
fallback=Fonts_Font_0,magic_cards_regular
fallback=Fonts_Font_1,century_gothic_font_regular
fallback=Fonts_Font_2,daedric_font
fallback=FontColor_color_normal,202,165,96
fallback=FontColor_color_normal_over,223,201,159
fallback=FontColor_color_normal_pressed,243,237,221
fallback=FontColor_color_active,96,112,202
fallback=FontColor_color_active_over,159,169,223
fallback=FontColor_color_active_pressed,223,226,244
fallback=FontColor_color_disabled,179,168,135
fallback=FontColor_color_disabled_over,223,201,159
fallback=FontColor_color_disabled_pressed,243,237,221
fallback=FontColor_color_link,112,126,207
fallback=FontColor_color_link_over,143,155,218
fallback=FontColor_color_link_pressed,175,184,228
fallback=FontColor_color_journal_link,37,49,112
fallback=FontColor_color_journal_link_over,58,77,175
fallback=FontColor_color_journal_link_pressed,112,126,207
fallback=FontColor_color_journal_topic,0,0,0
fallback=FontColor_color_journal_topic_over,58,77,175
fallback=FontColor_color_journal_topic_pressed,112,126,207
fallback=FontColor_color_answer,150,50,30
fallback=FontColor_color_answer_over,223,201,159
fallback=FontColor_color_answer_pressed,243,237,221
fallback=FontColor_color_header,223,201,159
fallback=FontColor_color_notify,223,201,159
fallback=FontColor_color_big_normal,202,165,96
fallback=FontColor_color_big_normal_over,223,201,159
fallback=FontColor_color_big_normal_pressed,243,237,221
fallback=FontColor_color_big_link,112,126,207
fallback=FontColor_color_big_link_over,143,155,218
fallback=FontColor_color_big_link_pressed,175,184,228
fallback=FontColor_color_big_answer,150,50,30
fallback=FontColor_color_big_answer_over,223,201,159
fallback=FontColor_color_big_answer_pressed,243,237,22
fallback=FontColor_color_big_header,223,201,159
fallback=FontColor_color_big_notify,223,201,159
fallback=FontColor_color_background,0,0,0
fallback=FontColor_color_focus,80,80,80
fallback=FontColor_color_health,200,60,30
fallback=FontColor_color_magic,53,69,159
fallback=FontColor_color_fatigue,0,150,60
fallback=FontColor_color_misc,0,205,205
fallback=FontColor_color_weapon_fill,200,60,30
fallback=FontColor_color_magic_fill,200,60,30
fallback=FontColor_color_positive,223,201,159
fallback=FontColor_color_negative,200,60,30
fallback=FontColor_color_count,223,201,159
# leveling
fallback=Level_Up_Level2,The last few days have opened your eyes: you realize now that there is more to the life than you thought. An uncertain future awaits you.
fallback=Level_Up_Level3,You finally come to understand that great doings start from hard work and determination.
fallback=Level_Up_Level4,After reminiscing upon all that time you lost in your youth, it's as clear as day to you now: this - this is the life, and all the experience you gain gives you the tools you need to succeed in it.
fallback=Level_Up_Level5,Things seem to be working out for you. As you become more capable, the world is opening up.
fallback=Level_Up_Level6,With every push you did to gain knowledge, and yet your thirst for it increased, you realize there is so much more to learn still.
fallback=Level_Up_Level7,You dig deep within yourself, trying to finally become the one who you thought you would be... but there's much to keep digging through.
fallback=Level_Up_Level8,Success doesn't come easily, but you make it appear that way to others.
fallback=Level_Up_Level9,Everything may slowly become a second nature to you, but it also can turn just a bit more dangerous.
fallback=Level_Up_Level10,Nothing in life is easy, or it wouldn't have been worth the blood, sweat and tears.
fallback=Level_Up_Level11,Working smarter, not harder is something even a barbarian could benefit from.
fallback=Level_Up_Level12,Perhaps some would call you delusional for keeping at it, but you know better. Your dilegence has already paid off, after all.
fallback=Level_Up_Level13,One night's sleep is all the difference between something being difficult and something being easy.
fallback=Level_Up_Level14,After waking up, you wonder: could today be the best day in your life? You never know.
fallback=Level_Up_Level15,Ouch! You lean back feeling your whole body for what seems the first time. You'll be more mindful in the future -- you can only live once.
fallback=Level_Up_Level16,Trusting your instincts has gotten you this far, but now it's clear to you that you need to be smarter to survive.
fallback=Level_Up_Level17,You're forging your spirit in the crucible that is experience. Be ever vigilant.
fallback=Level_Up_Level18,The frustrations of the day before vanish as you wake up. Today is a new day.
fallback=Level_Up_Level19,Today isn't yesterday, you feel that deep inside. You know that there is still more to this life.
fallback=Level_Up_Level20,Luck has never been a factor in your success -- that's obvious from the scars on your body and from the number of trails you've endured.
fallback=Level_Up_Default,Through sheer force of will, you push onwards and upwards. The toil of your persistence is paying off.
# character creation
fallback=Question_1_Question,Before you lies a creature you have never seen before. Its hind leg is caught in a hunter's trap, and you can tell that the leg is broken. What will you do?
fallback=Question_1_AnswerOne,Pull out you knife for a short and merciful kill.
fallback=Question_1_AnswerTwo,Reach into your herbal pouch to find something to ease its suffering before putting it to sleep.
fallback=Question_1_AnswerThree,Leave the leg alone, but take the time to observe and learn from this odd creature.
fallback=Question_1_Sound,Voice\CharGen\QA1.mp3
fallback=Question_2_Question,Your mother suggests you to help with work around your family household. Do you decide to...
fallback=Question_2_AnswerOne,Help your father with fence post replacement?
fallback=Question_2_AnswerTwo,Collect a few herbs in the forest for tonight's supper?
fallback=Question_2_AnswerThree,Help the fish to find their way into the kitchen?
fallback=Question_2_Sound,Voice\CharGen\QA2.mp3
fallback=Question_3_Question,Your brother teases you mercilessly in front of everyone with embarrassing details you would rather have forgotten.
fallback=Question_3_AnswerOne,Give him a black-eye and dare him to keep it up.
fallback=Question_3_AnswerTwo,Beat him to the punch and play it up -- if you can control the negative, then he can't embarrass you.
fallback=Question_3_AnswerThree,Wait until he sleeps, put his hand in a bowl of water and call everyone around the next day to see the results.
fallback=Question_3_Sound,Voice\CharGen\QA3.mp3
fallback=Question_4_Question,Rumor has it that the King's security console has a new tool at their disposal for sniffing out the truth, which could be used for reading minds.
fallback=Question_4_AnswerOne,You recoil at the thought of someone being able to read your thoughts. It's not that you think something that you'll ever act on it.
fallback=Question_4_AnswerTwo,For those who have done nothing, there is nothing to fear. This is just yet another utility for catching thieves, murderers and plots against the crown.
fallback=Question_4_AnswerThree,While you loath the idea of someone reading your mind, you accept that it does have its uses if tempered by law and common sense. You wouldn't believe the mind of a madman.
fallback=Question_4_Sound,Voice\CharGen\QA4.mp3
fallback=Question_5_Question,You are returning home from the market after acquiring supplies, and notice that one of the merchants had given you too much back in change.
fallback=Question_5_AnswerOne,How dreadful, what if it was you? You head back to the merchant.
fallback=Question_5_AnswerTwo,Happy days indeed. Put that extra money towards the needs of your family?
fallback=Question_5_AnswerThree,You win some and you lose some. In this case you have won and they have lost, and the oversight is the merchant's problem, not yours, right?
fallback=Question_5_Sound,Voice\CharGen\QA5.mp3
fallback=Question_6_Question,While at market, a noble yells out to the city watch about a theft. As you turn around a man bumps into you and drops a sack, startled he darts into the crowd.
fallback=Question_6_AnswerOne,You pick up the sack and head over to the noble to return his property?
fallback=Question_6_AnswerTwo,Just walk away, the last thing you need is someone thinking you had anything to do with it?
fallback=Question_6_AnswerThree,Finders, keepers... you whistle as you walk away with the bag hidden?
fallback=Question_6_Sound,Voice\CharGen\QA6.mp3
fallback=Question_7_Question,If it's one thing you hate, it's cleaning out the stalls. It has to be done before sunset before the critters return. On your way there an old friend greets you and offers to help if you promise to help them in the future.
fallback=Question_7_AnswerOne,You thank him for the offer but would rather get it over with and not make promises you can't keep?
fallback=Question_7_AnswerTwo,You reason that two pairs of hands are better than one regardless of the task?
fallback=Question_7_AnswerThree,You say that it sounds great and anything is better than cleaning the stalls?
fallback=Question_7_Sound,Voice\CharGen\QA7.mp3
fallback=Question_8_Question,You just climbed down the ladder after working on the roof. Your mother thanks you for the hard work but just at the moment you notice that a hammer is about to fall down on her head.
fallback=Question_8_AnswerOne,You lunge at your mother, pushing her out the way while the hammer falls on top of you?
fallback=Question_8_AnswerTwo,Try to use the ladder to intercept the hammer before it lands on her?
fallback=Question_8_AnswerThree,Warn her to take a step back?
fallback=Question_8_Sound,Voice\CharGen\QA8.mp3
fallback=Question_9_Question,It's the end of the week, and you have just got your wages for your hard work. You decide to take the quick way back home, darting into a alley only to be confronted by ruffians who demand that you empty your pockets.
fallback=Question_9_AnswerOne,You tell them to go pack sand, planting your feet and raising your fists?
fallback=Question_9_AnswerTwo,Acting dejected, you turn your wages over. You know that you can count on your friends to help you track these brigands down and recover what's yours?
fallback=Question_9_AnswerThree,Tossing the sack into the air, you charge the leader who's attention is squarely focused on the coins in flight?
fallback=Question_9_Sound,Voice\CharGen\QA9.mp3
fallback=Question_10_Question,Upon coming to town, you see a clown running at you with an angry mob following after him.
fallback=Question_10_AnswerOne,Stand your ground, you hate clowns?
fallback=Question_10_AnswerTwo,Move out of the way, letting fate decide the clown's fate?
fallback=Question_10_AnswerThree,Come to the clown's aid, clowns are people too?
fallback=Question_10_Sound,Voice\CharGen\QA10.mp3
# blood splatters
fallback=Blood_Model_0,BloodSplat.nif
fallback=Blood_Model_1,BloodSplat2.nif
fallback=Blood_Model_2,BloodSplat3.nif
fallback=Blood_Texture_0,Tx_Blood.dds
fallback=Blood_Texture_1,Tx_Blood_White.dds
fallback=Blood_Texture_2,Tx_Blood_Gold.dds
fallback=Blood_Texture_Name_0,Default (Red)
fallback=Blood_Texture_Name_1,Skeleton (White)
fallback=Blood_Texture_Name_2,Metal Sparks (Gold)
# movies
fallback=Movies_Project_Logo,openmw_project_logo.webm
fallback=Movies_Game_Logo,openmw_example_suite_logo.webm
fallback=Movies_New_Game,new_game.webm
fallback=Movies_Loading,loading.webm
fallback=Movies_Options_Menu,options_menu.webm
# weather
fallback=Weather_Thunderstorm_Thunder_Sound_ID_0,Thunder0
fallback=Weather_Thunderstorm_Thunder_Sound_ID_1,Thunder1
fallback=Weather_Thunderstorm_Thunder_Sound_ID_2,Thunder2
fallback=Weather_Thunderstorm_Thunder_Sound_ID_3,Thunder3
fallback=Weather_Sunrise_Time,6
fallback=Weather_Sunset_Time,18
fallback=Weather_Sunrise_Duration,2
fallback=Weather_Sunset_Duration,2
fallback=Weather_Hours_Between_Weather_Changes,20
fallback=Weather_Thunderstorm_Thunder_Frequency,.4
fallback=Weather_Thunderstorm_Thunder_Threshold,0.6
fallback=Weather_EnvReduceColor,255,255,255,255
fallback=Weather_LerpCloseColor,037,046,048,255
fallback=Weather_BumpFadeColor,230,239,255,255
fallback=Weather_AlphaReduce,0.35
fallback=Weather_Minimum_Time_Between_Environmental_Sounds,1.0
fallback=Weather_Maximum_Time_Between_Environmental_Sounds,5.0
fallback=Weather_Sun_Glare_Fader_Max,0.5
fallback=Weather_Sun_Glare_Fader_Angle_Max,30.0
fallback=Weather_Sun_Glare_Fader_Color,222,095,039
fallback=Weather_Timescale_Clouds,0
fallback=Weather_Precip_Gravity,575
fallback=Weather_Rain_Ripples,1
fallback=Weather_Rain_Ripple_Radius,1024
fallback=Weather_Rain_Ripples_Per_Drop,1
fallback=Weather_Rain_Ripple_Scale,0.3
fallback=Weather_Rain_Ripple_Speed,1.0
fallback=Weather_Fog_Depth_Change_Speed,3
fallback=Weather_Sky_Pre-Sunrise_Time,.5
fallback=Weather_Sky_Post-Sunrise_Time,1
fallback=Weather_Sky_Pre-Sunset_Time,1.5
fallback=Weather_Sky_Post-Sunset_Time,.5
fallback=Weather_Ambient_Pre-Sunrise_Time,.5
fallback=Weather_Ambient_Post-Sunrise_Time,2
fallback=Weather_Ambient_Pre-Sunset_Time,1
fallback=Weather_Ambient_Post-Sunset_Time,1.25
fallback=Weather_Fog_Pre-Sunrise_Time,.5
fallback=Weather_Fog_Post-Sunrise_Time,1
fallback=Weather_Fog_Pre-Sunset_Time,2
fallback=Weather_Fog_Post-Sunset_Time,1
fallback=Weather_Sun_Pre-Sunrise_Time,0
fallback=Weather_Sun_Post-Sunrise_Time,0
fallback=Weather_Sun_Pre-Sunset_Time,1
fallback=Weather_Sun_Post-Sunset_Time,1.25
fallback=Weather_Stars_Post-Sunset_Start,1
fallback=Weather_Stars_Pre-Sunrise_Finish,2
fallback=Weather_Stars_Fading_Duration,2
fallback=Weather_Snow_Ripples,0
fallback=Weather_Snow_Ripple_Radius,1024
fallback=Weather_Snow_Ripples_Per_Flake,1
fallback=Weather_Snow_Ripple_Scale,0.3
fallback=Weather_Snow_Ripple_Speed,1.0
fallback=Weather_Snow_Gravity_Scale,0.1
fallback=Weather_Snow_High_Kill,700
fallback=Weather_Snow_Low_Kill,150
fallback=Weather_Clear_Cloud_Texture,Tx_Sky_Clear.dds
fallback=Weather_Clear_Clouds_Maximum_Percent,1.0
fallback=Weather_Clear_Transition_Delta,.015
fallback=Weather_Clear_Sky_Sunrise_Color,117,141,164
fallback=Weather_Clear_Sky_Day_Color,095,135,203
fallback=Weather_Clear_Sky_Sunset_Color,056,089,129
fallback=Weather_Clear_Sky_Night_Color,009,010,011
fallback=Weather_Clear_Fog_Sunrise_Color,255,189,157
fallback=Weather_Clear_Fog_Day_Color,206,227,255
fallback=Weather_Clear_Fog_Sunset_Color,255,189,157
fallback=Weather_Clear_Fog_Night_Color,009,010,011
fallback=Weather_Clear_Ambient_Sunrise_Color,047,066,096
fallback=Weather_Clear_Ambient_Day_Color,137,140,160
fallback=Weather_Clear_Ambient_Sunset_Color,068,075,096
fallback=Weather_Clear_Ambient_Night_Color,032,035,042
fallback=Weather_Clear_Sun_Sunrise_Color,242,159,119
fallback=Weather_Clear_Sun_Day_Color,255,252,238
fallback=Weather_Clear_Sun_Sunset_Color,255,114,079
fallback=Weather_Clear_Sun_Night_Color,059,097,176
fallback=Weather_Clear_Sun_Disc_Sunset_Color,255,189,157
fallback=Weather_Clear_Land_Fog_Day_Depth,.69
fallback=Weather_Clear_Land_Fog_Night_Depth,.69
fallback=Weather_Clear_Wind_Speed,.1
fallback=Weather_Clear_Cloud_Speed,1.25
fallback=Weather_Clear_Glare_View,1
fallback=Weather_Clear_Ambient_Loop_Sound_ID,None
fallback=Weather_Cloudy_Cloud_Texture,Tx_Sky_Cloudy.dds
fallback=Weather_Cloudy_Clouds_Maximum_Percent,1.0
fallback=Weather_Cloudy_Transition_Delta,.015
fallback=Weather_Cloudy_Sky_Sunrise_Color,126,158,173
fallback=Weather_Cloudy_Sky_Day_Color,117,160,215
fallback=Weather_Cloudy_Sky_Sunset_Color,111,114,159
fallback=Weather_Cloudy_Sky_Night_Color,009,010,011
fallback=Weather_Cloudy_Fog_Sunrise_Color,255,207,149
fallback=Weather_Cloudy_Fog_Day_Color,245,235,224
fallback=Weather_Cloudy_Fog_Sunset_Color,255,155,106
fallback=Weather_Cloudy_Fog_Night_Color,009,010,011
fallback=Weather_Cloudy_Ambient_Sunrise_Color,066,074,087
fallback=Weather_Cloudy_Ambient_Day_Color,137,145,160
fallback=Weather_Cloudy_Ambient_Sunset_Color,071,080,092
fallback=Weather_Cloudy_Ambient_Night_Color,032,039,054
fallback=Weather_Cloudy_Sun_Sunrise_Color,241,177,099
fallback=Weather_Cloudy_Sun_Day_Color,255,236,221
fallback=Weather_Cloudy_Sun_Sunset_Color,255,089,000
fallback=Weather_Cloudy_Sun_Night_Color,077,091,124
fallback=Weather_Cloudy_Sun_Disc_Sunset_Color,255,202,179
fallback=Weather_Cloudy_Land_Fog_Day_Depth,.72
fallback=Weather_Cloudy_Land_Fog_Night_Depth,.72
fallback=Weather_Cloudy_Wind_Speed,.2
fallback=Weather_Cloudy_Cloud_Speed,2
fallback=Weather_Cloudy_Glare_View,1
fallback=Weather_Cloudy_Ambient_Loop_Sound_ID,None
fallback=Weather_Foggy_Cloud_Texture,Tx_Sky_Foggy.dds
fallback=Weather_Foggy_Clouds_Maximum_Percent,1.0
fallback=Weather_Foggy_Transition_Delta,.015
fallback=Weather_Foggy_Sky_Sunrise_Color,197,190,180
fallback=Weather_Foggy_Sky_Day_Color,184,211,228
fallback=Weather_Foggy_Sky_Sunset_Color,142,159,176
fallback=Weather_Foggy_Sky_Night_Color,018,023,028
fallback=Weather_Foggy_Fog_Sunrise_Color,173,164,148
fallback=Weather_Foggy_Fog_Day_Color,150,187,209
fallback=Weather_Foggy_Fog_Sunset_Color,113,135,157
fallback=Weather_Foggy_Fog_Night_Color,019,024,029
fallback=Weather_Foggy_Ambient_Sunrise_Color,048,043,037
fallback=Weather_Foggy_Ambient_Day_Color,092,109,120
fallback=Weather_Foggy_Ambient_Sunset_Color,029,053,076
fallback=Weather_Foggy_Ambient_Night_Color,028,033,039
fallback=Weather_Foggy_Sun_Sunrise_Color,177,162,137
fallback=Weather_Foggy_Sun_Day_Color,111,131,151
fallback=Weather_Foggy_Sun_Sunset_Color,125,157,189
fallback=Weather_Foggy_Sun_Night_Color,081,100,119
fallback=Weather_Foggy_Sun_Disc_Sunset_Color,223,223,223
fallback=Weather_Foggy_Land_Fog_Day_Depth,1.0
fallback=Weather_Foggy_Land_Fog_Night_Depth,1.9
fallback=Weather_Foggy_Wind_Speed,0
fallback=Weather_Foggy_Cloud_Speed,1.25
fallback=Weather_Foggy_Glare_View,0.25
fallback=Weather_Foggy_Ambient_Loop_Sound_ID,None
fallback=Weather_Thunderstorm_Cloud_Texture,Tx_Sky_Thunder.dds
fallback=Weather_Thunderstorm_Clouds_Maximum_Percent,0.66
fallback=Weather_Thunderstorm_Transition_Delta,.030
fallback=Weather_Thunderstorm_Sky_Sunrise_Color,035,036,039
fallback=Weather_Thunderstorm_Sky_Day_Color,097,104,115
fallback=Weather_Thunderstorm_Sky_Sunset_Color,035,036,039
fallback=Weather_Thunderstorm_Sky_Night_Color,019,020,022
fallback=Weather_Thunderstorm_Fog_Sunrise_Color,070,074,085
fallback=Weather_Thunderstorm_Fog_Day_Color,097,104,115
fallback=Weather_Thunderstorm_Fog_Sunset_Color,070,074,085
fallback=Weather_Thunderstorm_Fog_Night_Color,019,020,022
fallback=Weather_Thunderstorm_Ambient_Sunrise_Color,054,054,054
fallback=Weather_Thunderstorm_Ambient_Day_Color,090,090,090
fallback=Weather_Thunderstorm_Ambient_Sunset_Color,054,054,054
fallback=Weather_Thunderstorm_Ambient_Night_Color,049,051,054
fallback=Weather_Thunderstorm_Sun_Sunrise_Color,091,099,122
fallback=Weather_Thunderstorm_Sun_Day_Color,138,144,155
fallback=Weather_Thunderstorm_Sun_Sunset_Color,096,101,117
fallback=Weather_Thunderstorm_Sun_Night_Color,055,076,110
fallback=Weather_Thunderstorm_Sun_Disc_Sunset_Color,128,128,128
fallback=Weather_Thunderstorm_Land_Fog_Day_Depth,1
fallback=Weather_Thunderstorm_Land_Fog_Night_Depth,1.15
fallback=Weather_Thunderstorm_Wind_Speed,.5
fallback=Weather_Thunderstorm_Cloud_Speed,3
fallback=Weather_Thunderstorm_Glare_View,0
fallback=Weather_Thunderstorm_Rain_Loop_Sound_ID,rain heavy
fallback=Weather_Thunderstorm_Using_Precip,1
fallback=Weather_Thunderstorm_Rain_Diameter,600
fallback=Weather_Thunderstorm_Rain_Height_Min,200
fallback=Weather_Thunderstorm_Rain_Height_Max,700
fallback=Weather_Thunderstorm_Rain_Threshold,0.6
fallback=Weather_Thunderstorm_Max_Raindrops,650
fallback=Weather_Thunderstorm_Rain_Entrance_Speed,5
fallback=Weather_Thunderstorm_Ambient_Loop_Sound_ID,None
fallback=Weather_Thunderstorm_Flash_Decrement,4
fallback=Weather_Rain_Cloud_Texture,Tx_Sky_Rainy.dds
fallback=Weather_Rain_Clouds_Maximum_Percent,0.66
fallback=Weather_Rain_Transition_Delta,.015
fallback=Weather_Rain_Sky_Sunrise_Color,071,074,075
fallback=Weather_Rain_Sky_Day_Color,116,120,122
fallback=Weather_Rain_Sky_Sunset_Color,073,073,073
fallback=Weather_Rain_Sky_Night_Color,024,025,026
fallback=Weather_Rain_Fog_Sunrise_Color,071,074,075
fallback=Weather_Rain_Fog_Day_Color,116,120,122
fallback=Weather_Rain_Fog_Sunset_Color,073,073,073
fallback=Weather_Rain_Fog_Night_Color,024,025,026
fallback=Weather_Rain_Ambient_Sunrise_Color,097,090,088
fallback=Weather_Rain_Ambient_Day_Color,105,110,113
fallback=Weather_Rain_Ambient_Sunset_Color,088,097,097
fallback=Weather_Rain_Ambient_Night_Color,050,055,067
fallback=Weather_Rain_Sun_Sunrise_Color,131,122,120
fallback=Weather_Rain_Sun_Day_Color,149,157,170
fallback=Weather_Rain_Sun_Sunset_Color,120,126,131
fallback=Weather_Rain_Sun_Night_Color,050,062,101
fallback=Weather_Rain_Sun_Disc_Sunset_Color,128,128,128
fallback=Weather_Rain_Land_Fog_Day_Depth,.8
fallback=Weather_Rain_Land_Fog_Night_Depth,.8
fallback=Weather_Rain_Wind_Speed,.3
fallback=Weather_Rain_Cloud_Speed,2
fallback=Weather_Rain_Glare_View,0
fallback=Weather_Rain_Rain_Loop_Sound_ID,Rain
fallback=Weather_Rain_Using_Precip,1
fallback=Weather_Rain_Rain_Diameter,600
fallback=Weather_Rain_Rain_Height_Min,200
fallback=Weather_Rain_Rain_Height_Max,700
fallback=Weather_Rain_Rain_Threshold,0.6
fallback=Weather_Rain_Rain_Entrance_Speed,7
fallback=Weather_Rain_Ambient_Loop_Sound_ID,None
fallback=Weather_Rain_Max_Raindrops,450
fallback=Weather_Overcast_Cloud_Texture,Tx_Sky_Overcast.dds
fallback=Weather_Overcast_Clouds_Maximum_Percent,1.0
fallback=Weather_Overcast_Transition_Delta,.015
fallback=Weather_Overcast_Sky_Sunrise_Color,091,099,106
fallback=Weather_Overcast_Sky_Day_Color,143,146,149
fallback=Weather_Overcast_Sky_Sunset_Color,108,115,121
fallback=Weather_Overcast_Sky_Night_Color,019,022,025
fallback=Weather_Overcast_Fog_Sunrise_Color,091,099,106
fallback=Weather_Overcast_Fog_Day_Color,143,146,149
fallback=Weather_Overcast_Fog_Sunset_Color,108,115,121
fallback=Weather_Overcast_Fog_Night_Color,019,022,025
fallback=Weather_Overcast_Ambient_Sunrise_Color,084,088,092
fallback=Weather_Overcast_Ambient_Day_Color,093,096,105
fallback=Weather_Overcast_Ambient_Sunset_Color,083,077,075
fallback=Weather_Overcast_Ambient_Night_Color,057,060,066
fallback=Weather_Overcast_Sun_Sunrise_Color,087,125,163
fallback=Weather_Overcast_Sun_Day_Color,163,169,183
fallback=Weather_Overcast_Sun_Sunset_Color,085,103,157
fallback=Weather_Overcast_Sun_Night_Color,032,054,100
fallback=Weather_Overcast_Sun_Disc_Sunset_Color,128,128,128
fallback=Weather_Overcast_Land_Fog_Day_Depth,.70
fallback=Weather_Overcast_Land_Fog_Night_Depth,.70
fallback=Weather_Overcast_Wind_Speed,.2
fallback=Weather_Overcast_Cloud_Speed,1.5
fallback=Weather_Overcast_Glare_View,0
fallback=Weather_Overcast_Ambient_Loop_Sound_ID,None
fallback=Weather_Snow_Cloud_Texture,Tx_Sky_Snow.dds
fallback=Weather_Snow_Clouds_Maximum_Percent,1.0
fallback=Weather_Snow_Transition_Delta,.015
fallback=Weather_Snow_Sky_Sunrise_Color,106,091,091
fallback=Weather_Snow_Sky_Day_Color,153,158,166
fallback=Weather_Snow_Sky_Sunset_Color,096,115,134
fallback=Weather_Snow_Sky_Night_Color,031,035,039
fallback=Weather_Snow_Fog_Sunrise_Color,106,091,091
fallback=Weather_Snow_Fog_Day_Color,153,158,166
fallback=Weather_Snow_Fog_Sunset_Color,096,115,134
fallback=Weather_Snow_Fog_Night_Color,031,035,039
fallback=Weather_Snow_Ambient_Sunrise_Color,092,084,084
fallback=Weather_Snow_Ambient_Day_Color,093,096,105
fallback=Weather_Snow_Ambient_Sunset_Color,070,079,087
fallback=Weather_Snow_Ambient_Night_Color,049,058,068
fallback=Weather_Snow_Sun_Sunrise_Color,141,109,109
fallback=Weather_Snow_Sun_Day_Color,163,169,183
fallback=Weather_Snow_Sun_Sunset_Color,101,121,141
fallback=Weather_Snow_Sun_Night_Color,055,066,077
fallback=Weather_Snow_Sun_Disc_Sunset_Color,128,128,128
fallback=Weather_Snow_Land_Fog_Day_Depth,1.0
fallback=Weather_Snow_Land_Fog_Night_Depth,1.2
fallback=Weather_Snow_Wind_Speed,0
fallback=Weather_Snow_Cloud_Speed,1.5
fallback=Weather_Snow_Glare_View,0
fallback=Weather_Snow_Snow_Diameter,800
fallback=Weather_Snow_Snow_Height_Min,400
fallback=Weather_Snow_Snow_Height_Max,700
fallback=Weather_Snow_Snow_Entrance_Speed,6
fallback=Weather_Snow_Max_Snowflakes,750
fallback=Weather_Snow_Ambient_Loop_Sound_ID,None
fallback=Weather_Snow_Snow_Threshold,0.5
fallback=Weather_Blizzard_Cloud_Texture,Tx_Sky_Blizzard.dds
fallback=Weather_Blizzard_Clouds_Maximum_Percent,1.0
fallback=Weather_Blizzard_Transition_Delta,.030
fallback=Weather_Blizzard_Sky_Sunrise_Color,091,099,106
fallback=Weather_Blizzard_Sky_Day_Color,121,133,145
fallback=Weather_Blizzard_Sky_Sunset_Color,108,115,121
fallback=Weather_Blizzard_Sky_Night_Color,027,029,031
fallback=Weather_Blizzard_Fog_Sunrise_Color,091,099,106
fallback=Weather_Blizzard_Fog_Day_Color,121,133,145
fallback=Weather_Blizzard_Fog_Sunset_Color,108,115,121
fallback=Weather_Blizzard_Fog_Night_Color,021,024,028
fallback=Weather_Blizzard_Ambient_Sunrise_Color,084,088,092
fallback=Weather_Blizzard_Ambient_Day_Color,093,096,105
fallback=Weather_Blizzard_Ambient_Sunset_Color,083,077,075
fallback=Weather_Blizzard_Ambient_Night_Color,053,062,070
fallback=Weather_Blizzard_Sun_Sunrise_Color,114,128,146
fallback=Weather_Blizzard_Sun_Day_Color,163,169,183
fallback=Weather_Blizzard_Sun_Sunset_Color,106,114,136
fallback=Weather_Blizzard_Sun_Night_Color,057,066,074
fallback=Weather_Blizzard_Sun_Disc_Sunset_Color,128,128,128
fallback=Weather_Blizzard_Land_Fog_Day_Depth,2.8
fallback=Weather_Blizzard_Land_Fog_Night_Depth,3.0
fallback=Weather_Blizzard_Wind_Speed,.9
fallback=Weather_Blizzard_Cloud_Speed,7.5
fallback=Weather_Blizzard_Glare_View,0
fallback=Weather_Blizzard_Ambient_Loop_Sound_ID, Blizzard
fallback=Weather_Blizzard_Storm_Threshold,.50