《〈XNova/OGame〉源码笔记》

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

一、      安装

现在去看安装部分,可能显得颇为怪异。其实不然,之前一路假设游戏已经安装完成,是为了早点看到游戏界面,看看页面是怎么样显示的,请求是如何执行的。事实上,在分析前面的代码的过程中,我感觉到有一个明显的不足,就是我们甚至不知道数据库的架构是怎么样的,有几张表,表里有什么字段,字段又是什么意义。这些问题,如果不去分析它的安装文件,已经没有再简单的方法了。所以让我们静一下心,拨去表面的浮华,看看它的内部机理。

ogame/iinstall/index.php

这就是安装程序的入口,在分析 ogame/index.php 的时候已经说过如果检测到 XNova/OGame还没有被安装,就跳转到 ogame/install/index.php。

前面仍然是例牌的 include() ogame/extension.php 和 ogame/common.php,还有两个新的文件值得注意,ogame/includes/databaseinfos.php 和 ogame/includes/migrateinfo.php。其中前者定义了各个数据库表的创建语句,后者则定义了一组 SQL 语句模板。

再读一下去,肯定会留意到那个巨大的 switch,根据 $mode 参数选择显示的页面。case 分枝其实是安装的流程,第一个分枝 intro 就不多说了,就是从 ogame/templates/install/ins_intro.tpl 读入简介,然后 parse 为相应语种的简介页面。

case “ins”:

ins 分枝是是真正的安装过程,分为 4 个页面,由 $page 变量控制显示哪一个页面。当 $page 值为 1 时,先做可能存在的错误处理;如果没有错误代码,那么就读取 ogame/templates/install/ins_form.tpl 模板,parse 成可以输入服务器地址、数据库名、表名前缀、用户名和密码的 html 页面。用户填入这些数据后,点击 install,就进行 $page 值为 2 的流程。

$page = 2 的流程其实就是创建数据库表的流程。首先程序从 _POST 获取用户填入的数据库信息,然后连接数据库,不成功的话,就跳转到 ogame/install/index.php?$mode=ins$pagee=1&error=* 的页面,其中 * 是相应的错误代号。处理错误的流程前面已经说过了。

假定填入的数据没有错误,数据库也连上了,就尝试写 ogame/config.php 文件,在其中记录下这些数据库的连接。

接着就执行由 ogame/install/databaseinfos.php 定义的数据库语句,分别创建 aks、annonce、alliance、banned、buddy、chat、config、errors、fleets、galaxy、iraks、lunas、messages、notes、planets、rw、statpoints 和 users 这几个表,其中有些表名用的是德语,或者缩写,比较难懂,我们暂时可以不去了解。ogame 比较有特定的是存在 config、errors 等表,将整个游戏的配置和代码放入了数据库中去。关于数据库的各个功能,我们在以后分析各个功能的时候就可以看到了,当然,现在根据表名也能猜个八九不离十。

$page = 3 是让用户输入管理员用户名、密码、email、星球和性别的简单页面,填完提交,进入 $page = 4 的流程。在这一步会检验用户的输入,如果不合法,则返回上一页,并显示相关的提示。一切 OK 的话,就从 ogame/config.php 中读入数据库的数据,连接数据库后先将管理员账号插入到 users 表中去,这样我们游戏的第一个用户就产生了。然后是像 planets 表中插入用户所拥有的星球,这样就产生了游戏中的第一颗星球。然后向 galaxy 表中加入刚才创建的新星球。最后要说的是对 config 表的修改,向 config 表中写入最后设置的星系位置、系统位置和行星位置,另外已注册用户数加一。

至此,安装完毕。

table config

我个人觉得 XNova/OGame的这个 config 表很有意思,所以单独地谈谈它。它只有两个字段,config_name 和 config_value,每一条记录都是一对一的映射。在安装的时候,插入了以下配置数据:

$QryInsertConfig    .= "('users_amount'          , '0'), ";

当前服务器注册的用户数

$QryInsertConfig    .= "('game_speed'            , '2500'), ";

游戏速度,那些私服的什么五倍速、十倍速就是在这里改的

$QryInsertConfig    .= "('fleet_speed'           , '2500'), ";

飞船速度,同样 X 倍速就在这里改

$QryInsertConfig    .= "('resource_multiplier'   , '1'), ";

资源系数,私服也会在这个数值上动手脚

$QryInsertConfig    .= "('Fleet_Cdr'             , '30'), ";

$QryInsertConfig    .= "('Defs_Cdr'              , '30'), ";

不知道这个 cdr 是什么意思,这两个字段是不是限定指挥官的数量?

$QryInsertConfig    .= "('initial_fields'        , '163'), ";

这个字段的意义也比较难明白,暂且跳过。

$QryInsertConfig    .= "('COOKIE_NAME'           , 'XNova'), ";

$QryInsertConfig    .= "('game_name'             , 'XNova'), ";

$QryInsertConfig    .= "('game_disable'          , '1'), ";

$QryInsertConfig    .= "('close_reason'          , 'Le jeu est installe, mais on a pas encore mis les parametre !'), ";

这几个字段就简单了,完全可以望文生义。

$QryInsertConfig    .= "('metal_basic_income'    , '20'), ";

$QryInsertConfig    .= "('crystal_basic_income'  , '10'), ";

$QryInsertConfig    .= "('deuterium_basic_income', '0'), ";

$QryInsertConfig    .= "('energy_basic_income'   , '0'), ";

在新建的星球(没有任何建筑时)星球的基础产量。

$QryInsertConfig    .= "('BuildLabWhileRun'      , '0'), ";

$QryInsertConfig    .= "('LastSettedGalaxyPos'   , '1'), ";

$QryInsertConfig    .= "('LastSettedSystemPos'   , '8'), ";

$QryInsertConfig    .= "('LastSettedPlanetPos'   , '3'), ";

最后设置的星系、系统和行星的位置。

$QryInsertConfig    .= "('urlaubs_modus_erz'     , '1'), ";

$QryInsertConfig    .= "('noobprotection'        , '1'), ";

$QryInsertConfig    .= "('noobprotectiontime'    , '5000'), ";

$QryInsertConfig    .= "('noobprotectionmulti'   , '5'), ";

新手保护相关的配置。

$QryInsertConfig    .= "('forum_url'             , '../forum' ), ";

$QryInsertConfig    .= "('OverviewNewsFrame'     , '1' ), ";

$QryInsertConfig    .= "('OverviewNewsText'      , 'Bienvenue sur le nouveau serveur XNova' ), ";

$QryInsertConfig    .= "('OverviewExternChat'    , '0' ), ";

$QryInsertConfig    .= "('OverviewExternChatCmd' , '' ), ";

$QryInsertConfig    .= "('OverviewBanner'        , '0' ), ";

$QryInsertConfig    .= "('OverviewClickBanner'   , '' ), ";

论坛地址和概况页面的一些设置。

$QryInsertConfig    .= "('debug'                 , '0') ";

是否运行在调试模式。

$QryInsertConfig    .= ";";

《〈XNova/OGame〉源码笔记》(5)相关推荐

  1. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  2. java下载pdf6_疯狂java讲义第6版 电子版(pdf格式)

    疯狂java讲义第6版pdf是李刚打造的经典java编程图书的最新版,为了帮助更多的读者能真正掌握Java编程,感受到Java语言的魅力,领会到Java编程的快乐,作者根据多年来的Java授课经验,精 ...

  3. 《疯狂Java讲义精粹》读书笔记2 ------ 多态

    -----------------<疯狂Java讲义精粹>2读书笔记--------------- Java引用变量有两个类型: · 编译时类型(由声明该变量时使用的类型决定) · 运行时 ...

  4. java画图颜色_手绘板,多种颜色选择。我抄的《疯狂java讲义》的,包我乱导的,但代码能用。...

    [java]代码库import javax.swing.*; import java.awt.image.*; import java.awt.datatransfer.*; import javax ...

  5. 《疯狂Java讲义》学习笔记 第六章 面向对象(下)

    <疯狂Java讲义>学习笔记 第六章 面向对象(下) 6.1包装类 基本数据类型 包装类 byte Byte short Short int Integer long Long char ...

  6. 李刚疯狂java讲义第3_【Java】-NO.16.EBook.4.Java.1.009-【疯狂Java讲义第3版 李刚】- 泛型...

    1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.009-[疯狂Java讲义第3版 李刚]- 泛型 Style:EBook Series:Java Si ...

  7. [疯狂Java讲义精粹] 第十三章|类加载机制与反射

    java.lang.reflect包下的接口和类, 包括Class, Method, Filed,Constructor和Array等, 这些类分别代表类, 方法, Field, 构造器和数组, Ja ...

  8. 疯狂Java讲义:P200接口

    接口 Output package lee; public interface Output {//接口里定义的成员变量只能是常量int MAX_CACHE_LINE=50;//接口里定义的只能是pu ...

  9. 疯狂Java讲义_Chapter4_编写控制台的五子棋游戏

    编写控制台的五子棋游戏 昨天复习了下<疯狂Java讲义>,完成前几章的习题, 现在基本完成了控制台五子棋游戏的编写,能够按照要求 保证用户下和电脑下的棋上不能已经有棋子 判断横.竖.左斜. ...

  10. 《疯狂Java讲义》读书笔记5

    目录 Java的集合类 Inerator 接口 Set 集合 HashSet 类 LinkedHashSet 类 TreeSet 类 EnumSet 类 List 集合 ArrayList 和 Vec ...

最新文章

  1. 免费查找AI最优论文神器来啦:一键出结果,分分钟提取论文表格、最新数据...
  2. Linux与云计算——第二阶段 第五章:存储Storage服务器架设—分布式存储GlusterFS基础...
  3. Android 自定义WebView弹窗及屏蔽弹窗
  4. 【Unity】Update()和FixedUpdate()
  5. canny算法的实现(android加载图片,数组写入文件换行)
  6. 如何让我们的VMware虚拟机上网——转载
  7. ORACLE 10G rman 备份脚本
  8. 前端技术栈---Vue(1)安装与初始化
  9. 狂雨小说(KYXS)CMS 代码审计
  10. 16QAM-调制解调MATLAB
  11. 时间序列分析思维导图
  12. Edison 蓝牙模块 学习笔记
  13. 深度学习笔记:05手算梯度下降法,详解神经网络迭代训练过程
  14. 关于KEILC51和KEILMDK的合并
  15. 罗格斯的计算机科学博士奖学金,罗格斯大学奖学金
  16. 使用EDU邮箱申请JetBrains学生包免费使用一年JetBrains全家桶
  17. 中国传统风格水墨实时渲染
  18. java的LocalDateTime类来获取当天时间、前一天时间,本周的开始和结束时间、本月的开始和结束时间
  19. 主板声卡坏了会不会有电流声_拯救无声电脑,还能升级音质,独立声卡音频转接头来解决...
  20. python项目之杠子老虎鸡虫

热门文章

  1. mysql 8.0 解决报错Public Key Retrieval is not allowed
  2. INERT REPLACE UPDATE区别
  3. 基于51单片机pwm调光护眼台灯智能检测光强光控灯设计proteus仿真原理图PCB
  4. myeclipse 注册码(8.5版本)
  5. 华为智慧屏se55怎么样?
  6. Hybrid的配置(一)
  7. 三天搞定射频识别技术(三)3.2PN532
  8. 武汉纺织大学计算机考研真题,武汉纺织大学数学与计算机学院数据结构历年考研真题汇编...
  9. 循环右移, c = c ~(~0 (32-n))
  10. matlab课程上机考试,十道编程题(附代码)