스테이지 표 기획 회신 반영(#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:
깃 관리자 2026-11-05 13:23:01 +09:00
parent 6992d992df
commit ce8d45de8f
8 changed files with 2109 additions and 468 deletions

View File

@ -2,9 +2,9 @@
hgj,황건적,hgj,1장 · 3장 북해 잔당 hgj,황건적,hgj,1장 · 3장 북해 잔당
dz,동탁군,dz,2장 dz,동탁군,dz,2장
lb,여포군,dz,4장 · D3 = 동탁군 아트 재사용(베리에이션 lb_ 납품 시 art 교체) lb,여포군,dz,4장 · D3 = 동탁군 아트 재사용(베리에이션 lb_ 납품 시 art 교체)
ys,원소군,ys,cc 기반 베리에이션(미납품 → 도형) ys,원소군,cc,D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 ys_ 납품 시 art 교체(기획 세션 회신 2026-11-05)
ysu,원술군,ysu,cc 기반 베리에이션(미납품 → 도형) ysu,원술군,cc,D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 ysu_ 납품 시 art 교체(기획 세션 회신 2026-11-05)
jz,형주군,jz,cc 기반 베리에이션(미납품 → 도형) jz,형주군,cc,D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 jz_ 납품 시 art 교체(기획 세션 회신 2026-11-05)
jzr,형주 반란군,jz,8장 2~5 · 장무·진손 id 접두 jz jzr,형주 반란군,cc,D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 jz_ 납품 시 art 교체(기획 세션 회신 2026-11-05) · 8장 2~5 · 장무·진손 id 접두 jz
sj,산적,hgj,7장 2·8 = 황건 아트 재사용(기획서) sj,산적,hgj,7장 2·8 · 5-1 = 황건 아트 재사용(기획서 · 기획 세션 회신 2026-11-05)
cc,조조군,cc, cc,조조군,cc,

1 code name art note
2 hgj 황건적 hgj 1장 · 3장 북해 잔당
3 dz 동탁군 dz 2장
4 lb 여포군 dz 4장 · D3 = 동탁군 아트 재사용(베리에이션 lb_ 납품 시 art 교체)
5 ys 원소군 ys cc cc 기반 베리에이션(미납품 → 도형) D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 ys_ 납품 시 art 교체(기획 세션 회신 2026-11-05)
6 ysu 원술군 ysu cc cc 기반 베리에이션(미납품 → 도형) D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 ysu_ 납품 시 art 교체(기획 세션 회신 2026-11-05)
7 jz 형주군 jz cc cc 기반 베리에이션(미납품 → 도형) D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 jz_ 납품 시 art 교체(기획 세션 회신 2026-11-05)
8 jzr 형주 반란군 jz cc 8장 2~5 · 장무·진손 id 접두 jz D3 = 조조군(cc) 병사 아트 재사용 · 베리에이션 jz_ 납품 시 art 교체(기획 세션 회신 2026-11-05) · 8장 2~5 · 장무·진손 id 접두 jz
9 sj 산적 hgj 7장 2·8 = 황건 아트 재사용(기획서) 7장 2·8 · 5-1 = 황건 아트 재사용(기획서 · 기획 세션 회신 2026-11-05)
10 cc 조조군 cc

View File

@ -1,54 +1,58 @@
id,name,hanja,hp_mult,atk_mult,note id,name,hanja,hp_mult,atk_mult,art,note
cc_boss_bianxi,변희,卞喜,,, cc_boss_bianxi,변희,卞喜,,,,
cc_boss_caiyang,채양,蔡陽,,, cc_boss_caiyang,채양,蔡陽,,,,
cc_boss_caocao,조조,曹操,1.5,1.3,현행 보스 값 승계 cc_boss_caocao,조조,曹操,1.5,1.3,,현행 보스 값 승계
cc_boss_caohong,조홍,曹洪,,, cc_boss_caohong,조홍,曹洪,,,,
cc_boss_caoren,조인,曹仁,,, cc_boss_caoren,조인,曹仁,,,,
cc_boss_chezhou,차주,車冑,,, cc_boss_chezhou,차주,車冑,,,,
cc_boss_chunyudao,순우도,淳于導,,, cc_boss_chunyudao,순우도,淳于導,,,,
cc_boss_gaolan,고람,高覽,,, cc_boss_gaolan,고람,高覽,,,,
cc_boss_hanfu,한복,韓福,,, cc_boss_hanfu,한복,韓福,,,,
cc_boss_kongxiu,공수,孔秀,,, cc_boss_jiaochu,초촉,焦觸,,,cc_spear,하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
cc_boss_lidian,이전,李典,,, cc_boss_kongxiu,공수,孔秀,,,,
cc_boss_liudai,유대,劉岱,,, cc_boss_lidian,이전,李典,,,,
cc_boss_lvkuang,여광,呂曠,,, cc_boss_liudai,유대,劉岱,,,,
cc_boss_lvxiang,여상,呂翔,,, cc_boss_lvkuang,여광,呂曠,,,,
cc_boss_maojie,모개,毛玠,,, cc_boss_lvxiang,여상,呂翔,,,,
cc_boss_mengtan,맹탄,孟坦,,, cc_boss_maojie,모개,毛玠,,,,
cc_boss_qinqi,진기,秦琪,,, cc_boss_mayan,마연,馬延,,,cc_cavalry,하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
cc_boss_wangzhi,왕식,王植,,, cc_boss_mengtan,맹탄,孟坦,,,,
cc_boss_wangzhong,왕충,王忠,,, cc_boss_qinqi,진기,秦琪,,,,
cc_boss_xiahoudun,하후돈,夏侯惇,,, cc_boss_wangzhi,왕식,王植,,,,
cc_boss_xiahouen,하후은,夏侯恩,,, cc_boss_wangzhong,왕충,王忠,,,,
cc_boss_xiahoujie,하후걸,夏侯傑,,, cc_boss_xiahoudun,하후돈,夏侯惇,,,,
cc_boss_xuchu,허저,許褚,,, cc_boss_xiahouen,하후은,夏侯恩,,,,
cc_boss_xuhuang,서황,徐晃,,, cc_boss_xiahoujie,하후걸,夏侯傑,,,,
cc_boss_yanming,안명,晏明,,, cc_boss_xuchu,허저,許褚,,,,
cc_boss_yujin,우금,于禁,,, cc_boss_xuhuang,서황,徐晃,,,,
cc_boss_zhanghe,장합,張郃,,, cc_boss_yanming,안명,晏明,,,,
dz_boss_caoxing,조성,曹性,,, cc_boss_yujin,우금,于禁,,,,
dz_boss_chengong,진궁,陳宮,,, cc_boss_zhanghe,장합,張郃,,,,
dz_boss_gaoshun,고순,高順,,, cc_boss_zhangnan,장남,張南,,,cc_spear,하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
dz_boss_huaxiong,화웅,華雄,,, cc_boss_zhangyi,장의,張顗,,,cc_cavalry,하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
dz_boss_huzhen,호진,胡軫,,, dz_boss_caoxing,조성,曹性,,,,
dz_boss_lvbu,여포,呂布,1.6,1.5,현행 보스 값 승계 dz_boss_chengong,진궁,陳宮,,,,
dz_boss_zhangliao,장료,張遼,,, dz_boss_gaoshun,고순,高順,,,,
hgj_boss_chengyuanzhi,정원지,程遠志,,, dz_boss_huaxiong,화웅,華雄,,,,
hgj_boss_dengmao,등무,鄧茂,,, dz_boss_huzhen,호진,胡軫,,,,
hgj_boss_guanhai,관해,管亥,,, dz_boss_lvbu,여포,呂布,1.6,1.5,,현행 보스 값 승계
hgj_boss_peiyuanshao,배원소,裴元紹,,, dz_boss_zhangliao,장료,張遼,,,,
hgj_boss_zhangbao,장보,張寶,,, hgj_boss_chengyuanzhi,정원지,程遠志,,,,
hgj_boss_zhangjiao,장각,張角,1.3,1.2,현행 보스 값 승계 hgj_boss_dengmao,등무,鄧茂,,,,
hgj_boss_zhangliang,장량,張梁,,, hgj_boss_guanhai,관해,管亥,,,,
jz_boss_caimao,채모,蔡瑁,,, hgj_boss_peiyuanshao,배원소,裴元紹,,,,
jz_boss_caixun,채훈,蔡壎,,, hgj_boss_zhangbao,장보,張寶,,,,
jz_boss_caizhong,채중,蔡中,,, hgj_boss_zhangjiao,장각,張角,1.3,1.2,,현행 보스 값 승계
jz_boss_chensun,진손,陳孫,,, hgj_boss_zhangliang,장량,張梁,,,,
jz_boss_wenpin,문빙,文聘,,, jz_boss_caimao,채모,蔡瑁,,,,
jz_boss_zhangwu,장무,張武,,, jz_boss_caixun,채훈,蔡壎,,,,
jz_boss_zhangyun,장윤,張允,,, jz_boss_caizhong,채중,蔡中,,,,
ys_boss_quyi,국의,麴義,,, jz_boss_chensun,진손,陳孫,,,,
ys_boss_wenchou,문추,文醜,,, jz_boss_wenpin,문빙,文聘,,,,
ys_boss_yanliang,안량,顏良,,, jz_boss_zhangwu,장무,張武,,,,
ysu_boss_jiling,기령,紀靈,,, jz_boss_zhangyun,장윤,張允,,,,
ysu_boss_xunzheng,순정,荀正,,, ys_boss_quyi,국의,麴義,,,,
ys_boss_wenchou,문추,文醜,,,,
ys_boss_yanliang,안량,顏良,,,,
ysu_boss_jiling,기령,紀靈,,,,
ysu_boss_xunzheng,순정,荀正,,,,

1 id name hanja hp_mult atk_mult art note
2 cc_boss_bianxi 변희 卞喜
3 cc_boss_caiyang 채양 蔡陽
4 cc_boss_caocao 조조 曹操 1.5 1.3 현행 보스 값 승계
5 cc_boss_caohong 조홍 曹洪
6 cc_boss_caoren 조인 曹仁
7 cc_boss_chezhou 차주 車冑
8 cc_boss_chunyudao 순우도 淳于導
9 cc_boss_gaolan 고람 高覽
10 cc_boss_hanfu 한복 韓福
11 cc_boss_kongxiu cc_boss_jiaochu 공수 초촉 孔秀 焦觸 cc_spear 하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
12 cc_boss_lidian cc_boss_kongxiu 이전 공수 李典 孔秀
13 cc_boss_liudai cc_boss_lidian 유대 이전 劉岱 李典
14 cc_boss_lvkuang cc_boss_liudai 여광 유대 呂曠 劉岱
15 cc_boss_lvxiang cc_boss_lvkuang 여상 여광 呂翔 呂曠
16 cc_boss_maojie cc_boss_lvxiang 모개 여상 毛玠 呂翔
17 cc_boss_mengtan cc_boss_maojie 맹탄 모개 孟坦 毛玠
18 cc_boss_qinqi cc_boss_mayan 진기 마연 秦琪 馬延 cc_cavalry 하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
19 cc_boss_wangzhi cc_boss_mengtan 왕식 맹탄 王植 孟坦
20 cc_boss_wangzhong cc_boss_qinqi 왕충 진기 王忠 秦琪
21 cc_boss_xiahoudun cc_boss_wangzhi 하후돈 왕식 夏侯惇 王植
22 cc_boss_xiahouen cc_boss_wangzhong 하후은 왕충 夏侯恩 王忠
23 cc_boss_xiahoujie cc_boss_xiahoudun 하후걸 하후돈 夏侯傑 夏侯惇
24 cc_boss_xuchu cc_boss_xiahouen 허저 하후은 許褚 夏侯恩
25 cc_boss_xuhuang cc_boss_xiahoujie 서황 하후걸 徐晃 夏侯傑
26 cc_boss_yanming cc_boss_xuchu 안명 허저 晏明 許褚
27 cc_boss_yujin cc_boss_xuhuang 우금 서황 于禁 徐晃
28 cc_boss_zhanghe cc_boss_yanming 장합 안명 張郃 晏明
29 dz_boss_caoxing cc_boss_yujin 조성 우금 曹性 于禁
30 dz_boss_chengong cc_boss_zhanghe 진궁 장합 陳宮 張郃
31 dz_boss_gaoshun cc_boss_zhangnan 고순 장남 高順 張南 cc_spear 하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
32 dz_boss_huaxiong cc_boss_zhangyi 화웅 장의 華雄 張顗 cc_cavalry 하북 4장 · 9-9 · 조조군 병사 아트 + 이름표(고유 아트 없음 · 기획서 §6-2 · 기획 세션 회신 2026-11-05)
33 dz_boss_huzhen dz_boss_caoxing 호진 조성 胡軫 曹性
34 dz_boss_lvbu dz_boss_chengong 여포 진궁 呂布 陳宮 1.6 1.5 현행 보스 값 승계
35 dz_boss_zhangliao dz_boss_gaoshun 장료 고순 張遼 高順
36 hgj_boss_chengyuanzhi dz_boss_huaxiong 정원지 화웅 程遠志 華雄
37 hgj_boss_dengmao dz_boss_huzhen 등무 호진 鄧茂 胡軫
38 hgj_boss_guanhai dz_boss_lvbu 관해 여포 管亥 呂布 1.6 1.5 현행 보스 값 승계
39 hgj_boss_peiyuanshao dz_boss_zhangliao 배원소 장료 裴元紹 張遼
40 hgj_boss_zhangbao hgj_boss_chengyuanzhi 장보 정원지 張寶 程遠志
41 hgj_boss_zhangjiao hgj_boss_dengmao 장각 등무 張角 鄧茂 1.3 1.2 현행 보스 값 승계
42 hgj_boss_zhangliang hgj_boss_guanhai 장량 관해 張梁 管亥
43 jz_boss_caimao hgj_boss_peiyuanshao 채모 배원소 蔡瑁 裴元紹
44 jz_boss_caixun hgj_boss_zhangbao 채훈 장보 蔡壎 張寶
45 jz_boss_caizhong hgj_boss_zhangjiao 채중 장각 蔡中 張角 1.3 1.2 현행 보스 값 승계
46 jz_boss_chensun hgj_boss_zhangliang 진손 장량 陳孫 張梁
47 jz_boss_wenpin jz_boss_caimao 문빙 채모 文聘 蔡瑁
48 jz_boss_zhangwu jz_boss_caixun 장무 채훈 張武 蔡壎
49 jz_boss_zhangyun jz_boss_caizhong 장윤 채중 張允 蔡中
50 ys_boss_quyi jz_boss_chensun 국의 진손 麴義 陳孫
51 ys_boss_wenchou jz_boss_wenpin 문추 문빙 文醜 文聘
52 ys_boss_yanliang jz_boss_zhangwu 안량 장무 顏良 張武
53 ysu_boss_jiling jz_boss_zhangyun 기령 장윤 紀靈 張允
54 ysu_boss_xunzheng ys_boss_quyi 순정 국의 荀正 麴義
55 ys_boss_wenchou 문추 文醜
56 ys_boss_yanliang 안량 顏良
57 ysu_boss_jiling 기령 紀靈
58 ysu_boss_xunzheng 순정 荀正

View File

@ -49,8 +49,8 @@
4,13,하비 수공,normal,하비,lb,3,3,2,3,0,,물에 잠긴 성, 4,13,하비 수공,normal,하비,lb,3,3,2,3,0,,물에 잠긴 성,
4,14,하비 성문 — 장료,elite,하비,lb,3,2,3,2,0,dz_boss_zhangliao:cavalry:false,성문, 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,성안 누각 앞, 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,1,허도 근교 — 사냥터의 도적,normal,허도,sj,3,2,2,2,0,,숲,세력 = 산적 확정(기획 세션 회신 2026-11-05)
5,2,허도 출진 — 원술 차단,normal,허도 동쪽,ysu,3,2,2,2,0,,들판,세력 추정(기획서 미기재 · 원술 차단 출진) 5,2,허도 출진 — 원술 차단,normal,허도 동쪽,ysu,3,2,2,2,0,,들판,세력 = 원술군 확정(기획 세션 회신 2026-11-05)
5,3,서주 남쪽 — 원술군 선봉,normal,서주 남쪽,ysu,3,3,2,2,0,,들판, 5,3,서주 남쪽 — 원술군 선봉,normal,서주 남쪽,ysu,3,3,2,2,0,,들판,
5,4,원술 친위대,normal,서주 남쪽,ysu,3,3,2,3,0,,들판, 5,4,원술 친위대,normal,서주 남쪽,ysu,3,3,2,3,0,,들판,
5,5,서주 남쪽 — 기령,boss,서주 남쪽,ysu,3,3,2,2,0,ysu_boss_jiling:spear:true,들판, 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,6,당양 — 호표기의 추격,normal,당양,cc,2,3,6,2,0,,들판,
9,7,장판 — 순우도,elite,장판,cc,3,3,4,2,0,cc_boss_chunyudao:spear:false,들판, 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,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,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,11,장판교 — 장비의 일갈,elite,장판교,cc,3,3,4,3,0,cc_boss_xiahoujie:cavalry:false,다리,
9,12,부서진 장판교,normal,장판교,cc,3,3,5,2,0,,강변, 9,12,부서진 장판교,normal,장판교,cc,3,3,5,2,0,,강변,

1 chapter stage title type place faction infantry spear cavalry archer strategist generals bg_theme note
49 4 13 하비 수공 normal 하비 lb 3 3 2 3 0 물에 잠긴 성
50 4 14 하비 성문 — 장료 elite 하비 lb 3 2 3 2 0 dz_boss_zhangliao:cavalry:false 성문
51 4 15 하비 — 여포 boss 하비(백문루) lb 3 2 3 3 0 dz_boss_lvbu:cavalry:true 성안 누각 앞
52 5 1 허도 근교 — 사냥터의 도적 normal 허도 sj 3 2 2 2 0 숲 세력 추정(기획서 미기재 · 도적 = 7장 산적 선례) 세력 = 산적 확정(기획 세션 회신 2026-11-05)
53 5 2 허도 출진 — 원술 차단 normal 허도 동쪽 ysu 3 2 2 2 0 들판 세력 추정(기획서 미기재 · 원술 차단 출진) 세력 = 원술군 확정(기획 세션 회신 2026-11-05)
54 5 3 서주 남쪽 — 원술군 선봉 normal 서주 남쪽 ysu 3 3 2 2 0 들판
55 5 4 원술 친위대 normal 서주 남쪽 ysu 3 3 2 3 0 들판
56 5 5 서주 남쪽 — 기령 boss 서주 남쪽 ysu 3 3 2 2 0 ysu_boss_jiling:spear:true 들판
117 9 6 당양 — 호표기의 추격 normal 당양 cc 2 3 6 2 0 들판
118 9 7 장판 — 순우도 elite 장판 cc 3 3 4 2 0 cc_boss_chunyudao:spear:false 들판
119 9 8 장판 — 하후은 elite 장판 cc 3 3 4 2 0 cc_boss_xiahouen:cavalry:false 들판
120 9 9 장판 — 안명과 하북 4장 elite 장판 cc 2 3 4 2 0 cc_boss_yanming:spear:false 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장(병사 아트 + 이름표) · 병종 미정(PD 결정 대기) 하북 4장(마연·장의 = 기 · 초촉·장남 = 창) = 조조군 병사 아트 + 이름표 · 엘리트(기획 세션 회신 2026-11-05)
121 9 10 장판파 — 장합 boss 장판 cc 3 4 4 2 0 cc_boss_zhanghe:spear:true 들판·언덕
122 9 11 장판교 — 장비의 일갈 elite 장판교 cc 3 3 4 3 0 cc_boss_xiahoujie:cavalry:false 다리
123 9 12 부서진 장판교 normal 장판교 cc 3 3 5 2 0 강변

File diff suppressed because it is too large Load Diff

View File

@ -52,6 +52,8 @@ namespace TKS
public float hpMult = 1f; public float hpMult = 1f;
public float atkMult = 1f; public float atkMult = 1f;
public bool isBoss; public bool isBoss;
[Tooltip("이름 있는 무장(스테이지 표 generals 열 · 보스·엘리트) · false = 병사")]
public bool isGeneral;
[Tooltip("Resources/Units/<art>/ 아트 폴더 이름 · 비면 도형으로 표시")] [Tooltip("Resources/Units/<art>/ 아트 폴더 이름 · 비면 도형으로 표시")]
public string art = ""; public string art = "";
} }

View File

@ -9,7 +9,7 @@ namespace TKS
/// 스테이지 표(Assets/Data/Stages/*.csv · utf-8-sig) 해석 + BalanceConfig 반영. 값의 SOT = CSV(C45) — 코드는 열 이름·형식만 안다. /// 스테이지 표(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 /// 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) /// (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)와 데이터 검증 테스트가 같이 쓴다. /// 에디터 임포터(TKS/Import Stages)와 데이터 검증 테스트가 같이 쓴다.
/// </summary> /// </summary>
public static class StageTable public static class StageTable
@ -66,6 +66,7 @@ namespace TKS
public string name; public string name;
public float hpMult = float.NaN; // 비면 역할(보스·엘리트) 기본 배율 public float hpMult = float.NaN; // 비면 역할(보스·엘리트) 기본 배율
public float atkMult = float.NaN; public float atkMult = float.NaN;
public string art; // 비면 id(고유 아트) · 병사 아트 + 이름표 무장은 병사 아트 id
} }
public class FactionInfo public class FactionInfo
@ -99,6 +100,7 @@ namespace TKS
foreach (var r in ReadCsv(texts[2], "generals.csv", t.errors)) foreach (var r in ReadCsv(texts[2], "generals.csv", t.errors))
{ {
var g = new GeneralInfo { id = Get(r, "id"), name = Get(r, "name") }; 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.hpMult = OptFloat(r, "hp_mult", t.errors, "generals.csv");
g.atkMult = OptFloat(r, "atk_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 필수"); 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, 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, atkMult = !float.IsNaN(info.atkMult) ? info.atkMult : g.boss ? cfg.bossGeneralAtkMult : cfg.eliteGeneralAtkMult,
isBoss = g.boss, isBoss = g.boss,
art = g.id, isGeneral = true,
art = info.art,
}); });
} }
return res; return res;

View File

@ -580,7 +580,7 @@ namespace TKS
{ {
counts[(int)e.type]++; counts[(int)e.type]++;
if (e.isBoss) bosses.Add(e.name); 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 + "기 · "); var sb = new System.Text.StringBuilder("적 " + stage.enemies.Count + "기 · ");
bool first = true; bool first = true;

View File

@ -920,15 +920,15 @@ namespace TKS.Tests
foreach (var p in poses) foreach (var p in poses)
Assert.IsTrue(a.Clips.ContainsKey(v + "_" + p), h.art + " " + v + "_" + p); 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_" }; string[] delivered = { "hgj_", "dz_", "cc_" };
foreach (var s in cfg.stages) foreach (var s in cfg.stages)
foreach (var e in s.enemies) foreach (var e in s.enemies)
{ {
bool general = e.art.Contains("_boss_");
bool want = false; bool want = false;
foreach (var f in delivered) want |= e.art.StartsWith(f); 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; if (!want) continue;
var a = UnitArt.Load(e.art); var a = UnitArt.Load(e.art);
Assert.IsNotNull(a, "적 원화 " + e.art); Assert.IsNotNull(a, "적 원화 " + e.art);
@ -1010,17 +1010,20 @@ namespace TKS.Tests
Assert.AreEqual(row.title, s.title, at); Assert.AreEqual(row.title, s.title, at);
Assert.AreEqual(row.SoldierCount + row.generals.Count, s.enemies.Count, at + " 적 수 = 병사 + 무장"); Assert.AreEqual(row.SoldierCount + row.generals.Count, s.enemies.Count, at + " 적 수 = 병사 + 무장");
var counts = new int[UnitTypeInfo.Count]; var counts = new int[UnitTypeInfo.Count];
int bosses = 0; int bosses = 0, generals = 0;
foreach (var e in s.enemies) 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++; if (e.isBoss) bosses++;
Assert.IsTrue(!e.isBoss || e.isGeneral, at + " 보스는 무장");
Assert.IsFalse(string.IsNullOrEmpty(e.art), at + " 아트 id"); Assert.IsFalse(string.IsNullOrEmpty(e.art), at + " 아트 id");
float r = c.GetStats(e.type).radius * (e.isBoss ? c.bossRadiusMult : 1f); 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.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 + " 아군 출발선보다 앞(적 쪽)"); 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) + " 수"); 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 + " 보스 수"); Assert.AreEqual(row.generals.FindAll(g => g.boss).Count, bosses, at + " 보스 수");
for (int a = 0; a < s.enemies.Count; a++) for (int a = 0; a < s.enemies.Count; a++)
for (int b = a + 1; b < s.enemies.Count; b++) for (int b = a + 1; b < s.enemies.Count; b++)