System4.0 Tips 

 

System4.0でメニュー拡張

 

 

System4.0のウィンドウメニューを拡張してみよう

 たまーに、ウィンドウメニューからセーブを行うようなADVシステムがあると思いますが、
そういうのをちょっと作ってみようと思いました。

 

MenuExtension HLL Library をダウンロード

HLL追加方法は説明しません。


リファレンス

 ★ 必須命令 ★
    WINMENU_INIT
      [ 引数 ] void
      [戻り値] void
      初期化時に呼び出す。必須。

    WINMENU_CHECK
      [ 引数 ] void
      [戻り値] void
      メニューがクリックされたかの判定。必須。
      REGISTER_MSG_KEY_WAIT_CALLBACK のコールバックから呼び出せばよい。
   選択肢中でもメニューを有効にしたいのならSACT改造する必要がある
   (CSactMenu.jafの440行辺り(forの次行)に挿入)



 ★ サブメニュー追加 ★
    WINMENU_EXT_ADD
      [ 引数 ] string extName  拡張メニュー名
      [戻り値] menu_locate_t   メニューの位置
      新しいメニューを追加する。
      複数追加も可能だが、MENU_GET_LOCATE_EXT で一つしか得られないため推奨しない。
      その場合はこの関数の戻り値を保存しておく。

    WINMENU_APPEND_SUB_MENU
      [ 引数 ] menu_locate_t located  拡張メニュー名
      [ 引数 ] string subName  サブメニュー名
      [戻り値] menu_locate_t   メニューの位置


 ★ 項目追加 ★
    WINMENU_APPEND_MENU
      [ 引数 ] menu_locate_t located  拡張メニュー名
      [ 引数 ] string Name  メニュー表示文字列
      [ 引数 ] menu_callback_t func  クリック時に呼ばれるコールバック関数
      [戻り値] menu_menu_id   項目ID。表示文字列を変更するのに使用する。
      メニューを追加する。

    WINMENU_APPEND_SEPARATOR
      [ 引数 ] menu_locate_t located  拡張メニュー名
      [戻り値] void
      セパレータ(区切り線)を追加する。


 ★ 追加位置取得 ★
    WINMENU_GET_LOCATE_SYSTEM
      [ 引数 ] void
      [戻り値] menu_locate_t   メニューの位置
      「システム」メニューの位置を取得

    WINMENU_GET_LOCATE_SETTING
      [ 引数 ] void
      [戻り値] menu_locate_t   メニューの位置
      「設定」の位置を取得

    WINMENU_GET_LOCATE_HELP
      [ 引数 ] void
      [戻り値] menu_locate_t   メニューの位置
      「ヘルプ」メニューの位置を取得

    WINMENU_GET_LOCATE_DEBUG
      ○注意○ 使用すべきではない
      [ 引数 ] void
      [戻り値] menu_locate_t   メニューの位置
      「デバッグ」メニューの位置を取得

    WINMENU_GET_LOCATE_EXT
      [ 引数 ] void
      [戻り値] menu_locate_t   メニューの位置
      拡張したメニューの位置を取得


 ★ 表示内容変更 ★
    WINMENU_CHANGE_STRING
      [ 引数 ] menu_menu_id id   変更するメニューのID(メニュー追加時の戻り値)
      [ 引数 ] string newName 新しい表示名
      [戻り値] void
      表示名を変更する。項目追加時の戻り値が必要。

 

追加位置を取得して、追加する。
という形です。

 

例 : セーブロードをメニューから実行しよう

 WINMENU_INIT();
 WINMENU_EXT_ADD("セーブ/ロード");
 WINMENU_APPEND_MENU(WINMENU_GET_LOCATE_EXT(),"Quickセーブ",&menu_callback_qsave);
 WINMENU_APPEND_MENU(WINMENU_GET_LOCATE_EXT(),"Quickロード",&menu_callback_qload);
 WINMENU_APPEND_SEPARATOR(WINMENU_GET_LOCATE_EXT());
 menu_locate_t ml=WINMENU_APPEND_SUB_MENU(WINMENU_GET_LOCATE_EXT(),"セーブ");
 WINMENU_APPEND_MENU(ml,"save1",&menu_callback_save1);
 WINMENU_APPEND_MENU(ml,"save2",&menu_callback_save2);
 WINMENU_APPEND_MENU(ml,"save3",&menu_callback_save3);
 WINMENU_APPEND_MENU(ml,"save4",&menu_callback_save4);
 WINMENU_APPEND_MENU(ml,"save5",&menu_callback_save5);
 ml=WINMENU_APPEND_SUB_MENU(WINMENU_GET_LOCATE_EXT(),"ロード");
 WINMENU_APPEND_MENU(ml,"load1",&menu_callback_load1);
 WINMENU_APPEND_MENU(ml,"load2",&menu_callback_load2);
 WINMENU_APPEND_MENU(ml,"load3",&menu_callback_load3);
 WINMENU_APPEND_MENU(ml,"load4",&menu_callback_load4);
 WINMENU_APPEND_MENU(ml,"load5",&menu_callback_load5);

を、呼び出すと、以下のようになります。

ちなみに、コールバック関数で実行されるので、以下のようにまとめます。

void menu_callback_qsave(){
save_main("qsave.asd");
}
void menu_callback_qload(){
load_main("qsave.asd");
}
void menu_callback_save1(){
save_main("save1.asd");
}
void menu_callback_save2(){
save_main("save2.asd");
}
void menu_callback_save3(){
save_main("save3.asd");
}
void menu_callback_save4(){
save_main("save4.asd");
}
void menu_callback_save5(){
save_main("save5.asd");
}
void menu_callback_load1(){
load_main("save1.asd");
}
void menu_callback_load2(){
load_main("save2.asd");
}
void menu_callback_load3(){
load_main("save3.asd");
}
void menu_callback_load4(){
load_main("save4.asd");
}
void menu_callback_load5(){
load_main("save5.asd");
}

void save_main(string savefile){
//適当に実装
}
void load_main(string savefile){
//適当に実装
}

スクリプト側で実行するのではなく、DLL側で処理を行いたい場合は、
DLLを改造してください。

 

ただし、
選択肢表示中のセーブ/ロードは有効ではありません。
MENU_SELECT改造サンプルを使用すれば有効になります。

(ウィンドウメニュー拡張でもセーブロードに関係する部分を含むもの固有の問題です)
(その他の場合は、MENU_SELECT中に実行させるのは、CSactMenuの440行辺りにWINMENU_CHECKを入れれば良いです)

 

こういうこともできます。

> このサンプルをダウンロード <

Developed using Alicesoft System4.0


どうやってるの?

 サンプルに書きました。

 

 感想

   トリッキーです。特にセーブ・ロード・選択肢との連携はトリッキーすぎです。
 セーブロード系ではない用途で使用するならば、比較的実用的なのではないかと思います。
 セーブロード系で使用するのは、どうかとおもいます。

     例えば、ヘルプの下に、リンクやゲーム制作者クレジットをのせるとかなら、いいんじゃないかな。