SupCom对LUA脚本的容错性很高的貌似

前几天自制PowerfulBuilders的mod,结果在Enhancements下面一级那里漏打了一样东西。。。后来进游戏发现居然没出错。。。现在改好了,继续研究LUA脚本中,看起来满简单的,至少修改blueprint是很简单的。。。接下来打算研究下Weapon部分的内容,打算增加所有武器的飞行速度:victory:,不知道能不能区分各类武器是弹道型的还是直线型的。。。如果可以,打算分别用不同的比例增加。

[ 本帖最后由 honeyfox 于 2007-9-6 18:44 编辑 ]

blueprint里面的应该是根据lua所定义的,都很简单~ 弹道有三种:直线、低曲线和高弧线,而追踪的功能在弹头定义。

源文件是SupremilatedAfterTheWar_110

do

local oldModBlueprints = ModBlueprints

function ModBlueprints(all_bps)

   oldModBlueprints(all_bps)

   for id,bp in pairs(all_bps.Unit) do

   # New Veterancy Buffs
   #
   # This will remove ALL of the previous buffs, and then we will implement a completely new system
   
   if bp.Buffs then
   bp.Buffs = nil
   end
   if bp.Weapon then
   for k,v in pairs(bp.Weapon) do
   if v.Buffs then
   if v.Label != 'DeathWeapon' then
   v.Buffs = nil
   end
   end
   end
   end

   # New Buff system
   #
   # The idea behind the new buffs is that it emphasises realistic skill improvement of a unit, rather
   # than unrealistic things like extra health for no reason, more projectile damage, etc.
   # We may move to a 3-tier system at a later point, but for now it will be 5 as per standard supcom.
   # Each level, the unit recieves bonuses to weapons and chassis. We will try to stay away from non-visible
   # upgrades to a unit, like projectile damage.

   # Currently Available options:
   # FIRINGRANDOMNESS
   # MAXRADIUS
   # DAMAGE
   # TURRETYAWSPEED
   # TURRETPITCHSPEED
   # RATEOFFIRE

   # HEALTHREGENRATE
   # FUELRATIO
   # MAXFUEL
   # SPEEDMULT
   # HEALTH
   # MAXHEALTH

   # To be implemented at a later date:
   # ACCELERATION
   # MINAIRSPEED
   # MAXAIRSPEED

   # Unit Buffs
   # Top Speed and Regenrate
   bp.Buffs = {
   # Top Speed
   {
   Add = {
   VeteranLevel1 = true,
   },
   BuffType = 'SPEEDMULT',
   Value = 1.1,
   },
   {
   Add = {
   VeteranLevel2 = true,
   },
   BuffType = 'SPEEDMULT',
   Value = 1.2,
   },
   {
   Add = {
   VeteranLevel3 = true,
   },
   BuffType = 'SPEEDMULT',
   Value = 1.3,
   },
   {
   Add = {
   VeteranLevel4 = true,
   },
   BuffType = 'SPEEDMULT',
   Value = 1.4,
   },
   {
   Add = {
   VeteranLevel5 = true,
   },
   BuffType = 'SPEEDMULT',
   Value = 1.5,
   },
   # Fuel
   {
   Add = {
   VeteranLevel1 = true,
   },
   BuffType = 'MAXFUEL',
   Value = bp.Physics.FuelUseTime or 0 * 1.1,
   },
   {
   Add = {
   VeteranLevel2 = true,
   },
   BuffType = 'MAXFUEL',
   Value = bp.Physics.FuelUseTime or 0 * 1.2,
   },
   {
   Add = {
   VeteranLevel3 = true,
   },
   BuffType = 'MAXFUEL',
   Value = bp.Physics.FuelUseTime or 0 * 1.3,
   },
   {
   Add = {
   VeteranLevel4 = true,
   },
   BuffType = 'MAXFUEL',
   Value = bp.Physics.FuelUseTime or 0 * 1.4,
   },
   {
   Add = {
   VeteranLevel5 = true,
   },
   BuffType = 'MAXFUEL',
   Value = bp.Physics.FuelUseTime or 0 * 1.5,
   },
   #Regen
   {
   Add = {
   VeteranLevel4 = true,
   },
   BuffType = 'HEALTHREGENRATE',
   Value = (bp.Defense.RegenRate or 0) + ((bp.Defense.MaxHealth or 0) / 100),
   },
   {
   Add = {
   VeteranLevel5 = true,
   },
   BuffType = 'HEALTHREGENRATE',
   Value = (bp.Defense.RegenRate or 0) + ((bp.Defense.MaxHealth or 0) / 100 * 2),
   },
   }

   # Weapon Buffs
   #
   # ROF, Turret Speed, MaxRadius


   if bp.Weapon then
   for k,v in pairs(bp.Weapon) do
   if v.Label != 'DeathWeapon' then
   v.Buffs = {
   # ROF
   {
   Add = {
   VeteranLevel1 = true,
   },
   BuffType = 'RATEOFFIRE',
   Value = (v.RateOfFire or 0)* 1.05,
   },
   {
   Add = {
   VeteranLevel2 = true,
   },
   BuffType = 'RATEOFFIRE',
   Value = (v.RateOfFire or 0) * 1.2,
   },
   {
   Add = {
   VeteranLevel3 = true,
   },
   BuffType = 'RATEOFFIRE',
   Value = (v.RateOfFire or 0) * 1.4,
   },
   {
   Add = {
   VeteranLevel4 = true,
   },
   BuffType = 'RATEOFFIRE',
   Value = (v.RateOfFire or 0) * 1.5,
   },
   {
   Add = {
   VeteranLevel5 = true,
   },
   BuffType = 'RATEOFFIRE',
   Value = (v.RateOfFire or 0) * 2,
   },

   # Turret Speed
   {
   Add = {
   VeteranLevel1 = true,
   },
   BuffType = 'TURRETYAWSPEED',
   Value = (v.TurretYawSpeed or 0) * 1.05,
   },
   {
   Add = {
   VeteranLevel2 = true,
   },
   BuffType = 'TURRETYAWSPEED',
   Value = (v.TurretYawSpeed or 0) * 1.25,
   },
   {
   Add = {
   VeteranLevel3 = true,
   },
   BuffType = 'TURRETYAWSPEED',
   Value = (v.TurretYawSpeed or 0) * 1.4,
   },
   {
   Add = {
   VeteranLevel4 = true,
   },
   BuffType = 'TURRETYAWSPEED',
   Value = (v.TurretYawSpeed or 0) * 1.5,
   },
   {
   Add = {
   VeteranLevel5 = true,
   },
   BuffType = 'TURRETYAWSPEED',
   Value = (v.TurretYawSpeed or 0) * 2,
   },

   #Range
   {
   Add = {
   VeteranLevel3 = true,
   },
   BuffType = 'MAXRADIUS',
   Value = (v.MaxRadius or 0) * 1.05,
   },
   {
   Add = {
   VeteranLevel5 = true,
   },
   BuffType = 'MAXRADIUS',
   Value = (v.MaxRadius or 0) * 1.15,
   },
   }
   end
   end
   end

end

end

end

[ 本帖最后由 零星 于 2007-9-8 14:10 编辑 ]

:Q :Q :Q 经历了n多次的Supreme Commander出错。。。Projectile的代码貌似和Unit的不大一样。。。

现在问题应该出在这句语句上,为了使系统能够逐个将Projectile的blueprint内的某些数据进行修改。。。但是我怎么也猜不出这个语句应该怎么写。。。
现在写成这样 for id,bp in all_bps.Proj do 失败。。。 将Proj改成Projectile 失败。。。 将Projectile改成Projectiles 还是失败。。。:L
(对Unit遍历的代码是:for id,bp in all_bps.Unit do)

不知道是不是Proj的名称问题,还是all_bps里没有关于弹头的引用。。。没道理啊。。。弹头的数据里也是bp格式的呀。。。有没有谁知道如何遍历Projectiles.scd里面的bp数据。。。或者有没有sdk这类的东西可以参考下。。。否则那么多东西记不下。。。

[ 本帖最后由 honeyfox 于 2007-9-6 22:26 编辑 ]

:lol 看到别人给你的答案了,http://forums.gaspowered.com/viewtopic.php?t=19019

for id,bp in all_bps.Projectile do
#modify projectiles
end

可是这个你不是试过了吗?

是啊,所以我奇怪了,看来我猜得满准的,是Projectile(其实前面就在lua.scd和mohodata.scd里面发现了)。。。只是。。。我估计我其他代码有点问题。。。不过貌似没什么太多内容啊,就是把Projectile的一些属性改了改。。。难道不能改:L 。。。所以,我又发贴问了:lol GPGNet是个好地方:victory: 而且至少MuzzleVelocity那里的可以先改起来了,不过关于导弹类的加速度和转弯角速度的问题。。。:Q 先不管了。。。让那些提过n倍速度的导弹和飞机无数次地擦肩而过吧~~~

:‘( :’( :cry: 我晕了。。。

我现在代码里面已经删去了所有关于Projectile的东东,只是用
for id,bp in all_bps.Unit do
if bp.Weapon then
for i,wep in bp.Weapon do
来对所有单位的所有武器(如果有)进行遍历,然后把MuzzleVelocity扩大1.5倍。。。居然还是报错:Q

先把野心收小一些,试试只改一种武器弹头?另外,改的倍数过多是否会溢出,少改一点点试试?

en
这是什么语言啊?

这个是Lua 脚本语言。。。

啊哈哈哈,终于找到错误的地方了。。。说来惭愧:L Lua里面的数组的引用是name[index],因为使用其他编程语言过多。。。习惯性的打成了name(index)。。。终于OK了!!!

恭喜
你喜欢改游戏啊?
搞个sc的mod出来啊

恭喜
有成果尽快拿出来分享,高速导弹不知是什么效果。

:L 光加速的结果是来不及转弯……

事实上。。。我的测试结果倒并非如此。。。
因为貌似原来导弹的TurnRate就很高了。。。所以它们的速度提升以后(×2),貌似对精确度没有太大的影响,现在问题在于,跟踪类武器(导弹、鱼雷等)跟踪的是目标实体,如果可以像其他弹道型武器一样也跟踪目标的提前位置,那么精准度会非常高,几乎是百发百中的,不过貌似这个代码很难写,天晓得是不是要创建一个虚的目标来进行定位位置,而且还要有算法来计算提前量。。。:L

提前?

……我怎么找不到提前量的那个参数了?!难道被删掉了?

以前Aeon和UEF的T2PD就是因为没有那个参数而无法打中移动目标啊……

找到了…… LeadTarget = true,

[ 本帖最后由 零星 于 2007-9-8 14:11 编辑 ]

哦?LeadTarget就是提前计算弹道?看来我还得去翻翻Blueprint的说明手册。。。
。。。话说我最早就在纳闷LeadTarget和TrackTarget有什么区别。。。:L

当时以为这个提前量是用Lua脚本算出来的,心想这帮人这么牛啊,那不要繁死了。。。原来是现成的,不过话说回来,这个提前量也是程序员编出来的,可能他们要获得些数据比较方便,不用像Lua一样还要GetUnit,还要获得单位速度,Get来Get去的。。。

零星:对了,这句的意思if v.Label != ‘DeathWeapon’ then

是不是当label 不等于deathweapon的时候?

honeyfox:对的。感叹号相当于Not逻辑运算符

[ 本帖最后由 honeyfox 于 2007-9-8 19:00 编辑 ]

对呀~ Leadtarget和Tracktarget是不一样的……

不过在Tracktarget测同时Leadtarget不知道是否真的有效,我想大概不矛盾吧~ lead是在bp.unit.weapon里的

不会 这里的弹药制导 也用PID控制的吧:L