4月馬鹿の話に使ったスクリプトです。さすがに問題内容は省略しますが、動くはず。画像は各自用意して下さい。長いけれど、行をちゃんと読めば分かるはず。
*quiz
saveoff
skipoff
lookbackoff
;現在の出題数を初期化
mov %51,0
;正解数を初期化
mov %53,0
;MIDIフェード再生にやや時間かかるので、早めに再生。この辺で曲を流す。
;●嘘
mov $0,"答えが嘘の問題内容"
;<省略>
mov $13,"答えが嘘の問題内容"
;●本当
mov $14,"答えが本当の問題内容"
;<省略>
mov $26,"答えが本当の問題内容"ランダムに10問出題される。予め10問用意しておき、重複しないようにする。今回クイズに使用する27個の変数は 文字変数$0~$26。中身は嘘なら0、本当なら1という意味合いである。
出題変数は10個用意し、27個の変数からランダムで選ばれる。配列変数?0[0]~?0[9] 使用する。
mov10 %0,0,0,0,0,0,0,0,0,0,0
mov10 %10,0,0,0,0,1,1,1,1,1,1
mov6 %20,1,1,1,1,1,1
;配列 ?0[0]行に、添字と同じ数字を代入
for %52=0 to 26
mov ?0[%52],%52
next
;今度は並べ替え。配列変数 ?0[0]~[9]までの番号をクイズに使用する。
;苦肉の重複対策 %33は交換用の一時変数
for %52=0 to 9
rnd %32,26
;値を交換
mov %33,?0[%52]
mov ?0[%52],?0[%32]
mov ?0[%32],%33
next
;使用するスプライトを登録しておく
lsp 5,"カウントボタン背景",20,10
lsp 4,"ダウトボタン作成",180,340
lsp 3,"ヒロイン顔",20,310
bg "クイズの背景",10,1000
;タイマー書き換えの際に、テキストウィンドウがエフェクトのせいでチカチカ点滅するため
erasetextwindow 0
;ここで出題用のテキストウィンドウを作る。短めの長方形
setwindow3 10,20,18,5,18,18,0,20,10,0,0,"#005d58",20,50,380,300
menu_click_page
;セーブできるようにしておく
saveon
;ここから回答が始まる。
*ans
;数字変数は文字と連結する前に、文字化しておく必要がある
itoa2 $28,%51+1
locate 5,0
第 $28 問目
$?0[%51]
;ボタン定義をしている。ボタンが押されるとやや下に下がる
bclear
bsp 4,"M4,180,340","","M4,180,345"
bdef "M4,180,340"
;5秒カウントの数字。ここではアニメーション用の数字で、横に長い画像を作った。
;1秒ごとに右に画像がずれて、動いているように見える。
lsp 2,"アニメーションする数字",30,10
print 1
;ここで時間切れか、回答するまでループする
*q_lp
;1秒毎に画像を差し替え
btime 5000 ;待機時間 5秒
;ボタン待ち
bexec $30
;ボタンが押された場合
if $30 =="S4" goto *push
;ボタン以外クリック無効 右クリックメニューは有効
if $30 =="RCLICK" gosub *pause
;時間切れの場合
if $30 =="TIMEOUT" goto *timeup
;CTRLキーが押されたらスキップ確認する
if $30=="CTRL" goto *skip
;これをいれないと、入力を待たずドンドン先に行ってしまう。
goto *q_lp
;セーブしつつ進めるようにしている。
*pause
;右クリックメニューを有効にする
rmode 1
;カウント停止、スプライトも隠す
allsphide
bclear
systemcall rmenu
;メニューが終わったらクイズ画面に戻ってくる。
;救済措置としてカウントを戻す。
*p_end
allspresume
rmode 0
return *ans
*skip
;早送り(回答は「真実」となる)
yesnobox %50,"回答を「本当」と見なして、次の問題に移ります。よろしいですか?","スキップ確認"
if %50 ==1 mov $30,"TIMEOUT":goto *timeup
goto *q_lp
;ボタンを押すと、エフェクトが表示される。
;何もしないと判りにくいので
*push
lsp 1,":c;>640,480,#FFFFFF",0,0
lsp 0,":s/200,200,15,0;#FF0000嘘だ!!",25,140
print 1
;正誤チェック 回答が嘘なら正解数を加算
if %?0[%51] ==0 inc %53
spstr "C0-1"
print 10,1000
csp 0:csp 1
*timeup
;動かれると気になるのでカウント一時停止
lsp 2,":/6;3\num.png",30,10
print 1
if $30 =="TIMEOUT" br時間切れです。
;正誤チェック
;時間切れ かつ 回答が本当だった場合に正解
if $30 =="TIMEOUT" && %?0[%51] ==1 inc %53
;クイズによっては主人公のコメントを出す
notif ?0[%51]==0 | ?0[%51]==5 gosub *comment
textclear
;出題数を加算
inc %51
;出題は0から始まっている。
;出題数が9を超えたら、終了する
if %51 > 9 drawclear:draw:bclear:csp -1:goto *ed
;10問出題するまでループ
goto *ans
;ここではキャラクターのコメントを出す
*comment
setwindow3 320,330,5,3,20,20,0,20,10,0,0,"#666666",310,310,630,460
menu_click_def
if ?0[%51]==1 クイズに対するキャラクターのコメント
menu_click_page
return
;●ED分岐
*ed
saveoff
rmode 1
stop
erasetextwindow 1
lookbackon
bclear
csp -1
bg black,10,1000
bg "クイズ背景",10,1000
menu_click_def
locate 0,1
あなたの正答数は……%53です!\
bg black,10,1000
正解数に応じて、いくつかのEDに飛ぶといいでしょう。