private function viewSpecificGame() { $user = $this->getUser(); $out = $this->getOutput(); $request = $this->getRequest(); $game_id = $request->getInt('game_id'); if ($game_id) { $game = new FateGame($game_id); $table = ''; if ($game->register_id) { if ($game->is_staff($user->getID()) || $user->isAllowed('fategm')) { $distribution = FateGameGlobals::getSkillDistributionArray(); $table .= "<table>" . "<tr><td class='mw-label'>Game Name:</td><td colspan=3>{$game->game_name}</td></tr>" . "<tr><td class='mw-label' style='vertical-align: top'>Description:</td><td colspan=3>{$game->game_description}</td></tr>" . "<tr><td class='mw-label'>GM:</td><td>" . Linker::link(Title::newFromText('User:'******'forcearticlepath')) . "</td>" . "<td class='mw-label' nowrap>Game Status:</td><td>{$game->game_status}</td></tr>" . "<tr><td class='mw-label'>Created:</td><td>" . FateGameGlobals::getDisplayDate($game->create_date) . "</td>" . "<td class='mw-label' nowrap>Last Modified:</td><td>" . FateGameGlobals::getDisplayDate($game->modified_date) . "</td></tr>" . "<tr><td class='mw-label' style='vertical-align: top' nowrap>Staff:</td><td colspan=3>"; if (count($game->staff) > 0) { $list = array(); foreach ($game->staff as $staff) { $list[] = Linker::link(Title::newFromText('User:'******'forcearticlepath')); } $table .= implode(', ', $list); } else { $table .= "None"; } $table .= "</td></tr>" . "<tr><td class='mw-label' style='vertical-align: top' nowrap>Starting Aspects:</td><td colspan=3>{$game->aspect_count} Total"; if (count($game->aspects) > 0) { $table .= "<br/>"; $list = array(); foreach ($game->aspects as $aspect) { $list[] = $aspect['label'] . ($aspect['is_major'] ? ' (*)' : ''); } $table .= implode(', ', $list); } $table .= "</td></tr>" . "<td class='mw-label' style='vertical-align: top'>Skills:</td><td colspan=3>" . "<table><tr><td class='mw-label'>Distribution Method:</td><td>" . $distribution[$game->skill_distribution] . "</td></tr>"; if ($game->skill_alternative) { $table .= "<tr><td class='mw-label'>Alternative Label:</td><td>{$game->skill_alternative}</td></tr>"; } $table .= "<tr><td class='mw-label'>Max Starting Skill:</td><td>+{$game->skill_max}</td></tr>" . "<tr><td class='mw-label'>Starting Points:</td><td>" . implode(', ', $game->skill_points) . "</td></tr></table></td></tr>"; if (count($game->skills) > 0) { $table .= "<tr><td class='mw-label' style='vertical-align: top;' nowrap>Skill List:</td><td colspan=3>"; $list = array(); foreach ($game->skills as $skill) { $list[] = $skill['label'] . ($skill['mode_cost'] !== null ? ' (' . $skill['mode_cost'] . ')' : ''); } $table .= implode(', ', $list) . "</td></tr>"; } if (count($game->modes) > 0) { $table .= "<tr><td class='mw-label' style='vertical-align: top'>Defined Modes:</td><td colspan=3>" . "<table class='wikitable'><tr><th>Mode Name</th><th>Cost</th><th>Is Weird?</th><th>Associated Skills</th></tr>"; foreach ($game->modes as $mode) { $skill_list = array(); foreach ($mode['skill_list'] as $sk) { $skill_list[] = $game->skills_by_id[$sk]['label']; } asort($skill_list); $table .= "<tr><td style='vertical-align: top'>" . $mode['label'] . "</td>" . "<td style='vertical-align: top'>" . $mode['cost'] . "</td>" . "<td style='vertical-align: top'>" . ($mode['is_weird'] ? 'Yes' : 'No') . "</td>" . "<td style='vertical-align: top'>" . implode(', ', $skill_list) . "</td></tr>"; } $table .= "</table></td></tr>"; } $table .= "<tr><td class='mw-label' nowrap>Turn Order Skills:</td>"; if (count($game->turn_order) > 0) { $first = 1; foreach ($game->turn_order as $index => $track) { if (!$first) { $table .= "<tr><td> </td>"; } $first = 0; $table .= "<td class='mw-label'><strong>" . ($index == 1 ? 'Physical' : 'Mental') . ":</strong></td>"; $skills = array(); foreach ($track as $skill_id) { $skills[] = $game->skills_by_id[$skill_id]['label']; } $table .= "<td colspan=2>" . implode(', ', $skills) . "</td></tr>"; } } else { $table .= "<td colspan=3>Undefined</td></tr>"; } $table .= "<tr><td class='mw-label' nowrap>Refresh Rate:</td><td colspan=3>{$game->refresh_rate}</td></tr>" . "<tr><td class='mw-label' nowrap>Initial Stunt Slots:</td><td colspan=3>{$game->stunt_count}</td></tr>" . "<tr><td class='mw-label' nowrap>Initial Stress Boxes:</td><td colspan=3>{$game->stress_count}</td></tr>"; if (count($game->stress_tracks) > 0) { $table .= "<tr><td class='mw-label'>Stress Tracks:</td><td colspan=3>"; $list = array(); foreach ($game->stress_tracks as $track) { $list[] = $track['label']; } $table .= implode(', ', $list) . "</td></tr>"; } if ($game->use_consequences) { $table .= "<tr><td class='mw-label'>Consequences:</td><td colspan=3>"; $list = array(); foreach ($game->consequences as $consequence) { $list[] = $consequence['label'] . ' (' . $consequence['display_value'] . ')'; } $table .= implode(', ', $list) . "</td></tr>"; } else { $table .= "<tr><td class='mw-label'>Conditions:</td><td colspan=3></td></tr>"; } $table .= "<tr><td class='mw-label'>Private Sheets:</td><td colspan=3>" . ($game->private_sheet ? 'Yes' : 'No') . "</td></tr>"; $table .= "<tr><td class='mw-label'>Use Atomic Robo style Refresh (Aspect count, don't subtract stunts):</td><td colspan=3>" . ($game->use_robo_refresh ? 'Yes' : 'No') . "</td></tr>"; $table .= "</table>"; if (count($game->fractals) > 0) { /* Handle Characters first, if they exist */ if (count($game->fractals['Character']) > 0) { $characters = $game->fractals['Character']; $table .= "<table class='wikitable'><caption>Characters<caption>" . "<tr><th>Character Name</th><th>Wiki Name</th><th>Status</th></tr>"; foreach ($characters as $character) { $table .= "<tr><td>" . Linker::link(Title::newFromText('Special:FateStats')->getSubpage("ViewSheet"), $character[name], array(), array('fractal_id' => $character[fractal_id]), array('forcearticlepath')) . "</td><td>" . Linker::link(Title::newFromText('User:'******'forcearticlepath')) . "</td><td>"; if ($character[frozen_date]) { $table .= 'Frozen on ' . FateGameGlobals::getDisplayDate($character[frozen_date]); } elseif ($character[approve_date]) { $table .= 'Approved on ' . FateGameGlobals::getDisplayDate($character[approve_date]); } elseif ($character[submit_date]) { $table .= 'Submitted on ' . FateGameGlobals::getDisplayDate($character[submit_date]); } else { $table .= 'Created on ' . FateGameGlobals::getDisplayDate($character[create_date]); } $table .= "</td></tr>"; } $table .= "</table>"; } /* Now look to see if there are any other fractals, and display appropriately */ foreach ($game->fractals as $key => $array) { if ($key == 'Character') { continue; } $table .= "<table class='wikitable'><caption>{$key}</caption>" . "<tr><th>Name</th><th>Is Private?</th><th>Created On</th>"; foreach ($array as $fractal) { $table .= "<tr><td>" . Linker::link(Title::newFromText('Special:FateStats')->getSubpage("View"), $fractal[name], array(), array('fractal_id' => $fractal[fractal_id]), array('forcearticlepath')) . "</td><td>" . ($fractal[is_private] ? 'Yes' : 'No') . "</td>" . "<td>" . FateGameGlobals::getDisplayDate($fractal[create_date]) . "</td></tr>"; } $table .= "</table>"; } } $table .= Linker::link(Title::newFromText('Special:FateStats')->getSubpage("Create"), 'Create New Fractal', array(), array('game_id' => $game_id), array('forcearticlepath')); if ($game->pending_stat_approvals) { $table .= "<br/>" . Linker::link($this->getPageTitle()->getSubPage('Approval'), 'You have pending approvals', array(), array('game_id' => $game_id), array('forcearticlepath')); } } else { $table .= "<div class='error' style='font-weight: bold; color: red;'>You are not approved staff for this game.</div>"; } } else { $table .= "<div class='error' style='font-weight: bold; color: red'>No data found for that game_id; please check URL and try again.</div>"; } $out->addHTML($table); } else { $out->addHTML("<div class='error' style='font-weight: bold; color: red'>Missing game_id argument; don't know which game to show.</div>"); } }