194 lines
7.8 KiB
JavaScript
194 lines
7.8 KiB
JavaScript
// ================================================================
|
||
// 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 `<div class="bld-card${isSelected ? ' bld-selected' : ''}" onclick="window.selectBuilding('${key}','${nameGr}')">
|
||
<span class="bld-level">${level}</span>
|
||
<span class="bld-icon">${icon}</span>
|
||
<span class="bld-name">${nameGr}</span>
|
||
<span class="bld-status queue-warn">Αγνωστο</span>
|
||
</div>`;
|
||
}
|
||
|
||
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 `<div class="bld-card ${cardClass}${isSelected ? ' bld-selected' : ''}" ${onclick}>
|
||
<span class="bld-level">${level}</span>
|
||
<span class="bld-icon">${icon}</span>
|
||
<span class="bld-name">${nameGr}</span>
|
||
<span class="bld-status ${statusClass}">${statusLabel}</span>
|
||
${costStr ? `<span class="bld-cost">${costStr}</span>` : ''}
|
||
</div>`;
|
||
}).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 `<span style="background:rgba(0,0,0,0.3);padding:2px 8px;border-radius:4px;margin-right:4px;font-size:0.8rem;">${gr}</span>`;
|
||
}).join('');
|
||
} else {
|
||
qEl.innerHTML = '<span style="color:#555;font-size:0.8rem;">Κενή</span>';
|
||
}
|
||
|
||
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 = '<option value="" disabled selected>-- Επιλέξτε Μονάδα --</option>';
|
||
|
||
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 = '<span style="color:#444">Build queue: empty</span>';
|
||
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 `<span style="background: rgba(0,0,0,0.3); padding: 2px 6px; border-radius: 4px; margin-right: 4px; font-size: 0.8rem;">${nameGr}</span>`;
|
||
}).join('');
|
||
el.innerHTML = `<div style="margin-top:6px;color:#888;font-size:0.72rem;text-transform:uppercase;letter-spacing:0.5px;margin-bottom:4px;">Current queue</div>${items}`;
|
||
};
|