注册 | 登录

游侠NETSHOW论坛





查看: 17742|回复: 51

[原创] 汉之云脚本编写简明教程 [复制链接]

帖子
1269
精华
39
积分
13627
金钱
38841
荣誉
498
人气
2121
评议
0
发表于 2008-1-12 15:01:25 |显示全部楼层
汉之云脚本研究(附带MOD制作工具)
http://game.ali213.net/thread-1857825-1-4.html

建议大家在编写脚本之前先认真阅读一下原始的脚本代码,以便能够更好的理解整个游戏系统和如何实现各种效果。
下面就结合原始的脚本代码,介绍一下如何编写自己的MOD脚本。

首先,先来看一下原始的脚本文件各自的功能:

main目录
0000?:基础函数库
002??:主线序章
003??:主线第一章
004??:主线第二章
005??:主线第三章
006??:主线第四章
1000?:游戏基本元素
101??:普通支线剧情
108??:其它剧情(商人/迷宫/DOMO)
109??:伙伴支线剧情
110??:场景切换

fight目录
F001:基础函数
F002:普通战斗
F003:伙伴剧情战斗
F004:支线剧情战斗
F005:主线剧情战斗

一、基础修改

我们以“存档点”部分的代码为例,详细解析一下如何实现最基本的修改
打开10000c.lua,我们可以找到如下的代码:

  1. restore_motion = function()
  2.    local mainid = get_mainrole()
  3.    local mainname = get_rolename(mainid)
  4.    restore_team()
  5.    msginfo("全身籠罩一股清風")
  6. end

  7. restore_save = function()
  8.    restore_motion()
  9.    restore_save_q()
  10. end

  11. restore_save_q = function()
  12.    selmsg(2, "選項:")
  13.    setselect(1, "1.存檔")
  14.    setselect(2, "2.取消")
  15.    sleep(3)
  16.    waitanykey()
  17.    restore_save_ans(getselectanwser())
  18. end

  19. restore_save_ans = function(x)
  20.    local mainid = get_mainrole()
  21.    local mainname = get_rolename(mainid)
  22.    if x == 1 then
  23.       call_save()
  24.    elseif x == 2 then
  25.       restore_team()
  26.    else
  27.       restore_save_q()
  28.    end
  29. end
复制代码


当我们在存档点按空格键时,就会触发restore_save函数(具体参见10803c.lua中的t7901函数)
它一共做了两件事情。第一,调用restore_motion函数恢复全员的状态;第二,就是弹出选择框,提示你是否需要存档。
弹出对话框的函数是selmsg。它有两个参数,第一个指定对话框中有多少个选择项,第二个是对话框的标题
你可以使用setselect设置选择项的具体内容,getselectanswer函数用于获取用户的选择。
之后你就可以在restore_save_ans里根据用户的选择进行相应的处理了
在支线剧情中,我们会经常看到选择框的身影

这里我给出一个修改的实例,大家可以借此熟悉一下lua脚本的语法(if、for、数组)和汉之云提供的一些函数(additem、addsprite、addmoney分别用于增加物品、怪物和金钱,join用于加入队员)

  1. restore_save_q = function()
  2.    selmsg(3, "選項:")
  3.    setselect(1, "1.存檔")
  4.    setselect(2, "2.作弊")
  5.    setselect(3, "3.取消")
  6.    sleep(3)
  7.    waitanykey()
  8.    restore_save_ans(getselectanwser())
  9. end

  10. restore_cheat_q = function()
  11.    selmsg(6, "選項:")
  12.    setselect(1, "1.怪物")
  13.    setselect(2, "2.物品")
  14.    setselect(3, "3.裝備")
  15.    setselect(4, "4.金錢")
  16.    setselect(5, "5.隊伍")
  17.    setselect(6, "6.取消")
  18.    sleep(3)
  19.    waitanykey()
  20.    restore_cheat_ans(getselectanwser())
  21. end

  22. restore_cheat_ans = function(x)
  23.    local mainid = get_mainrole()
  24.    local mainname = get_rolename(mainid)
  25.    if x == 1 then
  26.       local mon = {17, 14, 15, 15, 16, 16, 14, 12, 7, 6}
  27.       local a = table.getn(mon)
  28.       for i = 1, a do
  29.          for j = 1, mon[i] do
  30.             addsprite(i * 100 + 900 + j, 1)
  31.          end
  32.       end
  33.    elseif x == 2 then
  34.       for i = 6001, 6028 do
  35.          if i ~= 6024 then
  36.             additem(i, 99)
  37.          end
  38.       end
  39.       for i = 6039, 6046 do
  40.          if i ~= 6040 then
  41.             additem(i, 99)
  42.          end
  43.       end
  44.    elseif x == 3 then
  45.       local i1 = {3001, 3018, 3021, 3041, 3061, 3081, 3101, 4001, 4021, 4041, 5001, 5051}
  46.       local i2 = {3016, 3018, 3034, 3055, 3074, 3090, 3109, 4011, 4030, 4051, 5024, 5063}
  47.       local a = table.getn(i1)
  48.       local b = table.getn(i2)
  49.       local num = 11
  50.       if a == b then
  51.          for i = 1, a do
  52.             for j = i1[i], i2[i] do
  53.                additem(j, num)
  54.             end
  55.          end
  56.       end
  57.    elseif x == 4 then
  58.       addmoney(1000000)
  59.    elseif x == 5 then
  60.       for i = 1, 11 do
  61.          join(i)
  62.       end
  63.    elseif x == 6 then
  64.    else
  65.       restore_cheat_q()
  66.    end
  67. end

  68. restore_save_ans = function(x)
  69.    local mainid = get_mainrole()
  70.    local mainname = get_rolename(mainid)
  71.    if x == 1 then
  72.       call_save()
  73.    elseif x == 3 then
  74.       restore_team()
  75.    elseif x == 2 then
  76.       restore_cheat_q()
  77.    else
  78.       restore_save_q()
  79.    end
  80. end
复制代码


二、剧情修改
剧情修改相对比较复杂,所以我们先从人物对话开始介绍。
下面是飞羽军营中和“徐豐”对话的相应代码(简化过了):

  1. t341 = function()
  2.    local mainid = get_mainrole()
  3.    local mainname = get_rolename(mainid)
  4.    chang_role_dir_torole(mainid, 341, 0)
  5.    lock_player(1)
  6.    set_watch_each(mainid, 341)
  7.    if isfon(1002) == 1 and isfon(1017) == 0 then
  8.       local a = random(2)
  9.       if a == 0 then
  10.          facetotalk(341, "徐豐", "聽說供應曹賊糧草的是在邽嶺山中的砦堡!")
  11.       else
  12.          facetotalk(341, "徐豐", "邽嶺就在我軍營外幾里處。")
  13.       end
  14.    else
  15.       if isfon(1017) == 1 and isfon(1053) == 0 then
  16.          facetotalk(341, "徐豐", "我們的補給從漢中運來,路途遙遠。不像曹賊,邽嶺以北幾乎是援助他們的砦堡。")
  17.       else
  18.          if isfon(1101) == 1 and isfon(1151) == 0 then
  19.             facetotalk_noback(341, "徐豐", "我們現在就在賊將郭淮、費曜駐守的上邽城外。")
  20.             chatinfo(341, "徐豐", "料想他們怎麼也想不到,我們飛羽部隊會在這地方。")
  21.             chang_role_dir(341, 0, 1)
  22.          end
  23.       end
  24.    end
  25.    lock_player(0)
  26.    set_watch_back(mainid, 341)
  27. end
复制代码


我们可以看到,和NPC对话之前通常会作两件事情:
第一,调用chang_role_dir_torole,使得NPC朝向主角;第二,调用lock_player将主角锁定
然后就是一长串根据isfon的if...else...了。
isfon是is flag on的缩写。每当我们进行一次对话,完成一次任务的时候,系统都会使用fon函数进行记录。之后就可以使用isfon来判断对话是否发生,任务是否完成,等等。
这里,我们和"徐豐"对话的时候,系统会根据flag的值来推断玩家目前处于剧情的哪个阶段,并显示相应的对话
(比如,游戏一开始,和多聞使对话之后就会设置1002这个flag)

isfon和fon对于主线或者支线的剧情非常重要。可以说是我们制作MOD剧情必不可少的函数
譬如,我们完成NPC交待的任务,返回领取奖励的时候,系统就会根据flag来测试相应任务是否完成。

[ 本帖最后由 vbvan 于 2008-1-13 12:51 编辑 ]
已有 1 人评分金钱 收起 理由
风行水 + 100 + 5 感谢发表精华文章!

总评分: 金钱 + 100  + 5   查看全部评分

我的网盘:http://pigspy.ys168.com/
我的技术博客:Van's House

使用道具 举报

帖子
1172
精华
0
积分
596
金钱
1456
荣誉
1
人气
0
评议
0
发表于 2008-1-12 15:02:25 |显示全部楼层
PS。QQ和宝马是品牌的差距,中国游戏和国外是时代的差距 ... ---这句话使我明白到,为什么会有人用国外游戏跟国产游戏比

使用道具 举报

帖子
1049
精华
0
积分
535
金钱
4147
荣誉
1
人气
6
评议
0
发表于 2008-1-12 15:16:25 |显示全部楼层
感觉上最难的还是里面一些参数的设定
尤其是镜头的…………
杳杳灵凤,绵绵长归。悠悠我思,永与愿违。万劫无期,何时来飞?

使用道具 举报

帖子
2378
精华
0
积分
1220
金钱
177
荣誉
3
人气
8
评议
0

发表于 2008-1-12 15:19:20 |显示全部楼层
眼花了,只能精神上支持.........

空之女神啊,感谢您......

使用道具 举报

帖子
1068
精华
0
积分
534
金钱
1217
荣誉
0
人气
1
评议
0
发表于 2008-1-12 15:36:53 |显示全部楼层
必须先改为台湾区域才能修改了。。。。。。。。。。。

使用道具 举报

帖子
200
精华
0
积分
100
金钱
1281
荣誉
0
人气
0
评议
0
发表于 2008-1-12 15:54:53 |显示全部楼层
太好了!!!我要的就是這個!!!! [汗水] van大人,你的RPGViewer是不是對漢之云還不支持導入圖片。

[ 本帖最后由 liubig 于 2008-1-12 16:00 编辑 ]
宇宙人多了一条染色体,他是超人。
市井平民多了2条染色体,他是蜘蛛人。
富家子弟多了3条染色体,他是蝙蝠侠。
我,多了4条染色体..............
我是..............

使用道具 举报

軒轅劍 天地劍皇
冠军杯射手

大头像勋章

帖子
3482
精华
3
积分
2781
金钱
2514
荣誉
44
人气
4
评议
0
发表于 2008-1-12 15:59:58 |显示全部楼层
看起来比较难啊
o(∩_∩)o...~~~~~

使用道具 举报

帖子
69
精华
0
积分
35
金钱
142
荣誉
0
人气
0
评议
0
发表于 2008-1-12 16:15:12 |显示全部楼层
實裝后如何馬上觀看效果?
例如改一段劇情 但我的存檔暫時是無法到達我所改的那段劇情-.-

使用道具 举报

帖子
6
精华
0
积分
3
金钱
21
荣誉
0
人气
0
评议
0
发表于 2008-1-12 16:24:45 |显示全部楼层
感谢楼主的劳动,我编译之后出现这样的错误,如何解决呢?谢谢
..\..\luac: 10000c.lua:988: `do' expected near `addsprite'

使用道具 举报

帖子
1269
精华
39
积分
13627
金钱
38841
荣誉
498
人气
2121
评议
0
发表于 2008-1-12 16:34:40 |显示全部楼层
回79793281
下面这行少了个空格
for j = 1, mondo -> for j = 1, mon do

回kendogm
你可以用修改器SWD5Editor修改flag,以保证事件能够被触发(当然,比如说对话,你得先找到那个NPC才行)

回liubig
是的,不支持

回素世还真
你可以试一下Applocale,或者用支持Encoding的编辑器(比如EditPlus,打开的时候选择Big5编码)
我的网盘:http://pigspy.ys168.com/
我的技术博客:Van's House

使用道具 举报

帖子
69
精华
0
积分
35
金钱
142
荣誉
0
人气
0
评议
0
发表于 2008-1-12 16:50:29 |显示全部楼层
vbvab

應該是 fon() 這里吧?

比如我想要直接觸發1007的事情。
那我是不是只需要開啟1007就可以了?

[ 本帖最后由 kendogm 于 2008-1-12 16:51 编辑 ]

使用道具 举报

帖子
6
精华
0
积分
3
金钱
21
荣誉
0
人气
0
评议
0
发表于 2008-1-12 16:52:40 |显示全部楼层
原帖由 vbvan 于 2008-1-12 16:34 发表
回79793281
下面这行少了个空格
for j = 1, mondo -> for j = 1, mon do

回kendogm
你可以用修改器SWD5Editor修改flag,以保证事件能够被触发(当然,比如说对话,你得先找到那个NPC才行)

回liubig
是的,不支持

回素世还真
...

好了,多谢楼主

使用道具 举报

We Stand Alone Together
游侠元老版主
『中文/角色扮演游戏区』
軒轅劍 乾坤劍雄
Call of Duty4☆SASの消逝之MP5
★★★★★★★★★

元老版主勋章版主勋章资深版主勋章勤劳之证日游工作组贡献勋章

帖子
9761
精华
1
积分
5402
金钱
40608
荣誉
32
人气
15
评议
6

发表于 2008-1-12 17:02:17 |显示全部楼层
精神上支持吧~~~~~~~~~~~~~~~~~~~

使用道具 举报

๖ۣۜS超級龍王巴哈姆特๖ۣۜS
游侠元老版主
『中文/角色扮演游戏区』
宿命輪回蒼之濤
圣魔灵·路西法

元老版主勋章版主勋章资深版主勋章大头像勋章白金会员勋章活跃勋章荣誉勋章特色头衔勋章人气勋章·初级勤劳之证2014年杰出版主勋章

帖子
16789
精华
4
积分
11943
金钱
63706
荣誉
242
人气
3289
评议
13

发表于 2008-1-12 17:04:41 |显示全部楼层
我不行了...我实在是不行了....
这帖给我的压力太大了!!!!

.

.
                              

  有志者、事竟成,破釜沉舟,百二秦关终属楚;苦心人、天不负,卧薪尝胆,三千越甲可吞吴。  
.

使用道具 举报

白金会员勋章活跃勋章

帖子
17646
精华
0
积分
8856
金钱
15058
荣誉
3
人气
31
评议
0

发表于 2008-1-12 17:05:18 |显示全部楼层
灭时间研究      

游侠已经大不如前咯~~~

使用道具 举报

帖子
17
精华
0
积分
9
金钱
47
荣誉
0
人气
0
评议
0
发表于 2008-1-12 18:49:50 |显示全部楼层
文中对数组的调用方法有错,会导致在第1及第3项作弊时游戏卡死
  1.        for j = 1, mon do   ->         for j = 1, mon[i] do
  2.             for j = i1, i2 do  ->               for j = i1[i], i2[i] do
复制代码




全文:
  1. restore_save_q = function()
  2.    selmsg(3, "匡兜")
  3.    setselect(1, "1.絃")
  4.    setselect(2, "2.国")
  5.    setselect(3, "3.")
  6.    sleep(3)
  7.    waitanykey()
  8.    restore_save_ans(getselectanwser())
  9. end

  10. restore_cheat_q = function()
  11.    selmsg(6, "匡兜")
  12.    setselect(1, "1.┣")
  13.    setselect(2, "2.珇")
  14.    setselect(3, "3.杆称")
  15.    setselect(4, "4.窥")
  16.    setselect(5, "5.钉ヮ")
  17.    setselect(6, "6.")
  18.    sleep(3)
  19.    waitanykey()
  20.    restore_cheat_ans(getselectanwser())
  21. end

  22. restore_cheat_ans = function(x)
  23.    local mainid = get_mainrole()
  24.    local mainname = get_rolename(mainid)
  25.    if x == 1 then
  26.       local mon = {17, 14, 15, 15, 16, 16, 14, 12, 7, 6}
  27.       local a = table.getn(mon)
  28.       for i = 1, a do
  29.          for j = 1, mon[i] do
  30.             addsprite(i * 100 + 900 + j, 1)
  31.          end
  32.       end
  33.    elseif x == 2 then
  34.       for i = 6001, 6028 do
  35.          if i ~= 6024 then
  36.             additem(i, 99)
  37.          end
  38.       end
  39.       for i = 6039, 6046 do
  40.          if i ~= 6040 then
  41.             additem(i, 99)
  42.          end
  43.       end
  44.    elseif x == 3 then
  45.       local i1 = {3001, 3018, 3021, 3041, 3061, 3081, 3101, 4001, 4021, 4041, 5001, 5051}
  46.       local i2 = {3016, 3018, 3034, 3055, 3074, 3090, 3109, 4011, 4030, 4051, 5024, 5063}
  47.       local a = table.getn(i1)
  48.       local b = table.getn(i2)
  49.       local num = 11
  50.       if a == b then
  51.          for i = 1, a do
  52.             for j = i1[i], i2[i] do
  53.                additem(j, num)
  54.             end
  55.          end
  56.       end
  57.    elseif x == 4 then
  58.       addmoney(1000000)
  59.    elseif x == 5 then
  60.       for i = 1, 11 do
  61.          join(i)
  62.       end
  63.    elseif x == 6 then
  64.    else
  65.       restore_cheat_q()
  66.    end
  67. end

  68. restore_save_ans = function(x)
  69.    local mainid = get_mainrole()
  70.    local mainname = get_rolename(mainid)
  71.    if x == 1 then
  72.       call_save()
  73.    elseif x == 3 then
  74.       restore_team()
  75.    elseif x == 2 then
  76.       restore_cheat_q()
  77.    else
  78.       restore_save_q()
  79.    end
  80. end
复制代码

[ 本帖最后由 wuspring 于 2008-1-12 22:45 编辑 ]

使用道具 举报

帖子
548
精华
0
积分
274
金钱
2437
荣誉
0
人气
0
评议
0
发表于 2008-1-12 19:29:15 |显示全部楼层
V大,您就是我心目中的偶像,您就是那红太阳,照耀俺们呀

使用道具 举报

沙之弓手
轩辕剑 清风剑客

帖子
668
精华
0
积分
394
金钱
2012
荣誉
6
人气
0
评议
0
发表于 2008-1-12 19:29:35 |显示全部楼层
能不能改出个飞之部的剧情篇来
支持楼主的mod
希望见到新的剧情
不用签名就要为百度打广告

使用道具 举报

苍白的死之女王

帖子
1288
精华
0
积分
694
金钱
486
荣誉
5
人气
0
评议
0

发表于 2008-1-12 19:53:54 |显示全部楼层
好吧。。。对于只粗浅学了C++的我来说这种东西只能看一看有没有认识的语句
然后支持。。。。

飞鸿翔舞慈云中,若华飘絮相应红。彤阳夕落何所去,雨过云舒醉清枫。
-------------------
看到樱花的时候,请你想起我。
只要能想起我...就够了

使用道具 举报

帖子
350
精华
0
积分
175
金钱
381
荣誉
0
人气
0
评议
0
发表于 2008-1-12 20:06:52 |显示全部楼层
最好能出专业的剧情编辑器

这样修改语句做mod 不是一般的花费精力

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

手机版|Archiver|游侠NETSHOW论坛 ( 浙ICP备12018679号-4 )

GMT+8, 2018-12-16 03:33 , Processed in 0.275358 second(s), Total 16, Slave 12 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

分享到