64) { $q = mb_substr($q, 0, 64); } // The search filters the list rather than querying anything -- 47 rows in an // array. It reads the description as well as the name, which is the point: // "pod", "texture" and "animated" all find things whose names never say so. $groups = UTILITIES; $hits = 0; if ($q !== '') { $needle = mb_strtolower($q); foreach ($groups as $key => $items) { $groups[$key] = array_values(array_filter($items, static function (array $i) use ($needle): bool { $hay = mb_strtolower($i['name'] . ' ' . html_entity_decode(strip_tags($i['desc']), ENT_QUOTES, 'UTF-8')); return str_contains($hay, $needle); })); $hits += count($groups[$key]); } } $total = array_sum(array_map('count', UTILITIES)); ?>

Utilities

Show all .

Everything here runs on Windows and most of it is twenty-odd years old. If you are setting the game up for the first time, the Game fixes are the part you need; the rest is for making tracks and trucks.

$group): $items = $groups[$key] ?? []; // A group with nothing left in it after a search is not drawn at // all -- an empty navy header under a heading reads as breakage. if (!$items) { continue; } ?>

Program
Description
Size
', $name, ''; } else { echo $name; } // Three rows point at a page rather than a file, which the // source marks by writing "(link)" where a size would go. // It belongs beside the name -- it says what the link is, // not how big the download is, because there is not one. if ($it['size'] === null && $it['href'] !== null) { echo ' link'; } ?>
', $it['newer'], ''; } ?>

Also current, and living on their own pages: Kmaster's JS utilities — the truck viewer, track viewer and POD viewer run in a browser with nothing to install, and JPod builds POD archives on the desktop.