AR Madness 2
AR Madness 2 程式開發介面可讓有興趣的朋友使用 C++ 語言開發供 AR Madness 2 使用的插件,另外也讓按鍵插件的自訂更靈活化。
AR Madness 2 使用了插件系統,各插件之間通過「服務」及「事件」彼此通訊。
- 服務:由插件本身建立,讓其他插件呼叫
- 事件:也是由插件本身建立,但有興趣的插件會訂閱該事件,當插件公佈事件時將通知所有的訂閱者
為使非開發人員也能應用此插件系統,按鍵插件 (ARM-BGKey) 在設計時就設定為使用服務作為動作,也就是說當按下某一個按鈕時,其實就是在直接呼叫某個服務。
例子:
當按下並放開 P 鍵時,開啟報站機電源。
在 settings.ini 的相應寫法:bgkey.80.release=BSAS\Command:0
- "80" 是 P 鍵的虛擬按鍵號碼,虛擬按鍵的號碼對應表可
參閱這裡 (將號碼轉成 10 進制即為應使用的號碼)
- 虛擬按鍵號碼支援連續鍵,只需將對應的號碼加到虛擬按鍵號碼即可。CTRL 加 1024,SHIFT 加 2048,ALT 加 4096。
- "release" 是按鍵狀態,可以是 press (按下),release (放開) 及 3sec (按著 3 秒不放),當觸發 3sec 事件後會忽略 release 事件。
- "BSAS\Command" 是服務名稱,下面將會列出每一個插件所定義的服務
- ":0" 是參數,若為數字時直接填上,若為字串是先加 @ 再填上,例如 ARMDisplay\ShowText:0:@STRING
- 第一個冒號後面的是 wParam,第二個冒號後面的是 lParam,若不需要使用 lParam 時可直接省略冒號及後面的部份
服務及事件函數共用同一個定義:
int MyFunc(WPARAM wParam, LPARAM lParam);
wParam 及 lParam 的值都是根據不同服務及事件而不同,而傳回值對於服務而言可以自訂,對於事件時則請傳回 0。
當編寫插件時,您需要使用下列的輔助函數與核心及其他插件進行通訊:
- CreateHookableEvent(a):建立可讓其他插件訂閱的事件。a 為事件名稱 (請用 myname\eventname 格式)。傳回值為給 NotifyEventableEvent() 使用的處理值 (Handle)。此函數必須在 LoadPlugin() 裡呼叫。
- DestroyHookableEvent(a):刪除已建立的事件,所有訂閱者將不再收到此事件的通知。a 為事件處理值。
- NotifyEventHooks(a,b,c):對事件的訂閱者發出通知。a 為事件處理值,b 為自訂參數 1 (即 wParam),c 為自訂參數 2 (即 lParam)。
- HookEvent(a,b):訂閱已建立的事件。a 為事件名稱,b 為事件處理函數的指標,傳回值為供 UnhookEvent() 使用的訂閱處理值。
- UnhookEvent(a):取消已訂閱的事件。a 為訂閱事件時傳回的訂閱處理值。
- CreateServiceFunction(a,b):建立可讓其他插件呼叫的服務。a 為事件名稱 (請用 myname\servicename 格式),b 為服務處理函數的指標,傳回值為供 DestroyServiceFunction() 使用的服務處理值。此函數建議在 LoadPlugin() 裡呼叫,否則可能使 ServiceExists() 失敗。
- DestroyServiceFunction(a):刪除已建立的服務。a 為 CreateServiceFunction() 傳回的服務處理值。
- CallService(a,b,c):呼叫已建立的服務。a 為服務名稱,b 為傳入的自訂參數 1 (即 wParam),c 為傳入的自訂參數 2 (即 lParam)。傳回值由服務處理函數決定。
- ServiceExists(a):查詢服務是否存在。a 為服務名稱。傳回值為 0 時代表服務不存在,非 0 時代表存在。
AR Madness 2 本體定義了一些基本的服務。
服務清單:
- AS_ADDMENUITEM ("ARM\AddMenuItem"):在右邊插件功能表裡加入項目。lParam 為 MENULISTITEM 類型的指標,詳細資料參閱 plugins.h。
- AS_READSETTING ("ARM\ReadSetting"):在 settings.ini 的 Plugins 分區裡讀取字串設定值。wParam 為鍵名稱字串,lParam 為獲取設定字串的指標,此指標容量需為 1024 位元組。
- AS_READSETTINGI ("ARM\ReadSettingInt"):在 settings.ini 的 Plugins 分區裡讀取整裡設定值。wParam 為鍵名稱字串,lParam 不使用,傳回值為設定值。
- AS_WRITESETTING ("ARM\WriteSetting"):在 settings.ini 的 Plugins 分區裡寫入字串設定值。wParam 為鍵名稱字串,lParam 為寫入的字串。
- AS_READGENERALSETTING ("ARM\ReadGeneralSetting"):在 settings.ini 的 General 分區裡讀取字串設定值。wParam 為鍵名稱字串,lParam 為獲取設定字串的指標,此指標容量需為 1024 位元組。
- AS_READGENERALSETTINGI ("ARM\ReadGeneralSettingInt"):在 settings.ini 的 General 分區裡讀取整裡設定值。wParam 為鍵名稱字串,lParam 不使用,傳回值為設定值。
- AS_XUNZIP_OPENZIP ("ARM\XUnZip\OpenZip"):開啟 AR 檔案。wParam 不使用,lParam 是檔案名稱,傳回值是 ZIP 處理值 (HZIP),失敗時傳回 0。
- AS_XUNZIP_FINDZIPITEM ("ARM\XUnZip\FindZipItem"):在 ZIP 裡尋找檔案。wParam 是 HZIP,lParam 是 AS_XUZ_FINDZIPITEM_STRUCT 類型的指標,傳回值 0 時成功,否則失敗。
- AS_XUNZIP_GETZIPITEM ("ARM\XUnZip\GetZipItem"):在 ZIP 裡取得檔案資料。wParam 是 HZIP,lParam 是 AS_XUZ_GETZIPITEM_STRUCT 類型的指標,傳回值 0 時成功,否則失敗。
- AS_XUNZIP_UNZIPITEM ("ARM\XUnZip\UnzipItem"):在 ZIP 裡解壓檔案。wParam 是 HZIP,lParam 是 AS_XUZ_UNZIPITEM_STRUCT 類型的指標,傳回值 0 時成功,否則失敗。
- AS_XUNZIP_CLOSEZIP ("ARM\XUnZip\CloseZip"):關閉已開啟的 ZIP 檔案。wParam 是 HZIP,lParam 不使用。
- AS_FREEIMAGE_LOADTOHBITMAP ("ARM\FreeImage\LoadToHBitmap"):載入指定圖片並讀取至 HBITMAP。wParam 不使用,lParam 是 AS_FREEIMAGE_LOADTOHBITMAP_STRUCT 類型的指標,傳回值為圖片的 HBITMAP,失敗時傳回 0。
事件清單:
- AE_MM2_EXECUTE ("ARM\MM2Execute"):指示 MM2 的執行狀態。wParam 值為 0 時代表啟動遊戲,1 時代表結束遊戲,lParam 只在結束遊戲時使用,值為 0 時代表正常結束,1 時代表不正常結束。
ARM-BGDisplay 是給 Midtown Madness 2 遊戲裡顯示報站機畫面所用的插件。它並沒有提供任何服務及事件,但有提供基於 Windows Message 的控制功能給 ARM2 以外的程式使用。
Windows Message 相關參數:
ARM 1.2.0.1 開始此插件亦同時負責 DirectInput Hooking
視窗標題:ARMBGDISPMSGWND,視窗類別:ARMBGDISPMSGCLASS
- WM_USER:取得設定值。傳回值 & 1 是隱藏狀態, & 2 是自訂顯示位置狀態。
- WM_USER+6:取得自訂位置座標。傳回值 LOWORD 是 X,HIWORD 是 Y。
- WM_USER+7:設定隱藏狀態。wParam 為 1 時隱藏,0 時顯示。
- WM_USER+8:設定自訂位置座標。wParam 是 X,lParam 是 Y。
- WM_USER+9:給 DirectInput Hooking 內部使用作傳回按鍵用
ARM-BGKEY 是為報站機視窗及 Midtown Madness 2 遊戲裡提供按鍵回應的插件。
關於自訂方法請參閱上面「對於非開發人員的用處」部份。
服務清單:
- BGKey\SendExternal:將按鍵事件傳給外部程式。wParam 為目標視窗的標題名稱,lParam 是 Windows Message 的自訂訊息號碼
- BGKey\HandleKey:傳遞原生 (按下、放開) 的按鍵事件。wParam 為按鍵的 Virtual Key 值,lParam 為按鍵狀態 (0x80 按下,0x00 放開)
ARM-BSASConsole 是報站機主控台插件。
服務清單:
- BSASConsole\ShowText:於主控台顯示屏裡顯示自訂的訊息。wParam 不使用,lParam 是要顯示的字串 (限 4 位元組)
事件清單:
- BSASConsole\BroadcastHDC:當初始化完成時將 LED 顯示屏的 HDC 發送給訂閱者。wParam 不使用,lParam 是 PANELINFO 類型的指標。
ARM-BSASLT 是報站機核心插件。
服務清單:
- AS_BSASLT_COMMAND ("BSAS\Command"):控制報站機操作。wParam 是指令,可以有下列的值:
BSASLT_CMD_POWER (0):報站機電源切換
BSASLT_CMD_U1...U7 (11~17):按下並放開按鈕 1~7
BSASLT_CMD_S_CUSTOMPLAY (400):播放特別報站,lParam 是特別報站號碼
BSASLT_CMD_S_LOADZIP (401):載入路線 ZIP 檔案 (可能未完成),lParam 是 ZIP 檔案路徑
事件清單:
- BSAS_EVENT_OUT_CONSOLE ("BSAS\ConsoleOut"):發送控制台相關的通知。wParam 是指令,可以有下列的值:
BSAS_EVENT_VALUE_POWER_ON (1):報站機開機
BSAS_EVENT_VALUE_POWER_OFF (2):報站機關機
BSAS_EVENT_VALUE_TEXT (3):主控台變更顯示文字,lParam 是要顯示的字串
BSAS_EVENT_VALUE_CONFIRMED (4):確認選擇的路線,lParam 是路線的字串
BSAS_EVENT_VALUE_STOP (5):主控台停止播放
- BSAS_EVENT_OUT_DISPLAY ("BSAS\DisplayOut"):除上列的通知外也發送 LED 顯示屏控制台相關的通知。wParam 是指令,可以有下列的值:
BSAS_EVENT_VALUE_INTENSITY (100):調整顯示屏亮度,lParam 是新的亮度
- BSAS_EVENT_OUT_SPEAKER ("BSAS\SpeakerOut"):除上列的通知外也發送揚聲器相關的通知。wParam 是指令,可以有下列的值:
BSAS_EVENT_VALUE_PLAYAUDIO (100):播放音效檔案,lParam 是檔案名稱
BSAS_EVENT_VALUE_SETVOLUME (101):設定音量,lParam 是音量大小
ARM-Display 是報站機 LED 大顯示屏插件。
服務清單:
- BSASDisplay\ShowText:於 LED 顯示屏裡顯示自訂的訊息。wParam 不使用,lParam 是要顯示的字串。
事件清單:
- BSASDisplay\BroadcastHDC:當初始化完成時將 LED 顯示屏的 HDC 發送給訂閱者。wParam 不使用,lParam 是 PANELINFO 類型的指標。
ARM-ErrorCheck 是偵測 Midtown Madness 2 不正常關閉的插件。
服務清單:
- ARMErrorCheck\Test1:測試插件操作。參數與 AE_MM2_EXECUTE 事件相同。
ARM-SOUND 是用來播放音效檔案的插件。
服務清單:
- ARMSound\PlaySound:播放音效檔案。wParam 不使用,lParam 是相對檔案名稱,檔案可放在 ARM 或 Wave 目錄。