//CSVファイルから歌詞とサウンドエフェクトを組み合わせる /* NPCに歌や連続発言させる ただ途中から再生する手段が無いから後から入ってきたPCは音が聞こえない罠 また仕様として終了時刻の場所だけは最後に記載する必要がある 空文字はそのまま発言されます 発言間隔は0.5秒単位でテキスト解釈します(最初0.1秒単位にしたら連動が取れなくなった) 'Tickに対応したテキストがあるか検索し発見したら発言 ターゲットファイルの書式はサンプル参照 1行目:SoundFileName,長さ(0.5秒単位なので1秒につき2回計算),演奏フラグ(連続発言だけなら0と入力) 2行目:ms単位,文章,文章 ・・・・ 終端:ms単位,EOF Defaultで360秒で強制停止で長さが定義されていたらそれに依存 時系列を正しくする必要はとりあえず有りませんが最後の行を読み込んだ時点で終了します */ prontera.gat,163,185,4 script 歌手 112,{ function SOUNDSTART; function LOADFILE; function NAME; function INFO; while(1){ NAME; mes "一曲いかがですか?"; switch( select("演奏開始","演奏設定","設定の読み出し")){ case 1: SOUNDSTART; break; case 2: LOADFILE; break; case 3: INFO; break; } next; } OnTimer500: set 'Tick,'Tick+5; set 'Req,csvfind('file$,0,'Tick); if('Req > 0){ set 'Msg$,csvread('file$,'Req,1); globalmes 'Msg$; } if(('Tick < 'Default)&&('Req != 'MaxLine)){ initnpctimer; } else { debugmes "[歌手NPC]:最後の行まで読み込みましたので終了"; } end; function SOUNDSTART { if('MapName$ == "-"){ mes "エラーかマップ名の取得が出来ない状態です"; close; } if('File$ == ""){ mes "解釈するべきファイルが設定されていません?"; mes "読み込むべきCSVファイルの名前を定義してください"; close; } set 'SoundFile$,csvread('file$,0,0);//設定を読み出す set 'RC,csvread('file$,0,1);//曲の長さの設定を数値化 set 'RS,csvread('file$,0,2);//演奏タイプの読み出し 0=WAV再生無し それ以外は再生 set 'MaxLine,csvgetrows('file$);//行数読み出し if('RC > 0){//曲の長さを合わせる set 'Default,'RC; } if('RS) areasoundeffect 'MapName$,'MX-'Range,'MY-'Range,'MX+'Range,'MY+'Range,'SoundFile$,0; set 'Tick,0; initnpctimer; return; } function LOADFILE { mes "CSVファイルをフルパスで入れてください"; input 'File$; set @CC$,csvread('File$,0,0); if(@CC$ == ""){ mes "読み出し失敗"; mes "ファイルが存在しない?"; return; } mes "設定ファイルを交換しました"; csvreload 'File$; return; } function INFO { set '@val,csvread('File$,0,1); mes "現在読み込まれている状態"; mes "解釈するべきファイル:"+'File$; mes "読みだそうとしている音源:"+csvread('File$,0,0); mes "発言の長さ:"+'@val; mes "行数の読み出し:"+csvgetrows('File$); } function NAME { mes "["+'NPC$+"]"; } OnInit: set 'NPC$,"歌手";//NPCの名前 set 'File$,"script/npc_sample_msg.txt";//読み出すCSVファイルの名前 後から入力可能 set 'Default,3600;//0.1秒単位なので360秒になるようにしておく set 'Range,12;//音源の範囲 set 'dummy,getmapxy('MapName$,'MX,'MY,1);//現在地取得 配置変更をしやすくする end; }