《軒轅劍外傳-漢之雲》指令碼編寫簡明教程

發佈日期

漢之雲指令碼研究(附帶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來測試相應任務是否完成。



相關攻略文章

最新攻略