Recrit
【捨丸&KID】如何製作分歧劇情與變數介紹(2)
所謂的變數像能裝進文字或數值的盒子。在遊戲中想要記下某些東西時,我們可以把那個數值或是文字列裝到變數之中,並且在必要的時候取出內容來使用。
在這裡我們舉一個遊樂園的例子來思考看看。當想要判斷主角是否持有入場券時要怎麼做呢?
1, 首先準備一個變數。我們將這個變數暫稱為「取得入場券情報」。在Nscripter裡數值變數的初期值,也就是在還沒有輸入任何數值前都是為0。
2, 然後,如果主角通過了購買入場券的劇情,我們便將「取得入場券情報」的變數輸入數值1。這麼如果有通過購買入場券的劇情則「取得入場券情報」的內容便會是1,而沒通過時內容便仍然是0。
3, 然後,在進行到要進入遊樂園的劇情時,Nscripter對「取得入場券情報」的內容進行檢查。如果裡面的數字是0的話也就是沒有持有入場券而移動到無法進入的劇情。如果裡面數字是1的話就是擁有入場券而移動到進入遊樂園的劇情。 Nscripter可以於所在的狀況下參照各種數值來對遊戲上劇情該如何進行做出判斷。
* 變數會被用到的地方
Pattern1:因應條件來處理劇情分歧
在變數中輸入data
→判斷是否有符合條件
→執行配合其狀況的命令
這是在程式處理中常會出現的pattern。就算是經過system customize而變得龐大又複雜的程式,其實在實際上可以說就是把許多單純的條件分歧連接在一起而已。
Pattern2:把會變化的數值表示在畫面上
在變數中輸入data
→將變數的內容表示在畫面上
想將文章中的日期、所選擇的物品等會變化的部份表現在畫面上的時後會使用到變數。還有,讓玩家輸入主角的名字在作品中使用也是屬於這個pattern。
Pattern3:計算經過了多少次處理
在變數中輸入count data
→當完成了所設定的回數後停止重複處理
for~next命令的pattern。
在這裡請先想成利用變數來計算重複處理的次數即可。
* 變數的種類
變數有著數個種類。這裡我們先對其種類和使用方法進行說明。
* 數值變數
輸入數值的變數稱為「數值變數」。在Nscripter裡使用「%3」這樣於數字前面放上%來表示(3只是範例 %1 %2 %4 都可以)。
變數範例
%3
在進行計算數值、角色好感度等跟數字有關的處理或是判斷flag時常被使用。在使用sp製作動作系統還是system customize等高度的處理時無法欠缺的變數。
* 文字列變數
輸入文字列的變數。利用像「$3」這樣於數字前面放上$來表示。
變數範例
$3
文字變數會於像「今天的點心是(文字變數)」這樣,於文章中可以變化的文字部份被使用到。
Point:明明是輸入文字為何稱為變數?
有些讀者可能會覺得「明明是輸入文字為何稱為變數?」在英語中變數為「variable」意思是可變化之物。因此我們使用中文的「變數」時在語感和實際功能上有些微差異。
* 變數的號碼
數字變數和文字變數的號碼即使在script中重複使用也沒有關系。
%3和$3是完全不同的變數。
Nscripter可以設定使用從0號到24999號共25000個變數。
從0號到199號是普通的變數,於遊戲動作時間雖然會被保存下來,但是一但經過reset後便會被初期化。
200號到24999號為止的變數即使經過reset也會被保存下來,稱為global變數。
* 變數的用途
利用0與1來判斷是否擁有某物(flag處理)
於數字變數中輸入0(無)1(有)的數值,進行到需要進行盼斷的時候打開變數認數值進行判斷。
對「是否有從師父手上拿到重要道具」進行判斷
結果:0(沒有)沒有道具無法打敗敵人
1(有)擁有道具能夠打倒敵人
對「是否壓下拉桿」進行判斷
結果:0(沒有)前方的樓梯沒有降下來無法繼續前進
1(有)前方的樓梯有降下來可以繼續前進
對「是否放過宿敵」進行判斷
結果:0(沒有)宿敵已經死去,在主角遇到危機的狀況不會來救助。
1(有)宿敵在遇到危機時會前來救助。
這就是被稱為flag判斷的作法。
輸入數值以判斷程度
在變數中輸入數值,直到進行到需要判斷的地方時比較變數之數值以判斷程度。
在買東西時對「金錢是否足夠」進行判斷(數值:金錢)
結果:金錢<價格 金額不夠
金錢>價格 可以購買,也會有殘餘金額
金錢=價格 雖然能夠購買,但是沒有剩下金額。
以數值對「女朋友對主角的感情」進行判斷
結果:好感度>任意設定的數值 喜歡:前進到true end。
好感度<任意設定的數值 討厭:前進到bad end。
好感度=任意設定的數值 普通:前進到normal end。
對「手槍裡的子彈是否用光」進行判斷
結果:殘彈<0發 子彈用光
殘彈>0發 還有子彈
殘彈=0發 子彈用光
在畫面表示(如cut in)等讓sp移動時使用
於sp的表示座標中使用變數、或是使用loop命令來讓它移動等在圖像的移動表示上可以用到變數。(請參考2-6)
* 文字變數的用途
根據不同的情況可以變化成不同的台詞
在遊戲中,常會有所持的道具不一樣的情況。當台詞裡出現道具的名稱時可以使用。
* 變數的使用法
* 代入
變數在一開始的時候裡面並沒有輸入任何內容(數字變數時原本為0,而文字列變數則是沒有東西)。因此在使用變數之前必須先輸入data。將data輸入變數這件事我們稱之為「代入」。
於代入時需使用mov命令。
程式碼
mov 變數名稱,值(數值或文字列)
範例(數值變數)
mov %3,24
mov為命令本體。
%3是變數的名稱。
範例中將24代入%3。
範例(文字列變數)
mov $3,”早安!”
mov是命令本體,$3是變數名稱。
範例中將「早安!」的文字列代入$3之中,注意文字兩邊一定要加上””這表示雙引號中間的資訊都會被判別成字串。
* 變數的初期化
數字變數的預設初期數值為0,要馬上代入數值也是可以。
但是若要嚴謹地製作時,在遊戲一開始的時候就要先將要使用的變數代入0將其reset。這樣的作業稱為「變數的初期化」,或者直接稱為「初期化」。
會這麼做是為了防止變數被輸入數值而在判斷時產生錯誤而造成bug。
並且,在進行數值處理時,常會先代入數值作為初期值。
以6000元代入主角初期所持有的金錢數目
mov %25,6000
以10代入珠美的初期好感度
mov %20,10
以6發子彈代入手槍的初期子彈數目
mov %55,6
* 變數是可以直接改寫的
flag原本為0以1代入之後就變為1,雖然這樣容易讓人以為這是增加數值,但是實際上這並不是增加數值而是直接將變數的內容改寫的命令。
假設有個內容數值為3的變數。
那麼代入2之後,變數的內容就變成了所代入的2。
當想要對數字變數的內容進行加減乘除時,必須使用計算處理命令。
* 於文章中表示變數
當想要在畫面上表示文字列變數中的data時,必須直接在文章中輸入「$3」。
當文章表示執行到變數的位置時,Nscripter會根據變數的內容在畫面上表示內容的值。
但是數值變數(%)裡面所輸入的數值無法直接表示在畫面上。
(例文)
「
;mode800
*define
clickstr"!?。」",2
game
*start
bg "BG\093.JPG",1
mov $3, "天譴寶寶一號"
每天一大早,$3說你好!
click
end
」
* 半形文字無法被表示
Nscripter原則上於畫面中所表示的文字無法使用半形文字,如果直接將數值變數表述出來的話文字可能會變成亂碼。當數值是偶數個數時還能夠正常表示,但是如果是奇數個數則在之後的畫面表示文字會變成亂碼。
當想要將數值變數內容的數值表現在畫面上的時候:
先判斷數字變數的數值後於文字列中代入對應的全形文字。
使用將數值轉換成全形文字代入的itoa2命令。
—必須使用上述的處理。
* itoa2命令
此命令能夠將數值(如果直接被表示會變成半形文字)轉換成全型文字,代入文字列變數中。
程式碼
itoa2 文字列變數,數值
範例
mov %4,2007
itoa2 $0,%4 ;這表示將%4裡2007的數字轉為2007代入$0中
$0;在畫面顯示$0
;畫面上會表示「2007」
* 先決定變數號碼的使用規則
使用Nscripter必須決定哪個變數號碼給哪個變數使用。但是要使用哪種處理方式和哪些變數號碼都是製作者的自由。
但是如果將變數只是隨意且沒有規劃的配置很容易會造成混亂,再運用變數之前先決定自己的配置規則後再來運用能夠有效的防止bug的產生。
例如將0~10號規劃為在當時會使用到的變數、20~30號角色們的好感度、31~50號是遊戲內的各個flag,這樣根據需求來切分使用的區塊的話能夠防止使用錯誤的變數,也能夠防止bug。
* 在變數後面加上comment
由於變數在script中只是個單純的數字,在完成腳本之後回來檢視,常常會發生「阿咧?這個%294到底是什麼東西的變數?」這樣混亂的情況。
所以在設定變數時直接在後面加上一個簡易的comment讓製作者能夠一眼就瞭解這個何種變數的話,在之後的處理也會較輕鬆。
mov %20,10 ; 珠美的好感度(初期值10)
並且除了註解之外於筆記本上(或是Excel等紀錄軟體中)製作變數的清單會讓作業變得更為輕鬆。
【捨丸&KID】如何製作分歧劇情與變數介紹(1)
上一篇跟大家知道介紹要如何製作按鈕,這一篇就要開始介紹如何製作分歧劇情。
分歧劇情跟變數的運用有很大關係,最簡單的分歧劇情就是選項一走A路線、選項二走B路線,這邊只需要用到一個變數,兩種數值,在NScripter中甚至只要記住簡單的程式碼複製貼上就行,但如果是牽涉到多個角色好感度不同所造成的分歧劇情,就不是這麼容易了。
牽涉到多個角色好感度的分歧劇情,會運用到許多變數,有時還甚至必須設計一個判別公式,因此要製做一個有豐富分歧劇情的腳本,學好變數的運用是必要的事情。以下我們就先從選項的介紹與應用開始。
* 選項的種類
選項有幾種分類:
* 完全分歧
在選擇之後故事的走向會完全分歧的選項。
例如在兩位女孩中要選擇誰當女朋友、要和誰一起出發去冒險等在重大的選擇時會使用的分歧。 這是根據其選項故事會完全不同的種類。
point:完全分歧的數量
只要出現三次的二擇一完全分歧選項的話,在最後就必須出現八個劇情的分歧路線。一旦讓故事分歧的話那就一定得在故事的走向上做出變化,那麼就得準備8個完全不同的episode。 而且在製作時也必須考慮玩家到底會走入哪個路線,這麼一來單獨一個路線的故事在密度上也會變得較為薄弱,因此做出很多完全分歧這件事必須要謹慎考慮。
* 回歸分歧
不管是選擇哪邊都會回歸到原本故事走向上的選項。
像是早餐要吃什麼、洋裝的顏色要選什麼等,主要是用來製造氣氛或是好玩而已用途的選項。
這個選項是和故事的進行並沒有關聯的選項,可以自由的配置在故事裡。但是如果配置太多的話可能會導致故事的節奏感被破壞。
* 延遲分歧
在選擇之後並沒有馬上產生任何變化,而是要在經過一段時間後才會產生效果的選項。像是要不要裝備上某個護身符這類的選項,在選擇裝備之後並不會發生任何事,但是如果沒有護身符的話便會在之後被怪物發現,這類的選項中使用到的分歧。
這種選項如果被巧妙的配置的話可以讓遊戲變得更有趣,但是如果配置太多的話玩家會變得難以判斷到底是哪個選項出了錯誤,使得遊戲的難易度上升。
* 完全分歧的製作法
使用選項的命令是select。
程式碼
select
“想要表現的文字”,移動目標標籤,
“想要表現的文字”,移動目標標籤,
select為命令的本體。“想要表現的文字”的””中所出現的全形文字會顯示的畫面上。通常這裡會寫上選項的文句。
在選擇了選項之後直接跳躍前往的標籤由” 移動目標標籤”來指定。
在想要表示複數個選項時請在後面加上半形符號的”,”。
只要在移動目標標籤的後面加上”,”的話,不管是幾選一的選項都能夠製作。
「
;mode800
*define
clickstr"!?。」",2
game
*start
select “選項一”,*aaa,”選項二”,*bbb,”選項三”,*ccc
*aaa
天譴寶寶一號
click
end;注意這理一定要加end或是goto其他標籤,否則程式會繼續執行下去把每個選項跑一遍,當然有時也可以利用這種方式省去一些程式碼
*bbb
天譴寶寶二號
click
end
*ccc
天譴寶寶三號
click
end
」
注意選項是只出現在對話框範圍裡的,請善用setwindow指令互相配合。
* 回歸分歧的作法
回歸分歧可由組合select命令和goto命令做出。
* 在作成回歸分歧時使用到的命令
程式碼
goto 移動目標標籤
goto的效果為無條件移動到所指定標籤的命令。
goto是命令本體。
會直接跳躍到「移動目標標籤」所指定的標籤。
* 回歸分歧的例子
首先利用和完全分歧一樣利用select來製造分歧,但是在前進目標的標籤區塊的最後配置goto命令。
而那個goto命令不管是哪個都是將*s_03指定為移動目標。這麼一來不管是選擇哪個選項都會在最後移動到*s_03而使得故事重新會合在一起。
到底是回歸分歧還是完全分歧,在玩家還沒有完全破關之前是無法知道。不需要像完全分歧那樣隨著製作選項就必須在添加故事,使用幾個回歸分歧的話也可能只花費較少心力而讓玩家有「沒想到是分歧挺多,挺深奧的遊戲。」這樣感覺。
point:選項的禁忌
禁忌一:移動的選項不要唐突地出現沒有去過的地方。
例如身為學生的主角要出發去尋找失蹤的女主角時。
1.去學校
2.去公園(從前約會去過的地方)
3.去博物館
在此之前的故事裡,並沒有出現博物館的任何資訊,那麼主角在不是根據推理的狀態下做出選擇時,不可以將第三個選項作成像是正確的選項。玩家們會有一種好像被騙了感覺。
禁忌二:不要用選項來決定一種現象。
1.走廊裡有幽靈通過。>選擇的話會有幽靈通過。
2.走廊裡有貓通過。>選擇的話會有貓通過。
像這樣根據選擇來變化結果的選項並不好。
由於在遊戲中玩家們基本等於主角,而讓玩家們自己選擇發生在它身上的狀況的話會讓玩家有相當奇怪的感覺。
1.覺得走廊裡好像有幽靈通過,逃到房間裡面去。>選擇的話就無法得知走廊裡的東西。
2.覺得走廊裡好像有貓通過,打開門看看。>選擇的話會遇到幽靈。
像這樣的選項感覺比較好。