国王的恩赐吧 关注:10,683贴子:258,496

mod教程:[lua语言简介]+[游戏内置函数介绍]+[应用举例]

只看楼主收藏回复

看到shengxuexiong 的回归还有分享了一些资源,突然自己也写写做mod一些心得吧,希望多少给大家有些帮助。

@shengxuexiong
[国王的恩赐mod教学]内置函数大全及设计对话工具~ http://tieba.baidu.com/p/1896167675
申明1.由于本人不是学编程,所以写的不好请见谅并指出~
2.部分资料(Lua语言介绍)通过百度搜索获得,非原创
内容1.Lua语言及函数的简单介绍
2.游戏部分内置函数简介及应用(1): Attack类和AU类
3. 游戏部分内置函数简介及应用(2): Game类和Logic
4.运用举例



IP属地:广东本楼含有高级字体1楼2012-10-03 23:42回复
    1.1 Lua语言及函数的简单介绍
    《国王的恩赐》这部游戏的运行文件包括以下几种:
    1.txt文件:游戏设定各种数据参数
    2.atom文件:兵种、物体的各类参数
    3.lua文件:通过引用上述的文件里的参数,用lua编写的执行函数完成各类功能
    因此制作mod的重点在于如何运用Lua语言编写程序。其中游戏中使用的函数包括两类:lua语言自带的函数和游戏内置的函数,为了方便阅读和修改文件,有必要知道这函数的含义和原理。


    IP属地:广东本楼含有高级字体16楼2012-10-04 00:43
    回复
      2025-08-24 07:25:20
      广告
      不感兴趣
      开通SVIP免广告
      1.11 Lua语言简介
      1.111 注释

      我们打开lua文件经常会看到一些以//开头的乱码,其实是开发者用俄文写的注释,方便标识、查找、阅读和修改,在游戏里不发挥实际效用。
      这些注释的格式有以下特点:
      1)单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止
      2) 多行注释中,"--[["表示注释开始,并且一直延续到"]]"为止。在注释当中,"[[""]]"是可以嵌套

      举例:游戏unit_features.lua文件function features_soul_drain选段
      if k>0 then
      


      IP属地:广东本楼含有高级字体17楼2012-10-04 00:49
      回复
        --local receiver=Attack.get_target(1) -- 觐泐?
        --local attacker=Attack.get_target(0) -- ?
        --local count_1 = Attack.act_size(attacker)
        local killed = math.min( AU.unitcount( receiver ) ,damage/ AU.health( receiver )) -- 耜铍?玎觇?
        local drain=damage --恹镨蝾 耔臌
        local real_max_hp=Attack.act_totalhp(receiver)
        if real_max_hp<drain then drain = real_max_hp end
        drain=math.floor(drain*k/100)
        local attacker_count = AU.unitcount( attacker )
        local add_unit=math.floor(drain/AU.health( attacker )) -- 耜痤朦觐 镳栳噔脲龛??踱囹栩
        local heal_unit=drain-add_unit*AU.health( attacker ) -- 耜铍?脲麇龛铖蜞腩顸
        Attack.act_size(attacker, attacker_count + add_unit)
        Attack.act_cure(attacker, heal_unit, 1)

        加粗标识的都为注释,其中这段是无用的文本,开发者用注释的方法把它忽略了
        --local receiver=Attack.get_target(1) -- 觐泐?
        --local attacker=Attack.get_target(0) -- ?
        --local count_1 = Attack.act_size(attacker)
        


        IP属地:广东本楼含有高级字体18楼2012-10-04 00:49
        回复
          插楼也要顶!必须强力支持!


          IP属地:法国19楼2012-10-04 00:49
          收起回复
            1.112 编程
            Lua中,语句之间可以用分号""隔开,也可以用空白隔开。一般来说,如果多个语句写在同一行的话,建议总是用分号隔开。PS: 我喜欢分行,感觉挤在一起很容易搞混。
            1.1121 条件控制
            Lua 有好几种程序控制语句,如:
            1)While循环while 条件 do … end

            举例:游戏addon_special_attacks.lua文件function take_calccells选段: 三头犬直线攻击的目标选定
            if empty_cell(c) then
            while true do
            Attack.marktarget(c)
            c = Attack.cell_adjacent(c, i)
            if not empty_cell(c) then break end
            end
            if c~=nil and take_check_target(c) then
            Attack.marktarget(c)
            end
            end


            IP属地:广东本楼含有高级字体20楼2012-10-04 00:51
            回复
              2)Repeat循环repeat … until 条件

              举例:游戏addon_spells_adv.lua文件function advspell_giant_birth选段: “巨神降临卷轴
              local cnt
              repeat
              cnt = table.getn( arr )
              if cnt == 0 then
              return false
              end
              local index = Game.CurLocRand( cnt )
              atom = arr[ index + 1 ]
              local alead = Logic.cp_leadship( atom )
              cnt = math.floor( hero_ld / alead )
              if cnt == 0 or Logic.army_get(hero, atom) then
              table.remove( arr, index + 1 )
              cnt = 0
              end
              until cnt ~= 0


              IP属地:广东本楼含有高级字体21楼2012-10-04 00:53
              回复
                3)For循环for 变量=初值,终点值,步进值 do … end
                游戏中最最常见的一个循环, 十分好用。

                举例:游戏spells.lua文件function spell_reaction_attack选段: 魔法活力
                local acnt = Attack.act_count() --战场单位总数
                for i=1,acnt-1 do 分别对编号1acnt-1的单位i执行
                if Attack.act_ally(i) and Attack.act_applicable(i) then 如果单位i为友军和可以被执行
                Attack.act_apply_spell_begin( i, "spell_reaction", duration, false ) --开始对i施加魔法活力
                Attack.act_apply_par_spell( "initiative", initiativebonus, 0, 0, duration, false) 改变主动性
                Attack.act_apply_spell_end()--魔法结束
                Attack.resort() --重新排序
                Attack.atom_spawn(i, 0, "magic_warcry", Attack.angleto(i)) --执行动画文件 magic_warcry.atom
                end
                end


                IP属地:广东本楼含有高级字体22楼2012-10-04 00:56
                回复
                  2025-08-24 07:19:20
                  广告
                  不感兴趣
                  开通SVIP免广告
                  4)For循环for 变量1,变量2,变量N in表或枚举函数 do … end
                  游戏中这个比较麻烦,一般和table联用.
                  举例:游戏spells.lua文件function takeoff_spells选段: 魔法驱散
                  for k,v in ipairs(spells_to_delete) do --对表spells_to_delete中的变量kv执行
                  Attack.act_del_spell(target,v) --target身上有魔法v则把它删除
                  end

                  5)PS: (1) 可以用break来中止循环。
                  (2) for
                  的循环变量总是只作用于for的局部变量;步进值省略时,for环会使用1作为步进值。


                  IP属地:广东本楼含有高级字体23楼2012-10-04 01:02
                  回复
                    1.1122 语句
                    1.语句块
                    Lua中,语句块用doend括起来的。如 do print("Hello") end
                    在函数和语句块中可以定局部变量local

                    2.赋值语句
                    Lua中赋值语句可以同时给多个变量赋值。如 a,b,c,d,e = 1,2,3,4,5甚至是a,b = b,a
                    在默认情况下,变量总是认为是全局的。假如你要定义局部变量,则在第一次赋值的时候,需要用local说明。
                    举例:
                    local duration = Attack.get_custom_param("duration")
                    local power = Attack.get_custom_param("power")
                    local attack = Attack.act_get_par(0, "attack")
                    duration,power,attack都是局部变量。另外,如果你闲的蛋疼的话也可以把它们挤在一起:
                    local duration,power,attack = Attack.get_custom_param("duration"), Attack.get_custom_param("power"), Attack.act_get_par(0, "attack")


                    IP属地:广东本楼含有高级字体24楼2012-10-04 01:04
                    回复
                      1.1123 运算
                      1.数值运算
                      支持+, -, *, /,^运算,分别为指数乘方
                      连接两个字符串,可以用".."运处符。在游戏的文字显示中很常用。如:
                      "unit_".."name"等同于"unit_name"
                      local a,b,c = "armored"," ","princess"
                      local d = a..b..c
                      此时d等同于"armored princess"

                      2.比较运算
                      包括<,>,<=,>=,==,~=,分别为小于大于小于等于大于等于等于不等于
                      


                      IP属地:广东本楼含有高级字体25楼2012-10-04 01:08
                      回复
                        所有这些操作符总是返回truefalse
                          对于TableFunctionUserdata类型的数据,只有 == ~=可以用。相等表示两个变量引用的是同一个数据。

                        3.逻辑运算
                        包括and, or, not。资料里跟C语言对比说了很多,没学过C语言我不好说。
                        4. 运算符优先级,从高到低顺序如下:
                            ^
                            not
                            * /
                            + -
                            ..
                            < > <= >= ~= ==
                            and
                            or 


                        IP属地:广东本楼含有高级字体26楼2012-10-04 01:08
                        回复
                          1.1124 关键字
                          关键字是不能做为变量的。包括:
                          in nil and or not
                          function local for while repeat until
                          if then do else elseif break true false return end


                          IP属地:广东本楼含有高级字体27楼2012-10-04 01:09
                          回复
                            1.1125 变量类型
                            Lua中,不管你在什么地方使用变量,都不需要声明,并且所有的这些变量总是全局变量,除非在前面加上"local"。这一点要特别注意,因为你可能想在函数里使用局部变量,却忘了用local来说明。至于变量名字,它是大小写相关的。也就是说,Aa是两个不同的变量。变量名字可以自定义任何除了关键字外的所有文字。
                              定义一个变量的方法就是赋值""操作就是用来赋值的


                            IP属地:广东本楼含有高级字体28楼2012-10-04 01:11
                            回复
                              2025-08-24 07:13:20
                              广告
                              不感兴趣
                              开通SVIP免广告
                              1)nil 空值
                              所有没有使用过的变量,都是nilnil既是值,又是类型。
                              如果需要将一个变量清除,可以直接给变量赋以nil值。如:a = nil

                              2)boolean 布尔值
                              (PS: 吐槽一下,个人觉得这东西很抽象。)
                              布尔值通常是用在进行条件判断的时候。布尔值有两种:true false。在Lua中,只有falsenil才被计算为false,而所有任何其它类型的值,都是true0和空串也是true。可以直接给一个变量赋以Boolean类型的值,如:a = true

                              3)number 数值
                              Lua中,是没有不需要整数类型。一般情况下,只要数值不是很大(比如不超过100,000,000,000,000),是不会产生舍入误差的。

                              4)string 字符串
                              字符串是一种非常常用的高级类型。字符串在Lua中有几种方法来表示,最通用的方法,是用双引号单引号来括起一个字符串,如:"armored princess"


                              IP属地:广东本楼含有高级字体29楼2012-10-04 01:15
                              回复