| 334 | } |
| 335 | |
| 336 | void MonsterDatabase::readCommonParameters(MonsterVariant& variant) { |
| 337 | variant.shortDescription = variant.parameters.optString("shortdescription").orMaybe(variant.shortDescription); |
| 338 | variant.dropPoolConfig = variant.parameters.get("dropPools", variant.dropPoolConfig); |
| 339 | variant.scripts = jsonToStringList(variant.parameters.get("scripts")); |
| 340 | variant.animationScripts = jsonToStringList(variant.parameters.getArray("animationScripts", {})); |
| 341 | variant.animatorConfig = jsonMerge(variant.animatorConfig, variant.parameters.get("animationCustom", JsonObject())); |
| 342 | variant.initialScriptDelta = variant.parameters.getUInt("initialScriptDelta", 5); |
| 343 | variant.metaBoundBox = jsonToRectF(variant.parameters.get("metaBoundBox")); |
| 344 | variant.renderLayer = variant.parameters.optString("renderLayer").apply(parseRenderLayer).value(RenderLayerMonster); |
| 345 | variant.scale = variant.parameters.getFloat("scale"); |
| 346 | variant.movementSettings = ActorMovementParameters(variant.parameters.get("movementSettings", {})); |
| 347 | variant.walkMultiplier = variant.parameters.getFloat("walkMultiplier", 1.0f); |
| 348 | variant.runMultiplier = variant.parameters.getFloat("runMultiplier", 1.0f); |
| 349 | variant.jumpMultiplier = variant.parameters.getFloat("jumpMultiplier", 1.0f); |
| 350 | variant.weightMultiplier = variant.parameters.getFloat("weightMultiplier", 1.0f); |
| 351 | variant.healthMultiplier = variant.parameters.getFloat("healthMultiplier", 1.0f); |
| 352 | variant.touchDamageMultiplier = variant.parameters.getFloat("touchDamageMultiplier", 1.0f); |
| 353 | variant.touchDamageConfig = variant.parameters.get("touchDamage", {}); |
| 354 | variant.animationDamageParts = variant.parameters.getObject("animationDamageParts", {}); |
| 355 | variant.statusSettings = variant.parameters.get("statusSettings"); |
| 356 | variant.mouthOffset = jsonToVec2F(variant.parameters.get("mouthOffset")) / TilePixels; |
| 357 | variant.feetOffset = jsonToVec2F(variant.parameters.get("feetOffset")) / TilePixels; |
| 358 | variant.powerLevelFunction = variant.parameters.getString("powerLevelFunction", "monsterLevelPowerMultiplier"); |
| 359 | variant.healthLevelFunction = variant.parameters.getString("healthLevelFunction", "monsterLevelHealthMultiplier"); |
| 360 | variant.clientEntityMode = ClientEntityModeNames.getLeft(variant.parameters.getString("clientEntityMode", "ClientSlaveOnly")); |
| 361 | variant.persistent = variant.parameters.getBool("persistent", false); |
| 362 | variant.damageTeamType = TeamTypeNames.getLeft(variant.parameters.getString("damageTeamType", "enemy")); |
| 363 | variant.damageTeam = variant.parameters.getUInt("damageTeam", 2); |
| 364 | |
| 365 | if (auto sdp = variant.parameters.get("selfDamagePoly", {})) |
| 366 | variant.selfDamagePoly = jsonToPolyF(sdp); |
| 367 | else |
| 368 | variant.selfDamagePoly = *variant.movementSettings.standingPoly; |
| 369 | |
| 370 | variant.portraitIcon = variant.parameters.optString("portraitIcon"); |
| 371 | variant.damageReceivedAggressiveDuration = variant.parameters.getFloat("damageReceivedAggressiveDuration", 1.0f); |
| 372 | variant.onDamagedOthersAggressiveDuration = variant.parameters.getFloat("onDamagedOthersAggressiveDuration", 5.0f); |
| 373 | variant.onFireAggressiveDuration = variant.parameters.getFloat("onFireAggressiveDuration", 5.0f); |
| 374 | |
| 375 | variant.nametagColor = jsonToVec3B(variant.parameters.get("nametagColor", JsonArray{255, 255, 255})); |
| 376 | |
| 377 | variant.colorSwap = variant.parameters.optObject("colorSwap").apply([](JsonObject const& json) -> ColorReplaceMap { |
| 378 | ColorReplaceMap swaps; |
| 379 | for (auto pair : json) { |
| 380 | swaps.insert(Color::fromHex(pair.first).toRgba(), Color::fromHex(pair.second.toString()).toRgba()); |
| 381 | } |
| 382 | return swaps; |
| 383 | }); |
| 384 | } |
| 385 | |
| 386 | MonsterVariant MonsterDatabase::produceMonster(String const& typeName, uint64_t seed, Json const& uniqueParameters) const { |
| 387 | RandomSource rand = RandomSource(seed); |
nothing calls this directly
no test coverage detected