331 lines
13 KiB
Text
331 lines
13 KiB
Text
// SE.tjs - 効果音管理
|
|
// Copyright (C)2001-2006, W.Dee and contributors 改変・配布は自由です
|
|
|
|
class SESoundBuffer extends WaveSoundBuffer
|
|
{
|
|
// 効果音クラス ( WaveSoundBuffer を継承 )
|
|
|
|
var owner; // オーナー
|
|
var id; // 効果音バッファID
|
|
var inFading; // フェード中かどうか
|
|
var prevstatus = "unload"; // 直前のステータス
|
|
var currentStorage = ""; // 見かけの演奏中のストレージ
|
|
var currentVolume = 100; // 見かけのボリューム
|
|
var lastPlayStorage = ""; // 演奏中、あるいは最後に演奏したのストレージ
|
|
var inFadeAndStop = false; // フェード終了時に停止するか
|
|
|
|
function SESoundBuffer(owner, id)
|
|
{
|
|
// コンストラクタ
|
|
super.WaveSoundBuffer(owner);
|
|
|
|
this.owner = owner;
|
|
this.id = id;
|
|
}
|
|
|
|
function finalize()
|
|
{
|
|
// finalize()
|
|
super.finalize(...);
|
|
}
|
|
|
|
function play(elm, resetvolume = true)
|
|
{
|
|
if(tf.disableSound) return;
|
|
// play オーバーライド
|
|
super.stop();
|
|
stopFade();
|
|
var storage = elm.storage;
|
|
var found = true;
|
|
if(!Storages.isExistentStorage(storage))
|
|
{
|
|
var test;
|
|
if(test = storage + ".wav", Storages.isExistentStorage(test))
|
|
storage = test;
|
|
else if(test = storage + ".ogg", Storages.isExistentStorage(test))
|
|
storage = test;
|
|
else if(test = storage + ".tcw", Storages.isExistentStorage(test))
|
|
storage = test;
|
|
else
|
|
found = false;
|
|
}
|
|
if(!found){
|
|
if(tf.debugMode && !tf.soundEnforce){
|
|
throw new Exception("効果音 " + storage + " が見つかりません");
|
|
}else{
|
|
dm("効果音 " + storage + " が見つかりません");
|
|
return;
|
|
}
|
|
}
|
|
var loop = elm.loop === void ? false : +elm.loop;
|
|
looping = loop;
|
|
lastPlayStorage = storage;
|
|
if(loop)
|
|
currentStorage = storage;
|
|
else
|
|
currentStorage = "";
|
|
try
|
|
{
|
|
super.open(storage);
|
|
if(resetvolume) super.volume = currentVolume * 1000;
|
|
super.play();
|
|
}
|
|
catch(e)
|
|
{
|
|
tf.disableSound = true;
|
|
dm("効果音の再生に失敗しました(実行は続行できます) : " + e.message);
|
|
}
|
|
|
|
//if(id ==2 && bao.players.count > 0){
|
|
// dm("■playse buf=" + id + " / storage : " + storage + " / " + st(p0.nowSpriteId) + " / " + p0.layer.asd + " : " + p0.layer.conductor.curLine);
|
|
//}
|
|
//if(id ==5 && bao.players.count > 0){
|
|
// dm("■playse buf=" + id + " / storage : " + storage + " / " + st(p1.nowSpriteId) + " / " + p1.layer.asd + " : " + p1.layer.conductor.curLine);
|
|
//}
|
|
|
|
|
|
}
|
|
|
|
function stop()
|
|
{
|
|
// stop オーバーライド
|
|
currentStorage = "";
|
|
try
|
|
{
|
|
super.stop(...);
|
|
}
|
|
catch(e)
|
|
{
|
|
dm("効果音の停止に失敗しました(実行は続行できます) : " + e.message);
|
|
}
|
|
inFadeAndStop = false;
|
|
|
|
//if(id == 2 && bao.players.count > 0){
|
|
// dm("□stopse buf=" + id + " / " + lastPlayStorage + " / " + st(p0.nowSpriteId) + " / " + p0.layer.asd + " : " + p0.layer.conductor.curLine);
|
|
//}
|
|
//if(id == 5 && bao.players.count > 0){
|
|
// dm("□stopse buf=" + id + " / " + lastPlayStorage + " / " + st(p1.nowSpriteId) + " / " + p1.layer.asd + " : " + p1.layer.conductor.curLine);
|
|
//}
|
|
}
|
|
|
|
function stopFade()
|
|
{
|
|
// stopFade オーバーライド
|
|
try
|
|
{
|
|
super.stopFade();
|
|
}
|
|
catch(e)
|
|
{
|
|
dm("効果音のフェードに失敗しました(実行は続行できます) : " + e.message);
|
|
}
|
|
inFadeAndStop = false;
|
|
}
|
|
|
|
function fade(elm)
|
|
{
|
|
// fade オーバーライド
|
|
inFading = true;
|
|
var time = elm.time === void ? 5000 : +elm.time;
|
|
var vol = +elm.volume * 1000;
|
|
currentVolume = +elm.volume;
|
|
if(elm.startvolume !== void) super.volume = +elm.startvolume * 1000;
|
|
try
|
|
{
|
|
//if(id == 4){
|
|
// dm("■fade buf=" + id + " / vol : " + vol + " / time : " + time);
|
|
//}
|
|
super.fade(vol, time);
|
|
}
|
|
catch(e)
|
|
{
|
|
dm("効果音のフェードに失敗しました(実行は続行できます) : " + e.message);
|
|
}
|
|
}
|
|
|
|
function fadeIn(elm)
|
|
{
|
|
//dm("fadeIn! : " + elm.storage);
|
|
// フェードインしながらの再生
|
|
super.volume = 0;
|
|
play(elm, false);
|
|
inFading = true;
|
|
var time = elm.time === void ? 5000 : +elm.time;
|
|
var vol = currentVolume * 1000;
|
|
try
|
|
{
|
|
super.fade(vol, time);
|
|
}
|
|
catch(e)
|
|
{
|
|
dm("効果音のフェードに失敗しました(実行は続行できます) : " + e.message);
|
|
}
|
|
}
|
|
|
|
function fadeOut(elm)
|
|
{
|
|
//dm("fadeout! : " + currentStorage);
|
|
// フェードアウト後停止
|
|
inFading = true;
|
|
inFadeAndStop = true;
|
|
var time = elm.time === void ? 5000 : +elm.time;
|
|
try
|
|
{
|
|
super.fade(0, time);
|
|
}
|
|
catch(e)
|
|
{
|
|
dm("効果音のフェードに失敗しました(実行は続行できます) : " + e.message);
|
|
}
|
|
}
|
|
|
|
function onFadeCompleted()
|
|
{
|
|
// onFadeCompleted オーバーライド
|
|
inFading = false;
|
|
if(inFadeAndStop)
|
|
{
|
|
try
|
|
{
|
|
super.stop(); // 再生停止
|
|
}
|
|
catch(e)
|
|
{
|
|
dm("効果音の停止に失敗しました(実行は続行できます) : " + e.message);
|
|
}
|
|
inFadeAndStop = false;
|
|
}
|
|
super.onFadeCompleted(...);
|
|
owner.onSESoundBufferFadeCompleted(id); // フェード終了
|
|
}
|
|
|
|
function onStatusChanged()
|
|
{
|
|
// onStatusChanged オーバーライド
|
|
// ステータスが変更された
|
|
super.onStatusChanged(...);
|
|
var ps = prevstatus;
|
|
var cs = status;
|
|
prevstatus = cs;
|
|
if(ps == "play" && cs == "stop")
|
|
{
|
|
owner.onSESoundBufferStop(id); // play => stop : 演奏が停止した
|
|
currentStorage = "";
|
|
}
|
|
}
|
|
|
|
function onLabel(name)
|
|
{
|
|
super.onLabel(...);
|
|
owner.onSESoundBufferLabel(id);
|
|
}
|
|
|
|
function canWaitStop()
|
|
{
|
|
// 終了を待てるか
|
|
return status == "play" && !looping;
|
|
}
|
|
|
|
property volume
|
|
{
|
|
setter(x)
|
|
{
|
|
currentVolume = x;
|
|
super.volume = x * 1000;
|
|
}
|
|
getter
|
|
{
|
|
return super.volume \ 1000;
|
|
}
|
|
}
|
|
|
|
property pan
|
|
{
|
|
setter(x)
|
|
{
|
|
super.pan = x * 1000;
|
|
}
|
|
getter
|
|
{
|
|
return super.pan \ 1000;
|
|
}
|
|
}
|
|
|
|
function setOptions(elm)
|
|
{
|
|
if(elm.volume !== void) volume = +elm.volume;
|
|
if(elm.gvolume !== void)
|
|
{
|
|
// 大域ボリューム
|
|
var sysvar = owner.scflags; // システム(コア)変数
|
|
if(sysvar.se === void) sysvar.se = [];
|
|
sysvar = sysvar.se;
|
|
if(sysvar[id] === void) sysvar[id] = %[];
|
|
sysvar = sysvar[id];
|
|
var v2 = +elm.gvolume;
|
|
v2 = int(v2 * 1000);
|
|
sysvar.globalVolume = v2;
|
|
volume2 = v2;
|
|
}
|
|
if(elm.pan !== void)
|
|
{
|
|
pan = +elm.pan;
|
|
}
|
|
}
|
|
|
|
function store()
|
|
{
|
|
// 辞書配列に現在の状態を記録する
|
|
var dic = %[];
|
|
// dic.currentStorage = currentStorage;
|
|
dic.volume = currentVolume;
|
|
//ryo-- フェードアウトの時はロード時に再生しない様に。
|
|
if ((inFading==true)&&(inFadeAndStop==true)){
|
|
dic.currentStorage = "";
|
|
}else{
|
|
dic.currentStorage = currentStorage;
|
|
}
|
|
dic.frequency = frequency;
|
|
//--
|
|
dic.pan = pan;
|
|
return dic;
|
|
}
|
|
|
|
function restore(dic)
|
|
{
|
|
// 辞書配列から状態を読み出し、復帰する
|
|
if(dic === void) return;
|
|
currentVolume = dic.volume;
|
|
pan = dic.pan;
|
|
//ryo--
|
|
if(dic.currentStorage != "")
|
|
{
|
|
if(currentStorage != dic.currentStorage){
|
|
play(%[storage : dic.currentStorage, loop : true]);
|
|
frequency = dic.frequency;
|
|
}
|
|
}else{
|
|
stop();
|
|
}
|
|
//--
|
|
}
|
|
|
|
function restoreSystemState(dic)
|
|
{
|
|
// システム変数 dic から情報を設定する
|
|
// 大域ボリュームの情報を得る
|
|
var sysvar = dic.se;
|
|
if(sysvar !== void)
|
|
{
|
|
sysvar = sysvar[id];
|
|
if(sysvar !== void)
|
|
{
|
|
var v2 = sysvar.globalVolume;
|
|
if(v2 !== void)
|
|
{
|
|
volume2 = +v2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|