get('/', function() { if (user()->currentaction === "In Town") { $page = Towns\town(); $title = "In Town"; } elseif (user()->currentaction === "Exploring") { $page = doexplore(); $title = "Exploring"; } elseif (user()->currentaction === "Fighting") { redirect('/fight'); } return is_htmx() ? $page : display($page, $title); }); $r->get('/ninja', function() { exit('NINJA! 🥷'); }); Towns\register_routes($r); Fights\register_routes($r); Users\register_routes($r); Help\register_routes($r); Forum\register_routes($r); Install\register_routes($r); Admin\register_routes($r); $r->post('/move', 'move'); $r->get('/spell/:id', 'healspells'); $r->get('/character', 'show_character_info'); $r->get('/character/:id', 'show_character_info'); $r->get('/showmap', 'showmap'); $r->form('/babblebox', 'babblebox'); // [code, handler, params, middleware] $l = $r->lookup($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI']); if (is_int($l)) exit("Error: $l"); if (!empty($l['middleware'])) foreach ($l['middleware'] as $middleware) $middleware(); $content = $l['handler'](...$l['params'] ?? []); if (is_htmx()) { $content .= Render\debug_db_info(); if ($GLOBALS['state']['user-state-changed'] ?? false) { $content .= Render\right_nav(); } } echo $content; exit; /** * Just spit out a blank exploring page. Exploring without a GET string is normally when they first log in, or when * they've just finished fighting. */ function doexplore() { return <<Exploring You are exploring the map, and nothing has happened. Continue exploring using the direction buttons or the Travel To menus. HTML; } /** * Show a character's info. Defaults to the currently logged in user. */ function show_character_info(int $id = 0): void { global $controlrow, $userrow; $userrow = ($id === 0) ? $userrow : get_user($id); if ($userrow === false) exit('Failed to show info for user ID '.$id); $levelrow = db()->query("SELECT `{$userrow["charclass"]}_exp` FROM levels WHERE id=? LIMIT 1;", [$userrow['level'] + 1])->fetchArray(SQLITE3_ASSOC); $spells = db()->query('SELECT id, name FROM spells;'); $userspells = explode(',', $userrow['spells']); $magic_list = ''; while ($spellrow = $spells->fetchArray(SQLITE3_ASSOC)) { $spell = false; foreach($userspells as $b) if ($b == $spellrow["id"]) $spell = true; if ($spell == true) $magic_list .= $spellrow["name"]."
"; } if ($magic_list == "") $magic_list = "None"; $showchar = render('showchar', [ 'char' => $userrow, 'level' => $levelrow, 'magic_list' => $magic_list, 'controlrow' => $controlrow ]); echo render('layouts/minimal', ['content' => $showchar, 'title' => $userrow['username'].' Information']); } function showmap() { $pos = sprintf( '
', round(258 + user()->longitude * (500 / 500) - 3), round(258 - user()->latitude * (500 / 500) - 3) ); echo render('layouts/minimal', [ 'content' => 'Map'.$pos, 'title' => 'Map' ]); } /** * Either render the latest 40 chats to the babblebox, or add a chat to it and redirect. This is used * within an iframe. */ function babblebox() { if ($_SERVER['REQUEST_METHOD'] === 'POST') { $safecontent = make_safe($_POST["babble"]); if (!empty($safecontent)) { db()->query('INSERT INTO babble (posttime, author, babble) VALUES (CURRENT_TIMESTAMP, ?, ?);', [user()->username, $safecontent]); } redirect('/babblebox'); } $query = db()->query('SELECT * FROM babble ORDER BY id DESC LIMIT 40;'); echo render('babblebox', ['messages' => $query]); } /** * NINJA! 🥷 */ function ninja(): void { exit('NINJA! 🥷'); }