phudbase/
phudbase/client/
phudbase/client/css/
phudbase/client/images/colorbox/CVS/
phudbase/client/js/
phudbase/server/
phudbase/server/includes/actions/
phudbase/server/includes/classes/
phudbase/server/includes/classes/GameObjects/
<?php
class Game
{
	private $start_time; // Game instance start time //
	private $last_loop; // Last Execution Loop //
	private $timer_registry; // Array of all timed actions pending //
	private $action_queue; // Array of all pending actions //
	
	private $connections; 
	
	private $characters;	
	private $rooms;	
	
	private $lastPoll;
	
	function __construct()
	{
		$this->start_time = $this->lastPoll = time();
		$this->action_queue = array();
		$this->connections = array();
		
		$this->characters = array();		
		$this->rooms = array();
	}

	function getConnections()
	{
		return $this->connections;
	}
	
	function addConnection($id, $conn)
	{
		$this->connections[$id] = $conn;
	}
	
	function getConnection($id)
	{
		if (is_object($this->connections[$id]))
			return $this->connections[$id];
		else
			return false;
	}
	
	function removeConnection($id)
	{
		unset($this->connections[$id]);
	}
	
	function ExecuteLoop()
	{		
		try {				
			// Every 10 seconds, move our NPCs, check for AFKs/disconnects, etc. //
			if (time()-$this->lastPoll >= 10)
			{				
				global $rooms;
				
				foreach ($this->getCharacters() as $key => $char)
				{
					if ($char->getType() == GO_TYPE_NPC)
					{						
						$newRoom = false;
						
						$rand = rand(0,7);			
						if ($rand == 0) $dir = "nw";
						if ($rand == 1) $dir = "n";
						if ($rand == 2) $dir = "ne";
						if ($rand == 3) $dir = "w";
						if ($rand == 4) $dir = "e";
						if ($rand == 5) $dir = "sw";
						if ($rand == 6) $dir = "s";
						if ($rand == 7) $dir = "se";
						
						move($char->getEID(), $dir);
					}
					
					if ($char->getType() == GO_TYPE_CHAR )
					{
						// If no activity in x seconds (5 minutes is the default) //
						if (is_object($char->getConnection()) && microtime(true) - $char->getConnection()->getLastTime() > CONN_TIMEOUT)
						{
							$char->send("You've been kicked for inactivity.", "sysmessage");
							$char->setOffline();
							$this->removeCharacter($char);							
						} elseif (!is_object($char->getConnection())) 
						{ 
							// We've got a character with no connection! AHHHH!! //
							// Actually, it just means the browser was closed or the connection was uncleanly
							// cut for some other reason.  No biggie. //
							$char->setOffline();
							$this->removeCharacter($char);	
						} else {
							// Send a server status update //
							if ($char->getConnection()->getClientType() == GC_WEBSOCKET)
								$char->sendDirect(json_encode(array("server_status" => count($this->getConnections()) . " online")));
						}
					}
				}
				
				
				$this->lastPoll = time();
			}			

			$this->cleanup();
			$this->last_loop = microtime(true);
		} catch (Exception $e) 
		{
			$exception = "Exception: {$e->getMessage()} in {$e->getFile()} at line "
					   . "{$e->getLine()} with trace:<br/>{$e->getTraceAsString()}";
			echo "Caught exception: " . $e->getMessage() . "\n";
		}
	}	
	
	function addCharacter($c)
	{
		if (is_object($c))
			$this->characters[$c->getEID()] = $c;
	}
	
	function removeCharacter($c)
	{
		unset($this->characters[$c->getEID()]);		
	}
	
	function getCharacter($id)
	{
		if (is_object($this->characters[$id]))
			return $this->characters[$id];
		else
			return false;
	}
	
	function getCharacters()
	{
		return $this->characters;	
	}
	
	function addRoom($r)
	{
		if (is_object($r))
			$this->rooms[$r->getEID()] = $r;
	}
	
	function getRoom($id)
	{
		if (is_object($this->rooms[$id]))
			return $this->rooms[$id];
		else
			return false;
	}
	
	function getRooms()
	{
		return $this->rooms;	
	}
		
	function GetUptime()
	{
		return time() - $this->start_time;
	}
	
	function isRunning()
	{
		return true;
	}
	
	function cleanup()
	{
		// Check connections for lack of comm and kill if necessary //
		foreach ($this->connections as $key => $conn)
		{
			if (microtime(true) - $conn->getLastTime() > CONN_TIMEOUT + 60)
			{
				$this->removeConnection($key);
				echo "Killed connection [$key] in cleanup...\n";
			}
		}
	}
	
	function dump()
	{
		echo "Game Dump:\n===============\n";
		
		echo "Characters:\n";
		foreach ($this->characters as $key => $char)
			echo $char->getName() . "\n";

		echo "\nRooms:\n";
		foreach ($this->rooms as $key => $room)
			echo $room->getName() . "\n";
	}
}
?>