shiny-cuty-excel-chiffon/data/system/SE.tjs
2024-10-22 11:38:49 -05:00

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;
}
}
}
}
}