PHP网页游戏学习之Xnova(ogame)源码解读(十六)

十九、攻击任务(MissionCaseAttack.php)

按照舰队任务的编号,排在第一个的就是攻击任务。这个代码很长,看的时候要有耐心。
好在引用的内容并不是很多,并且给出了详细的注释,读者不会晕头转向。

function MissionCaseAttack ($FleetRow)
{
  global $user, $phpEx, $xnova_root_path, $pricelist, $lang, $resource, $CombatCaps;
   // 在舰队的记录中,fleet_start_time代表的不是出发时间,而是到达目的地时间
   // 代表出发时间的是start_time
   // 此外还有fleet_end_time 这个是回到家的时间
    // fleet_end_stay 这个是结束逗留的时间(联合防御和远征任务会用到)
    // 所以下面这个判断的意思是“舰队到达了目的地”,而不是“舰队起飞了”
    if ($FleetRow['fleet_start_time'] <= time()) {
    // fleet_mess是用来记录舰队的状态的,基本可以理解为是在前进途中还是返航途中
    // 但感觉利用得并不好,如果只有两个状态,可以用true 和 false来记录
    // 所以我把它设为了0,1,2三个状态,对于需要停留的任务,停留时就处于第三个状态
    if ($FleetRow['fleet_mess'] == 0) {
      // ↓↓ 这个判断是试探存放战斗数据的文件是否存在
       // 如果文件不存在,就中断操作,提示联系管理员
       if (!isset($CombatCaps[202]['sd'])) {
        message("<span style="FONT-FAMILY: ">" . $lang['sys_no_vars'] . "</span>", $lang['sys_error'], "fleet." . $phpEx, 2);
      }
      // ↓↓ 开始是一系列的数据库查询,取得攻防双方的舰队数量和科技等级
      // 根据舰队信息取得防守方星球数据
      $QryTargetPlanet = "SELECT * FROM {{table}} ";
      $QryTargetPlanet .= "WHERE ";
      $QryTargetPlanet .= "`galaxy` = '" . $FleetRow['fleet_end_galaxy'] . "' AND ";
      $QryTargetPlanet .= "`system` = '" . $FleetRow['fleet_end_system'] . "' AND ";
      $QryTargetPlanet .= "`planet` = '" . $FleetRow['fleet_end_planet'] . "' AND ";
      $QryTargetPlanet .= "`planet_type` = '" . $FleetRow['fleet_end_type'] . "';";
      $TargetPlanet = doquery($QryTargetPlanet, 'planets', true);
      $TargetUserID = $TargetPlanet['id_owner'];
      // 根据舰队信息取得攻击方信息
      $QryCurrentUser = "SELECT * FROM {{table}} ";
      $QryCurrentUser .= "WHERE ";
      $QryCurrentUser .= "`id` = '" . $FleetRow['fleet_owner'] . "';";
      $CurrentUser = doquery($QryCurrentUser , 'users', true);
      $CurrentUserID = $CurrentUser['id'];
      // 由星球数据取得目标星球的所有者的信息
       $QryTargetUser = "SELECT * FROM {{table}} ";
      $QryTargetUser .= "WHERE ";
      $QryTargetUser .= "`id` = '" . $TargetUserID . "';";
      $TargetUser = doquery($QryTargetUser, 'users', true);
      // 然后取得双方的科技信息
       // 其实下面这两个完全可以与上面两个查询整到一起
      $QryTargetTech = "SELECT ";
      $QryTargetTech .= "`military_tech`, `defence_tech`, `shield_tech` ";
      $QryTargetTech .= "FROM {{table}} ";
      $QryTargetTech .= "WHERE ";
      $QryTargetTech .= "`id` = '" . $TargetUserID . "';";
      $TargetTechno = doquery($QryTargetTech, 'users', true);
      $QryCurrentTech = "SELECT ";
      $QryCurrentTech .= "`military_tech`, `defence_tech`, `shield_tech` ";
      $QryCurrentTech .= "FROM {{table}} ";
      $QryCurrentTech .= "WHERE ";
      $QryCurrentTech .= "`id` = '" . $CurrentUserID . "';";
      $CurrentTechno = doquery($QryCurrentTech, 'users', true);
      // ↑↑ 如果有其他的能影响舰队三围的项目(比如指挥官等),也应该在这里一并取出来
      // 生成防守方的舰队(防御)
       // 如果考虑联合防御,在上面还应该把这个星球上联合防御的舰队提取出来
       // 然后一起计算数量和科技水平
       for ($SetItem = 200; $SetItem 0) {
          $TargetSet[$SetItem]['count'] = $TargetPlanet[$resource[$SetItem]];
        }
      }
      // 生成攻击方的舰队,也是用数组存放。'fleet_array'是不能直接拿来用的
       // 这个字段的结构是  编号,数量;编号,数量; ……
       // 所以使用时需要用两次explode把它打散然后存进数组
       $TheFleet = explode(";", $FleetRow['fleet_array']);
      foreach($TheFleet as $a => $b) {
        if ($b != '') {
          $a = explode(",", $b);
          $CurrentSet[$a[0]]['count'] = $a[1];
        }
      }
      // 包含进战斗引擎,ready to fight
      include_once($xnova_root_path . 'includes/ataki.' . $phpEx);
      // 在输入信息之前采集时间
       $mtime = microtime();
      $mtime = explode(" ", $mtime);
      $mtime = $mtime[1] + $mtime[0];
      $starttime = $mtime;
      // 将双方舰队和科技输入战斗引擎,并用$walka来记录输出结果
       $walka = walka($CurrentSet, $TargetSet, $CurrentTechno, $TargetTechno);
      // 再采集时间,得到战斗过程所用的时间
       // 也就是“战斗报告产生于 x.xxxxxxxxxx 秒”的由来
      $mtime = microtime();
      $mtime = explode(" ", $mtime);
      $mtime = $mtime[1] + $mtime[0];
      $endtime = $mtime;
      $totaltime = ($endtime - $starttime);
      // 分别用一个单独的数组来记录攻击方的剩余舰队信息、
       $CurrentSet = $walka["atakujacy"];
      // ……防守方的舰队信息、
       $TargetSet = $walka["wrog"];
      // ……战斗的胜负结果、
       $FleetResult = $walka["wygrana"];
      // ……每一轮的详细情况、
       $dane_do_rw = $walka["dane_do_rw"];
      // 以及双方的损失和废墟情况
       $zlom = $walka["zlom"];
      // 计算攻击方剩下的单位,顺便把装载量也一并计算进去了
      $FleetArray = "";
      $FleetAmount = 0;
      $FleetStorage = 0;
      foreach ($CurrentSet as $Ship => $Count) {
        $FleetStorage += $pricelist[$Ship]["capacity"] * $Count['count'];
        // 用$FleetArray记载舰队情况,转换成数据库里字段的格式,准备“入库”
          $FleetArray .= $Ship . "," . $Count['count'] . ";";
        $FleetAmount += $Count['count'];
      }
      $FleetStorage -= $FleetRow["fleet_resource_metal"];
      $FleetStorage -= $FleetRow["fleet_resource_crystal"];
      $FleetStorage -= $FleetRow["fleet_resource_deuterium"];
      // 计算防守星球战后的情况
       $TargetPlanetUpd = "";
  if (!is_null($TargetSet)) {
        foreach($TargetSet as $Ship => $Count) {
          $TargetPlanetUpd .= "`" . $resource[$Ship] . "` = '" . $Count['count'] . "', ";
        }
  }
      // 如果战斗结果为攻击方获胜,则开始计算掠夺资源的情况 ↓↓
      // 这里可以include进PlanetResourceUpdate.php,在掠夺之前先更新目标星球的资源
       $Mining['metal'] = 0;
      $Mining['crystal'] = 0;
      $Mining['deuter'] = 0;
      if ($FleetResult == "a") {
        if ($FleetStorage > 0) {
          $metal = $TargetPlanet['metal'] / 2;
          $crystal = $TargetPlanet['crystal'] / 2;
          $deuter = $TargetPlanet["deuterium"] / 2;
          if (($metal) > $FleetStorage / 3) {
            $Mining['metal'] = $FleetStorage / 3;
            $FleetStorage = $FleetStorage - $Mining['metal'];
          } else {
            $Mining['metal'] = $metal;
            $FleetStorage = $FleetStorage - $Mining['metal'];
          }
          if (($crystal) > $FleetStorage / 2) {
            $Mining['crystal'] = $FleetStorage / 2;
            $FleetStorage = $FleetStorage - $Mining['crystal'];
          } else {
            $Mining['crystal'] = $crystal;
            $FleetStorage = $FleetStorage - $Mining['crystal'];
          }
          if (($deuter) > $FleetStorage) {
            $Mining['deuter'] = $FleetStorage;
            $FleetStorage = $FleetStorage - $Mining['deuter'];
          } else {
            $Mining['deuter'] = $deuter;
            $FleetStorage = $FleetStorage - $Mining['deuter'];
          }
        }
      }
      // ↑↑ 到这里为止就计算结束了,但如果星球上金属巨多,但晶体和重氢几乎没有
       // 那就会出现装了1/3仓的金属,剩下2/3仓全都空着
       // 所以可以考虑自己把掠夺方法完善一下,也不是很难
      $Mining['metal'] = round($Mining['metal']);
      $Mining['crystal'] = round($Mining['crystal']);
      $Mining['deuter'] = round($Mining['deuter']);
      // ↓↓ 更新数据库
       $QryUpdateTarget = "UPDATE {{table}} SET ";
      $QryUpdateTarget .= $TargetPlanetUpd;
      $QryUpdateTarget .= "`metal` = `metal` - '" . $Mining['metal'] . "', ";
      $QryUpdateTarget .= "`crystal` = `crystal` - '" . $Mining['crystal'] . "', ";
      $QryUpdateTarget .= "`deuterium` = `deuterium` - '" . $Mining['deuter'] . "' ";
      $QryUpdateTarget .= "WHERE ";
      $QryUpdateTarget .= "`galaxy` = '" . $FleetRow['fleet_end_galaxy'] . "' AND ";
      $QryUpdateTarget .= "`system` = '" . $FleetRow['fleet_end_system'] . "' AND ";
      $QryUpdateTarget .= "`planet` = '" . $FleetRow['fleet_end_planet'] . "' AND ";
      $QryUpdateTarget .= "`planet_type` = '" . $FleetRow['fleet_end_type'] . "' ";
      $QryUpdateTarget .= "LIMIT 1;";
      doquery($QryUpdateTarget , 'planets');
      $QryUpdateGalaxy = "UPDATE {{table}} SET ";
      $QryUpdateGalaxy .= "`metal` = `metal` + '" . $zlom['metal'] . "', ";
      $QryUpdateGalaxy .= "`crystal` = `crystal` + '" . $zlom['crystal'] . "' ";
      $QryUpdateGalaxy .= "WHERE ";
      $QryUpdateGalaxy .= "`galaxy` = '" . $FleetRow['fleet_end_galaxy'] . "' AND ";
      $QryUpdateGalaxy .= "`system` = '" . $FleetRow['fleet_end_system'] . "' AND ";
      $QryUpdateGalaxy .= "`planet` = '" . $FleetRow['fleet_end_planet'] . "' ";
      $QryUpdateGalaxy .= "LIMIT 1;";
      doquery($QryUpdateGalaxy , 'galaxy');
      // ↓↓ 计算废墟和损失的情况
       $FleetDebris = $zlom['metal'] + $zlom['crystal'];
      $StrAttackerUnits = sprintf ($lang['sys_attacker_lostunits'], pretty_number ($zlom["atakujacy"]));
      $StrDefenderUnits = sprintf ($lang['sys_defender_lostunits'], pretty_number ($zlom["wrog"]));
      $StrRuins = sprintf ($lang['sys_gcdrunits'], pretty_number ($zlom["metal"]), $lang['Metal'], pretty_number ($zlom['crystal']), $lang['Crystal']);
      $DebrisField = $StrAttackerUnits . "" . $StrDefenderUnits . "" . $StrRuins;
      // ↓↓ 计算产月概率
       $MoonChance = $FleetDebris / 100000;
      if ($FleetDebris > 2000000) {
        $MoonChance = 20;
      }
      if ($FleetDebris = 100000) {
        $UserChance = mt_rand(1, 100);
        $ChanceMoon = sprintf ($lang['sys_moonproba'], $MoonChance);
      }
      // 如果RP够好,就能产生月亮了。当然前提是这个坐标上没有月亮
       if (($UserChance > 0) and ($UserChance $MoonChance) {
        ……
       }
      // ↓↓ 从这里开始生成战斗报告,很长,但并不复杂
       $AttackDate = date("r", $FleetRow["fleet_start_time"]);
      $title = sprintf ($lang['sys_attack_title'], $AttackDate);
      $raport = "" . $title . "";
      $zniszczony = false;
      $a_zestrzelona = 0;
      // ↓↓ 双方攻防信息。如果有其他能影响舰队三围的,也要在这里加进去
       // 当然这里的数据只是显示在战报中而已,是不会影响岛实际战斗的
       $AttackTechon['A'] = $CurrentTechno["military_tech"] * 10;
      $AttackTechon['B'] = $CurrentTechno["defence_tech"] * 10;
      $AttackTechon['C'] = $CurrentTechno["shield_tech"] * 10;
      $AttackerData = sprintf ($lang['sys_attack_attacker_pos'], $CurrentUser["username"],$FleetRow['fleet_start_galaxy'], $FleetRow['fleet_start_system'], $FleetRow['fleet_start_planet']);
      $AttackerTech = sprintf ($lang['sys_attack_techologies'], $AttackTechon['A'],$AttackTechon['B'], $AttackTechon['C']);
      $DefendTechon['A'] = $TargetTechno["military_tech"] * 10;
      $DefendTechon['B'] = $TargetTechno["defence_tech"] * 10;
      $DefendTechon['C'] = $TargetTechno["shield_tech"] * 10;
      $DefenderData = sprintf ($lang['sys_attack_defender_pos'], $TargetUser["username"], $FleetRow['fleet_end_galaxy'], $FleetRow['fleet_end_system'], $FleetRow['fleet_end_planet']);
      $DefenderTech = sprintf ($lang['sys_attack_techologies'], $DefendTechon['A'], $DefendTechon['B'], $DefendTechon['C']);
      // 根据战斗中每一轮的详细情况生成交火的细节,包括每一轮的数量,攻防值,造成和吸收了多少伤害等
       // 有一些键值可能需要看了战斗引擎才会明白它代表的什么,所以看不懂也没关系 ↓↓
      foreach ($dane_do_rw as $a => $b) {
       ……
       }
      // ↓↓ 根据胜负结果显示相应的结尾
       switch ($FleetResult) {
       ……
       }
      // 战斗报告生成于 x.xxxxxxxxxxxx 秒
       $SimMessage = sprintf ($lang['sys_rapport_build_time'], $totaltime);
      $raport .= $SimMessage . "";
      // ↓↓ 将战斗报告编码,存入数据库
       $dpath = (!$user["dpath"]) ? DEFAULT_SKINPATH : $user["dpath"];
      $rid = md5($raport);
      $QryInsertRapport = "INSERT INTO {{table}} SET ";
      $QryInsertRapport .= "`time` = UNIX_TIMESTAMP(), ";
      $QryInsertRapport .= "`id_owner1` = '" . $FleetRow['fleet_owner'] . "', ";
      $QryInsertRapport .= "`id_owner2` = '" . $TargetUserID . "', ";
      $QryInsertRapport .= "`rid` = '" . $rid . "', ";
      $QryInsertRapport .= "`a_zestrzelona` = '" . $a_zestrzelona . "', ";
      $QryInsertRapport .= "`raport` = '" . addslashes ($raport) . "';";
      doquery($QryInsertRapport , 'rw');
      // ↓↓ 这里才是发给玩家的消息,其中有一个onclick的链接到上面的战报
       // 下面这个是发给攻击方的,根据战斗结果不同,标题也有不同的颜色
       $raport = "";
      $raport .= "";
      if ($FleetResult == "a") {
        $raport .= "";
      } elseif ($FleetResult == "r") {
        $raport .= "";
      } elseif ($FleetResult == "w") {
        $raport .= "";
      }
      $raport .= ……
       // ↓ 这里突然回到计算攻击舰队的资源装载量,其实完全可以挪到上面去
       $Mining['metal'] = $Mining['metal'] + $FleetRow["fleet_resource_metal"];
      $Mining['crystal'] = $Mining['crystal'] + $FleetRow["fleet_resource_crystal"];
      $Mining['deuter'] = $Mining['deuter'] + $FleetRow["fleet_resource_deuterium"];
      // 更新舰队信息
       $QryUpdateFleet = "UPDATE {{table}} SET ";
      $QryUpdateFleet .= "`fleet_amount` = '" . $FleetAmount . "', ";
      $QryUpdateFleet .= "`fleet_array` = '" . $FleetArray . "', ";
      $QryUpdateFleet .= "`fleet_mess` = '1', ";
      $QryUpdateFleet .= "`fleet_resource_metal` = '" . $Mining['metal'] . "', ";
      $QryUpdateFleet .= "`fleet_resource_crystal` = '" . $Mining['crystal'] . "', ";
      $QryUpdateFleet .= "`fleet_resource_deuterium` = '" . $Mining['deuter'] . "' ";
      $QryUpdateFleet .= "WHERE fleet_id = '" . $FleetRow['fleet_id'] . "' ";
      $QryUpdateFleet .= "LIMIT 1 ;";
      doquery($QryUpdateFleet , 'fleets');
      // 发送战斗消息给攻击方
       SendSimpleMessage ($CurrentUserID, '', $FleetRow['fleet_start_time'], 3, $lang['sys_mess_tower'], $lang['sys_mess_attack_report'], $raport);
      // ↓ 又突然插进来开始计算战斗经验和战斗次数
       // 严重怀疑coder写这个文件时是不是喝高了
       $AddPoint = $CurrentUser['xpraid'] + 1;
      $QryUpdateOfficier = "UPDATE {{table}} SET ";
      $QryUpdateOfficier .= "`xpraid` = '" . $AddPoint . "' ";
      $QryUpdateOfficier .= "WHERE id = '" . $CurrentUserID . "' ";
      $QryUpdateOfficier .= "LIMIT 1 ;";
      doquery($QryUpdateOfficier, 'users');
      $RaidsTotal = $CurrentUser['raids'] + 1;
      if ($FleetResult == "a") {
        $RaidsWin = $CurrentUser['raidswin'] + 1;
        $QryUpdateRaidsCompteur = "UPDATE {{table}} SET ";
        $QryUpdateRaidsCompteur .= "`raidswin` ='" . $RaidsWin . "', ";
        $QryUpdateRaidsCompteur .= "`raids` ='" . $RaidsTotal . "' ";
        $QryUpdateRaidsCompteur .= "WHERE id = '" . $CurrentUserID . "' ";
        $QryUpdateRaidsCompteur .= "LIMIT 1 ;";
        doquery($QryUpdateRaidsCompteur, 'users');
      } elseif ($FleetResult == "r" || $FleetResult == "w") {
        $RaidsLoose = $CurrentUser['raidsloose'] + 1;
        $QryUpdateRaidsCompteur = "UPDATE {{table}} SET ";
        $QryUpdateRaidsCompteur .= "`raidswin` ='" . $RaidsLoose . "', ";
        $QryUpdateRaidsCompteur .= "`raids` ='" . $RaidsTotal . "' ";
        $QryUpdateRaidsCompteur .= "WHERE id = '" . $CurrentUserID . "' ";
        $QryUpdateRaidsCompteur .= "LIMIT 1 ;";
        doquery($QryUpdateRaidsCompteur, 'users');
      }
      // ↓↓ 终于又回来了,开始写发给防御方的消息
       $raport2 = "";
      $raport2 .= "";
      if ($FleetResult == "a") {
        $raport2 .= "";
      } elseif ($FleetResult == "r") {
        $raport2 .= "";
      } elseif ($FleetResult == "w") {
        $raport2 .= "";
      }
      $raport2 .= $lang['sys_mess_attack_report'] . " [" . $FleetRow['fleet_end_galaxy'] . ":" . $FleetRow['fleet_end_system'] . ":" . $FleetRow['fleet_end_planet'] . "]";
      SendSimpleMessage ($TargetUserID, '', $FleetRow['fleet_start_time'], 3, $lang['sys_mess_tower'], $lang['sys_mess_attack_report'], $raport2);
    }
      // ↓↓ 如果舰队回到出发地了,就开始卸货,然后飞机入库
       $fquery = "";
      if ($FleetRow['fleet_end_time'] $Count) {
          $fquery .= "`" . $resource[$Ship] . "` = `" . $resource[$Ship] . "` + '" . $Count['count'] . "', ";
        }
      } else {
        $fleet = explode(";", $FleetRow['fleet_array']);
        foreach($fleet as $a => $b) {
          if ($b != '') {
            $a = explode(",", $b);
            $fquery .= "{$resource[$a[0]]}={$resource[$a[0]]} + {$a[1]}, \n";
          }
        }
      }
      // → 到最后别忘了删除这一条舰队记录,不然会一直占用航道。对其他舰队任务也是一样
       doquery ("DELETE FROM {{table}} WHERE `fleet_id` = " . $FleetRow["fleet_id"], 'fleets');
      if (!($FleetResult == "w")) {
        $QryUpdatePlanet = "UPDATE {{table}} SET ";
        $QryUpdatePlanet .= $fquery;
        $QryUpdatePlanet .= "`metal` = `metal` + " . $FleetRow['fleet_resource_metal'] . ", ";
        $QryUpdatePlanet .= "`crystal` = `crystal` + " . $FleetRow['fleet_resource_crystal'] . ", ";
        $QryUpdatePlanet .= "`deuterium` = `deuterium` + " . $FleetRow['fleet_resource_deuterium'] . " ";
        $QryUpdatePlanet .= "WHERE ";
        $QryUpdatePlanet .= "`galaxy` = " . $FleetRow['fleet_start_galaxy'] . " AND ";
        $QryUpdatePlanet .= "`system` = " . $FleetRow['fleet_start_system'] . " AND ";
        $QryUpdatePlanet .= "`planet` = " . $FleetRow['fleet_start_planet'] . " AND ";
        $QryUpdatePlanet .= "`planet_type` = " . $FleetRow['fleet_start_type'] . " LIMIT 1 ;";
        doquery($QryUpdatePlanet, 'planets');
      }
    }
  }
}
(0)

相关推荐

  • PHP网页游戏学习之Xnova(ogame)源码解读(八)

    十一.公共函数(functions.php) 本来打算写建筑页面的分析,但是建筑页面东西比较多,一天时间也写不完:而且我们还有很多函数要经常用到,先简单介绍下这些函数还是有必要的:下面我们还是以注释方式说明. // ------------------------------ // //检查用户是否假期模式,这个函数没有被调用过 // function check_urlaubmodus ($user) //输出目前登陆用户假期模式剩余时间,这个函数没有被调用过 function check_u

  • PHP网页游戏学习之Xnova(ogame)源码解读(一)

    一. 引言 xnova(ogame)是一款世界上最火的战争策略类网页游戏之一,也是大部分同类网页游戏效仿的对象.你只需要网页浏览器,无需下载客户端就可进行的网络游戏. Xnova是个怎么样的游戏? 你是一个跨星系的统治者,利用不同的战略扩大你的实力.你将从一个自己的星球上开始你的事业,在那里你用现有的资源建造一个你的经济和军事基础.通过科学 研究你获得达到新的.优势的技术的入口和新的武器系统.随着游戏的进行你将对多个星球移民,与其它的玩家联盟,与其它的玩家作生意或者发动战争.无论你想 要做什么,

  • PHP网页游戏学习之Xnova(ogame)源码解读(十五)

    十八.舰队活动(FlyingFleetHandler.php) 在前文中我们曾经初步研究过舰队活动的源码,提到过舰队活动的触发.现在我进一步分析Xnova中舰队活动,这些在本质上是由玩家触发的,并不是由定时器在进行定时计算.舰队活动的触发是在common.php中进行的,所以入口就在这文件中,代码如下: //检查是否有到达目的地的舰队 $_fleets = doquery("SELECT * FROM {{table}} WHERE 'fleet_start_time' <= '"

  • PHP网页游戏学习之Xnova(ogame)源码解读(十二)

    十五.研究页面(ResearchBuildingPage.php) 研究因为没有队列,所以相对简单一些:但是也有一些比较特殊的东西.我们先看研究之前的一个处理函数HandleTechnologieBuild(). 这个函数是处理现在的科技研究的,其中b_tech_planet字段是研究的星球ID,b_tech字段是完成研究的时间点,b_tech_id字段是研究的具体科技字段名.函数逻辑不难,我就不仔细讲解了,大家自己看看,下面正式进入研究页面: 首先要检查当前星球是否有研究所. 然后检查当前星球

  • PHP网页游戏学习之Xnova(ogame)源码解读(十四)

    十七.资源更新(PlanetResourceUpdate.php页面) 前面基本把重要的功能讲解完了,这章节我们分析重要的一个函数PlanetResourceUpdate,主要功能是更新资源.制造船舰和防御单位:代码很有条理,下面是详细的说明: 1.计算星球的最大存储空间,包括系统设置的浮动值 2.计算星球三种资源的产量和能量消耗总量,包括专家的加成 3.如果星球是月球,以上计算的产量和能量直接为0 4.计算上次更新资源到现在的时间 5.计算由于能量比率而引起的产量变化,能量为0的时候,只有基本

  • PHP网页游戏学习之Xnova(ogame)源码解读(十)

    十三. 建造总览(buildings.php) 从这篇文章开始,对xnova的研究重点放在流程上面,其实就是大量的函数:至于页面的构造将不再仔细解释. buildings.php文件不只是处理建筑金属矿产等,而是包括了建筑.研究.造船厂.防御四个功能:通过传递不同的参数来决定进入哪个功能,所以这个文件其实是一个导航文件.下面我们简单解释下这个文件. //更新当前星球的建筑队列,比较复杂 UpdatePlanetBatimentQueueList ( $planetrow, $user ); //

  • PHP网页游戏学习之Xnova(ogame)源码解读(十三)

    十六.造船和防御(FleetBuildingPage.php与DefensesBuildingPage.php页面) 先说造船厂页面,其实这个页面中并没有真正的造船,只是把要造的船和数量保存到数据库中:产生船舰的代码在另外一个函数里面.下面我们开始分析这个页面,并且也按照前面的思路,先讲解构造页面的代码. 首先判断本星球是否已有造船厂,没有当然要提示. 下面使用循环语句,构造出每种船舰的建造页面,这段代码我觉得不需要再详细讲解了. 接下来是要显示正在制造的船舰列表,要脚本动态显示,实际上是假像:

  • PHP网页游戏学习之Xnova(ogame)源码解读(九)

    十二.舰队相关函数(unlocalised.php) 本节将把舰队派遣相关的函数做个说明,继续以注释方式说明:由于这次涉及的函数比较多,需要花不少时间来整理消化. // ------------------------------------------------------------------- // // 以下是舰队派遣需要用到的函数列表 // // -------------------------------------------------------------------

  • PHP网页游戏学习之Xnova(ogame)源码解读(十一)

    十四.建筑页面(BatimentBuildingPage.php) 现在开始解析真正的建筑页面,里面用到的函数不少,不过都不难,我们一起来看. 一开始先检查星球的已使用空间并更新,使用函数CheckPlanetUsedFields,这个函数前面讲过,实现也不难. 接下来这个是我们前面重点讲过的结构,就是判断是否输入:所以我们先跳到这段代码的后面看,但是这里有几个函数是处理一些建筑队列的. 1. SetNextQueueElementOnTop:我们讲过,处理队列中的下一个建筑 2. ShowBu

  • PHP网页游戏学习之Xnova(ogame)源码解读(六)

    九.公共代码(common.php) Common.php是Xnova的公共代码,几乎每次点击都会被执行,所以这里要是优化的好,那么整个程序的效率都会有提升:当然这个文件调用的其他代码也要一并优化才行. $game_config = array(); $user = array(); $lang = array(); $link = ""; $IsUserChecked = false; 变量$game_config存放整个游戏的参数数据,每次都要读数据库,可以优化,优化方式比如保存在

  • PHP网页游戏学习之Xnova(ogame)源码解读(三)

    四. 用户注册(reg.php) 在看用户注册之流程之前,我把表的用途做个简单说明,现在只是大概的说明,后面我们再仔细了解,大家可以记下这个说明. game_aks 联合攻击组记录表,攻击完成删除数据 game_alliance 联盟表 game_annonce 公告表,基本无用 game_banned Ban玩家表 game_buddy 好友表 game_chat 聊天记录表 game_config 系统参数表 game_errors 错误日志表 game_fleets 舰队活动记录表,活动完

  • PHP网页游戏学习之Xnova(ogame)源码解读(二)

    三. 安装(install/index.php) 这个文件是安装页面,一开始就可以看到定义了两个常量: define('INSIDE' , true); define('INSTALL' , true); 因为这两个常量在接下来的代码中总是用到,所以在这里先说明下.INSIDE是用来防止攻击的:INSTALL是用来记录现在是否处于安装游戏的进程中. 接下来Include两个文件:extension.inc和common,这两个都是正宗的php文件.首先extension.inc里面加入了防止攻击

  • PHP网页游戏学习之Xnova(ogame)源码解读(七)

    十.基础数值(vars.php) vars.php文件中定义游戏中关键的基础数值,全部以数组形式定义:PHP中的数组实际上是一个有序图.我们下面将以代码注释的方式进行说明,可能有不正确的理解,希望大家自己也仔细看看,有问题请提出来!如果对这段数值理解了,那么你就可以创造新的单位了,比如新的科技(可以看我服的殖民技术).新的船舰等. // 玩家消息类型定义,具体含义请看messages.mo $messfields = array ( 0 => "mnl_spy", 1 =>

  • PHP网页游戏学习之Xnova(ogame)源码解读(五)

    六. 游戏主界面(frames.php) frames.php文件功能就是显示游戏主界面,先看下面的代码: $InLogin = false; $XNova_Host = $_SERVER['HTTP_HOST']; $XNova_Script = $_SERVER['SCRIPT_NAME']; $Uri_Array = explode ('/', $XNova_Script); // On vire le script array_pop($Uri_Array); $XNova_URI =

  • PHP网页游戏学习之Xnova(ogame)源码解读(四)

    五. 用户登录(login.php) 在开始的时候,我们说过游戏的入口是index.php文件:我们已经安装好了,自然转向登录流程,开始看. 前面照例是一段我们前进介绍过的代码,我们就不再详细讲了:不同的是使用的语言文件是login.mo,还有一个LOGIN的常量.如下 define('INSIDE' , true); define('INSTALL' , false); define('LOGIN' , true); $InLogin = true; $xnova_root_path = '.

随机推荐