注册 | 登录

游侠NETSHOW论坛





查看: 21557|回复: 51
打印 上一主题 下一主题

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

帖子
1270
精华
39
积分
13841
金钱
40858
荣誉
517
人气
2355
评议
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   查看全部评分

使用道具 举报

帖子
398
精华
0
积分
199
金钱
2330
荣誉
0
人气
0
评议
0
52#
发表于 2010-6-16 09:46:05 |只看该作者
到底是封装到高级了,怪简单。闭包+面向过程函数式,没有OO嘛
統率 45   武力 46   智力 39 政治 35  魅力 40    特技 妙計
槍兵 B   戟兵 C   弩兵 B   騎兵 C   兵器 C   水軍 C
親密武將 馬超 孫策 甘寧 孫尚香 郭嘉
厭惡武將 郭淮 董卓 諸葛亮 鄧艾
性格 剛瞻  情義 稍高   相性 124  野心 稍高 漢室 無視

使用道具 举报

帖子
228
精华
0
积分
115
金钱
830
荣誉
0
人气
0
评议
0
51#
发表于 2009-12-17 13:35:15 |只看该作者
看到代码之后两眼一抹黑!我要昏倒了!
跟着春哥,有吃有喝!

使用道具 举报

帖子
3
精华
0
积分
2
金钱
33
荣誉
0
人气
0
评议
0
50#
发表于 2009-12-16 17:54:54 |只看该作者
哪位高手指点一下 怎样在游戏后期把游兆调出来呀?!!

使用道具 举报

帖子
931
精华
0
积分
478
金钱
328
荣誉
1
人气
0
评议
0
49#
发表于 2009-10-10 10:23:43 |只看该作者
太难了,只能支持了。。。。。。。。。。。。。。。。。。。。。
=====================
该用户发言已被绿坝软件自动屏蔽
=====================

使用道具 举报

帖子
47
精华
0
积分
24
金钱
251
荣誉
0
人气
0
评议
0
48#
发表于 2009-4-7 19:10:30 |只看该作者

回复 #1 vbvan 的帖子

赞,技术贴

一直想可以自己修改剧情,终于有人值了条明路了

定一个

使用道具 举报

帖子
84
精华
0
积分
42
金钱
715
荣誉
0
人气
0
评议
0
47#
发表于 2008-7-25 20:07:06 |只看该作者
van大的好东东,顶起!!

使用道具 举报

帖子
1647
精华
0
积分
835
金钱
2839
荣誉
1
人气
0
评议
0
46#
发表于 2008-3-22 13:35:10 |只看该作者
好强大 不过看不太懂 纯支持了... - -b
我的签名啊...

使用道具 举报

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

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

帖子
16757
精华
4
积分
11927
金钱
63795
荣誉
242
人气
3289
评议
13

45#
发表于 2008-3-21 23:31:51 |只看该作者
一直在玩FFX的模拟器,好久没来仙剑区了.
看到神帖,再顶一下.

使用道具 举报

帖子
50
精华
0
积分
25
金钱
229
荣誉
0
人气
0
评议
0
44#
发表于 2008-3-17 16:25:54 |只看该作者
神贴,不懂编程的最好别去乱改。。

使用道具 举报

帖子
155
精华
0
积分
78
金钱
2053
荣誉
0
人气
0
评议
0
43#
发表于 2008-3-17 01:27:11 |只看该作者
盼望自定剧情早点出来 [舒服] [舒服] [舒服]

使用道具 举报

帖子
31
精华
0
积分
16
金钱
177
荣誉
0
人气
0
评议
0
42#
发表于 2008-2-28 21:35:38 |只看该作者
参数的设定
平衡最重要@@@

镜头做好了一遍就可以了@

使用道具 举报

帖子
22
精华
0
积分
11
金钱
61
荣誉
0
人气
0
评议
0
41#
发表于 2008-2-28 20:09:10 |只看该作者
[害怕]
我那点底子阿。。。
怎么混。。。

使用道具 举报

权天使
播道传教 修女
游戏问答小精灵

帖子
2126
精华
0
积分
1333
金钱
2498
荣誉
27
人气
1
评议
0
40#
发表于 2008-2-18 23:05:32 |只看该作者
啥.......C++一样么

使用道具 举报

帖子
440
精华
0
积分
231
金钱
832
荣誉
1
人气
0
评议
0
39#
发表于 2008-2-18 23:00:22 |只看该作者
对van大顶礼膜拜......
得之坦然,失之淡然,争其必然,顺其自然。

敌骚,吾去脱她衣!

拖上去!

使用道具 举报

帖子
240
精华
0
积分
120
金钱
2329
荣誉
0
人气
0
评议
0
38#
发表于 2008-2-18 21:58:01 |只看该作者
好强大的帖子啊,顶上
即使用永恒的时间来等待…  我也想再见你一面………

使用道具 举报

帖子
390
精华
0
积分
235
金钱
1885
荣誉
4
人气
0
评议
0
37#
发表于 2008-1-26 15:18:09 |只看该作者
这样的话,单个人能做的不过就是改几个道具数值,让游戏比较容易一些。
至于修改剧情这么复杂的活,没有团队组织分工好像不现实啊。

PS:Lua语言就是C和basic的杂糅么?看着有一种似曾相识的感觉……

使用道具 举报

帖子
390
精华
0
积分
195
金钱
470
荣誉
0
人气
0
评议
0
36#
发表于 2008-1-26 14:54:01 |只看该作者
完全看不懂  OY   
不过还是很佩服阿  

使用道具 举报

☆才华横溢之极限☆
游侠元老版主
游侠剑阁工作组【翻译】
GBC☆口袋妖怪 梦幻
魏 吏部尚书

★★★★★

元老版主勋章版主勋章资深版主勋章大头像勋章《三国志12》汉化贡献勋章特色头衔勋章勤劳之证剑阁工作组资深组员勋章

帖子
4631
精华
2
积分
4178
金钱
16096
荣誉
144
人气
202
评议
2

35#
发表于 2008-1-26 14:10:38 |只看该作者
我是专程进来膜拜van大的   

使用道具 举报

帖子
134
精华
0
积分
67
金钱
2159
荣誉
0
人气
0
评议
0
34#
发表于 2008-1-26 03:01:01 |只看该作者
学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习

使用道具 举报

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

手机版|Archiver|游侠NETSHOW论坛 ( 苏ICP备2023007791号 )

GMT+8, 2025-11-13 12:29 , Processed in 0.431943 second(s), 13 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

分享到