// ================================================================ // Town Viewer Component (Left panel + Town detail view) // ================================================================ window.renderTowns = function() { const container = document.getElementById('town-list'); if (!window.towns || !window.towns.length) { container.innerHTML = '

No towns received yet.

'; return; } // Get active filters const searchTerm = (document.getElementById('town-search')?.value || '').toLowerCase(); const reqFullWh = document.getElementById('filter-full-wh')?.checked; const reqFestival = document.getElementById('filter-festival')?.checked; const reqPoints = document.getElementById('filter-points')?.checked; const filteredTowns = window.towns.filter(t => { // 1. Search by name if (searchTerm && !t.town_name.toLowerCase().includes(searchTerm)) return false; const cap = t.resources.storage || 1; const wPct = t.resources.wood / cap; const sPct = t.resources.stone / cap; const iPct = t.resources.iron / cap; // 2. Full WH (>95%) if (reqFullWh && Math.max(wPct, sPct, iPct) < 0.95) return false; // 3. Festival (Wood>15k, Stone>18k, Iron>15k) // City Festival exact costs = 15000, 18000, 15000 if (reqFestival && (t.resources.wood < 15000 || t.resources.stone < 18000 || t.resources.iron < 15000)) return false; // 4. Large Points if (reqPoints && t.points < 10000) return false; return true; }); if (filteredTowns.length === 0) { container.innerHTML = '

Καμία πόλη δεν ταιριάζει στα κριτήρια.

'; return; } const now = Date.now(); container.innerHTML = filteredTowns.map(t => { const updatedMs = new Date(t.updated_at + 'Z').getTime(); const ageMin = Math.round((now - updatedMs) / 60000); const stale = ageMin > 3; const selected = t.town_id === window.selectedTownId ? 'selected' : ''; const cap = t.resources.storage || 1; const wPct = t.resources.wood / cap; const sPct = t.resources.stone / cap; const iPct = t.resources.iron / cap; let markers = ''; if (wPct >= 0.95 || sPct >= 0.95 || iPct >= 0.95) { markers += '⚠️'; } if (t.resources.wood >= 15000 && t.resources.stone >= 18000 && t.resources.iron >= 15000) { markers += '🎭'; } const getC = (pct) => pct >= 0.95 ? 'color:#ff4a4a;font-weight:bold;' : ''; return `
${markers}${t.town_name}${t.has_premium ? ' ' : ''}
${t.sea != null ? `🌊 Θ${t.sea} · ` : ''}${t.points} pts · ${t.god || 'No god'} · ${ageMin}m ago
${window.fmt(t.resources.wood)}
${window.fmt(t.resources.stone)}
${window.fmt(t.resources.iron)}
${window.fmt(t.resources.population)}
`; }).join(''); }; window.selectTown = function(id) { window.selectedTownId = id; window.renderTowns(); document.getElementById('no-town-selected').style.display = 'none'; document.getElementById('command-form-wrap').style.display = 'block'; document.getElementById('town-details-panel').style.display = 'block'; window.renderBuildQueuePreview(); window.renderBuildingDropdown(); window.renderUnitDropdown(); window.renderTownDetails(); }; window.getSelectedTown = function() { return window.towns.find(t => t.town_id === window.selectedTownId); }; window.renderTownDetails = function() { const t = window.getSelectedTown(); if(!t) return; document.getElementById('td-name').textContent = t.town_name; const cap = t.resources.storage || 1; const getCol = (amt) => { const pct = amt / cap; if (pct >= 0.95) return 'color: #ff4a4a;'; // Red if (pct >= 0.85) return 'color: #ffa500;'; // Orange return 'color: #fff;'; }; const capFmt = (t.resources.storage != null && t.resources.storage !== '') ? window.fmt(t.resources.storage) : '?'; document.getElementById('td-resources').innerHTML = `
Χωρητικότητα: ${capFmt}
${window.RES_ICONS.wood} Ξύλο: ${window.fmt(t.resources.wood)}
${window.RES_ICONS.stone} Πέτρα: ${window.fmt(t.resources.stone)}
${window.RES_ICONS.iron} Ασήμι: ${window.fmt(t.resources.iron)}
${window.RES_ICONS.pop} Πληθυσμός: ${t.resources.population}
`; const godName = t.god ? t.god.charAt(0).toUpperCase() + t.god.slice(1) : 'Κανένας'; const seaStr = t.sea != null ? `Θ${t.sea}` : '—'; const coordStr = (t.x != null && t.y != null) ? ` (${Math.round(t.x)}:${Math.round(t.y)})` : ''; document.getElementById('td-general').innerHTML = `
Πόντοι: ${t.points}${t.wonder_points ? ` / Θαύμα: ${t.wonder_points}` : ''}
Θεός: ${godName}
Θάλασσα: ${seaStr}${coordStr}
Παίκτης: ${t.player}${t.has_premium ? ' ' : ''}
${t.alliance_id ? `
Συμμαχία: ${t.alliance_id}
` : ''} `; // ---- Researches ---- const researchObj = t.researches || {}; const researchEntries = Object.entries(researchObj).filter(([k, v]) => k !== 'id' && k !== 'town_id' && (v === true || v === 1 || Number(v) > 0) ); let resHtml = ''; if (researchEntries.length) { resHtml = researchEntries.map(([k]) => `
✓ ${k.replace(/_/g, ' ')}
` ).join(''); } else { resHtml = '
Καμία έρευνα
'; } document.getElementById('td-researches').innerHTML = resHtml; const unitsObj = t.units || {}; let unitsHtml = ''; for(const [unitKey, count] of Object.entries(unitsObj)) { if(count > 0 && unitKey !== 'militia') { const name = window.UNIT_NAMES_GR[unitKey] || unitKey; unitsHtml += `
${name}: ${count}
`; } } if(unitsHtml === '') unitsHtml = '
Κανένα στράτευμα
'; document.getElementById('td-units').innerHTML = unitsHtml; };