; セーブと文字列入力のサンプル ; byシフトアップネット ; ご自由にスクリプトを改造して使用してください ; 定数 DT_CD = 78976564 ; 識別用の数列(とくに必要ないが、開発やデバッグがやりやすいように使用) TIME_SLEEP = 30 ; 秒数。セーブ後、一定時間ロードさせなくしたいときに SUU_MSG = 10 ; dt_msg配列数 MAX_MSG < SUU_MSG - 1 LEN_NM = 10 ; 名前の長さ LEN_MSG = 30 ; メッセージの長さ MP_IMG_NM = "sougen1_1b" "kawa1_2b" "sabaku1_3b" "mroad1_1b" "hill1_2b" "sougen5_1b" "umi1_2b" ; 背景種類 MAX_IMG_BACK = 6 ; 背景種類数-1 ; セーブするデータ dt_cd = 0 dt_nm = "" ; 名前 dt_no = -1 ; キャラ番号(未使用) dt_msg = 0 0 0 0 0 0 0 0 0 0 ; ※配列は使う前に書いておかないと動作がおかしくなることがある dt_suu = 0 ; 保存した回数(未使用) dummy = 0 ; ワークデータ rand MAX_MSG noMsg ; 効果音 msg 効果音読み込み中・・・ . loads SE_PIPI loads SE_POW clear ; 背景(ランダム) rand MAX_IMG_BACK i load $MP_IMG_NM[i]$ grpBack 100 fit grpBack paint grpBack wipe ; キャラ load "0mj.gif" grpChr 1000 paint grpChr wipe ; BGM music A16_084 *lbl_title データセーブと文字入力のサンプル menu m0 最初から 続きから endmenu clear if m0 = 0 then ; 最初から dt_cd = DT_CD dt_nm = "名無し" dt_no = -1 dt_msg = 0 0 0 0 0 0 0 0 0 0 dt_suu = 0 dummy = 0 else ; 続きから loadval m0 ; セーブデータをロード(saveと同じ内容に) dt_cd dt_nm dt_no dt_msg[0] dt_msg[1] dt_msg[2] dt_msg[3] dt_msg[4] dt_msg[5] dt_msg[6] dt_msg[7] dt_msg[8] dt_msg[9] dt_suu dummy ; 後でセーブデータを増やすときのためにダミー dummy dummy dummy dummy endloadval if m0 < 0 then セーブデータがありません goto lbl_title else if dt_cd != DT_CD then ; 他のスクリプトでセーブしたデータだった(リリース時は起こらないが、開発やデバッグ時に起こりうるので念のため) 他のスクリプトのデータです goto lbl_title endif if m0 < TIME_SLEEP then zan < TIME_SLEEP - m0 まだお休み中です。(残り$zan$秒) goto lbl_title endif endif ロードOK! endif *lbl_main clear menu m0 話す 言葉を教える 名前を付ける セーブ タイトルに戻る endmenu if m0 = 0 then ; 話す gosub hanasu else if m0 = 1 then ; 言葉を教える gosub oshieru else if m0 = 2 then ; 名前を付ける gosub tsukeru else if m0 = 3 then ; セーブ text セーブすると$TIME_SLEEP$秒間の眠りにつきます。 また、覚えた言葉を1つ忘れます。 よろしいですか? . menu m0 はい いいえ endmenu clear if m0 = 1 then ; いいえ goto lbl_main else ; はい dt_msg[noMsg] = 0 ; 1つ忘れる save m0 ; データをセーブ(loadvalと同じ内容に) dt_cd dt_nm dt_no dt_msg[0] dt_msg[1] dt_msg[2] dt_msg[3] dt_msg[4] dt_msg[5] dt_msg[6] dt_msg[7] dt_msg[8] dt_msg[9] dt_suu dummy ; 後でセーブデータを増やすときのためにダミー dummy dummy dummy dummy endsave if m0 < 0 then ; ユーザが保存領域を確保しなかったとき等 セーブできませんでした goto lbl_main endif セーブOK! タイトルに戻ります end ; 開発中は終わるが、リリース後は最初に戻る endif else if m0 = 4 then ; タイトルに戻る end ; 開発中は終わるが、リリース後は最初に戻る endif goto lbl_main ; 話す サブルーチン -------------------------------------------------------------------------------- *hanasu zoom grpChr 200 200 sound SE_PIPI ; 存在するメッセージを探す for i = 0 to MAX_MSG noMsg + 1 if noMsg > MAX_MSG then noMsg = 0 endif if dt_msg[noMsg] != 0 then ; メッセージ発見 text 1 325 100 200 3 000000 FFFFFF FFFFFF left $dt_nm$「$dt_msg[noMsg]$」 . zoom grpChr 100 100 return endif endfor ; メッセージが1つも登録されてない text 1 325 100 200 3 000000 FFFFFF FFFFFF left $dt_nm$「・・・」 . zoom grpChr 100 100 return ; 言葉を教える サブルーチン -------------------------------------------------------------------------------- *oshieru ; メッセージ配列の空いてる位置を探す ichi = -1 for i = 0 to MAX_MSG if dt_msg[i] = 0 then ; メッセージが無い所発見 ichi = i i = MAX_MSG ; forループを抜けるため endif endfor if ichi < 0 then これ以上覚えさせられません ※セーブして眠らせると言葉を1つ忘れます return endif wMsg = "" *oshieru_100 clear input wMsg m0 suuMoji ; メッセージ入力 if m0 = 1 then ; 戻る return else if m0 = 2 then 使用できない文字が含まれています。 goto oshieru_100 else if suuMoji = 0 then goto oshieru_100 else if suuMoji > LEN_MSG then $LEN_MSG$文字までです。 goto oshieru_100 endif ; OK dt_msg[ichi] = wMsg sound SE_POW return ; 名前を付ける サブルーチン -------------------------------------------------------------------------------- *tsukeru wMsg = "" *tsukeru_100 clear input wMsg m0 suuMoji ; メッセージ入力 if m0 = 1 then ; 戻る return else if m0 = 2 then 使用できない文字が含まれています。 goto tsukeru_100 else if suuMoji = 0 then goto tsukeru_100 else if suuMoji > LEN_NM then $LEN_NM$文字までです。 goto tsukeru_100 endif ; OK dt_nm = wMsg sound SE_POW return