《〈XNova/OGame〉源码笔记》
作者:赖勇浩(http://blog.csdn.net/lanphaday)
一、 引言
《OGame》中文名《银河帝国》,是最早的 webgame 实现之一,也是国内众多三国题材的 webgame 的抄袭之原型。它是一个宇宙星际为题材的 webgame,据说现在已经有数千万玩家在玩这个游戏。
我使用 Source Navigator 来浏览这些代码,这是一个很好的工具,在这里推荐一下。这个笔记用 MS Word 进行排版,在文章结构上是以功能为章,以源码文件或关键函数为节进行组织的,行文的顺序为程序执行的顺序。以上,请读者记住,不然读起来难免会感觉怪异。
注:需要读懂这些笔记,你大概需要拥有:1)XNova/OGame的源码,我读的是网上流传甚广的 0.8TC3 版本(真的有这个版本吗,我在官网看到最大的版本号是 0.77);2)懂得 PHP 4 的基本知识,比如语法和常用的库函数之类;3)懂得 PHP 程序是怎么样运行的,或者说对 CGI 原理有所了解,最好知道如何用 PHP 或其它编程语言编写简单的 CGI 程序。
二、 登陆界面
这个文章是游戏整站的入口。只有几行代码,功能一目了然:判断 ogame/config.php 的文件大小是否为 0,如果是,就重定向到 ogame/install/ 目录执行安装操作,否则就重定向到 ogame/login.php 显示登陆页面。我们假定游戏已经安装好,接下来看看 ogame/login.php。
顾名思义,login.php 当然就是显示登陆页面。一读代码,可以看到它先定义了两个常量:
define('INSIDE' , true);
define('INSTALL' , false);
因为这两个常量在接下来的代码中经常用到,所以在这里先提一下。其中 INSIDE 是用来防止攻击的,而 INSTALL 呢是标识是否处于安装程序的进程中。
接下来就可以发现这个文件 include 了两个文件:分别是 ogame/extension.inc 和 ogame/common.php 。既然 login.php 依赖于这两个文件,我们不妨先来看看这两个文件。而 login.php 的实现我们可以回头再看。
其实这个文件虽然是 .inc 后缀,其实却是一个名副其实的 .php 文件。它的作用是防止非法程序包含此文件,从而提高整站的安全性。
这个文件有点大,值得好好分析一下。里面定义了几个全局变量:
$game_config = array();
$user = array();
$lang = array();
$IsUserChecked = false;
这几个变量以后用得到。后面还包含了几个 includes/ 目录下的脚本和 language/ 目录下的相应的本地语言的 lang_info.cfg 配置文件。
common.php 是安装和游戏两个程序所通用的,虽然关于安装的那部分很简单,但我们的焦点不在这方面,所以我们只关注 INSTALL != true 成立时执行的代码段。
代码段开始处,又 include 了 includes/vars.php、includes/db.php、includes/strings.php 等三个文件。其中 vars.php 定义了游戏的一些依赖关系和数值;db.php 引用了 ogame/db/mysql.php,定义了一些常用的数据库操作函数,比如马上做会用到的 doquery();strings.php 则是定义了几个简单的数字输出美化的函数。其中 vars.php 和 ogame/db/mysql.php 将会另文详述,现在你只需要知道这么多就可以了。
好,接着再跟踪下去可以发现程序从数据库的 config 表中读取游戏的配置,这些配置会填充在 $game_config 变量中,这是一个 array 对象(非 PHP 出身的程序员注意啦,PHP 的 array 除了能够利用 0…n 的下标访问外,更可以自定义键值,换句话说,它的 array 其实是一个“映射表”,类似于 Python 里的 dict 或 C++ STL 中的 Map 和 HashMap)。
因为 login.php 定义了 $InLogin 的值为 true,所以接下来跟 $InLogin 有关的逻辑都不会执行,所以现在我们先放过它们,等执行到他们的时候再来分析。接着往下看,是:
includeLang ("system");
includeLang ('tech');
这里出现了让人感到颇为突兀的函数 includeLang(),从字面上来看,应该是分语言(语种)进行 include 操作的函数,大概是用来实现 i18n 的工具。具体如何,大家跟我先按下 common.php 不表,去看看 includeLang(),弄清它的来龙去脉,再回来研究 common.php。
includeLang() 定义在 includes/unlocalised.php 文件中,这个文件定义了许多有用的小函数,但现在我们独独来关注 includeLang() 的实现:
function includeLang ($filename, $ext = '.mo') {
global $ugamela_root_path, $lang, $user;
if ($user['lang'] != '') {
$SelLanguage = $user['lang'];
} else {
$SelLanguage = DEFAULT_LANG;
}
include ($ugamela_root_path . "language/". $SelLanguage ."/". $filename.$ext);
}
哦!原来是个根据用户的所用的语种 include 相应的代码的“代理”!这下心里就完全悉然了。
了解了 includeLang() 的意义,现在我们对 includeLang(“system”) 就非常清楚(在默认语言的情况下)它其实就是 include(“./language/de/system.mo”),includeLang(“tech”) 就是 include(“./language/de/tech.mo”)。其实这两个 .mo 文件也是货真价实的 php 脚本文件,其中 system.mo 定义了系统相关的术语,而 tech.mo 定义的是游戏中科技系统相关的术语。而 include() 它们的意义在于填充 $lang 变量。
因为这时我们的账号还从来没有登陆过游戏,所以接下来执行 isset($user) 返回假值,对 common.php 的执行就结束了,现在让我们回到 login.php 中去吧~
include(./common.php) 之后是 includeLang(‘login’),根据前面的知识,我们知道这里 include 本地化的 login.mo 文件,它也是用来填充 $lang 变量的,里面定义了与登陆页面相关的术语,比如“密码错误,请重新收入”之类。
因为我们是从 index.php 重定义过来的,所以 $_POST 的真值测试为假,我们执行的是 login.php 代码中的最后一个 else 子句对应的代码段。其中查询了两次数据库,分别是为了获取最新注册的用户和当前在线人数。接下来最重要的两句代码就是:
$page = parsetemplate(gettemplate('login_body'), $parse);
display($page, $lang['Login']);
从代码中很容易读懂其中第一行的意义是根据已经写好的 login_body 模板生成登陆页,而第二行则是将页面内容返回给客户端(在这里的意义就是浏览器)。这两行代码中的 gettemplate()、parsetemplate() 和 display() 三个函数值得进一步深入,且看下文。
这个函数在 ogame/includes/unlocalised.php 中定义,接受一个 $templatename 参数。其中最重要的一句代码是:
$filename = $ugamela_root_path . TEMPLATE_DIR . TEMPLATE_NAME . '/' . $templatename . ".tpl";
根据 ogame/common.php 中的定义,TEMPLATE_DIR 的值是 ‘templates/’,TEMPLATE_NAME 的值是 ‘OpenGame’,那么可以知道 gettempalte(‘login_body’) 即是读取 ogame/templates/OpenGame/login_body.tpl 文件的内容。
这个函数也是定义在 ogame/includes/unlocalised.php 中,接受 $template 和 $array 两个参数,代码只有一行:利用正则表达式对 $template 中的特定字符串(通常来而言就是由 {} 括起来的内容)用 $array 的值进行替换,从而实现多语言的本地化。
这个函数定义在 ogame/includes/functions.php 中,原型是:function display ($page, $title = '', $topnav = true, $metatags = '', $AdminPage = false)。实现上包括了普通用户页眉、管理员页眉的区分,是否显示顶部的导航条、分级授权和调试都提供了支持,所以这个函数虽然短小,却值得仔细体味。其中调用的 StdUserHeader()、AdminUserHeader()、ShowTopNavigationBar()和 StdFooter() 并不复杂,其原理都是 parsetempalte(gettemplate(), …),大家完全可以自己去看一下。
最后,执行一句:echo $DisplayPage;,页面就显示到玩家的浏览器上了;这时我的源码也先告一段落,明天再来看看“用户验证”
分享到:
相关推荐
在Xnova(Ogame)V0.8版源码中,游戏逻辑包括资源采集、建筑升级、舰队组建和移动、防御设施部署等。这些逻辑在PHP脚本中定义,遵循预设的游戏规则,确保游戏的公平性和稳定性。例如,舰队的移动时间计算、资源的...
接下来,我们将深入探讨Xnova(Ogame)的游戏架构、主要技术以及源码分析。 首先,Xnova(Ogame)是用PHP语言开发的,这是一款广泛应用在Web开发中的脚本语言,以其易学易用和灵活性著称。PHP在处理动态网页内容、...
网页游戏Xnova,又名Ogame,是一款深受玩家喜爱的在线战略游戏,其源码的公开为开发者提供了深入了解游戏机制和进行二次开发的机会。这款基于PHP和MySQL数据库系统的开源项目,是研究网页游戏开发和优化的理想平台。...
《XNova 0.8SP1 源代码解析与技术探讨》 XNova,作为一款深受玩家喜爱的网页游戏,其背后的核心是强大的开发框架和精心设计的代码结构。这款基于PHP编程语言构建的游戏,结合MySQL数据库系统,为我们提供了一个深入...
《xNova_ogame_rowiss_》是一款基于网络的策略游戏源码,源自sourceforge平台。这款游戏源码的出现,为开发者提供了一个深入了解网络游戏开发,特别是太空策略游戏机制的宝贵资源。在这里,我们将深入探讨这款源码所...
本游戏由晗网(www.hanhot.com)汉化并运营,支持多国语言,新的算法,基于XNOVA0.9开发,有名人堂和客服支持系统,新增舰队,新增研究,新增新闻系统,可以与Facebook整合 (在中国大陆我想没用),Smarty的模板...
《ogame 2moonsV1.7.2源码详解》 ogame是一款深受玩家喜爱的在线策略游戏,而2moons是其在国外的知名变体,版本号为V1.7.2。源码的公开对于开发者来说是一次宝贵的深入理解游戏运作机制的机会,同时也是学习和研究...
比如普通玩家等级为0,游戏操作员为1,游戏管理员为2,而最高等级为3,代表管理员权限。这个变量不仅用于显示管理员链接,也可能用于游戏内其他需要权限控制的地方。 #### 数据库操作与数据展示 - **月球信息和...
在本篇关于PHP网页游戏学习的文章中,我们深入探讨了Xnova(ogame)源码的用户登录页面。首先,我们需要了解的是,游戏的主入口是index.php文件,当安装完成后,用户会自动进入登录流程。在这个流程中,有几个关键点...
PHP网页游戏Xnova(ogame)的源码解读是一个针对PHP开发人员而言的深入分析过程,它不仅涉及到游戏开发,还包含了网站应用的安全、性能优化、数据管理等多方面的知识。为了更好地解读这一内容,我们需要了解PHP编程的...
在本篇PHP网页游戏学习之Xnova(ogame)源码解读中,我们将重点探讨`functions.php`中的公共函数,这些函数是游戏逻辑的核心部分,用于处理各种游戏内的操作和验证。下面,我们将逐一解析这些函数的功能和用法。 1. `...
在本篇《PHP网页游戏学习之Xnova(ogame)源码解读(十二)》中,我们将探讨游戏中的研究页面——ResearchBuildingPage.php。在这个页面中,主要涉及到的是科技研究的功能,这部分相对简单,但有一些特定的设计需要...
本文主要对PHP网页游戏Xnova(ogame)源码中关于攻击任务页面的代码流程进行解读。在Xnova(ogame)游戏框架中,攻击任务是玩家舰队能够参与的一种重要行动,玩家通过派遣舰队对敌方星球发动攻击以获取资源和占领星球。...
【PHP网页游戏学习之Xnova(ogame)源码解读(三)】 在这一部分的学习中,我们将深入了解用户注册流程,以及Xnova游戏系统中涉及的一些核心数据表和功能。首先,作者提到了一系列的游戏数据库表格,它们各自有不同的...
在深入探讨Xnova(ogame)游戏源码的具体内容前,让我们先了解一些基础概念和背景信息。 Xnova(ogame)是一款基于PHP开发的网页游戏,它模仿了经典太空策略游戏Ogame的基本玩法。玩家在游戏中扮演一个太空舰队的指挥官...
在本篇关于PHP网页游戏Xnova(ogame)源码解读的文章中,主要探讨的是"建造总览"部分,即`buildings.php`文件。这个文件在Xnova游戏中扮演着重要角色,它不仅处理建筑金属矿产等基础建设,还包括了建筑、研究、造船厂...
PHP网页游戏学习之Xnova(ogame)源码解读(九)内容涉及的知识点主要集中在Xnova(ogame)这个PHP网页游戏的源码中,尤其是关于舰队相关的函数部分。舰队系统是网页游戏中的核心组成部分,它涉及到游戏内的战斗、探索...
在本系列文章的第十五篇中,我们将深入探讨Xnova(ogame)源码中的舰队活动部分,这对于我们理解游戏的核心互动机制至关重要。 在Xnova(ogame)中,舰队活动的触发机制与定时任务无关,它是由玩家的操作直接引发的...