스테이지 표 기획 회신 반영(#1086 작업 C 후속) — 9-9 하북 4장 배치(마연·장의 = 기병 · 초촉·장남 = 창병 · 엘리트 · 조조군 병사 아트 + 이름표 = generals.csv 새 art 열) · 원소·원술·형주·형주 반란군 병사 art → cc(D3 재사용 · 베리에이션 납품 시 교체) · 5-1 산적·5-2 원술군·세력 코드 lb·sj·jzr 확정 표기 · 무장 판별 = EnemySpawn.isGeneral(아트 이름 대신) · 임포트(무장 72 · 보스 33) · 테스트 40/40 · console error 0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
6992d992df
commit
ce8d45de8f
|
|
@ -2,9 +2,9 @@
|
|||
hgj,황건적,hgj,1장 · 3장 북해 잔당
|
||||
dz,동탁군,dz,2장
|
||||
lb,여포군,dz,4장 · D3 = 동탁군 아트 재사용(베리에이션 lb_ 납품 시 art 교체)
|
||||
ys,원소군,ys,cc 기반 베리에이션(미납품 → 도형)
|
||||
ysu,원술군,ysu,cc 기반 베리에이션(미납품 → 도형)
|
||||
jz,형주군,jz,cc 기반 베리에이션(미납품 → 도형)
|
||||
jzr,형주 반란군,jz,8장 2~5 · 장무·진손 id 접두 jz
|
||||
sj,산적,hgj,7장 2·8 = 황건 아트 재사용(기획서)
|
||||
ys,원소군,cc,D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 ys_ 납품 시 art 교체(기획 세션 회신 2026-11-05)
|
||||
ysu,원술군,cc,D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 ysu_ 납품 시 art 교체(기획 세션 회신 2026-11-05)
|
||||
jz,형주군,cc,D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 jz_ 납품 시 art 교체(기획 세션 회신 2026-11-05)
|
||||
jzr,형주 반란군,cc,D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 jz_ 납품 시 art 교체(기획 세션 회신 2026-11-05) · 8장 2~5 · 장무·진손 id 접두 jz
|
||||
sj,산적,hgj,7장 2·8 · 5-1 = 황건 아트 재사용(기획서 · 기획 세션 회신 2026-11-05)
|
||||
cc,조조군,cc,
|
||||
|
|
|
|||
|
|
|
@ -1,54 +1,58 @@
|
|||
id,name,hanja,hp_mult,atk_mult,note
|
||||
cc_boss_bianxi,변희,卞喜,,,
|
||||
cc_boss_caiyang,채양,蔡陽,,,
|
||||
cc_boss_caocao,조조,曹操,1.5,1.3,현행 보스 값 승계
|
||||
cc_boss_caohong,조홍,曹洪,,,
|
||||
cc_boss_caoren,조인,曹仁,,,
|
||||
cc_boss_chezhou,차주,車冑,,,
|
||||
cc_boss_chunyudao,순우도,淳于導,,,
|
||||
cc_boss_gaolan,고람,高覽,,,
|
||||
cc_boss_hanfu,한복,韓福,,,
|
||||
cc_boss_kongxiu,공수,孔秀,,,
|
||||
cc_boss_lidian,이전,李典,,,
|
||||
cc_boss_liudai,유대,劉岱,,,
|
||||
cc_boss_lvkuang,여광,呂曠,,,
|
||||
cc_boss_lvxiang,여상,呂翔,,,
|
||||
cc_boss_maojie,모개,毛玠,,,
|
||||
cc_boss_mengtan,맹탄,孟坦,,,
|
||||
cc_boss_qinqi,진기,秦琪,,,
|
||||
cc_boss_wangzhi,왕식,王植,,,
|
||||
cc_boss_wangzhong,왕충,王忠,,,
|
||||
cc_boss_xiahoudun,하후돈,夏侯惇,,,
|
||||
cc_boss_xiahouen,하후은,夏侯恩,,,
|
||||
cc_boss_xiahoujie,하후걸,夏侯傑,,,
|
||||
cc_boss_xuchu,허저,許褚,,,
|
||||
cc_boss_xuhuang,서황,徐晃,,,
|
||||
cc_boss_yanming,안명,晏明,,,
|
||||
cc_boss_yujin,우금,于禁,,,
|
||||
cc_boss_zhanghe,장합,張郃,,,
|
||||
dz_boss_caoxing,조성,曹性,,,
|
||||
dz_boss_chengong,진궁,陳宮,,,
|
||||
dz_boss_gaoshun,고순,高順,,,
|
||||
dz_boss_huaxiong,화웅,華雄,,,
|
||||
dz_boss_huzhen,호진,胡軫,,,
|
||||
dz_boss_lvbu,여포,呂布,1.6,1.5,현행 보스 값 승계
|
||||
dz_boss_zhangliao,장료,張遼,,,
|
||||
hgj_boss_chengyuanzhi,정원지,程遠志,,,
|
||||
hgj_boss_dengmao,등무,鄧茂,,,
|
||||
hgj_boss_guanhai,관해,管亥,,,
|
||||
hgj_boss_peiyuanshao,배원소,裴元紹,,,
|
||||
hgj_boss_zhangbao,장보,張寶,,,
|
||||
hgj_boss_zhangjiao,장각,張角,1.3,1.2,현행 보스 값 승계
|
||||
hgj_boss_zhangliang,장량,張梁,,,
|
||||
jz_boss_caimao,채모,蔡瑁,,,
|
||||
jz_boss_caixun,채훈,蔡壎,,,
|
||||
jz_boss_caizhong,채중,蔡中,,,
|
||||
jz_boss_chensun,진손,陳孫,,,
|
||||
jz_boss_wenpin,문빙,文聘,,,
|
||||
jz_boss_zhangwu,장무,張武,,,
|
||||
jz_boss_zhangyun,장윤,張允,,,
|
||||
ys_boss_quyi,국의,麴義,,,
|
||||
ys_boss_wenchou,문추,文醜,,,
|
||||
ys_boss_yanliang,안량,顏良,,,
|
||||
ysu_boss_jiling,기령,紀靈,,,
|
||||
ysu_boss_xunzheng,순정,荀正,,,
|
||||
id,name,hanja,hp_mult,atk_mult,art,note
|
||||
cc_boss_bianxi,변희,卞喜,,,,
|
||||
cc_boss_caiyang,채양,蔡陽,,,,
|
||||
cc_boss_caocao,조조,曹操,1.5,1.3,,현행 보스 값 승계
|
||||
cc_boss_caohong,조홍,曹洪,,,,
|
||||
cc_boss_caoren,조인,曹仁,,,,
|
||||
cc_boss_chezhou,차주,車冑,,,,
|
||||
cc_boss_chunyudao,순우도,淳于導,,,,
|
||||
cc_boss_gaolan,고람,高覽,,,,
|
||||
cc_boss_hanfu,한복,韓福,,,,
|
||||
cc_boss_jiaochu,초촉,焦觸,,,cc_spear,하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
|
||||
cc_boss_kongxiu,공수,孔秀,,,,
|
||||
cc_boss_lidian,이전,李典,,,,
|
||||
cc_boss_liudai,유대,劉岱,,,,
|
||||
cc_boss_lvkuang,여광,呂曠,,,,
|
||||
cc_boss_lvxiang,여상,呂翔,,,,
|
||||
cc_boss_maojie,모개,毛玠,,,,
|
||||
cc_boss_mayan,마연,馬延,,,cc_cavalry,하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
|
||||
cc_boss_mengtan,맹탄,孟坦,,,,
|
||||
cc_boss_qinqi,진기,秦琪,,,,
|
||||
cc_boss_wangzhi,왕식,王植,,,,
|
||||
cc_boss_wangzhong,왕충,王忠,,,,
|
||||
cc_boss_xiahoudun,하후돈,夏侯惇,,,,
|
||||
cc_boss_xiahouen,하후은,夏侯恩,,,,
|
||||
cc_boss_xiahoujie,하후걸,夏侯傑,,,,
|
||||
cc_boss_xuchu,허저,許褚,,,,
|
||||
cc_boss_xuhuang,서황,徐晃,,,,
|
||||
cc_boss_yanming,안명,晏明,,,,
|
||||
cc_boss_yujin,우금,于禁,,,,
|
||||
cc_boss_zhanghe,장합,張郃,,,,
|
||||
cc_boss_zhangnan,장남,張南,,,cc_spear,하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
|
||||
cc_boss_zhangyi,장의,張顗,,,cc_cavalry,하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
|
||||
dz_boss_caoxing,조성,曹性,,,,
|
||||
dz_boss_chengong,진궁,陳宮,,,,
|
||||
dz_boss_gaoshun,고순,高順,,,,
|
||||
dz_boss_huaxiong,화웅,華雄,,,,
|
||||
dz_boss_huzhen,호진,胡軫,,,,
|
||||
dz_boss_lvbu,여포,呂布,1.6,1.5,,현행 보스 값 승계
|
||||
dz_boss_zhangliao,장료,張遼,,,,
|
||||
hgj_boss_chengyuanzhi,정원지,程遠志,,,,
|
||||
hgj_boss_dengmao,등무,鄧茂,,,,
|
||||
hgj_boss_guanhai,관해,管亥,,,,
|
||||
hgj_boss_peiyuanshao,배원소,裴元紹,,,,
|
||||
hgj_boss_zhangbao,장보,張寶,,,,
|
||||
hgj_boss_zhangjiao,장각,張角,1.3,1.2,,현행 보스 값 승계
|
||||
hgj_boss_zhangliang,장량,張梁,,,,
|
||||
jz_boss_caimao,채모,蔡瑁,,,,
|
||||
jz_boss_caixun,채훈,蔡壎,,,,
|
||||
jz_boss_caizhong,채중,蔡中,,,,
|
||||
jz_boss_chensun,진손,陳孫,,,,
|
||||
jz_boss_wenpin,문빙,文聘,,,,
|
||||
jz_boss_zhangwu,장무,張武,,,,
|
||||
jz_boss_zhangyun,장윤,張允,,,,
|
||||
ys_boss_quyi,국의,麴義,,,,
|
||||
ys_boss_wenchou,문추,文醜,,,,
|
||||
ys_boss_yanliang,안량,顏良,,,,
|
||||
ysu_boss_jiling,기령,紀靈,,,,
|
||||
ysu_boss_xunzheng,순정,荀正,,,,
|
||||
|
|
|
|||
|
|
|
@ -49,8 +49,8 @@
|
|||
4,13,하비 수공,normal,하비,lb,3,3,2,3,0,,물에 잠긴 성,
|
||||
4,14,하비 성문 — 장료,elite,하비,lb,3,2,3,2,0,dz_boss_zhangliao:cavalry:false,성문,
|
||||
4,15,하비 — 여포,boss,하비(백문루),lb,3,2,3,3,0,dz_boss_lvbu:cavalry:true,성안 누각 앞,
|
||||
5,1,허도 근교 — 사냥터의 도적,normal,허도,sj,3,2,2,2,0,,숲,세력 추정(기획서 미기재 · 도적 = 7장 산적 선례)
|
||||
5,2,허도 출진 — 원술 차단,normal,허도 동쪽,ysu,3,2,2,2,0,,들판,세력 추정(기획서 미기재 · 원술 차단 출진)
|
||||
5,1,허도 근교 — 사냥터의 도적,normal,허도,sj,3,2,2,2,0,,숲,세력 = 산적 확정(기획 세션 회신 2026-11-05)
|
||||
5,2,허도 출진 — 원술 차단,normal,허도 동쪽,ysu,3,2,2,2,0,,들판,세력 = 원술군 확정(기획 세션 회신 2026-11-05)
|
||||
5,3,서주 남쪽 — 원술군 선봉,normal,서주 남쪽,ysu,3,3,2,2,0,,들판,
|
||||
5,4,원술 친위대,normal,서주 남쪽,ysu,3,3,2,3,0,,들판,
|
||||
5,5,서주 남쪽 — 기령,boss,서주 남쪽,ysu,3,3,2,2,0,ysu_boss_jiling:spear:true,들판,
|
||||
|
|
@ -117,7 +117,7 @@
|
|||
9,6,당양 — 호표기의 추격,normal,당양,cc,2,3,6,2,0,,들판,
|
||||
9,7,장판 — 순우도,elite,장판,cc,3,3,4,2,0,cc_boss_chunyudao:spear:false,들판,
|
||||
9,8,장판 — 하후은,elite,장판,cc,3,3,4,2,0,cc_boss_xiahouen:cavalry:false,들판,
|
||||
9,9,장판 — 안명과 하북 4장,elite,장판,cc,2,3,4,2,0,cc_boss_yanming:spear:false,들판,미배치 = 하북 4장(병사 아트 + 이름표) · 병종 미정(PD 결정 대기)
|
||||
9,9,장판 — 안명과 하북 4장,elite,장판,cc,2,3,4,2,0,cc_boss_yanming:spear:false;cc_boss_mayan:cavalry:false;cc_boss_zhangyi:cavalry:false;cc_boss_jiaochu:spear:false;cc_boss_zhangnan:spear:false,들판,하북 4장(마연·장의 = 기 · 초촉·장남 = 창) = 조조군 병사 아트 + 이름표 · 엘리트(기획 세션 회신 2026-11-05)
|
||||
9,10,장판파 — 장합,boss,장판,cc,3,4,4,2,0,cc_boss_zhanghe:spear:true,들판·언덕,
|
||||
9,11,장판교 — 장비의 일갈,elite,장판교,cc,3,3,4,3,0,cc_boss_xiahoujie:cavalry:false,다리,
|
||||
9,12,부서진 장판교,normal,장판교,cc,3,3,5,2,0,,강변,
|
||||
|
|
|
|||
|
File diff suppressed because it is too large
Load Diff
|
|
@ -52,6 +52,8 @@ namespace TKS
|
|||
public float hpMult = 1f;
|
||||
public float atkMult = 1f;
|
||||
public bool isBoss;
|
||||
[Tooltip("이름 있는 무장(스테이지 표 generals 열 · 보스·엘리트) · false = 병사")]
|
||||
public bool isGeneral;
|
||||
[Tooltip("Resources/Units/<art>/ 아트 폴더 이름 · 비면 도형으로 표시")]
|
||||
public string art = "";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ namespace TKS
|
|||
/// 스테이지 표(Assets/Data/Stages/*.csv · utf-8-sig) 해석 + BalanceConfig 반영. 값의 SOT = CSV(C45) — 코드는 열 이름·형식만 안다.
|
||||
/// stages.csv = chapter,stage,title,type(normal|elite|boss),place,faction,infantry,spear,cavalry,archer,strategist,generals(id:병종:보스여부 ; 구분),bg_theme,note
|
||||
/// (strategist = 책사 수 · PD 2026-11-05 #1087 ⑤ · 비거나 열이 없으면 0)
|
||||
/// chapters.csv = chapter,title,subtitle,years,map,ai_accuracy,ai_aggro,note · generals.csv = id,name,hanja,hp_mult,atk_mult,note · factions.csv = code,name,art,note
|
||||
/// chapters.csv = chapter,title,subtitle,years,map,ai_accuracy,ai_aggro,note · generals.csv = id,name,hanja,hp_mult,atk_mult,art,note(art 비면 = id) · factions.csv = code,name,art,note
|
||||
/// 에디터 임포터(TKS/Import Stages)와 데이터 검증 테스트가 같이 쓴다.
|
||||
/// </summary>
|
||||
public static class StageTable
|
||||
|
|
@ -66,6 +66,7 @@ namespace TKS
|
|||
public string name;
|
||||
public float hpMult = float.NaN; // 비면 역할(보스·엘리트) 기본 배율
|
||||
public float atkMult = float.NaN;
|
||||
public string art; // 비면 id(고유 아트) · 병사 아트 + 이름표 무장은 병사 아트 id
|
||||
}
|
||||
|
||||
public class FactionInfo
|
||||
|
|
@ -99,6 +100,7 @@ namespace TKS
|
|||
foreach (var r in ReadCsv(texts[2], "generals.csv", t.errors))
|
||||
{
|
||||
var g = new GeneralInfo { id = Get(r, "id"), name = Get(r, "name") };
|
||||
g.art = Get(r, "art").Length > 0 ? Get(r, "art") : g.id;
|
||||
g.hpMult = OptFloat(r, "hp_mult", t.errors, "generals.csv");
|
||||
g.atkMult = OptFloat(r, "atk_mult", t.errors, "generals.csv");
|
||||
if (string.IsNullOrEmpty(g.id) || string.IsNullOrEmpty(g.name)) t.errors.Add("generals.csv 행 " + Get(r, "#") + ": id·name 필수");
|
||||
|
|
@ -270,7 +272,8 @@ namespace TKS
|
|||
hpMult = !float.IsNaN(info.hpMult) ? info.hpMult : g.boss ? cfg.bossGeneralHpMult : cfg.eliteGeneralHpMult,
|
||||
atkMult = !float.IsNaN(info.atkMult) ? info.atkMult : g.boss ? cfg.bossGeneralAtkMult : cfg.eliteGeneralAtkMult,
|
||||
isBoss = g.boss,
|
||||
art = g.id,
|
||||
isGeneral = true,
|
||||
art = info.art,
|
||||
});
|
||||
}
|
||||
return res;
|
||||
|
|
|
|||
|
|
@ -580,7 +580,7 @@ namespace TKS
|
|||
{
|
||||
counts[(int)e.type]++;
|
||||
if (e.isBoss) bosses.Add(e.name);
|
||||
else if (e.art.Contains("_boss_")) elites.Add(e.name);
|
||||
else if (e.isGeneral) elites.Add(e.name);
|
||||
}
|
||||
var sb = new System.Text.StringBuilder("적 " + stage.enemies.Count + "기 · ");
|
||||
bool first = true;
|
||||
|
|
|
|||
|
|
@ -920,15 +920,15 @@ namespace TKS.Tests
|
|||
foreach (var p in poses)
|
||||
Assert.IsTrue(a.Clips.ContainsKey(v + "_" + p), h.art + " " + v + "_" + p);
|
||||
}
|
||||
// 병사 = 납품 세력(hgj·dz·cc)은 반드시 원화 · 장수(<세력>_boss_<병음>) = 납품된 것만 원화(나머지는 도형 대체 · StageData_MissingArt 테스트)
|
||||
// 병사 = 납품 세력(hgj·dz·cc · 원소·원술·형주는 D3 로 cc 재사용)은 반드시 원화(책사 병사 아트는 미납품) · 장수 = 납품된 것만 원화(나머지는 도형 대체 · StageData_MissingArt 테스트)
|
||||
string[] delivered = { "hgj_", "dz_", "cc_" };
|
||||
foreach (var s in cfg.stages)
|
||||
foreach (var e in s.enemies)
|
||||
{
|
||||
bool general = e.art.Contains("_boss_");
|
||||
bool want = false;
|
||||
foreach (var f in delivered) want |= e.art.StartsWith(f);
|
||||
if (general) want = Resources.Load<TextAsset>("Units/" + e.art + "/meta") != null;
|
||||
if (e.type == UnitType.Strategist) want = false;
|
||||
if (e.isGeneral) want = Resources.Load<TextAsset>("Units/" + e.art + "/meta") != null;
|
||||
if (!want) continue;
|
||||
var a = UnitArt.Load(e.art);
|
||||
Assert.IsNotNull(a, "적 원화 " + e.art);
|
||||
|
|
@ -1010,17 +1010,20 @@ namespace TKS.Tests
|
|||
Assert.AreEqual(row.title, s.title, at);
|
||||
Assert.AreEqual(row.SoldierCount + row.generals.Count, s.enemies.Count, at + " 적 수 = 병사 + 무장");
|
||||
var counts = new int[UnitTypeInfo.Count];
|
||||
int bosses = 0;
|
||||
int bosses = 0, generals = 0;
|
||||
foreach (var e in s.enemies)
|
||||
{
|
||||
if (!e.art.Contains("_boss_")) counts[(int)e.type]++;
|
||||
if (!e.isGeneral) counts[(int)e.type]++;
|
||||
else generals++;
|
||||
if (e.isBoss) bosses++;
|
||||
Assert.IsTrue(!e.isBoss || e.isGeneral, at + " 보스는 무장");
|
||||
Assert.IsFalse(string.IsNullOrEmpty(e.art), at + " 아트 id");
|
||||
float r = c.GetStats(e.type).radius * (e.isBoss ? c.bossRadiusMult : 1f);
|
||||
Assert.IsTrue(Mathf.Abs(e.position.x) <= halfW - r && e.position.y <= halfH - r, at + " " + e.name + " 전장 안 " + e.position);
|
||||
Assert.Greater(e.position.y, playerFront + 2f, at + " " + e.name + " 아군 출발선보다 앞(적 쪽)");
|
||||
}
|
||||
for (int k = 0; k < UnitTypeInfo.Count; k++) Assert.AreEqual(row.soldiers[k], counts[k], at + " " + UnitTypeInfo.Korean((UnitType)k) + " 수");
|
||||
Assert.AreEqual(row.generals.Count, generals, at + " 무장 수");
|
||||
Assert.AreEqual(row.generals.FindAll(g => g.boss).Count, bosses, at + " 보스 수");
|
||||
for (int a = 0; a < s.enemies.Count; a++)
|
||||
for (int b = a + 1; b < s.enemies.Count; b++)
|
||||
|
|
|
|||
Loading…
Reference in New Issue