2026-11-05 15:22:54 +00:00
|
|
|
using System.Collections.Generic;
|
2026-11-05 12:11:10 +00:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace TKS.OutGame
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 재화·군량·신규 유저 초기값·보상·상점 공식 값(economy.csv key,value · 기획서 §2·§3-2·§6 · 2026-11-05 구현 세션이 start_*·공식 계수 키 추가).
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class EconomyConfig : ScriptableObject
|
|
|
|
|
{
|
|
|
|
|
public KeyValueList values = new KeyValueList();
|
|
|
|
|
|
|
|
|
|
public int StaminaMax { get { return values.I("stamina_max"); } }
|
|
|
|
|
public int StaminaRegenSec { get { return values.I("stamina_regen_sec"); } }
|
|
|
|
|
public int StageCost { get { return values.I("stage_cost"); } }
|
|
|
|
|
public int BossCost { get { return values.I("boss_cost"); } }
|
|
|
|
|
public int AdStamina { get { return values.I("ad_stamina"); } }
|
|
|
|
|
public int AdStaminaDaily { get { return values.I("ad_stamina_daily"); } }
|
|
|
|
|
public int GemStaminaCost { get { return values.I("gem_stamina_cost"); } }
|
|
|
|
|
public int GemStaminaAmount { get { return values.I("gem_stamina_amount"); } }
|
|
|
|
|
public int GemStaminaDaily { get { return values.I("gem_stamina_daily"); } }
|
|
|
|
|
public float RepeatRewardMult { get { return values.F("repeat_reward_mult"); } }
|
|
|
|
|
public int SoldierDupGold { get { return values.I("soldier_dup_gold"); } }
|
|
|
|
|
public int StartGold { get { return values.I("start_gold"); } }
|
|
|
|
|
public int StartGem { get { return values.I("start_gem"); } }
|
|
|
|
|
public int StartStamina { get { return values.I("start_stamina"); } }
|
|
|
|
|
public string[] StartHeroes { get { return values.List("start_heroes"); } }
|
|
|
|
|
public int PresetCount { get { return values.I("preset_count"); } }
|
|
|
|
|
public int FormationFront { get { return values.I("formation_front"); } }
|
|
|
|
|
public float GearBonusPct { get { return values.F("gear_bonus_pct"); } }
|
|
|
|
|
public float PowerHpDiv { get { return values.F("power_hp_div"); } }
|
|
|
|
|
public float PowerAtkW { get { return values.F("power_atk_w"); } }
|
|
|
|
|
public float PowerDefW { get { return values.F("power_def_w"); } }
|
|
|
|
|
public int GoldPerStage { get { return values.I("gold_per_stage"); } }
|
|
|
|
|
public float FirstClearGoldMult { get { return values.F("first_clear_gold_mult"); } }
|
|
|
|
|
public float BossGearDropPct { get { return values.F("boss_gear_drop_pct"); } }
|
|
|
|
|
public int ShopSlots { get { return values.I("shop_slots"); } }
|
|
|
|
|
public string[] ShopGrades { get { return values.List("shop_grades"); } }
|
|
|
|
|
public float ShopPriceMult { get { return values.F("shop_price_mult"); } }
|
|
|
|
|
public int ShopRefreshGem { get { return values.I("shop_refresh_gem"); } }
|
2026-11-05 14:31:27 +00:00
|
|
|
// 스킬(PD #1093 B) — 신규 유저 스킬서 · 거래 상점 스킬서 임시 판매(획득처 사당 던전 = C 단계 · PD 확인 대상)
|
|
|
|
|
public int StartSkillBooks { get { return values.I("start_skill_books"); } }
|
|
|
|
|
public int SkillBookShopDaily { get { return values.I("skill_book_shop_daily"); } }
|
|
|
|
|
public int SkillBookPrice { get { return values.I("skill_book_price"); } }
|
2026-11-05 15:22:54 +00:00
|
|
|
// 내정·보물·연무장(PD #1093 C · 기획서 §7~§9 본문 값 · 일부 임시 값 = 대화로그 「세션 C」 PD 확인 대상)
|
|
|
|
|
public float TreasureStarPct { get { return values.F("treasure_star_pct"); } }
|
|
|
|
|
public int TreasureShardPerStar { get { return values.I("treasure_shard_per_star"); } }
|
|
|
|
|
public int TreasureIronPerStar { get { return values.I("treasure_iron_per_star"); } }
|
|
|
|
|
public int ChestPointGoal { get { return values.I("chest_point_goal"); } }
|
|
|
|
|
public string ChestPointReward { get { return values.S("chest_point_reward"); } }
|
|
|
|
|
public string StageChest { get { return values.S("stage_chest"); } }
|
|
|
|
|
public float StageChestPct { get { return values.F("stage_chest_pct"); } }
|
|
|
|
|
public float PatrolCapHours { get { return values.F("patrol_cap_hours"); } }
|
|
|
|
|
public string PatrolChest { get { return values.S("patrol_chest"); } }
|
|
|
|
|
public float PatrolAdMult { get { return values.F("patrol_ad_mult"); } }
|
|
|
|
|
public int PatrolAdDaily { get { return values.I("patrol_ad_daily"); } }
|
|
|
|
|
public float PatrolInstantHours { get { return values.F("patrol_instant_hours"); } }
|
|
|
|
|
public int PatrolInstantGem { get { return values.I("patrol_instant_gem"); } }
|
|
|
|
|
public float PatrolGearPerHour { get { return values.F("patrol_gear_per_hour"); } }
|
|
|
|
|
public int DevResetGem { get { return values.I("dev_reset_gem"); } }
|
|
|
|
|
public int TowerTicketsDaily { get { return values.I("tower_tickets_daily"); } }
|
|
|
|
|
public int TowerAdTickets { get { return values.I("tower_ad_tickets"); } }
|
|
|
|
|
public string[] RaidBosses { get { return values.List("raid_bosses"); } }
|
|
|
|
|
public float RaidHpMult { get { return values.F("raid_hp_mult"); } }
|
|
|
|
|
public int RaidDaily { get { return values.I("raid_daily"); } }
|
|
|
|
|
public int RaidTurns { get { return values.I("raid_turns"); } }
|
|
|
|
|
public string RaidChest { get { return values.S("raid_chest"); } }
|
|
|
|
|
public float RaidArcanaPct { get { return values.F("raid_arcana_pct"); } }
|
|
|
|
|
|
|
|
|
|
/// <summary>보물 등급 순서와 강화 운철 배율(treasure_iron_mult 「grade:배율;…」 · 낮은 등급부터).</summary>
|
|
|
|
|
public List<KeyValuePair<string, float>> TreasureGrades
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
var l = new List<KeyValuePair<string, float>>();
|
|
|
|
|
foreach (var part in values.List("treasure_iron_mult"))
|
|
|
|
|
{
|
|
|
|
|
var kv = part.Split(':');
|
|
|
|
|
float m;
|
|
|
|
|
if (kv.Length == 2 && float.TryParse(kv[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out m))
|
|
|
|
|
l.Add(new KeyValuePair<string, float>(kv[0], m));
|
|
|
|
|
}
|
|
|
|
|
return l;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>등급 순서(1 = 가장 낮음 · 없으면 0).</summary>
|
|
|
|
|
public int TreasureGradeOrder(string grade)
|
|
|
|
|
{
|
|
|
|
|
var l = TreasureGrades;
|
|
|
|
|
for (int i = 0; i < l.Count; i++)
|
|
|
|
|
if (l[i].Key == grade) return i + 1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public float TreasureIronMult(string grade)
|
|
|
|
|
{
|
|
|
|
|
foreach (var kv in TreasureGrades)
|
|
|
|
|
if (kv.Key == grade) return kv.Value;
|
|
|
|
|
return 1f;
|
|
|
|
|
}
|
2026-11-05 12:11:10 +00:00
|
|
|
|
|
|
|
|
/// <summary>중복 영웅 → 조각(희귀도 1~3).</summary>
|
|
|
|
|
public int ShardDup(int rarity)
|
|
|
|
|
{
|
|
|
|
|
return values.I("shard_dup_r" + Mathf.Clamp(rarity, 1, 3));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>임포터가 확인하는 필수 키.</summary>
|
|
|
|
|
public static readonly string[] RequiredKeys =
|
|
|
|
|
{
|
|
|
|
|
"stamina_max", "stamina_regen_sec", "stage_cost", "boss_cost", "ad_stamina", "ad_stamina_daily",
|
|
|
|
|
"gem_stamina_cost", "gem_stamina_amount", "gem_stamina_daily", "repeat_reward_mult",
|
|
|
|
|
"shard_dup_r3", "shard_dup_r2", "shard_dup_r1", "soldier_dup_gold",
|
|
|
|
|
"start_gold", "start_gem", "start_stamina", "start_heroes", "preset_count", "formation_front",
|
|
|
|
|
"gear_bonus_pct", "power_hp_div", "power_atk_w", "power_def_w",
|
|
|
|
|
"gold_per_stage", "first_clear_gold_mult", "boss_gear_drop_pct",
|
|
|
|
|
"shop_slots", "shop_grades", "shop_price_mult", "shop_refresh_gem",
|
2026-11-05 14:31:27 +00:00
|
|
|
"start_skill_books", "skill_book_shop_daily", "skill_book_price",
|
2026-11-05 15:22:54 +00:00
|
|
|
"treasure_star_pct", "treasure_shard_per_star", "treasure_iron_per_star", "treasure_iron_mult", "chest_point_goal", "chest_point_reward",
|
|
|
|
|
"stage_chest", "stage_chest_pct", "patrol_cap_hours", "patrol_chest", "patrol_ad_mult", "patrol_ad_daily", "patrol_instant_hours", "patrol_instant_gem",
|
|
|
|
|
"patrol_gear_per_hour", "dev_reset_gem", "tower_tickets_daily", "tower_ad_tickets",
|
|
|
|
|
"raid_bosses", "raid_hp_mult", "raid_daily", "raid_turns", "raid_chest", "raid_arcana_pct",
|
2026-11-05 12:11:10 +00:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|