《〈XNova/OGame〉源码笔记》(3-4)

《〈XNova/OGame〉源码笔记》

作者:赖勇浩(http://blog.csdn.net/lanphaday

一、 用户验证

ogame/login.php

用户在登陆页面输入用户名、密码之后提交 form,再转到服务器端,仍然是由 ogame/login.php 来完成校验工作。下来一起看来看相关的逻辑。

由于用户提交了内容,所以 $_POST 的真值测试为真,所以执行数据库查询,从 users 表中获取相应的 username 的记录。如果记录不存在,则由 message() 函数返回一个错误提示页(提示用户名不存在)。再次啰嗦一下,这里所谓的“返回…页面”通常是指调用前文所讲的 gettemplate()parsetemplate() display() 返回相关的的具体化的模板页面,以后除非特别情况,否则一律以“返回…页面”称之。而 message() 正是定义在 ogame/includes/functions.php 中的一个“返回错误信息页面”的函数。

如果用户名存在,则校验密码,密码错,则通过 message() 函数返回错误提示页;反之,则设置 cookie,再跳转到 ogame/frames.php

二、 游戏界面

ogame/frames.php

概要地说,这个文件就是显示游戏界面。值得注意的是在程序的入口,就定义 $InLogin = false,这是一个重要的操作,意义暂时保密。然后是通过几行代码拼凑出 URL,很简单的,不需要多讲。再接下来分别 include() ogame/extension.inc ogame/common.php,其中后者需要再跟踪进去讲一下,因为里面执行了前文没有提到的程序分枝。最后是输出一堆 HTML 代码,其中值得关注的是内建了两个 frame,分别对应 leftmenu.php overview.php,将在下文接着分析它们。而这些 HTML 代码则构成了第一屏游戏界面。吁……,终于看到游戏界面了,是不是长舒了一口气?我也是的!不过我还得马不停蹄地再跟踪 ogame/common.php

ogame/common.php

这个文件我们在第二节已经看过,但当时用户还没有登陆,所以 $InLogin 值为 true,且 $user 的真值测试为假,所以有一大段代码没有执行。而正如上一节所提醒的,$InLogin 的值为 false,又会有什么样的变化呢?

if ($InLogin != true) {

$Result = CheckTheUser ( $IsUserChecked );

$IsUserChecked = $Result['state'];

$user = $Result['record'];

}

首先是以上代码的条件满足,if 代码块中的 CheckTheUser() 被调用,传入的参数 $IsUserChecked 值为 falseCheckTheUser() 定义在 ogame/includes/functions/CheckUser.php 文件中,它调用了定义在 ogame/includes/functions/CheckCookies.php 中的 CheckCookies() 函数。CheckCookies() 就是利用 Cookie 中的信息来 check user 啦,其中有不少基于安全的考虑而写的代码,有兴趣的可以一读,没兴趣就算了。最后我们假定 CheckTheUser() 成功,用户名、密码什么的全对,那么 $user 变量就会被填充。

因为 $InLogin 值为 false,所以还会执行接下来的 elseif 分枝:对权限进行检查,并踢出不合格的连接。因为《XNova/OGame》在安全性方面的考虑颇多,以后将减少关注这方面的代码,精力将集中在游戏流程和游戏逻辑上。

从前面的代码可以看到当 CheckTheUser() 成功的时候,$user 将被置值,那么 if(isset($user)){} 中的代码块就会执行。这段代码块的功用是向数据库查询该用户上次登陆以来已经开始行动的和结束行动的舰队,然后调用 FlyingFleetHandler() 函数逐个处理之。这个函数我们暂时可以先放下,知道它用来处理飞行中的舰队的游戏逻辑就可以了。

然后 include(./rak.php) 处理排行榜,再调用 SetSelectedPlanet() 获取玩家上次离线时所在的星球,这个函数定义在 ogame/includes/functions/SetSellectPlanet.php;最后调用 CheckPlanetUsedFields() 更新当前星球的各种资源状态,它定义在 ogame/includes/functions/CheckPlanetUsedFields.php

ogame/leftmenu.php

还记得在看 ogame/frames.php 代码的时候讲它内建了两个 iframe,分别对应 leftmenu.php overview.php 吗?现在我们回过头来看看 leftmenu.php

这个文件很简单,只定义了一个函数,然后用 display() 向客户端传输它的返回值。与大多数页面显示代码一样,都是根据 $lang 获取 leftmenu.mo 文件,获得各种术语,然后是根据模板生成 HTML 代码。这里有两个地方需要注意,一是获取排行榜的参数(即玩家当前的排位)需要访问数据库,个人觉得可以放在玩家真的点击了排行榜的时候再去做;二是 $level 的值大于 0 的时候,会显示管理员链接,关于 $level 的数值所代表的级别定义在 system.mo 文件中,其中 0 是普通玩家,1 是游戏操作员,2 是游戏管理员,3 是管理员。

ogame/overview.php

overview.php 对应 leftmenu.php 产生的页面的“概览”链接,功能是显示星球当前的总体状况。刚看到 overview.php 的源代码的时候,吓了我一跳,怎么长啊!幸而后来看着发现逻辑是简单的,一点也不累人,心里悬着的一块石头就慢慢地放了下来。

开始的几行通过 CheckPlanetUsedFields() 更新月球的状态,非常简明,就不必多说了。之后进入 switch($mode) 的分枝,因为现在不关注重命名星球的实现,所以跳过它直接看看 default 段。

最先处理的是短消息提醒,短消息的处理是由 ogame/messages.php 来完成的。在这里先记一下,以后再来读短消息系统的实现。

接下来是对 Minier Raid 进行判断能否进行升级,然后是对自己的舰队、目标是自己的舰队、自己的星球和 iraks 从数据库中查询它们的状态,并构造相应的 html 字符串,以备返回给玩家。

overview.php 包含的逻辑颇多,因为我们现在还没有自己的舰队,甚至最初始的建筑也还没有建造出来,所以很简单浏览一下就可以,以后的章节里,我们还要再回来的。

你可能感兴趣的:(nova)