《軒轅劍外傳-漢之雲》指令碼編寫簡明教程
漢之雲指令碼研究(附帶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來測試相應任務是否完成。
相關攻略文章
《軒轅劍外傳-漢之雲》劇情CG全圖
《軒轅劍外傳-漢之雲》打敗白衣尊者心得
《軒轅劍外傳-漢之雲》論漢之雲的真正主題
《軒轅劍外傳-漢之雲》劇情探討兼談整個遊戲
《軒轅劍外傳-漢之雲》煉妖心得
《軒轅劍外傳-漢之雲》煉妖壺狂想曲和研發日誌
《軒轅劍外傳-漢之雲》娛樂眼光看軒轅(劇透)