| 332 | } |
| 333 | |
| 334 | List<Drawable> NpcDatabase::npcPortrait(NpcVariant const& npcVariant, PortraitMode mode) const { |
| 335 | Humanoid humanoid(npcVariant.humanoidConfig); |
| 336 | humanoid.setIdentity(npcVariant.humanoidIdentity); |
| 337 | |
| 338 | auto itemDatabase = Root::singleton().itemDatabase(); |
| 339 | auto items = StringMap<ItemDescriptor, CaseInsensitiveStringHash, CaseInsensitiveStringCompare>::from(npcVariant.items); |
| 340 | |
| 341 | auto makeItem = [&npcVariant, &itemDatabase](ItemDescriptor itemDescriptor) -> ItemPtr { |
| 342 | return itemDatabase->item(itemDescriptor, npcVariant.level, npcVariant.seed); |
| 343 | }; |
| 344 | |
| 345 | ArmorWearer armor; |
| 346 | if (items.contains("head")) |
| 347 | armor.setHeadItem(as<HeadArmor>(makeItem(items["head"]))); |
| 348 | if (items.contains("headCosmetic")) |
| 349 | armor.setHeadItem(as<HeadArmor>(makeItem(items["headCosmetic"]))); |
| 350 | if (items.contains("chest")) |
| 351 | armor.setChestItem(as<ChestArmor>(makeItem(items["chest"]))); |
| 352 | if (items.contains("chestCosmetic")) |
| 353 | armor.setChestCosmeticItem(as<ChestArmor>(makeItem(items["chestCosmetic"]))); |
| 354 | if (items.contains("legs")) |
| 355 | armor.setLegsItem(as<LegsArmor>(makeItem(items["legs"]))); |
| 356 | if (items.contains("legsCosmetic")) |
| 357 | armor.setLegsCosmeticItem(as<LegsArmor>(makeItem(items["legsCosmetic"]))); |
| 358 | if (items.contains("back")) |
| 359 | armor.setBackItem(as<BackArmor>(makeItem(items["back"]))); |
| 360 | if (items.contains("backCosmetic")) |
| 361 | armor.setBackCosmeticItem(as<BackArmor>(makeItem(items["backCosmetic"]))); |
| 362 | |
| 363 | armor.setupHumanoid(humanoid, false); |
| 364 | |
| 365 | return humanoid.renderPortrait(mode); |
| 366 | } |
| 367 | |
| 368 | Json NpcDatabase::buildConfig(String const& typeName, Json const& overrides) const { |
| 369 | auto const& baseConfig = m_npcTypes.get(typeName); |
nothing calls this directly
no test coverage detected