最终整理版

This commit is contained in:
2026-06-03 17:04:06 +08:00
commit 959055ce90
1240 changed files with 80570 additions and 0 deletions
+360
View File
@@ -0,0 +1,360 @@
#include "TonoriItems.h"
#include <algorithm>
#include <cctype>
namespace {
std::string NormalizeKey(const std::string& value)
{
std::string normalized;
normalized.reserve(value.size());
for (unsigned char ch : value) {
if (std::isalnum(ch)) {
normalized.push_back(static_cast<char>(std::tolower(ch)));
}
}
return normalized;
}
TonoriItemDefinition Item(
std::string id,
std::string name,
TonoriItemCategory category,
std::string rarity,
std::string effect,
TonoriMerchantKind merchant,
int price,
std::string recipe,
std::string iconFile)
{
TonoriItemDefinition item;
item.id = std::move(id);
item.name = std::move(name);
item.category = category;
item.rarity = std::move(rarity);
item.effect = std::move(effect);
item.merchant = merchant;
item.price = price;
item.recipe = std::move(recipe);
item.iconFile = std::move(iconFile);
return item;
}
TonoriRecoveryEffect Heal(int hp, bool party = false, bool clearStatus = false)
{
TonoriRecoveryEffect effect;
effect.healHp = hp;
effect.party = party;
effect.clearStatus = clearStatus;
return effect;
}
TonoriRecoveryEffect FullHeal()
{
TonoriRecoveryEffect effect;
effect.fullHeal = true;
return effect;
}
TonoriRecoveryEffect Revive(int percent, bool party = false)
{
TonoriRecoveryEffect effect;
effect.revive = true;
effect.revivePercent = percent;
effect.party = party;
return effect;
}
TonoriRecoveryEffect ReviveAndHeal(int percent, bool party = false)
{
TonoriRecoveryEffect effect = Revive(percent, party);
return effect;
}
TonoriItemDefinition Capture(
std::string id,
std::string name,
std::string rarity,
std::string effect,
int price,
std::string recipe,
std::string iconFile,
float multiplier)
{
TonoriItemDefinition item = Item(
std::move(id),
std::move(name),
TonoriItemCategory::Capture,
std::move(rarity),
std::move(effect),
TonoriMerchantKind::Capture,
price,
std::move(recipe),
std::move(iconFile));
item.captureMultiplier = multiplier;
return item;
}
TonoriItemDefinition SkillBook(
std::string id,
std::string name,
std::string rarity,
std::string effect,
int price,
std::string recipe,
std::string iconFile,
std::string skillId)
{
TonoriItemDefinition item = Item(
std::move(id),
std::move(name),
TonoriItemCategory::SkillBook,
std::move(rarity),
std::move(effect),
TonoriMerchantKind::SkillBook,
price,
std::move(recipe),
std::move(iconFile));
item.skillId = std::move(skillId);
return item;
}
TonoriItemDefinition Egg(
std::string id,
std::string name,
std::string rarity,
std::string effect,
int price,
std::string recipe,
std::string iconFile,
std::vector<std::string> species)
{
TonoriItemDefinition item = Item(
std::move(id),
std::move(name),
TonoriItemCategory::PetEgg,
std::move(rarity),
std::move(effect),
TonoriMerchantKind::Hatchery,
price,
std::move(recipe),
std::move(iconFile));
item.eggSpecies = std::move(species);
return item;
}
TonoriItemDefinition Healing(
std::string id,
std::string name,
std::string rarity,
std::string effect,
int price,
std::string recipe,
std::string iconFile,
TonoriRecoveryEffect recovery)
{
TonoriItemDefinition item = Item(
std::move(id),
std::move(name),
TonoriItemCategory::Healing,
std::move(rarity),
std::move(effect),
TonoriMerchantKind::Apothecary,
price,
std::move(recipe),
std::move(iconFile));
item.recovery = recovery;
return item;
}
} // namespace
const std::vector<TonoriItemDefinition>& TonoriItemCatalog()
{
static const std::vector<TonoriItemDefinition> items = {
Item("MAT01", "沙晶粉", TonoriItemCategory::Material, "普通", "沙地、土系、捕捉符基础材料", TonoriMerchantKind::Material, 30, "不可制作", "gem_yellow_triangular.png"),
Item("MAT02", "仙人掌汁", TonoriItemCategory::Material, "普通", "恢复药、草系道具基础材料", TonoriMerchantKind::Material, 35, "不可制作", "wood_berry.png"),
Item("MAT03", "清水", TonoriItemCategory::Material, "普通", "水系道具、药剂基础材料", TonoriMerchantKind::Material, 25, "不可制作", "water_berry.png"),
Item("MAT04", "矿脉核心", TonoriItemCategory::Material, "稀有", "土系宠物蛋、高级捕捉道具", TonoriMerchantKind::Material, 90, "不可制作", "gem_gray_emerald.png"),
Item("MAT05", "古壳碎片", TonoriItemCategory::Material, "稀有", "古代蛋、古符、复活药剂", TonoriMerchantKind::Material, 110, "不可制作", "rhincus_fossil.png"),
Item("MAT06", "绿洲草叶", TonoriItemCategory::Material, "普通", "草系技能书和恢复品", TonoriMerchantKind::Material, 40, "不可制作", "wood_berry.png"),
Item("MAT07", "赤焰碎片", TonoriItemCategory::Material, "稀有", "火系技能书、火焰捕捉符", TonoriMerchantKind::Material, 95, "不可制作", "gem_red_triangular.png"),
Item("MAT08", "潮汐珠", TonoriItemCategory::Material, "稀有", "水系技能书、水域捕捉符", TonoriMerchantKind::Material, 95, "不可制作", "gem_blue_triangular.png"),
Item("MAT09", "孢子粉", TonoriItemCategory::Material, "普通", "状态解除、毒草技能书", TonoriMerchantKind::Material, 45, "不可制作", "venom_berry.png"),
Item("MAT10", "空白技能册", TonoriItemCategory::Material, "普通", "所有技能书的通用书册", TonoriMerchantKind::Material, 80, "不可制作", "tm_generic.png"),
Egg("EGG01", "新手宠物蛋", "普通", "孵化随机新手宠物,适合作为教学奖励", 180, "仙人掌汁 1 份 + 清水 1 份", "ancient_egg.png", {"Lulea", "Piou", "Maggot"}),
Egg("EGG02", "沙纹宠物蛋", "普通", "较高概率孵化土、沙地主题宠物", 260, "沙晶粉 3 份 + 清水 1 份", "mm_earth.png", {"Scorpion", "Sand Snake", "Maggot"}),
Egg("EGG03", "仙人掌宠物蛋", "普通", "较高概率孵化草、沙漠植物主题宠物", 260, "仙人掌汁 2 份 + 绿洲草叶 2 份", "mm_wood.png", {"Peyote", "Mister Prickel", "Spiky Mushroom"}),
Egg("EGG04", "潮汐宠物蛋", "稀有", "较高概率孵化水系宠物", 420, "潮汐珠 2 份 + 清水 3 份", "mm_water.png", {"Little Blub", "Lulea", "Slime"}),
Egg("EGG05", "矿脉宠物蛋", "稀有", "较高概率孵化岩石、矿洞主题宠物", 440, "矿脉核心 2 份 + 沙晶粉 3 份", "mm_metal.png", {"Turtle", "Skeleton", "Salt Slime"}),
Egg("EGG06", "赤焰宠物蛋", "稀有", "较高概率孵化火系宠物", 460, "赤焰碎片 2 份 + 沙晶粉 2 份", "mm_fire.png", {"Fire Goblin", "Fire Skull"}),
Egg("EGG07", "林芽宠物蛋", "稀有", "较高概率孵化草、孢子主题宠物", 430, "绿洲草叶 4 份 + 孢子粉 2 份", "mm_wood.png", {"Evil Mushroom", "Manana Tree", "Coconut Tree"}),
Egg("EGG08", "夜影宠物蛋", "稀有", "较高概率孵化暗影、夜行主题宠物", 520, "孢子粉 3 份 + 古壳碎片 1 份", "mm_metal.png", {"Bat", "Skeleton", "Bicies"}),
Egg("EGG09", "羽翼宠物蛋", "稀有", "较高概率孵化飞行、风系表现宠物", 520, "绿洲草叶 2 份 + 潮汐珠 1 份 + 沙晶粉 2 份", "mm_water.png", {"Bird", "Piou", "Pikpik"}),
Egg("EGG10", "古代宠物蛋", "史诗", "较高概率孵化古代或化石主题宠物", 760, "古壳碎片 4 份 + 矿脉核心 2 份", "ancient_egg.png", {"Turtle", "Skeleton", "Red Queen"}),
Egg("EGG11", "星辉宠物蛋", "史诗", "较高概率孵化稀有异色或高潜力宠物", 900, "潮汐珠 2 份 + 赤焰碎片 2 份 + 古壳碎片 2 份", "mm_metal.png", {"Splatyna", "Red Queen", "Gabriel"}),
Egg("EGG12", "万象宠物蛋", "传说", "随机孵化多属性高潜力宠物,后期昂贵目标", 1400, "古壳碎片 5 份 + 矿脉核心 3 份 + 潮汐珠 3 份 + 赤焰碎片 3 份", "ancient_egg.png", {"Splatyna", "Lizandra", "Red Queen"}),
Capture("CAP01", "基础捕捉符", "普通", "标准捕捉倍率 1.0", 80, "沙晶粉 1 份 + 清水 1 份", "tuxeball.png", 1.0f),
Capture("CAP02", "精制捕捉符", "普通", "捕捉倍率 1.25", 120, "沙晶粉 2 份 + 清水 1 份", "tuxeball_refined.png", 1.25f),
Capture("CAP03", "沙尘捕捉符", "普通", "对土系或沙地宠物倍率 1.6", 150, "沙晶粉 3 份", "tuxeball_earth.png", 1.6f),
Capture("CAP04", "潮汐捕捉符", "普通", "对水系或水边宠物倍率 1.6", 150, "潮汐珠 1 份 + 清水 2 份", "tuxeball_water.png", 1.6f),
Capture("CAP05", "绿芽捕捉符", "普通", "对草系宠物倍率 1.6", 150, "绿洲草叶 3 份", "tuxeball_wood.png", 1.6f),
Capture("CAP06", "赤焰捕捉符", "普通", "对火系宠物倍率 1.6", 160, "赤焰碎片 1 份 + 沙晶粉 1 份", "tuxeball_fire.png", 1.6f),
Capture("CAP07", "安抚捕捉符", "稀有", "对低血量宠物倍率 1.8", 220, "仙人掌汁 2 份 + 绿洲草叶 1 份", "tuxeball_hearty.png", 1.8f),
Capture("CAP08", "古符捕捉符", "稀有", "对古代、化石主题宠物倍率 1.8", 260, "古壳碎片 2 份 + 沙晶粉 2 份", "tuxeball_ancient.png", 1.8f),
Capture("CAP09", "夜行捕捉符", "稀有", "夜晚或洞穴场景倍率 1.7", 240, "孢子粉 2 份 + 古壳碎片 1 份", "tuxeball_nocturnal.png", 1.7f),
Capture("CAP10", "日行捕捉符", "稀有", "白天或旷野场景倍率 1.7", 240, "绿洲草叶 2 份 + 赤焰碎片 1 份", "tuxeball_diurnal.png", 1.7f),
Capture("CAP11", "坚壳捕捉符", "稀有", "对高防御、甲壳宠物倍率 1.7", 250, "矿脉核心 1 份 + 古壳碎片 1 份", "tuxeball_hardened.png", 1.7f),
Capture("CAP12", "矿岩捕捉符", "稀有", "对矿石、岩甲主题宠物倍率 1.7", 250, "矿脉核心 2 份 + 沙晶粉 1 份", "tuxeball_metal.png", 1.7f),
Capture("CAP13", "活力捕捉符", "稀有", "对速度高或弹跳类宠物倍率 1.6", 230, "仙人掌汁 1 份 + 潮汐珠 1 份", "tuxeball_peppy.png", 1.6f),
Capture("CAP14", "糖果捕捉符", "稀有", "对友好、幼体宠物倍率 1.8", 230, "仙人掌汁 2 份 + 孢子粉 1 份", "tuxeball_candy.png", 1.8f),
Capture("CAP15", "酸味捕捉符", "稀有", "对中毒或异常状态目标倍率 1.9", 260, "孢子粉 3 份 + 清水 1 份", "tuxeball_zesty.png", 1.9f),
Capture("CAP16", "盐晶捕捉符", "稀有", "对水边、滩涂、甲壳宠物倍率 1.75", 260, "潮汐珠 1 份 + 沙晶粉 3 份", "tuxeball_salty.png", 1.75f),
Capture("CAP17", "贵族捕捉符", "史诗", "对稀有宠物倍率 2.0", 420, "古壳碎片 2 份 + 赤焰碎片 1 份 + 潮汐珠 1 份", "tuxeball_noble.png", 2.0f),
Capture("CAP18", "华丽捕捉符", "史诗", "提高捕捉后初始亲密度", 450, "绿洲草叶 2 份 + 潮汐珠 2 份 + 仙人掌汁 2 份", "tuxeball_lavish.png", 1.9f),
Capture("CAP19", "强袭捕捉符", "史诗", "开战前 3 回合使用时倍率 2.1", 480, "赤焰碎片 2 份 + 矿脉核心 1 份", "tuxeball_crusher.png", 2.1f),
Capture("CAP20", "公园捕捉符", "史诗", "野外非副本区域倍率 1.9", 420, "绿洲草叶 3 份 + 清水 2 份 + 沙晶粉 2 份", "tuxeball_park.png", 1.9f),
Capture("CAP21", "雄性捕捉符", "普通", "对雄性宠物倍率 1.5", 140, "沙晶粉 1 份 + 赤焰碎片 1 份", "tuxeball_male.png", 1.5f),
Capture("CAP22", "雌性捕捉符", "普通", "对雌性宠物倍率 1.5", 140, "绿洲草叶 1 份 + 潮汐珠 1 份", "tuxeball_female.png", 1.5f),
Capture("CAP23", "全域捕捉符", "史诗", "不看属性,稳定捕捉倍率 2.2", 560, "矿脉核心 2 份 + 潮汐珠 2 份 + 赤焰碎片 2 份", "tuxeball_grand.png", 2.2f),
Capture("CAP24", "万象捕捉符", "传说", "高级捕捉倍率 2.8,适合稀有宠物", 900, "古壳碎片 4 份 + 矿脉核心 2 份 + 潮汐珠 2 份 + 赤焰碎片 2 份", "tuxeball_omni.png", 2.8f),
Healing("REC01", "红苹果", "普通", "单体恢复 20 点体力", 35, "不可制作", "data/graphics/items/usable/apple.png", Heal(20)),
Healing("REC02", "清水瓶", "普通", "单体恢复 15 点体力,并解除轻微口渴类负面状态", 30, "清水 1 份", "data/graphics/items/usable/bottle-water.png", Heal(15, false, true)),
Healing("REC03", "仙人掌饮料", "普通", "单体恢复 35 点体力", 60, "仙人掌汁 2 份 + 清水 1 份", "data/graphics/items/usable/cactus-drink.png", Heal(35)),
Healing("REC04", "仙人掌药剂", "普通", "单体恢复 60 点体力", 95, "仙人掌汁 3 份 + 绿洲草叶 1 份", "data/graphics/items/usable/cactus-potion.png", Heal(60)),
Healing("REC05", "酸味仙人掌糖", "普通", "解除麻痹或迟缓,并恢复 10 点体力", 70, "仙人掌汁 1 份 + 孢子粉 1 份", "data/graphics/items/usable/cactus-sour-candy.png", Heal(10, false, true)),
Healing("REC06", "小型恢复药", "普通", "单体恢复 45 点体力", 75, "清水 2 份 + 绿洲草叶 1 份", "potion.png", Heal(45)),
Healing("REC07", "中型恢复药", "普通", "单体恢复 80 点体力", 130, "清水 2 份 + 仙人掌汁 2 份 + 绿洲草叶 1 份", "super_potion.png", Heal(80)),
Healing("REC08", "高级恢复药", "稀有", "单体恢复 130 点体力", 220, "清水 3 份 + 仙人掌汁 3 份 + 潮汐珠 1 份", "mega_potion.png", Heal(130)),
Healing("REC09", "特级恢复药", "史诗", "单体恢复 220 点体力", 380, "潮汐珠 2 份 + 古壳碎片 1 份 + 清水 3 份", "imperial_potion.png", Heal(220)),
Healing("REC10", "复苏叶", "稀有", "复活单个宠物并恢复 40% 体力", 300, "古壳碎片 2 份 + 绿洲草叶 2 份 + 清水 2 份", "revive.png", Revive(40)),
Healing("REC11", "活力复苏叶", "史诗", "复活单个宠物并恢复 80% 体力", 520, "古壳碎片 3 份 + 潮汐珠 2 份 + 仙人掌汁 2 份", "revive.png", Revive(80)),
Healing("REC12", "队伍茶饮", "稀有", "全队恢复 35 点体力", 260, "绿洲草叶 3 份 + 清水 3 份", "tea.png", Heal(35, true)),
Healing("REC13", "帝国茶饮", "史诗", "全队恢复 80 点体力", 480, "绿洲草叶 4 份 + 潮汐珠 2 份 + 古壳碎片 1 份", "imperial_tea.png", Heal(80, true)),
Healing("REC14", "古代茶饮", "史诗", "全队恢复 50 点体力,并解除一种异常", 520, "古壳碎片 2 份 + 绿洲草叶 3 份 + 清水 3 份", "ancient_tea.png", Heal(50, true, true)),
Healing("REC15", "解毒浆果", "普通", "解除中毒", 65, "孢子粉 2 份 + 清水 1 份", "venom_berry.png", Heal(0, false, true)),
Healing("REC16", "清醒浆果", "普通", "解除睡眠或混乱", 65, "绿洲草叶 2 份 + 清水 1 份", "normal_berry.png", Heal(0, false, true)),
Healing("REC17", "暖身浆果", "普通", "解除冰冻或寒冷", 70, "赤焰碎片 1 份 + 仙人掌汁 1 份", "fire_berry.png", Heal(0, false, true)),
Healing("REC18", "镇静浆果", "普通", "解除恐惧或暴躁", 70, "潮汐珠 1 份 + 绿洲草叶 1 份", "water_berry.png", Heal(0, false, true)),
Healing("REC19", "土息浆果", "普通", "解除流血或破甲", 80, "沙晶粉 2 份 + 矿脉核心 1 份", "earth_berry.png", Heal(0, false, true)),
Healing("REC20", "木息浆果", "普通", "解除灼伤并恢复 20 点体力", 80, "绿洲草叶 2 份 + 清水 1 份", "wood_berry.png", Heal(20, false, true)),
Healing("REC21", "星光药剂", "史诗", "单体恢复全部体力,战斗外使用", 700, "古壳碎片 3 份 + 潮汐珠 3 份 + 赤焰碎片 1 份", "luminescent-potion.png", FullHeal()),
Healing("REC22", "沙旅羊角包", "普通", "全队恢复 20 点体力,战斗外使用", 150, "仙人掌汁 1 份 + 清水 1 份 + 沙晶粉 1 份", "data/graphics/items/usable/croissant.png", Heal(20, true)),
Healing("REC23", "红色急救药剂", "稀有", "单体恢复 100 点体力,并解除一种异常", 260, "清水 2 份 + 绿洲草叶 2 份 + 孢子粉 2 份", "red-potion.png", Heal(100, false, true)),
Healing("REC24", "金色复苏药剂", "传说", "复活全队并恢复 50% 体力,战斗外使用", 1200, "古壳碎片 5 份 + 潮汐珠 3 份 + 绿洲草叶 5 份 + 清水 5 份", "yellow-potion.png", ReviveAndHeal(50, true)),
SkillBook("TM01", "技能书:冲撞", "普通", "学会普通系技能「冲撞」", 120, "空白技能册 1 份 + 沙晶粉 1 份", "tm_generic.png", "tackle"),
SkillBook("TM02", "技能书:啃咬", "普通", "学会普通系技能「啃咬」", 140, "空白技能册 1 份 + 古壳碎片 1 份", "tm_generic.png", "bite"),
SkillBook("TM03", "技能书:利爪", "普通", "学会普通系技能「利爪」", 140, "空白技能册 1 份 + 矿脉核心 1 份", "tm_generic.png", "claw"),
SkillBook("TM04", "技能书:头槌", "普通", "学会普通系技能「头槌」", 160, "空白技能册 1 份 + 沙晶粉 2 份", "tm_generic.png", "headbutt"),
SkillBook("TM05", "技能书:甩尾", "普通", "学会普通系技能「甩尾」", 160, "空白技能册 1 份 + 绿洲草叶 1 份", "tm_generic.png", "tail"),
SkillBook("TM06", "技能书:水泡", "普通", "学会水系技能「水泡」", 150, "空白技能册 1 份 + 清水 2 份", "tm_water.png", "bubble"),
SkillBook("TM07", "技能书:潮汐拍击", "稀有", "学会水系技能「潮汐拍击」", 260, "空白技能册 1 份 + 潮汐珠 2 份", "tm_water.png", "tide"),
SkillBook("TM08", "技能书:水流冲击", "稀有", "学会水系技能「水流冲击」", 300, "空白技能册 1 份 + 潮汐珠 2 份 + 清水 2 份", "tm_water.png", "water_rush"),
SkillBook("TM09", "技能书:黏液弹", "普通", "学会水/毒表现技能「黏液弹」", 180, "空白技能册 1 份 + 孢子粉 2 份 + 清水 1 份", "tm_water.png", "slime_shot"),
SkillBook("TM10", "技能书:沼泽伏击", "稀有", "学会水/土表现技能「沼泽伏击」", 280, "空白技能册 1 份 + 潮汐珠 1 份 + 沙晶粉 2 份", "tm_water.png", "mud_ambush"),
SkillBook("TM11", "技能书:沙尘击", "普通", "学会土系技能「沙尘击」", 150, "空白技能册 1 份 + 沙晶粉 2 份", "tm_earth.png", "dust"),
SkillBook("TM12", "技能书:岩石投掷", "普通", "学会土系技能「岩石投掷」", 190, "空白技能册 1 份 + 矿脉核心 1 份 + 沙晶粉 1 份", "tm_earth.png", "rock_throw"),
SkillBook("TM13", "技能书:岩甲冲锋", "稀有", "学会土系技能「岩甲冲锋」", 320, "空白技能册 1 份 + 矿脉核心 2 份 + 古壳碎片 1 份", "tm_earth.png", "shell_charge"),
SkillBook("TM14", "技能书:钻地突刺", "稀有", "学会土系技能「钻地突刺」", 340, "空白技能册 1 份 + 矿脉核心 2 份 + 沙晶粉 3 份", "tm_earth.png", "tunnel"),
SkillBook("TM15", "技能书:甲壳撞击", "普通", "学会土/普通表现技能「甲壳撞击」", 200, "空白技能册 1 份 + 古壳碎片 1 份 + 沙晶粉 1 份", "tm_earth.png", "shell_hit"),
SkillBook("TM16", "技能书:火苗", "普通", "学会火系技能「火苗」", 150, "空白技能册 1 份 + 赤焰碎片 1 份", "tm_fire.png", "ember"),
SkillBook("TM17", "技能书:火焰拳", "稀有", "学会火系技能「火焰拳」", 300, "空白技能册 1 份 + 赤焰碎片 3 份", "tm_fire.png", "fire_punch"),
SkillBook("TM18", "技能书:日光弹", "稀有", "学会火/光表现技能「日光弹」", 320, "空白技能册 1 份 + 赤焰碎片 2 份 + 绿洲草叶 1 份", "tm_fire.png", "solar_seed"),
SkillBook("TM19", "技能书:藤刺", "普通", "学会草系技能「藤刺」", 150, "空白技能册 1 份 + 绿洲草叶 2 份", "tm_wood.png", "thorn"),
SkillBook("TM20", "技能书:针刺", "普通", "学会草系技能「针刺」", 170, "空白技能册 1 份 + 绿洲草叶 1 份 + 沙晶粉 1 份", "tm_wood.png", "needle"),
SkillBook("TM21", "技能书:孢子弹", "稀有", "学会草/异常表现技能「孢子弹」", 260, "空白技能册 1 份 + 孢子粉 3 份", "tm_wood.png", "spore"),
SkillBook("TM22", "技能书:腐蚀酸液", "稀有", "学会毒系技能「腐蚀酸液」", 280, "空白技能册 1 份 + 孢子粉 2 份 + 赤焰碎片 1 份", "tm_generic.png", "acid_spit"),
SkillBook("TM23", "技能书:毒牙", "稀有", "学会毒系技能「毒牙」", 300, "空白技能册 1 份 + 孢子粉 2 份 + 古壳碎片 1 份", "tm_generic.png", "fang"),
SkillBook("TM24", "技能书:暗影冲击", "稀有", "学会暗影表现技能「暗影冲击」", 340, "空白技能册 1 份 + 古壳碎片 2 份 + 孢子粉 1 份", "tm_generic.png", "dark_charge"),
SkillBook("TM25", "技能书:旋风", "普通", "学会风系表现技能「旋风」", 180, "空白技能册 1 份 + 绿洲草叶 1 份 + 潮汐珠 1 份", "tm_generic.png", "gust"),
SkillBook("TM26", "技能书:羽刃", "稀有", "学会飞行表现技能「羽刃」", 280, "空白技能册 1 份 + 绿洲草叶 2 份 + 赤焰碎片 1 份", "tm_generic.png", "feather_blade"),
SkillBook("TM27", "技能书:啄击", "普通", "学会飞行/普通表现技能「啄击」", 160, "空白技能册 1 份 + 绿洲草叶 1 份 + 古壳碎片 1 份", "tm_generic.png", "peck"),
SkillBook("TM28", "技能书:翅击", "普通", "学会飞行表现技能「翅击」", 190, "空白技能册 1 份 + 绿洲草叶 2 份", "tm_generic.png", "wing"),
SkillBook("TM29", "技能书:超音波", "稀有", "学会干扰技能「超音波」", 320, "空白技能册 1 份 + 潮汐珠 1 份 + 古壳碎片 2 份", "tm_generic.png", "sonic"),
SkillBook("TM30", "技能书:吸血牙", "史诗", "学会暗影/回复表现技能「吸血牙」", 520, "空白技能册 1 份 + 古壳碎片 3 份 + 孢子粉 2 份", "tm_generic.png", "vampire_fang"),
};
return items;
}
const TonoriItemDefinition* FindTonoriItem(const std::string& idOrName)
{
for (const TonoriItemDefinition& item : TonoriItemCatalog()) {
if (item.id == idOrName || item.name == idOrName) {
return &item;
}
}
const std::string key = NormalizeKey(idOrName);
if (key.empty()) {
return nullptr;
}
for (const TonoriItemDefinition& item : TonoriItemCatalog()) {
if (NormalizeKey(item.id) == key || NormalizeKey(item.name) == key) {
return &item;
}
}
return nullptr;
}
std::vector<const TonoriItemDefinition*> TonoriItemsForMerchant(TonoriMerchantKind merchant)
{
std::vector<const TonoriItemDefinition*> result;
for (const TonoriItemDefinition& item : TonoriItemCatalog()) {
if (item.merchant == merchant) {
result.push_back(&item);
}
}
return result;
}
std::string TonoriItemCategoryName(TonoriItemCategory category)
{
switch (category) {
case TonoriItemCategory::Material:
return "制作材料";
case TonoriItemCategory::PetEgg:
return "宠物蛋";
case TonoriItemCategory::Capture:
return "捕捉";
case TonoriItemCategory::Healing:
return "恢复";
case TonoriItemCategory::SkillBook:
return "技能书";
case TonoriItemCategory::Other:
break;
}
return "其他";
}
std::string TonoriMerchantName(TonoriMerchantKind merchant)
{
switch (merchant) {
case TonoriMerchantKind::General:
return "道具商人";
case TonoriMerchantKind::Hatchery:
return "孵化商人";
case TonoriMerchantKind::Capture:
return "捕捉商人";
case TonoriMerchantKind::Apothecary:
return "药剂商人";
case TonoriMerchantKind::SkillBook:
return "技能书商人";
case TonoriMerchantKind::Material:
return "材料商人";
case TonoriMerchantKind::None:
break;
}
return "商人";
}
std::optional<TonoriItemCategory> TonoriCategoryForItem(const std::string& idOrName)
{
if (const TonoriItemDefinition* item = FindTonoriItem(idOrName)) {
return item->category;
}
return std::nullopt;
}
+56
View File
@@ -0,0 +1,56 @@
#pragma once
#include <optional>
#include <string>
#include <vector>
enum class TonoriItemCategory {
Material,
PetEgg,
Capture,
Healing,
SkillBook,
Other
};
enum class TonoriMerchantKind {
None,
General,
Hatchery,
Capture,
Apothecary,
SkillBook,
Material
};
struct TonoriRecoveryEffect {
int healHp = 0;
int revivePercent = 0;
bool fullHeal = false;
bool party = false;
bool revive = false;
bool clearStatus = false;
};
struct TonoriItemDefinition {
std::string id;
std::string name;
TonoriItemCategory category = TonoriItemCategory::Other;
std::string rarity;
std::string effect;
TonoriMerchantKind merchant = TonoriMerchantKind::None;
int price = 0;
std::string recipe;
std::string iconFile;
float captureMultiplier = 1.0f;
std::string skillId;
TonoriRecoveryEffect recovery;
std::vector<std::string> eggSpecies;
};
const std::vector<TonoriItemDefinition>& TonoriItemCatalog();
const TonoriItemDefinition* FindTonoriItem(const std::string& idOrName);
std::vector<const TonoriItemDefinition*> TonoriItemsForMerchant(TonoriMerchantKind merchant);
std::string TonoriItemCategoryName(TonoriItemCategory category);
std::string TonoriMerchantName(TonoriMerchantKind merchant);
std::optional<TonoriItemCategory> TonoriCategoryForItem(const std::string& idOrName);