シナリオテキストにファイル名や動作を入れて
解析しながら進めるのが出来れば後々制作が楽になる
#include "hsp3util.as"
/*
Scenario_txtの書式説明
シーン区切り文字 <s>
<s>の後にシーンネームを書けるデバッグや選択肢等で他のシーンを指定するときに分かりやすい(無くても問題は無い)
背景指定文字 <bg> //<s>の次の行で指定する使えるのは1シーン1行のみ
<bg>の後に,で区切って複数書ける(最初に指定したファイルがベースになりバッファの画面サイズにもなる)
ページ区切り <p>
<p>の次の行からページ内文字列を書く
キャラクターグラフィック指定 <cg> //<p>の次の行から指定する必要がある
<cg>の後に x座標,y座標,ファイル名 一行に指定できるのは1枚で複数表示したい場合は<cg>行を追加
<cg>だけで座標やファイル指定が無い場合以前に表示したキャラを消去(<p>の次の行限定)
*/
Scenario_txt={"
シナリオA
<s>Scene0010
<bg>sozai2.jpg,logop.bmp
<p>
<cg>50,50,jp6girl.bmp
<cg>400,50,jp6girl.bmp
シーン1
1ページ目 キャラ2枚表示
・・・・・・・・
・・・・
<p>
<cg>200,0,jp6girl.bmp
シーン1
2ページ目 キャラ1枚表示
・・・・
・・・・・・・・
<p>
シーン1
3ページ目 前のページで表示したキャラをそのまま表示
・・・・
・・・・
・・・・
<s>Scene0020
<bg>sozai3.jpg,logop.bmp
<p>
<cg>
シーン2
1ページ目 キャラ消去
・・・・
<p>
シーン2
2ページ目 キャラ表示無し
・・・・・・・・
・・・・・・・・
END・・・最初に戻る
"}
WIN_ID=0
WIN_SIZEX=640
WIN_SIZEY=480
screen WIN_ID,WIN_SIZEX,WIN_SIZEY
CGBUFFER_ID=300
buffer CGBUFFER_ID,WIN_SIZEX,WIN_SIZEY
BGBUFFER_ID=100
BGBUFFER_SIZEX=WIN_SIZEX
BGBUFFER_SIZEY=WIN_SIZEY
buffer BGBUFFER_ID,BGBUFFER_SIZEX,BGBUFFER_SIZEY
MESBOX_ID=200
MESBOX_SIZEX=WIN_SIZEX
MESBOX_SIZEY=160
buffer MESBOX_ID,MESBOX_SIZEX,MESBOX_SIZEY
gradf 0,0,MESBOX_SIZEX,MESBOX_SIZEY,1,$dddddd,$666666
gradf 4,4,MESBOX_SIZEX-8,MESBOX_SIZEY-8,1,$80dd,55
MESBOX_POSX=0
MESBOX_POSY=WIN_SIZEY-MESBOX_SIZEY
MES_POSX=MESBOX_POSX+8
MES_POSY=MESBOX_POSY+8
TEMPBUFFER_ID=110
text_wait=40
onclick gosub *click_next
//中断再開用(今回は中断処理を作ってないから未使用と同じ,再開機能は付いてる)
Scene_continue=0 //中断した時のScene_indexを入れて*Startするとそこから開始
Ppage_continue=0 //中断した時のPpage_indexを入れて*Startするとそこから開始
*Start
split Scenario_txt,"<s>",Scenario_name,Scene_txt //最初の<s>より前の文字列がScenario_nameに入り以降がScene_txtに分割出力される
Scene_max=stat-1 //Scenario_nameの分を減らす
for Scene_index,Scene_continue,Scene_max,1
split Scene_txt(Scene_index),"<p>",Scene_txtdat,Ppage_txt //最初の<p>より前の文字列がScene_txtdatに入り以降がPpage_txtに分割出力される
Ppage_max=stat-1 //Scene_txtdatの分を減らす
split Scene_txtdat,"\n",Scene_name,Graphic_fname //画像ファイル名が入ってる可能性があるので行単位に分割
repeat stat-1 //Scene_nameの分を減らしてループ
if instr(Graphic_fname(cnt),0,"<bg>")>=0 { //画像ファイルの指定がある
split Graphic_fname(cnt),"<bg>",temp,Scene_BG_fname //<bg>で分割されるので<bg>の左に何も無くても""が出力されるからtempに捨てる
split Scene_BG_fname,",",BG_fname //複数ファイルネームがあれば分割
BG_fmax=stat
repeat BG_fmax
if cnt=0 {
celload dir_exe+"\\hsptv\\"+BG_fname,BGBUFFER_ID //HSP3.31以降のhhsptvフォルダ内の画像ファイルを使用
}else{
gsel BGBUFFER_ID //描画先に背景メインバッファを指定
pos 0,0 //背景は0,0固定(座標も指定したいなら <cg>を参考に)
if instr(BG_fname(cnt),0,".png") < 0 {//マイナスならpngファイルじゃ無い
celload dir_exe+"\\hsptv\\"+BG_fname(cnt),TEMPBUFFER_ID //とりあえず一時的に読み込み
gmode 2 //黒を透明色に設定
celput TEMPBUFFER_ID,0
}else{//pngファイルだったら直接背景メインバッファに読み込み
picload dir_exe+"\\hsptv\\"+BG_fname(cnt),1
}
}
loop
break
}
loop
for Ppage_index,Ppage_continue,Ppage_max,1
gsel WIN_ID //描画先をメインウィンドウに指定
redraw 0
title Scenario_name+" "+Scene_name+" Ppage_index="+Ppage_index //デバッグ用に表示
gmode 0
pos 0,0
celput BGBUFFER_ID,0 //背景をメインにコピー
split Ppage_txt(Ppage_index),"\n",temp,sentence //ページテキストを改行で分割(一行目を捨てる)
line_max=stat-1 //tempの分を減らす
cg_max=0
repeat line_max
gsel CGBUFFER_ID //キャラクターグラフィックバッファを描画先に指定
if instr(sentence(cnt),0,"<cg>")>=0 {//キャラクターグラフィック指定有り
if cnt=0 {//一枚目を読み込む前に必ず黒で塗りつぶす
color
boxf
}
split sentence(cnt),"<cg>",temp,cg_xyf //<cg>より左をtempに捨てて、cg_xyfに設定データ取り出し
split cg_xyf,",",cg_x,cg_y,cg_fname//取り出したデータを,で分割
if stat=3 {//ファイル指定がある
repeat stat
gsel CGBUFFER_ID //描画先に背景メインバッファを指定
pos int(cg_x),int(cg_y) //数字を数値に変換して座標に
celload dir_exe+"\\hsptv\\"+cg_fname,TEMPBUFFER_ID //とりあえず一時的に読み込み
gmode 2 //黒を透明色に設定
celput TEMPBUFFER_ID,0
loop
}
cg_max++ //<cg>行を数える
}else{
break
}
loop
gsel WIN_ID //描画先をメインウィンドウに指定
gmode 2
pos 0,0
celput CGBUFFER_ID,0 //キャラクターバッファをメインにコピー
gmode 3,,,220
pos MESBOX_POSX,MESBOX_POSY
celput MESBOX_ID,0 //メッセージボックスをコピー
gmode 0
redraw 1
color
textmode 1 //文字の影指定
color 255,255,255
text text_wait
smes_f=1 //emes実況中フラグON(ONの時にクリックされるとtext 0を実行して文字送りする)
line_max-cg_max //<cg>行をページ行数から減らす
pos MES_POSX,MES_POSY
repeat line_max,cg_max //<cg>行の次からを指定
emes sentence(cnt)
loop
if smes_f=1 {
smes_f=0
wait 30 //ページ文字列を表示し終わった後の待ち時間(文字送りの誤クリック防止)
}
next_stop=1 //次メージ待機フラグON
repeat //クリック待機
pos 610,460
color 255*((cnt/5)\2),255
if (Ppage_index+1)<Ppage_max {mes "▽"}else{mes "▼"} //次のページがあれば"▽" 無ければ"▼"でクリックすると次のシーンに移ることを表す
await 100
if next_stop=0 {break}//クリックされるとnext_stopが0になりrepeatを抜ける
loop
next
next
goto *Start
*click_next
if smes_f=1 {text 0:smes_f=0} //smes実行中なら文字列表示waitを0にして直ちに1ページ分表示
next_stop=0 //ページを止めてるフラグをクリア
return