Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarMonsterDatabase.hpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/game/StarMonsterDatabase.hpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/game/StarMonsterDatabase.hpp')
-rw-r--r--source/game/StarMonsterDatabase.hpp201
1 files changed, 201 insertions, 0 deletions
diff --git a/source/game/StarMonsterDatabase.hpp b/source/game/StarMonsterDatabase.hpp
new file mode 100644
index 0000000..47080ce
--- /dev/null
+++ b/source/game/StarMonsterDatabase.hpp
@@ -0,0 +1,201 @@
+#ifndef STAR_MONSTER_DATABASE_HPP
+#define STAR_MONSTER_DATABASE_HPP
+
+#include "StarNetworkedAnimator.hpp"
+#include "StarActorMovementController.hpp"
+#include "StarTtlCache.hpp"
+#include "StarDamageTypes.hpp"
+#include "StarStatusTypes.hpp"
+#include "StarImageProcessing.hpp"
+#include "StarEntityRenderingTypes.hpp"
+
+namespace Star {
+
+STAR_CLASS(RandomSource);
+STAR_CLASS(Monster);
+STAR_CLASS(MonsterDatabase);
+
+STAR_EXCEPTION(MonsterException, StarException);
+
+struct MonsterVariant {
+ String type;
+ uint64_t seed;
+ Json uniqueParameters;
+
+ Maybe<String> shortDescription;
+ Maybe<String> description;
+
+ Json animatorConfig;
+ StringMap<String> animatorPartTags;
+ float animatorZoom;
+ // Is the animator specified Left facing?
+ bool reversed;
+
+ // Either is a String which specifies a dropPool, or a map which maps
+ // damageSourceKind to the appropriate treasure pool for this monster, with a
+ // "default" key as a catch-all.
+ Json dropPoolConfig;
+
+ // Every parameter specified in each section of the monster configuration is
+ // stored here. The base parameters, size parameters, variation parameters,
+ // and part parameters are all merged together into one final configuration.
+ Json parameters;
+
+ // Parameters common to all Monsters
+
+ StringList scripts;
+ unsigned initialScriptDelta;
+ StringList animationScripts;
+
+ RectF metaBoundBox;
+ EntityRenderLayer renderLayer;
+ float scale;
+
+ ActorMovementParameters movementSettings;
+ float walkMultiplier;
+ float runMultiplier;
+ float jumpMultiplier;
+ float weightMultiplier;
+ float healthMultiplier;
+ float touchDamageMultiplier;
+
+ Json touchDamageConfig;
+ StringMap<Json> animationDamageParts;
+ Json statusSettings;
+ Vec2F mouthOffset;
+ Vec2F feetOffset;
+
+ String powerLevelFunction;
+ String healthLevelFunction;
+
+ ClientEntityMode clientEntityMode;
+ bool persistent;
+
+ TeamType damageTeamType;
+ uint8_t damageTeam;
+
+ PolyF selfDamagePoly;
+
+ Maybe<String> portraitIcon;
+
+ float damageReceivedAggressiveDuration;
+ float onDamagedOthersAggressiveDuration;
+ float onFireAggressiveDuration;
+
+ Vec3B nametagColor;
+ Maybe<ColorReplaceMap> colorSwap;
+};
+
+class MonsterDatabase {
+public:
+ MonsterDatabase();
+
+ void cleanup();
+
+ StringList monsterTypes() const;
+
+ MonsterVariant randomMonster(String const& typeName, Json const& uniqueParameters = JsonObject()) const;
+ MonsterVariant monsterVariant(String const& typeName, uint64_t seed, Json const& uniqueParameters = JsonObject()) const;
+
+ ByteArray writeMonsterVariant(MonsterVariant const& variant) const;
+ MonsterVariant readMonsterVariant(ByteArray const& data) const;
+
+ Json writeMonsterVariantToJson(MonsterVariant const& mVar) const;
+ MonsterVariant readMonsterVariantFromJson(Json const& variant) const;
+
+ // If level is 0, then the monster will start with the threat level of
+ // whatever world they're spawned in.
+ MonsterPtr createMonster(MonsterVariant monsterVariant, Maybe<float> level = {}, Json uniqueParameters = {}) const;
+ MonsterPtr diskLoadMonster(Json const& diskStore) const;
+ MonsterPtr netLoadMonster(ByteArray const& netStore) const;
+
+ List<Drawable> monsterPortrait(MonsterVariant const& variant) const;
+
+ pair<String, String> skillInfo(String const& skillName) const;
+ Json skillConfigParameter(String const& skillName, String const& configParameterName) const;
+
+ ColorReplaceMap colorSwap(String const& setName, uint64_t seed) const;
+
+private:
+ struct MonsterType {
+ String typeName;
+ Maybe<String> shortDescription;
+ Maybe<String> description;
+
+ StringList categories;
+ StringList partTypes;
+
+ String animationConfigPath;
+ String colors;
+ bool reversed;
+
+ JsonArray dropPools;
+
+ Json baseParameters;
+
+ // Additional part-specific parameters which will override any part-specific
+ // parameters (such as skills, sounds, etc.) defined in individual .monsterpart files
+ Json partParameterOverrides;
+
+ // Description of all part parameters, and how they are combined and with
+ // what defaults.
+ Json partParameterDescription;
+ };
+
+ struct MonsterPart {
+ String name;
+ String category;
+ String type;
+
+ String path;
+ JsonObject frames;
+ Json partParameters;
+ };
+
+ struct MonsterSkill {
+ String name;
+ String label;
+ String image;
+
+ Json config;
+ Json parameters;
+ Json animationParameters;
+ };
+
+ // Merges part configuration by the method specified in the part parameter
+ // config.
+ static Json mergePartParameters(Json const& partParameterDescription, JsonArray const& parameters);
+
+ // Merges final monster variant parameters together according to the
+ // hard-coded variant merge rules (handles things like scripts which are
+ // combined rather than overwritten)
+ static Json mergeFinalParameters(JsonArray const& parameters);
+
+ // Reads common parameters out of parameters map
+ static void readCommonParameters(MonsterVariant& monsterVariant);
+
+ // Maps category name -> part type -> part name -> MonsterPart. part name ->
+ // MonsterPart needs to be be in a predictable order.
+ typedef StringMap<StringMap<Map<String, MonsterPart>>> PartDirectory;
+
+ MonsterVariant produceMonster(String const& typeName, uint64_t seed, Json const& uniqueParameters) const;
+
+ // Given a variant including parameters for baseSkills and specialSkills,
+ // returns a variant containing a final 'skills' list of chosen skills, also
+ // merges animation configs from skills together.
+ pair<Json, Json> chooseSkills(Json const& parameters, Json const& animatorConfig, RandomSource& rand) const;
+
+ StringMap<MonsterType> m_monsterTypes;
+ PartDirectory m_partDirectory;
+ StringMap<MonsterSkill> m_skills;
+ StringMap<List<ColorReplaceMap>> m_colorSwaps;
+
+ mutable Mutex m_cacheMutex;
+
+ // Key here is the type name, seed, and the serialized unique parameters JSON
+ mutable HashTtlCache<tuple<String, uint64_t, Json>, MonsterVariant> m_monsterCache;
+};
+
+}
+
+#endif