diff --git a/.travis.yml b/.travis.yml index ced20d7d8..b0a9d7520 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ os: - linux -# - osx -osx_image: xcode7.2 + - osx +osx_image: xcode7.3 language: cpp sudo: required dist: trusty @@ -15,6 +15,7 @@ env: # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created # via the "travis encrypt" command using the project repo's public key - secure: "PwN1bETMQf8kiSxFpuuknzjdtqhYniBUFwMaVzpSs3lVVslNU/H3AHoiFtR5gVIuUAgNF13dDn8Zg1hu14QOOpYbXGLuVE51ePcqNjXkwb2NbrfswGOxbUEb4nHhY/Wl1LPjndwLk0kTTyDk6kPHU4nQuuCoElriWV2nShtTJbHOeLbLxRw6ZH5j7iFpdLqJh+gMeh0zFnP2kyHPVZlGnVcqjqTJA+R57J7faG1j/VGlYV34VB5PluIdHrphGUOV1aOh6yIxa3SVOPrjQK6MjP/6eaJ8tE7L5od4YWoMkjlmaNVLz3SBn+HiNpbYx6sXE2Z9B6ZSpP5eKcxVX+D1pdVFn/9c130D0zHT8B3BW0/sVqY35g5QTs4mXs3wS6R1v49iTVB5Y4N10RMHpw87hl2oyILSidNCu0kMJxuXeHw88Uyx3qdj01HahFjN2AQWfzCq9oUBirAXi2ECt5e8zlX7/8Sh+dRL/XaTxZGkEGaO7/DhO/Jr/ptvCt5GclZavvuXnbXB5p0BB06Br/4lRogfC2fOgQPxf2656ss6p7B6I/l98SNEyR1q869GMrFKRJ9rf5yERF2tBYolEZ7eb8mX0jctk9i9WRQ/KscPm/YDOxexMx6aJ5BAG3vK9uDiuOgzmQ2QTnA1X/WCDI+GLIFpzjajWl8Ik1iyXHhTiOc=" + - macos_qt_formula=qt@5.5 addons: apt: sources: @@ -63,9 +64,24 @@ script: - if [ "$COVERITY_SCAN_BRANCH" != 1 ] && [ "${TRAVIS_OS_NAME}" = "osx" ]; then make package; fi - if [ "$COVERITY_SCAN_BRANCH" != 1 ] && [ "${TRAVIS_OS_NAME}" = "linux" ]; then ./openmw_test_suite; fi - if [ "$COVERITY_SCAN_BRANCH" != 1 ] && [ "${TRAVIS_OS_NAME}" = "linux" ]; then cd .. && ./CI/check_tabs.sh; fi +<<<<<<< HEAD #notifications: # recipients: # - corrmage+travis-ci@gmail.com # email: # on_success: change # on_failure: always +======= +notifications: + email: + recipients: + - corrmage+travis-ci@gmail.com + on_success: change + on_failure: always + irc: + channels: + - "chat.freenode.net#openmw" + on_success: change + on_failure: always + use_notice: true +>>>>>>> refs/heads/pr/114 diff --git a/CI/before_install.osx.sh b/CI/before_install.osx.sh index 8a306186e..a2ea720e5 100755 --- a/CI/before_install.osx.sh +++ b/CI/before_install.osx.sh @@ -5,7 +5,7 @@ brew update brew rm cmake || true brew rm pkgconfig || true brew rm qt5 || true -brew install cmake pkgconfig qt55 +brew install cmake pkgconfig $macos_qt_formula curl http://downloads.openmw.org/osx/dependencies/openmw-deps-263d4a8.zip -o ~/openmw-deps.zip unzip ~/openmw-deps.zip -d /private/tmp/openmw-deps > /dev/null diff --git a/CI/before_script.osx.sh b/CI/before_script.osx.sh index 00a948c65..6955825a4 100755 --- a/CI/before_script.osx.sh +++ b/CI/before_script.osx.sh @@ -4,7 +4,7 @@ export CXX=clang++ export CC=clang DEPENDENCIES_ROOT="/private/tmp/openmw-deps/openmw-deps" -QT_PATH="/usr/local/opt/qt55" +QT_PATH=`brew --prefix $macos_qt_formula` mkdir build cd build diff --git a/apps/essimporter/convertplayer.cpp b/apps/essimporter/convertplayer.cpp index 9d82af022..c363185ee 100644 --- a/apps/essimporter/convertplayer.cpp +++ b/apps/essimporter/convertplayer.cpp @@ -47,6 +47,34 @@ namespace ESSImport 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; + } } } diff --git a/apps/essimporter/importercontext.hpp b/apps/essimporter/importercontext.hpp index fde247ebf..2288b149c 100644 --- a/apps/essimporter/importercontext.hpp +++ b/apps/essimporter/importercontext.hpp @@ -63,7 +63,7 @@ namespace ESSImport playerCellId.mIndex.mX = playerCellId.mIndex.mY = 0; mPlayer.mCellId = playerCellId; //mPlayer.mLastKnownExteriorPosition - mPlayer.mHasMark = 0; // TODO + mPlayer.mHasMark = 0; mPlayer.mCurrentCrimeId = 0; // TODO mPlayer.mObject.blank(); mPlayer.mObject.mRef.mRefID = "player"; // REFR.mRefID would be PlayerSaveGame diff --git a/apps/essimporter/importplayer.cpp b/apps/essimporter/importplayer.cpp index 9845ab072..85a3c3fd5 100644 --- a/apps/essimporter/importplayer.cpp +++ b/apps/essimporter/importplayer.cpp @@ -23,9 +23,12 @@ namespace ESSImport mKnownDialogueTopics.push_back(esm.getHString()); } + mHasMark = false; if (esm.isNextSub("MNAM")) - esm.skipHSub(); // If this field is here it seems to specify the interior cell the player is in, - // but it's not always here, so it's kinda useless + { + mHasMark = true; + mMNAM = esm.getHString(); + } esm.getHNT(mPNAM, "PNAM"); @@ -50,8 +53,12 @@ namespace ESSImport if (esm.isNextSub("NAM3")) esm.skipHSub(); + mHasENAM = false; if (esm.isNextSub("ENAM")) - esm.skipHSub(); + { + mHasENAM = true; + esm.getHT(mENAM); + } if (esm.isNextSub("LNAM")) esm.skipHSub(); diff --git a/apps/essimporter/importplayer.hpp b/apps/essimporter/importplayer.hpp index 9f6b055c0..775994444 100644 --- a/apps/essimporter/importplayer.hpp +++ b/apps/essimporter/importplayer.hpp @@ -42,8 +42,11 @@ struct PCDT { PlayerFlags_ViewSwitchDisabled = 0x1, PlayerFlags_ControlsDisabled = 0x4, + PlayerFlags_Sleeping = 0x10, + PlayerFlags_Waiting = 0x40, PlayerFlags_WeaponDrawn = 0x80, PlayerFlags_SpellDrawn = 0x100, + PlayerFlags_InJail = 0x200, PlayerFlags_JumpingDisabled = 0x1000, PlayerFlags_LookingDisabled = 0x2000, PlayerFlags_VanityModeDisabled = 0x4000, @@ -68,19 +71,44 @@ struct PCDT struct PNAM { + struct MarkLocation + { + float mX, mY, mZ; // worldspace position + float mRotZ; // Z angle in radians + int mCellX, mCellY; // grid coordinates; for interior cells this is always (0, 0) + }; + int mPlayerFlags; // controls, camera and draw state unsigned int mLevelProgress; float mSkillProgress[27]; // skill progress, non-uniform scaled unsigned char mSkillIncreases[8]; // number of skill increases for each attribute - unsigned char mUnknown3[84]; + int mTelekinesisRangeBonus; // in units; seems redundant + float mVisionBonus; // range: <0.0, 1.0>; affected by light spells and Get/Mod/SetPCVisionBonus + int mDetectKeyMagnitude; // seems redundant + int mDetectEnchantmentMagnitude; // seems redundant + int mDetectAnimalMagnitude; // seems redundant + MarkLocation mMarkLocation; + unsigned char mUnknown3[40]; unsigned char mSpecIncreases[3]; // number of skill increases for each specialization unsigned char mUnknown4; }; + + struct ENAM + { + int mCellX; + int mCellY; + }; #pragma pack(pop) std::vector mFactions; PNAM mPNAM; + bool mHasMark; + std::string mMNAM; // mark cell name; can also be sDefaultCellname or region name + + bool mHasENAM; + ENAM mENAM; // last exterior cell + void load(ESM::ESMReader& esm); }; diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index f94ee14b6..544fb0199 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -1349,7 +1349,8 @@ namespace MWPhysics else if (physicActor->getCollisionMode() && canMoveToWaterSurface(iter->first, waterlevel)) { const osg::Vec3f actorPosition = physicActor->getPosition(); - physicActor->setPosition(osg::Vec3f(actorPosition.x(), actorPosition.y(), waterlevel)); + physicActor->setPosition(osg::Vec3f(actorPosition.x(), actorPosition.y(), waterlevel)); + waterCollision = true; } } physicActor->setCanWaterWalk(waterCollision);