装备系统 #34

Merged
Ghost merged 1 commits from why_ga into main 2026-09-10 15:05:20 +08:00
18 changed files with 42 additions and 49 deletions
Showing only changes of commit 0a57b9fe99 - Show all commits
+8 -8
View File
@@ -47,7 +47,7 @@
<record id="equip_iron_armor" model="yt.world.equip.item">
<field name="code">iron_armor</field>
<field name="name">铁鳞甲</field>
<field name="icon">🛡️</field>
<field name="icon">assets/icons/equips/iron_armor.png</field>
<field name="slot">armor</field>
<field name="rarity">rare</field>
<field name="stats">{"defense": 6, "hp_max": 15}</field>
@@ -57,7 +57,7 @@
<record id="equip_dragon_scale" model="yt.world.equip.item">
<field name="code">dragon_scale</field>
<field name="name">龙鳞甲</field>
<field name="icon">🐉</field>
<field name="icon">assets/icons/equips/dragon_scale.png</field>
<field name="slot">armor</field>
<field name="rarity">legendary</field>
<field name="stats">{"defense": 12, "hp_max": 30, "energy_max": 10}</field>
@@ -68,7 +68,7 @@
<record id="equip_straw_sandals" model="yt.world.equip.item">
<field name="code">straw_sandals</field>
<field name="name">草鞋</field>
<field name="icon">🩴</field>
<field name="icon">assets/icons/equips/straw_sandals.png</field>
<field name="slot">boots</field>
<field name="rarity">common</field>
<field name="stats">{"speed": 1}</field>
@@ -78,7 +78,7 @@
<record id="equip_leather_boots" model="yt.world.equip.item">
<field name="code">leather_boots</field>
<field name="name">皮靴</field>
<field name="icon">🥾</field>
<field name="icon">assets/icons/equips/leather_boots.png</field>
<field name="slot">boots</field>
<field name="rarity">rare</field>
<field name="stats">{"speed": 3, "defense": 1}</field>
@@ -88,7 +88,7 @@
<record id="equip_wind_boots" model="yt.world.equip.item">
<field name="code">wind_boots</field>
<field name="name">疾风靴</field>
<field name="icon">👟</field>
<field name="icon">assets/icons/equips/wind_boots.png</field>
<field name="slot">boots</field>
<field name="rarity">epic</field>
<field name="stats">{"speed": 6, "energy_max": 10}</field>
@@ -99,7 +99,7 @@
<record id="equip_lucky_charm" model="yt.world.equip.item">
<field name="code">lucky_charm</field>
<field name="name">幸运符</field>
<field name="icon">🍀</field>
<field name="icon">assets/icons/equips/lucky_charm.png</field>
<field name="slot">accessory</field>
<field name="rarity">common</field>
<field name="stats">{"speed": 3}</field>
@@ -109,7 +109,7 @@
<record id="equip_power_ring" model="yt.world.equip.item">
<field name="code">power_ring</field>
<field name="name">力量戒指</field>
<field name="icon">💍</field>
<field name="icon">assets/icons/equips/power_ring.png</field>
<field name="slot">accessory</field>
<field name="rarity">rare</field>
<field name="stats">{"attack": 4, "defense": 2}</field>
@@ -119,7 +119,7 @@
<record id="equip_amulet_life" model="yt.world.equip.item">
<field name="code">amulet_life</field>
<field name="name">生命护符</field>
<field name="icon">📿</field>
<field name="icon">assets/icons/equips/amulet_life.png</field>
<field name="slot">accessory</field>
<field name="rarity">epic</field>
<field name="stats">{"hp_max": 25, "energy_max": 15}</field>
Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

+34 -41
View File
@@ -206,22 +206,20 @@ body { background: #0a0e17; overflow: hidden; font-family: 'Microsoft YaHei', sa
#topBar .ua-sep{display:none;}
#topBar .ua-soon{font-size:10px;color:#778;background:rgba(255,255,255,.06);padding:1px 6px;border-radius:8px;}
/* 场景悬浮工具条:浮于场景画面、紧贴顶部栏下方
布局策略:单列 64px 优先,行数限制决定列数(满 N 行后 Grid 自动开下一列)
关键:grid-auto-flow: column + grid-auto-columns = grid-template-columns;
否则 Grid 默认按行填充,超出后只会"创建隐式行继续在第 1 列堆"而不是开第 2 列 */
/* 场景悬浮工具条:顶部栏下方居中、按钮横向排列
折叠态:一行 4 个核心按钮;展开态:两行 7 列共 14 个按钮 */
#sceneToolbar{
position:fixed; top:calc(58px + env(safe-area-inset-top) + 12px); right:max(18px, env(safe-area-inset-right)); z-index:90;
display:grid; grid-template-columns:64px; grid-auto-columns:64px;
grid-template-rows:repeat(7,72px); grid-auto-rows:72px;
grid-auto-flow:column; gap:10px; pointer-events:auto;
position:fixed; top:calc(58px + env(safe-area-inset-top) + 8px); right:max(18px, env(safe-area-inset-right)); left:auto; transform:none; z-index:110;
display:grid; grid-template-columns:repeat(7,64px);
grid-template-rows:repeat(2,72px); grid-auto-rows:72px;
grid-auto-flow:row; gap:10px; pointer-events:auto;
padding:11px; border-radius:16px;
background:rgba(12,18,32,.78); border:1px solid rgba(139,92,246,.35);
backdrop-filter:blur(10px); box-shadow:0 8px 28px rgba(0,0,0,.42), inset 0 1px 0 rgba(255,255,255,.06);
transition:padding .2s, border-radius .2s;
transition:all .25s ease;
}
/* 折叠态:单列 4 行(4 个按钮:汉堡键 + 任务/设置/排行榜正好填满) */
#sceneToolbar.collapsed{ grid-template-rows:repeat(4,72px); }
/* 折叠态:一行 4 列(汉堡键 + 任务/设置/排行榜) */
#sceneToolbar.collapsed{ grid-template-columns:repeat(4,64px); grid-template-rows:72px; }
#sceneToolbar.collapsed .top-icon:not(.toolbar-core):not(#btnToolbarToggle){ display:none; }
.top-icon{
position:relative; width:64px; height:64px; border-radius:13px; flex-shrink:0;
@@ -941,8 +939,8 @@ body { background: #0a0e17; overflow: hidden; font-family: 'Microsoft YaHei', sa
background: linear-gradient(180deg, #1d2540 0%, #161d30 55%, #131a2b 100%);
border: 1px solid rgba(139,92,246,.35); border-radius: 14px;
box-shadow: 0 14px 44px rgba(0,0,0,.55), 0 0 0 1px rgba(139,92,246,.12), inset 0 1px 0 rgba(255,255,255,.06);
padding: 16px 18px; max-width: 480px; width: 94%; pointer-events: auto;
max-height: 90vh; overflow-y: auto;
padding: 16px 18px; max-width: 860px; width: 92%; pointer-events: auto;
max-height: 82vh; overflow-y: auto;
}
/* 头部:标题 + 右上角关闭(MMO 风格) */
#unitModal .umHead { display:flex; align-items:center; justify-content:space-between; margin-bottom:12px;
@@ -953,36 +951,36 @@ body { background: #0a0e17; overflow: hidden; font-family: 'Microsoft YaHei', sa
display:flex;align-items:center;justify-content:center; transition:background .15s,color .15s; }
#unitModal .umClose:hover { background:rgba(255,80,80,.28); color:#fff; }
/* 主体两栏:左侧立绘+环绕装备槽,右侧数值 */
#unitModal .umGrid { display:grid; grid-template-columns: 200px 1fr; gap:14px; }
#unitModal .umLeft { position:relative; border-radius:12px; padding:14px 10px 90px;
#unitModal .umGrid { display:grid; grid-template-columns: 260px 1fr; gap:18px; }
#unitModal .umLeft { position:relative; border-radius:12px; padding:18px 12px 110px;
display:flex; flex-direction:column; align-items:center;
background: radial-gradient(ellipse at 50% 26%, rgba(139,92,246,.14), rgba(255,255,255,.03) 62%);
border: 1px solid rgba(139,92,246,.28);
box-shadow: inset 0 0 28px rgba(139,92,246,.10); }
#unitModal .umPortraitWrap { position:relative; width:160px; height:180px; margin:8px 0 2px; }
#unitModal .umPortraitWrap { position:relative; width:220px; height:250px; margin:10px 0 4px; }
#unitModal .umPortrait { width:100%; height:100%; display:flex; align-items:flex-end; justify-content:center; }
#unitModal .umPortrait canvas { width:100%; height:100%; display:block; }
#unitModal .umPortraitFallback { font-size:72px; line-height:180px; text-align:center; }
#unitModal .umEq { position:absolute; width:46px; height:46px; border-radius:9px;
#unitModal .umPortraitFallback { font-size:90px; line-height:250px; text-align:center; }
#unitModal .umEq { position:absolute; width:54px; height:54px; border-radius:11px;
background:rgba(8,14,26,.78); border:1px solid rgba(120,200,255,.3);
display:flex; align-items:center; justify-content:center;
cursor:pointer; z-index:2; transition:border-color .15s, background .15s, box-shadow .15s; }
#unitModal .umEq:hover { border-color:rgba(139,92,246,.75); background:rgba(139,92,246,.2); box-shadow:0 0 10px rgba(139,92,246,.35); }
#unitModal .umEq .umEqIcon { font-size:19px; line-height:1; display:flex; align-items:center; justify-content:center; }
#unitModal .umEq .umEqIcon img { width:28px; height:28px; object-fit:contain; filter:drop-shadow(0 1px 1px rgba(0,0,0,.5)); }
#unitModal .umEq .umEqIcon { font-size:22px; line-height:1; display:flex; align-items:center; justify-content:center; }
#unitModal .umEq .umEqIcon img { width:34px; height:34px; object-fit:contain; filter:drop-shadow(0 1px 1px rgba(0,0,0,.5)); }
/* 装备名称统一放在框正下方 */
#unitModal .umEq .umEqName {
position:absolute; top:100%; left:50%; transform:translateX(-50%);
margin-top:3px; font-size:9px; color:#a8b8cc; white-space:nowrap;
margin-top:3px; font-size:10px; color:#a8b8cc; white-space:nowrap;
text-shadow:0 1px 2px rgba(0,0,0,.7); pointer-events:none;
}
#unitModal .umEq.accessory { top:-10px; left:50%; transform:translateX(-50%); }
#unitModal .umEq.weapon { left:-12px; top:50%; transform:translateY(-50%); }
#unitModal .umEq.armor { right:-12px; top:50%; transform:translateY(-50%); }
#unitModal .umEq.boots { bottom:-24px; left:50%; transform:translateX(-50%); }
#unitModal .umEq.accessory { top:-12px; left:50%; transform:translateX(-50%); }
#unitModal .umEq.weapon { left:-16px; top:50%; transform:translateY(-50%); }
#unitModal .umEq.armor { right:-16px; top:50%; transform:translateY(-50%); }
#unitModal .umEq.boots { bottom:-28px; left:50%; transform:translateX(-50%); }
#unitModal .umEquipPicker {
margin-top:92px; width:100%;
max-height: 220px;
margin-top:120px; width:100%;
max-height: 260px;
overflow-y: auto;
background: rgba(8,14,26,0.96);
border: 1px solid rgba(139,92,246,0.32);
@@ -995,13 +993,14 @@ body { background: #0a0e17; overflow: hidden; font-family: 'Microsoft YaHei', sa
#unitModal .umEquipPicker::-webkit-scrollbar { width: 4px; }
#unitModal .umEquipPicker::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.45); border-radius: 3px; }
#unitModal .umRight { min-width:0; }
#unitModal .umStatGrid { display:grid; grid-template-columns:1fr 1fr; gap:2px 14px; margin-bottom:8px; }
#unitModal .umStatGrid { display:grid; grid-template-columns:1fr 1fr; gap:4px 18px; margin-bottom:10px; }
#unitModal .umStatGrid .statBar { display:none; }
#unitModal .modalTitle { font-size: 16px; font-weight: bold; color: #e0e0e0; margin-bottom: 16px; }
#unitModal .statRow { display: flex; justify-content: space-between; align-items: center; margin: 6px 0; font-size: 12px; }
#unitModal .umHead { margin-bottom:14px; padding-bottom:12px; }
#unitModal .modalTitle { font-size: 18px; font-weight: bold; color: #e0e0e0; margin-bottom: 16px; }
#unitModal .statRow { display: flex; justify-content: space-between; align-items: center; margin: 8px 0; font-size: 13px; }
#unitModal .statLabel { color: #8899aa; }
#unitModal .statValue { color: #e0e0e0; }
#unitModal .statBar { flex: 1; height: 8px; background: rgba(255,255,255,0.08); border-radius: 4px; margin: 0 8px; overflow: hidden; }
#unitModal .statBar { flex: 1; height: 9px; background: rgba(255,255,255,0.08); border-radius: 4px; margin: 0 8px; overflow: hidden; }
#unitModal .statFill { height: 100%; border-radius: 4px; }
#unitModal .cmdBtn {
display: block; width: 100%; margin-top: 8px; padding: 8px;
@@ -1245,8 +1244,8 @@ body { background: #0a0e17; overflow: hidden; font-family: 'Microsoft YaHei', sa
#navControls{bottom:calc(96px + env(safe-area-inset-bottom));right:14px;
grid-template-columns:repeat(3,60px);grid-template-rows:repeat(3,60px);gap:6px;}
#navControls button{width:60px;height:60px;font-size:24px;border-radius:15px;}
#sceneToolbar{right:12px;gap:7px;padding:9px 10px;grid-template-columns:52px;grid-auto-columns:52px;grid-template-rows:repeat(7,58px);grid-auto-rows:58px;grid-auto-flow:column;}
#sceneToolbar.collapsed{grid-template-rows:repeat(4,58px);}
#sceneToolbar{right:12px;left:auto;transform:none;gap:7px;padding:9px 10px;grid-template-columns:repeat(7,52px);grid-template-rows:repeat(2,58px);grid-auto-rows:58px;grid-auto-flow:row;}
#sceneToolbar.collapsed{grid-template-columns:repeat(4,52px);grid-template-rows:58px;}
#sceneToolbar .top-icon{width:52px;height:52px;font-size:17px;}
#sceneToolbar .top-icon img,
#sceneToolbar .top-icon svg{width:22px;height:22px;}
@@ -1262,8 +1261,8 @@ body { background: #0a0e17; overflow: hidden; font-family: 'Microsoft YaHei', sa
#bottomBar .bb-btn{padding:7px 9px;font-size:11px;}
#worldExpBarWrap{width:280px;gap:5px;}
#worldExpBarWrap .we-title{display:none;}
#sceneToolbar{right:8px;gap:5px;padding:7px 8px;top:calc(58px + env(safe-area-inset-top) + 6px);grid-template-columns:46px;grid-auto-columns:46px;grid-template-rows:repeat(7,52px);grid-auto-rows:52px;grid-auto-flow:column;}
#sceneToolbar.collapsed{grid-template-rows:repeat(4,52px);}
#sceneToolbar{right:8px;left:auto;transform:none;gap:5px;padding:7px 8px;top:calc(58px + env(safe-area-inset-top) + 6px);grid-template-columns:repeat(7,46px);grid-template-rows:repeat(2,52px);grid-auto-rows:52px;grid-auto-flow:row;}
#sceneToolbar.collapsed{grid-template-columns:repeat(4,46px);grid-template-rows:52px;}
#sceneToolbar .top-icon{width:46px;height:46px;font-size:15px;}
#sceneToolbar .top-icon img,
#sceneToolbar .top-icon svg{width:20px;height:20px;}
@@ -5755,12 +5754,6 @@ async function showUnitModal(unitId) {
<div class="statRow"><span class="statLabel">经验</span><div class="statBar"><div class="statFill" style="width:${expPct}%;background:#64b5f6;"></div></div><span class="statValue">${unit.exp||0}/${unit.exp_max||100}</span></div>
</div>
</div>
<div style="margin-top:12px;"><div class="panel-label">操作指令</div>
<div class="cmdGrid" ${cmdDisabled}>
<div class="cmdBtn" onclick="microUnitTrain('${unitId}')">⬆️ 训练升级</div>
<div class="cmdBtn" onclick="microUnitRest('${unitId}')">😴 令其休息</div>
</div>
</div>
`;
window._umUnit = unit;
if (sprite) _drawRacePortrait(sprite, document.getElementById('umPortraitCv'));