Recrit
【捨丸&KID】如何製作分歧劇情與變數介紹(4)
* Global變數為何?
* Local變數與Global變數
到此之前為止所說明的變數稱為local變數。
Local變數雖然會被保存於遊戲之中,但是在reset後遊戲本身在從頭開始時內容便會全部消失。(於遊戲途中紀錄的場合時,在那時的變數之值會被作為save data儲存下來)。
於遊戲中(Local)中所記憶的變數,稱為內部變數。
與此相對,有另一個被稱為Global變數的東西。
Global變數於遊戲的外側紀錄下data,在遊戲reset之後其值也不會消失不見。
於遊戲外(Global)所記憶的變數,稱為外部變數。
Point:Nscripter的Global變數
和其他的program soft在global變數、local變數的定義上有時會有些許差異。但是總之在使用Nscripter時記下:於遊戲執行內部所保存的變數為local 變數,而於遊戲外的檔案上留下data保存的變數為global變數。
* Global變數使用例子
Global變數會在這些時候使用。
只於遊戲的第一輪時表現prolog,第二輪時會跳過prolog開始執行。
紀錄下遊戲的道具、金錢,當在第二輪開始時能夠持有這些東西開始遊戲。
在看過結局之後會追加補充劇情。
在看過全部的結局後,開啟通往真正結局的劇情。
保存下所輸入的主角姓名,使其在第二輪之後也能夠使用相同的名字開始遊玩。
* 在使用Global變數時
在使用Global變數時必須先於定義區域中宣告。
預設值中0~199為local變數,200~4000為Global變數。
宣告時使用globalon指令。
程式碼
globalon
範例
*define
globalon
game
*start
Globalon為指令本體。
只要沒有在定義區域中輸入這個指令,則200~4000號的global變數無法使用。
雖然也能夠當成變數使用,但是和local變數不同,在save時不會將數值保存下來因此只能作為暫時利用的變數。
一旦做出此宣告之後,於nscr.exe所存在的檔案夾裡會增加gloval.sav的檔案並且將global變數的值保存於此。
* 改變global變數的界線
使用value能夠改變global變數和local變數的界線,使兩者的個數改變。
當local變數的號碼已滿時可以使用。
程式碼
;value<界線值>
範例
;value 500
*define
globalon
game
*start
;value為指令本體。
和普通的指令不同,必須在*define上的第一行宣告。
500為界線值。此例中到變數499號為止能夠作為local變數使用。
同樣會在第一行宣告的指令還有;mode800(將畫面切換為800x600 mode:請參考109頁),與其同時使用的狀況請輸入;mode800,value500。
* 在使用global變數必須注意的事項
Global變數雖然能夠被當成普通的變數使用。
但是必須注意的是,global變數的值會一直被保持著。
如果用於演算系的指令裡,每當執行遊戲就會被執行計算。因此在遊戲終了後想要將其清空的值請使用local變數。
* global變數範例
global變數的範例。
示範只有在第一輪遊戲中顯現prolog的例子。
Sample 只在第一輪顯現prolog /02/02-03-01/00.txt
「
;mode800
*define
clickstr"!?。」",2
globalon ;開啟global變數
game
*start
setwindow 45,354,25,4,22,22,0,1,20,1,1,#bbbbbb,40,340,620,460
bg "BG\093.JPG",1
if %900=1 goto *honbun
*prologue
每天一大早,天譴寶寶都會說你好!
*honbun
天譴寶寶說 你好!
*ending
mov %900,1
end
」
試著使用重複處理
* 所謂的重複處理是?
在製作普通的novel game時不太會用到,但是在開始製作較花費功夫的處理時常會使用到—for~next命令。
為「將同樣的重複X次」意義的命令。
* for~next的用途
for~next命令會依據所設定的次數,重複執行輸入在for和next之間的處理。
最常被用到的用法是拿來做計算回數的處理。
例如會在下面的場合用到。
以容積為5的杯子來汲水至容積為50的水桶中→重複到水滿了為止。
將圖像從畫面外(x640)移動至畫面內(x30)這動作重複表示
使用mp3的BGM音量增加到所設定的大小。
blt動畫處理的控制。
請先記住「在使用到重複處理時就用for~next」。
* 命令文的結構
程式碼
for 設定的初期值 目標數值 step數目
各種處理
next
範例
for %1=0 to 200 step 20
各種處理
next
for為命令本體。
%1為變數。0為變數的初期值。在進行記算次數的處理時會從這個數值開始。
to 200是目標值。變數到達這個數值後所重複的各種處理就會停止,開始執行next之後的命令。
step20為步幅大小,設定的是每次增減時的數值差大小。在省略沒有輸入時預設為1。
在此範例中,%1會從0開始每次增加20直到到達目標值200之前會重複for和next之間的處理十次。
* 使用範例
「
;mode800
*define
clickstr"!?。」",2
game
*start
bg "BG\093.JPG",1
lsp 0,":c;butterflyUp.jpg",224,95
print 1
for %1=0 to 200 step 20
msp 0,50,25,255
print 1
wait 500
next
click
end
」
亂數處理
* 所謂的亂數是?
讓電腦隨機選擇的數字稱為亂數。
例如在走過暴風雨中的吊橋時會有40%的失敗機率、考試會有70%的合格機率等想要使用機率來判定時,或是隨機變更進入書目時的圖像、每次開始遊戲時的畫面上的短文隨機出現等各種處理上會用到亂數。
Nscripter在想用到亂數時必須使用rnd(注意不是md是”r””n””d”)命令。
* 從0到任意數值之間亂數選取數值
程式碼
rnd 變數名稱,數值上限
範例
rnd %3,100
rnd是命令本體。
為RaNDom的縮寫。
%3為利用亂數產生命令的數值所代入的變數名稱。所產生的數值範圍為從0開始到上限值-1為止。
於範例中會從0~99的數值中隨機挑選一個數值代入變數%3。
* 從某個數值到某個數值之間亂數選取數值
當想要從某個數值到某個數值之間亂數選取一個數字時使用rnd2命令。
程式碼
rnd2 變數名稱,設定的開始數值,設定的終點數值
範例
rnd2 %3,80,150
rnd2是亂數命令的本體。
%3是變數名稱。
範例的意義為於數值80到150中隨機選取一的數字代入變數%3。
【捨丸&KID】如何製作分歧劇情與變數介紹(3)
* 依據條件來產生分歧看看
條件分歧是讓Nscripter來判斷變數中的數值,然後再執行命令。
例如像是使用flag,在檢查過變數的內容後會自動執行符合其條件的命令。
可以將其想像為鐵路的軌道切換點。
* 條件分歧的用途
作為flag判斷使用,進行判斷有、無的處理。
用於好感度判斷,執行如果在某個數值以上則進行A、在某個數值以下則進行B這樣的處理。
對輸入的文字列進行評估,判斷是否為問題正解之處理。
* 條件分歧的命令
為了判斷變數的數值會使用到if命令。
其意義為假設…為true則…的命令。
程式碼
if 條件,命令
範例
if %3=1 goto *chapter1
if為命令的本體。
%3=1為條件式。
當條件式正確無誤的成立時,會執行其後的命令。當條件式沒有成立時,不會執行命令繼續前進到下一行。
請注意,if命令的條件分歧式為
if %3=1
—只有到這邊而已。
在其後的「goto *chapter1」為普通的goto命令,前進到label*chapter1。
這裡的設計為在條件式之後的命令能夠任意輸入,而當條件式成立的時候便會執行。
* 條件式的等號記號
在條件比較的方程式裡能夠使用=,>,<,>=,<=,==,!=,<>等記號。
=:=意義為數值相等時條件成立
if %3=1 goto*t_5
當變數%3的數值與1相等時,移動至label*t_5。
>:>意義為變數的數值較大時條件成立
if %3>1 goto*t_5
當變數%3的數值大於1時,移動至label*t_5。
<:<意義為變數的數值較小時條件成立。
if %3<1 goto*t_5
當變數%3的數值小於1時,移動至label*t_5。
>=:>=當變數的數值較大或是相等時條件成立。
if %3>=1 goto*t_5
當變數%3的數值大於或是等於1時,移動至label*t_5。
<=:<=當變數的數值較小或是相等時條件成立。
if %3<=1 goto*t_5
當變數%3的數值小於或是等於1時,移動至label*t_5。
==:==的意義和=相同。
if %3==1 goto*t_5
當變數%3的數值與1相等時,移動至label*t_5。
!=和<>:!=和<>的意義為不相等。
if %3!=1 goto*t_5
if %3<>1 goto*t_5
當變數%3的數值不等於1時,移動至label*t_5。
notif:notif的意義和if相反,當條件式不成立時會執行其後的命令。
notif %3=1 goto*t_5
當變數%3的數值不等於1時,移動至label*t_5。
* 將條件式連接
條件式可以藉由&&這符號來無限制地做出連接。
藉此可以做出像「變數中的數值在150以上且在180以下時」這樣有著複數條件的條件式。
if %3>1 && %3<5 goto*t_5
當變數%3的數值大於1且小於5的時候(同時成立),移動至label*t_5。
* 執行複數的命令
並且在條件分歧之後,可以藉由「:」將命令文區隔開來而執行複數的命令。
if %3=1 dwave 1,”se¥bell.wav”:goto *t_5
當變數%3等於1的時候,於channel 1播放bell.wav,然後移動至label*t_5。
* 利用Nscripter進行計算
數字變數能夠利用演算命令來進行計算後變更內容的數值。
* 演算命令的種類
加法
add %3,5
add為加法命令本體。
%3是變數號碼。
範例為將%3加5之後所得的值代入%3的意義。
減法
sub %3,5
sub為減法命令本體。
%3為變數號碼。
範例為將%3減5之後所得的值代入%3的意義。
加1
inc %3
inc為加上1的命令。
%3為變數號碼。範例為將%3加1之後所得的值代入%3的意義。
主要是用在flag上的命令。
減1
dec %3
dec為減去的命令。
%3為變數號碼。範例為將%3減去1之後所得的值代入%3的意義。
主要是用在flag上的命令。
乘法
mul %3,5
mul為乘法命令本體。
%3為變數號碼。
範例為將%3乘5之後所得的值代入%3的意義。
除法
div %3,5
div為除法命令本體。
%3為變數號碼。
範例為將%3除5之後所得的值代入%3的意義。
取得餘數
mod %3,5
mod為命令本體。
範例為將%3除以5之後所得的餘數代入%3的意義。
假設%3被代入為17的話,在經過mod %3,5的處理後%3的數值會變成2。
* 代入四則運算
在代入命令中能夠使用四則運算(+-/*)
程式碼
mov 變數名稱,計算式
範例
mov %3,%3+5
範例為將%3加5之後所得的值代入%3的意義。
即使是複雜的計算式也能夠簡單的將它寫出,喜歡使用這個方法的人也不少。
* 用途
對變數的內容進行變更
例如將登場角色所持有金錢的數量設定為%20(初期值10000元)。
和女主角約會後的結果是變數%20減去4000。
範例
sub %20,4000
計算後變數%20的數值:10000-4000=6000。
—在打工之後得到報酬,變數%20的數值加上7000。
範例
add %20,7000
計算後變數%20的數值:6000+7000=13000
使用演算命令便可以改變變數中所裝的數值。
* 試著做出好感度的處理
女主角對於男主角有著何種程度的好感這樣複雜的情報很難以flag這樣非0即1的設計來表現。
為了表現上述的情報,我們將到目前為止所學到的變數、數值演算、條件分歧全部組合起來使用。
* 好感度處理的系統結構
假設珠美對主角的好感度為變數%20。
並且將珠美的初期好感度代入為10。
選項
1.將花束送給珠美
2.用珠美的衣服來擤鼻涕。
選擇第一項的話會使得好感度增加3,選擇第二項則會使好感度減3。
第二次選項
1.帶珠美去花田,在多摩川旁邊的那座。
2.帶珠美去花田,在三途河旁邊的那座。
選擇第一項的話會使得好感度增加5,選擇第二項則會使好感度減5。
二選一的選項出現兩次,因此可能得到的數值有10+3+5=18、10-3+5=12、10+3-5=8、10-3-5=2這四個。
然後將這四個可能的數值分配得到各自的結果。
也可以重複數次好感度判定之後,在故事中盤分歧到特定角色的專用劇情線,並且在故事的最後評斷數值的高低來決定end。
如果使用複數的parameter來進行處理的話也能製作戀愛SLG。
Column:需要記住的program處理其實意外的少
實際上來說,Nscripter中使用到的program處理其實遠比所想像的種類還要少。
使用變數來進行條件分歧、迴圈處理。在這之後稱為執行處理,而其大部分是在畫面上表現圖像、停止一小段時間等直接的處理。
也就是在Nscripter中用到的program處理其實只有「使用變數來進行條件分歧的處理這系統」而已。(迴圈處理嚴格上來說也條件分歧的變形而已)
不管是多麼龐大的program處理其實分解到最後也只是將條件分歧和執行處理複雜組合起來的東西而已。
因此只要確實地學會變數和條件分歧的話,也就能夠很容易地抓到script的全體印象。請不要單獨去理解變數這東西,將其想像成為了收納條件分歧所使用data的東西,會比較容易理解。