|
|
@@ -93,6 +93,11 @@
|
|
|
.parts-box{background:#160f29;border:1px solid var(--line);border-radius:10px;padding:12px}
|
|
|
.parts-box img{width:100%;max-height:520px;object-fit:contain;
|
|
|
background:repeating-conic-gradient(#241a3d 0 25%, #2c2150 0 50%) 0/22px 22px;border-radius:8px}
|
|
|
+ .parts-list{grid-column:1/-1;display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px}
|
|
|
+ .part-card{background:#160f29;border:1px solid var(--line);border-radius:9px;padding:8px;min-width:0}
|
|
|
+ .part-card img{width:100%;height:92px;object-fit:contain;background:
|
|
|
+ repeating-conic-gradient(#241a3d 0 25%, #2c2150 0 50%) 0/18px 18px;border-radius:7px}
|
|
|
+ .part-card .meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:5px}
|
|
|
code{background:#160f29;padding:1px 6px;border-radius:5px;font-size:12px}
|
|
|
a{color:var(--accent2)}
|
|
|
@media(max-width:760px){.parts-grid{grid-template-columns:1fr}}
|
|
|
@@ -258,6 +263,11 @@
|
|
|
<div class="name">拆件图 / Atlas</div>
|
|
|
<img id="partsAtlas" alt="拆件图">
|
|
|
</div>
|
|
|
+ <div class="parts-box" style="grid-column:1/-1">
|
|
|
+ <div class="name">单独拆件 PNG</div>
|
|
|
+ <div class="meta" id="partsCount"></div>
|
|
|
+ <div class="parts-list" id="partsList"></div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -283,6 +293,11 @@ function openPartsModal(c, t){
|
|
|
$('#partsTitle').textContent = `${t.chineseName} · 拆件检查`;
|
|
|
$('#partsPreview').src = assetUrl(c.preview || c.png);
|
|
|
$('#partsAtlas').src = assetUrl(c.png);
|
|
|
+ const parts = c.parts || [];
|
|
|
+ $('#partsCount').textContent = parts.length ? `已拆出 ${parts.length} 个单独 PNG,可逐个检查。` : '没有单独拆件 PNG;请重新生成该关主。';
|
|
|
+ $('#partsList').innerHTML = parts.length
|
|
|
+ ? parts.map(p=>`<div class="part-card"><img src="${assetUrl(p.file)}" alt="${esc(p.id)}"><div class="meta">${esc(p.id)} · ${esc(p.w||'?')}×${esc(p.h||'?')}</div></div>`).join('')
|
|
|
+ : '<div class="empty">缺少单独拆件文件。</div>';
|
|
|
$('#partsModal').classList.add('open');
|
|
|
}
|
|
|
function syncRunningWithLibrary(){
|
|
|
@@ -372,13 +387,14 @@ function renderChars(v){
|
|
|
const anims=Object.keys(animMap);
|
|
|
const displayImg = c.preview || c.png;
|
|
|
const isParts = c.type==='spine_parts' || t.assetType==='spine_parts';
|
|
|
+ const partCount = (c.parts || []).length;
|
|
|
const card=document.createElement('div'); card.className='card '+(done?'':'missing')+(running?' running':'');
|
|
|
card.innerHTML=`
|
|
|
<div class="stage ${done&&isParts?'clickable':''}">${done?`<img src="${assetUrl(displayImg)}" alt="${esc(t.id)}">`:`<div class="placeholder">${running?'生成中…':'待生成'}<br>${esc(t.chineseName)}</div>`}</div>
|
|
|
<div class="task-head"><div><div class="name">${esc(t.chineseName)}</div><div class="meta">${esc(t.englishName)}</div></div>
|
|
|
<span class="task-status ${done?'done':(running?'running':'missing')}">${done?'已生成':(running?'生成中':'缺失')}</span></div>
|
|
|
${done&&anims.length?`<div class="row"><select>${anims.map(a=>`<option>${esc(a)}</option>`).join('')}</select></div>`:''}
|
|
|
- <div class="meta"><span class="pill">${esc(t.assetType||'spine')}</span> ${esc(t.use)}<br>
|
|
|
+ <div class="meta"><span class="pill">${esc(t.assetType||'spine')}</span> ${isParts?`<span class="pill">拆件 ${partCount}</span> `:''}${esc(t.use)}<br>
|
|
|
动作: ${esc((done?anims:t.animations||[]).join(', ')||'idle')}</div>
|
|
|
${done&&isParts?'<button class="ghost parts-btn">查看拆件图</button>':''}
|
|
|
<div class="task-prompt">${esc(t.prompt||'')}</div>
|