// ================================================================ // Command Form Component // ================================================================ window.onCmdTypeChange = function() { const type = document.getElementById('cmd-type').value; document.getElementById('build-options').style.display = type === 'build' ? '' : 'none'; document.getElementById('recruit-options').style.display = type === 'recruit' ? '' : 'none'; document.getElementById('amount-group').style.display = type === 'recruit' ? '' : 'none'; document.getElementById('market-options').style.display = type === 'market_offer' ? '' : 'none'; }; // Building emoji icons for the visual grid const BUILDING_ICONS = { main: '🏛️', storage: '🏚️', farm: '🌾', academy: '📜', temple: '⛩️', barracks: '⚔️', docks: '⚓', market: '🛒', hide: '🕳️', lumber: '🪵', stoner: '🪨', ironer: '⛏️', wall: '🧱' }; window.selectedBuildingId = null; window.renderBuildingDropdown = function() { // No-op — selection now happens via the modal }; window.openBuildingModal = function() { const town = window.getSelectedTown(); if (!town) return; const grid = document.getElementById('building-grid'); const bLevels = town.buildings || {}; const bData = town.build_data || {}; grid.innerHTML = Object.entries(window.BUILDING_NAMES_GR).map(([key, nameGr]) => { const level = bLevels[key] !== undefined ? bLevels[key] : '?'; const data = bData[key]; const icon = BUILDING_ICONS[key] || '🏗️'; const isSelected = key === window.selectedBuildingId; if (!data) { return `
${level} ${icon} ${nameGr} Αγνωστο
`; } const missingKeys = data.missing_dependencies ? Object.keys(data.missing_dependencies) : []; const isLocked = !data.dependencies || missingKeys.length > 0; const isMaxed = data.has_max_level; let statusClass, statusLabel, cardClass = ''; if (isMaxed) { statusClass = 'maxed'; statusLabel = '✓ Μέγιστο'; cardClass = 'bld-maxed'; } else if (isLocked) { statusClass = 'locked'; statusLabel = '🔒 Κλειδωμένο'; cardClass = 'bld-locked'; } else if (data.can_upgrade) { statusClass = 'can-build'; statusLabel = '✅ Αναβάθμιση'; } else if (data.enough_resources === false) { statusClass = 'no-resources'; statusLabel = '❌ Λείπουν Πόροι'; } else { statusClass = 'queue-warn'; statusLabel = '⚠️ Πληθ./Ουρά'; } const w = data.wood ? window.fmt(data.wood) : 0; const st = data.stone ? window.fmt(data.stone) : 0; const i = data.iron ? window.fmt(data.iron) : 0; let t = data.build_time || ''; if (t.startsWith('00:')) t = t.substring(3); const costStr = (w || st || i) ? `Ξ:${w} Π:${st} Α:${i}${t ? ' · ⏱'+t : ''}` : ''; const clickable = !isMaxed && !isLocked; const onclick = clickable ? `onclick="window.selectBuilding('${key}','${nameGr}')"` : ''; return `
${level} ${icon} ${nameGr} ${statusLabel} ${costStr ? `${costStr}` : ''}
`; }).join(''); // Render current build queue in modal footer const qEl = document.getElementById('building-modal-queue-items'); if (town.build_queue && town.build_queue.length) { qEl.innerHTML = town.build_queue.map(o => { const raw = o.building_type || o.name || ''; const gr = window.BUILDING_NAMES_GR[raw] || raw; return `${gr}`; }).join(''); } else { qEl.innerHTML = 'Κενή'; } document.getElementById('building-modal-overlay').classList.add('open'); }; window.closeBuildingModal = function(e) { // Close only if clicking the overlay background or the X button if (e && e.target !== document.getElementById('building-modal-overlay') && e.target !== document.getElementById('building-modal-close')) return; document.getElementById('building-modal-overlay').classList.remove('open'); }; window.selectBuilding = function(key, nameGr) { window.selectedBuildingId = key; // Update the trigger button label document.getElementById('selected-building-label').textContent = `🏗️ ${nameGr}`; // Re-render grid to show new selection highlight window.openBuildingModal(); // Close after brief visual feedback setTimeout(() => document.getElementById('building-modal-overlay').classList.remove('open'), 180); }; window.renderUnitDropdown = function() { const town = window.getSelectedTown(); if (!town) return; const uSelect = document.getElementById('unit-select'); const uData = town.unit_data || {}; const currentVal = uSelect.value; uSelect.innerHTML = ''; for (const [key, nameGr] of Object.entries(window.UNIT_NAMES_GR)) { if (key === 'militia') continue; const data = uData[key]; let text = `${nameGr}`; if (data) { const w = window.fmt(data.wood || 0); const st = window.fmt(data.stone || 0); const i = window.fmt(data.iron || 0); const pop = data.pop || 0; // Unit build_time is usually raw seconds in GameData let t = data.build_time || 0; let tStr = `${t}s`; if (t > 60) { let m = Math.floor(t / 60); let s = t % 60; tStr = `${m}m ${s}s`; } const costStr = `Ξ:${w} Π:${st} Α:${i} 🧔:${pop} · ⏱ ${tStr}`; const missingKeys = data.missing_dependencies ? Object.keys(data.missing_dependencies) : []; const isLocked = missingKeys.length > 0; const option = document.createElement('option'); option.value = key; if (isLocked) { option.textContent = `${text} — 🔒 Κλειδωμένο`; option.style.color = '#ff4444'; } else if (data.enough_resources === false) { option.textContent = `${text} — ❌ ${costStr} (Λείπουν Πόροι 1x)`; option.style.color = '#aa5555'; } else { option.textContent = `${text} — ✅ ${costStr}`; } uSelect.appendChild(option); } else { const option = document.createElement('option'); option.value = key; option.textContent = text; uSelect.appendChild(option); } } if (currentVal && Array.from(uSelect.options).some(o => o.value === currentVal)) { uSelect.value = currentVal; } }; window.renderBuildQueuePreview = function() { const town = window.getSelectedTown(); const el = document.getElementById('build-queue-preview'); if (!town || !town.build_queue || !town.build_queue.length) { el.innerHTML = 'Build queue: empty'; return; } const items = town.build_queue.map(o => { const raw = o.building_type || o.name || ""; const nameGr = window.BUILDING_NAMES_GR[raw] || raw || JSON.stringify(o); return `${nameGr}`; }).join(''); el.innerHTML = `
Current queue
${items}`; };