diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
commit | 6352e8e3196f78388b6c771073f9e03eaa612673 (patch) | |
tree | e23772f79a7fbc41bc9108951e9e136857484bf4 /source/game/StarObject.hpp | |
parent | 6741a057e5639280d85d0f88ba26f000baa58f61 (diff) |
everything everywhere
all at once
Diffstat (limited to 'source/game/StarObject.hpp')
-rw-r--r-- | source/game/StarObject.hpp | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/source/game/StarObject.hpp b/source/game/StarObject.hpp new file mode 100644 index 0000000..1a43eb6 --- /dev/null +++ b/source/game/StarObject.hpp @@ -0,0 +1,268 @@ +#ifndef STAR_OBJECT_HPP +#define STAR_OBJECT_HPP + +#include "StarPeriodic.hpp" +#include "StarPeriodicFunction.hpp" +#include "StarNetElementSystem.hpp" +#include "StarLuaComponents.hpp" +#include "StarLuaAnimationComponent.hpp" +#include "StarTileEntity.hpp" +#include "StarStatusEffectEntity.hpp" +#include "StarSet.hpp" +#include "StarColor.hpp" +#include "StarScriptedEntity.hpp" +#include "StarChattyEntity.hpp" +#include "StarWireEntity.hpp" +#include "StarInspectableEntity.hpp" +#include "StarNetworkedAnimator.hpp" +#include "StarDamageTypes.hpp" +#include "StarEntityRendering.hpp" + +namespace Star { + +STAR_CLASS(AudioInstance); +STAR_CLASS(ObjectDatabase); +STAR_STRUCT(ObjectConfig); +STAR_STRUCT(ObjectOrientation); +STAR_CLASS(Object); + +class Object + : public virtual TileEntity, + public virtual StatusEffectEntity, + public virtual ScriptedEntity, + public virtual ChattyEntity, + public virtual InspectableEntity, + public virtual WireEntity { +public: + + Object(ObjectConfigConstPtr config, Json const& parameters = JsonObject()); + + Json diskStore() const; + ByteArray netStore(); + + virtual EntityType entityType() const override; + + virtual void init(World* world, EntityId entityId, EntityMode mode) override; + virtual void uninit() override; + + virtual Vec2F position() const override; + virtual RectF metaBoundBox() const override; + + virtual pair<ByteArray, uint64_t> writeNetState(uint64_t fromVersion = 0) override; + virtual void readNetState(ByteArray data, float interpolationTime = 0.0f) override; + + virtual String description() const override; + + virtual bool inspectable() const override; + virtual Maybe<String> inspectionLogName() const override; + virtual Maybe<String> inspectionDescription(String const& species) const override; + + virtual List<LightSource> lightSources() const override; + + virtual bool shouldDestroy() const override; + virtual void destroy(RenderCallback* renderCallback) override; + + virtual void update(uint64_t currentStep) override; + + virtual void render(RenderCallback* renderCallback) override; + + virtual bool checkBroken() override; + + virtual Vec2I tilePosition() const override; + + virtual List<Vec2I> spaces() const override; + virtual List<MaterialSpace> materialSpaces() const override; + virtual List<Vec2I> roots() const override; + + Direction direction() const; + void setDirection(Direction direction); + + // Updates tile position and calls updateOrientation + void setTilePosition(Vec2I const& pos) override; + + // Find a new valid orientation for the object + void updateOrientation(); + List<Vec2I> anchorPositions() const; + + virtual List<Drawable> cursorHintDrawables() const; + + String name() const; + String shortDescription() const; + String category() const; + + virtual ObjectOrientationPtr currentOrientation() const; + + virtual List<PersistentStatusEffect> statusEffects() const override; + virtual PolyF statusEffectArea() const override; + + virtual List<DamageSource> damageSources() const override; + + virtual Maybe<HitType> queryHit(DamageSource const& source) const override; + Maybe<PolyF> hitPoly() const override; + + virtual List<DamageNotification> applyDamage(DamageRequest const& damage) override; + + virtual bool damageTiles(List<Vec2I> const& position, Vec2F const& sourcePosition, TileDamage const& tileDamage) override; + + RectF interactiveBoundBox() const override; + + bool isInteractive() const override; + virtual InteractAction interact(InteractRequest const& request) override; + List<Vec2I> interactiveSpaces() const override; + + Maybe<LuaValue> callScript(String const& func, LuaVariadic<LuaValue> const& args) override; + Maybe<LuaValue> evalScript(String const& code) override; + + virtual Vec2F mouthPosition() const override; + virtual List<ChatAction> pullPendingChatActions() override; + + void breakObject(bool smash = true); + + virtual size_t nodeCount(WireDirection direction) const override; + virtual Vec2I nodePosition(WireNode wireNode) const override; + virtual List<WireConnection> connectionsForNode(WireNode wireNode) const override; + virtual bool nodeState(WireNode wireNode) const override; + + virtual void addNodeConnection(WireNode wireNode, WireConnection nodeConnection) override; + virtual void removeNodeConnection(WireNode wireNode, WireConnection nodeConnection) override; + + virtual void evaluate(WireCoordinator* coordinator) override; + + virtual List<QuestArcDescriptor> offeredQuests() const override; + virtual StringSet turnInQuests() const override; + virtual Vec2F questIndicatorPosition() const override; + + Maybe<Json> receiveMessage(ConnectionId sendingConnection, String const& message, JsonArray const& args = {}) override; + + // Check, in order, the passed in object parameters, the config parameters, + // and then the orientation parameters for the given key. Returns 'def' if + // no value is found. + Json configValue(String const& name, Json const& def = Json()) const; + + ObjectConfigConstPtr config() const; + + float liquidFillLevel() const; + + bool biomePlaced() const; + + using Entity::setUniqueId; + +protected: + friend class ObjectDatabase; + + // Will be automatically called at appropriate times. Derived classes must + // call base class versions. + virtual void getNetStates(bool initial); + virtual void setNetStates(); + + virtual void readStoredData(Json const& diskStore); + virtual Json writeStoredData() const; + + void setImageKey(String const& name, String const& value); + + size_t orientationIndex() const; + virtual void setOrientationIndex(size_t orientationIndex); + + PolyF volume() const; + + LuaMessageHandlingComponent<LuaStorableComponent<LuaUpdatableComponent<LuaWorldComponent<LuaBaseComponent>>>> m_scriptComponent; + mutable LuaAnimationComponent<LuaUpdatableComponent<LuaWorldComponent<LuaBaseComponent>>> m_scriptedAnimator; + + NetElementTopGroup m_netGroup; + NetElementBool m_interactive; + NetElementData<List<MaterialSpace>> m_materialSpaces; + +private: + struct InputNode { + Vec2I position; + NetElementData<List<WireConnection>> connections; + NetElementBool state; + }; + + struct OutputNode { + Vec2I position; + NetElementData<List<WireConnection>> connections; + NetElementBool state; + }; + + LuaCallbacks makeObjectCallbacks(); + LuaCallbacks makeAnimatorObjectCallbacks(); + + void ensureNetSetup(); + List<Drawable> orientationDrawables(size_t orientationIndex) const; + + void addChatMessage(String const& message, Json const& config, String const& portrait = ""); + + void writeOutboundNode(Vec2I outboundNode, bool state); + + EntityRenderLayer renderLayer() const; + + // Base class render() simply calls all of these in turn. + void renderLights(RenderCallback* renderCallback) const; + void renderParticles(RenderCallback* renderCallback); + void renderSounds(RenderCallback* renderCallback); + + Vec2F damageShake() const; + + void checkLiquidBroken(); + GameTimer m_liquidCheckTimer; + + ObjectConfigConstPtr m_config; + NetElementHashMap<String, Json> m_parameters; + + NetElementData<Maybe<String>> m_uniqueIdNetState; + + NetElementInt m_xTilePosition; + NetElementInt m_yTilePosition; + NetElementEnum<Direction> m_direction; + float m_animationTimer; + int m_currentFrame; + + Maybe<PeriodicFunction<float>> m_lightFlickering; + + EntityTileDamageStatusPtr m_tileDamageStatus; + + bool m_broken; + bool m_unbreakable; + NetElementFloat m_health; + + size_t m_orientationIndex; + NetElementSize m_orientationIndexNetState; + NetElementHashMap<String, String> m_netImageKeys; + StringMap<String> m_imageKeys; + + void resetEmissionTimers(); + List<GameTimer> m_emissionTimers; + + NetElementBool m_soundEffectEnabled; + AudioInstancePtr m_soundEffect; + + NetElementData<Color> m_lightSourceColor; + + Vec2F m_animationPosition; + float m_animationCenterLine; + NetworkedAnimatorPtr m_networkedAnimator; + NetworkedAnimator::DynamicTarget m_networkedAnimatorDynamicTarget; + + List<ChatAction> m_pendingChatActions; + NetElementEvent m_newChatMessageEvent; + NetElementString m_chatMessage; + NetElementString m_chatPortrait; + NetElementData<Json> m_chatConfig; + + mutable Maybe<pair<size_t, List<Drawable>>> m_orientationDrawablesCache; + + List<InputNode> m_inputNodes; + List<OutputNode> m_outputNodes; + + NetElementData<List<QuestArcDescriptor>> m_offeredQuests; + NetElementData<StringSet> m_turnInQuests; + + NetElementHashMap<String, Json> m_scriptedAnimationParameters; + + NetElementData<List<DamageSource>> m_damageSources; +}; + +} + +#endif |