轩辕剑外传:汉之云
轩辕剑外传:汉之云
平台PC
发售时间PC 2023-01-12
时长未知
类型角色扮演
官方中文支持
制作发行DOMO Studio,SOFTSTAR ENTERTAINMENT/方块游戏(CubeGame),SOFTSTAR ENTERTAINMENT / DOMO Studio,SOFTSTAR ENTERTAINMENT/方块游戏(CubeGame),SOFTSTAR ENTERTAINMENT
标签卡通风格策略角色扮演武术剧情丰富奇幻

轩辕剑外传-汉之云: 脚本编写简明教程

类型:攻略发布日期:2008-01-13来源:本站原创作者:佚名

汉之云脚本研究(附带MOD制作工具)
http://www.gamersky.com/Soft/200801/11339.shtml

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

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

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

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

一、基础修改

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

[Copy to clipboard] [ - ]CODE:
restore_motion = function()
   local mainid = get_mainrole()
   local mainname = get_rolename(mainid)
   restore_team()
   msginfo("全身籠罩一股清風")
end

restore_save = function()
   restore_motion()
   restore_save_q()
end

restore_save_q = function()
   selmsg(2, "選項:")
   setselect(1, "1.存檔")
   setselect(2, "2.取消")
   sleep(3)
   waitanykey()
   restore_save_ans(getselectanwser())
end

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

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

[Copy to clipboard] [ - ]CODE:
restore_save_q = function()
   selmsg(3, "選項:")
   setselect(1, "1.存檔")
   setselect(2, "2.作弊")
   setselect(3, "3.取消")
   sleep(3)
   waitanykey()
   restore_save_ans(getselectanwser())
end

restore_cheat_q = function()
   selmsg(6, "選項:")
   setselect(1, "1.怪物")
   setselect(2, "2.物品")
   setselect(3, "3.裝備")
   setselect(4, "4.金錢")
   setselect(5, "5.隊伍")
   setselect(6, "6.取消")
   sleep(3)
   waitanykey()
   restore_cheat_ans(getselectanwser())
end

restore_cheat_ans = function(x)
   local mainid = get_mainrole()
   local mainname = get_rolename(mainid)
   if x == 1 then
      local mon = {17, 14, 15, 15, 16, 16, 14, 12, 7, 6}
      local a = table.getn(mon)
      for i = 1, a do
         for j = 1, mon[i] do
            addsprite(i * 100 + 900 + j, 1)
         end
      end
   elseif x == 2 then
      for i = 6001, 6028 do
         if i ~= 6024 then
            additem(i, 99)
         end
      end
      for i = 6039, 6046 do
         if i ~= 6040 then
            additem(i, 99)
         end
      end
   elseif x == 3 then
      local i1 = {3001, 3018, 3021, 3041, 3061, 3081, 3101, 4001, 4021, 4041, 5001, 5051}
      local i2 = {3016, 3018, 3034, 3055, 3074, 3090, 3109, 4011, 4030, 4051, 5024, 5063}
      local a = table.getn(i1)
      local b = table.getn(i2)
      local num = 11
      if a == b then
         for i = 1, a do
            for j = i1[i], i2[i] do
               additem(j, num)
            end
         end
      end
   elseif x == 4 then
      addmoney(1000000)
   elseif x == 5 then
      for i = 1, 11 do
         join(i)
      end
   elseif x == 6 then
   else
      restore_cheat_q()
   end
end

restore_save_ans = function(x)
   local mainid = get_mainrole()
   local mainname = get_rolename(mainid)
   if x == 1 then
      call_save()
   elseif x == 3 then
      restore_team()
   elseif x == 2 then
      restore_cheat_q()
   else
      restore_save_q()
   end
end
二、剧情修改
剧情修改相对比较复杂,所以我们先从人物对话开始介绍。
下面是飞羽军营中和“徐豐”对话的相应代码(简化过了):

[Copy to clipboard] [ - ]CODE:
t341 = function()
   local mainid = get_mainrole()
   local mainname = get_rolename(mainid)
   chang_role_dir_torole(mainid, 341, 0)
   lock_player(1)
   set_watch_each(mainid, 341)
   if isfon(1002) == 1 and isfon(1017) == 0 then
      local a = random(2)
      if a == 0 then
         facetotalk(341, "徐豐", "聽說供應曹賊糧草的是在邽嶺山中的砦堡!")
      else
         facetotalk(341, "徐豐", "邽嶺就在我軍營外幾里處。")
      end
   else
      if isfon(1017) == 1 and isfon(1053) == 0 then
         facetotalk(341, "徐豐", "我們的補給從漢中運來,路途遙遠。不像曹賊,邽嶺以北幾乎是援助他們的砦堡。")
      else
         if isfon(1101) == 1 and isfon(1151) == 0 then
            facetotalk_noback(341, "徐豐", "我們現在就在賊將郭淮、費曜駐守的上邽城外。")
            chatinfo(341, "徐豐", "料想他們怎麼也想不到,我們飛羽部隊會在這地方。")
            chang_role_dir(341, 0, 1)
         end
      end
   end
   lock_player(0)
   set_watch_back(mainid, 341)
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来测试相应任务是否完成。



本文内容来自网络收集整理,版权归原作者所有。 · 所属游戏:轩辕剑外传:汉之云
← 返回 轩辕剑外传:汉之云 攻略列表

同游戏其他攻略共 133 篇

《轩辕剑外传:汉之云》 炼妖塔妖怪GM8代码游戏秘籍2009-06-11《轩辕剑外传:汉之云》各角色的战斗实用性(更新至主线角色+青冥)攻略2009-01-23《轩辕剑外传: 汉之云》高级怪的系统炼制绝对真实攻略2009-01-17《轩辕剑外传: 汉之云》脑残版攻略 照着玩就行 包含全支线攻略2008-09-28《轩辕剑外传: 汉之云》战斗个性系统全解密攻略2008-08-30《轩辕剑外传: 汉之云》角色介绍 吴阵营攻略2008-08-18《轩辕剑外传: 汉之云》角色介绍 魏阵营攻略2008-08-18《轩辕剑外传: 汉之云》角色介绍 汉阵营攻略2008-08-18《轩辕剑外传: 汉之云》五大感人瞬间攻略2008-08-18《轩辕剑外传: 汉之云》等级对应招式详细资料表攻略2008-07-19《轩辕剑外传: 汉之云》隐藏爱情--章鱼爱端蒙攻略2008-07-06《轩辕剑外传: 汉之云》武器 衣服炼化完全表攻略2008-07-02《轩辕剑外传: 汉之云》十大悲情人物攻略2008-07-02《轩辕剑外传: 汉之云》“十天干”命名攻略2008-07-02《轩辕剑外传: 汉之云》秘籍 洗钱方法游戏秘籍2008-06-14《轩辕剑外传: 汉之云》破关心得攻略2008-06-05《轩辕剑外传: 汉之云》属性与伤害的关係and其他心得攻略2008-05-23《轩辕剑外传: 汉之云》双核心电脑遇到的问题 并以解决问题解决2008-05-16《轩辕剑外传: 汉之云》亚希悲情之二-御妹成绩拿出来攻略2008-04-27《轩辕剑外传: 汉之云》各角色最强武器获得方法简述攻略2008-04-25《轩辕剑外传: 汉之云》白衣尊者视频攻略2008-04-25《轩辕剑外传: 汉之云 》人物十二星座乱弹攻略2008-04-25《轩辕剑外传: 汉之云》对白衣尊者第一战的分析攻略2008-04-17《轩辕剑外传: 汉之云》主线推车小技巧攻略2008-04-13《轩辕剑外传: 汉之云》初期的合成妖魔鬼怪攻略2008-04-13关于汉之云剧情和一些历代剧情的感想攻略2008-04-06轩辕剑外传: 汉之云 煉妖心得攻略2008-04-06轩辕剑外传: 汉之云全部怪物的鍛治資料攻略2008-03-14轩辕剑:(遊戲中各類型當機) 和 (顯卡玩歷代作品方法)一次大補完攻略2008-03-14轩辕剑外传: 汉之云 打1.01补丁后战斗死循环解决方法研究问题解决2008-03-14