1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-29 18:32:36 +00:00
OpenMW/apps/openmw/mwbase/mechanicsmanager.hpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

289 lines
12 KiB
C++
Raw Normal View History

#ifndef GAME_MWBASE_MECHANICSMANAGER_H
#define GAME_MWBASE_MECHANICSMANAGER_H
#include <cstdint>
#include <map>
#include <set>
#include <string>
2022-08-23 18:25:25 +02:00
#include <string_view>
#include <vector>
#include "../mwmechanics/greetingstate.hpp"
#include "../mwworld/ptr.hpp"
2015-06-01 21:41:13 +02:00
namespace osg
{
class Stats;
2015-06-01 21:41:13 +02:00
class Vec3f;
}
namespace ESM
{
struct Class;
2023-02-15 23:19:51 +01:00
class RefId;
class ESMReader;
class ESMWriter;
}
namespace MWWorld
{
class Ptr;
class CellStore;
class CellRef;
}
namespace Loading
{
class Listener;
}
namespace MWBase
{
/// \brief Interface for game mechanics manager (implemented in MWMechanics)
class MechanicsManager
{
MechanicsManager(const MechanicsManager&);
///< not implemented
2022-09-22 21:26:05 +03:00
MechanicsManager& operator=(const MechanicsManager&);
///< not implemented
2022-09-22 21:26:05 +03:00
public:
MechanicsManager() {}
2022-09-22 21:26:05 +03:00
virtual ~MechanicsManager() {}
2022-09-22 21:26:05 +03:00
virtual void add(const MWWorld::Ptr& ptr) = 0;
///< Register an object for management
2022-09-22 21:26:05 +03:00
virtual void remove(const MWWorld::Ptr& ptr, bool keepActive) = 0;
///< Deregister an object for management
2022-09-22 21:26:05 +03:00
virtual void updateCell(const MWWorld::Ptr& old, const MWWorld::Ptr& ptr) = 0;
///< Moves an object to a new cell
2022-09-22 21:26:05 +03:00
virtual void drop(const MWWorld::CellStore* cellStore) = 0;
///< Deregister all objects in the given cell.
2022-09-22 21:26:05 +03:00
virtual void setPlayerName(const std::string& name) = 0;
///< Set player name.
2022-09-22 21:26:05 +03:00
virtual void setPlayerRace(const ESM::RefId& id, bool male, const ESM::RefId& head, const ESM::RefId& hair) = 0;
///< Set player race.
2022-09-22 21:26:05 +03:00
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
virtual void setPlayerBirthsign(const ESM::RefId& id) = 0;
///< Set player birthsign.
2022-09-22 21:26:05 +03:00
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
virtual void setPlayerClass(const ESM::RefId& id) = 0;
///< Set player class to stock class.
2022-09-22 21:26:05 +03:00
virtual void setPlayerClass(const ESM::Class& class_) = 0;
///< Set player class to custom class.
2022-09-22 21:26:05 +03:00
virtual void restoreDynamicStats(const MWWorld::Ptr& actor, double hours, bool sleep) = 0;
2022-09-22 21:26:05 +03:00
virtual void rest(double hours, bool sleep) = 0;
///< If the player is sleeping or waiting, this should be called every hour.
/// @param sleep is the player sleeping or waiting?
2022-09-22 21:26:05 +03:00
virtual int getHoursToRest() const = 0;
///< Calculate how many hours the player needs to rest in order to be fully healed
2022-09-22 21:26:05 +03:00
virtual int getBarterOffer(const MWWorld::Ptr& ptr, int basePrice, bool buying) = 0;
2014-01-07 19:49:16 +01:00
///< This is used by every service to determine the price of objects given the trading skills of the player and
///< NPC.
2022-09-22 21:26:05 +03:00
2014-01-07 19:49:16 +01:00
virtual int getDerivedDisposition(const MWWorld::Ptr& ptr, bool clamp = true) = 0;
///< Calculate the diposition of an NPC toward the player.
2022-09-22 21:26:05 +03:00
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
virtual int countDeaths(const ESM::RefId& id) const = 0;
2014-01-07 19:49:16 +01:00
///< Return the number of deaths for actors with the given ID.
2022-09-22 21:26:05 +03:00
/// Check if \a observer is potentially aware of \a ptr. Does not do a line of sight check!
virtual bool awarenessCheck(const MWWorld::Ptr& ptr, const MWWorld::Ptr& observer) = 0;
2022-09-22 21:26:05 +03:00
/// Makes \a ptr fight \a target. Also shouts a combat taunt.
virtual void startCombat(const MWWorld::Ptr& ptr, const MWWorld::Ptr& target) = 0;
2022-09-22 21:26:05 +03:00
/// Removes an actor and its allies from combat with the actor's targets.
virtual void stopCombat(const MWWorld::Ptr& ptr) = 0;
2022-09-22 21:26:05 +03:00
2012-11-09 20:18:38 +01:00
enum OffenseType
{
OT_Theft, // Taking items owned by an NPC or a faction you are not a member of
OT_Assault, // Attacking a peaceful NPC
OT_Murder, // Murdering a peaceful NPC
OT_Trespassing, // Picking the lock of an owned door/chest
OT_SleepingInOwnedBed, // Sleeping in a bed owned by an NPC or a faction you are not a member of
OT_Pickpocket // Entering pickpocket mode, leaving it, and being detected. Any items stolen are a separate
2013-12-07 13:17:28 +01:00
// crime (Theft)
2022-09-22 21:26:05 +03:00
};
/**
2013-12-07 13:17:28 +01:00
* @note victim may be empty
* @param arg Depends on \a type, e.g. for Theft, the value of the item that was stolen.
* @param victimAware Is the victim already aware of the crime?
* If this parameter is false, it will be determined by a line-of-sight and awareness check.
* @return was the crime seen?
*/
virtual bool commitCrime(const MWWorld::Ptr& ptr, const MWWorld::Ptr& victim, OffenseType type,
const ESM::RefId& factionId = ESM::RefId(), int arg = 0, bool victimAware = false)
= 0;
2013-12-07 13:17:28 +01:00
/// @return false if the attack was considered a "friendly hit" and forgiven
2015-06-01 21:41:13 +02:00
virtual bool actorAttacked(const MWWorld::Ptr& victim, const MWWorld::Ptr& attacker) = 0;
2022-09-22 21:26:05 +03:00
/// Notify that actor was killed, add a murder bounty if applicable
/// @note No-op for non-player attackers
2022-02-25 04:02:21 +02:00
virtual void actorKilled(const MWWorld::Ptr& victim, const MWWorld::Ptr& attacker) = 0;
2022-09-22 21:26:05 +03:00
2022-02-25 04:02:21 +02:00
/// Utility to check if taking this item is illegal and calling commitCrime if so
/// @param container The container the item is in; may be empty for an item in the world
virtual void itemTaken(const MWWorld::Ptr& ptr, const MWWorld::Ptr& item, const MWWorld::Ptr& container,
int count, bool alarm = true)
2022-09-22 21:26:05 +03:00
= 0;
2022-02-25 04:02:21 +02:00
/// Utility to check if unlocking this object is illegal and calling commitCrime if so
virtual void unlockAttempted(const MWWorld::Ptr& ptr, const MWWorld::Ptr& item) = 0;
/// Attempt sleeping in a bed. If this is illegal, call commitCrime.
/// @return was it illegal, and someone saw you doing it?
virtual bool sleepInBed(const MWWorld::Ptr& ptr, const MWWorld::Ptr& bed) = 0;
2022-02-25 04:02:21 +02:00
enum PersuasionType
2022-09-22 21:26:05 +03:00
{
2022-02-25 04:02:21 +02:00
PT_Admire,
2012-11-09 20:18:38 +01:00
PT_Intimidate,
2022-09-22 21:26:05 +03:00
PT_Taunt,
2012-11-09 20:18:38 +01:00
PT_Bribe10,
PT_Bribe100,
PT_Bribe1000
2022-02-25 04:02:21 +02:00
};
virtual void getPersuasionDispositionChange(
const MWWorld::Ptr& npc, PersuasionType type, bool& success, int& tempChange, int& permChange)
= 0;
///< Perform a persuasion action on NPC
2016-06-07 01:53:16 +02:00
virtual void forceStateUpdate(const MWWorld::Ptr& ptr) = 0;
///< Forces an object to refresh its animation state.
2013-12-07 13:17:28 +01:00
virtual bool playAnimationGroup(
const MWWorld::Ptr& ptr, std::string_view groupName, int mode, int number = 1, bool persist = false)
2022-09-22 21:26:05 +03:00
= 0;
2013-12-07 13:17:28 +01:00
///< Run animation for a MW-reference. Calls to this function for references that are currently not
/// in the scene should be ignored.
2022-09-22 21:26:05 +03:00
///
2013-12-07 13:17:28 +01:00
/// \param mode 0 normal, 1 immediate start, 2 immediate loop
/// \param count How many times the animation should be run
/// \param persist Whether the animation state should be stored in saved games
/// and persist after cell unload.
/// \return Success or error
2022-09-22 21:26:05 +03:00
virtual void skipAnimation(const MWWorld::Ptr& ptr) = 0;
2013-12-07 13:17:28 +01:00
///< Skip the animation for the given MW-reference for one frame. Calls to this function for
/// references that are currently not in the scene should be ignored.
2022-08-23 18:25:25 +02:00
virtual bool checkAnimationPlaying(const MWWorld::Ptr& ptr, const std::string& groupName) = 0;
2022-09-22 21:26:05 +03:00
/// Save the current animation state of managed references to their RefData.
virtual void persistAnimationStates() = 0;
2022-09-22 21:26:05 +03:00
2013-12-07 13:17:28 +01:00
/// Update magic effects for an actor. Usually done automatically once per frame, but if we're currently
/// paused we may want to do it manually (after equipping permanent enchantment)
2013-12-07 13:17:28 +01:00
virtual void updateMagicEffects(const MWWorld::Ptr& ptr) = 0;
2022-09-22 21:26:05 +03:00
virtual bool toggleAI() = 0;
2013-12-07 13:17:28 +01:00
virtual bool isAIActive() = 0;
2022-09-22 21:26:05 +03:00
2015-06-01 21:41:13 +02:00
virtual void getObjectsInRange(const osg::Vec3f& position, float radius, std::vector<MWWorld::Ptr>& objects)
2022-09-22 21:26:05 +03:00
= 0;
2015-06-01 21:41:13 +02:00
virtual void getActorsInRange(const osg::Vec3f& position, float radius, std::vector<MWWorld::Ptr>& objects) = 0;
2022-09-22 21:26:05 +03:00
/// Check if there are actors in selected range
virtual bool isAnyActorInRange(const osg::Vec3f& position, float radius) = 0;
2022-09-22 21:26:05 +03:00
/// Returns the list of actors which are siding with the given actor in fights
/**ie AiFollow or AiEscort is active and the target is the actor **/
2022-02-25 04:02:21 +02:00
virtual std::vector<MWWorld::Ptr> getActorsSidingWith(const MWWorld::Ptr& actor) = 0;
virtual std::vector<MWWorld::Ptr> getActorsFollowing(const MWWorld::Ptr& actor) = 0;
virtual std::vector<int> getActorsFollowingIndices(const MWWorld::Ptr& actor) = 0;
virtual std::map<int, MWWorld::Ptr> getActorsFollowingByIndex(const MWWorld::Ptr& actor) = 0;
2022-09-22 21:26:05 +03:00
/// Returns a list of actors who are fighting the given actor within the fAlarmDistance
/** ie AiCombat is active and the target is the actor **/
2022-02-25 04:02:21 +02:00
virtual std::vector<MWWorld::Ptr> getActorsFighting(const MWWorld::Ptr& actor) = 0;
2022-09-22 21:26:05 +03:00
2022-02-25 04:02:21 +02:00
virtual std::vector<MWWorld::Ptr> getEnemiesNearby(const MWWorld::Ptr& actor) = 0;
2022-09-22 21:26:05 +03:00
/// Recursive versions of above methods
virtual void getActorsFollowing(const MWWorld::Ptr& actor, std::set<MWWorld::Ptr>& out) = 0;
virtual void getActorsSidingWith(const MWWorld::Ptr& actor, std::set<MWWorld::Ptr>& out) = 0;
2022-09-22 21:26:05 +03:00
virtual void playerLoaded() = 0;
2022-09-22 21:26:05 +03:00
virtual int countSavedGameRecords() const = 0;
2022-09-22 21:26:05 +03:00
virtual void write(ESM::ESMWriter& writer, Loading::Listener& listener) const = 0;
2015-01-22 19:04:59 +01:00
virtual void readRecord(ESM::ESMReader& reader, uint32_t type) = 0;
virtual void clear() = 0;
virtual bool isAggressive(const MWWorld::Ptr& ptr, const MWWorld::Ptr& target) = 0;
/// Resurrects the player if necessary
2019-09-21 20:22:45 +04:00
virtual void resurrect(const MWWorld::Ptr& ptr) = 0;
virtual bool isCastingSpell(const MWWorld::Ptr& ptr) const = 0;
virtual bool isReadyToBlock(const MWWorld::Ptr& ptr) const = 0;
virtual bool isAttackingOrSpell(const MWWorld::Ptr& ptr) const = 0;
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
virtual void castSpell(const MWWorld::Ptr& ptr, const ESM::RefId& spellId, bool manualSpell) = 0;
virtual void processChangedSettings(const std::set<std::pair<std::string, std::string>>& settings) = 0;
virtual void notifyDied(const MWWorld::Ptr& actor) = 0;
virtual bool onOpen(const MWWorld::Ptr& ptr) = 0;
virtual void onClose(const MWWorld::Ptr& ptr) = 0;
/// Check if the target actor was detected by an observer
/// If the observer is a non-NPC, check all actors in AI processing distance as observers
virtual bool isActorDetected(const MWWorld::Ptr& actor, const MWWorld::Ptr& observer) = 0;
virtual void confiscateStolenItems(const MWWorld::Ptr& player, const MWWorld::Ptr& targetContainer) = 0;
/// List the owners that the player has stolen this item from (the owner can be an NPC or a faction).
/// <Owner, item count>
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
virtual std::vector<std::pair<ESM::RefId, int>> getStolenItemOwners(const ESM::RefId& itemid) = 0;
/// Has the player stolen this item from the given owner?
Initial commit: In ESM structures, replace the string members that are RefIds to other records, to a new strong type The strong type is actually just a string underneath, but this will help in the future to have a distinction so it's easier to search and replace when we use an integer ID Slowly going through all the changes to make, still hundreds of errors a lot of functions/structures use std::string or stringview to designate an ID. So it takes time Continues slowly replacing ids. There are technically more and more compilation errors I have good hope that there is a point where the amount of errors will dramatically go down as all the main functions use the ESM::RefId type Continue moving forward, changes to the stores slowly moving along Starting to see the fruit of those changes. still many many error, but more and more Irun into a situation where a function is sandwiched between two functions that use the RefId type. More replacements. Things are starting to get easier I can see more and more often the issue is that the function is awaiting a RefId, but is given a string there is less need to go down functions and to fix a long list of them. Still moving forward, and for the first time error count is going down! Good pace, not sure about topics though, mId and mName are actually the same thing and are used interchangeably Cells are back to using string for the name, haven't fixed everything yet. Many other changes Under the bar of 400 compilation errors. more good progress <100 compile errors! More progress Game settings store can use string for find, it was a bit absurd how every use of it required to create refId from string some more progress on other fronts Mostly game settings clean one error opened a lot of other errors. Down to 18, but more will prbably appear only link errors left?? Fixed link errors OpenMW compiles, and launches, with some issues, but still!
2022-09-25 13:17:09 +02:00
virtual bool isItemStolenFrom(const ESM::RefId& itemid, const MWWorld::Ptr& ptr) = 0;
2017-11-10 09:43:22 +04:00
virtual bool isBoundItem(const MWWorld::Ptr& item) = 0;
virtual bool isAllowedToUse(const MWWorld::Ptr& ptr, const MWWorld::Ptr& target, MWWorld::Ptr& victim) = 0;
/// Turn actor into werewolf or normal form.
virtual void setWerewolf(const MWWorld::Ptr& actor, bool werewolf) = 0;
/// Sets the NPC's Acrobatics skill to match the fWerewolfAcrobatics GMST.
/// It only applies to the current form the NPC is in.
virtual void applyWerewolfAcrobatics(const MWWorld::Ptr& actor) = 0;
virtual void cleanupSummonedCreature(const MWWorld::Ptr& caster, int creatureActorId) = 0;
virtual void confiscateStolenItemToOwner(
const MWWorld::Ptr& player, const MWWorld::Ptr& item, const MWWorld::Ptr& victim, int count)
= 0;
virtual bool isAttackPreparing(const MWWorld::Ptr& ptr) = 0;
virtual bool isRunning(const MWWorld::Ptr& ptr) = 0;
virtual bool isSneaking(const MWWorld::Ptr& ptr) = 0;
virtual void reportStats(unsigned int frameNumber, osg::Stats& stats) const = 0;
virtual int getGreetingTimer(const MWWorld::Ptr& ptr) const = 0;
virtual float getAngleToPlayer(const MWWorld::Ptr& ptr) const = 0;
virtual MWMechanics::GreetingState getGreetingState(const MWWorld::Ptr& ptr) const = 0;
virtual bool isTurningToPlayer(const MWWorld::Ptr& ptr) const = 0;
};
}
#endif