| 259 | } |
| 260 | |
| 261 | NpcVariant NpcDatabase::readNpcVariantFromJson(Json const& data) const { |
| 262 | NpcVariant variant; |
| 263 | |
| 264 | variant.species = data.getString("species"); |
| 265 | variant.typeName = data.getString("typeName"); |
| 266 | variant.level = data.getFloat("level"); |
| 267 | variant.seed = data.getUInt("seed"); |
| 268 | variant.overrides = data.get("overrides"); |
| 269 | |
| 270 | auto config = buildConfig(variant.typeName, variant.overrides); |
| 271 | |
| 272 | variant.scripts = jsonToStringList(config.get("scripts")); |
| 273 | variant.scriptConfig = config.get("scriptConfig"); |
| 274 | |
| 275 | variant.initialScriptDelta = data.getInt("initialScriptDelta"); |
| 276 | variant.humanoidIdentity = HumanoidIdentity(data.get("humanoidIdentity")); |
| 277 | |
| 278 | auto speciesDefinition = Root::singleton().speciesDatabase()->species(variant.species); |
| 279 | if (config.contains("humanoidConfig")) |
| 280 | variant.humanoidConfig = Root::singleton().assets()->json(config.getString("humanoidConfig")); |
| 281 | else |
| 282 | variant.humanoidConfig = speciesDefinition->humanoidConfig(); |
| 283 | |
| 284 | variant.movementParameters = |
| 285 | jsonMerge(variant.humanoidConfig.get("movementParameters"), config.get("movementParameters", {})); |
| 286 | variant.statusControllerSettings = config.get("statusControllerSettings", {}); |
| 287 | |
| 288 | auto functionDatabase = Root::singleton().functionDatabase(); |
| 289 | float powerMultiplierModifier = |
| 290 | functionDatabase->function("npcLevelPowerMultiplierModifier")->evaluate(variant.level); |
| 291 | float protectionMultiplier = functionDatabase->function("npcLevelProtectionMultiplier")->evaluate(variant.level); |
| 292 | float maxHealthMultiplier = functionDatabase->function("npcLevelHealthMultiplier")->evaluate(variant.level); |
| 293 | float maxEnergyMultiplier = functionDatabase->function("npcLevelEnergyMultiplier")->evaluate(variant.level); |
| 294 | |
| 295 | variant.innateStatusEffects = |
| 296 | config.get("innateStatusEffects", JsonArray()).toArray().transformed(jsonToPersistentStatusEffect); |
| 297 | variant.innateStatusEffects.append(StatModifier(StatValueModifier{"powerMultiplier", powerMultiplierModifier})); |
| 298 | variant.innateStatusEffects.append(StatModifier(StatBaseMultiplier{"protection", protectionMultiplier})); |
| 299 | variant.innateStatusEffects.append(StatModifier(StatBaseMultiplier{"maxHealth", maxHealthMultiplier})); |
| 300 | variant.innateStatusEffects.append(StatModifier(StatBaseMultiplier{"maxEnergy", maxEnergyMultiplier})); |
| 301 | |
| 302 | variant.touchDamageConfig = config.get("touchDamage", {}); |
| 303 | |
| 304 | variant.items = jsonToMapV<StringMap<ItemDescriptor>>(data.get("items"), ItemDescriptor::loadStore); |
| 305 | |
| 306 | variant.disableWornArmor = config.getBool("disableWornArmor", true); |
| 307 | variant.dropPools = jsonToStringList(config.get("dropPools", JsonArray{})); |
| 308 | |
| 309 | variant.persistent = data.getBool("persistent"); |
| 310 | variant.keepAlive = data.getBool("keepAlive"); |
| 311 | variant.damageTeam = data.getUInt("damageTeam"); |
| 312 | variant.damageTeamType = TeamTypeNames.getLeft(data.getString("damageTeamType")); |
| 313 | |
| 314 | variant.nametagColor = jsonToVec3B(config.get("nametagColor", JsonArray{255, 255, 255})); |
| 315 | |
| 316 | variant.splashConfig = EntitySplashConfig(config.get("splashConfig")); |
| 317 | |
| 318 | return variant; |
nothing calls this directly
no test coverage detected