diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/blackmarket/blackmarket_l.png b/addons/game_asset_backup/data/game_assets/buildings/spring/blackmarket/blackmarket_l.png index 36d403a..bfbb712 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/blackmarket/blackmarket_l.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/blackmarket/blackmarket_l.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/blackmarket/blackmarket_r.png b/addons/game_asset_backup/data/game_assets/buildings/spring/blackmarket/blackmarket_r.png index e675667..7b1fde9 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/blackmarket/blackmarket_r.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/blackmarket/blackmarket_r.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/blacksmith/blacksmith_l.png b/addons/game_asset_backup/data/game_assets/buildings/spring/blacksmith/blacksmith_l.png index 4966fd8..9112c4a 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/blacksmith/blacksmith_l.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/blacksmith/blacksmith_l.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/blacksmith/blacksmith_r.png b/addons/game_asset_backup/data/game_assets/buildings/spring/blacksmith/blacksmith_r.png index 0138ff6..df82e57 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/blacksmith/blacksmith_r.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/blacksmith/blacksmith_r.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/clinic/clinic_l.png b/addons/game_asset_backup/data/game_assets/buildings/spring/clinic/clinic_l.png index cb310fc..9c12e71 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/clinic/clinic_l.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/clinic/clinic_l.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/clinic/clinic_r.png b/addons/game_asset_backup/data/game_assets/buildings/spring/clinic/clinic_r.png index 02c5dc8..9af64e3 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/clinic/clinic_r.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/clinic/clinic_r.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/cottage/cottage_l.png b/addons/game_asset_backup/data/game_assets/buildings/spring/cottage/cottage_l.png index 06dd3c2..8d1d944 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/cottage/cottage_l.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/cottage/cottage_l.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/cottage/cottage_r.png b/addons/game_asset_backup/data/game_assets/buildings/spring/cottage/cottage_r.png index f1a974f..3ae8e1e 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/cottage/cottage_r.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/cottage/cottage_r.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/grocery/grocery_l.png b/addons/game_asset_backup/data/game_assets/buildings/spring/grocery/grocery_l.png index f81f357..c192db4 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/grocery/grocery_l.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/grocery/grocery_l.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/grocery/grocery_r.png b/addons/game_asset_backup/data/game_assets/buildings/spring/grocery/grocery_r.png index a9ee0a3..cfb761e 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/grocery/grocery_r.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/grocery/grocery_r.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/pasture/pasture_l.png b/addons/game_asset_backup/data/game_assets/buildings/spring/pasture/pasture_l.png index d4d6d1f..1babe0c 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/pasture/pasture_l.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/pasture/pasture_l.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/pasture/pasture_r.png b/addons/game_asset_backup/data/game_assets/buildings/spring/pasture/pasture_r.png index 4ae53be..34cd3b5 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/pasture/pasture_r.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/pasture/pasture_r.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/restaurant/restaurant_l.png b/addons/game_asset_backup/data/game_assets/buildings/spring/restaurant/restaurant_l.png index 3683881..ccd6a3d 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/restaurant/restaurant_l.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/restaurant/restaurant_l.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/restaurant/restaurant_r.png b/addons/game_asset_backup/data/game_assets/buildings/spring/restaurant/restaurant_r.png index c228ac1..97cb6f6 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/restaurant/restaurant_r.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/restaurant/restaurant_r.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/temple/temple_l.png b/addons/game_asset_backup/data/game_assets/buildings/spring/temple/temple_l.png index 6a7c6aa..ae5470d 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/temple/temple_l.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/temple/temple_l.png differ diff --git a/addons/game_asset_backup/data/game_assets/buildings/spring/temple/temple_r.png b/addons/game_asset_backup/data/game_assets/buildings/spring/temple/temple_r.png index 52b6094..d83dacd 100644 Binary files a/addons/game_asset_backup/data/game_assets/buildings/spring/temple/temple_r.png and b/addons/game_asset_backup/data/game_assets/buildings/spring/temple/temple_r.png differ diff --git a/assets/buildings/spring/barracks/barracks_l.png b/assets/buildings/spring/barracks/barracks_l.png index 0dcb5ee..37cc879 100644 Binary files a/assets/buildings/spring/barracks/barracks_l.png and b/assets/buildings/spring/barracks/barracks_l.png differ diff --git a/assets/buildings/spring/barracks/barracks_r.png b/assets/buildings/spring/barracks/barracks_r.png index 3eb8b8d..15b7675 100644 Binary files a/assets/buildings/spring/barracks/barracks_r.png and b/assets/buildings/spring/barracks/barracks_r.png differ diff --git a/assets/buildings/spring/blackmarket/blackmarket_l.png b/assets/buildings/spring/blackmarket/blackmarket_l.png index d5b3615..bfbb712 100644 Binary files a/assets/buildings/spring/blackmarket/blackmarket_l.png and b/assets/buildings/spring/blackmarket/blackmarket_l.png differ diff --git a/assets/buildings/spring/blackmarket/blackmarket_r.png b/assets/buildings/spring/blackmarket/blackmarket_r.png index a6e161f..7b1fde9 100644 Binary files a/assets/buildings/spring/blackmarket/blackmarket_r.png and b/assets/buildings/spring/blackmarket/blackmarket_r.png differ diff --git a/assets/buildings/spring/blacksmith/blacksmith_l.png b/assets/buildings/spring/blacksmith/blacksmith_l.png index 4966fd8..9112c4a 100644 Binary files a/assets/buildings/spring/blacksmith/blacksmith_l.png and b/assets/buildings/spring/blacksmith/blacksmith_l.png differ diff --git a/assets/buildings/spring/blacksmith/blacksmith_r.png b/assets/buildings/spring/blacksmith/blacksmith_r.png index 0138ff6..df82e57 100644 Binary files a/assets/buildings/spring/blacksmith/blacksmith_r.png and b/assets/buildings/spring/blacksmith/blacksmith_r.png differ diff --git a/assets/buildings/spring/clinic/clinic_l.png b/assets/buildings/spring/clinic/clinic_l.png index cb310fc..9c12e71 100644 Binary files a/assets/buildings/spring/clinic/clinic_l.png and b/assets/buildings/spring/clinic/clinic_l.png differ diff --git a/assets/buildings/spring/clinic/clinic_r.png b/assets/buildings/spring/clinic/clinic_r.png index 02c5dc8..9af64e3 100644 Binary files a/assets/buildings/spring/clinic/clinic_r.png and b/assets/buildings/spring/clinic/clinic_r.png differ diff --git a/assets/buildings/spring/cottage/cottage_l.png b/assets/buildings/spring/cottage/cottage_l.png index 06dd3c2..8d1d944 100644 Binary files a/assets/buildings/spring/cottage/cottage_l.png and b/assets/buildings/spring/cottage/cottage_l.png differ diff --git a/assets/buildings/spring/cottage/cottage_r.png b/assets/buildings/spring/cottage/cottage_r.png index f1a974f..3ae8e1e 100644 Binary files a/assets/buildings/spring/cottage/cottage_r.png and b/assets/buildings/spring/cottage/cottage_r.png differ diff --git a/assets/buildings/spring/grocery/grocery_l.png b/assets/buildings/spring/grocery/grocery_l.png index f81f357..c192db4 100644 Binary files a/assets/buildings/spring/grocery/grocery_l.png and b/assets/buildings/spring/grocery/grocery_l.png differ diff --git a/assets/buildings/spring/grocery/grocery_r.png b/assets/buildings/spring/grocery/grocery_r.png index a9ee0a3..cfb761e 100644 Binary files a/assets/buildings/spring/grocery/grocery_r.png and b/assets/buildings/spring/grocery/grocery_r.png differ diff --git a/assets/buildings/spring/guild/guild_l.png b/assets/buildings/spring/guild/guild_l.png index ef16076..03880db 100644 Binary files a/assets/buildings/spring/guild/guild_l.png and b/assets/buildings/spring/guild/guild_l.png differ diff --git a/assets/buildings/spring/guild/guild_r.png b/assets/buildings/spring/guild/guild_r.png index 44bc117..ef7c67c 100644 Binary files a/assets/buildings/spring/guild/guild_r.png and b/assets/buildings/spring/guild/guild_r.png differ diff --git a/assets/buildings/spring/library/library_l.png b/assets/buildings/spring/library/library_l.png index 2d60ae8..1f20ecc 100644 Binary files a/assets/buildings/spring/library/library_l.png and b/assets/buildings/spring/library/library_l.png differ diff --git a/assets/buildings/spring/library/library_r.png b/assets/buildings/spring/library/library_r.png index 0df047e..03cfd16 100644 Binary files a/assets/buildings/spring/library/library_r.png and b/assets/buildings/spring/library/library_r.png differ diff --git a/assets/buildings/spring/pasture/pasture_l.png b/assets/buildings/spring/pasture/pasture_l.png index d4d6d1f..1babe0c 100644 Binary files a/assets/buildings/spring/pasture/pasture_l.png and b/assets/buildings/spring/pasture/pasture_l.png differ diff --git a/assets/buildings/spring/pasture/pasture_r.png b/assets/buildings/spring/pasture/pasture_r.png index 4ae53be..34cd3b5 100644 Binary files a/assets/buildings/spring/pasture/pasture_r.png and b/assets/buildings/spring/pasture/pasture_r.png differ diff --git a/assets/buildings/spring/restaurant/restaurant_l.png b/assets/buildings/spring/restaurant/restaurant_l.png index 3683881..ccd6a3d 100644 Binary files a/assets/buildings/spring/restaurant/restaurant_l.png and b/assets/buildings/spring/restaurant/restaurant_l.png differ diff --git a/assets/buildings/spring/restaurant/restaurant_r.png b/assets/buildings/spring/restaurant/restaurant_r.png index c228ac1..97cb6f6 100644 Binary files a/assets/buildings/spring/restaurant/restaurant_r.png and b/assets/buildings/spring/restaurant/restaurant_r.png differ diff --git a/assets/buildings/spring/school/school_l.png b/assets/buildings/spring/school/school_l.png index 4867e98..e5482b0 100644 Binary files a/assets/buildings/spring/school/school_l.png and b/assets/buildings/spring/school/school_l.png differ diff --git a/assets/buildings/spring/school/school_r.png b/assets/buildings/spring/school/school_r.png index 1425b69..836d033 100644 Binary files a/assets/buildings/spring/school/school_r.png and b/assets/buildings/spring/school/school_r.png differ diff --git a/assets/buildings/spring/temple/temple_l.png b/assets/buildings/spring/temple/temple_l.png index 6a7c6aa..ae5470d 100644 Binary files a/assets/buildings/spring/temple/temple_l.png and b/assets/buildings/spring/temple/temple_l.png differ diff --git a/assets/buildings/spring/temple/temple_r.png b/assets/buildings/spring/temple/temple_r.png index 52b6094..d83dacd 100644 Binary files a/assets/buildings/spring/temple/temple_r.png and b/assets/buildings/spring/temple/temple_r.png differ diff --git a/assets/buildings/spring/village/village_l.png b/assets/buildings/spring/village/village_l.png index 38ff082..4b48f11 100644 Binary files a/assets/buildings/spring/village/village_l.png and b/assets/buildings/spring/village/village_l.png differ diff --git a/assets/buildings/spring/village/village_r.png b/assets/buildings/spring/village/village_r.png index 65d9d86..e3f06c5 100644 Binary files a/assets/buildings/spring/village/village_r.png and b/assets/buildings/spring/village/village_r.png differ diff --git a/assets/characters.js b/assets/characters.js index 35e16fd..86dfe7f 100644 --- a/assets/characters.js +++ b/assets/characters.js @@ -7,14 +7,19 @@ const RACE_CONFIG = { demon: { name: '妖族', speed: 90, attack: 5, hpMax: 50, regen: false, trait: '均衡型。无特殊被动,与人类齐平的基础战力。', walk: 'assets/characters/demon/demon_walk_1x6.png', idle_attack: 'assets/characters/demon/demon_idle_attack_1x6.png', work_comm: 'assets/characters/demon/demon_work_comm_1x6.png' }, dwarf: { name: '矮人', speed: 72, attack: 5, hpMax: 50, regen: false, enrage: true, shieldRatio: 0.10, trait: '铁壁·狂暴:移速较慢(0.8倍);每损失10%生命攻击+5%;生命≤30%时获得10%最大生命护盾。', walk: 'assets/characters/dwarf/dwarf_walk_1x6.png', idle_attack: 'assets/characters/dwarf/dwarf_idle_attack_1x6.png', work_comm: 'assets/characters/dwarf/dwarf_work_comm_1x6.png' }, elf: { name: '精灵', speed: 135, attack: 5, hpMax: 50, regen: false, trait: '疾风:移速飞快(1.5倍),机动性最强的种族。', walk: 'assets/characters/elf/elf_walk_1x6.png', idle_attack: 'assets/characters/elf/elf_idle_attack_1x6.png', work_comm: 'assets/characters/elf/elf_work_comm_1x6.png' }, - dragon: { name: '龙族', speed: 90, attack: 8, hpMax: 50, regen: false, trait: '龙威:攻击力高(8),爆发型输出种族。', walk: 'assets/characters/dragon/dragon_walk_1x6.png', idle_attack: 'assets/characters/dragon/dragon_idle_attack_1x6.png', work_comm: 'assets/characters/dragon/dragon_work_comm_1x6.png' }, + dragon: { name: '龙族', speed: 90, attack: 8, attackRange: 90, hpMax: 50, regen: false, trait: '龙威:攻击力高(8),攻击范围大(1.5倍),爆发型输出种族。', walk: 'assets/characters/dragon/dragon_walk_1x6.png', idle_attack: 'assets/characters/dragon/dragon_idle_attack_1x6.png', work_comm: 'assets/characters/dragon/dragon_work_comm_1x6.png' }, undead: { name: '不死族', speed: 90, attack: 4, hpMax: 100, regen: true, trait: '不死:生命极高(100);脱战10秒后每秒恢复5%最大生命。', walk: 'assets/characters/undead/undead_walk_1x6.png', idle_attack: 'assets/characters/undead/undead_idle_attack_1x6.png', work_comm: 'assets/characters/undead/undead_work_comm_1x6.png' }, + orc: { name: '兽人', speed: 90, attack: 5, hpMax: 50, regen: false, trait: '均衡型。绿皮獠牙的战士,无特殊被动,基础战力与人类一致。', walk: 'assets/characters/orc/orc_walk_1x6.png', idle_attack: 'assets/characters/orc/orc_idle_attack_1x6.png', work_comm: 'assets/characters/orc/orc_work_comm_1x6.png' }, + angel: { name: '天使', speed: 90, attack: 5, hpMax: 50, regen: false, trait: '均衡型。头顶光环的天界战士,无特殊被动,基础战力与人类一致。', walk: 'assets/characters/angel/angel_walk_1x6.png', idle_attack: 'assets/characters/angel/angel_idle_attack_1x6.png', work_comm: 'assets/characters/angel/angel_work_comm_1x6.png' }, + werewolf:{ name: '狼人', speed: 90, attack: 5, hpMax: 50, regen: false, trait: '均衡型。竖耳狼首的猎手,无特殊被动,基础战力与人类一致。', walk: 'assets/characters/werewolf/werewolf_walk_1x6.png', idle_attack: 'assets/characters/werewolf/werewolf_idle_attack_1x6.png', work_comm: 'assets/characters/werewolf/werewolf_work_comm_1x6.png' }, + golem: { name: '石傀儡', speed: 90, attack: 5, hpMax: 50, regen: false, trait: '均衡型。眼中发光的岩石巨像,无特殊被动,基础战力与人类一致。', walk: 'assets/characters/golem/golem_walk_1x6.png', idle_attack: 'assets/characters/golem/golem_idle_attack_1x6.png', work_comm: 'assets/characters/golem/golem_work_comm_1x6.png' }, }; function raceStats(race) { const rc = RACE_CONFIG[race] || RACE_CONFIG.human; return { - speed: rc.speed, attack: rc.attack, hpMax: rc.hpMax, regen: !!rc.regen, + speed: rc.speed, attack: rc.attack, attackRange: rc.attackRange || CHAR_ATTACK_RANGE, + hpMax: rc.hpMax, regen: !!rc.regen, enrage: !!rc.enrage, shieldRatio: rc.shieldRatio || 0, }; } @@ -219,6 +224,7 @@ async function loadMicroChars() { hp: (typeof c.hp === 'number' && c.hp > 0) ? c.hp : stats.hpMax, hpMax: stats.hpMax, attack: stats.attack, + attackRange: stats.attackRange, regen: stats.regen, enrage: stats.enrage, shieldMax: stats.shieldRatio ? Math.max(1, Math.round(stats.hpMax * stats.shieldRatio)) : 0, @@ -231,6 +237,7 @@ async function loadMicroChars() { wanderT: Math.random() * 3, wanderInterval: 2 + Math.random() * 4, _userMove: false, + freeMove: true, // 自由移动开关(默认开;面板按钮可切换) ...(local ? { frame: local.frame, frameT: local.frameT } : {}), }; }); @@ -254,6 +261,7 @@ function createChar(race, x, y) { hp: stats.hpMax, // 生命值(满血) hpMax: stats.hpMax, // 最大生命(种族差异) attack: stats.attack, // 攻击力(种族差异) + attackRange: stats.attackRange, // 攻击范围(龙族 1.5 倍 = 90px) regen: stats.regen, // 是否有脱战恢复 enrage: stats.enrage, // 是否狂暴(矮人:掉血加攻) shieldMax: stats.shieldRatio ? Math.max(1, Math.round(stats.hpMax * stats.shieldRatio)) : 0, // 护盾上限(矮人 10% 最大生命) @@ -267,6 +275,7 @@ function createChar(race, x, y) { wanderT: Math.random() * 3, // 首次漫游前随机等待 wanderInterval: 2 + Math.random() * 4, // 2~6 秒 _userMove: false, // 是否用户指令移动 + freeMove: charPlaceFreeMove, // 自由移动开关(默认按右侧面板"自由移动"按钮) }; microChars.push(ch); selectChar(id); @@ -321,12 +330,13 @@ function triggerCharAction(charId, action) { function applyAttackDamage(attacker) { const now = Date.now(); const damage = currentAttackOf(attacker); // 攻击力(含矮人狂暴加成) + const range = attacker.attackRange || CHAR_ATTACK_RANGE; // 攻击范围(龙族 1.5 倍 = 90px) const fmt = (v) => (v % 1 === 0 ? String(v) : String(parseFloat(v.toFixed(2)))); // 显示去尾零 const vis = visibleMicroChars(); for (const other of vis) { if (other.id === attacker.id) continue; const d = Math.hypot(other.x - attacker.x, other.y - attacker.y); - if (d <= CHAR_ATTACK_RANGE) { + if (d <= range) { let dmg = damage; // 护盾优先吸收(矮人铁壁) if ((other.shield || 0) > 0 && dmg > 0) { @@ -442,7 +452,8 @@ function updateChars(dt) { ch.targetY = ch.y; } else { // 原有漫游 / 行走逻辑 - if (!ch.selected && ch.state === 'idle') { + // 自由移动开关:ch.freeMove !== false 才允许自主漫游(默认开,可被面板按钮关闭) + if (ch.freeMove !== false && !ch.selected && ch.state === 'idle') { ch.wanderT = (ch.wanderT || 0) + dt; const interval = ch.wanderInterval || (2 + Math.random() * 4); if (ch.wanderT >= interval) { @@ -854,6 +865,9 @@ function updateCharPanel() {
⚔ 攻击 ${fmt(curAtk)}${atkBonus}
📖 ${rc.trait || '暂无介绍'}
${btns}
+
+ +
💡 点击地图移动 · WASD 方向键控制
@@ -862,29 +876,68 @@ function updateCharPanel() { panel.querySelectorAll('.charActBtn').forEach(btn => { btn.addEventListener('click', () => { triggerCharAction(ch.id, btn.dataset.act); updateCharPanel(); }); }); + panel.querySelector('#charFreeMoveBtn').addEventListener('click', () => { + if (ch.freeMove !== false) { + // 停止自由移动:立即打断漫游行走 + 重置计时(freeMove=false 后漫游分支不再进入) + ch.freeMove = false; + ch.wanderT = 0; + if (!ch._userMove && ch.state === 'walk') { + ch.state = 'idle'; + ch.frame = 0; + ch.frameT = 0; + } + } else { + // 开启自由移动:重置计时,取消选中后即可漫游 + ch.freeMove = true; + ch.wanderT = 0; + ch.wanderInterval = 2 + Math.random() * 4; + } + updateCharPanel(); + }); panel.querySelector('#charDelBtn').addEventListener('click', () => deleteChar(ch.id)); } -// ---- 放置面板 ---- +// ---- 放置面板(右侧建筑面板"角色"分类下) ---- +// 新放置角色默认是否自由移动(面板上的自由移动按钮切换此值) +let charPlaceFreeMove = true; function updateCharPlacePanel() { const panel = document.getElementById('charPlacePanel'); if (!panel) return; const races = Object.keys(RACE_CONFIG); + const fmBtnStyle = charPlaceFreeMove + ? 'background:#1d4a2a;color:#7ef0a0;border:1px solid #3a8a5e;' + : 'background:#3a3a4a;color:#aab;border:1px solid #5a5a7a;'; panel.innerHTML = `
放置角色
- ${races.map(r => ``).join('')} + ${races.map(r => { + const active = charPlaceRace === r && charPlaceMode; + const style = active + ? 'background:#2a4a6a;color:#cde;border:1px solid #5a9acc;' + : 'background:#1d2b4a;color:#cde;border:1px solid #3a5a8e;'; + return ``; + }).join('')}
-
- - +
+ +
`; panel.querySelectorAll('.charRaceBtn').forEach(btn => { - btn.addEventListener('click', () => { charPlaceRace = btn.dataset.race; charPlaceMode = true; updateCharPlacePanel(); }); + btn.addEventListener('click', () => { + charPlaceRace = btn.dataset.race; + charPlaceMode = true; // 点击种族直接进入放置模式(简化:无需再点"开始放置") + updateCharPlacePanel(); + }); + }); + panel.querySelector('#charFreeMoveToggle').addEventListener('click', () => { + charPlaceFreeMove = !charPlaceFreeMove; + updateCharPlacePanel(); + }); + panel.querySelector('#charClearAll').addEventListener('click', () => { + clearChars(); + updateCharPlacePanel(); }); - panel.querySelector('#charPlaceToggle').addEventListener('click', () => { charPlaceMode = !charPlaceMode; updateCharPlacePanel(); }); - panel.querySelector('#charClearAll').addEventListener('click', () => { clearChars(); updateCharPlacePanel(); }); } // 导出到 window diff --git a/assets/characters/demon/demon_idle_attack_1x6.png b/assets/characters/demon/demon_idle_attack_1x6.png index a1a24cd..99249ec 100644 Binary files a/assets/characters/demon/demon_idle_attack_1x6.png and b/assets/characters/demon/demon_idle_attack_1x6.png differ diff --git a/assets/characters/demon/demon_walk_1x6.png b/assets/characters/demon/demon_walk_1x6.png index 4bb7373..4cc1ebd 100644 Binary files a/assets/characters/demon/demon_walk_1x6.png and b/assets/characters/demon/demon_walk_1x6.png differ diff --git a/assets/characters/demon/demon_work_comm_1x6.png b/assets/characters/demon/demon_work_comm_1x6.png index 899578b..79d8843 100644 Binary files a/assets/characters/demon/demon_work_comm_1x6.png and b/assets/characters/demon/demon_work_comm_1x6.png differ diff --git a/assets/characters/dragon/dragon_idle_attack_1x6.png b/assets/characters/dragon/dragon_idle_attack_1x6.png index 82bb794..dec3816 100644 Binary files a/assets/characters/dragon/dragon_idle_attack_1x6.png and b/assets/characters/dragon/dragon_idle_attack_1x6.png differ diff --git a/assets/characters/dragon/dragon_walk_1x6.png b/assets/characters/dragon/dragon_walk_1x6.png index 6fc257a..9f4c8cc 100644 Binary files a/assets/characters/dragon/dragon_walk_1x6.png and b/assets/characters/dragon/dragon_walk_1x6.png differ diff --git a/assets/characters/dragon/dragon_work_comm_1x6.png b/assets/characters/dragon/dragon_work_comm_1x6.png index f5cd915..34a8363 100644 Binary files a/assets/characters/dragon/dragon_work_comm_1x6.png and b/assets/characters/dragon/dragon_work_comm_1x6.png differ diff --git a/assets/characters/dwarf/dwarf_idle_attack_1x6.png b/assets/characters/dwarf/dwarf_idle_attack_1x6.png index 9244631..726ad47 100644 Binary files a/assets/characters/dwarf/dwarf_idle_attack_1x6.png and b/assets/characters/dwarf/dwarf_idle_attack_1x6.png differ diff --git a/assets/characters/dwarf/dwarf_walk_1x6.png b/assets/characters/dwarf/dwarf_walk_1x6.png index 4b9e16b..d9864fe 100644 Binary files a/assets/characters/dwarf/dwarf_walk_1x6.png and b/assets/characters/dwarf/dwarf_walk_1x6.png differ diff --git a/assets/characters/dwarf/dwarf_work_comm_1x6.png b/assets/characters/dwarf/dwarf_work_comm_1x6.png index 942d03c..e0068ca 100644 Binary files a/assets/characters/dwarf/dwarf_work_comm_1x6.png and b/assets/characters/dwarf/dwarf_work_comm_1x6.png differ diff --git a/assets/characters/elf/elf_idle_attack_1x6.png b/assets/characters/elf/elf_idle_attack_1x6.png index 5245850..8be0674 100644 Binary files a/assets/characters/elf/elf_idle_attack_1x6.png and b/assets/characters/elf/elf_idle_attack_1x6.png differ diff --git a/assets/characters/elf/elf_walk_1x6.png b/assets/characters/elf/elf_walk_1x6.png index e655a79..037bbec 100644 Binary files a/assets/characters/elf/elf_walk_1x6.png and b/assets/characters/elf/elf_walk_1x6.png differ diff --git a/assets/characters/elf/elf_work_comm_1x6.png b/assets/characters/elf/elf_work_comm_1x6.png index c4da278..e14820e 100644 Binary files a/assets/characters/elf/elf_work_comm_1x6.png and b/assets/characters/elf/elf_work_comm_1x6.png differ diff --git a/assets/characters/human/human_idle_attack_1x6.png b/assets/characters/human/human_idle_attack_1x6.png index aca3d96..b09679d 100644 Binary files a/assets/characters/human/human_idle_attack_1x6.png and b/assets/characters/human/human_idle_attack_1x6.png differ diff --git a/assets/characters/human/human_walk_1x6.png b/assets/characters/human/human_walk_1x6.png index f98927c..5239e23 100644 Binary files a/assets/characters/human/human_walk_1x6.png and b/assets/characters/human/human_walk_1x6.png differ diff --git a/assets/characters/human/human_work_comm_1x6.png b/assets/characters/human/human_work_comm_1x6.png index 532e167..2eaba71 100644 Binary files a/assets/characters/human/human_work_comm_1x6.png and b/assets/characters/human/human_work_comm_1x6.png differ diff --git a/assets/characters/undead/undead_idle_attack_1x6.png b/assets/characters/undead/undead_idle_attack_1x6.png index 274f48a..9531ed9 100644 Binary files a/assets/characters/undead/undead_idle_attack_1x6.png and b/assets/characters/undead/undead_idle_attack_1x6.png differ diff --git a/assets/characters/undead/undead_walk_1x6.png b/assets/characters/undead/undead_walk_1x6.png index cc8e8ee..684d2db 100644 Binary files a/assets/characters/undead/undead_walk_1x6.png and b/assets/characters/undead/undead_walk_1x6.png differ diff --git a/assets/characters/undead/undead_work_comm_1x6.png b/assets/characters/undead/undead_work_comm_1x6.png index c3e9a37..6947805 100644 Binary files a/assets/characters/undead/undead_work_comm_1x6.png and b/assets/characters/undead/undead_work_comm_1x6.png differ diff --git a/world.html b/world.html index 379cce6..3370126 100644 --- a/world.html +++ b/world.html @@ -1749,10 +1749,10 @@ const MICRO_BUILD_ITEMS = [ // 建筑 / 设施 目录(兜底:未登录或 Odoo 未提供时直接用此;登录后由 /yt_world/api/micro/catalog 覆盖)。 // flat=true 表示平面俯视,岛上压成菱形贴地;否则为 3/4 立绘,竖直站立。 const MICRO_BUILD_EXTRA = [ - { id: 'cottage', cat: 'build', icon: 'assets/buildings/spring/cottage/cottage_l.png', name: '农舍', desc: '村民起居的基本居所,提供人口上限与夜间休息。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 120, statYield: { population: 4 } }, - { id: 'windmill', cat: 'build', icon: 'assets/buildings/spring/windmill/windmill_l.png', name: '风车', desc: '利用风力磨粉与提水,提升粮食加工效率。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 110, statYield: { flour: 2 } }, - { id: 'blacksmith', cat: 'build', icon: 'assets/buildings/spring/blacksmith/blacksmith_l.png',name: '铁匠铺', desc: '锻造工具与武器,产出金属制品。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 130, statYield: { metal: 2 } }, - { id: 'grocery', cat: 'build', icon: 'assets/buildings/spring/grocery/grocery_l.png', name: '杂货铺', desc: '交易日用物资的小型商铺,促进经济流通。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 90, statYield: { coin: 2 } }, + { id: 'cottage', cat: 'build', icon: 'assets/buildings/spring/cottage/cottage_l.png?v=2', name: '农舍', desc: '村民起居的基本居所,提供人口上限与夜间休息。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 120, statYield: { population: 4 } }, + { id: 'windmill', cat: 'build', icon: 'assets/buildings/spring/windmill/windmill_l.png?v=2', name: '风车', desc: '利用风力磨粉与提水,提升粮食加工效率。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 110, statYield: { flour: 2 } }, + { id: 'blacksmith', cat: 'build', icon: 'assets/buildings/spring/blacksmith/blacksmith_l.png?v=2',name: '铁匠铺', desc: '锻造工具与武器,产出金属制品。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 130, statYield: { metal: 2 } }, + { id: 'grocery', cat: 'build', icon: 'assets/buildings/spring/grocery/grocery_l.png?v=2', name: '杂货铺', desc: '交易日用物资的小型商铺,促进经济流通。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 90, statYield: { coin: 2 } }, { id: 'temple', cat: 'build', icon: 'assets/buildings/spring/temple/temple_l.png', name: '神庙', desc: '供奉信仰的场所,提升居民精神状态与领地声望。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 160, statYield: { prestige: 3 } }, { id: 'clinic', cat: 'build', icon: 'assets/buildings/spring/clinic/clinic_l.png', name: '医务室', desc: '诊治伤病,恢复居民生命值。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 100, statYield: { heal: 2 } }, { id: 'restaurant', cat: 'build', icon: 'assets/buildings/spring/restaurant/restaurant_l.png',name: '酒馆', desc: '烹制料理,为居民提供饱食与心情加成。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 95, statYield: { satiety: 3 } }, @@ -1764,7 +1764,18 @@ const MICRO_BUILD_EXTRA = [ { id: 'library', cat: 'build', icon: 'assets/buildings/spring/library/library_l.png', name: '图书馆', desc: '收藏典籍与卷轴,提升领地科研与知识产出。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 110, statYield: { research: 4 } }, { id: 'barracks', cat: 'build', icon: 'assets/buildings/spring/barracks/barracks_l.png', name: '兵营', desc: '训练士兵与储备武备的军事建筑,提升领地军事产出。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 130, statYield: { military: 4 } }, { id: 'guild', cat: 'build', icon: 'assets/buildings/spring/guild/guild_l.png', name: '公会', desc: '冒险者与住民集结之所,可发布委托与招募成员。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 140, statYield: { prestige: 2, coin: 1 } }, - { id: 'village', cat: 'build', icon: 'assets/buildings/spring/village/village_l.png', name: '村庄', desc: '族群聚落的核心,提升人口上限与基础产出。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 150, statYield: { population: 6, food: 1 } } + { id: 'village', cat: 'build', icon: 'assets/buildings/spring/village/village_l.png', name: '村庄', desc: '族群聚落的核心,提升人口上限与基础产出。', flat: false, w: 2, h: 2, statLevel: 1, statHp: 150, statYield: { population: 6, food: 1 } }, + // 生物分类:9 种族角色(点击进入"点地面放置"模式,不进入建筑模式) + { id: 'race_human', cat: 'bio', icon: 'assets/characters/human/human_thumb.png', name: '人族', isChar: true, race: 'human' }, + { id: 'race_demon', cat: 'bio', icon: 'assets/characters/demon/demon_thumb.png', name: '妖族', isChar: true, race: 'demon' }, + { id: 'race_dwarf', cat: 'bio', icon: 'assets/characters/dwarf/dwarf_thumb.png', name: '矮人', isChar: true, race: 'dwarf' }, + { id: 'race_elf', cat: 'bio', icon: 'assets/characters/elf/elf_thumb.png', name: '精灵', isChar: true, race: 'elf' }, + { id: 'race_dragon', cat: 'bio', icon: 'assets/characters/dragon/dragon_thumb.png', name: '龙族', isChar: true, race: 'dragon' }, + { id: 'race_undead', cat: 'bio', icon: 'assets/characters/undead/undead_thumb.png', name: '不死族', isChar: true, race: 'undead' }, + { id: 'race_orc', cat: 'bio', icon: 'assets/characters/orc/orc_thumb.png', name: '兽人', isChar: true, race: 'orc' }, + { id: 'race_angel', cat: 'bio', icon: 'assets/characters/angel/angel_thumb.png', name: '天使', isChar: true, race: 'angel' }, + { id: 'race_werewolf',cat: 'bio', icon: 'assets/characters/werewolf/werewolf_thumb.png', name: '狼人', isChar: true, race: 'werewolf' }, + { id: 'race_golem', cat: 'bio', icon: 'assets/characters/golem/golem_thumb.png', name: '石傀儡', isChar: true, race: 'golem' }, ]; // 建筑交互配置(数据驱动,与后端 BUILD_EFFECTS 的 (code,action) 对应)。 @@ -5750,6 +5761,25 @@ function microRenderBuildPanel() { gridEl.querySelectorAll('.mv-cell').forEach(el => { el.addEventListener('click', () => { const id = el.dataset.build; + const item = microAllBuildItems().find(x => x.id === id); + // 角色素材(生物栏):进入"点地面放置"模式,不进建筑模式 + if (item && item.isChar) { + // characters.js 顶层 let charPlaceRace/charPlaceMode 在同全局词法环境可直接读写 + charPlaceRace = item.race; + charPlaceMode = true; + // 退出建造模式(如果有)+ 清掉建筑选中态 + microBuildSel = null; + microEditRef = null; + microGhost = null; + microGhostFrozen = false; + if (microBuildMode) microSetBuildMode(false); + clearBuildSelUI(); + microRenderBuildPanel(); + if (typeof updateCharPlacePanel === 'function') updateCharPlacePanel(); + const raceName = (window.RACE_CONFIG && window.RACE_CONFIG[item.race]) ? window.RACE_CONFIG[item.race].name : item.name; + microToast('👤 点地面放置' + raceName); + return; + } microBuildSel = (microBuildSel === id) ? null : id; microEditRef = null; // 选新素材退出编辑 microGhostFrozen = false; // 进入跟随模式,移动鼠标,点一下才冻结