/*--------------------------------------------------------------------- かんたん文スクリプト「あやりりす」 Ver.0.1 ---------------------------------------------------------------------*/ //*************************************************************************************************** OnGhostLoad : void { stroke = (1,1,1) stroketimer = (1,1,1) strokeid = ('','','') 最終マウスイベント分 = systemupminute _a = GETFUNCLIST('ゴースト起動前の処理') foreach _a;_f { EVAL(_f) } } OnGhostUnload : void { ERASEVAR('stroke') ERASEVAR('stroketimer') ERASEVAR('strokeid') ERASEVAR('最終マウスイベント分') ERASEVAR('タグなしトーク') ERASEVAR('installedplugin_name') ERASEVAR('installedplugin_id') _a = GETFUNCLIST('ゴースト終了前の処理') foreach _a;_f { EVAL(_f) } } /*---------------------------------------------------------------------------------- イベント振り分け ----------------------------------------------------------------------------------*/ OnGhostEventTranslate { if ! ISVAR('モード') { モード = '' } case _argv[0] { when 'OnBoot','OnGhostChanged','OnGhostCalled' { //起動時リセット モード = '' } } _fname = 'AYL_' + _argv[0] if ISFUNC(_fname) { _fname return } _fname = _argv[0] + TOSTR(モード) if ISFUNC(_fname) { _fname return } } AYL_OnChoiceSelect { if ISFUNC(reference0) { EVAL(reference0) } elseif SUBSTR(reference0,0,6) == '|TEST|' { TOSTR(EVAL(SUBSTR(reference0,6,10000))) } } AYL_OnAnchorSelect { if SUBSTR(reference0,0,7) == 'http://' { "\j[%(reference0)]" return } _fn = 'アンカー' + reference0 if ISFUNC(_fn) { EVAL(_fn) return } if ISFUNC(reference0) { EVAL(reference0) return } } //*************************************************************************************************** /*--------------------------------------------------------------------- コア ---------------------------------------------------------------------*/ GetEvalTalkArray { _m = GETTIME[1] _d = GETTIME[2] _ms = GetMonthSlot _holiday = GetHolidaySlot _dayofweek = GetDOWSlot _season = GetSeasonSlot _time = GetTimeSlotList _slots = IARRAY //一般的なおおざっぱなもの if _argc == 0 || _argv[0] == 0 { //朝,昼,夕,夜,深夜etc... _slots ,= _time //春,夏,秋,冬 _slots ,= _season //「春の朝」 _slots ,= "%(_season)の%(_time)" //「朝食時」「昼食時」「夕食時」 _slots ,= GetMesiSlot //?月 _slots ,= "%(_m)月" //?月上旬,中旬,下旬 _slots ,= "%(_m)月%(GetDaySlot)" //日曜,月曜... _slots ,= "%(_dayofweek)曜" //第?週日曜,月曜... _slots ,= "第%(((_d - 1) / 7) + 1)週%(_dayofweek)曜" //行事 _slots ,= _ms //行事?曜 _slots ,= "%(_ms)%(_dayofweek)曜" //平日休日 _slots ,= _holiday //行事・平日休日 _slots ,= "%(_ms)%(_holiday)" //季節・状態 _slots ,= "%(_season)の(_holiday)" //その他 if ISFUNC('あやりりす・日付イベントユーザー定義') { _slots ,= EVAL('あやりりす・日付イベントユーザー定義') } } //特定の日付処理は特別 if _argc == 0 || _argv[0] == 1 { //?月?日 _slots ,= "%(_m)月%(_d)日" //?月第?週日曜,月曜... _slots ,= "%(_m)月第%(((_d - 1) / 7) + 1)週%(_dayofweek)曜" } _slots } TalkEval { //処理用!さわるな!! _argv[0] = OnGhostEventTranslate(_argv[0]) if ISFUNC(_argv[0]) { _var = EVAL(_argv[0]) _type = GETTYPE(_var) if _type == 4 { _var } elseif _type == 0 { IARRAY } else { CVSTR(_var) if STRLEN(_var) { (_var,IARRAY) } else { IARRAY } } } else { IARRAY } } GetBootSharedScript { MouseEventTimeReset _name = '起動共通スクリプト' if ISFUNC(_name) { _script = EVAL(_name) if STRLEN(_script) { _script return } } '' return } //*************************************************************************************************** /*--------------------------------------------------------------------- ランダムトーク処理 元あったRandomTalkは消すこと ---------------------------------------------------------------------*/ /*=====かきかたの例============================ ランダムトーク3月 : array { 'ごにょごにょ' } 1.かならず最後に : array とつけること! 2.' 'でトークをかこむこと! " " じゃないよ! =============================================*/ RandomTalk { //高速ランダムトーク処理用 TOSTR(EVAL(CHR(0x22)+RandomTalkEx()+CHR(0x22))) } GetSeasonSlot { //3-5,6-8,9-11,12-2……でいいよね? _m = month if _m >= 3 && _m <= 5 { '春' } elseif _m >= 6 && _m <= 8 { '夏' } elseif _m >= 9 && _m <= 11 { '秋' } else { '冬' } } GetDaySlot { //10日,20日で区切りにしてみた _d = day if _d <= 10 { '上旬' } elseif _d <= 20 { '中旬' } else { '下旬' } } GetTimeSlotList { if ISFUNC('あやりりす・時間帯定義') { EVAL('あやりりす・時間帯定義') return } //おおざっぱに時間判定 switch hour { '深夜' //0時 '深夜' //1時 '深夜' //2時 '深夜' //3時 '深夜' //4時 '朝' //5時 '朝' //6時 '朝' //7時 '昼' //8時 '昼' //9時 '昼' //10時 '昼' //11時 '昼' //12時 '昼' //13時 '昼' //14時 '昼' //15時 '夕方' //16時 '夕方' //17時 '夜' //18時 '夜' //19時 '夜' //20時 '夜' //21時 '夜' //22時 '深夜' //23時 } } GetMesiSlot { _h = hour if _h == 7 || _h == 8 { '朝食時' } elseif _h == 12 { '昼食時' } elseif _h == 18 || _h == 19 { '夕食時' } else { IARRAY } } GetDOWSlot { //曜日 switch GETTIME[3] { '日' '月' '火' '水' '木' '金' '土' } } GetHolidaySlot { if ISFUNC('あやりりす・休日定義') { EVAL('あやりりす・休日定義') return } //平日・休日 switch GETTIME[3] { '休日' '平日' '平日' '平日' '平日' '平日' '休日' } } GetMonthSlot { if ISFUNC('あやりりす・行事定義') { EVAL('あやりりす・行事定義') return } //月をおおざっぱに _月 = GETTIME[1] _日 = GETTIME[2] //_曜日 = GetDOWSlot //_第n週 = ((_日 - 1) / 7) + 1 if _月 == 1 && _日 <= 3 { //正月は特別 '正月' return } //標準は仕事 '仕事' } RandomTalkEx : nonoverlap { _talk = IARRAY _talknew = TalkEval('新規追加ランダムトーク') _n = ARRAYSIZE(_talknew) if _n >= 2 { //1行目は日付 if last_new_talk_id != _talknew[0] { last_new_talk_array = _talknew[1,65535] //65535は適当 last_new_talk_id = _talknew[0] } _n = ARRAYSIZE(last_new_talk_array) if _n >= 1 { _rand = RAND(_n) last_new_talk_array[_rand] last_new_talk_array[_rand] = IARRAY return } else { _talk ,= _talknew[1,65535] //優先トークが終わったらまぜる } } //カスタム _talk ,= TalkEval('ランダムトークカスタム') //季節その他 _earray = GetEvalTalkArray _n = ARRAYSIZE(_earray) for _i = 0 ; _i < _n ; _i++ { _talk ,= TalkEval('ランダムトーク' + _earray[_i]) } //そしてこれがふつう _talk ,= TalkEval('ランダムトーク通常') parallel _talk } //*************************************************************************************************** /*---------------------------------------------------------------------------------- ゴースト変更編 ----------------------------------------------------------------------------------*/ /*=================================================================================== 記述方法 関数名の例は以下の通りです。 (名前)から変更 (名前)へ変更 (名前)を呼び出し (名前)を呼び出し完了 (名前)から呼び出される (名前)が終了した (名前)の部分にはゴーストのSakura(メイン、\0)側名、またはフルネームが入ります。 さくらや黒姉などSakura名だけで識別できない場合はフルネームを使ってください。 +や-、"や'など、AYAのシステムで使われる文字はすべて _ に置換されます。 AYAの制限回避のため、数字ではじまるゴーストの名前の場合は、「*(ゴースト名)」と書いてください。 例:*54を呼び出し 記述例。 スクリプトは " " でかこってください。 Emilyへ変更 { "\u\s[10]\h\s[5]Emilyへ交代〜。" } ===================================================================================*/ TranslateSystemChar { _text = TOSTR(_argv[0]) _text = RE_REPLACE(_text,"[ !%(CHR(0x22))%(CHR(0x25))#$&()*+,\-/:;<=>?@\[\]`{|}~]","_") _text } さくらスクリプト除去 { _text = RE_REPLACE(_argv[0],'\\_{0,2}[a-zA-Z0-9*!&](\d|\[("([^"]|\\")+?"|([^\]]|\\\])+?)+?\])?','') _text = REPLACE(_text,'\\','\') _text; } GhostEventSearch { _funcname = _argv[0] if ISFUNC(_funcname) { _funcname return } _funcname = '*' + _argv[0] if ISFUNC(_funcname) { _funcname return } '' } CallChangeFunc { //フルネームで探索 if reference2 && STRLEN(TOSTR(reference2)) { _ghostname = TranslateSystemChar(reference2) _funcname = GhostEventSearch(_ghostname + _argv[0]) if STRLEN(_funcname) { _script = TOSTR(EVAL(_funcname)) if STRLEN(_script) { _script return } } } //Sakura名で探索 _ghostname = TranslateSystemChar(reference0) _funcname = GhostEventSearch(_ghostname + _argv[0]) if STRLEN(_funcname) { _script = TOSTR(EVAL(_funcname)) if STRLEN(_script) { _script return } } //ゴースト名変換 if ISFUNC('ゴースト名変換') { _ghostname = EVAL('ゴースト名変換(TOSTR(reference0))') _funcname = GhostEventSearch(_ghostname + _argv[0]) if STRLEN(_funcname) { _script = TOSTR(EVAL(_funcname)) if STRLEN(_script) { _script return } } } //汎用切り替え _funcname = OnGhostEventTranslate('他のゴースト' + _argv[0]) if ISFUNC(_funcname) { _script = TOSTR(EVAL(_funcname)) if STRLEN(_script) { _script return } } //それでもない場合 if _argc >= 2 { REPLACE(TOSTR(EVAL(OnGhostEventTranslate(_argv[1]))),'\-','') return } } AYL_OnGhostChanging { _boot = SpecialBootCloseTalk('終了') if STRLEN(_boot) { _boot return } _script = CallChangeFunc('へ変更','OnClose') _script = REPLACE(_script,'\e','') _script = _script + "\w9\w9\e" _script } AYL_OnGhostChanged { _boot = SpecialBootCloseTalk('起動') if STRLEN(_boot) { _boot return } タグなしトーク = さくらスクリプト除去(reference1) GetBootSharedScript -- CallChangeFunc('から変更','OnBoot') } AYL_OnGhostCalling { CallChangeFunc('を呼び出し') } AYL_OnGhostCalled { _boot = SpecialBootCloseTalk('起動') if STRLEN(_boot) { _boot return } タグなしトーク = さくらスクリプト除去(reference1) GetBootSharedScript -- CallChangeFunc('から呼び出される','OnBoot') } AYL_OnGhostCallComplete { タグなしトーク = さくらスクリプト除去(reference1) CallChangeFunc('を呼び出し完了') } AYL_OnOtherGhostClosed { CallChangeFunc('が終了した') } //*************************************************************************************************** /*---------------------------------------------------------------------------------- 起動編 ----------------------------------------------------------------------------------*/ /*=====かきかたの例================================================================== 春の朝に起動 : array { "ごにょごにょ" } 1.かならず最後に : array とつけること 2.' 'でトークをかこむこと 3.AYAの制限上、「7月5日に起動」というふうな数字ではじまる関数はつくれないので こういう場合は「起動7月5日」と書くこと ===================================================================================*/ SpecialBootCloseTalk { TOSTR(EVAL(CHR(0x22)+SpecialBootCloseTalkExec(_argv[0])+CHR(0x22))) } SpecialBootCloseTalkExec { _date = GETTIME[0] + '/' + GETTIME[1] + '/' + GETTIME[2] if ISVAR('特殊起動トーク配列') == 0 { 特殊起動トーク配列 = IARRAY } if _date != 特殊起動トーク実行日時 { _talk = (SpecialBootCloseTalkExecArray(_argv[0]),IARRAY) 特殊起動トーク配列 = _talk 特殊起動トーク実行日時 = _date } _n = ARRAYSIZE(特殊起動トーク配列) if _n { _rand = RAND(_n) _script = 特殊起動トーク配列[_rand] 特殊起動トーク配列[_rand] = IARRAY _script return } '' return } SpecialBootCloseTalkExecArray { //特殊な日付トーク _earray = GetEvalTalkArray(1) _n = ARRAYSIZE(_earray) for _i = 0 ; _i < _n ; _i++ { _talk = TalkEval(_argv[0] + _earray[_i]) if ARRAYSIZE(_talk) { _talk return } } IARRAY return } AYL_OnBoot { GetBootSharedScript -- //高速処理用 TOSTR(EVAL(CHR(0x22)+BootCloseEx('起動')+CHR(0x22))) } BootCloseEx { _talk = IARRAY //特殊な日付トーク _result = SpecialBootCloseTalkExec(_argv[0]) if STRLEN(_result) { _result return } //カスタム _talk = IARRAY _talk ,= TalkEval(_argv[0] + 'カスタム') //季節その他 _earray = GetEvalTalkArray(0) _n = ARRAYSIZE(_earray) for _i = 0 ; _i < _n ; _i++ { if RE_SEARCH(_earray[_i],'^\d') == 0 { _talk ,= TalkEval(_earray[_i] + 'に' + _argv[0]) } _talk ,= TalkEval(_argv[0] + _earray[_i]) } //そしてこれがふつう //時間帯別がないときのみ追加 if ARRAYSIZE(_talk) == 0 { _talk ,= TalkEval(_argv[0]) } parallel _talk } /*---------------------------------------------------------------------------------- 終了編 書き方の例は起動編といっしょ(ただし「〜に終了」になります) ----------------------------------------------------------------------------------*/ AYL_OnClose { _script = BootCloseEx('終了') _script = REPLACE(_script,'\e','') _script = REPLACE(_script,'\-','') _script += '\w9\-' //高速処理用 TOSTR(EVAL(CHR(0x22)+_script+CHR(0x22))) } /*---------------------------------------------------------------------------------- マウス反応編 ----------------------------------------------------------------------------------*/ MouseEventTimeReset { 最終マウスイベント分 = systemupminute } //---- OnMouseMoveイベント -------------------------------------------------------------- MouseEventExec { _fname = _argv[0] + TOSTR(reference3) + TOSTR(reference4) _fname = OnGhostEventTranslate(_fname) if ISFUNC(_fname) { EVAL(_fname) MouseEventTimeReset return } _fname = _argv[0] + TOSTR(reference3) _fname = OnGhostEventTranslate(_fname) if ISFUNC(_fname) { EVAL(_fname) MouseEventTimeReset return } } MouseMoveWheelFunc { _side = TOINT(reference3) if _argv[0] { _side += 10 } if strokeid[_side] == reference4 { if (GETTICKCOUNT - TOINT(stroketimer[_side])) > 1500 { stroke[_side] = 1 } stroketimer[_side] = GETTICKCOUNT _stroke = TOINT(stroke[_side]) _stroke += 1 stroke[_side] = _stroke if _stroke >= _argv[1] { MouseEventExec(_argv[2]); stroke[_side] = 1 } } else { stroke[_side] = 1 stroketimer[_side] = GETTICKCOUNT strokeid[_side] = reference4 } } AYL_OnMouseMove { MouseMoveWheelFunc(0,50,'なでなで') } AYL_OnMouseWheel { _script = '' if reference2 > 0 { _script = MouseMoveWheelFunc(1,4,'ころころ上') } else { _script = MouseMoveWheelFunc(1,4,'ころころ下') } if STRLEN(_script) { _script return } MouseMoveWheelFunc(1,4,'ころころ') } AYL_OnMouseDoubleClick { MouseEventExec('ダブルクリック'); } /*---------------------------------------------------------------------------------- プラグイン ----------------------------------------------------------------------------------*/ AYL_On_installedplugin : void { _n = ARRAYSIZE(reference) installedplugin_name = IARRAY installedplugin_id = IARRAY for _i = 0 ; _i < _n ; _i++ { _a = SPLIT(reference[_i],CHR(1)) installedplugin_name ,= _a[0] installedplugin_id ,= _a[1] } } プラグインの存在 { if _argc == 0 { 0 return } if ASEARCH(_argv[0],installedplugin_id) >= 0 { 1 return } if ASEARCH(_argv[0],installedplugin_name) >= 0 { 1 return } 0 }