找回密码
 加入帝国

QQ登录

只需一步,快速开始

查看: 7100|回复: 11

[教程文章] 以原版任务运输舰为蓝本建造出产资源的工业舰

[复制链接]
发表于 2011-1-28 20:10:57 | 显示全部楼层 |阅读模式
我还是没搞明白怎么弄成像妖都那样根据子模块来生产资源,勉强只能做到整条船上。虽然我还另加了3门和运输舰一样的高射炮上去,但那和本文无关。


-----这部分是替换sp_tanker.ship中的相应内容,出现在辅助船面板,选用超空间进入,和战斗机一样的装甲,采矿船人口
NewShipType.MinimalFamilyToFindPathAround = "MotherShip"
NewShipType.BuildFamily = "Shipyard_Hgn"
NewShipType.AttackFamily = "BigCapitalShip"
NewShipType.DockFamily = "Shipyard"
NewShipType.AvoidanceFamily = "MotherShip"
NewShipType.DisplayFamily = "Utility"
NewShipType.AutoFormationFamily = "SuperCap"
NewShipType.CollisionFamily = "Big"
NewShipType.ArmourFamily = "Unarmoured"
NewShipType.UnitCapsFamily = "Utility"
NewShipType.UnitCapsShipType = "ResourceCollector"
-----ps:建造时间和资源,以及添加武器和模块之类的请看置顶贴教程总目

-----下面这部分加入到build.lua里面
{
    Type = Ship,
    ThingToBuild = "sp_tanker",
    RequiredResearch = "",
    RequiredShipSubSystems = "",
    DisplayPriority = 0,
    DisplayedName = "工业舰",
    Description = "通过生产民用产品获取利润",
  },

-----以下是deathmatch.lua的全文,备份下然后直接替换掉好了,喜欢研究的只需要看我注释的部分
GUID =
{
110,
91,
157,
190,
18,
23,
250,
78,
144,
20,
41,
246,
181,
128,
214,
12,
}

GameRulesName = "我的模式"
Description = "我的模式"

GameSetupOptions =
{
{
  name = "resources",
  locName = "$3240",
  tooltip = "$3239",
  default = 1,
  visible = 1,
  choices =
  {
   "$3241",
   "0.5",
   "$3242",
   "1",
   "$3243",
   "2",
  },
},
{
  name = "unitcaps",
  locName = "$3214",
  tooltip = "$3234",
  default = 1,
  visible = 1,
  choices =
  {
   "$3215",
   "Small",
   "$3216",
   "Normal",
   "$3217",
   "Large",
  },
},
{
  name = "resstart",
  locName = "$3205",
  tooltip = "$3232",
  default = 0,
  visible = 1,
  choices =
  {
   "$3206",
   "1000",
   "$3207",
   "3000",
   "$3208",
   "10000",
   "$3209",
   "0",
  },
},
{
  name = "lockteams",
  locName = "$3220",
  tooltip = "$3235",
  default = 0,
  visible = 1,
  choices =
  {
   "$3221",
   "yes",
   "$3222",
   "no",
  },
},
{
  name = "startlocation",
  locName = "$3225",
  tooltip = "$3237",
  default = 0,
  visible = 1,
  choices =
  {
   "$3226",
   "random",
   "$3227",
   "fixed",
  },
},
}

dofilepath("data:scripts/scar/restrict.lua")

function OnInit()
MPRestrict()
Rule_Add("MainRule")
SobGroup_Create("gyj")
---插入上面这句,用来建立一个数组,用来存放工业舰的数量
Rule_AddInterval("gy",100)
---插入上面这句,用来把名叫gy的子程序放进计时器定时重复
Rule_Add("gy")
---插入上面这句,用来运行这个名叫gy的子程序
end

function MainRule()
local playerIndex = 0
local playerCount = Universe_PlayerCount()
while (playerIndex < playerCount) do
  if (Player_IsAlive(playerIndex) == 1) then
   if (Player_HasShipWithBuildQueue(playerIndex) == 0) then
    Player_Kill(playerIndex)
   end
  end
  playerIndex = (playerIndex + 1)
end
local numAlive = 0
local numEnemies = 0
local gameOver = 1
playerIndex = 0
while (playerIndex < playerCount) do
  if (Player_IsAlive(playerIndex) == 1) then
   local otherPlayerIndex = 0
   while (otherPlayerIndex < playerCount) do
    if (AreAllied(playerIndex, otherPlayerIndex) == 0) then
     if (Player_IsAlive(otherPlayerIndex) == 1) then
      gameOver = 0
     else
      numEnemies = (numEnemies + 1)
     end
    end
    otherPlayerIndex = (otherPlayerIndex + 1)
   end
   numAlive = (numAlive + 1)
  end
  playerIndex = (playerIndex + 1)
end
if (numEnemies ~= 0) or(numAlive > 0) then
  gameOver = 0
end
if (gameOver == 1) then
  Rule_Add("waitForEnd")
  Event_Start("endGame")
  Rule_Remove("MainRule")
end
end

function waitForEnd()
if (Event_IsDone("endGame")) then
  setGameOver()
  Rule_Remove("waitForEnd")
end
end

Events = {}

Events["endGame"] =
{
{
  {
   "wID = Wait_Start(5)",
   "Wait_End(wID)",
  },
},
}

---插入下面的全部
function gy()
---子程序的开头
local rs = 0
---上面这个是用来定义当前这个人的编号的变量
while (rs < Universe_PlayerCount()) do
---上面这句意思是如果当前这个人的编号小与总人数(即不是最后1人之后的那个天外来客)那么执行下面3句
  if (Player_IsAlive(rs) == 1) then
---上面这个如果:如果这个编号的人还活着,意思是死了就跳过
   Player_FillShipsByType("gyj", 0, "sp_tanker")
---把这个人所拥有的sp_tanker(原版任务的运输舰)的数量放进gyj数组
   Player_SetRU(rs, (Player_GetRU(rs) + SobGroup_Count("gyj")*5))
---设置拥有资源(这个人的编号,(获取拥有的资源(这个人的编号)+数组的大小(数组)*5))
---上面的意思是:首先提取这个人拥有的工业舰的数量并且乘5,然后和他现有的资源数量相加,最后把得出的数值设置成他拥有的资源总数
  end
---结束上面说的如果范围,就是说如果那个如果的条件不成立,这句上面和那句如果下面都不会运行
  rs = rs + 1
---下一个人
end
---最上面那个如果,注意2个如果的指令并不相同,因为要执行的效果不同,外面这个是循环,里面的是1次,当然外面的循环会带动里面的
end
---最后的end结束的是整个子程序,没有个专业的编程工具,用记事本看这个东西真会累死人
---插入上面的全部
回复

使用道具 举报

 楼主| 发表于 2011-1-29 09:59:37 | 显示全部楼层
没有人打算提出见解么
回复

使用道具 举报

发表于 2011-1-29 10:11:38 | 显示全部楼层
循环判断拥有的子模块(当然是一个类别的啦)数量然后根据数量来增加资源?
回复

使用道具 举报

发表于 2011-1-29 12:36:10 | 显示全部楼层
LZ你的基本概念很多都是错的。
首先
Sobgroup和数组一点关系都没有。数组是一系列变量的集合,SobGroup是HW2实时运行时装载舰船的集合。Lua语言中不存在数组的概念,只有Table(但这东西比数组更强大)和单一变量。

Sobgroup存放的是某些个特定的单位,而不只是他们的数量。

Function也不是子程序而是规则。

对于子模块增加资源

首先用SobGroup获得制定类型的舰船
然后对每艘舰船依次判定子模块是否存在
最终用一个变量装载要增加资源的数量,当把所有舰船都判断过后增加资源。
以上的函数以固定的间隔反复运行,就是这样。
回复

使用道具 举报

 楼主| 发表于 2011-1-29 21:32:00 | 显示全部楼层
概念偏差,,我刚玩mod不久,还是用编程的眼光看的,那东西其实还是个多维数组:数组名(数据1)(数据2)(数据3)这样的东西,至于子程序,,……
回复

使用道具 举报

发表于 2011-1-29 21:58:06 | 显示全部楼层
我也是站在编程的角度看的。有些东西模棱两可就会引发误解与错误。
SobGroup不是数组
1.它没有下标。不能对其中的某个元素进行调用。
2.它没有数据范围。
3.它的每个元素(每艘船)不仅是简单的一个或者几个变量。说它存储着指向信息还更靠谱一些。

至于那个“子程序”。这样子Add的Rule并不是子程序,而是与原规则并行的新规则。他们同级,被调用的Rule也无需return什么。
回复

使用道具 举报

发表于 2011-1-29 22:13:47 | 显示全部楼层
规则在不删除前疯狂循环地执行(没有停止的时候),函数返回值之后就不执行了(除非又再次调用)。说白了就是函数执行一次,规则无限循环执行……
回复

使用道具 举报

发表于 2011-1-29 22:25:01 | 显示全部楼层
这不是规则和函数的问题。规则实际可以作为一类函数,只不过HW2固定的那些函数都会在最后终止自身的再次运行(规则也一样可以做到。那样的规则等价于自定的函数。)
但子程序和规则完全不同。子程序从属于调用程序,必须返回调用它的程序。规则则是并行关系。
回复

使用道具 举报

发表于 2011-2-2 17:38:35 | 显示全部楼层
本帖最后由 nhofb 于 2011-2-2 17:41 编辑

哦,我来试试……

function OnInit()
  MPRestrict()
  Rule_Add("MainRule")
  Rule_AddInterval("rusadd",100)  ---插入上面这句,用以每100S执行一次名为rusadd的子程序……
end
…………………………………………
function rusadd()
    local 0x2903223 = 0 --设立一个名为0x2903223的变量来存放当前玩家号……(取什么名字没关系吧……)
   local playercount = Universe_PlayerCount() --设立一个名为playercount的变量来存放总玩家数……
   while (0x2903223 < playercount) do
        if (Player_IsAlive(0x2903223) == 1) then --此人死了没……
       local getyouhowmanyrus = SobGroup_GetPosition("sp_tanker_"..0x2903223) --没死啊,那你的sp_tanker还有多少……
       Player_SetRU(playerId, Player_GetRU(0x2903223) + getyouhowmanyrus * 5) --还有sp_tanker……这位0x2903223送你点RU当慰问金算了……
     end
        0x2903223 = 0x2903223 + 1 --下一位……
   end
end

因为我从来没有编过LUA,变量名神马滴都不知道,仅用我那点混杂了PAS与C的编程知识外加HW2内置的函数等等编出来的,没有实战过……若不能成功……不要怪我啊……
回复

使用道具 举报

发表于 2011-2-19 08:42:47 | 显示全部楼层
好复杂啊,看得我直晕乎。
回复

使用道具 举报

发表于 2011-2-19 08:55:20 | 显示全部楼层
回复 drogon49 的帖子

看多了就会懂了……
回复

使用道具 举报

发表于 2011-8-26 12:49:15 | 显示全部楼层
"GetRU"是游戏中原本就有的词组还是用"Get"和"RU"拼成的?。。
问的有点弱智…初次了解编程语言、
大概意思就是、各数据都有各自的词语还是要在exe文件里面定义新的词语?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入帝国

本版积分规则

Archiver|手机版|小黑屋|泰坦帝国

GMT+8, 2024-3-28 21:55 , Processed in 0.136673 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表