This repository has been archived on 2024-07-18. You can view files and clone it, but cannot push or open issues or pull requests.
lwb5/scripts/lib/game.inc

243 lines
5.1 KiB
PHP

<?php
class game {
private $__status = null;
private $__firstTick = null;
private $__lastTick = null;
function __construct($version, $name, $namespace, $public, $canJoin, $text) {
$this->version = $version;
$this->name = $name;
$this->namespace = $namespace;
$this->public = $public;
$this->canJoin = $canJoin;
$this->text = $text;
$this->ticks = array();
$this->params = array();
$this->descriptions = array();
$this->initExternal();
}
private function initExternal() {
$this->dir = $this->version->getDirectory();
$this->siteDir = $this->version->getSiteDirectory();
}
function getDBAccess() {
if ($this->db) {
return $this->db;
}
if (!db::$database) {
return null;
}
return ($this->db = db::$database->getGameAccess($this->namespace));
}
function addTick($tick) {
$td = $tick->definition->script;
if (is_null($this->ticks[$td])) {
$this->ticks[$td] = $tick;
}
}
private function __loadActionObject() {
if ($this->actionObj) {
return;
}
$acn = $this->version->loadActionsClass();
$this->actionObj = new $acn($this);
foreach (get_class_methods($acn) as $method) {
$this->actions[strtolower($method)] = array(false, $method);
}
if (is_array($this->actionObj->index)) {
foreach ($this->actionObj->index as $action) {
if (strtolower($action) == strtolower($acn)) {
continue;
}
$this->actions[strtolower($action)] = array(true, $action, null);
}
}
}
private function __doAction($action, $args, $log = false) {
// Load actions object
$this->__loadActionObject();
// Check action
if (!is_array($this->actions[$action])) {
l::fatal(23, "Unknown action was '$action' on game '{$this->name}'");
}
if ($this->actions[$action][0]) {
// Load separate action class
if (!is_object($this->actions[$action][2])) {
$acn = $this->version->loadAction($this->actions[$action][1]);
$this->actions[$action][2] = new $acn($this);
}
$rv = call_user_func_array(array($this->actions[$action][2], 'run'), $args);
} else {
// Call the action instance's method
$rv = call_user_func_array(array($this->actionObj, $this->actions[$action][1]), $args);
}
return $rv;
}
public function action() {
$n = func_num_args();
if ($n == 0) {
l::fatal(22, "Empty action call on game '{$this->name}'");
}
// Get arguments
$args = func_get_args();
$action = strtolower(array_shift($args));
return $this->__doAction($action, $args);
}
public function deprecatedAction() {
$n = func_num_args();
if ($n == 0) {
l::fatal(22, "Empty action call on game '{$this->name}'");
}
// Get arguments
$args = func_get_args();
$action = strtolower(array_shift($args));
return $this->__doAction($action, $args);
}
function getLib($lib = null) {
if (is_null($lib)) {
$lib = $this->version->id;
}
if (is_null($this->libraries[$lib])) {
$this->libraries[$lib] = new library($lib, $this);
}
$this->getDBAccess();
return $this->libraries[$lib];
}
function runTick($name, $okNotFound = false) {
if (!is_null($this->ticks[$name])) {
$this->ticks[$name]->run();
} elseif ($okNotFound) {
$tick = $this->getLib($this->version->id . "/ticks/$name");
if (is_null($tick)) {
l::error("TICK: tick library '$libName' not found");
} else {
$tick->call('runTick');
}
}
}
private function earliestTick() {
$then = time() + 10 * 365 * 24 * 60 * 60;
foreach ($this->ticks as $td => $tick) {
if ($tick->first < $then && $tick->definition->public) {
$then = $tick->first;
}
}
return $then;
}
private function latestTick() {
$then = 0;
foreach ($this->ticks as $td => $tick) {
if (is_null($tick->last)) {
continue;
}
if ($tick->last > $then) {
$then = $tick->last;
}
}
return $then;
}
private function computeStatus() {
$visible = $this->public && $this->canJoin;
$this->__firstTick = $this->earliestTick($this);
$this->__lastTick = $this->latestTick($this);
$now = time();
if ($this->__lastTick && $this->__lastTick < $now) {
$this->__status = 'FINISHED';
} elseif (!$visible) {
$this->__status = 'PRE';
} else {
$running = ($this->__firstTick <= $now);
if ($running) {
if ($this->__lastTick) {
$this->__status = "ENDING";
} else {
$gLib = $this->getLib();
$this->__status = $gLib->call('isFinished') ? 'VICTORY' : 'RUNNING';
}
} else {
$this->__status = 'READY';
}
}
}
function status() {
if (is_null($this->__status)) {
$this->computeStatus();
}
return $this->__status;
}
function firstTick() {
if (is_null($this->__firstTick)) {
$this->computeStatus();
}
return $this->__firstTick;
}
function lastTick() {
if (is_null($this->__lastTick)) {
$this->computeStatus();
}
return $this->__lastTick;
}
function __sleep() {
return array('version', 'name', 'namespace', 'public', 'canJoin', 'text', 'descriptions', 'ticks', 'params');
}
function __wakeup() {
$this->initExternal();
}
function sessName() {
if (class_exists('input')) {
return input::$game->name . "_data";
}
return "";
}
}
?>