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>&nbsp;</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>");
     }
 }