/****************************************************** * bbs+echo script v113 *** * データ構造 * $two_bbs_user[0] 掲示板最大件数(件数が変更されたときに使用) * $two_bbs_data[0] 最終書き込み位置ポインタ * 何で自分はこんな変なデータ構造を使ったんだろうか… * 多分変数を増やしたくなかったため * $two_bbs_user$[1-127] 記入者名 * $two_bbs_data$[1-127] 本文 * 最大件数まで書き込まれたときは、頭に戻って上書きします。 **/ /**** Functions **************************************/ // 設定 function script bbs_init { // BBSデータの最大数 // 127を超えないようにすること。 set @bbs_data_max, 55; if (@bbs_data_max < 1 ) goto L_ERROR; if (@bbs_data_max > 127) goto L_ERROR; // 通常ユーザでもロックを解除できるようにするリトライ回数 // -1で無効 set @can_unlock_trycount, 8; return; L_ERROR: mes "掲示板の設定にエラーがあります。"; mes "GMにご連絡ください。"; close; end; } //===[ LOCK ]========================================== function script bbs_lock_force_unlock { set $@bbs_lock, 0; mes "強制解除しました。"; next; return; } function script bbs_lock_start { // set @lc_lockmode, getarg(0); set @trycount, 0; L_RETRY: set @trycount, @trycount + 1; if ($@bbs_lock) goto L_LOCKED; set $@bbs_lock, 1; return; L_LOCKED: mes "他の方が掲示板を使用中です"; mes "少し待ってリトライしてみてください"; next; // 通常ユーザにも解除できるように // リトライが設定された回数を超えると強制解除ボタンが出現 if ((getgmlevel(0) > 0) || ((@can_unlock_trycount != -1) && (@trycount >= @can_unlock_trycount)) ) goto L_MENU_CAN_UNLOCK; menu "リトライ", L_RETRY, "やめる", L_CANCEL; L_MENU_CAN_UNLOCK: menu "リトライ", L_RETRY, "やめる", L_CANCEL, "強制解除", L_UNLOCK; L_CANCEL: mes "また後でお越しください。"; close; end; L_UNLOCK: callfunc "bbs_lock_force_unlock"; goto L_RETRY; } function script bbs_lock_end { set $@bbs_lock, 0; return; } //===[ Confirm ]======================================= /*************************************** * inputを開きクライアントから * 文字列を受け取り、確認を取る。 *************************************** * 引数 0: 記録先(変数) * 戻り値 0 Cancel * 1 OK * 注意 ロック中は使用しないように */ function script input_confirm { L_CONTINUE: input getarg(0); if (getarg(0) == " ") goto L_CANCEL; if (getarg(0) == " ") goto L_CANCEL; mes "これでよろしいですか?"; mes ""; mes getarg(0); next; menu "はい",L_YES, "いいえ",L_NO; L_YES: return 1; L_NO: mes "再度入力してください。"; mes "中止するにはスペース一文字です。"; next; goto L_CONTINUE; L_CANCEL: mes "キャンセルしました。"; next; return 0; } /*************************************** * 数値入力式の間違えにくい確認処理 *************************************** * 引数 0: 「はい」の番号 * 1: 「いいえ」の番号 * 戻り値 1 はい * 0 いいえ * 注意 ロック中はこちらを使うこと */ function script YesNo_confirm { L_RETRY: mes "本当に良いなら" + getarg(0) + "を、中止するなら" + getarg(1) + "を入力してください。"; next; // menuを使うとキャンセルしたときにロックが外れない input @input; if (@input == getarg(0)) goto L_YES; if (@input == getarg(1)) goto L_NO; // その他ならやり直し mes "範囲外の数値が入力されました。"; goto L_RETRY; L_YES: return 1; L_NO: return 0; } //===[ BBS ]=========================================== /*************************************** * 記事番号からデータ番号を算出 *************************************** * 引数 0: 記事番号 * 戻り値 0 Error * その他 OK データ番号 */ function script Index2DataNum { set @lc_input_num, getarg(0); // 正しい範囲か判定 if (@lc_input_num <= 0) goto L_ERROR; if (@lc_input_num > @bbs_data_max) goto L_ERROR; // 記事番号からデータ番号を算出 set @temp, $bbs_data[0]; set @temp, @temp + @bbs_data_max - @lc_input_num; set @Index2DataNum_ret, (@temp % @bbs_data_max) + 1; return @Index2DataNum_ret; L_ERROR: return 0; } /*************************************** * 記事を表示 *************************************** * 引数 0: 記事番号 * 戻り値 データ番号 * -1 Exit * 0 Error * その他 OK データ番号 */ function script showBBSMsg { set @lc_input_num, getarg(0); if (@lc_input_num == 0) goto L_EXIT; set @lc_data_num, callfunc("Index2DataNum", @lc_input_num); if (@lc_data_num == 0) goto L_ERROR; mes @lc_input_num + ":" + $bbs_user$[ @lc_data_num ]; mes $bbs_data$[ @lc_data_num ]; next; set @showBBSMsg_ret, @lc_data_num; return @showBBSMsg_ret; L_ERROR: mes "記事番号が範囲外です"; next; return 0; L_EXIT: // 終了コードのためこのコードを受け取ったら処理を行うこと return -1; } /*************************************** * 記事番号から記事ヘッダ文字列を得る *************************************** * 引数 0: 記事番号 * 戻り値 ヘッダ文字列 */ function script getShowMenuHead { set @lc_input_num, getarg(0); set @lc_data_num, callfunc("Index2DataNum", @lc_input_num); if (@lc_data_num == 0) goto L_ERROR; return @lc_input_num + ". " + $bbs_user$[ @lc_data_num ]; L_ERROR: return @lc_input_num + ". [Not exist slot]"; } /*************************************** * 記事のヘッダメニューを生成 *************************************** * 引数 なし * 戻り値 なし * @ShowMenuBaseを基準する * 結果は@ShowMenuHeader$[0-9]に格納される */ function script makeShowMenuHeader { set @indexnum, 0; L_NEXT: set @ShowMenuHeader$[ @indexnum ], callfunc("getShowMenuHead", @indexnum + @ShowMenuBase); set @indexnum, @indexnum + 1; if (@indexnum < 10) goto L_NEXT; return; } /*************************************** * 記事を書き込む *************************************** * 引数 0: 書き込み文字列 * 戻り値 0 Error * 1 OK */ function script writeBBSMsg { /*---- ロック開始 ----*/ callfunc "bbs_lock_start"; // 最新のデータ位置 if ($bbs_data[0] == @bbs_data_max) goto L_DATA_LAST; if ($bbs_data[0] != @bbs_data_max) goto L_DATA_NOTLAST; L_DATA_LAST: // 最後まで来ていたら、ポインタを先頭へ set $bbs_data[0], 1; goto L_DATA_SET; L_DATA_NOTLAST: // 途中なら、番号を一つ増やす set $bbs_data[0], $bbs_data[0] + 1; goto L_DATA_SET; L_DATA_SET: set $bbs_data$[ $bbs_data[0] ], getarg(0); set $bbs_user$[ $bbs_data[0] ], strcharinfo(0); callfunc "bbs_lock_end"; /*---- ロック終了 ----*/ return 1; L_ERROR: return 0; } //===[ Converter ]===================================== // データの変換 function script bbs_convert { L_CONTINUE: if (@bbs_data_max == $bbs_user[0]) goto L_SKIP; // 0なら初回 if ($bbs_user[0] == 0) goto L_FIRST; if ($bbs_user[0] < 1) goto L_ERROR; if ($bbs_user[0] > 127) goto L_ERROR; /*---- ロック開始 ----*/ callfunc "bbs_lock_start"; set @old_data_ptr, $bbs_data[0]; set @old_data_max, $bbs_user[0]; /* Main to Temp */ // テンポラリには古い順に並ぶ。@old_data_max番が最新 if (@old_data_max == @old_data_ptr) goto L_M2T_PTRLAST; // ポインタよりも先 copyarray @bbs_data_temp$[1], $bbs_data$[ @old_data_ptr + 1 ], @old_data_max - @old_data_ptr; copyarray @bbs_user_temp$[1], $bbs_user$[ @old_data_ptr + 1 ], @old_data_max - @old_data_ptr; L_M2T_PTRLAST: // ポインタよりも前 copyarray @bbs_data_temp$[ @old_data_max - @old_data_ptr + 1 ], $bbs_data$[1], @old_data_ptr; copyarray @bbs_user_temp$[ @old_data_max - @old_data_ptr + 1 ], $bbs_user$[1], @old_data_ptr; /* Temp to Main */ if (@bbs_data_max < @old_data_max) goto L_T2M_SIZE_SMALLER; // @bbs_data_max > @old_data_max なら直進する L_T2M_SIZE_LARGER: cleararray $bbs_data$[1], "", @bbs_data_max - @old_data_max; cleararray $bbs_user$[1], "", @bbs_data_max - @old_data_max; copyarray $bbs_data$[ @bbs_data_max - @old_data_max + 1 ], @bbs_data_temp$[1], @old_data_max; copyarray $bbs_user$[ @bbs_data_max - @old_data_max + 1 ], @bbs_user_temp$[1], @old_data_max; goto L_T2M_EXIT; L_T2M_SIZE_SMALLER: copyarray $bbs_data$[1], @bbs_data_temp$[ @old_data_max - @bbs_data_max + 1 ], @bbs_data_max; copyarray $bbs_user$[1], @bbs_user_temp$[ @old_data_max - @bbs_data_max + 1 ], @bbs_data_max; goto L_T2M_EXIT; L_T2M_EXIT: /* Clear */ if (@bbs_data_max == 127) goto L_CLEAR_SKIP; deletearray $bbs_data$[ @bbs_data_max+1 ], 127 - @bbs_data_max; deletearray $bbs_user$[ @bbs_data_max+1 ], 127 - @bbs_data_max; L_CLEAR_SKIP: set $bbs_data[0], @bbs_data_max; set $bbs_user[0], @bbs_data_max; callfunc "bbs_lock_end"; /*---- ロック終了 ----*/ return; L_SKIP: return; L_FIRST: set $bbs_data[0], 0; set $bbs_user[0], @bbs_data_max; return; L_ERROR: mes "掲示板のデータにエラーがあります。"; if (getgmlevel(0) > 0) goto L_GMHandler; mes "GMにご連絡ください。"; close; end; L_GMHandler: mes "修復するには以前の掲示板の最大件数を入力する必要があります。"; mes "あなたは修復を行うことが出来ますか?"; next; menu "はい", L_GMH_YES, "いいえ", L_GMH_NO; L_GMH_YES: mes "以前の掲示板の最大件数を入力してください。"; next; input @value; if (@value < 1) goto L_GMH_ERROR; if (@value > 127) goto L_GMH_ERROR; set $bbs_user[0], @value; set @value, 0; goto L_CONTINUE; L_GMH_ERROR: mes "入力された値は正しい範囲ではありません。"; L_GMH_NO: mes "担当のGMにご連絡ください。"; close; end; } /**** Script *****************************************/ - script 掲示板(拡声器付き)::bbs+echo 111,{ callfunc "bbs_init"; callfunc "bbs_convert"; mes "国営掲示板サービスにようこそ!"; mes "御用は何でしょうか?"; next; L_CONTINUE: if (getgmlevel(0) > 0) goto L_GMMENU; menu "掲示板を見る", BBS_SHOW, "掲示板に書き込む", BBS_WRITE, "拡声器を使う", ECHO_USE, "やっぱやめる", L_EXIT; L_GMMENU: // GM用 menu "掲示板を見る", BBS_SHOW, "掲示板に書き込む", BBS_WRITE, "掲示板から消す", BBS_DELETE, "掲示板をクリア", BBS_CLEAR, "ロック強制解除", BBS_UNLOCK, "拡声器を使う", ECHO_USE, "やっぱやめる", L_EXIT; //---[ BBS SHOW ]-------------------------------------- BBS_SHOW: mes "ごらんになりたい記事を指定してください。"; mes "番号が小さいほうが新しい記事です。"; next; set @ShowMenuBase, 1; BBS_SHOW_MENU: callfunc "makeShowMenuHeader"; menu "前へ", BBS_SHOW_MENU_PREV, "次へ", BBS_SHOW_MENU_NEXT, @ShowMenuHeader$[0], BBS_SHOW_BY_MENU, @ShowMenuHeader$[1], BBS_SHOW_BY_MENU, @ShowMenuHeader$[2], BBS_SHOW_BY_MENU, @ShowMenuHeader$[3], BBS_SHOW_BY_MENU, @ShowMenuHeader$[4], BBS_SHOW_BY_MENU, @ShowMenuHeader$[5], BBS_SHOW_BY_MENU, @ShowMenuHeader$[6], BBS_SHOW_BY_MENU, @ShowMenuHeader$[7], BBS_SHOW_BY_MENU, @ShowMenuHeader$[8], BBS_SHOW_BY_MENU, @ShowMenuHeader$[9], BBS_SHOW_BY_MENU, "記事番号指定", BBS_SHOW_BY_NUM, "やめる", L_CONTINUE; BBS_SHOW_MENU_PREV: if (@ShowMenuBase - 10 < 1) goto L_CONTINUE; set @ShowMenuBase, @ShowMenuBase - 10; goto BBS_SHOW_MENU; BBS_SHOW_MENU_NEXT: if (@ShowMenuBase + 10 > @bbs_data_max) goto BBS_SHOW_MENU; set @ShowMenuBase, @ShowMenuBase + 10; goto BBS_SHOW_MENU; BBS_SHOW_BY_MENU: set @ret, callfunc("showBBSMsg", @ShowMenuBase + @menu - 3); goto BBS_SHOW_MENU; BBS_SHOW_BY_NUM: mes "記事の表示"; mes "記事番号を入力してください。"; mes "範囲は1〜" + @bbs_data_max + "で"; mes "小さいほうが新しい記事です。"; mes "やめるときは0を入力してください。"; next; input @get_number; if (callfunc("showBBSMsg", @get_number) == -1) goto L_CONTINUE; goto BBS_SHOW_MENU; //---[ BBS WRITE ]------------------------------------- BBS_WRITE: mes "掲示板に書き込み"; mes "一度に入力できるのは全角20文字までです。"; mes "キャンセルはスペース1文字のみ入力してください。"; next; // 入力受け取り if (!(callfunc("input_confirm", @writemsg$))) goto L_CONTINUE; // 記録 set @ret, callfunc("writeBBSMsg", @writemsg$); // 表示 mes "書き込みました。"; set @ret, callfunc("showBBSMsg", 1); goto L_CONTINUE; //---[ BBS DELETE ]------------------------------------ BBS_DELETE: /*---- ロック開始 ----*/ callfunc "bbs_lock_start"; BBS_DELETE_LOOP: mes "記事の削除"; mes "記事番号を入力してください。"; mes "範囲は1〜" + @bbs_data_max + "で"; mes "小さいほうが新しい記事です。"; mes "やめるときは0を入力してください。"; next; input @get_number; if (@get_number == 0) goto BBS_DELETE_EXIT; mes "この記事を削除します。よろしいですか?"; mes ""; set @datanum, callfunc("showBBSMsg", @get_number); if (@datanum == -1) goto BBS_DELETE_EXIT; // 来ないと思うけど一応 if (@datanum == 0) goto BBS_DELETE_LOOP; if (callfunc("YesNo_confirm", 114, 0) == 0) goto BBS_DELETE_LOOP; // Yesならそのまま通過 set $bbs_data$[ @datanum ], "あぼーん by " + strcharinfo(0); set $bbs_user$[ @datanum ], "あぼーん by " + strcharinfo(0); mes "削除しました。"; next; goto BBS_DELETE_LOOP; // 繰り返し BBS_DELETE_EXIT: callfunc "bbs_lock_end"; /*---- ロック終了 ----*/ goto L_CONTINUE; //---[ BBS CLEAR ]------------------------------------- BBS_CLEAR: /*---- ロック開始 ----*/ callfunc "bbs_lock_start"; mes "全記事の削除"; mes "すべての記事を削除しようとしています。"; mes "本当によろしいですか?"; if (callfunc("YesNo_confirm", 114, 0) == 0) goto BBS_CLEAR_EXIT; // Yesならそのまま通過 // データ件数を一件に set $bbs_data[0], 1; // 一番に削除したことを記録 set $bbs_data$[1], "全記事を削除しました。"; set $bbs_user$[1], strcharinfo(0); // 二番以降を全て消す deletearray $bbs_data$[2], 126; deletearray $bbs_user$[2], 126; mes "全記事を削除しました。"; next; BBS_CLEAR_EXIT: callfunc "bbs_lock_end"; /*---- ロック終了 ----*/ goto L_CONTINUE; //---[ BBS UNLOCK ]------------------------------------ BBS_UNLOCK: callfunc "bbs_lock_force_unlock"; goto L_CONTINUE; //---[ ECHO ]------------------------------------------ // 拡声器スクリプトから取り込み&改変 ECHO_USE: mes "あなたの言葉を世界中に届けます。"; mes "一度に入力できるのは全角20文字まで"; mes "キャンセルはスペース1文字のみ入力"; next; if (!(callfunc("input_confirm", @ansmsg$))) goto L_CONTINUE; announce strcharinfo(0) + " : " + @ansmsg$, 0x10; mes "^0000FF" + @ansmsg$ + "^000000"; next; goto L_CONTINUE; //---[ EXIT ]------------------------------------------ L_EXIT: mes "またお越しください。"; close; end; } prontera.gat,156,198,0 duplicate(bbs+echo) 掲示板(拡声器付き) 111, prt_fild05.gat,290,227,0 duplicate(bbs+echo) 掲示板係員 47, morocc.gat,165,113,0 duplicate(bbs+echo) 掲示板係員 47, geffen.gat,116,58,0 duplicate(bbs+echo) 掲示板(拡声器付き) 111, payon.gat,82,129,0 duplicate(bbs+echo) 掲示板(拡声器付き) 111, payon.gat,83,129,0 duplicate(bbs+echo) 掲示板(拡声器付き) 111, alberta.gat,35,241,0 duplicate(bbs+echo) 掲示板(拡声器付き) 111, alberta.gat,198,152,0 duplicate(bbs+echo) 掲示板係員 47, izlude.gat,125,116,0 duplicate(bbs+echo) 掲示板(拡声器付き) 111, aldebaran.gat,133,104,0 duplicate(bbs+echo) 掲示板(拡声器付き) 111, xmas.gat,141,127,3 duplicate(bbs+echo) 掲示板係員 47, comodo.gat,193,159,0 duplicate(bbs+echo) 掲示板係員 47, yuno.gat,157,92,0 duplicate(bbs+echo) 掲示板(拡声器付き) 111, yuno.gat,158,92,0 duplicate(bbs+echo) 掲示板(拡声器付き) 111, yuno.gat,150,99,1 duplicate(bbs+echo) 掲示板(拡声器付き) 111, yuno.gat,150,100,1 duplicate(bbs+echo) 掲示板(拡声器付き) 111, yuno.gat,157,107,2 duplicate(bbs+echo) 掲示板(拡声器付き) 111, yuno.gat,158,107,2 duplicate(bbs+echo) 掲示板(拡声器付き) 111, yuno.gat,165,99,3 duplicate(bbs+echo) 掲示板(拡声器付き) 111, yuno.gat,165,100,3 duplicate(bbs+echo) 掲示板(拡声器付き) 111, amatsu.gat,110,167,0 duplicate(bbs+echo) 掲示板係員 47, gonryun.gat,157,125,3 duplicate(bbs+echo) 掲示板係員 47, umbala.gat,87,167,1 duplicate(bbs+echo) 掲示板係員 47,