mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 01:26:39 +00:00 
			
		
		
		
	Merge remote-tracking branch 'scrawl/master'
This commit is contained in:
		
						commit
						a5049fd7b0
					
				
					 142 changed files with 843 additions and 1831 deletions
				
			
		
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -412,7 +412,7 @@ void Record<ESM::Armor>::print()
 | 
			
		|||
    std::cout << "  Armor: " << mData.mData.mArmor << std::endl;
 | 
			
		||||
    std::cout << "  Enchantment Points: " << mData.mData.mEnchant << std::endl;
 | 
			
		||||
    std::vector<ESM::PartReference>::iterator pit;
 | 
			
		||||
    for (pit = mData.mParts.mParts.begin(); pit != mData.mParts.mParts.end(); pit++)
 | 
			
		||||
    for (pit = mData.mParts.mParts.begin(); pit != mData.mParts.mParts.end(); ++pit)
 | 
			
		||||
    {
 | 
			
		||||
        std::cout << "  Body Part: " << bodyPartLabel(pit->mPart)
 | 
			
		||||
                  << " (" << (int)(pit->mPart) << ")" << std::endl;
 | 
			
		||||
| 
						 | 
				
			
			@ -484,7 +484,7 @@ void Record<ESM::BirthSign>::print()
 | 
			
		|||
    std::cout << "  Texture: " << mData.mTexture << std::endl;
 | 
			
		||||
    std::cout << "  Description: " << mData.mDescription << std::endl;
 | 
			
		||||
    std::vector<std::string>::iterator pit;
 | 
			
		||||
    for (pit = mData.mPowers.mList.begin(); pit != mData.mPowers.mList.end(); pit++)
 | 
			
		||||
    for (pit = mData.mPowers.mList.begin(); pit != mData.mPowers.mList.end(); ++pit)
 | 
			
		||||
        std::cout << "  Power: " << *pit << std::endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -554,7 +554,7 @@ void Record<ESM::Clothing>::print()
 | 
			
		|||
    std::cout << "  Value: " << mData.mData.mValue << std::endl;
 | 
			
		||||
    std::cout << "  Enchantment Points: " << mData.mData.mEnchant << std::endl;
 | 
			
		||||
    std::vector<ESM::PartReference>::iterator pit;
 | 
			
		||||
    for (pit = mData.mParts.mParts.begin(); pit != mData.mParts.mParts.end(); pit++)
 | 
			
		||||
    for (pit = mData.mParts.mParts.begin(); pit != mData.mParts.mParts.end(); ++pit)
 | 
			
		||||
    {
 | 
			
		||||
        std::cout << "  Body Part: " << bodyPartLabel(pit->mPart)
 | 
			
		||||
                  << " (" << (int)(pit->mPart) << ")" << std::endl;
 | 
			
		||||
| 
						 | 
				
			
			@ -574,7 +574,7 @@ void Record<ESM::Container>::print()
 | 
			
		|||
    std::cout << "  Flags: " << containerFlags(mData.mFlags) << std::endl;
 | 
			
		||||
    std::cout << "  Weight: " << mData.mWeight << std::endl;
 | 
			
		||||
    std::vector<ESM::ContItem>::iterator cit;
 | 
			
		||||
    for (cit = mData.mInventory.mList.begin(); cit != mData.mInventory.mList.end(); cit++)
 | 
			
		||||
    for (cit = mData.mInventory.mList.begin(); cit != mData.mInventory.mList.end(); ++cit)
 | 
			
		||||
        std::cout << "  Inventory: Count: " << boost::format("%4d") % cit->mCount
 | 
			
		||||
                  << " Item: " << cit->mItem.toString() << std::endl;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -619,12 +619,12 @@ void Record<ESM::Creature>::print()
 | 
			
		|||
    std::cout << "  Gold: " << mData.mData.mGold << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::vector<ESM::ContItem>::iterator cit;
 | 
			
		||||
    for (cit = mData.mInventory.mList.begin(); cit != mData.mInventory.mList.end(); cit++)
 | 
			
		||||
    for (cit = mData.mInventory.mList.begin(); cit != mData.mInventory.mList.end(); ++cit)
 | 
			
		||||
        std::cout << "  Inventory: Count: " << boost::format("%4d") % cit->mCount
 | 
			
		||||
                  << " Item: " << cit->mItem.toString() << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::vector<std::string>::iterator sit;
 | 
			
		||||
    for (sit = mData.mSpells.mList.begin(); sit != mData.mSpells.mList.end(); sit++)
 | 
			
		||||
    for (sit = mData.mSpells.mList.begin(); sit != mData.mSpells.mList.end(); ++sit)
 | 
			
		||||
        std::cout << "  Spell: " << *sit << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::cout << "  Artifical Intelligence: " << mData.mHasAI << std::endl;
 | 
			
		||||
| 
						 | 
				
			
			@ -639,7 +639,7 @@ void Record<ESM::Creature>::print()
 | 
			
		|||
    std::cout << "    AI Services:" << boost::format("0x%08X") % mData.mAiData.mServices << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::vector<ESM::AIPackage>::iterator pit;
 | 
			
		||||
    for (pit = mData.mAiPackage.mList.begin(); pit != mData.mAiPackage.mList.end(); pit++)
 | 
			
		||||
    for (pit = mData.mAiPackage.mList.begin(); pit != mData.mAiPackage.mList.end(); ++pit)
 | 
			
		||||
        printAIPackage(*pit);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -706,7 +706,7 @@ void Record<ESM::Faction>::print()
 | 
			
		|||
                      << mData.mData.mRankData[i].mFactReaction << std::endl;
 | 
			
		||||
        }
 | 
			
		||||
    std::map<std::string, int>::iterator rit;
 | 
			
		||||
    for (rit = mData.mReactions.begin(); rit != mData.mReactions.end(); rit++)
 | 
			
		||||
    for (rit = mData.mReactions.begin(); rit != mData.mReactions.end(); ++rit)
 | 
			
		||||
        std::cout << "  Reaction: " << rit->second << " = " << rit->first << std::endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -763,7 +763,7 @@ void Record<ESM::DialInfo>::print()
 | 
			
		|||
    std::cout << "  Unknown2: " << (int)mData.mData.mUnknown2 << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::vector<ESM::DialInfo::SelectStruct>::iterator sit;
 | 
			
		||||
    for (sit = mData.mSelects.begin(); sit != mData.mSelects.end(); sit++)
 | 
			
		||||
    for (sit = mData.mSelects.begin(); sit != mData.mSelects.end(); ++sit)
 | 
			
		||||
        std::cout << "  Select Rule: " << ruleString(*sit) << std::endl;
 | 
			
		||||
 | 
			
		||||
    if (mData.mResultScript != "")
 | 
			
		||||
| 
						 | 
				
			
			@ -835,7 +835,7 @@ void Record<ESM::CreatureLevList>::print()
 | 
			
		|||
    std::cout << "  Flags: " << creatureListFlags(mData.mFlags) << std::endl;
 | 
			
		||||
    std::cout << "  Number of items: " << mData.mList.size() << std::endl;
 | 
			
		||||
    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 << "  Creature: Level: " << iit->mLevel
 | 
			
		||||
                  << " Creature: " << iit->mId << std::endl;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -847,7 +847,7 @@ void Record<ESM::ItemLevList>::print()
 | 
			
		|||
    std::cout << "  Flags: " << itemListFlags(mData.mFlags) << std::endl;
 | 
			
		||||
    std::cout << "  Number of items: " << mData.mList.size() << std::endl;
 | 
			
		||||
    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: Level: " << iit->mLevel
 | 
			
		||||
                  << " Item: " << iit->mId << std::endl;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1031,16 +1031,16 @@ void Record<ESM::NPC>::print()
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    std::vector<ESM::ContItem>::iterator cit;
 | 
			
		||||
    for (cit = mData.mInventory.mList.begin(); cit != mData.mInventory.mList.end(); cit++)
 | 
			
		||||
    for (cit = mData.mInventory.mList.begin(); cit != mData.mInventory.mList.end(); ++cit)
 | 
			
		||||
        std::cout << "  Inventory: Count: " << boost::format("%4d") % cit->mCount
 | 
			
		||||
                  << " Item: " << cit->mItem.toString() << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::vector<std::string>::iterator sit;
 | 
			
		||||
    for (sit = mData.mSpells.mList.begin(); sit != mData.mSpells.mList.end(); sit++)
 | 
			
		||||
    for (sit = mData.mSpells.mList.begin(); sit != mData.mSpells.mList.end(); ++sit)
 | 
			
		||||
        std::cout << "  Spell: " << *sit << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::vector<ESM::NPC::Dest>::iterator dit;
 | 
			
		||||
    for (dit = mData.mTransport.begin(); dit != mData.mTransport.end(); dit++)
 | 
			
		||||
    for (dit = mData.mTransport.begin(); dit != mData.mTransport.end(); ++dit)
 | 
			
		||||
    {
 | 
			
		||||
        std::cout << "  Destination Position: "
 | 
			
		||||
                  << boost::format("%12.3f") % dit->mPos.pos[0] << ","
 | 
			
		||||
| 
						 | 
				
			
			@ -1066,7 +1066,7 @@ void Record<ESM::NPC>::print()
 | 
			
		|||
    std::cout << "    AI Services:" << boost::format("0x%08X") % mData.mAiData.mServices << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::vector<ESM::AIPackage>::iterator pit;
 | 
			
		||||
    for (pit = mData.mAiPackage.mList.begin(); pit != mData.mAiPackage.mList.end(); pit++)
 | 
			
		||||
    for (pit = mData.mAiPackage.mList.begin(); pit != mData.mAiPackage.mList.end(); ++pit)
 | 
			
		||||
        printAIPackage(*pit);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1140,7 +1140,7 @@ void Record<ESM::Race>::print()
 | 
			
		|||
                      << mData.mData.mBonus[i].mBonus << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::vector<std::string>::iterator sit;
 | 
			
		||||
    for (sit = mData.mPowers.mList.begin(); sit != mData.mPowers.mList.end(); sit++)
 | 
			
		||||
    for (sit = mData.mPowers.mList.begin(); sit != mData.mPowers.mList.end(); ++sit)
 | 
			
		||||
        std::cout << "  Power: " << *sit << std::endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1164,7 +1164,7 @@ void Record<ESM::Region>::print()
 | 
			
		|||
    if (mData.mSleepList != "")
 | 
			
		||||
        std::cout << "  Sleep List: " << mData.mSleepList << std::endl;
 | 
			
		||||
    std::vector<ESM::Region::SoundRef>::iterator sit;
 | 
			
		||||
    for (sit = mData.mSoundList.begin(); sit != mData.mSoundList.end(); sit++)
 | 
			
		||||
    for (sit = mData.mSoundList.begin(); sit != mData.mSoundList.end(); ++sit)
 | 
			
		||||
        std::cout << "  Sound: " << (int)sit->mChance << " = " << sit->mSound.toString() << std::endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1181,12 +1181,12 @@ void Record<ESM::Script>::print()
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
    std::vector<std::string>::iterator vit;
 | 
			
		||||
    for (vit = mData.mVarNames.begin(); vit != mData.mVarNames.end(); vit++)
 | 
			
		||||
    for (vit = mData.mVarNames.begin(); vit != mData.mVarNames.end(); ++vit)
 | 
			
		||||
        std::cout << "  Variable: " << *vit << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::cout << "  ByteCode: ";
 | 
			
		||||
    std::vector<unsigned char>::iterator cit;
 | 
			
		||||
    for (cit = mData.mScriptData.begin(); cit != mData.mScriptData.end(); cit++)
 | 
			
		||||
    for (cit = mData.mScriptData.begin(); cit != mData.mScriptData.end(); ++cit)
 | 
			
		||||
        std::cout << boost::format("%02X") % (int)(*cit);
 | 
			
		||||
    std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,7 @@ namespace bfs = boost::filesystem;
 | 
			
		|||
 | 
			
		||||
MwIniImporter::MwIniImporter()
 | 
			
		||||
    : mVerbose(false)
 | 
			
		||||
    , mEncoding(ToUTF8::WINDOWS_1250)
 | 
			
		||||
{
 | 
			
		||||
    const char *map[][2] =
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -709,8 +710,7 @@ MwIniImporter::multistrmap MwIniImporter::loadIniFile(const std::string& filenam
 | 
			
		|||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        multistrmap::iterator it;
 | 
			
		||||
        if((it = map.find(key)) == map.end()) {
 | 
			
		||||
        if(map.find(key) == map.end()) {
 | 
			
		||||
            map.insert( std::make_pair (key, std::vector<std::string>() ) );
 | 
			
		||||
        }
 | 
			
		||||
        map[key].push_back(value);
 | 
			
		||||
| 
						 | 
				
			
			@ -746,8 +746,7 @@ MwIniImporter::multistrmap MwIniImporter::loadCfgFile(const std::string& filenam
 | 
			
		|||
        std::string key(line.substr(0,pos));
 | 
			
		||||
        std::string value(line.substr(pos+1));
 | 
			
		||||
 | 
			
		||||
        multistrmap::iterator it;
 | 
			
		||||
        if((it = map.find(key)) == map.end()) {
 | 
			
		||||
        if(map.find(key) == map.end()) {
 | 
			
		||||
            map.insert( std::make_pair (key, std::vector<std::string>() ) );
 | 
			
		||||
        }
 | 
			
		||||
        map[key].push_back(value);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,8 @@ public:
 | 
			
		|||
    char **get() const { return const_cast<char **>(argv); }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    utf8argv(const utf8argv&);
 | 
			
		||||
    utf8argv& operator=(const utf8argv&);
 | 
			
		||||
 | 
			
		||||
    const char **argv;
 | 
			
		||||
    std::vector<std::string> args;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,11 +103,6 @@ namespace CSMDoc
 | 
			
		|||
        if (state==CSMWorld::RecordBase::State_Modified ||
 | 
			
		||||
            state==CSMWorld::RecordBase::State_ModifiedOnly)
 | 
			
		||||
        {
 | 
			
		||||
            std::string type;
 | 
			
		||||
            for (int i=0; i<4; ++i)
 | 
			
		||||
                /// \todo make endianess agnostic (change ESMWriter interface?)
 | 
			
		||||
                type += reinterpret_cast<const char *> (&mCollection.getRecord (stage).mModified.sRecordId)[i];
 | 
			
		||||
 | 
			
		||||
            mState.getWriter().startRecord (mCollection.getRecord (stage).mModified.sRecordId);
 | 
			
		||||
            mState.getWriter().writeHNCString ("NAME", mCollection.getId (stage));
 | 
			
		||||
            mCollection.getRecord (stage).mModified.save (mState.getWriter());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,9 +11,14 @@ float CSVRender::Navigation::getFactor (bool mouse) const
 | 
			
		|||
    return factor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CSVRender::Navigation::Navigation()
 | 
			
		||||
    : mFastModeFactor(1)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CSVRender::Navigation::~Navigation() {}
 | 
			
		||||
 | 
			
		||||
void CSVRender::Navigation::setFastModeFactor (float factor)
 | 
			
		||||
{
 | 
			
		||||
    mFastModeFactor = factor;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ namespace CSVRender
 | 
			
		|||
 | 
			
		||||
        public:
 | 
			
		||||
 | 
			
		||||
            Navigation();
 | 
			
		||||
            virtual ~Navigation();
 | 
			
		||||
 | 
			
		||||
            void setFastModeFactor (float factor);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -361,11 +361,6 @@ namespace CSVRender
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int SceneWidget::getFastFactor() const
 | 
			
		||||
    {
 | 
			
		||||
        return mFast ? mFastFactor : 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void SceneWidget::setLighting (Lighting *lighting)
 | 
			
		||||
    {
 | 
			
		||||
        if (mLighting)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,8 +80,6 @@ namespace CSVRender
 | 
			
		|||
 | 
			
		||||
            void updateOgreWindow();
 | 
			
		||||
 | 
			
		||||
            int getFastFactor() const;
 | 
			
		||||
 | 
			
		||||
            void setLighting (Lighting *lighting);
 | 
			
		||||
            ///< \attention The ownership of \a lighting is not transferred to *this.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ void CSVWorld::DataDisplayDelegate::buildPixmaps ()
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CSVWorld::DataDisplayDelegate::setIconSize(const QSize size)
 | 
			
		||||
void CSVWorld::DataDisplayDelegate::setIconSize(const QSize& size)
 | 
			
		||||
{
 | 
			
		||||
    mIconSize = size;
 | 
			
		||||
    buildPixmaps();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,7 +50,7 @@ namespace CSVWorld
 | 
			
		|||
        virtual void paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
 | 
			
		||||
 | 
			
		||||
        /// pass a QSize defining height / width of icon. Default is QSize (16,16).
 | 
			
		||||
        void setIconSize (const QSize icon);
 | 
			
		||||
        void setIconSize (const QSize& icon);
 | 
			
		||||
 | 
			
		||||
        /// offset the horizontal position of the icon from the left edge of the cell.  Default is 3 pixels.
 | 
			
		||||
        void setIconLeftOffset (int offset);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -127,7 +127,6 @@ static int (*cc_user_info)(char*, char*);
 | 
			
		|||
static void gdb_info(pid_t pid)
 | 
			
		||||
{
 | 
			
		||||
    char respfile[64];
 | 
			
		||||
    char cmd_buf[128];
 | 
			
		||||
    FILE *f;
 | 
			
		||||
    int fd;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -156,6 +155,7 @@ static void gdb_info(pid_t pid)
 | 
			
		|||
        fclose(f);
 | 
			
		||||
 | 
			
		||||
        /* Run gdb and print process info. */
 | 
			
		||||
        char cmd_buf[128];
 | 
			
		||||
        snprintf(cmd_buf, sizeof(cmd_buf), "gdb --quiet --batch --command=%s", respfile);
 | 
			
		||||
        printf("Executing: %s\n", cmd_buf);
 | 
			
		||||
        fflush(stdout);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,7 +62,6 @@ void validate(boost::any &v, std::vector<std::string> const &tokens, FallbackMap
 | 
			
		|||
 | 
			
		||||
    FallbackMap *map = boost::any_cast<FallbackMap>(&v);
 | 
			
		||||
 | 
			
		||||
    std::map<std::string,std::string>::iterator mapIt;
 | 
			
		||||
    for(std::vector<std::string>::const_iterator it=tokens.begin(); it != tokens.end(); ++it)
 | 
			
		||||
    {
 | 
			
		||||
        int sep = it->find(",");
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +75,7 @@ void validate(boost::any &v, std::vector<std::string> const &tokens, FallbackMap
 | 
			
		|||
        std::string key(it->substr(0,sep));
 | 
			
		||||
        std::string value(it->substr(sep+1));
 | 
			
		||||
 | 
			
		||||
        if((mapIt = map->mMap.find(key)) == map->mMap.end())
 | 
			
		||||
        if(map->mMap.find(key) == map->mMap.end())
 | 
			
		||||
        {
 | 
			
		||||
            map->mMap.insert(std::make_pair (key,value));
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -128,7 +128,8 @@ namespace MWBase
 | 
			
		|||
                                      OffenseType type, int arg=0) = 0;
 | 
			
		||||
            virtual void reportCrime (const MWWorld::Ptr& ptr, const MWWorld::Ptr& victim,
 | 
			
		||||
                                      OffenseType type, int arg=0) = 0;
 | 
			
		||||
            virtual void actorAttacked (const MWWorld::Ptr& victim, const MWWorld::Ptr& attacker) = 0;
 | 
			
		||||
            /// @return false if the attack was considered a "friendly hit" and forgiven
 | 
			
		||||
            virtual bool actorAttacked (const MWWorld::Ptr& victim, const MWWorld::Ptr& attacker) = 0;
 | 
			
		||||
            /// Utility to check if taking this item is illegal and calling commitCrime if so
 | 
			
		||||
            virtual void itemTaken (const MWWorld::Ptr& ptr, const MWWorld::Ptr& item, int count) = 0;
 | 
			
		||||
            /// Utility to check if opening (i.e. unlocking) this object is illegal and calling commitCrime if so
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -225,7 +225,6 @@ namespace MWBase
 | 
			
		|||
 | 
			
		||||
            virtual void showCrosshair(bool show) = 0;
 | 
			
		||||
            virtual bool getSubtitlesEnabled() = 0;
 | 
			
		||||
            virtual void toggleHud() = 0;
 | 
			
		||||
            virtual bool toggleGui() = 0;
 | 
			
		||||
 | 
			
		||||
            virtual void disallowMouse() = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -338,11 +338,12 @@ namespace MWClass
 | 
			
		|||
            getCreatureStats(ptr).setAttacked(true);
 | 
			
		||||
 | 
			
		||||
        // Self defense
 | 
			
		||||
        bool setOnPcHitMe = true; // Note OnPcHitMe is not set for friendly hits.
 | 
			
		||||
        if ((canWalk(ptr) || canFly(ptr) || canSwim(ptr)) // No retaliation for totally static creatures
 | 
			
		||||
                                                              // (they have no movement or attacks anyway)
 | 
			
		||||
            && !attacker.isEmpty())
 | 
			
		||||
        {
 | 
			
		||||
            MWBase::Environment::get().getMechanicsManager()->actorAttacked(ptr, attacker);
 | 
			
		||||
            setOnPcHitMe = MWBase::Environment::get().getMechanicsManager()->actorAttacked(ptr, attacker);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(!successful)
 | 
			
		||||
| 
						 | 
				
			
			@ -357,7 +358,7 @@ namespace MWClass
 | 
			
		|||
        if(!object.isEmpty())
 | 
			
		||||
            getCreatureStats(ptr).setLastHitObject(object.getClass().getId(object));
 | 
			
		||||
 | 
			
		||||
        if(!attacker.isEmpty() && attacker.getRefData().getHandle() == "player")
 | 
			
		||||
        if(setOnPcHitMe && !attacker.isEmpty() && attacker.getRefData().getHandle() == "player")
 | 
			
		||||
        {
 | 
			
		||||
            const std::string &script = ptr.get<ESM::Creature>()->mBase->mScript;
 | 
			
		||||
            /* Set the OnPCHitMe script variable. The script is responsible for clearing it. */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -644,11 +644,13 @@ namespace MWClass
 | 
			
		|||
 | 
			
		||||
        bool wasDead = getCreatureStats(ptr).isDead();
 | 
			
		||||
 | 
			
		||||
        // Note OnPcHitMe is not set for friendly hits.
 | 
			
		||||
        bool setOnPcHitMe = true;
 | 
			
		||||
        if (!attacker.isEmpty() && !ptr.getClass().getCreatureStats(ptr).getAiSequence().isInCombat(attacker))
 | 
			
		||||
        {
 | 
			
		||||
            getCreatureStats(ptr).setAttacked(true);
 | 
			
		||||
 | 
			
		||||
            MWBase::Environment::get().getMechanicsManager()->actorAttacked(ptr, attacker);
 | 
			
		||||
            setOnPcHitMe = MWBase::Environment::get().getMechanicsManager()->actorAttacked(ptr, attacker);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(!successful)
 | 
			
		||||
| 
						 | 
				
			
			@ -663,7 +665,7 @@ namespace MWClass
 | 
			
		|||
        if(!object.isEmpty())
 | 
			
		||||
            getCreatureStats(ptr).setLastHitObject(object.getClass().getId(object));
 | 
			
		||||
 | 
			
		||||
        if(!attacker.isEmpty() && attacker.getRefData().getHandle() == "player")
 | 
			
		||||
        if(setOnPcHitMe && !attacker.isEmpty() && attacker.getRefData().getHandle() == "player")
 | 
			
		||||
        {
 | 
			
		||||
            const std::string &script = ptr.getClass().getScript(ptr);
 | 
			
		||||
            /* Set the OnPCHitMe script variable. The script is responsible for clearing it. */
 | 
			
		||||
| 
						 | 
				
			
			@ -1188,13 +1190,6 @@ namespace MWClass
 | 
			
		|||
                + shield;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    void Npc::adjustRotation(const MWWorld::Ptr& ptr,float& x,float& y,float& z) const
 | 
			
		||||
    {
 | 
			
		||||
        y = 0;
 | 
			
		||||
        x = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Npc::adjustScale(const MWWorld::Ptr &ptr, float &scale) const
 | 
			
		||||
    {
 | 
			
		||||
        MWWorld::LiveCellRef<ESM::NPC> *ref =
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -139,8 +139,6 @@ namespace MWClass
 | 
			
		|||
            virtual void skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor=1.f) const;
 | 
			
		||||
            ///< Inform actor \a ptr that a skill use has succeeded.
 | 
			
		||||
 | 
			
		||||
            virtual void adjustRotation(const MWWorld::Ptr& ptr,float& x,float& y,float& z) const;
 | 
			
		||||
 | 
			
		||||
            virtual bool isEssential (const MWWorld::Ptr& ptr) const;
 | 
			
		||||
            ///< Is \a ptr essential? (i.e. may losing \a ptr make the game unwinnable)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -729,10 +729,10 @@ namespace MWDialogue
 | 
			
		|||
    {
 | 
			
		||||
        std::vector<HyperTextToken> result;
 | 
			
		||||
        MyGUI::UString utext(text);
 | 
			
		||||
        size_t pos_begin, pos_end, iteration_pos = 0;
 | 
			
		||||
        size_t pos_end, iteration_pos = 0;
 | 
			
		||||
        for(;;)
 | 
			
		||||
        {
 | 
			
		||||
            pos_begin = utext.find('@', iteration_pos);
 | 
			
		||||
            size_t pos_begin = utext.find('@', iteration_pos);
 | 
			
		||||
            if (pos_begin != std::string::npos)
 | 
			
		||||
                pos_end = utext.find('#', pos_begin);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -758,12 +758,12 @@ namespace MWDialogue
 | 
			
		|||
    size_t RemovePseudoAsterisks(std::string& phrase)
 | 
			
		||||
    {
 | 
			
		||||
        size_t pseudoAsterisksCount = 0;
 | 
			
		||||
        const char specialPseudoAsteriskCharacter = 127;
 | 
			
		||||
 | 
			
		||||
        if( !phrase.empty() )
 | 
			
		||||
        {
 | 
			
		||||
            std::string::reverse_iterator rit = phrase.rbegin();
 | 
			
		||||
 | 
			
		||||
            const char specialPseudoAsteriskCharacter = 127;
 | 
			
		||||
            while( rit != phrase.rend() && *rit == specialPseudoAsteriskCharacter )
 | 
			
		||||
            {
 | 
			
		||||
                pseudoAsterisksCount++;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -277,7 +277,6 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
    InfoBoxDialog::InfoBoxDialog()
 | 
			
		||||
        : WindowModal("openmw_infobox.layout")
 | 
			
		||||
        , mCurrentButton(-1)
 | 
			
		||||
    {
 | 
			
		||||
        getWidget(mTextBox, "TextBox");
 | 
			
		||||
        getWidget(mText, "Text");
 | 
			
		||||
| 
						 | 
				
			
			@ -306,7 +305,6 @@ namespace MWGui
 | 
			
		|||
            MyGUI::Gui::getInstance().destroyWidget(*it);
 | 
			
		||||
        }
 | 
			
		||||
        this->mButtons.clear();
 | 
			
		||||
        mCurrentButton = -1;
 | 
			
		||||
 | 
			
		||||
        // TODO: The buttons should be generated from a template in the layout file, ie. cloning an existing widget
 | 
			
		||||
        MyGUI::Button* button;
 | 
			
		||||
| 
						 | 
				
			
			@ -336,11 +334,6 @@ namespace MWGui
 | 
			
		|||
        center();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int InfoBoxDialog::getChosenButton() const
 | 
			
		||||
    {
 | 
			
		||||
        return mCurrentButton;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void InfoBoxDialog::onButtonClicked(MyGUI::Widget* _sender)
 | 
			
		||||
    {
 | 
			
		||||
        std::vector<MyGUI::Button*>::const_iterator end = mButtons.end();
 | 
			
		||||
| 
						 | 
				
			
			@ -349,7 +342,6 @@ namespace MWGui
 | 
			
		|||
        {
 | 
			
		||||
            if (*it == _sender)
 | 
			
		||||
            {
 | 
			
		||||
                mCurrentButton = i;
 | 
			
		||||
                eventButtonSelected(i);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,6 @@ namespace MWGui
 | 
			
		|||
        void setButtons(ButtonList &buttons);
 | 
			
		||||
 | 
			
		||||
        virtual void open();
 | 
			
		||||
        int getChosenButton() const;
 | 
			
		||||
 | 
			
		||||
        // Events
 | 
			
		||||
        typedef MyGUI::delegates::CMultiDelegate1<int> EventHandle_Int;
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +40,6 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
        void fitToText(MyGUI::TextBox* widget);
 | 
			
		||||
        void layoutVertically(MyGUI::Widget* widget, int margin);
 | 
			
		||||
        int mCurrentButton;
 | 
			
		||||
        MyGUI::Widget* mTextBox;
 | 
			
		||||
        MyGUI::TextBox* mText;
 | 
			
		||||
        MyGUI::Widget* mButtonBar;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -155,11 +155,6 @@ namespace MWGui
 | 
			
		|||
        mCommandLine->setFontName(fntName);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Console::clearHistory()
 | 
			
		||||
    {
 | 
			
		||||
        mHistory->setCaption("");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Console::print(const std::string &msg)
 | 
			
		||||
    {
 | 
			
		||||
        mHistory->addText(msg);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,8 +48,6 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
            void onResChange(int width, int height);
 | 
			
		||||
 | 
			
		||||
            void clearHistory();
 | 
			
		||||
 | 
			
		||||
            // Print a message to the console. Messages may contain color
 | 
			
		||||
            // code, eg. "#FFFFFF this is white".
 | 
			
		||||
            void print(const std::string &msg);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -125,10 +125,10 @@ namespace MWGui
 | 
			
		|||
        // We need this copy for when @# hyperlinks are replaced
 | 
			
		||||
        std::string text = mText;
 | 
			
		||||
 | 
			
		||||
        size_t pos_begin, pos_end;
 | 
			
		||||
        size_t pos_end;
 | 
			
		||||
        for(;;)
 | 
			
		||||
        {
 | 
			
		||||
            pos_begin = text.find('@');
 | 
			
		||||
            size_t pos_begin = text.find('@');
 | 
			
		||||
            if (pos_begin != std::string::npos)
 | 
			
		||||
                pos_end = text.find('#', pos_begin);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -183,10 +183,9 @@ namespace MWGui
 | 
			
		|||
            paper->setNeedMouseFocus(false);
 | 
			
		||||
 | 
			
		||||
            BookTextParser parser(markup);
 | 
			
		||||
            BookTextParser::Events event;
 | 
			
		||||
            for (;;)
 | 
			
		||||
            {
 | 
			
		||||
                event = parser.next();
 | 
			
		||||
                BookTextParser::Events event = parser.next();
 | 
			
		||||
                if (event == BookTextParser::Event_BrTag || event == BookTextParser::Event_PTag)
 | 
			
		||||
                    continue;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,8 @@ namespace MWGui
 | 
			
		|||
                Misc::StringUtils::toLower(currentGMSTID);
 | 
			
		||||
 | 
			
		||||
                // Don't bother checking this GMST if it's not a sMagicBound* one.
 | 
			
		||||
                if (currentGMSTID.find("smagicbound") != 0)
 | 
			
		||||
                const std::string& toFind = "smagicbound";
 | 
			
		||||
                if (currentGMSTID.compare(0, toFind.length(), toFind) != 0)
 | 
			
		||||
                    continue;
 | 
			
		||||
 | 
			
		||||
                // All sMagicBound* GMST's should be of type string
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,10 +113,10 @@ struct JournalViewModelImpl : JournalViewModel
 | 
			
		|||
 | 
			
		||||
                utf8text = getText ();
 | 
			
		||||
 | 
			
		||||
                size_t pos_begin, pos_end;
 | 
			
		||||
                size_t pos_end = 0;
 | 
			
		||||
                for(;;)
 | 
			
		||||
                {
 | 
			
		||||
                    pos_begin = utf8text.find('@');
 | 
			
		||||
                    size_t pos_begin = utf8text.find('@');
 | 
			
		||||
                    if (pos_begin != std::string::npos)
 | 
			
		||||
                        pos_end = utf8text.find('#', pos_begin);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -223,15 +223,6 @@ struct JournalViewModelImpl : JournalViewModel
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void visitQuestName (QuestId questId, boost::function <void (Utf8Span)> visitor) const
 | 
			
		||||
    {
 | 
			
		||||
        MWDialogue::Quest const * quest = reinterpret_cast <MWDialogue::Quest const *> (questId);
 | 
			
		||||
 | 
			
		||||
        std::string name = quest->getName ();
 | 
			
		||||
 | 
			
		||||
        visitor (toUtf8Span (name));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename iterator_t>
 | 
			
		||||
    struct JournalEntryImpl : BaseEntry <iterator_t, JournalEntry>
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -301,11 +292,6 @@ struct JournalViewModelImpl : JournalViewModel
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void visitTopics (boost::function <void (TopicId, Utf8Span)> visitor) const
 | 
			
		||||
    {
 | 
			
		||||
        throw std::runtime_error ("not implemented");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void visitTopicName (TopicId topicId, boost::function <void (Utf8Span)> visitor) const
 | 
			
		||||
    {
 | 
			
		||||
        MWDialogue::Topic const & topic = * reinterpret_cast <MWDialogue::Topic const *> (topicId);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,9 +67,6 @@ namespace MWGui
 | 
			
		|||
        /// returns true if their are no journal entries to display
 | 
			
		||||
        virtual bool isEmpty () const = 0;
 | 
			
		||||
 | 
			
		||||
        /// provides access to the name of the quest with the specified identifier
 | 
			
		||||
        virtual void visitQuestName (TopicId topicId, boost::function <void (Utf8Span)> visitor) const = 0;
 | 
			
		||||
 | 
			
		||||
        /// walks the active and optionally completed, quests providing the name
 | 
			
		||||
        virtual void visitQuestNames (bool active_only, boost::function <void (const std::string&)> visitor) const = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -393,18 +393,6 @@ namespace
 | 
			
		|||
            popBook ();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void showList (char const * listId, char const * pageId, Book book)
 | 
			
		||||
        {
 | 
			
		||||
            std::pair <int, int> size = book->getSize ();
 | 
			
		||||
 | 
			
		||||
            getPage (pageId)->showPage (book, 0);
 | 
			
		||||
 | 
			
		||||
            // Canvas size must be expressed with VScroll disabled, otherwise MyGUI would expand the scroll area when the scrollbar is hidden
 | 
			
		||||
            getWidget <MyGUI::ScrollView> (listId)->setVisibleVScroll(false);
 | 
			
		||||
            getWidget <MyGUI::ScrollView> (listId)->setCanvasSize (size.first, size.second);
 | 
			
		||||
            getWidget <MyGUI::ScrollView> (listId)->setVisibleVScroll(true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void notifyIndexLinkClicked (MWGui::TypesetBook::InteractiveId character)
 | 
			
		||||
        {
 | 
			
		||||
            setVisible (LeftTopicIndex, false);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -140,7 +140,7 @@ namespace MWGui
 | 
			
		|||
            // Vanilla uses thief.dds for custom classes.
 | 
			
		||||
            // Choosing Stealth specialization and Speed/Agility as attributes, if possible. Otherwise fall back to first class found.
 | 
			
		||||
            MWWorld::SharedIterator<ESM::Class> it = world->getStore().get<ESM::Class>().begin();
 | 
			
		||||
            for(; it != world->getStore().get<ESM::Class>().end(); it++)
 | 
			
		||||
            for(; it != world->getStore().get<ESM::Class>().end(); ++it)
 | 
			
		||||
            {
 | 
			
		||||
                if(it->mData.mIsPlayable && it->mData.mSpecialization == 2 && it->mData.mAttribute[0] == 4 && it->mData.mAttribute[1] == 3)
 | 
			
		||||
                    break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,15 +26,55 @@ namespace
 | 
			
		|||
 | 
			
		||||
    const int cellSize = 8192;
 | 
			
		||||
 | 
			
		||||
    enum WidgetDepth
 | 
			
		||||
    enum LocalMapWidgetDepth
 | 
			
		||||
    {
 | 
			
		||||
        CompassLayer = 0,
 | 
			
		||||
        MarkerAboveFogLayer = 1,
 | 
			
		||||
        FogLayer = 2,
 | 
			
		||||
        MarkerLayer = 3,
 | 
			
		||||
        MapLayer = 4
 | 
			
		||||
        Local_CompassLayer = 0,
 | 
			
		||||
        Local_MarkerAboveFogLayer = 1,
 | 
			
		||||
        Local_FogLayer = 2,
 | 
			
		||||
        Local_MarkerLayer = 3,
 | 
			
		||||
        Local_MapLayer = 4
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum GlobalMapWidgetDepth
 | 
			
		||||
    {
 | 
			
		||||
        Global_CompassLayer = 0,
 | 
			
		||||
        Global_MarkerLayer = 1,
 | 
			
		||||
        Global_ExploreOverlayLayer = 2,
 | 
			
		||||
        Global_MapLayer = 3
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /// @brief A widget that changes its color when hovered.
 | 
			
		||||
    class MarkerWidget: public MyGUI::Widget
 | 
			
		||||
    {
 | 
			
		||||
        MYGUI_RTTI_DERIVED(MarkerWidget)
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
        void setNormalColour(const MyGUI::Colour& colour)
 | 
			
		||||
        {
 | 
			
		||||
            mNormalColour = colour;
 | 
			
		||||
            setColour(colour);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void setHoverColour(const MyGUI::Colour& colour)
 | 
			
		||||
        {
 | 
			
		||||
            mHoverColour = colour;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
        MyGUI::Colour mNormalColour;
 | 
			
		||||
        MyGUI::Colour mHoverColour;
 | 
			
		||||
 | 
			
		||||
        void onMouseLostFocus(MyGUI::Widget* _new)
 | 
			
		||||
        {
 | 
			
		||||
            setColour(mNormalColour);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void onMouseSetFocus(MyGUI::Widget* _old)
 | 
			
		||||
        {
 | 
			
		||||
            setColour(mHoverColour);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace MWGui
 | 
			
		||||
| 
						 | 
				
			
			@ -140,7 +180,7 @@ namespace MWGui
 | 
			
		|||
        mLocalMap = widget;
 | 
			
		||||
        mCompass = compass;
 | 
			
		||||
 | 
			
		||||
        mCompass->setDepth(CompassLayer);
 | 
			
		||||
        mCompass->setDepth(Local_CompassLayer);
 | 
			
		||||
        mCompass->setNeedMouseFocus(false);
 | 
			
		||||
 | 
			
		||||
        // create 3x3 map widgets, 512x512 each, holding a 1024x1024 texture each
 | 
			
		||||
| 
						 | 
				
			
			@ -151,12 +191,12 @@ namespace MWGui
 | 
			
		|||
                MyGUI::ImageBox* map = mLocalMap->createWidget<MyGUI::ImageBox>("ImageBox",
 | 
			
		||||
                    MyGUI::IntCoord(mx*widgetSize, my*widgetSize, widgetSize, widgetSize),
 | 
			
		||||
                    MyGUI::Align::Top | MyGUI::Align::Left);
 | 
			
		||||
                map->setDepth(MapLayer);
 | 
			
		||||
                map->setDepth(Local_MapLayer);
 | 
			
		||||
 | 
			
		||||
                MyGUI::ImageBox* fog = mLocalMap->createWidget<MyGUI::ImageBox>("ImageBox",
 | 
			
		||||
                    MyGUI::IntCoord(mx*widgetSize, my*widgetSize, widgetSize, widgetSize),
 | 
			
		||||
                    MyGUI::Align::Top | MyGUI::Align::Left);
 | 
			
		||||
                fog->setDepth(FogLayer);
 | 
			
		||||
                fog->setDepth(Local_FogLayer);
 | 
			
		||||
 | 
			
		||||
                map->setNeedMouseFocus(false);
 | 
			
		||||
                fog->setNeedMouseFocus(false);
 | 
			
		||||
| 
						 | 
				
			
			@ -273,16 +313,17 @@ namespace MWGui
 | 
			
		|||
            MyGUI::IntCoord widgetCoord(widgetPos.left - 4,
 | 
			
		||||
                                        widgetPos.top - 4,
 | 
			
		||||
                                        8, 8);
 | 
			
		||||
            MyGUI::Button* markerWidget = mLocalMap->createWidget<MyGUI::Button>("ButtonImage",
 | 
			
		||||
            MarkerWidget* markerWidget = mLocalMap->createWidget<MarkerWidget>("MarkerButton",
 | 
			
		||||
                widgetCoord, MyGUI::Align::Default);
 | 
			
		||||
            markerWidget->setDepth(MarkerAboveFogLayer);
 | 
			
		||||
            markerWidget->setImageResource("DoorMarker");
 | 
			
		||||
            markerWidget->setDepth(Local_MarkerAboveFogLayer);
 | 
			
		||||
            markerWidget->setUserString("ToolTipType", "Layout");
 | 
			
		||||
            markerWidget->setUserString("ToolTipLayout", "TextToolTipOneLine");
 | 
			
		||||
            markerWidget->setUserString("Caption_TextOneLine", MyGUI::TextIterator::toTagsString(marker.mNote));
 | 
			
		||||
            markerWidget->setColour(MyGUI::Colour(1.0,0.3,0.3));
 | 
			
		||||
            markerWidget->setNormalColour(MyGUI::Colour(1.0,0.3,0.3));
 | 
			
		||||
            markerWidget->setHoverColour(MyGUI::Colour(1.0,0.5,0.5));
 | 
			
		||||
            markerWidget->setUserData(marker);
 | 
			
		||||
            markerWidget->eventMouseButtonDoubleClick += MyGUI::newDelegate(this, &LocalMapBase::onCustomMarkerDoubleClicked);
 | 
			
		||||
            markerWidget->setNeedMouseFocus(true);
 | 
			
		||||
            customMarkerCreated(markerWidget);
 | 
			
		||||
            mCustomMarkerWidgets.push_back(markerWidget);
 | 
			
		||||
        }
 | 
			
		||||
        redraw();
 | 
			
		||||
| 
						 | 
				
			
			@ -357,16 +398,19 @@ namespace MWGui
 | 
			
		|||
                                        widgetPos.top - 4,
 | 
			
		||||
                                        8, 8);
 | 
			
		||||
            ++counter;
 | 
			
		||||
            MyGUI::Button* markerWidget = mLocalMap->createWidget<MyGUI::Button>("ButtonImage",
 | 
			
		||||
            MarkerWidget* markerWidget = mLocalMap->createWidget<MarkerWidget>("MarkerButton",
 | 
			
		||||
                widgetCoord, MyGUI::Align::Default);
 | 
			
		||||
            markerWidget->setDepth(MarkerLayer);
 | 
			
		||||
            markerWidget->setImageResource("DoorMarker");
 | 
			
		||||
            markerWidget->setNormalColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal}")));
 | 
			
		||||
            markerWidget->setHoverColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal_over}")));
 | 
			
		||||
            markerWidget->setDepth(Local_MarkerLayer);
 | 
			
		||||
            markerWidget->setNeedMouseFocus(true);
 | 
			
		||||
            markerWidget->setUserString("ToolTipType", "Layout");
 | 
			
		||||
            markerWidget->setUserString("ToolTipLayout", "TextToolTipOneLine");
 | 
			
		||||
            markerWidget->setUserString("Caption_TextOneLine", marker.name);
 | 
			
		||||
            // Used by tooltips to not show the tooltip if marker is hidden by fog of war
 | 
			
		||||
            markerWidget->setUserString("IsMarker", "true");
 | 
			
		||||
            markerWidget->setUserData(markerPos);
 | 
			
		||||
            doorMarkerCreated(markerWidget);
 | 
			
		||||
 | 
			
		||||
            mDoorMarkerWidgets.push_back(markerWidget);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -458,7 +502,7 @@ namespace MWGui
 | 
			
		|||
            ++counter;
 | 
			
		||||
            MyGUI::ImageBox* markerWidget = mLocalMap->createWidget<MyGUI::ImageBox>("ImageBox",
 | 
			
		||||
                widgetCoord, MyGUI::Align::Default);
 | 
			
		||||
            markerWidget->setDepth(MarkerAboveFogLayer);
 | 
			
		||||
            markerWidget->setDepth(Local_MarkerAboveFogLayer);
 | 
			
		||||
            markerWidget->setImageTexture(markerTexture);
 | 
			
		||||
            markerWidget->setUserString("IsMarker", "true");
 | 
			
		||||
            markerWidget->setUserData(markerPos);
 | 
			
		||||
| 
						 | 
				
			
			@ -503,7 +547,7 @@ namespace MWGui
 | 
			
		|||
                                        8, 8);
 | 
			
		||||
            MyGUI::ImageBox* markerWidget = mLocalMap->createWidget<MyGUI::ImageBox>("ImageBox",
 | 
			
		||||
                widgetCoord, MyGUI::Align::Default);
 | 
			
		||||
            markerWidget->setDepth(MarkerAboveFogLayer);
 | 
			
		||||
            markerWidget->setDepth(Local_MarkerAboveFogLayer);
 | 
			
		||||
            markerWidget->setImageTexture("textures\\menu_map_smark.dds");
 | 
			
		||||
            markerWidget->setUserString("IsMarker", "true");
 | 
			
		||||
            markerWidget->setUserData(markerPos);
 | 
			
		||||
| 
						 | 
				
			
			@ -523,7 +567,18 @@ namespace MWGui
 | 
			
		|||
        , mGlobalMap(0)
 | 
			
		||||
        , mGlobalMapRender(0)
 | 
			
		||||
        , mEditNoteDialog()
 | 
			
		||||
        , mEventBoxGlobal(NULL)
 | 
			
		||||
        , mEventBoxLocal(NULL)
 | 
			
		||||
        , mGlobalMapImage(NULL)
 | 
			
		||||
        , mGlobalMapOverlay(NULL)
 | 
			
		||||
    {
 | 
			
		||||
        static bool registered = false;
 | 
			
		||||
        if (!registered)
 | 
			
		||||
        {
 | 
			
		||||
            MyGUI::FactoryManager::getInstance().registerFactory<MarkerWidget>("Widget");
 | 
			
		||||
            registered = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        mEditNoteDialog.setVisible(false);
 | 
			
		||||
        mEditNoteDialog.eventOkClicked += MyGUI::newDelegate(this, &MapWindow::onNoteEditOk);
 | 
			
		||||
        mEditNoteDialog.eventDeleteClicked += MyGUI::newDelegate(this, &MapWindow::onNoteEditDelete);
 | 
			
		||||
| 
						 | 
				
			
			@ -537,6 +592,11 @@ namespace MWGui
 | 
			
		|||
        getWidget(mPlayerArrowLocal, "CompassLocal");
 | 
			
		||||
        getWidget(mPlayerArrowGlobal, "CompassGlobal");
 | 
			
		||||
 | 
			
		||||
        mPlayerArrowGlobal->setDepth(Global_CompassLayer);
 | 
			
		||||
        mPlayerArrowGlobal->setNeedMouseFocus(false);
 | 
			
		||||
        mGlobalMapImage->setDepth(Global_MapLayer);
 | 
			
		||||
        mGlobalMapOverlay->setDepth(Global_ExploreOverlayLayer);
 | 
			
		||||
 | 
			
		||||
        mLastScrollWindowCoordinates = mLocalMap->getCoord();
 | 
			
		||||
        mLocalMap->eventChangeCoord += MyGUI::newDelegate(this, &MapWindow::onChangeScrollWindowCoord);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -549,6 +609,8 @@ namespace MWGui
 | 
			
		|||
        getWidget(mEventBoxGlobal, "EventBoxGlobal");
 | 
			
		||||
        mEventBoxGlobal->eventMouseDrag += MyGUI::newDelegate(this, &MapWindow::onMouseDrag);
 | 
			
		||||
        mEventBoxGlobal->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
 | 
			
		||||
        mEventBoxGlobal->setDepth(Global_ExploreOverlayLayer);
 | 
			
		||||
 | 
			
		||||
        getWidget(mEventBoxLocal, "EventBoxLocal");
 | 
			
		||||
        mEventBoxLocal->eventMouseDrag += MyGUI::newDelegate(this, &MapWindow::onMouseDrag);
 | 
			
		||||
        mEventBoxLocal->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
 | 
			
		||||
| 
						 | 
				
			
			@ -672,34 +734,32 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
    void MapWindow::addVisitedLocation(const std::string& name, int x, int y)
 | 
			
		||||
    {
 | 
			
		||||
        float worldX, worldY;
 | 
			
		||||
        mGlobalMapRender->cellTopLeftCornerToImageSpace (x, y, worldX, worldY);
 | 
			
		||||
 | 
			
		||||
        MyGUI::IntCoord widgetCoord(
 | 
			
		||||
                    worldX * mGlobalMapRender->getWidth()+6,
 | 
			
		||||
                    worldY * mGlobalMapRender->getHeight()+6,
 | 
			
		||||
                    12, 12);
 | 
			
		||||
 | 
			
		||||
        static int _counter=0;
 | 
			
		||||
        MyGUI::Button* markerWidget = mGlobalMapOverlay->createWidget<MyGUI::Button>("ButtonImage",
 | 
			
		||||
            widgetCoord, MyGUI::Align::Default);
 | 
			
		||||
        markerWidget->setImageResource("DoorMarker");
 | 
			
		||||
        markerWidget->setUserString("ToolTipType", "Layout");
 | 
			
		||||
        markerWidget->setUserString("ToolTipLayout", "TextToolTipOneLine");
 | 
			
		||||
        markerWidget->setUserString("Caption_TextOneLine", name);
 | 
			
		||||
        ++_counter;
 | 
			
		||||
 | 
			
		||||
        markerWidget = mEventBoxGlobal->createWidget<MyGUI::Button>("",
 | 
			
		||||
            widgetCoord, MyGUI::Align::Default);
 | 
			
		||||
        markerWidget->setNeedMouseFocus (true);
 | 
			
		||||
        markerWidget->setUserString("ToolTipType", "Layout");
 | 
			
		||||
        markerWidget->setUserString("ToolTipLayout", "TextToolTipOneLine");
 | 
			
		||||
        markerWidget->setUserString("Caption_TextOneLine", name);
 | 
			
		||||
 | 
			
		||||
        CellId cell;
 | 
			
		||||
        cell.first = x;
 | 
			
		||||
        cell.second = y;
 | 
			
		||||
        mMarkers.push_back(cell);
 | 
			
		||||
        if (mMarkers.insert(cell).second)
 | 
			
		||||
        {
 | 
			
		||||
            float worldX, worldY;
 | 
			
		||||
            mGlobalMapRender->cellTopLeftCornerToImageSpace (x, y, worldX, worldY);
 | 
			
		||||
 | 
			
		||||
            int markerSize = 12;
 | 
			
		||||
            int offset = mGlobalMapRender->getCellSize()/2 - markerSize/2;
 | 
			
		||||
            MyGUI::IntCoord widgetCoord(
 | 
			
		||||
                        worldX * mGlobalMapRender->getWidth()+offset,
 | 
			
		||||
                        worldY * mGlobalMapRender->getHeight()+offset,
 | 
			
		||||
                        markerSize, markerSize);
 | 
			
		||||
 | 
			
		||||
            MyGUI::Widget* markerWidget = mGlobalMap->createWidget<MyGUI::Widget>("MarkerButton",
 | 
			
		||||
                widgetCoord, MyGUI::Align::Default);
 | 
			
		||||
            markerWidget->setNeedMouseFocus(true);
 | 
			
		||||
            markerWidget->setColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal}")));
 | 
			
		||||
            markerWidget->setUserString("ToolTipType", "Layout");
 | 
			
		||||
            markerWidget->setUserString("ToolTipLayout", "TextToolTipOneLine");
 | 
			
		||||
            markerWidget->setUserString("Caption_TextOneLine", name);
 | 
			
		||||
            markerWidget->setDepth(Global_MarkerLayer);
 | 
			
		||||
            markerWidget->eventMouseDrag += MyGUI::newDelegate(this, &MapWindow::onMouseDrag);
 | 
			
		||||
            markerWidget->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void MapWindow::cellExplored(int x, int y)
 | 
			
		||||
| 
						 | 
				
			
			@ -827,8 +887,6 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
        while (mEventBoxGlobal->getChildCount())
 | 
			
		||||
            MyGUI::Gui::getInstance().destroyWidget(mEventBoxGlobal->getChildAt(0));
 | 
			
		||||
        while (mGlobalMapOverlay->getChildCount())
 | 
			
		||||
            MyGUI::Gui::getInstance().destroyWidget(mGlobalMapOverlay->getChildAt(0));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void MapWindow::write(ESM::ESMWriter &writer, Loading::Listener& progress)
 | 
			
		||||
| 
						 | 
				
			
			@ -853,7 +911,7 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
            mGlobalMapRender->read(map);
 | 
			
		||||
 | 
			
		||||
            for (std::vector<ESM::GlobalMap::CellId>::iterator it = map.mMarkers.begin(); it != map.mMarkers.end(); ++it)
 | 
			
		||||
            for (std::set<ESM::GlobalMap::CellId>::iterator it = map.mMarkers.begin(); it != map.mMarkers.end(); ++it)
 | 
			
		||||
            {
 | 
			
		||||
                const ESM::Cell* cell = MWBase::Environment::get().getWorld()->getStore().get<ESM::Cell>().search(it->first, it->second);
 | 
			
		||||
                if (cell && !cell->mName.empty())
 | 
			
		||||
| 
						 | 
				
			
			@ -871,6 +929,19 @@ namespace MWGui
 | 
			
		|||
            (*it)->setVisible(alpha == 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void MapWindow::customMarkerCreated(MyGUI::Widget *marker)
 | 
			
		||||
    {
 | 
			
		||||
        marker->eventMouseDrag += MyGUI::newDelegate(this, &MapWindow::onMouseDrag);
 | 
			
		||||
        marker->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
 | 
			
		||||
        marker->eventMouseButtonDoubleClick += MyGUI::newDelegate(this, &MapWindow::onCustomMarkerDoubleClicked);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void MapWindow::doorMarkerCreated(MyGUI::Widget *marker)
 | 
			
		||||
    {
 | 
			
		||||
        marker->eventMouseDrag += MyGUI::newDelegate(this, &MapWindow::onMouseDrag);
 | 
			
		||||
        marker->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // -------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    EditNoteDialog::EditNoteDialog()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -119,7 +119,8 @@ namespace MWGui
 | 
			
		|||
        virtual void notifyPlayerUpdate() {}
 | 
			
		||||
        virtual void notifyMapChanged() {}
 | 
			
		||||
 | 
			
		||||
        virtual void onCustomMarkerDoubleClicked(MyGUI::Widget* sender) {}
 | 
			
		||||
        virtual void customMarkerCreated(MyGUI::Widget* marker) {}
 | 
			
		||||
        virtual void doorMarkerCreated(MyGUI::Widget* marker) {}
 | 
			
		||||
 | 
			
		||||
        void updateMagicMarkers();
 | 
			
		||||
        void addDetectionMarkers(int type);
 | 
			
		||||
| 
						 | 
				
			
			@ -199,6 +200,7 @@ namespace MWGui
 | 
			
		|||
        void onMouseDrag(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id);
 | 
			
		||||
        void onWorldButtonClicked(MyGUI::Widget* _sender);
 | 
			
		||||
        void onMapDoubleClicked(MyGUI::Widget* sender);
 | 
			
		||||
        void onCustomMarkerDoubleClicked(MyGUI::Widget* sender);
 | 
			
		||||
        void onNoteEditOk();
 | 
			
		||||
        void onNoteEditDelete();
 | 
			
		||||
        void onNoteEditDeleteConfirm();
 | 
			
		||||
| 
						 | 
				
			
			@ -219,7 +221,7 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
        // Markers on global map
 | 
			
		||||
        typedef std::pair<int, int> CellId;
 | 
			
		||||
        std::vector<CellId> mMarkers;
 | 
			
		||||
        std::set<CellId> mMarkers;
 | 
			
		||||
 | 
			
		||||
        // Cells that should be explored in the next frame (i.e. their map revealed on the global map)
 | 
			
		||||
        // We can't do this immediately, because the map update is not immediate either (see mNeedMapUpdate in scene.cpp)
 | 
			
		||||
| 
						 | 
				
			
			@ -235,7 +237,9 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
        virtual void onPinToggled();
 | 
			
		||||
        virtual void onTitleDoubleClicked();
 | 
			
		||||
        virtual void onCustomMarkerDoubleClicked(MyGUI::Widget* sender);
 | 
			
		||||
 | 
			
		||||
        virtual void doorMarkerCreated(MyGUI::Widget* marker);
 | 
			
		||||
        virtual void customMarkerCreated(MyGUI::Widget *marker);
 | 
			
		||||
 | 
			
		||||
        virtual void notifyPlayerUpdate();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -139,11 +139,6 @@ namespace MWGui
 | 
			
		|||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void MessageBoxManager::setMessageBoxSpeed (int speed)
 | 
			
		||||
    {
 | 
			
		||||
        mMessageBoxSpeed = speed;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int MessageBoxManager::readPressedButton ()
 | 
			
		||||
    {
 | 
			
		||||
        int pressed = mLastButtonPressed;
 | 
			
		||||
| 
						 | 
				
			
			@ -218,7 +213,6 @@ namespace MWGui
 | 
			
		|||
        MyGUI::IntSize gameWindowSize = MyGUI::RenderManager::getInstance().getViewSize();
 | 
			
		||||
 | 
			
		||||
        int biggestButtonWidth = 0;
 | 
			
		||||
        int buttonWidth = 0;
 | 
			
		||||
        int buttonsWidth = 0;
 | 
			
		||||
        int buttonsHeight = 0;
 | 
			
		||||
        int buttonHeight = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -241,7 +235,7 @@ namespace MWGui
 | 
			
		|||
            if (buttonsWidth != 0)
 | 
			
		||||
                buttonsWidth += buttonLeftPadding;
 | 
			
		||||
 | 
			
		||||
            buttonWidth = button->getTextSize().width + 2*buttonPadding;
 | 
			
		||||
            int buttonWidth = button->getTextSize().width + 2*buttonPadding;
 | 
			
		||||
            buttonsWidth += buttonWidth;
 | 
			
		||||
 | 
			
		||||
            buttonHeight = button->getTextSize().height + 2*buttonPadding;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,7 +34,6 @@ namespace MWGui
 | 
			
		|||
            void clear();
 | 
			
		||||
 | 
			
		||||
            bool removeMessageBox (MessageBox *msgbox);
 | 
			
		||||
            void setMessageBoxSpeed (int speed);
 | 
			
		||||
 | 
			
		||||
            int readPressedButton ();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -393,7 +393,6 @@ namespace MWGui
 | 
			
		|||
        if (mCurrentRaceId.empty())
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        Widgets::MWSpellPtr spellPowerWidget;
 | 
			
		||||
        const int lineHeight = 18;
 | 
			
		||||
        MyGUI::IntCoord coord(0, 0, mSpellPowerList->getWidth(), 18);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -405,7 +404,7 @@ namespace MWGui
 | 
			
		|||
        for (int i = 0; it != end; ++it)
 | 
			
		||||
        {
 | 
			
		||||
            const std::string &spellpower = *it;
 | 
			
		||||
            spellPowerWidget = mSpellPowerList->createWidget<Widgets::MWSpell>("MW_StatName", coord, MyGUI::Align::Default, std::string("SpellPower") + boost::lexical_cast<std::string>(i));
 | 
			
		||||
            Widgets::MWSpellPtr spellPowerWidget = mSpellPowerList->createWidget<Widgets::MWSpell>("MW_StatName", coord, MyGUI::Align::Default, std::string("SpellPower") + boost::lexical_cast<std::string>(i));
 | 
			
		||||
            spellPowerWidget->setSpellId(spellpower);
 | 
			
		||||
            spellPowerWidget->setUserString("ToolTipType", "Spell");
 | 
			
		||||
            spellPowerWidget->setUserString("Spell", spellpower);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -362,8 +362,7 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
    void SettingsWindow::onShaderModeToggled(MyGUI::Widget* _sender)
 | 
			
		||||
    {
 | 
			
		||||
        std::string val = _sender->castType<MyGUI::Button>()->getCaption();
 | 
			
		||||
        val = hlslGlsl();
 | 
			
		||||
        std::string val = hlslGlsl();
 | 
			
		||||
 | 
			
		||||
        _sender->castType<MyGUI::Button>()->setCaption(val);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,6 +39,7 @@ namespace MWGui
 | 
			
		|||
    EditEffectDialog::EditEffectDialog()
 | 
			
		||||
        : WindowModal("openmw_edit_effect.layout")
 | 
			
		||||
        , mEditing(false)
 | 
			
		||||
        , mMagicEffect(NULL)
 | 
			
		||||
    {
 | 
			
		||||
        getWidget(mCancelButton, "CancelButton");
 | 
			
		||||
        getWidget(mOkButton, "OkButton");
 | 
			
		||||
| 
						 | 
				
			
			@ -181,7 +182,7 @@ namespace MWGui
 | 
			
		|||
        {
 | 
			
		||||
            mAreaBox->setPosition(mAreaBox->getPosition().left, curY);
 | 
			
		||||
            mAreaBox->setVisible (true);
 | 
			
		||||
            curY += mAreaBox->getSize().height;
 | 
			
		||||
            //curY += mAreaBox->getSize().height;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -158,8 +158,6 @@ namespace MWGui
 | 
			
		|||
        MyGUI::Button* mCancelButton;
 | 
			
		||||
        MyGUI::TextBox* mPriceLabel;
 | 
			
		||||
 | 
			
		||||
        Widgets::MWEffectList* mUsedEffectsList;
 | 
			
		||||
 | 
			
		||||
        ESM::Spell mSpell;
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -225,11 +225,10 @@ namespace MWGui
 | 
			
		|||
            const ESM::Spell *spell = store.get<ESM::Spell>().search(mId);
 | 
			
		||||
            MYGUI_ASSERT(spell, "spell with id '" << mId << "' not found");
 | 
			
		||||
 | 
			
		||||
            MWSpellEffectPtr effect = NULL;
 | 
			
		||||
            std::vector<ESM::ENAMstruct>::const_iterator end = spell->mEffects.mList.end();
 | 
			
		||||
            for (std::vector<ESM::ENAMstruct>::const_iterator it = spell->mEffects.mList.begin(); it != end; ++it)
 | 
			
		||||
            {
 | 
			
		||||
                effect = creator->createWidget<MWSpellEffect>("MW_EffectImage", coord, MyGUI::Align::Default);
 | 
			
		||||
                MWSpellEffectPtr effect = creator->createWidget<MWSpellEffect>("MW_EffectImage", coord, MyGUI::Align::Default);
 | 
			
		||||
                SpellEffectParams params;
 | 
			
		||||
                params.mEffectID = it->mEffectID;
 | 
			
		||||
                params.mSkill = it->mSkill;
 | 
			
		||||
| 
						 | 
				
			
			@ -565,22 +564,6 @@ namespace MWGui
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void MWScrollBar::setEnableRepeat(bool enable)
 | 
			
		||||
        {
 | 
			
		||||
            mEnableRepeat = enable;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool MWScrollBar::getEnableRepeat()
 | 
			
		||||
        {
 | 
			
		||||
            return mEnableRepeat;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void MWScrollBar::getRepeat(float &trigger, float &step)
 | 
			
		||||
        {
 | 
			
		||||
            trigger = mRepeatTriggerTime;
 | 
			
		||||
            step = mRepeatStepTime;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void MWScrollBar::setRepeat(float trigger, float step)
 | 
			
		||||
        {
 | 
			
		||||
            mRepeatTriggerTime = trigger;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -307,9 +307,6 @@ namespace MWGui
 | 
			
		|||
            MWScrollBar();
 | 
			
		||||
            virtual ~MWScrollBar();
 | 
			
		||||
 | 
			
		||||
            void setEnableRepeat(bool enable);
 | 
			
		||||
            bool getEnableRepeat();
 | 
			
		||||
            void getRepeat(float &trigger, float &step);
 | 
			
		||||
            void setRepeat(float trigger, float step);
 | 
			
		||||
 | 
			
		||||
        protected:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1348,12 +1348,6 @@ namespace MWGui
 | 
			
		|||
        return mSubtitlesEnabled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void WindowManager::toggleHud ()
 | 
			
		||||
    {
 | 
			
		||||
        mHudEnabled = !mHudEnabled;
 | 
			
		||||
        mHud->setVisible (mHudEnabled);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool WindowManager::toggleGui()
 | 
			
		||||
    {
 | 
			
		||||
        mGuiEnabled = !mGuiEnabled;
 | 
			
		||||
| 
						 | 
				
			
			@ -1669,7 +1663,7 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
    WindowModal* WindowManager::getCurrentModal() const
 | 
			
		||||
    {
 | 
			
		||||
        if(mCurrentModals.size() > 0)
 | 
			
		||||
        if(!mCurrentModals.empty())
 | 
			
		||||
            return mCurrentModals.top();
 | 
			
		||||
        else
 | 
			
		||||
            return NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -1679,7 +1673,7 @@ namespace MWGui
 | 
			
		|||
    {
 | 
			
		||||
        // Only remove the top if it matches the current pointer. A lot of things hide their visibility before showing it,
 | 
			
		||||
        //so just popping the top would cause massive issues.
 | 
			
		||||
        if(mCurrentModals.size() > 0)
 | 
			
		||||
        if(!mCurrentModals.empty())
 | 
			
		||||
            if(input == mCurrentModals.top())
 | 
			
		||||
                mCurrentModals.pop();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -222,7 +222,6 @@ namespace MWGui
 | 
			
		|||
 | 
			
		||||
    virtual void showCrosshair(bool show);
 | 
			
		||||
    virtual bool getSubtitlesEnabled();
 | 
			
		||||
    virtual void toggleHud();
 | 
			
		||||
 | 
			
		||||
    /// Turn visibility of *all* GUI elements on or off (HUD and all windows, except the console)
 | 
			
		||||
    virtual bool toggleGui();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -323,8 +323,9 @@ namespace MWMechanics
 | 
			
		|||
        for (std::list<MWWorld::Ptr>::const_iterator it = followers.begin(); it != followers.end(); ++it)
 | 
			
		||||
        {
 | 
			
		||||
            // need to check both ways since player doesn't use AI packages
 | 
			
		||||
            if (creatureStats2.getAiSequence().isInCombat(*it)
 | 
			
		||||
            if ((creatureStats2.getAiSequence().isInCombat(*it)
 | 
			
		||||
                    || it->getClass().getCreatureStats(*it).getAiSequence().isInCombat(actor2))
 | 
			
		||||
                    && !creatureStats.getAiSequence().isInCombat(*it))
 | 
			
		||||
                aggressive = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -337,6 +338,9 @@ namespace MWMechanics
 | 
			
		|||
                if (followTarget.isEmpty())
 | 
			
		||||
                    continue;
 | 
			
		||||
 | 
			
		||||
                if (creatureStats.getAiSequence().isInCombat(followTarget))
 | 
			
		||||
                    continue;
 | 
			
		||||
 | 
			
		||||
                // need to check both ways since player doesn't use AI packages
 | 
			
		||||
                if (creatureStats2.getAiSequence().isInCombat(followTarget)
 | 
			
		||||
                        || followTarget.getClass().getCreatureStats(followTarget).getAiSequence().isInCombat(actor2))
 | 
			
		||||
| 
						 | 
				
			
			@ -1232,14 +1236,14 @@ namespace MWMechanics
 | 
			
		|||
            }
 | 
			
		||||
 | 
			
		||||
            static float sneakTimer = 0.f; // times update of sneak icon
 | 
			
		||||
            static float sneakSkillTimer = 0.f; // times sneak skill progress from "avoid notice"
 | 
			
		||||
 | 
			
		||||
            // if player is in sneak state see if anyone detects him
 | 
			
		||||
            if (player.getClass().getCreatureStats(player).getMovementFlag(MWMechanics::CreatureStats::Flag_Sneak))
 | 
			
		||||
            {
 | 
			
		||||
                static float sneakSkillTimer = 0.f; // times sneak skill progress from "avoid notice"
 | 
			
		||||
 | 
			
		||||
                const MWWorld::ESMStore& esmStore = MWBase::Environment::get().getWorld()->getStore();
 | 
			
		||||
                const int radius = esmStore.get<ESM::GameSetting>().find("fSneakUseDist")->getInt();
 | 
			
		||||
                bool detected = false;
 | 
			
		||||
 | 
			
		||||
                static float fSneakUseDelay = esmStore.get<ESM::GameSetting>().find("fSneakUseDelay")->getFloat();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1251,6 +1255,8 @@ namespace MWMechanics
 | 
			
		|||
                    // Set when an NPC is within line of sight and distance, but is still unaware. Used for skill progress.
 | 
			
		||||
                    bool avoidedNotice = false;
 | 
			
		||||
 | 
			
		||||
                    bool detected = false;
 | 
			
		||||
 | 
			
		||||
                    for (PtrControllerMap::iterator iter(mActors.begin()); iter != mActors.end(); ++iter)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (iter->first == player)  // not the player
 | 
			
		||||
| 
						 | 
				
			
			@ -1418,7 +1424,7 @@ namespace MWMechanics
 | 
			
		|||
    std::list<MWWorld::Ptr> Actors::getActorsFollowing(const MWWorld::Ptr& actor)
 | 
			
		||||
    {
 | 
			
		||||
        std::list<MWWorld::Ptr> list;
 | 
			
		||||
        for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();iter++)
 | 
			
		||||
        for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();++iter)
 | 
			
		||||
        {
 | 
			
		||||
            const MWWorld::Class &cls = iter->first.getClass();
 | 
			
		||||
            CreatureStats &stats = cls.getCreatureStats(iter->first);
 | 
			
		||||
| 
						 | 
				
			
			@ -1450,7 +1456,7 @@ namespace MWMechanics
 | 
			
		|||
        getObjectsInRange(position,
 | 
			
		||||
            MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("fAlarmRadius")->getFloat(),
 | 
			
		||||
            neighbors); //only care about those within the alarm disance
 | 
			
		||||
        for(std::vector<MWWorld::Ptr>::iterator iter(neighbors.begin());iter != neighbors.end();iter++)
 | 
			
		||||
        for(std::vector<MWWorld::Ptr>::iterator iter(neighbors.begin());iter != neighbors.end();++iter)
 | 
			
		||||
        {
 | 
			
		||||
            const MWWorld::Class &cls = iter->getClass();
 | 
			
		||||
            CreatureStats &stats = cls.getCreatureStats(*iter);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,8 +35,6 @@ namespace MWMechanics
 | 
			
		|||
 | 
			
		||||
        private:
 | 
			
		||||
            std::string mObjectId;
 | 
			
		||||
            int mCellX;
 | 
			
		||||
            int mCellY;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
#endif // GAME_MWMECHANICS_AIACTIVATE_H
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,7 +64,7 @@ bool MWMechanics::AiAvoidDoor::execute (const MWWorld::Ptr& actor,float duration
 | 
			
		|||
    // Make all nearby actors also avoid the door
 | 
			
		||||
    std::vector<MWWorld::Ptr> actors;
 | 
			
		||||
    MWBase::Environment::get().getMechanicsManager()->getActorsInRange(Ogre::Vector3(pos.pos[0],pos.pos[1],pos.pos[2]),100,actors);
 | 
			
		||||
    for(std::vector<MWWorld::Ptr>::iterator it = actors.begin(); it != actors.end(); it++) {
 | 
			
		||||
    for(std::vector<MWWorld::Ptr>::iterator it = actors.begin(); it != actors.end(); ++it) {
 | 
			
		||||
        if(*it != MWBase::Environment::get().getWorld()->getPlayerPtr()) { //Not the player
 | 
			
		||||
            MWMechanics::AiSequence& seq = it->getClass().getCreatureStats(*it).getAiSequence();
 | 
			
		||||
            if(seq.getTypeId() != MWMechanics::AiPackage::TypeIdAvoidDoor) { //Only add it once
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -301,18 +301,20 @@ namespace MWMechanics
 | 
			
		|||
            if (!target.isEmpty() && target.getClass().getCreatureStats(target).getAttribute(effect.mAttribute).getModified() <= 0)
 | 
			
		||||
                return 0.f;
 | 
			
		||||
            {
 | 
			
		||||
                const float attributePriorities[ESM::Attribute::Length] = {
 | 
			
		||||
                    1.f, // Strength
 | 
			
		||||
                    0.5, // Intelligence
 | 
			
		||||
                    0.6, // Willpower
 | 
			
		||||
                    0.7, // Agility
 | 
			
		||||
                    0.5, // Speed
 | 
			
		||||
                    0.8, // Endurance
 | 
			
		||||
                    0.7, // Personality
 | 
			
		||||
                    0.3 // Luck
 | 
			
		||||
                };
 | 
			
		||||
                if (effect.mAttribute >= 0 && effect.mAttribute < ESM::Attribute::Length)
 | 
			
		||||
                {
 | 
			
		||||
                    const float attributePriorities[ESM::Attribute::Length] = {
 | 
			
		||||
                        1.f, // Strength
 | 
			
		||||
                        0.5, // Intelligence
 | 
			
		||||
                        0.6, // Willpower
 | 
			
		||||
                        0.7, // Agility
 | 
			
		||||
                        0.5, // Speed
 | 
			
		||||
                        0.8, // Endurance
 | 
			
		||||
                        0.7, // Personality
 | 
			
		||||
                        0.3 // Luck
 | 
			
		||||
                    };
 | 
			
		||||
                    rating *= attributePriorities[effect.mAttribute];
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,6 +54,7 @@ namespace MWMechanics
 | 
			
		|||
        , mCellY(std::numeric_limits<int>::max())
 | 
			
		||||
        , mCellId(escort->mCellId)
 | 
			
		||||
        , mRemainingDuration(escort->mRemainingDuration)
 | 
			
		||||
        , mMaxDist(450)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,7 +69,6 @@ namespace MWMechanics
 | 
			
		|||
            PathFinder mPathFinder;
 | 
			
		||||
            ObstacleCheck mObstacleCheck;
 | 
			
		||||
 | 
			
		||||
            float mDoorCheckDuration;
 | 
			
		||||
            float mTimer;
 | 
			
		||||
            float mStuckTimer;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,8 +41,6 @@ namespace MWMechanics
 | 
			
		|||
        private:
 | 
			
		||||
 | 
			
		||||
            int mTargetActorId; // The actor to pursue
 | 
			
		||||
            int mCellX;
 | 
			
		||||
            int mCellY;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,9 +31,11 @@ void AiSequence::copy (const AiSequence& sequence)
 | 
			
		|||
 | 
			
		||||
AiSequence::AiSequence() : mDone (false), mLastAiPackage(-1) {}
 | 
			
		||||
 | 
			
		||||
AiSequence::AiSequence (const AiSequence& sequence) : mDone (false)
 | 
			
		||||
AiSequence::AiSequence (const AiSequence& sequence)
 | 
			
		||||
{
 | 
			
		||||
    copy (sequence);
 | 
			
		||||
    mDone = sequence.mDone;
 | 
			
		||||
    mLastAiPackage = sequence.mLastAiPackage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AiSequence& AiSequence::operator= (const AiSequence& sequence)
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +45,7 @@ AiSequence& AiSequence::operator= (const AiSequence& sequence)
 | 
			
		|||
        clear();
 | 
			
		||||
        copy (sequence);
 | 
			
		||||
        mDone = sequence.mDone;
 | 
			
		||||
        mLastAiPackage = sequence.mLastAiPackage;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return *this;
 | 
			
		||||
| 
						 | 
				
			
			@ -120,33 +123,6 @@ bool AiSequence::isInCombat(const MWWorld::Ptr &actor) const
 | 
			
		|||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool AiSequence::canAddTarget(const ESM::Position& actorPos, float distToTarget) const
 | 
			
		||||
{
 | 
			
		||||
    bool firstCombatFound = false;
 | 
			
		||||
    MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
 | 
			
		||||
 | 
			
		||||
    for(std::list<AiPackage*>::const_iterator it = mPackages.begin(); it != mPackages.end(); ++it)
 | 
			
		||||
    {
 | 
			
		||||
        if ((*it)->getTypeId() == AiPackage::TypeIdCombat)
 | 
			
		||||
        {
 | 
			
		||||
            firstCombatFound = true;
 | 
			
		||||
 | 
			
		||||
            const AiCombat *combat = static_cast<const AiCombat *>(*it);
 | 
			
		||||
            if (combat->getTarget() != player ) return false; // only 1 non-player target allowed
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                // add new target only if current target (player) is farther
 | 
			
		||||
                const ESM::Position &targetPos = combat->getTarget().getRefData().getPosition();
 | 
			
		||||
 | 
			
		||||
                float distToCurrTarget = (Ogre::Vector3(targetPos.pos) - Ogre::Vector3(actorPos.pos)).length();
 | 
			
		||||
                return (distToCurrTarget > distToTarget);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else if (firstCombatFound) break; // assumes combat packages go one-by-one in packages list
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AiSequence::stopCombat()
 | 
			
		||||
{
 | 
			
		||||
    while (getTypeId() == AiPackage::TypeIdCombat)
 | 
			
		||||
| 
						 | 
				
			
			@ -295,11 +271,6 @@ void AiSequence::stack (const AiPackage& package, const MWWorld::Ptr& actor)
 | 
			
		|||
        mPackages.push_front (package.clone());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AiSequence::queue (const AiPackage& package)
 | 
			
		||||
{
 | 
			
		||||
    mPackages.push_back (package.clone());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AiPackage* MWMechanics::AiSequence::getActivePackage()
 | 
			
		||||
{
 | 
			
		||||
    if(mPackages.empty())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,10 +98,6 @@ namespace MWMechanics
 | 
			
		|||
                @param actor The actor that owns this AiSequence **/
 | 
			
		||||
            void stack (const AiPackage& package, const MWWorld::Ptr& actor);
 | 
			
		||||
 | 
			
		||||
            /// Add \a package to the end of the sequence
 | 
			
		||||
            /** Executed after all other packages have been completed **/
 | 
			
		||||
            void queue (const AiPackage& package);
 | 
			
		||||
 | 
			
		||||
            /// Return the current active package.
 | 
			
		||||
            /** If there is no active package, it will throw an exception **/
 | 
			
		||||
            AiPackage* getActivePackage();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -686,16 +686,15 @@ namespace MWMechanics
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    AiWander::AiWander (const ESM::AiSequence::AiWander* wander)
 | 
			
		||||
        : mDistance(wander->mData.mDistance)
 | 
			
		||||
        , mDuration(wander->mData.mDuration)
 | 
			
		||||
        , mStartTime(MWWorld::TimeStamp(wander->mStartTime))
 | 
			
		||||
        , mTimeOfDay(wander->mData.mTimeOfDay)
 | 
			
		||||
        , mRepeat(wander->mData.mShouldRepeat)
 | 
			
		||||
    {
 | 
			
		||||
        mDistance = wander->mData.mDistance;
 | 
			
		||||
        mDuration = wander->mData.mDuration;
 | 
			
		||||
        mStartTime = MWWorld::TimeStamp(wander->mStartTime);
 | 
			
		||||
        mTimeOfDay = wander->mData.mTimeOfDay;
 | 
			
		||||
        for (int i=0; i<8; ++i)
 | 
			
		||||
            mIdle.push_back(wander->mData.mIdle[i]);
 | 
			
		||||
 | 
			
		||||
        mRepeat = wander->mData.mShouldRepeat;
 | 
			
		||||
 | 
			
		||||
        init();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,11 @@
 | 
			
		|||
#include "creaturestats.hpp"
 | 
			
		||||
#include "npcstats.hpp"
 | 
			
		||||
 | 
			
		||||
MWMechanics::Alchemy::Alchemy()
 | 
			
		||||
    : mValue(0)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::set<MWMechanics::EffectKey> MWMechanics::Alchemy::listEffects() const
 | 
			
		||||
{
 | 
			
		||||
    std::map<EffectKey, int> effects;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,8 @@ namespace MWMechanics
 | 
			
		|||
    {
 | 
			
		||||
        public:
 | 
			
		||||
 | 
			
		||||
            Alchemy();
 | 
			
		||||
 | 
			
		||||
            typedef std::vector<MWWorld::Ptr> TToolsContainer;
 | 
			
		||||
            typedef TToolsContainer::const_iterator TToolsIterator;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -193,13 +193,11 @@ namespace MWMechanics
 | 
			
		|||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        float damage = 0.0f;
 | 
			
		||||
 | 
			
		||||
        float fDamageStrengthBase = gmst.find("fDamageStrengthBase")->getFloat();
 | 
			
		||||
        float fDamageStrengthMult = gmst.find("fDamageStrengthMult")->getFloat();
 | 
			
		||||
 | 
			
		||||
        const unsigned char* attack = weapon.get<ESM::Weapon>()->mBase->mData.mChop;
 | 
			
		||||
        damage = attack[0] + ((attack[1]-attack[0])*attackerStats.getAttackStrength()); // Bow/crossbow damage
 | 
			
		||||
        float damage = attack[0] + ((attack[1]-attack[0])*attackerStats.getAttackStrength()); // Bow/crossbow damage
 | 
			
		||||
        if (weapon != projectile)
 | 
			
		||||
        {
 | 
			
		||||
            // Arrow/bolt damage
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -120,11 +120,6 @@ namespace MWMechanics
 | 
			
		|||
        return mSpells;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void CreatureStats::setSpells(const Spells &spells)
 | 
			
		||||
    {
 | 
			
		||||
        mSpells = spells;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ActiveSpells &CreatureStats::getActiveSpells()
 | 
			
		||||
    {
 | 
			
		||||
        return mActiveSpells;
 | 
			
		||||
| 
						 | 
				
			
			@ -200,11 +195,6 @@ namespace MWMechanics
 | 
			
		|||
        mLevel = level;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void CreatureStats::setActiveSpells(const ActiveSpells &active)
 | 
			
		||||
    {
 | 
			
		||||
        mActiveSpells = active;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void CreatureStats::modifyMagicEffects(const MagicEffects &effects)
 | 
			
		||||
    {
 | 
			
		||||
        if (effects.get(ESM::MagicEffect::FortifyMaximumMagicka).getModifier()
 | 
			
		||||
| 
						 | 
				
			
			@ -536,7 +526,6 @@ namespace MWMechanics
 | 
			
		|||
 | 
			
		||||
        mLastRestock = MWWorld::TimeStamp(state.mTradeTime);
 | 
			
		||||
        mGoldPool = state.mGoldPool;
 | 
			
		||||
        mFallHeight = state.mFallHeight;
 | 
			
		||||
 | 
			
		||||
        mDead = state.mDead;
 | 
			
		||||
        mDied = state.mDied;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,6 @@ namespace MWMechanics
 | 
			
		|||
        bool mTalkedTo;
 | 
			
		||||
        bool mAlarmed;
 | 
			
		||||
        bool mAttacked;
 | 
			
		||||
        bool mHostile;
 | 
			
		||||
        bool mAttackingOrSpell;
 | 
			
		||||
        bool mKnockdown;
 | 
			
		||||
        bool mKnockdownOneFrame;
 | 
			
		||||
| 
						 | 
				
			
			@ -138,10 +137,6 @@ namespace MWMechanics
 | 
			
		|||
 | 
			
		||||
        void setDynamic (int index, const DynamicStat<float> &value);
 | 
			
		||||
 | 
			
		||||
        void setSpells(const Spells &spells);
 | 
			
		||||
 | 
			
		||||
        void setActiveSpells(const ActiveSpells &active);
 | 
			
		||||
 | 
			
		||||
        /// Set Modifier for each magic effect according to \a effects. Does not touch Base values.
 | 
			
		||||
        void modifyMagicEffects(const MagicEffects &effects);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -166,16 +166,15 @@ namespace MWMechanics
 | 
			
		|||
 | 
			
		||||
        float enchantmentCost = 0;
 | 
			
		||||
        int effectsLeftCnt = mEffects.size();
 | 
			
		||||
        float baseCost, magnitudeCost, areaCost;
 | 
			
		||||
        int magMin, magMax, area;
 | 
			
		||||
        for (std::vector<ESM::ENAMstruct>::const_iterator it = mEffects.begin(); it != mEffects.end(); ++it)
 | 
			
		||||
        {
 | 
			
		||||
            baseCost = (store.get<ESM::MagicEffect>().find(it->mEffectID))->mData.mBaseCost;
 | 
			
		||||
            float baseCost = (store.get<ESM::MagicEffect>().find(it->mEffectID))->mData.mBaseCost;
 | 
			
		||||
            // To reflect vanilla behavior
 | 
			
		||||
            magMin = (it->mMagnMin == 0) ? 1 : it->mMagnMin;
 | 
			
		||||
            magMax = (it->mMagnMax == 0) ? 1 : it->mMagnMax;
 | 
			
		||||
            area = (it->mArea == 0) ? 1 : it->mArea;
 | 
			
		||||
            int magMin = (it->mMagnMin == 0) ? 1 : it->mMagnMin;
 | 
			
		||||
            int magMax = (it->mMagnMax == 0) ? 1 : it->mMagnMax;
 | 
			
		||||
            int area = (it->mArea == 0) ? 1 : it->mArea;
 | 
			
		||||
 | 
			
		||||
            float magnitudeCost = 0;
 | 
			
		||||
            if (mCastStyle == ESM::Enchantment::ConstantEffect)
 | 
			
		||||
            {
 | 
			
		||||
                magnitudeCost = (magMin + magMax) * baseCost * 2.5;
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +186,7 @@ namespace MWMechanics
 | 
			
		|||
                    magnitudeCost *= 1.5;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            areaCost = area * 0.025 * baseCost;
 | 
			
		||||
            float areaCost = area * 0.025 * baseCost;
 | 
			
		||||
            if (it->mRange == ESM::RT_Target)
 | 
			
		||||
                areaCost *= 1.5;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1111,10 +1111,10 @@ namespace MWMechanics
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void MechanicsManager::actorAttacked(const MWWorld::Ptr &ptr, const MWWorld::Ptr &attacker)
 | 
			
		||||
    bool MechanicsManager::actorAttacked(const MWWorld::Ptr &ptr, const MWWorld::Ptr &attacker)
 | 
			
		||||
    {
 | 
			
		||||
        if (ptr == MWBase::Environment::get().getWorld()->getPlayerPtr())
 | 
			
		||||
            return;
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        std::list<MWWorld::Ptr> followers = getActorsFollowing(attacker);
 | 
			
		||||
        if (std::find(followers.begin(), followers.end(), ptr) != followers.end())
 | 
			
		||||
| 
						 | 
				
			
			@ -1124,7 +1124,7 @@ namespace MWMechanics
 | 
			
		|||
            if (ptr.getClass().getCreatureStats(ptr).getFriendlyHits() < 4)
 | 
			
		||||
            {
 | 
			
		||||
                MWBase::Environment::get().getDialogueManager()->say(ptr, "hit");
 | 
			
		||||
                return;
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1153,6 +1153,8 @@ namespace MWMechanics
 | 
			
		|||
            // Note: accidental or collateral damage attacks are ignored.
 | 
			
		||||
            startCombat(ptr, attacker);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool MechanicsManager::awarenessCheck(const MWWorld::Ptr &ptr, const MWWorld::Ptr &observer)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -120,7 +120,8 @@ namespace MWMechanics
 | 
			
		|||
                                      OffenseType type, int arg=0);
 | 
			
		||||
            virtual void reportCrime (const MWWorld::Ptr& ptr, const MWWorld::Ptr& victim,
 | 
			
		||||
                                      OffenseType type, int arg=0);
 | 
			
		||||
            virtual void actorAttacked (const MWWorld::Ptr& victim, const MWWorld::Ptr& attacker);
 | 
			
		||||
            /// @return false if the attack was considered a "friendly hit" and forgiven
 | 
			
		||||
            virtual bool actorAttacked (const MWWorld::Ptr& victim, const MWWorld::Ptr& attacker);
 | 
			
		||||
            /// Utility to check if taking this item is illegal and calling commitCrime if so
 | 
			
		||||
            virtual void itemTaken (const MWWorld::Ptr& ptr, const MWWorld::Ptr& item, int count);
 | 
			
		||||
            /// Utility to check if opening (i.e. unlocking) this object is illegal and calling commitCrime if so
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -283,13 +283,6 @@ namespace MWMechanics
 | 
			
		|||
        return Ogre::Radian(Ogre::Math::ACos(directionY / directionResult) * sgn(Ogre::Math::ASin(directionX / directionResult))).valueDegrees();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Used by AiCombat, use Euclidean distance
 | 
			
		||||
    float PathFinder::getDistToNext(float x, float y, float z)
 | 
			
		||||
    {
 | 
			
		||||
        ESM::Pathgrid::Point nextPoint = *mPath.begin();
 | 
			
		||||
        return distance(nextPoint, x, y, z);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool PathFinder::checkWaypoint(float x, float y, float z)
 | 
			
		||||
    {
 | 
			
		||||
        if(mPath.empty())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,8 +47,6 @@ namespace MWMechanics
 | 
			
		|||
 | 
			
		||||
            float getZAngleToNext(float x, float y) const;
 | 
			
		||||
 | 
			
		||||
            float getDistToNext(float x, float y, float z);
 | 
			
		||||
 | 
			
		||||
            bool isPathConstructed() const
 | 
			
		||||
            {
 | 
			
		||||
                return mIsPathConstructed;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -521,7 +521,7 @@ float Animation::getVelocity(const std::string &groupname) const
 | 
			
		|||
{
 | 
			
		||||
    /* Look in reverse; last-inserted source has priority. */
 | 
			
		||||
    AnimSourceList::const_reverse_iterator animsrc(mAnimSources.rbegin());
 | 
			
		||||
    for(;animsrc != mAnimSources.rend();animsrc++)
 | 
			
		||||
    for(;animsrc != mAnimSources.rend();++animsrc)
 | 
			
		||||
    {
 | 
			
		||||
        const NifOgre::TextKeyMap &keys = (*animsrc)->mTextKeys;
 | 
			
		||||
        if(findGroupStart(keys, groupname) != keys.end())
 | 
			
		||||
| 
						 | 
				
			
			@ -831,8 +831,7 @@ void Animation::handleTextKey(AnimState &state, const std::string &groupname, co
 | 
			
		|||
 | 
			
		||||
void Animation::changeGroups(const std::string &groupname, int groups)
 | 
			
		||||
{
 | 
			
		||||
    AnimStateMap::iterator stateiter = mStates.begin();
 | 
			
		||||
    stateiter = mStates.find(groupname);
 | 
			
		||||
    AnimStateMap::iterator stateiter = mStates.find(groupname);
 | 
			
		||||
    if(stateiter != mStates.end())
 | 
			
		||||
    {
 | 
			
		||||
        if(stateiter->second.mGroups != groups)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,6 @@ namespace MWRender
 | 
			
		|||
      mNearest(30.f),
 | 
			
		||||
      mFurthest(800.f),
 | 
			
		||||
      mIsNearest(false),
 | 
			
		||||
      mIsFurthest(false),
 | 
			
		||||
      mHeight(128.f),
 | 
			
		||||
      mCameraDistance(300.f),
 | 
			
		||||
      mDistanceAdjusted(false),
 | 
			
		||||
| 
						 | 
				
			
			@ -292,7 +291,6 @@ namespace MWRender
 | 
			
		|||
        if(mFirstPersonView && !mPreviewMode && !mVanity.enabled)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        mIsFurthest = false;
 | 
			
		||||
        mIsNearest = false;
 | 
			
		||||
 | 
			
		||||
        Ogre::Vector3 v(0.f, 0.f, dist);
 | 
			
		||||
| 
						 | 
				
			
			@ -301,7 +299,6 @@ namespace MWRender
 | 
			
		|||
        }
 | 
			
		||||
        if (v.z >= mFurthest) {
 | 
			
		||||
            v.z = mFurthest;
 | 
			
		||||
            mIsFurthest = true;
 | 
			
		||||
        } else if (!override && v.z < 10.f) {
 | 
			
		||||
            v.z = 10.f;
 | 
			
		||||
        } else if (override && v.z <= mNearest) {
 | 
			
		||||
| 
						 | 
				
			
			@ -389,9 +386,4 @@ namespace MWRender
 | 
			
		|||
    {
 | 
			
		||||
        return mIsNearest;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool Camera::isFurthest()
 | 
			
		||||
    {
 | 
			
		||||
        return mIsFurthest;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,6 @@ namespace MWRender
 | 
			
		|||
        float mNearest;
 | 
			
		||||
        float mFurthest;
 | 
			
		||||
        bool mIsNearest;
 | 
			
		||||
        bool mIsFurthest;
 | 
			
		||||
 | 
			
		||||
        struct {
 | 
			
		||||
            bool enabled, allowed;
 | 
			
		||||
| 
						 | 
				
			
			@ -118,8 +117,6 @@ namespace MWRender
 | 
			
		|||
        bool isVanityOrPreviewModeEnabled();
 | 
			
		||||
 | 
			
		||||
        bool isNearest();
 | 
			
		||||
 | 
			
		||||
        bool isFurthest();
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -281,9 +281,9 @@ namespace MWRender
 | 
			
		|||
    RaceSelectionPreview::RaceSelectionPreview()
 | 
			
		||||
        : CharacterPreview(MWBase::Environment::get().getWorld()->getPlayerPtr(),
 | 
			
		||||
            512, 512, "CharacterHeadPreview", Ogre::Vector3(0, 6, -35), Ogre::Vector3(0,125,0))
 | 
			
		||||
        , mBase (*mCharacter.get<ESM::NPC>()->mBase)
 | 
			
		||||
        , mRef(&mBase)
 | 
			
		||||
    {
 | 
			
		||||
        mBase = *mCharacter.get<ESM::NPC>()->mBase;
 | 
			
		||||
        mCharacter = MWWorld::Ptr(&mRef, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -150,7 +150,7 @@ void CreatureWeaponAnimation::updatePart(NifOgre::ObjectScenePtr& scene, int slo
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    std::vector<Ogre::Controller<Ogre::Real> >::iterator ctrl(scene->mControllers.begin());
 | 
			
		||||
    for(;ctrl != scene->mControllers.end();ctrl++)
 | 
			
		||||
    for(;ctrl != scene->mControllers.end();++ctrl)
 | 
			
		||||
    {
 | 
			
		||||
        if(ctrl->getSource().isNull())
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ namespace MWRender
 | 
			
		|||
        , mWidth(0)
 | 
			
		||||
        , mHeight(0)
 | 
			
		||||
    {
 | 
			
		||||
        mCellSize = Settings::Manager::getInt("global map cell size", "Map");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    GlobalMap::~GlobalMap()
 | 
			
		||||
| 
						 | 
				
			
			@ -57,9 +58,8 @@ namespace MWRender
 | 
			
		|||
                mMaxY = it->getGridY();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        int cellSize = 24;
 | 
			
		||||
        mWidth = cellSize*(mMaxX-mMinX+1);
 | 
			
		||||
        mHeight = cellSize*(mMaxY-mMinY+1);
 | 
			
		||||
        mWidth = mCellSize*(mMaxX-mMinX+1);
 | 
			
		||||
        mHeight = mCellSize*(mMaxY-mMinY+1);
 | 
			
		||||
 | 
			
		||||
        loadingListener->loadingOn();
 | 
			
		||||
        loadingListener->setLabel("Creating map");
 | 
			
		||||
| 
						 | 
				
			
			@ -90,29 +90,29 @@ namespace MWRender
 | 
			
		|||
                            land->loadData(mask);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    for (int cellY=0; cellY<cellSize; ++cellY)
 | 
			
		||||
                    for (int cellY=0; cellY<mCellSize; ++cellY)
 | 
			
		||||
                    {
 | 
			
		||||
                        for (int cellX=0; cellX<cellSize; ++cellX)
 | 
			
		||||
                        for (int cellX=0; cellX<mCellSize; ++cellX)
 | 
			
		||||
                        {
 | 
			
		||||
                            int vertexX = float(cellX)/float(cellSize) * ESM::Land::LAND_SIZE;
 | 
			
		||||
                            int vertexY = float(cellY)/float(cellSize) * ESM::Land::LAND_SIZE;
 | 
			
		||||
                            int vertexX = float(cellX)/float(mCellSize) * ESM::Land::LAND_SIZE;
 | 
			
		||||
                            int vertexY = float(cellY)/float(mCellSize) * ESM::Land::LAND_SIZE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                            int texelX = (x-mMinX) * cellSize + cellX;
 | 
			
		||||
                            int texelY = (mHeight-1) - ((y-mMinY) * cellSize + cellY);
 | 
			
		||||
                            int texelX = (x-mMinX) * mCellSize + cellX;
 | 
			
		||||
                            int texelY = (mHeight-1) - ((y-mMinY) * mCellSize + cellY);
 | 
			
		||||
 | 
			
		||||
                            unsigned char r,g,b;
 | 
			
		||||
 | 
			
		||||
                            if (land)
 | 
			
		||||
                            {
 | 
			
		||||
                                const float landHeight = land->mLandData->mHeights[vertexY * ESM::Land::LAND_SIZE + vertexX];
 | 
			
		||||
                                const float mountainHeight = 15000.f;
 | 
			
		||||
                                const float hillHeight = 2500.f;
 | 
			
		||||
 | 
			
		||||
                                if (landHeight >= 0)
 | 
			
		||||
                                {
 | 
			
		||||
                                    const float hillHeight = 2500.f;
 | 
			
		||||
                                    if (landHeight >= hillHeight)
 | 
			
		||||
                                    {
 | 
			
		||||
                                        const float mountainHeight = 15000.f;
 | 
			
		||||
                                        float factor = std::min(1.f, float(landHeight-hillHeight)/mountainHeight);
 | 
			
		||||
                                        r = (hillColour.r * (1-factor) + mountainColour.r * factor) * 255;
 | 
			
		||||
                                        g = (hillColour.g * (1-factor) + mountainColour.g * factor) * 255;
 | 
			
		||||
| 
						 | 
				
			
			@ -197,11 +197,9 @@ namespace MWRender
 | 
			
		|||
 | 
			
		||||
    void GlobalMap::exploreCell(int cellX, int cellY)
 | 
			
		||||
    {
 | 
			
		||||
        const int size = 24;
 | 
			
		||||
 | 
			
		||||
        float originX = (cellX - mMinX) * size;
 | 
			
		||||
        float originX = (cellX - mMinX) * mCellSize;
 | 
			
		||||
        // NB y + 1, because we want the top left corner, not bottom left where the origin of the cell is
 | 
			
		||||
        float originY = mHeight - (cellY+1 - mMinY) * size;
 | 
			
		||||
        float originY = mHeight - (cellY+1 - mMinY) * mCellSize;
 | 
			
		||||
 | 
			
		||||
        if (cellX > mMaxX || cellX < mMinX || cellY > mMaxY || cellY < mMinY)
 | 
			
		||||
            return;
 | 
			
		||||
| 
						 | 
				
			
			@ -213,17 +211,17 @@ namespace MWRender
 | 
			
		|||
        {
 | 
			
		||||
            mOverlayTexture->load();
 | 
			
		||||
            mOverlayTexture->getBuffer()->blit(localMapTexture->getBuffer(), Ogre::Image::Box(0,0,512,512),
 | 
			
		||||
                         Ogre::Image::Box(originX,originY,originX+size,originY+size));
 | 
			
		||||
                         Ogre::Image::Box(originX,originY,originX+mCellSize,originY+mCellSize));
 | 
			
		||||
 | 
			
		||||
            Ogre::Image backup;
 | 
			
		||||
            std::vector<Ogre::uchar> data;
 | 
			
		||||
            data.resize(size*size*4, 0);
 | 
			
		||||
            backup.loadDynamicImage(&data[0], size, size, Ogre::PF_A8B8G8R8);
 | 
			
		||||
            data.resize(mCellSize*mCellSize*4, 0);
 | 
			
		||||
            backup.loadDynamicImage(&data[0], mCellSize, mCellSize, Ogre::PF_A8B8G8R8);
 | 
			
		||||
 | 
			
		||||
            localMapTexture->getBuffer()->blitToMemory(Ogre::Image::Box(0,0,512,512), backup.getPixelBox());
 | 
			
		||||
 | 
			
		||||
            for (int x=0; x<size; ++x)
 | 
			
		||||
                for (int y=0; y<size; ++y)
 | 
			
		||||
            for (int x=0; x<mCellSize; ++x)
 | 
			
		||||
                for (int y=0; y<mCellSize; ++y)
 | 
			
		||||
                {
 | 
			
		||||
                    assert (originX+x < mOverlayImage.getWidth());
 | 
			
		||||
                    assert (originY+y < mOverlayImage.getHeight());
 | 
			
		||||
| 
						 | 
				
			
			@ -292,7 +290,7 @@ namespace MWRender
 | 
			
		|||
        // If cell bounds of the currently loaded content and the loaded savegame do not match,
 | 
			
		||||
        // we need to resize source/dest boxes to accommodate
 | 
			
		||||
        // This means nonexisting cells will be dropped silently
 | 
			
		||||
        int cellImageSizeDst = 24;
 | 
			
		||||
        int cellImageSizeDst = mCellSize;
 | 
			
		||||
 | 
			
		||||
        // Completely off-screen? -> no need to blit anything
 | 
			
		||||
        if (bounds.mMaxX < mMinX
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,8 +26,10 @@ namespace MWRender
 | 
			
		|||
 | 
			
		||||
        void render(Loading::Listener* loadingListener);
 | 
			
		||||
 | 
			
		||||
        int getWidth() { return mWidth; }
 | 
			
		||||
        int getHeight() { return mHeight; }
 | 
			
		||||
        int getWidth() const { return mWidth; }
 | 
			
		||||
        int getHeight() const { return mHeight; }
 | 
			
		||||
 | 
			
		||||
        int getCellSize() const { return mCellSize; }
 | 
			
		||||
 | 
			
		||||
        void worldPosToImageSpace(float x, float z, float& imageX, float& imageY);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -46,6 +48,8 @@ namespace MWRender
 | 
			
		|||
    private:
 | 
			
		||||
        std::string mCacheDir;
 | 
			
		||||
 | 
			
		||||
        int mCellSize;
 | 
			
		||||
 | 
			
		||||
        std::vector< std::pair<int,int> > mExploredCells;
 | 
			
		||||
 | 
			
		||||
        Ogre::TexturePtr mOverlayTexture;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -410,15 +410,18 @@ void NpcAnimation::updateParts()
 | 
			
		|||
    // Remember body parts so we only have to search through the store once for each race/gender/viewmode combination
 | 
			
		||||
    static std::map< std::pair<std::string,int>,std::vector<const ESM::BodyPart*> > sRaceMapping;
 | 
			
		||||
 | 
			
		||||
    static const int Flag_Female      = 1<<0;
 | 
			
		||||
    static const int Flag_FirstPerson = 1<<1;
 | 
			
		||||
 | 
			
		||||
    bool isWerewolf = (mNpcType == Type_Werewolf);
 | 
			
		||||
    int flags = (isWerewolf ? -1 : 0);
 | 
			
		||||
    if(!mNpc->isMale())
 | 
			
		||||
    {
 | 
			
		||||
        static const int Flag_Female      = 1<<0;
 | 
			
		||||
        flags |= Flag_Female;
 | 
			
		||||
    }
 | 
			
		||||
    if(mViewMode == VM_FirstPerson)
 | 
			
		||||
    {
 | 
			
		||||
        static const int Flag_FirstPerson = 1<<1;
 | 
			
		||||
        flags |= Flag_FirstPerson;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::string race = (isWerewolf ? "werewolf" : Misc::StringUtils::lowerCase(mNpc->mRace));
 | 
			
		||||
    std::pair<std::string, int> thisCombination = std::make_pair(race, flags);
 | 
			
		||||
| 
						 | 
				
			
			@ -604,7 +607,7 @@ Ogre::Vector3 NpcAnimation::runAnimation(float timepassed)
 | 
			
		|||
        if (mObjectParts[i].isNull())
 | 
			
		||||
            continue;
 | 
			
		||||
        std::vector<Ogre::Controller<Ogre::Real> >::iterator ctrl(mObjectParts[i]->mControllers.begin());
 | 
			
		||||
        for(;ctrl != mObjectParts[i]->mControllers.end();ctrl++)
 | 
			
		||||
        for(;ctrl != mObjectParts[i]->mControllers.end();++ctrl)
 | 
			
		||||
            ctrl->update();
 | 
			
		||||
 | 
			
		||||
        Ogre::Entity *ent = mObjectParts[i]->mSkelBase;
 | 
			
		||||
| 
						 | 
				
			
			@ -678,7 +681,7 @@ bool NpcAnimation::addOrReplaceIndividualPart(ESM::PartReferenceType type, int g
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    std::vector<Ogre::Controller<Ogre::Real> >::iterator ctrl(mObjectParts[type]->mControllers.begin());
 | 
			
		||||
    for(;ctrl != mObjectParts[type]->mControllers.end();ctrl++)
 | 
			
		||||
    for(;ctrl != mObjectParts[type]->mControllers.end();++ctrl)
 | 
			
		||||
    {
 | 
			
		||||
        if(ctrl->getSource().isNull())
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -715,7 +718,7 @@ void NpcAnimation::addPartGroup(int group, int priority, const std::vector<ESM::
 | 
			
		|||
 | 
			
		||||
    const char *ext = (mViewMode == VM_FirstPerson) ? ".1st" : "";
 | 
			
		||||
    std::vector<ESM::PartReference>::const_iterator part(parts.begin());
 | 
			
		||||
    for(;part != parts.end();part++)
 | 
			
		||||
    for(;part != parts.end();++part)
 | 
			
		||||
    {
 | 
			
		||||
        const ESM::BodyPart *bodypart = 0;
 | 
			
		||||
        if(!mNpc->isMale() && !part->mFemale.empty())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -574,24 +574,6 @@ void RenderingManager::configureAmbient(MWWorld::CellStore &mCell)
 | 
			
		|||
        sunEnable(false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
// Switch through lighting modes.
 | 
			
		||||
 | 
			
		||||
void RenderingManager::toggleLight()
 | 
			
		||||
{
 | 
			
		||||
    if (mAmbientMode==2)
 | 
			
		||||
        mAmbientMode = 0;
 | 
			
		||||
    else
 | 
			
		||||
        ++mAmbientMode;
 | 
			
		||||
 | 
			
		||||
    switch (mAmbientMode)
 | 
			
		||||
    {
 | 
			
		||||
        case 0: std::cout << "Setting lights to normal\n"; break;
 | 
			
		||||
        case 1: std::cout << "Turning the lights up\n"; break;
 | 
			
		||||
        case 2: std::cout << "Turning the lights to full\n"; break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setAmbientMode();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderingManager::setSunColour(const Ogre::ColourValue& colour)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -695,11 +677,6 @@ void RenderingManager::enableLights(bool sun)
 | 
			
		|||
    sunEnable(sun);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Shadows* RenderingManager::getShadows()
 | 
			
		||||
{
 | 
			
		||||
    return mShadows;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderingManager::notifyWorldSpaceChanged()
 | 
			
		||||
{
 | 
			
		||||
    mEffectManager->clear();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -93,7 +93,6 @@ public:
 | 
			
		|||
 | 
			
		||||
    MWRender::Camera* getCamera() const;
 | 
			
		||||
 | 
			
		||||
    void toggleLight();
 | 
			
		||||
    bool toggleRenderMode(int mode);
 | 
			
		||||
 | 
			
		||||
    void removeCell (MWWorld::CellStore *store);
 | 
			
		||||
| 
						 | 
				
			
			@ -157,8 +156,6 @@ public:
 | 
			
		|||
 | 
			
		||||
    float getTerrainHeightAt (Ogre::Vector3 worldPos);
 | 
			
		||||
 | 
			
		||||
    Shadows* getShadows();
 | 
			
		||||
 | 
			
		||||
    void notifyWorldSpaceChanged();
 | 
			
		||||
 | 
			
		||||
    void getTriangleBatchCount(unsigned int &triangles, unsigned int &batches);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,6 +41,9 @@ public:
 | 
			
		|||
    void updateEmitterPtr (const MWWorld::Ptr& old, const MWWorld::Ptr& ptr);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    RippleSimulation(const RippleSimulation&);
 | 
			
		||||
    RippleSimulation& operator=(const RippleSimulation&);
 | 
			
		||||
 | 
			
		||||
    std::vector<Emitter> mEmitters;
 | 
			
		||||
 | 
			
		||||
    Ogre::RenderTexture* mRenderTargets[4];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -186,13 +186,3 @@ PSSMShadowCameraSetup* Shadows::getPSSMSetup()
 | 
			
		|||
{
 | 
			
		||||
    return mPSSMSetup;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float Shadows::getShadowFar() const
 | 
			
		||||
{
 | 
			
		||||
    return mShadowFar;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float Shadows::getFadeStart() const
 | 
			
		||||
{
 | 
			
		||||
    return mFadeStart;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,8 +23,6 @@ namespace MWRender
 | 
			
		|||
        void recreate();
 | 
			
		||||
 | 
			
		||||
        Ogre::PSSMShadowCameraSetup* getPSSMSetup();
 | 
			
		||||
        float getShadowFar() const;
 | 
			
		||||
        float getFadeStart() const;
 | 
			
		||||
 | 
			
		||||
    protected:
 | 
			
		||||
        OEngine::Render::OgreRenderer* mRendering;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -188,11 +188,6 @@ void Moon::setPhase(const Moon::Phase& phase)
 | 
			
		|||
    mPhase = phase;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Moon::Phase Moon::getPhase() const
 | 
			
		||||
{
 | 
			
		||||
    return mPhase;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int Moon::getPhaseInt() const
 | 
			
		||||
{
 | 
			
		||||
    if      (mPhase == Moon::Phase_New)              return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -418,7 +413,6 @@ void SkyManager::updateRain(float dt)
 | 
			
		|||
 | 
			
		||||
    // Spawn new rain
 | 
			
		||||
    float rainFrequency = mRainFrequency;
 | 
			
		||||
    float startHeight = 700;
 | 
			
		||||
    if (mRainEnabled)
 | 
			
		||||
    {
 | 
			
		||||
        mRainTimer += dt;
 | 
			
		||||
| 
						 | 
				
			
			@ -434,6 +428,7 @@ void SkyManager::updateRain(float dt)
 | 
			
		|||
 | 
			
		||||
            // Create a separate node to control the offset, since a node with setInheritOrientation(false) will still
 | 
			
		||||
            // consider the orientation of the parent node for its position, just not for its orientation
 | 
			
		||||
            float startHeight = 700;
 | 
			
		||||
            Ogre::SceneNode* offsetNode = sceneNode->createChildSceneNode(Ogre::Vector3(xOffs,yOffs,startHeight));
 | 
			
		||||
 | 
			
		||||
            NifOgre::ObjectScenePtr objects = NifOgre::Loader::createObjects(offsetNode, mRainEffect);
 | 
			
		||||
| 
						 | 
				
			
			@ -752,16 +747,6 @@ void SkyManager::setLightningStrength(const float factor)
 | 
			
		|||
    else
 | 
			
		||||
        mLightning->setVisible(false);
 | 
			
		||||
}
 | 
			
		||||
void SkyManager::setLightningEnabled(bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    /// \todo
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SkyManager::setLightningDirection(const Ogre::Vector3& dir)
 | 
			
		||||
{
 | 
			
		||||
    if (!mCreated) return;
 | 
			
		||||
    mLightning->setDirection (dir);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SkyManager::setMasserFade(const float fade)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,7 +103,6 @@ namespace MWRender
 | 
			
		|||
        void setPhase(const Phase& phase);
 | 
			
		||||
        void setType(const Type& type);
 | 
			
		||||
 | 
			
		||||
        Phase getPhase() const;
 | 
			
		||||
        unsigned int getPhaseInt() const;
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
| 
						 | 
				
			
			@ -169,8 +168,6 @@ namespace MWRender
 | 
			
		|||
        void secundaDisable();
 | 
			
		||||
 | 
			
		||||
        void setLightningStrength(const float factor);
 | 
			
		||||
        void setLightningDirection(const Ogre::Vector3& dir);
 | 
			
		||||
        void setLightningEnabled(bool enabled); ///< disable prior to map render
 | 
			
		||||
 | 
			
		||||
        void setGlare(const float glare);
 | 
			
		||||
        void setGlareEnabled(bool enabled);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -864,7 +864,6 @@ void VideoState::video_thread_loop(VideoState *self)
 | 
			
		|||
    AVPacket pkt1, *packet = &pkt1;
 | 
			
		||||
    int frameFinished;
 | 
			
		||||
    AVFrame *pFrame;
 | 
			
		||||
    double pts;
 | 
			
		||||
 | 
			
		||||
    pFrame = av_frame_alloc();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -879,7 +878,7 @@ void VideoState::video_thread_loop(VideoState *self)
 | 
			
		|||
        if(avcodec_decode_video2((*self->video_st)->codec, pFrame, &frameFinished, packet) < 0)
 | 
			
		||||
            throw std::runtime_error("Error decoding video frame");
 | 
			
		||||
 | 
			
		||||
        pts = 0;
 | 
			
		||||
        double pts = 0;
 | 
			
		||||
        if(IS_NOTEQ_NOPTS_VAL(packet->dts))
 | 
			
		||||
            pts = packet->dts;
 | 
			
		||||
        else if(pFrame->opaque && IS_NOTEQ_NOPTS_VAL_PTR(pFrame->opaque))
 | 
			
		||||
| 
						 | 
				
			
			@ -1232,11 +1231,6 @@ int VideoPlayer::getVideoHeight()
 | 
			
		|||
    return height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VideoPlayer::stopVideo ()
 | 
			
		||||
{
 | 
			
		||||
    close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VideoPlayer::close()
 | 
			
		||||
{
 | 
			
		||||
    if(mState)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,6 @@ namespace MWRender
 | 
			
		|||
        void update();
 | 
			
		||||
 | 
			
		||||
        void close();
 | 
			
		||||
        void stopVideo();
 | 
			
		||||
 | 
			
		||||
        bool isPlaying();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -32,9 +31,6 @@ namespace MWRender
 | 
			
		|||
 | 
			
		||||
    private:
 | 
			
		||||
        VideoState* mState;
 | 
			
		||||
 | 
			
		||||
        int mWidth;
 | 
			
		||||
        int mHeight;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -480,12 +480,6 @@ namespace MWScript
 | 
			
		|||
            mActivationHandled = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void InterpreterContext::clearActivation()
 | 
			
		||||
    {
 | 
			
		||||
        mActivated = MWWorld::Ptr();
 | 
			
		||||
        mActivationHandled = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    float InterpreterContext::getSecondsPassed() const
 | 
			
		||||
    {
 | 
			
		||||
        return MWBase::Environment::get().getFrameDuration();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -146,9 +146,6 @@ namespace MWScript
 | 
			
		|||
            void executeActivation(MWWorld::Ptr ptr, MWWorld::Ptr actor);
 | 
			
		||||
            ///< Execute the activation action for this ptr. If ptr is mActivated, mark activation as handled.
 | 
			
		||||
 | 
			
		||||
            void clearActivation();
 | 
			
		||||
            ///< Discard the action defined by the last activate call.
 | 
			
		||||
 | 
			
		||||
            virtual float getSecondsPassed() const;
 | 
			
		||||
 | 
			
		||||
            virtual bool isDisabled (const std::string& id = "") const;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -617,7 +617,7 @@ namespace MWScript
 | 
			
		|||
                virtual void execute (Interpreter::Runtime& runtime)
 | 
			
		||||
                {
 | 
			
		||||
                    MWWorld::Ptr ptr = R()(runtime);
 | 
			
		||||
                    runtime.push (MWBase::Environment::get().getWorld()->getPlayerStandingOn(ptr));
 | 
			
		||||
                    runtime.push (MWBase::Environment::get().getWorld()->getPlayerCollidingWith(ptr));
 | 
			
		||||
                }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -629,7 +629,7 @@ namespace MWScript
 | 
			
		|||
                virtual void execute (Interpreter::Runtime& runtime)
 | 
			
		||||
                {
 | 
			
		||||
                    MWWorld::Ptr ptr = R()(runtime);
 | 
			
		||||
                    runtime.push (MWBase::Environment::get().getWorld()->getActorStandingOn(ptr));
 | 
			
		||||
                    runtime.push (MWBase::Environment::get().getWorld()->getActorCollidingWith(ptr));
 | 
			
		||||
                }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,13 +43,12 @@ namespace MWScript
 | 
			
		|||
        mParser.reset();
 | 
			
		||||
        mErrorHandler.reset();
 | 
			
		||||
 | 
			
		||||
        bool Success = true;
 | 
			
		||||
 | 
			
		||||
        if (const ESM::Script *script = mStore.get<ESM::Script>().find (name))
 | 
			
		||||
        {
 | 
			
		||||
            if (mVerbose)
 | 
			
		||||
                std::cout << "compiling script: " << name << std::endl;
 | 
			
		||||
 | 
			
		||||
            bool Success = true;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                std::istringstream input (script->mScriptText);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ bool FFmpeg_Decoder::getNextPacket()
 | 
			
		|||
 | 
			
		||||
bool FFmpeg_Decoder::getAVAudioData()
 | 
			
		||||
{
 | 
			
		||||
    int got_frame, len;
 | 
			
		||||
    int got_frame;
 | 
			
		||||
 | 
			
		||||
    if((*mStream)->codec->codec_type != AVMEDIA_TYPE_AUDIO)
 | 
			
		||||
        return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -93,6 +93,7 @@ bool FFmpeg_Decoder::getAVAudioData()
 | 
			
		|||
            return false;
 | 
			
		||||
 | 
			
		||||
        /* Decode some data, and check for errors */
 | 
			
		||||
        int len = 0;
 | 
			
		||||
        if((len=avcodec_decode_audio4((*mStream)->codec, mFrame, &got_frame, &mPacket)) < 0)
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -303,10 +303,6 @@ namespace MWWorld
 | 
			
		|||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Class::adjustRotation(const MWWorld::Ptr& ptr,float& x,float& y,float& z) const
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::string Class::getModel(const MWWorld::Ptr &ptr) const
 | 
			
		||||
    {
 | 
			
		||||
        return "";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -267,8 +267,6 @@ namespace MWWorld
 | 
			
		|||
 | 
			
		||||
            virtual void adjustScale(const MWWorld::Ptr& ptr,float& scale) const;
 | 
			
		||||
 | 
			
		||||
            virtual void adjustRotation(const MWWorld::Ptr& ptr,float& x,float& y,float& z) const;
 | 
			
		||||
 | 
			
		||||
            virtual bool canSell (const MWWorld::Ptr& item, int npcServices) const;
 | 
			
		||||
            ///< Determine whether or not \a item can be sold to an npc with the given \a npcServices
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,15 +73,14 @@ MWWorld::InventoryStore::InventoryStore()
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
MWWorld::InventoryStore::InventoryStore (const InventoryStore& store)
 | 
			
		||||
: ContainerStore (store)
 | 
			
		||||
 : ContainerStore (store)
 | 
			
		||||
 , mSelectedEnchantItem(end())
 | 
			
		||||
 , mMagicEffects(store.mMagicEffects)
 | 
			
		||||
 , mFirstAutoEquip(store.mFirstAutoEquip)
 | 
			
		||||
 , mListener(store.mListener)
 | 
			
		||||
 , mUpdatesEnabled(store.mUpdatesEnabled)
 | 
			
		||||
 , mPermanentMagicEffectMagnitudes(store.mPermanentMagicEffectMagnitudes)
 | 
			
		||||
{
 | 
			
		||||
    mMagicEffects = store.mMagicEffects;
 | 
			
		||||
    mFirstAutoEquip = store.mFirstAutoEquip;
 | 
			
		||||
    mListener = store.mListener;
 | 
			
		||||
    mUpdatesEnabled = store.mUpdatesEnabled;
 | 
			
		||||
 | 
			
		||||
    mPermanentMagicEffectMagnitudes = store.mPermanentMagicEffectMagnitudes;
 | 
			
		||||
    copySlots (store);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -218,8 +217,6 @@ void MWWorld::InventoryStore::autoEquip (const MWWorld::Ptr& actor)
 | 
			
		|||
                // Equipping weapons is handled by AiCombat. Anything else (lockpicks, probes) can't be used by NPCs anyway (yet)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            bool use = false;
 | 
			
		||||
 | 
			
		||||
            if (slots_.at (*iter2)!=end())
 | 
			
		||||
            {
 | 
			
		||||
                Ptr old = *slots_.at (*iter2);
 | 
			
		||||
| 
						 | 
				
			
			@ -227,6 +224,7 @@ void MWWorld::InventoryStore::autoEquip (const MWWorld::Ptr& actor)
 | 
			
		|||
                // check skill
 | 
			
		||||
                int oldSkill = old.getClass().getEquipmentSkill (old);
 | 
			
		||||
 | 
			
		||||
                bool use = false;
 | 
			
		||||
                if (testSkill!=-1 && oldSkill==-1)
 | 
			
		||||
                    use = true;
 | 
			
		||||
                else if (testSkill!=-1 && oldSkill!=-1 && testSkill!=oldSkill)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -268,8 +268,6 @@ namespace MWWorld
 | 
			
		|||
        loadingListener->setLabel(loadingExteriorText);
 | 
			
		||||
 | 
			
		||||
        CellStoreCollection::iterator active = mActiveCells.begin();
 | 
			
		||||
 | 
			
		||||
        active = mActiveCells.begin();
 | 
			
		||||
        while (active!=mActiveCells.end())
 | 
			
		||||
        {
 | 
			
		||||
            if ((*active)->getCell()->isExterior())
 | 
			
		||||
| 
						 | 
				
			
			@ -414,12 +412,9 @@ namespace MWWorld
 | 
			
		|||
 | 
			
		||||
        std::cout << "Changing to interior\n";
 | 
			
		||||
 | 
			
		||||
        // remove active
 | 
			
		||||
        CellStoreCollection::iterator active = mActiveCells.begin();
 | 
			
		||||
 | 
			
		||||
        // unload
 | 
			
		||||
        int current = 0;
 | 
			
		||||
        active = mActiveCells.begin();
 | 
			
		||||
        CellStoreCollection::iterator active = mActiveCells.begin();
 | 
			
		||||
        while (active!=mActiveCells.end())
 | 
			
		||||
        {
 | 
			
		||||
            unloadCell (active++);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1315,7 +1315,7 @@ namespace MWWorld
 | 
			
		|||
 | 
			
		||||
        const PtrVelocityList &results = mPhysics->applyQueuedMovement(duration);
 | 
			
		||||
        PtrVelocityList::const_iterator player(results.end());
 | 
			
		||||
        for(PtrVelocityList::const_iterator iter(results.begin());iter != results.end();iter++)
 | 
			
		||||
        for(PtrVelocityList::const_iterator iter(results.begin());iter != results.end();++iter)
 | 
			
		||||
        {
 | 
			
		||||
            if(iter->first.getRefData().getHandle() == "player")
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								components/bsa/tests/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								components/bsa/tests/.gitignore
									
									
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,3 +0,0 @@
 | 
			
		|||
*_test
 | 
			
		||||
bsatool
 | 
			
		||||
*.bsa
 | 
			
		||||
| 
						 | 
				
			
			@ -1,15 +0,0 @@
 | 
			
		|||
GCC=g++
 | 
			
		||||
 | 
			
		||||
all: bsa_file_test ogre_archive_test
 | 
			
		||||
 | 
			
		||||
I_OGRE=$(shell pkg-config --cflags OGRE)
 | 
			
		||||
L_OGRE=$(shell pkg-config --libs OGRE)
 | 
			
		||||
 | 
			
		||||
bsa_file_test: bsa_file_test.cpp ../bsa_file.cpp
 | 
			
		||||
	$(GCC) $^ -o $@
 | 
			
		||||
 | 
			
		||||
ogre_archive_test: ogre_archive_test.cpp ../bsa_file.cpp ../bsa_archive.cpp
 | 
			
		||||
	$(GCC) $^ -o $@ $(I_OGRE) $(L_OGRE)
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm *_test
 | 
			
		||||
| 
						 | 
				
			
			@ -1,44 +0,0 @@
 | 
			
		|||
#include "../bsa_file.hpp"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Test of the BSAFile class
 | 
			
		||||
 | 
			
		||||
  This test requires that data/Morrowind.bsa exists in the root
 | 
			
		||||
  directory of OpenMW.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Bsa;
 | 
			
		||||
 | 
			
		||||
BSAFile bsa;
 | 
			
		||||
 | 
			
		||||
void find(const char* file)
 | 
			
		||||
{
 | 
			
		||||
  cout << "Does file '" << file << "' exist?\n  ";
 | 
			
		||||
  if(bsa.exists(file))
 | 
			
		||||
    {
 | 
			
		||||
      cout << "Yes.\n  ";
 | 
			
		||||
      cout << bsa.getFile(file)->size() << " bytes\n";
 | 
			
		||||
    }
 | 
			
		||||
  else cout << "No.\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  cout << "Reading Morrowind.bsa\n";
 | 
			
		||||
  bsa.open("../../data/Morrowind.bsa");
 | 
			
		||||
 | 
			
		||||
  const BSAFile::FileList &files = bsa.getList();
 | 
			
		||||
 | 
			
		||||
  cout << "First 10 files in archive:\n";
 | 
			
		||||
  for(int i=0; i<10; i++)
 | 
			
		||||
    cout << "  " << files[i].name
 | 
			
		||||
         << " (" << files[i].fileSize << " bytes @"
 | 
			
		||||
         << files[i].offset << ")\n";
 | 
			
		||||
 | 
			
		||||
  find("meshes\\r\\xnetch_betty.nif");
 | 
			
		||||
  find("humdrum");
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,34 +0,0 @@
 | 
			
		|||
#include <Ogre.h>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
// This is a test of the BSA archive handler for OGRE.
 | 
			
		||||
 | 
			
		||||
#include "../bsa_archive.hpp"
 | 
			
		||||
 | 
			
		||||
using namespace Ogre;
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  // Disable Ogre logging
 | 
			
		||||
  new LogManager;
 | 
			
		||||
  Log *log = LogManager::getSingleton().createLog("");
 | 
			
		||||
  log->setDebugOutputEnabled(false);
 | 
			
		||||
 | 
			
		||||
  // Set up Root
 | 
			
		||||
  Root *root = new Root("","","");
 | 
			
		||||
 | 
			
		||||
  // Add the BSA
 | 
			
		||||
  Bsa::addBSA("../../data/Morrowind.bsa");
 | 
			
		||||
 | 
			
		||||
  // Pick a sample file
 | 
			
		||||
  String tex = "textures\\tx_natural_cavern_wall13.dds";
 | 
			
		||||
  cout << "Opening file: " << tex << endl;
 | 
			
		||||
 | 
			
		||||
  // Get it from the resource system
 | 
			
		||||
  DataStreamPtr data = ResourceGroupManager::getSingleton().openResource(tex, "General");
 | 
			
		||||
 | 
			
		||||
  cout << "Size: " << data->size() << endl;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,17 +0,0 @@
 | 
			
		|||
Reading Morrowind.bsa
 | 
			
		||||
First 10 files in archive:
 | 
			
		||||
  meshes\m\probe_journeyman_01.nif (6276 bytes @126646052)
 | 
			
		||||
  textures\menu_rightbuttonup_top.dds (256 bytes @218530052)
 | 
			
		||||
  textures\menu_rightbuttonup_right.dds (256 bytes @218529796)
 | 
			
		||||
  textures\menu_rightbuttonup_left.dds (256 bytes @218529540)
 | 
			
		||||
  textures\menu_rightbuttondown_top.dds (256 bytes @218528196)
 | 
			
		||||
  meshes\b\b_n_redguard_f_skins.nif (41766 bytes @17809778)
 | 
			
		||||
  meshes\b\b_n_redguard_m_skins.nif (41950 bytes @18103107)
 | 
			
		||||
  meshes\b\b_n_redguard_f_wrist.nif (2355 bytes @17858132)
 | 
			
		||||
  meshes\b\b_n_redguard_m_foot.nif (4141 bytes @17862081)
 | 
			
		||||
  meshes\b\b_n_redguard_m_knee.nif (2085 bytes @18098101)
 | 
			
		||||
Does file 'meshes\r\xnetch_betty.nif' exist?
 | 
			
		||||
  Yes.
 | 
			
		||||
  53714 bytes
 | 
			
		||||
Does file 'humdrum' exist?
 | 
			
		||||
  No.
 | 
			
		||||
| 
						 | 
				
			
			@ -1,2 +0,0 @@
 | 
			
		|||
Opening file: textures\tx_natural_cavern_wall13.dds
 | 
			
		||||
Size: 43808
 | 
			
		||||
| 
						 | 
				
			
			@ -1,18 +0,0 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
make || exit
 | 
			
		||||
 | 
			
		||||
mkdir -p output
 | 
			
		||||
 | 
			
		||||
PROGS=*_test
 | 
			
		||||
 | 
			
		||||
for a in $PROGS; do
 | 
			
		||||
    if [ -f "output/$a.out" ]; then
 | 
			
		||||
        echo "Running $a:"
 | 
			
		||||
        ./$a | diff output/$a.out -
 | 
			
		||||
    else
 | 
			
		||||
        echo "Creating $a.out"
 | 
			
		||||
        ./$a > "output/$a.out"
 | 
			
		||||
        git add "output/$a.out"
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
| 
						 | 
				
			
			@ -105,11 +105,6 @@ namespace
 | 
			
		|||
        code.push_back (Compiler::Generator::segment5 (17));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void opFloatToInt1 (Compiler::Generator::CodeContainer& code)
 | 
			
		||||
    {
 | 
			
		||||
        code.push_back (Compiler::Generator::segment5 (18));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void opSquareRoot (Compiler::Generator::CodeContainer& code)
 | 
			
		||||
    {
 | 
			
		||||
        code.push_back (Compiler::Generator::segment5 (19));
 | 
			
		||||
| 
						 | 
				
			
			@ -606,16 +601,6 @@ namespace Compiler
 | 
			
		|||
            jump (code, offset);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void jumpOnNonZero (CodeContainer& code, int offset)
 | 
			
		||||
        {
 | 
			
		||||
            opSkipOnZero (code);
 | 
			
		||||
 | 
			
		||||
            if (offset<0)
 | 
			
		||||
                --offset; // compensate for skip instruction
 | 
			
		||||
 | 
			
		||||
            jump (code, offset);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void compare (CodeContainer& code, char op, char valueType1, char valueType2)
 | 
			
		||||
        {
 | 
			
		||||
            if (valueType1=='l' && valueType2=='l')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,8 +89,6 @@ namespace Compiler
 | 
			
		|||
 | 
			
		||||
        void jumpOnZero (CodeContainer& code, int offset);
 | 
			
		||||
 | 
			
		||||
        void jumpOnNonZero (CodeContainer& code, int offset);
 | 
			
		||||
 | 
			
		||||
        void compare (CodeContainer& code, char op, char valueType1, char valueType2);
 | 
			
		||||
 | 
			
		||||
        void menuMode (CodeContainer& code);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,7 +57,7 @@ namespace Compiler
 | 
			
		|||
        Literals& literals, std::vector<Interpreter::Type_Code>& code, bool allowExpression)
 | 
			
		||||
    : Parser (errorHandler, context), mLocals (locals), mLiterals (literals), mCode (code),
 | 
			
		||||
       mState (BeginState), mExprParser (errorHandler, context, locals, literals),
 | 
			
		||||
       mAllowExpression (allowExpression), mButtons(0), mType(0)
 | 
			
		||||
       mAllowExpression (allowExpression), mButtons(0), mType(0), mReferenceMember(false)
 | 
			
		||||
    {}
 | 
			
		||||
 | 
			
		||||
    bool LineParser::parseInt (int value, const TokenLoc& loc, Scanner& scanner)
 | 
			
		||||
| 
						 | 
				
			
			@ -295,8 +295,6 @@ namespace Compiler
 | 
			
		|||
                        mExplicit.clear();
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    int optionals = 0;
 | 
			
		||||
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        // workaround for broken positioncell instructions.
 | 
			
		||||
| 
						 | 
				
			
			@ -306,7 +304,7 @@ namespace Compiler
 | 
			
		|||
                            errorDowngrade.reset (new ErrorDowngrade (getErrorHandler()));
 | 
			
		||||
 | 
			
		||||
                        std::vector<Interpreter::Type_Code> code;
 | 
			
		||||
                        optionals = mExprParser.parseArguments (argumentType, scanner, code);
 | 
			
		||||
                        int optionals = mExprParser.parseArguments (argumentType, scanner, code);
 | 
			
		||||
                        mCode.insert (mCode.end(), code.begin(), code.end());
 | 
			
		||||
                        extensions->generateInstructionCode (keyword, mCode, mLiterals,
 | 
			
		||||
                            mExplicit, optionals);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,13 +21,6 @@ namespace Compiler
 | 
			
		|||
        throw SourceException();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Report the error
 | 
			
		||||
 | 
			
		||||
    void Parser::reportError (const std::string& message, const TokenLoc& loc)
 | 
			
		||||
    {
 | 
			
		||||
        mErrorHandler.error (message, loc);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Report the warning without throwing an exception.
 | 
			
		||||
 | 
			
		||||
    void Parser::reportWarning (const std::string& message, const TokenLoc& loc)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue