From 24863f620b1ea705d76972c87b4f60668d659935 Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Wed, 30 May 2018 14:43:07 +0400 Subject: [PATCH 01/10] RotateWorld: rotate around world axis (bug #4426) --- apps/openmw/mwbase/world.hpp | 2 ++ .../mwscript/transformationextensions.cpp | 25 +++++++++---------- apps/openmw/mwworld/worldimp.cpp | 9 +++++++ apps/openmw/mwworld/worldimp.hpp | 2 ++ 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index 47502fd71..fb1450aa6 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -564,6 +564,8 @@ namespace MWBase virtual bool isPlayerInJail() const = 0; + virtual void rotateWorldObject (const MWWorld::Ptr& ptr, osg::Quat rotate) = 0; + /// Return terrain height at \a worldPos position. virtual float getTerrainHeightAt(const osg::Vec3f& worldPos) const = 0; diff --git a/apps/openmw/mwscript/transformationextensions.cpp b/apps/openmw/mwscript/transformationextensions.cpp index 5e617fb1a..611199f72 100644 --- a/apps/openmw/mwscript/transformationextensions.cpp +++ b/apps/openmw/mwscript/transformationextensions.cpp @@ -579,26 +579,25 @@ namespace MWScript Interpreter::Type_Float rotation = osg::DegreesToRadians(runtime[0].mFloat*MWBase::Environment::get().getFrameDuration()); runtime.pop(); - const float *objRot = ptr.getRefData().getPosition().rot; + if (!ptr.getRefData().getBaseNode()) + return; - float ax = objRot[0]; - float ay = objRot[1]; - float az = objRot[2]; + // We can rotate actors only around Z axis + if (ptr.getClass().isActor() && (axis == "x" || axis == "y")) + return; + osg::Quat rot; if (axis == "x") - { - MWBase::Environment::get().getWorld()->rotateObject(ptr,ax+rotation,ay,az); - } + rot = osg::Quat(rotation, -osg::X_AXIS); else if (axis == "y") - { - MWBase::Environment::get().getWorld()->rotateObject(ptr,ax,ay+rotation,az); - } + rot = osg::Quat(rotation, -osg::Y_AXIS); else if (axis == "z") - { - MWBase::Environment::get().getWorld()->rotateObject(ptr,ax,ay,az+rotation); - } + rot = osg::Quat(rotation, -osg::Z_AXIS); else throw std::runtime_error ("invalid rotation axis: " + axis); + + osg::Quat attitude = ptr.getRefData().getBaseNode()->getAttitude(); + MWBase::Environment::get().getWorld()->rotateWorldObject(ptr, attitude * rot); } }; diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 6cf1ead87..55e2e5dbc 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1342,6 +1342,15 @@ namespace MWWorld rotateObjectImp(ptr, osg::Vec3f(x, y, z), adjust); } + void World::rotateWorldObject (const Ptr& ptr, osg::Quat rotate) + { + if(ptr.getRefData().getBaseNode() != 0) + { + mRendering->rotateObject(ptr, rotate); + mPhysics->updateRotation(ptr); + } + } + MWWorld::Ptr World::placeObject(const MWWorld::ConstPtr& ptr, MWWorld::CellStore* cell, ESM::Position pos) { return copyObjectToCell(ptr,cell,pos,ptr.getRefData().getCount(),false); diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 0d168c912..1d22b96bc 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -214,6 +214,8 @@ namespace MWWorld void setWaterHeight(const float height) override; + void rotateWorldObject (const MWWorld::Ptr& ptr, osg::Quat rotate) override; + bool toggleWater() override; bool toggleWorld() override; From 84c8fb9df7c63796662a3644e1db11ea48988e93 Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Fri, 1 Jun 2018 12:41:31 +0400 Subject: [PATCH 02/10] Add pursue package only when crime was reported (bug #4433) --- .../mwmechanics/mechanicsmanagerimp.cpp | 63 ++++++++++++------- .../mwmechanics/mechanicsmanagerimp.hpp | 4 +- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index df93d875d..05a7e97cd 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1194,16 +1194,41 @@ namespace MWMechanics reportCrime(player, victim, type, arg); else if (type == OT_Assault && !victim.isEmpty()) { + bool reported = false; if (victim.getClass().isClass(victim, "guard") && !victim.getClass().getCreatureStats(victim).getAiSequence().hasPackage(AiPackage::TypeIdPursue)) - reportCrime(player, victim, type, arg); - else + reported = reportCrime(player, victim, type, arg); + + if (!reported) startCombat(victim, player); // TODO: combat should be started with an "unaware" flag, which makes the victim flee? } return crimeSeen; } - void MechanicsManager::reportCrime(const MWWorld::Ptr &player, const MWWorld::Ptr &victim, OffenseType type, int arg) + bool MechanicsManager::canReportCrime(const MWWorld::Ptr &actor, const MWWorld::Ptr &victim, std::set &playerFollowers) + { + if (actor == getPlayer() + || !actor.getClass().isNpc() || actor.getClass().getCreatureStats(actor).isDead()) + return false; + + if (actor.getClass().getCreatureStats(actor).getAiSequence().isInCombat(victim)) + return false; + + // Unconsious actor can not report about crime and should not become hostile + if (actor.getClass().getCreatureStats(actor).getKnockedDown()) + return false; + + // Player's followers should not attack player, or try to arrest him + if (actor.getClass().getCreatureStats(actor).getAiSequence().hasPackage(AiPackage::TypeIdFollow)) + { + if (playerFollowers.find(actor) != playerFollowers.end()) + return false; + } + + return true; + } + + bool MechanicsManager::reportCrime(const MWWorld::Ptr &player, const MWWorld::Ptr &victim, OffenseType type, int arg) { const MWWorld::Store& store = MWBase::Environment::get().getWorld()->getStore().get(); @@ -1278,29 +1303,15 @@ namespace MWMechanics bool reported = false; + std::set playerFollowers; + getActorsSidingWith(player, playerFollowers); + // Tell everyone (including the original reporter) in alarm range for (std::vector::iterator it = neighbors.begin(); it != neighbors.end(); ++it) { - if (*it == player - || !it->getClass().isNpc() || it->getClass().getCreatureStats(*it).isDead()) continue; - - if (it->getClass().getCreatureStats(*it).getAiSequence().isInCombat(victim)) - continue; - - // Unconsious actor can not report about crime and should not become hostile - if (it->getClass().getCreatureStats(*it).getKnockedDown()) + if (!canReportCrime(*it, victim, playerFollowers)) continue; - // Player's followers should not attack player, or try to arrest him - if (it->getClass().getCreatureStats(*it).getAiSequence().hasPackage(AiPackage::TypeIdFollow)) - { - std::set playerFollowers; - getActorsSidingWith(player, playerFollowers); - - if (playerFollowers.find(*it) != playerFollowers.end()) - continue; - } - // Will the witness report the crime? if (it->getClass().getCreatureStats(*it).getAiSetting(CreatureStats::AI_Alarm).getBase() >= 100) { @@ -1309,8 +1320,14 @@ namespace MWMechanics if (type == OT_Trespassing) MWBase::Environment::get().getDialogueManager()->say(*it, "intruder"); } + } + + for (std::vector::iterator it = neighbors.begin(); it != neighbors.end(); ++it) + { + if (!canReportCrime(*it, victim, playerFollowers)) + continue; - if (it->getClass().isClass(*it, "guard")) + if (it->getClass().isClass(*it, "guard") && reported) { // Mark as Alarmed for dialogue it->getClass().getCreatureStats(*it).setAlarmed(true); @@ -1398,6 +1415,8 @@ namespace MWMechanics victim.getClass().getNpcStats(victim).setCrimeId(id); } } + + return reported; } bool MechanicsManager::actorAttacked(const MWWorld::Ptr &target, const MWWorld::Ptr &attacker) diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp index 4bf47cb16..2e16c2793 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp @@ -224,7 +224,9 @@ namespace MWMechanics virtual bool isSneaking(const MWWorld::Ptr& ptr); private: - void reportCrime (const MWWorld::Ptr& ptr, const MWWorld::Ptr& victim, + bool canReportCrime(const MWWorld::Ptr &actor, const MWWorld::Ptr &victim, std::set &playerFollowers); + + bool reportCrime (const MWWorld::Ptr& ptr, const MWWorld::Ptr& victim, OffenseType type, int arg=0); From 191cc76378a71966dda8e11e4933b78034a483bc Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Sun, 3 Jun 2018 09:46:12 +0300 Subject: [PATCH 03/10] Consider faction ownerships in item stolen checks (fixes #4293) --- apps/openmw/mwbase/mechanicsmanager.hpp | 2 +- apps/openmw/mwgui/enchantingdialog.cpp | 3 +-- apps/openmw/mwgui/tradewindow.cpp | 3 +-- apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 9 +++++++-- apps/openmw/mwmechanics/mechanicsmanagerimp.hpp | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwbase/mechanicsmanager.hpp b/apps/openmw/mwbase/mechanicsmanager.hpp index e40bf56bb..f15a86918 100644 --- a/apps/openmw/mwbase/mechanicsmanager.hpp +++ b/apps/openmw/mwbase/mechanicsmanager.hpp @@ -239,7 +239,7 @@ namespace MWBase virtual std::vector > getStolenItemOwners(const std::string& itemid) = 0; /// Has the player stolen this item from the given owner? - virtual bool isItemStolenFrom(const std::string& itemid, const std::string& ownerid) = 0; + virtual bool isItemStolenFrom(const std::string& itemid, const MWWorld::Ptr& ptr) = 0; virtual bool isBoundItem(const MWWorld::Ptr& item) = 0; virtual bool isAllowedToUse (const MWWorld::Ptr& ptr, const MWWorld::Ptr& target, MWWorld::Ptr& victim) = 0; diff --git a/apps/openmw/mwgui/enchantingdialog.cpp b/apps/openmw/mwgui/enchantingdialog.cpp index 3616b8b62..f7764e0f1 100644 --- a/apps/openmw/mwgui/enchantingdialog.cpp +++ b/apps/openmw/mwgui/enchantingdialog.cpp @@ -339,8 +339,7 @@ namespace MWGui for (int i=0; i<2; ++i) { MWWorld::Ptr item = (i == 0) ? mEnchanting.getOldItem() : mEnchanting.getGem(); - if (MWBase::Environment::get().getMechanicsManager()->isItemStolenFrom(item.getCellRef().getRefId(), - mPtr.getCellRef().getRefId())) + if (MWBase::Environment::get().getMechanicsManager()->isItemStolenFrom(item.getCellRef().getRefId(), mPtr)) { std::string msg = MWBase::Environment::get().getWorld()->getStore().get().find("sNotifyMessage49")->getString(); if (msg.find("%s") != std::string::npos) diff --git a/apps/openmw/mwgui/tradewindow.cpp b/apps/openmw/mwgui/tradewindow.cpp index 2eeeafe0d..0a9fe1b4a 100644 --- a/apps/openmw/mwgui/tradewindow.cpp +++ b/apps/openmw/mwgui/tradewindow.cpp @@ -311,8 +311,7 @@ namespace MWGui // check if the player is attempting to sell back an item stolen from this actor for (std::vector::iterator it = merchantBought.begin(); it != merchantBought.end(); ++it) { - if (MWBase::Environment::get().getMechanicsManager()->isItemStolenFrom(it->mBase.getCellRef().getRefId(), - mPtr.getCellRef().getRefId())) + if (MWBase::Environment::get().getMechanicsManager()->isItemStolenFrom(it->mBase.getCellRef().getRefId(), mPtr)) { std::string msg = gmst.find("sNotifyMessage49")->getString(); if (msg.find("%s") != std::string::npos) diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index df93d875d..25fc5c704 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -992,14 +992,19 @@ namespace MWMechanics } } - bool MechanicsManager::isItemStolenFrom(const std::string &itemid, const std::string &ownerid) + bool MechanicsManager::isItemStolenFrom(const std::string &itemid, const MWWorld::Ptr& ptr) { StolenItemsMap::const_iterator it = mStolenItems.find(Misc::StringUtils::lowerCase(itemid)); if (it == mStolenItems.end()) return false; + const OwnerMap& owners = it->second; + const std::string ownerid = ptr.getCellRef().getRefId(); + const std::string factionid = ptr.getClass().getPrimaryFaction(ptr); OwnerMap::const_iterator ownerFound = owners.find(std::make_pair(Misc::StringUtils::lowerCase(ownerid), false)); - return ownerFound != owners.end(); + OwnerMap::const_iterator factionOwnerFound = owners.find(std::make_pair(Misc::StringUtils::lowerCase(factionid), true)); + + return ownerFound != owners.end() || factionOwnerFound != owners.end(); } void MechanicsManager::confiscateStolenItemToOwner(const MWWorld::Ptr &player, const MWWorld::Ptr &item, const MWWorld::Ptr& victim, int count) diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp index 4bf47cb16..ede83b962 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp @@ -205,7 +205,7 @@ namespace MWMechanics virtual std::vector > getStolenItemOwners(const std::string& itemid); /// Has the player stolen this item from the given owner? - virtual bool isItemStolenFrom(const std::string& itemid, const std::string& ownerid); + virtual bool isItemStolenFrom(const std::string& itemid, const MWWorld::Ptr& ptr); virtual bool isBoundItem(const MWWorld::Ptr& item); From 3810ade67a7f473fcc8da9fc20afd8943e74784a Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Sun, 3 Jun 2018 10:50:10 +0300 Subject: [PATCH 04/10] Don't make unnecessary faction ID searches --- apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index 25fc5c704..8da2c86d2 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1000,11 +1000,18 @@ namespace MWMechanics const OwnerMap& owners = it->second; const std::string ownerid = ptr.getCellRef().getRefId(); - const std::string factionid = ptr.getClass().getPrimaryFaction(ptr); OwnerMap::const_iterator ownerFound = owners.find(std::make_pair(Misc::StringUtils::lowerCase(ownerid), false)); - OwnerMap::const_iterator factionOwnerFound = owners.find(std::make_pair(Misc::StringUtils::lowerCase(factionid), true)); + if (ownerFound != owners.end()) + return true; - return ownerFound != owners.end() || factionOwnerFound != owners.end(); + const std::string factionid = ptr.getClass().getPrimaryFaction(ptr); + if (!factionid.empty()) + { + OwnerMap::const_iterator factionOwnerFound = owners.find(std::make_pair(Misc::StringUtils::lowerCase(factionid), true)); + return factionOwnerFound != owners.end(); + } + + return false; } void MechanicsManager::confiscateStolenItemToOwner(const MWWorld::Ptr &player, const MWWorld::Ptr &item, const MWWorld::Ptr& victim, int count) From c14536a399b317d2a2d724333ca17602fbd92307 Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Sun, 3 Jun 2018 13:02:27 +0300 Subject: [PATCH 05/10] Update faction-owned items confiscation --- apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index 8da2c86d2..4a773bdc7 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1029,6 +1029,13 @@ namespace MWMechanics owner.first = victim.getCellRef().getRefId(); owner.second = false; + const std::string victimFaction = victim.getClass().getPrimaryFaction(victim); + if (!victimFaction.empty() && Misc::StringUtils::ciEqual(item.getCellRef().getFaction(), victimFaction)) // Is the item faction-owned? + { + owner.first = victimFaction; + owner.second = true; + } + Misc::StringUtils::lowerCaseInPlace(owner.first); // decrease count of stolen items From fb3facde548c1b79fa640f1d927cabbc24b85c7a Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Thu, 7 Jun 2018 13:21:14 +0200 Subject: [PATCH 06/10] updated changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a958fbc0..8cbef559d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ 0.45.0 ------ - + Bug #4293: Faction members are not aware of faction ownerships in barter + Bug #4426: RotateWorld behavior is incorrect + Bug #4433: Guard behaviour is incorrect with Alarm = 0 0.44.0 ------ From a1ab1dc7fe19b231de3629cbaeb9467a2b9300e5 Mon Sep 17 00:00:00 2001 From: AnyOldName3 Date: Thu, 7 Jun 2018 15:28:45 +0100 Subject: [PATCH 07/10] Add easily understood error messages to the prebuild script instead of vague/silent failures. --- CI/before_script.msvc.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CI/before_script.msvc.sh b/CI/before_script.msvc.sh index 16def0f8c..dd8d830b8 100644 --- a/CI/before_script.msvc.sh +++ b/CI/before_script.msvc.sh @@ -1,5 +1,23 @@ #!/bin/bash +MISSINGTOOLS=0 + +command -v 7z >/dev/null 2>&1 || { echo "Error: 7z (7zip) is not on the path."; MISSINGTOOLS=1; } +command -v cmake >/dev/null 2>&1 || { echo "Error: cmake (CMake) is not on the path."; MISSINGTOOLS=1; } + +if [ $MISSINGTOOLS -ne 0 ]; then + exit 1 +fi + +WORKINGDIR="$(pwd)" +case "$WORKINGDIR" in + *[[:space:]]*) + echo "Error: Working directory contains spaces." + exit 1 + ;; +esac + + set -euo pipefail APPVEYOR=${APPVEYOR:-} From 02f1f712219544e1e9a110492794c88466d0effd Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Thu, 7 Jun 2018 18:42:09 +0400 Subject: [PATCH 08/10] Use link to OpenMW Wiki page instead of direct NifSkope page --- docs/source/reference/modding/convert_bump_mapped_mods.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/source/reference/modding/convert_bump_mapped_mods.rst b/docs/source/reference/modding/convert_bump_mapped_mods.rst index 1891b5c4d..421fa67a7 100644 --- a/docs/source/reference/modding/convert_bump_mapped_mods.rst +++ b/docs/source/reference/modding/convert_bump_mapped_mods.rst @@ -22,7 +22,7 @@ General introduction to normal map conversion This page has general information and tutorials on how normal mapping works in OpenMW and how you can make mods using the old fake normal mapping technique (such as `Netch Bump mapped`_ and `Hlaalu Bump mapped`_, and maybe the most (in)famous one to give shiny rocks in OpenMW, the mod `On the Rocks`_!, featured in MGSO and Morrowind Rebirth) work in OpenMW. -*Note:* The conversion made in the `Converting Apel's Various Things - Sacks`_-part of this tutorial require the use of the application NifSkope. There are binaries available for Windows, but not for Mac or Linux. Reports say that NifSkope versions 1.X will compile on Linux as long as you have Qt packages installed, while the later 2.X versions will not compile. +*Note:* The conversion made in the `Converting Apel's Various Things - Sacks`_-part of this tutorial require the use of the application NifSkope_. *Another note:* I will use the terms bump mapping and normal mapping simultaneously. Normal mapping is one form of bump mapping. In other words, normal mapping is bump mapping, but bump mapping isn't necessarily normal mapping. There are several techniques for bump mapping, and normal mapping is the most common one today. @@ -160,8 +160,6 @@ Converting Apel's Various Things - Sacks In part one of this tutorial, we converted a mod that only included modified Morrowind model (``.nif``) files so that the normal maps could be loaded in Morrowind with MCP. We ignored those model files since they are not needed with OpenMW. In this tutorial however, we will convert a mod that includes new, custom made models. In other words, we cannot just ignore those files this time. -Before we begin, you need to know that unless you want to build the NifSkope application from source yourself, you will be needing a Windows OS to do this part, since the application only has binaries available for Windows. - Tutorial - MCP, Part 2 ********************** @@ -196,7 +194,7 @@ Since these models have one or two textures applied to them, the fix was not tha .. _`Multiple data folders`: https://wiki.openmw.org/index.php?title=Mod_installation .. _`Various Things - Sacks`: https://www.nexusmods.com/morrowind/mods/42558/? .. _Lead: https://imgur.com/bwpcYlc -.. _NifSkope: http://niftools.sourceforge.net/wiki/NifSkope +.. _NifSkope: https://wiki.openmw.org/index.php?title=Tools#NifSkope .. _Blocks: https://imgur.com/VmQC0WG .. _`no longer have shiny models`: https://imgur.com/vu1k7n1 .. _`we are done`: https://imgur.com/yyZxlTw From 937cbfa0a12ae3de5de08198472225cc1a3082bb Mon Sep 17 00:00:00 2001 From: Bret Curtis Date: Thu, 7 Jun 2018 17:09:39 +0200 Subject: [PATCH 09/10] small commit to rigger AV --- CI/before_script.msvc.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/CI/before_script.msvc.sh b/CI/before_script.msvc.sh index dd8d830b8..38b304bf9 100644 --- a/CI/before_script.msvc.sh +++ b/CI/before_script.msvc.sh @@ -17,7 +17,6 @@ case "$WORKINGDIR" in ;; esac - set -euo pipefail APPVEYOR=${APPVEYOR:-} From 57b2948ee1f6a961cf44c4e5fd73dd82ea75c63b Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Thu, 7 Jun 2018 20:34:34 +0400 Subject: [PATCH 10/10] Update AppVeyor build status link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d6a3323a1..cc600fdbe 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ OpenMW ====== -[![Build Status](https://api.travis-ci.org/OpenMW/openmw.svg)](https://travis-ci.org/OpenMW/openmw) [![Build status](https://ci.appveyor.com/api/projects/status/e6bqw8oouy8ufd46?svg=true)](https://ci.appveyor.com/project/scrawl/openmw) [![Coverity Scan Build Status](https://scan.coverity.com/projects/3740/badge.svg)](https://scan.coverity.com/projects/3740) +[![Build Status](https://api.travis-ci.org/OpenMW/openmw.svg)](https://travis-ci.org/OpenMW/openmw) [![Build status](https://ci.appveyor.com/api/projects/status/github/openmw/openmw?svg=true)](https://ci.appveyor.com/project/psi29a/openmw) [![Coverity Scan Build Status](https://scan.coverity.com/projects/3740/badge.svg)](https://scan.coverity.com/projects/3740) OpenMW is a recreation of the engine for the popular role-playing game Morrowind by Bethesda Softworks. You need to own and install the original game for OpenMW to work.