getMilestones() : [];
// Lightens ($percent > 0) or darkens ($percent < 0) a "#rrggbb" color, used
// to build each badge's radial-gradient inline (kept as plain computed hex
// stops rather than CSS color-mix()/custom properties, for broader browser
// compatibility with this project's existing baseline).
function tzms_shade($hex, $percent) {
$hex = ltrim($hex, '#');
$r = hexdec(substr($hex, 0, 2));
$g = hexdec(substr($hex, 2, 2));
$b = hexdec(substr($hex, 4, 2));
$adjust = function ($c) use ($percent) {
$c = $percent < 0 ? $c * (1 + $percent / 100) : $c + (255 - $c) * ($percent / 100);
return max(0, min(255, (int) round($c)));
};
return sprintf('#%02x%02x%02x', $adjust($r), $adjust($g), $adjust($b));
}
// Simple line-icon set (inline SVG, no external image files, so there's
// nothing that can 404 regardless of where this is deployed).
$milestoneIcons = [
'village' => '',
'population' => '',
'artifact' => '',
'wonder' => '',
'plan' => '',
'alliance' => '',
'conquest' => '',
];
$milestoneDefs = [
'second_village' => ['label' => TZ_MILESTONE_SECOND_VILLAGE, 'icon' => 'village', 'color' => '#c0783c'],
'population_1000' => ['label' => TZ_MILESTONE_POPULATION_1000, 'icon' => 'population', 'color' => '#3c78c0'],
'first_artifact' => ['label' => TZ_MILESTONE_FIRST_ARTIFACT, 'icon' => 'artifact', 'color' => '#8a4fc0'],
'first_ww' => ['label' => TZ_MILESTONE_FIRST_WW, 'icon' => 'wonder', 'color' => '#c0a030'],
'first_ww_plan' => ['label' => TZ_MILESTONE_FIRST_WW_PLAN, 'icon' => 'plan', 'color' => '#2f9e8f'],
'first_alliance' => ['label' => TZ_MILESTONE_FIRST_ALLIANCE, 'icon' => 'alliance', 'color' => '#3fa14a'],
'first_pvp_conquest' => ['label' => TZ_MILESTONE_FIRST_PVP_CONQUEST, 'icon' => 'conquest', 'color' => '#b6362f'],
];
// =========================
// TRIBES COUNT
// =========================
$tribesRes = mysqli_query($database->dblink,
"SELECT tribe, COUNT(*) AS Total FROM ".TB_PREFIX."users WHERE tribe BETWEEN 1 AND 3 GROUP BY tribe");
$tribes = [0, 0, 0];
if ($tribesRes) {
while ($row = mysqli_fetch_assoc($tribesRes)) {
$tribes[(int)$row['tribe']-1] = (int)$row['Total'];
}
}
$userRes = mysqli_query($database->dblink,
"SELECT COUNT(*) AS Total FROM ".TB_PREFIX."users WHERE tribe BETWEEN 1 AND 3");
$users = $userRes? (int)mysqli_fetch_assoc($userRes)['Total'] : 0;
// =========================
// VILLAGES + POPULATION
// =========================
$villageRes = mysqli_query($database->dblink, "SELECT COUNT(*) AS Total FROM ".TB_PREFIX."vdata");
$num_villages = $villageRes? (int)mysqli_fetch_assoc($villageRes)['Total'] : 0;
$popRes = mysqli_query($database->dblink, "SELECT SUM(pop) AS totalpop FROM ".TB_PREFIX."vdata");
$total_pop = $popRes? (int)mysqli_fetch_assoc($popRes)['totalpop'] : 0;
// =========================
// ONLINE / ACTIVE USERS
// =========================
$active = 0;
$res = mysqli_query($database->dblink,
"SELECT COUNT(*) AS Total FROM ".TB_PREFIX."users WHERE timestamp > ".(time()-86400)." AND tribe BETWEEN 1 AND 3");
if($res)
$active = (int)mysqli_fetch_assoc($res)['Total'];
$online = 0;
$res = mysqli_query($database->dblink,
"SELECT COUNT(*) AS Total FROM ".TB_PREFIX."users WHERE timestamp > ".(time()-600)." AND tribe BETWEEN 1 AND 3");
if($res) $online = (int)mysqli_fetch_assoc($res)['Total'];
// =========================
// GOLD TOTAL
// =========================
$goldRes = mysqli_query($database->dblink, "SELECT SUM(gold) AS totalgold FROM ".TB_PREFIX."users");
$total_gold = $goldRes? (int)mysqli_fetch_assoc($goldRes)['totalgold'] : 0;
// =========================
// 2026 - NEW STATISTICS
// =========================
$daysSinceStart = defined('COMMENCE')? floor((time()-COMMENCE)/86400) : 0;
// Natars
$natars = 0;
$q = mysqli_query($database->dblink, "SELECT COUNT(*) AS n FROM ".TB_PREFIX."vdata WHERE natar=1");
if($q)
$natars = (int)mysqli_fetch_assoc($q)['n'];
// Occupied Oasis
$oasis = 0;
$q = mysqli_query($database->dblink,
"SELECT COUNT(*) AS o
FROM ".TB_PREFIX."odata
WHERE owner <> 2 AND owner <> 0 AND owner IS NOT NULL");
if($q) $oasis = (int)mysqli_fetch_assoc($q)['o'];
// Alliances
$alliCount = 0;
$q = mysqli_query($database->dblink, "SELECT COUNT(*) AS a FROM ".TB_PREFIX."alidata");
if($q)
$alliCount = (int)mysqli_fetch_assoc($q)['a'];
$topAlliances = [];
$q = mysqli_query($database->dblink,
"SELECT a.tag, a.name, COUNT(u.id) AS members FROM ".TB_PREFIX."alidata a
LEFT JOIN ".TB_PREFIX."users u ON u.alliance=a.id
GROUP BY a.id ORDER BY members DESC LIMIT 5");
if($q) while($r=mysqli_fetch_assoc($q))
$topAlliances[] = $r;
// New Players Today
$newToday = 0;
$q = mysqli_query($database->dblink,
"SELECT COUNT(*) AS n FROM ".TB_PREFIX."users WHERE regtime > ".(time()-86400)." AND tribe BETWEEN 1 AND 3");
if($q)
$newToday = (int)mysqli_fetch_assoc($q)['n'];
// Top 10
$topPop = [];
$q = mysqli_query($database->dblink,
"SELECT u.username, COALESCE(SUM(v.pop),0) AS totalpop
FROM ".TB_PREFIX."users u
LEFT JOIN ".TB_PREFIX."vdata v ON v.owner = u.id
WHERE u.tribe BETWEEN 1 AND 3
GROUP BY u.id
ORDER BY totalpop DESC
LIMIT 10");
if($q) while($r = mysqli_fetch_assoc($q))
$topPop[] = $r;
$topAtk = [];
$q = mysqli_query($database->dblink,
"SELECT username, ap AS points
FROM ".TB_PREFIX."users
WHERE tribe BETWEEN 1 AND 3
ORDER BY ap DESC
LIMIT 10");
if($q) while($r = mysqli_fetch_assoc($q))
$topAtk[] = $r;
$topDef = [];
$q = mysqli_query($database->dblink,
"SELECT username, dp AS points
FROM ".TB_PREFIX."users
WHERE tribe BETWEEN 1 AND 3
ORDER BY dp DESC
LIMIT 10");
if($q) while($r = mysqli_fetch_assoc($q))
$topDef[] = $r;
// WW
$wonders=[]; $q=mysqli_query($database->dblink,
"SELECT v.name AS village, u.username, f.f99 AS level
FROM ".TB_PREFIX."fdata f
JOIN ".TB_PREFIX."vdata v ON f.vref=v.wref
JOIN ".TB_PREFIX."users u ON v.owner=u.id
WHERE f.f99t=40 AND f.f99>0 ORDER BY f.f99 DESC LIMIT 3");
if($q) while($r=mysqli_fetch_assoc($q))
$wonders[]=$r;
// Artefacts
$artefacts=[];
$q=mysqli_query($database->dblink,
"SELECT a.name, u.username FROM ".TB_PREFIX."artefacts a
LEFT JOIN ".TB_PREFIX."users u ON a.owner=u.id WHERE a.active=1 LIMIT 5");
if($q) while($r=mysqli_fetch_assoc($q))
$artefacts[]=$r;
// Troops
$units=[];
$result=mysqli_query($database->dblink,"SELECT ".implode(',',array_map(fn($i)=>"SUM(u$i) AS u$i",range(1,30)))." FROM ".TB_PREFIX."units");
if($result)
$units=mysqli_fetch_assoc($result);
function u($units,$k){
return isset($units[$k])? (int)$units[$k] : 0;
}
?>
$mdef):
$achieved = $milestonesData[$mkey] ?? null;
$light = tzms_shade($mdef['color'], 28);
$dark = tzms_shade($mdef['color'], -32);
$bg = $achieved
? sprintf('background:radial-gradient(circle at 32%% 28%%, %s, %s 55%%, %s 100%%);border-color:rgba(255,255,255,0.35);', $light, $mdef['color'], $dark)
: 'background:#d8d8d8;border-color:rgba(0,0,0,0.08);';
$title = htmlspecialchars($mdef['label'], ENT_QUOTES, 'UTF-8');
$meta = $achieved
? htmlspecialchars(($achieved['username'] ?: '-') . ' — ' . date('d.m.y G:i:s', (int)$achieved['achieved_time']), ENT_QUOTES, 'UTF-8')
: htmlspecialchars(TZ_MILESTONE_NOT_YET, ENT_QUOTES, 'UTF-8');
?>
|
| |
| = $num_villages?> | = $total_pop?> |
|
| = $users?> |
| = $active?> |
| Players online | = $online?> |
| Server Information |
| Days Since Start | = $daysSinceStart?> |
| Active Alliance | = $alliCount?> |
| Natars Villages | = $natars?> |
| Conquered Oasis | = $oasis?> |
| New Players Today | = $newToday?> |
|
| | |
0)?round(100*$roman/$users,2):0;
$teutonPct=($users>0)?round(100*$teuton/$users,2):0;
$gaulPct=($users>0)?round(100*$gaul/$users,2):0;
?>
| = $roman?> | = $romanPct?>% |
| = $teuton?> | = $teutonPct?>% |
| = $gaul?> | = $gaulPct?>% |
Total = SERVER_NAME?> Gold |
| = $total_gold?> |
| Top 5 Alliances |
| Tag | Nume | Members |
| =htmlspecialchars($a['tag'])?> | =htmlspecialchars($a['name'])?> | =(int)$a['members']?> |
- | ';?>
|
 | |
 | |
 | |
 | =u($units,'u'.$i)?> |
 | =u($units,'u'.($i+10))?> |
 | =u($units,'u'.($i+20))?> |
| Top Players |
| Population | Pct |
Attackers | Pct |
Defenders | Pct |
| = ($i+1).'. '.($p ? htmlspecialchars($p['username']) : '-') ?> |
= $p ? (int)($p['totalpop'] ?? 0) : 0 ?> |
= ($i+1).'. '.($a ? htmlspecialchars($a['username']) : '-') ?> |
= $a ? (int)$a['points'] : 0 ?> |
= ($i+1).'. '.($d ? htmlspecialchars($d['username']) : '-') ?> |
= $d ? (int)$d['points'] : 0 ?> |
| Endgame |
| WW | Level | Artefacts |
| "; if(empty($wonders)) echo "-";?> |
"; if(empty($wonders)) echo "-";?> |
"; if(empty($artefacts)) echo "-";?> |
|
| | |
| = $database->getAttackByDate(time()-(86400*$d))?> |
= $database->getAttackCasualties(time()-(86400*$d))?> |
= date("j. M", time()-(86400*$d))?> |