| 384 | } |
| 385 | |
| 386 | MonsterVariant MonsterDatabase::produceMonster(String const& typeName, uint64_t seed, Json const& uniqueParameters) const { |
| 387 | RandomSource rand = RandomSource(seed); |
| 388 | |
| 389 | auto const& monsterType = m_monsterTypes.get(typeName); |
| 390 | |
| 391 | MonsterVariant monsterVariant; |
| 392 | monsterVariant.type = typeName; |
| 393 | monsterVariant.shortDescription = monsterType.shortDescription; |
| 394 | monsterVariant.description = monsterType.description; |
| 395 | monsterVariant.seed = seed; |
| 396 | monsterVariant.uniqueParameters = uniqueParameters; |
| 397 | |
| 398 | monsterVariant.animatorConfig = Root::singleton().assets()->fetchJson(monsterType.animationConfigPath); |
| 399 | monsterVariant.reversed = monsterType.reversed; |
| 400 | |
| 401 | // select a list of monster parts |
| 402 | List<MonsterPart> monsterParts; |
| 403 | auto categoryName = rand.randFrom(monsterType.categories); |
| 404 | |
| 405 | for (auto const& partTypeName : monsterType.partTypes) { |
| 406 | auto randPart = rand.randFrom(m_partDirectory.get(categoryName).get(partTypeName)).second; |
| 407 | auto selectedPart = uniqueParameters.get("selectedParts", JsonObject()).optString(partTypeName); |
| 408 | if (selectedPart) |
| 409 | monsterParts.append(m_partDirectory.get(categoryName).get(partTypeName).get(*selectedPart)); |
| 410 | else |
| 411 | monsterParts.append(randPart); |
| 412 | } |
| 413 | |
| 414 | for (auto const& partConfig : monsterParts) { |
| 415 | for (auto const& pair : partConfig.frames) |
| 416 | monsterVariant.animatorPartTags[pair.first] = AssetPath::relativeTo(partConfig.path, pair.second.toString()); |
| 417 | } |
| 418 | JsonArray partParameterList; |
| 419 | for (auto const& partConfig : monsterParts) { |
| 420 | partParameterList.append(partConfig.partParameters); |
| 421 | // Include part parameter overrides |
| 422 | if (!monsterType.partParameterOverrides.isNull() && monsterType.partParameterOverrides.contains(partConfig.name)) |
| 423 | partParameterList.append(monsterType.partParameterOverrides.getObject(partConfig.name)); |
| 424 | } |
| 425 | |
| 426 | // merge part parameters and unique parameters into base parameters |
| 427 | Json baseParameters = monsterType.baseParameters; |
| 428 | Json mergedPartParameters = mergePartParameters(monsterType.partParameterDescription, partParameterList); |
| 429 | monsterVariant.parameters = mergeFinalParameters({baseParameters, mergedPartParameters}); |
| 430 | monsterVariant.parameters = jsonMerge(monsterVariant.parameters, uniqueParameters); |
| 431 | |
| 432 | tie(monsterVariant.parameters, monsterVariant.animatorConfig) = chooseSkills(monsterVariant.parameters, monsterVariant.animatorConfig, rand); |
| 433 | monsterVariant.animatorZoom = 1.0f; |
| 434 | monsterVariant.dropPoolConfig = monsterType.dropPools; |
| 435 | |
| 436 | readCommonParameters(monsterVariant); |
| 437 | monsterVariant.animatorZoom = monsterVariant.scale; |
| 438 | if (monsterVariant.dropPoolConfig.isType(Json::Type::Array)) |
| 439 | monsterVariant.dropPoolConfig = rand.randValueFrom(monsterVariant.dropPoolConfig.toArray()); |
| 440 | |
| 441 | return monsterVariant; |
| 442 | } |
| 443 |
nothing calls this directly
no test coverage detected