mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 21:56:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "convertplayer.hpp"
 | |
| 
 | |
| #include <components/misc/stringops.hpp>
 | |
| 
 | |
| namespace ESSImport
 | |
| {
 | |
| 
 | |
|     void convertPCDT(const PCDT& pcdt, ESM::Player& out, std::vector<std::string>& outDialogueTopics, bool& firstPersonCam, bool& teleportingEnabled, bool& levitationEnabled, ESM::ControlsState& controls)
 | |
|     {
 | |
|         out.mBirthsign = pcdt.mBirthsign;
 | |
|         out.mObject.mNpcStats.mBounty = pcdt.mBounty;
 | |
|         for (std::vector<PCDT::FNAM>::const_iterator it = pcdt.mFactions.begin(); it != pcdt.mFactions.end(); ++it)
 | |
|         {
 | |
|             ESM::NpcStats::Faction faction;
 | |
|             faction.mExpelled = (it->mFlags & 0x2) != 0;
 | |
|             faction.mRank = it->mRank;
 | |
|             faction.mReputation = it->mReputation;
 | |
|             out.mObject.mNpcStats.mFactions[Misc::StringUtils::lowerCase(it->mFactionName.toString())] = faction;
 | |
|         }
 | |
|         for (int i=0; i<3; ++i)
 | |
|             out.mObject.mNpcStats.mSpecIncreases[i] = pcdt.mPNAM.mSpecIncreases[i];
 | |
|         for (int i=0; i<8; ++i)
 | |
|             out.mObject.mNpcStats.mSkillIncrease[i] = pcdt.mPNAM.mSkillIncreases[i];
 | |
|         for (int i=0; i<27; ++i)
 | |
|             out.mObject.mNpcStats.mSkills[i].mProgress = pcdt.mPNAM.mSkillProgress[i];
 | |
|         out.mObject.mNpcStats.mLevelProgress = pcdt.mPNAM.mLevelProgress;
 | |
| 
 | |
|         if (pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_WeaponDrawn)
 | |
|             out.mObject.mCreatureStats.mDrawState = 1;
 | |
|         if (pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_SpellDrawn)
 | |
|             out.mObject.mCreatureStats.mDrawState = 2;
 | |
| 
 | |
|         firstPersonCam = !(pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_ThirdPerson);
 | |
|         teleportingEnabled = !(pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_TeleportingDisabled);
 | |
|         levitationEnabled = !(pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_LevitationDisabled);
 | |
| 
 | |
|         for (std::vector<std::string>::const_iterator it = pcdt.mKnownDialogueTopics.begin();
 | |
|              it != pcdt.mKnownDialogueTopics.end(); ++it)
 | |
|         {
 | |
|             outDialogueTopics.push_back(Misc::StringUtils::lowerCase(*it));
 | |
|         }
 | |
| 
 | |
|         controls.mViewSwitchDisabled = pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_ViewSwitchDisabled;
 | |
|         controls.mControlsDisabled = pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_ControlsDisabled;
 | |
|         controls.mJumpingDisabled = pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_JumpingDisabled;
 | |
|         controls.mLookingDisabled = pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_LookingDisabled;
 | |
|         controls.mVanityModeDisabled = pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_VanityModeDisabled;
 | |
|         controls.mWeaponDrawingDisabled = pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_WeaponDrawingDisabled;
 | |
|         controls.mSpellDrawingDisabled = pcdt.mPNAM.mPlayerFlags & PCDT::PlayerFlags_SpellDrawingDisabled;
 | |
| 
 | |
|         if (pcdt.mHasMark)
 | |
|         {
 | |
|             out.mHasMark = 1;
 | |
| 
 | |
|             const PCDT::PNAM::MarkLocation& mark = pcdt.mPNAM.mMarkLocation;
 | |
| 
 | |
|             ESM::CellId cell;
 | |
|             cell.mWorldspace = ESM::CellId::sDefaultWorldspace;
 | |
|             cell.mPaged = true;
 | |
| 
 | |
|             cell.mIndex.mX = mark.mCellX;
 | |
|             cell.mIndex.mY = mark.mCellY;
 | |
| 
 | |
|             // TODO: Figure out a better way to detect interiors. (0, 0) is a valid exterior cell.
 | |
|             if (mark.mCellX == 0 && mark.mCellY == 0)
 | |
|             {
 | |
|                 cell.mWorldspace = pcdt.mMNAM;
 | |
|                 cell.mPaged = false;
 | |
|             }
 | |
| 
 | |
|             out.mMarkedCell = cell;
 | |
|             out.mMarkedPosition.pos[0] = mark.mX;
 | |
|             out.mMarkedPosition.pos[1] = mark.mY;
 | |
|             out.mMarkedPosition.pos[2] = mark.mZ;
 | |
|             out.mMarkedPosition.rot[0] = out.mMarkedPosition.rot[1] = 0.0f;
 | |
|             out.mMarkedPosition.rot[2] = mark.mRotZ;
 | |
|         }
 | |
| 
 | |
|         if (pcdt.mHasENAM)
 | |
|         {
 | |
|             const int cellSize = 8192;
 | |
|             out.mLastKnownExteriorPosition[0] = (pcdt.mENAM.mCellX + 0.5f) * cellSize;
 | |
|             out.mLastKnownExteriorPosition[1] = (pcdt.mENAM.mCellY + 0.5f) * cellSize;
 | |
|             out.mLastKnownExteriorPosition[2] = 0.0f;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 |