From fdb75fa47dd72522b705e94be5a201c4e1a731cb Mon Sep 17 00:00:00 2001 From: whiteshark0 Date: Wed, 3 Oct 2007 12:43:01 +0000 Subject: New plugin SDK added Some more debug information for windows builds (Does this work in lazarus?) git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@466 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Game/Code/Classes/ULog.pas | 16 ++- Game/Code/Classes/UPluginInterface.pas | 179 +++++++++++++++++++++++++++++++++ Game/Code/UltraStar.dpr | 10 ++ Game/Code/switches.inc | 29 +++--- Modis/SDK/UPluginDefs.pas | 107 ++++++++++++++++++++ 5 files changed, 324 insertions(+), 17 deletions(-) create mode 100644 Game/Code/Classes/UPluginInterface.pas create mode 100644 Modis/SDK/UPluginDefs.pas diff --git a/Game/Code/Classes/ULog.pas b/Game/Code/Classes/ULog.pas index 7c93c6e9..7e464b57 100644 --- a/Game/Code/Classes/ULog.pas +++ b/Game/Code/Classes/ULog.pas @@ -188,6 +188,11 @@ begin FileErrorO := false; end; end; + {$DEFINE DEBUG} //How can i check if this is set in *.dpr file o0 + //If Debug => Write to Console Output + {$IFDEF DEBUG} + WriteLn('Error: ' + Text); + {$ENDIF} end; procedure TLog.LogVoice(SoundNr: integer); @@ -219,10 +224,13 @@ end; procedure TLog.LogStatus(Log1, Log2: string); begin //Just for Debugging - //Comment for Release - //LogAnalyze (Log2 + ': ' + Log1); - - LogError(Log2 + ': ' + Log1); + //Comment for Release + //LogError(Log2 + ': ' + Log1); + + //If Debug => Write to Console Output + {$IFDEF DEBUG} + WriteLn(Log2 + ': ' + Log1); + {$ENDIF} end; procedure TLog.LogError(Log1, Log2: string); diff --git a/Game/Code/Classes/UPluginInterface.pas b/Game/Code/Classes/UPluginInterface.pas new file mode 100644 index 00000000..6d17d51d --- /dev/null +++ b/Game/Code/Classes/UPluginInterface.pas @@ -0,0 +1,179 @@ +unit uPluginInterface; +{********************* + uPluginInterface + Unit fills a TPluginInterface Structur with Method Pointers + Unit Contains all Functions called directly by Plugins +*********************} + +interface +uses uPluginDefs; + +//--------------- +// Procedure that Sets the PluginInterface Record +//--------------- + Procedure Init_PluginInterface; + +//--------------- +// Methods for Plugin +//--------------- + {******** Hook specific Methods ********} + {Function Creates a new Hookable Event and Returns the Handle + or 0 on Failure. (Name already exists)} + Function CreateHookableEvent (EventName: PChar): THandle; stdcall; + + {Function Destroys an Event and Unhooks all Hooks to this Event. + 0 on success, not 0 on Failure} + Function DestroyHookableEvent (hEvent: THandle): integer; stdcall; + + {Function start calling the Hook Chain + 0 if Chain is called until the End, -1 if Event Handle is not valid + otherwise Return Value of the Hook that breaks the Chain} + Function NotivyEventHooks (hEvent: THandle; wParam, lParam: dWord): integer; stdcall; + + {Function Hooks an Event by Name. + Returns Hook Handle on Success, otherwise 0} + Function HookEvent (EventName: PChar; HookProc: TUS_Hook): THandle; stdcall; + + {Function Removes the Hook from the Chain + Returns 0 on Success} + Function UnHookEvent (hHook: THandle): Integer; stdcall; + + {Function Returns Non Zero if a Event with the given Name Exists, + otherwise 0} + Function EventExists (EventName: PChar): Integer; stdcall; + + {******** Service specific Methods ********} + {Function Creates a new Service and Returns the Services Handle + or 0 on Failure. (Name already exists)} + Function CreateService (ServiceName: PChar; ServiceProc: TUS_Service): THandle; stdcall; + + {Function Destroys a Service. + 0 on success, not 0 on Failure} + Function DestroyService (hService: THandle): integer; stdcall; + + {Function Calls a Services Proc + Returns Services Return Value or SERVICE_NOT_FOUND on Failure} + Function CallService (ServiceName: PChar; wParam, lParam: dWord): integer; stdcall; + + {Function Returns Non Zero if a Service with the given Name Exists, + otherwise 0} + Function ServiceExists (ServiceName: PChar): Integer; stdcall; + +var + PluginInterface: TUS_PluginInterface; + +implementation + +//--------------- +// Procedure that Sets the PluginInterface Record +//--------------- +Procedure Init_PluginInterface; +begin + PluginInterface.CreateHookableEvent := CreateHookableEvent; + PluginInterface.DestroyHookableEvent := DestroyHookableEvent; + PluginInterface.NotivyEventHooks := NotivyEventHooks; + PluginInterface.HookEvent := HookEvent; + PluginInterface.UnHookEvent := UnHookEvent; + PluginInterface.EventExists := EventExists; + + PluginInterface.CreateService := CreateService; + PluginInterface.DestroyService := DestroyService; + PluginInterface.CallService := CallService; + PluginInterface.ServiceExists := ServiceExists; +end; + + +{******** Hook specific Methods ********} +//--------------- +// Function Creates a new Hookable Event and Returns the Handle +// or 0 on Failure. (Name already exists) +//--------------- +Function CreateHookableEvent (EventName: PChar): THandle; stdcall; +begin + +end; + +//--------------- +// Function Destroys an Event and Unhooks all Hooks to this Event. +// 0 on success, not 0 on Failure +//--------------- +Function DestroyHookableEvent (hEvent: THandle): integer; stdcall; +begin + +end; + +//--------------- +// Function start calling the Hook Chain +// 0 if Chain is called until the End, -1 if Event Handle is not valid +// otherwise Return Value of the Hook that breaks the Chain +//--------------- +Function NotivyEventHooks (hEvent: THandle; wParam, lParam: dWord): integer; stdcall; +begin + +end; + +//--------------- +// Function Hooks an Event by Name. +// Returns Hook Handle on Success, otherwise 0 +//--------------- +Function HookEvent (EventName: PChar; HookProc: TUS_Hook): THandle; stdcall; +begin + +end; + +//--------------- +// Function Removes the Hook from the Chain +// Returns 0 on Success +//--------------- +Function UnHookEvent (hHook: THandle): Integer; stdcall; +begin + +end; + +//--------------- +// Function Returns Non Zero if a Event with the given Name Exists, +// otherwise 0 +//--------------- +Function EventExists (EventName: PChar): Integer; stdcall; +begin + +end; + + {******** Service specific Methods ********} +//--------------- +// Function Creates a new Service and Returns the Services Handle +// or 0 on Failure. (Name already exists) +//--------------- +Function CreateService (ServiceName: PChar; ServiceProc: TUS_Service): THandle; stdcall; +begin + +end; + +//--------------- +// Function Destroys a Service. +// 0 on success, not 0 on Failure +//--------------- +Function DestroyService (hService: THandle): integer; stdcall; +begin + +end; + +//--------------- +// Function Calls a Services Proc +// Returns Services Return Value or SERVICE_NOT_FOUND on Failure +//--------------- +Function CallService (ServiceName: PChar; wParam, lParam: dWord): integer; stdcall; +begin + +end; + +//--------------- +// Function Returns Non Zero if a Service with the given Name Exists, +// otherwise 0 +//--------------- +Function ServiceExists (ServiceName: PChar): Integer; stdcall; +begin + +end; + +end. diff --git a/Game/Code/UltraStar.dpr b/Game/Code/UltraStar.dpr index ea1ccdf4..b9fa0530 100644 --- a/Game/Code/UltraStar.dpr +++ b/Game/Code/UltraStar.dpr @@ -1,6 +1,7 @@ program UltraStar; {$DEFINE TRANSLATE} +{$DEFINE DEBUG} //Remove b4 release {$R 'UltraStar.res' 'UltraStar.rc'} {$I switches.inc} @@ -97,6 +98,14 @@ uses USingScores in 'Classes\USingScores.pas', USingNotes in 'Classes\USingNotes.pas', + //New Plugin and Core Management + {ULists in 'Classes\ULists.pas', //maybe drop this + UHooks in 'Classes\UHooks.pas', //80 % - Whiteshark is about to work on this + UServices in 'Classes\UServices.pas', //20 % - Whiteshark is about to work on this + UCore in 'Classes\UCore.pas', + UCoreModule in 'Classes\UCoreModule.pas', } + UPluginInterface in 'Classes\UPluginInterface.pas', //Some changes to work with unwriten classes, need to be done + //------------------------------ //Includes - Video Support //------------------------------ @@ -148,6 +157,7 @@ uses //Includes - Modi SDK //------------------------------ ModiSDK in '..\..\Modis\SDK\ModiSDK.pas', + UPluginDefs in '..\..\Modis\SDK\UPluginDefs.pas', //New Plugin SDK //------------------------------ //Includes - Delphi diff --git a/Game/Code/switches.inc b/Game/Code/switches.inc index a895712a..fda3cd75 100644 --- a/Game/Code/switches.inc +++ b/Game/Code/switches.inc @@ -1,13 +1,16 @@ -{$IFDEF FPC} - {$UNDEF UseSerialPort} - {$UNDEF UseMIDIPort} -{$ELSE} - {$UNDEF UseSerialPort} - {$DEFINE UseMIDIPort} -{$ENDIF} - -{$IFDEF win32} - {$DEFINE UseBASS} -{$ELSE} - {$UNDEF UseBASS} -{$ENDIF} +{$IFDEF FPC} + {$UNDEF UseSerialPort} + {$UNDEF UseMIDIPort} +{$ELSE} + {$DEFINE UseSerialPort} + {$DEFINE UseMIDIPort} +{$ENDIF} + +{$IFDEF win32} + {$DEFINE UseBASS} + {$IFDEF DEBUG} + {$APPTYPE CONSOLE} + {$ENDIF} +{$ELSE} + {$UNDEF UseBASS} +{$ENDIF} \ No newline at end of file diff --git a/Modis/SDK/UPluginDefs.pas b/Modis/SDK/UPluginDefs.pas new file mode 100644 index 00000000..7428ae2e --- /dev/null +++ b/Modis/SDK/UPluginDefs.pas @@ -0,0 +1,107 @@ +unit uPluginDefs; +{********************* + uPluginDefs + Some Basic Structures and Functions used to communicate with Plugins + Usable as Delphi Plugin SDK +*********************} + +interface + +type + DWORD = LongWord; + + //---------------- + // TUS_PluginInfo - Some Infos from Plugin to Core. + // Send when Plugininfo procedure is Called + //---------------- + PUS_PluginInfo = ^TUS_PluginInfo; + TUS_PluginInfo = record + cbSize: Integer; //Size of this record (usefull if record will be extended in the future) + + Name: PChar; //Name of the Plugin + Version: DWord; //Version of the Plugin + Description: PChar; //Description, what does this Plugin do + Author: PChar; //Author of this Plugin + AuthorEmail: PChar; //Authors Email + Homepage: PChar; //Homepage of Plugin/Author + end; + + //---------------- + // TUS_Hook - Structure of the Hook Function + // Return 0 if the Hook should be continue, + // or a non zero Value, if the Hook should be Interuped + // In this Case the Caller of the Notivier gets the Return Value + // Return Value Should not be -1 + //---------------- + TUS_Hook = Function (wParam, lParam: DWord): integer; stdcall; + TUS_Hook_of_Object = Function (wParam, lParam: DWord): integer of Object; + + //---------------- + // TUS_Service - Structure of the Service Function + // This Function is called if the Registered Service is Called + // Return Value Should not be SERVICE_NOT_FOUND + //---------------- + TUS_Service = Function (wParam, lParam: DWord): integer; stdcall; + TUS_Service_of_Object = Function (wParam, lParam: DWord): integer of Object; + + //---------------- + // TUS_PluginInterface - Structure that Includes all Methods callable + // from the Plugins + //---------------- + PUS_PluginInterface = ^TUS_PluginInterface; + TUS_PluginInterface = record + {******** Hook specific Methods ********} + {Function Creates a new Hookable Event and Returns the Handle + or 0 on Failure. (Name already exists)} + CreateHookableEvent: Function (EventName: PChar): THandle; stdcall; + + {Function Destroys an Event and Unhooks all Hooks to this Event. + 0 on success, not 0 on Failure} + DestroyHookableEvent: Function (hEvent: THandle): integer; stdcall; + + {Function start calling the Hook Chain + 0 if Chain is called until the End, -1 if Event Handle is not valid + otherwise Return Value of the Hook that breaks the Chain} + NotivyEventHooks: Function (hEvent: THandle; wParam, lParam: dWord): integer; stdcall; + + {Function Hooks an Event by Name. + Returns Hook Handle on Success, otherwise 0} + HookEvent: Function (EventName: PChar; HookProc: TUS_Hook): THandle; stdcall; + + {Function Removes the Hook from the Chain + Returns 0 on Success} + UnHookEvent: Function (hHook: THandle): Integer; stdcall; + + {Function Returns Non Zero if a Event with the given Name Exists, + otherwise 0} + EventExists: Function (EventName: PChar): Integer; stdcall; + + {******** Service specific Methods ********} + {Function Creates a new Service and Returns the Services Handle + or 0 on Failure. (Name already exists)} + CreateService: Function (ServiceName: PChar; ServiceProc: TUS_Service): THandle; stdcall; + + {Function Destroys a Service. + 0 on success, not 0 on Failure} + DestroyService: Function (hService: THandle): integer; stdcall; + + {Function Calls a Services Proc + Returns Services Return Value or SERVICE_NOT_FOUND on Failure} + CallService: Function (ServiceName: PChar; wParam, lParam: dWord): integer; stdcall; + + {Function Returns Non Zero if a Service with the given Name Exists, + otherwise 0} + ServiceExists: Function (ServiceName: PChar): Integer; stdcall; + end; + +//---------------- +// Some Default Constants +//---------------- +const + {Returned if Service is not Found from CallService} + SERVICE_NOT_FOUND=$80000000; + + +implementation + +end. -- cgit v1.2.3