MCPcopy Create free account
hub / github.com/OpenStarbound/OpenStarbound / produceMonster

Method produceMonster

source/game/StarMonsterDatabase.cpp:386–442  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

384}
385
386MonsterVariant 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

Callers

nothing calls this directly

Calls 15

RandomSourceClass · 0.85
singletonClass · 0.85
fetchJsonMethod · 0.80
assetsMethod · 0.80
optStringMethod · 0.80
randValueFromMethod · 0.80
toArrayMethod · 0.80
jsonMergeFunction · 0.50
getMethod · 0.45
appendMethod · 0.45
toStringMethod · 0.45
isNullMethod · 0.45

Tested by

no test coverage detected