diff --git a/src/d_net.cpp b/src/d_net.cpp index f9bd55d889..1dfa171166 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2676,7 +2676,7 @@ void Net_DoCommand (int type, BYTE **stream, int player) int arg[3] = { 0, 0, 0 }; for (int i = 0; i < 3; i++) arg[i] = ReadLong(stream); - bool manual = ReadByte(stream); + bool manual = !!ReadByte(stream); E_Console(player, s, arg[0], arg[1], arg[2], manual); } break; diff --git a/src/events.cpp b/src/events.cpp index 08e4b328d8..5faee810ac 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -473,58 +473,51 @@ IMPLEMENT_POINTER(prev) IMPLEMENT_POINTERS_END IMPLEMENT_CLASS(DEventHandler, false, false); -IMPLEMENT_CLASS(DBaseEvent, false, false) -IMPLEMENT_CLASS(DRenderEvent, false, false) -IMPLEMENT_CLASS(DWorldEvent, false, false) -IMPLEMENT_CLASS(DPlayerEvent, false, false) -IMPLEMENT_CLASS(DUiEvent, false, false) -IMPLEMENT_CLASS(DInputEvent, false, false) -IMPLEMENT_CLASS(DConsoleEvent, false, false) DEFINE_FIELD_X(StaticEventHandler, DStaticEventHandler, Order); DEFINE_FIELD_X(StaticEventHandler, DStaticEventHandler, IsUiProcessor); DEFINE_FIELD_X(StaticEventHandler, DStaticEventHandler, RequireMouse); -DEFINE_FIELD_X(RenderEvent, DRenderEvent, ViewPos); -DEFINE_FIELD_X(RenderEvent, DRenderEvent, ViewAngle); -DEFINE_FIELD_X(RenderEvent, DRenderEvent, ViewPitch); -DEFINE_FIELD_X(RenderEvent, DRenderEvent, ViewRoll); -DEFINE_FIELD_X(RenderEvent, DRenderEvent, FracTic); -DEFINE_FIELD_X(RenderEvent, DRenderEvent, Camera); +DEFINE_FIELD_X(RenderEvent, FRenderEvent, ViewPos); +DEFINE_FIELD_X(RenderEvent, FRenderEvent, ViewAngle); +DEFINE_FIELD_X(RenderEvent, FRenderEvent, ViewPitch); +DEFINE_FIELD_X(RenderEvent, FRenderEvent, ViewRoll); +DEFINE_FIELD_X(RenderEvent, FRenderEvent, FracTic); +DEFINE_FIELD_X(RenderEvent, FRenderEvent, Camera); -DEFINE_FIELD_X(WorldEvent, DWorldEvent, IsSaveGame); -DEFINE_FIELD_X(WorldEvent, DWorldEvent, IsReopen); -DEFINE_FIELD_X(WorldEvent, DWorldEvent, Thing); -DEFINE_FIELD_X(WorldEvent, DWorldEvent, Inflictor); -DEFINE_FIELD_X(WorldEvent, DWorldEvent, Damage); -DEFINE_FIELD_X(WorldEvent, DWorldEvent, DamageSource); -DEFINE_FIELD_X(WorldEvent, DWorldEvent, DamageType); -DEFINE_FIELD_X(WorldEvent, DWorldEvent, DamageFlags); -DEFINE_FIELD_X(WorldEvent, DWorldEvent, DamageAngle); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, IsSaveGame); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, IsReopen); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, Thing); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, Inflictor); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, Damage); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageSource); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageType); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageFlags); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageAngle); -DEFINE_FIELD_X(PlayerEvent, DPlayerEvent, PlayerNumber); -DEFINE_FIELD_X(PlayerEvent, DPlayerEvent, IsReturn); +DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, PlayerNumber); +DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, IsReturn); -DEFINE_FIELD_X(UiEvent, DUiEvent, Type); -DEFINE_FIELD_X(UiEvent, DUiEvent, KeyString); -DEFINE_FIELD_X(UiEvent, DUiEvent, KeyChar); -DEFINE_FIELD_X(UiEvent, DUiEvent, MouseX); -DEFINE_FIELD_X(UiEvent, DUiEvent, MouseY); -DEFINE_FIELD_X(UiEvent, DUiEvent, IsShift); -DEFINE_FIELD_X(UiEvent, DUiEvent, IsAlt); -DEFINE_FIELD_X(UiEvent, DUiEvent, IsCtrl); +DEFINE_FIELD_X(UiEvent, FUiEvent, Type); +DEFINE_FIELD_X(UiEvent, FUiEvent, KeyString); +DEFINE_FIELD_X(UiEvent, FUiEvent, KeyChar); +DEFINE_FIELD_X(UiEvent, FUiEvent, MouseX); +DEFINE_FIELD_X(UiEvent, FUiEvent, MouseY); +DEFINE_FIELD_X(UiEvent, FUiEvent, IsShift); +DEFINE_FIELD_X(UiEvent, FUiEvent, IsAlt); +DEFINE_FIELD_X(UiEvent, FUiEvent, IsCtrl); -DEFINE_FIELD_X(InputEvent, DInputEvent, Type); -DEFINE_FIELD_X(InputEvent, DInputEvent, KeyScan); -DEFINE_FIELD_X(InputEvent, DInputEvent, KeyString); -DEFINE_FIELD_X(InputEvent, DInputEvent, KeyChar); -DEFINE_FIELD_X(InputEvent, DInputEvent, MouseX); -DEFINE_FIELD_X(InputEvent, DInputEvent, MouseY); +DEFINE_FIELD_X(InputEvent, FInputEvent, Type); +DEFINE_FIELD_X(InputEvent, FInputEvent, KeyScan); +DEFINE_FIELD_X(InputEvent, FInputEvent, KeyString); +DEFINE_FIELD_X(InputEvent, FInputEvent, KeyChar); +DEFINE_FIELD_X(InputEvent, FInputEvent, MouseX); +DEFINE_FIELD_X(InputEvent, FInputEvent, MouseY); -DEFINE_FIELD_X(ConsoleEvent, DConsoleEvent, Player) -DEFINE_FIELD_X(ConsoleEvent, DConsoleEvent, Name) -DEFINE_FIELD_X(ConsoleEvent, DConsoleEvent, Args) -DEFINE_FIELD_X(ConsoleEvent, DConsoleEvent, IsManual) +DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Player) +DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Name) +DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Args) +DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, IsManual) DEFINE_ACTION_FUNCTION(DStaticEventHandler, SetOrder) { @@ -719,19 +712,12 @@ void DStaticEventHandler::OnUnregister() } } -static DWorldEvent* E_SetupWorldEvent() +static FWorldEvent E_SetupWorldEvent() { - static DWorldEvent* e = nullptr; - if (!e) e = (DWorldEvent*)RUNTIME_CLASS(DWorldEvent)->CreateNew(); - e->IsSaveGame = savegamerestore; - e->IsReopen = level.FromSnapshot && !savegamerestore; // each one by itself isnt helpful, but with hub load we have savegamerestore==0 and level.FromSnapshot==1. - e->Thing = nullptr; - e->Inflictor = nullptr; - e->Damage = 0; - e->DamageAngle = 0.0; - e->DamageFlags = 0; - e->DamageSource = 0; - e->DamageType = NAME_None; + FWorldEvent e; + e.IsSaveGame = savegamerestore; + e.IsReopen = level.FromSnapshot && !savegamerestore; // each one by itself isnt helpful, but with hub load we have savegamerestore==0 and level.FromSnapshot==1. + e.DamageAngle = 0.0; return e; } @@ -742,8 +728,8 @@ void DStaticEventHandler::WorldLoaded() // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_WorldLoaded_VMPtr) return; - DWorldEvent* e = E_SetupWorldEvent(); - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FWorldEvent e = E_SetupWorldEvent(); + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -755,8 +741,8 @@ void DStaticEventHandler::WorldUnloaded() // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_WorldUnloaded_VMPtr) return; - DWorldEvent* e = E_SetupWorldEvent(); - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FWorldEvent e = E_SetupWorldEvent(); + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -768,9 +754,9 @@ void DStaticEventHandler::WorldThingSpawned(AActor* actor) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_WorldThingSpawned_VMPtr) return; - DWorldEvent* e = E_SetupWorldEvent(); - e->Thing = actor; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FWorldEvent e = E_SetupWorldEvent(); + e.Thing = actor; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -782,10 +768,10 @@ void DStaticEventHandler::WorldThingDied(AActor* actor, AActor* inflictor) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_WorldThingDied_VMPtr) return; - DWorldEvent* e = E_SetupWorldEvent(); - e->Thing = actor; - e->Inflictor = inflictor; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FWorldEvent e = E_SetupWorldEvent(); + e.Thing = actor; + e.Inflictor = inflictor; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -797,9 +783,9 @@ void DStaticEventHandler::WorldThingRevived(AActor* actor) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_WorldThingRevived_VMPtr) return; - DWorldEvent* e = E_SetupWorldEvent(); - e->Thing = actor; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FWorldEvent e = E_SetupWorldEvent(); + e.Thing = actor; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -811,14 +797,14 @@ void DStaticEventHandler::WorldThingDamaged(AActor* actor, AActor* inflictor, AA // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_WorldThingDamaged_VMPtr) return; - DWorldEvent* e = E_SetupWorldEvent(); - e->Thing = actor; - e->Damage = damage; - e->DamageSource = source; - e->DamageType = mod; - e->DamageFlags = flags; - e->DamageAngle = angle; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FWorldEvent e = E_SetupWorldEvent(); + e.Thing = actor; + e.Damage = damage; + e.DamageSource = source; + e.DamageType = mod; + e.DamageFlags = flags; + e.DamageAngle = angle; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -830,9 +816,9 @@ void DStaticEventHandler::WorldThingDestroyed(AActor* actor) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_WorldThingDestroyed_VMPtr) return; - DWorldEvent* e = E_SetupWorldEvent(); - e->Thing = actor; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FWorldEvent e = E_SetupWorldEvent(); + e.Thing = actor; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -844,8 +830,8 @@ void DStaticEventHandler::WorldLightning() // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_WorldLightning_VMPtr) return; - DWorldEvent* e = E_SetupWorldEvent(); - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FWorldEvent e = E_SetupWorldEvent(); + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -857,22 +843,21 @@ void DStaticEventHandler::WorldTick() // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_WorldTick_VMPtr) return; - DWorldEvent* e = E_SetupWorldEvent(); - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FWorldEvent e = E_SetupWorldEvent(); + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } -static DRenderEvent* E_SetupRenderEvent() +static FRenderEvent E_SetupRenderEvent() { - static DRenderEvent* e = nullptr; - if (!e) e = (DRenderEvent*)RUNTIME_CLASS(DRenderEvent)->CreateNew(); - e->ViewPos = ::ViewPos; - e->ViewAngle = ::ViewAngle; - e->ViewPitch = ::ViewPitch; - e->ViewRoll = ::ViewRoll; - e->FracTic = ::r_TicFracF; - e->Camera = ::camera; + FRenderEvent e; + e.ViewPos = ::ViewPos; + e.ViewAngle = ::ViewAngle; + e.ViewPitch = ::ViewPitch; + e.ViewRoll = ::ViewRoll; + e.FracTic = ::r_TicFracF; + e.Camera = ::camera; return e; } @@ -883,8 +868,8 @@ void DStaticEventHandler::RenderFrame() // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_RenderFrame_VMPtr) return; - DRenderEvent* e = E_SetupRenderEvent(); - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FRenderEvent e = E_SetupRenderEvent(); + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -896,21 +881,12 @@ void DStaticEventHandler::RenderOverlay() // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_RenderOverlay_VMPtr) return; - DRenderEvent* e = E_SetupRenderEvent(); - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FRenderEvent e = E_SetupRenderEvent(); + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } -static DPlayerEvent* E_SetupPlayerEvent() -{ - static DPlayerEvent* e = nullptr; - if (!e) e = (DPlayerEvent*)RUNTIME_CLASS(DPlayerEvent)->CreateNew(); - e->PlayerNumber = -1; - e->IsReturn = false; - return e; -} - void DStaticEventHandler::PlayerEntered(int num, bool fromhub) { IFVIRTUAL(DStaticEventHandler, PlayerEntered) @@ -918,10 +894,8 @@ void DStaticEventHandler::PlayerEntered(int num, bool fromhub) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_PlayerEntered_VMPtr) return; - DPlayerEvent* e = E_SetupPlayerEvent(); - e->IsReturn = fromhub; - e->PlayerNumber = num; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FPlayerEvent e = { num, fromhub }; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -933,9 +907,8 @@ void DStaticEventHandler::PlayerRespawned(int num) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_PlayerRespawned_VMPtr) return; - DPlayerEvent* e = E_SetupPlayerEvent(); - e->PlayerNumber = num; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FPlayerEvent e = { num, false }; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -947,9 +920,8 @@ void DStaticEventHandler::PlayerDied(int num) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_PlayerDied_VMPtr) return; - DPlayerEvent* e = E_SetupPlayerEvent(); - e->PlayerNumber = num; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FPlayerEvent e = { num, false }; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -961,25 +933,50 @@ void DStaticEventHandler::PlayerDisconnected(int num) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_PlayerDisconnected_VMPtr) return; - DPlayerEvent* e = E_SetupPlayerEvent(); - e->PlayerNumber = num; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + FPlayerEvent e = { num, false }; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } -static DUiEvent* E_SetupUiEvent() +FUiEvent::FUiEvent(event_t *ev) { - static DUiEvent* e = nullptr; - if (!e) e = (DUiEvent*)RUNTIME_CLASS(DUiEvent)->CreateNew(); - e->Type = EV_GUI_None; - e->IsShift = false; - e->IsAlt = false; - e->IsCtrl = false; - e->MouseX = e->MouseY = 0; - e->KeyChar = 0; - e->KeyString = ""; - return e; + Type = (EGUIEvent)ev->subtype; + KeyChar = 0; + IsShift = false; + IsAlt = false; + IsCtrl = false; + MouseX = 0; + MouseY = 0; + // we don't want the modders to remember what weird fields mean what for what events. + switch (ev->subtype) + { + case EV_GUI_None: + break; + case EV_GUI_KeyDown: + case EV_GUI_KeyRepeat: + case EV_GUI_KeyUp: + KeyChar = ev->data1; + KeyString = FString(char(ev->data1)); + IsShift = !!(ev->data3 & GKM_SHIFT); + IsAlt = !!(ev->data3 & GKM_ALT); + IsCtrl = !!(ev->data3 & GKM_CTRL); + break; + case EV_GUI_Char: + KeyChar = ev->data1; + KeyString = FString(char(ev->data1)); + IsAlt = !!ev->data2; // only true for Win32, not sure about SDL + break; + default: // mouse event + // note: SDL input doesn't seem to provide these at all + //Printf("Mouse data: %d, %d, %d, %d\n", ev->x, ev->y, ev->data1, ev->data2); + MouseX = ev->data1; + MouseY = ev->data2; + IsShift = !!(ev->data3 & GKM_SHIFT); + IsAlt = !!(ev->data3 & GKM_ALT); + IsCtrl = !!(ev->data3 & GKM_CTRL); + break; + } } bool DStaticEventHandler::UiProcess(event_t* ev) @@ -989,43 +986,11 @@ bool DStaticEventHandler::UiProcess(event_t* ev) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_UiProcess_VMPtr) return false; - DUiEvent* e = E_SetupUiEvent(); - - // - e->Type = (EGUIEvent)ev->subtype; - // we don't want the modders to remember what weird fields mean what for what events. - switch (e->Type) - { - case EV_GUI_None: - break; - case EV_GUI_KeyDown: - case EV_GUI_KeyRepeat: - case EV_GUI_KeyUp: - e->KeyChar = ev->data1; - e->KeyString.Format("%c", e->KeyChar); - e->IsShift = !!(ev->data3 & GKM_SHIFT); - e->IsAlt = !!(ev->data3 & GKM_ALT); - e->IsCtrl = !!(ev->data3 & GKM_CTRL); - break; - case EV_GUI_Char: - e->KeyChar = ev->data1; - e->KeyString.Format("%c", e->KeyChar); - e->IsAlt = !!ev->data2; // only true for Win32, not sure about SDL - break; - default: // mouse event - // note: SDL input doesn't seem to provide these at all - //Printf("Mouse data: %d, %d, %d, %d\n", ev->x, ev->y, ev->data1, ev->data2); - e->MouseX = ev->data1; - e->MouseY = ev->data2; - e->IsShift = !!(ev->data3 & GKM_SHIFT); - e->IsAlt = !!(ev->data3 & GKM_ALT); - e->IsCtrl = !!(ev->data3 & GKM_CTRL); - break; - } + FUiEvent e = ev; int processed; VMReturn results[1] = { &processed }; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, results, 1, nullptr); return !!processed; } @@ -1033,16 +998,31 @@ bool DStaticEventHandler::UiProcess(event_t* ev) return false; } -static DInputEvent* E_SetupInputEvent() +FInputEvent::FInputEvent(event_t *ev) { - static DInputEvent* e = nullptr; - if (!e) e = (DInputEvent*)RUNTIME_CLASS(DInputEvent)->CreateNew(); - e->Type = EV_None; - e->KeyScan = 0; - e->KeyChar = 0; - e->KeyString = ""; - e->MouseX = e->MouseY = 0; - return e; + Type = (EGenericEvent)ev->type; + // we don't want the modders to remember what weird fields mean what for what events. + KeyScan = 0; + KeyChar = 0; + MouseX = 0; + MouseY = 0; + switch (Type) + { + case EV_None: + break; + case EV_KeyDown: + case EV_KeyUp: + KeyScan = ev->data1; + KeyChar = ev->data2; + KeyString = FString(char(ev->data1)); + break; + case EV_Mouse: + MouseX = ev->x; + MouseY = ev->y; + break; + default: + break; // EV_DeviceChange = wat? + } } bool DStaticEventHandler::InputProcess(event_t* ev) @@ -1052,32 +1032,13 @@ bool DStaticEventHandler::InputProcess(event_t* ev) // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_InputProcess_VMPtr) return false; - DInputEvent* e = E_SetupInputEvent(); + FInputEvent e = ev; // - e->Type = (EGenericEvent)ev->type; - // we don't want the modders to remember what weird fields mean what for what events. - switch (e->Type) - { - case EV_None: - break; - case EV_KeyDown: - case EV_KeyUp: - e->KeyScan = ev->data1; - e->KeyChar = ev->data2; - e->KeyString.Format("%c", e->KeyChar); - break; - case EV_Mouse: - e->MouseX = ev->x; - e->MouseY = ev->y; - break; - default: - break; // EV_DeviceChange = wat? - } int processed; VMReturn results[1] = { &processed }; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, results, 1, nullptr); return !!processed; } @@ -1085,18 +1046,6 @@ bool DStaticEventHandler::InputProcess(event_t* ev) return false; } -static DConsoleEvent* E_SetupConsoleEvent() -{ - static DConsoleEvent* e = nullptr; - if (!e) e = (DConsoleEvent*)RUNTIME_CLASS(DConsoleEvent)->CreateNew(); - e->Player = -1; - e->Name = ""; - for (size_t i = 0; i < countof(e->Args); i++) - e->Args[i] = 0; - e->IsManual = false; - return e; -} - void DStaticEventHandler::ConsoleProcess(int player, FString name, int arg1, int arg2, int arg3, bool manual) { if (player < 0) @@ -1106,17 +1055,17 @@ void DStaticEventHandler::ConsoleProcess(int player, FString name, int arg1, int // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_ConsoleProcess_VMPtr) return; - DConsoleEvent* e = E_SetupConsoleEvent(); + FConsoleEvent e; // - e->Player = player; - e->Name = name; - e->Args[0] = arg1; - e->Args[1] = arg2; - e->Args[2] = arg3; - e->IsManual = manual; + e.Player = player; + e.Name = name; + e.Args[0] = arg1; + e.Args[1] = arg2; + e.Args[2] = arg3; + e.IsManual = manual; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } @@ -1127,17 +1076,17 @@ void DStaticEventHandler::ConsoleProcess(int player, FString name, int arg1, int // don't create excessive DObjects if not going to be processed anyway if (func == DStaticEventHandler_NetworkProcess_VMPtr) return; - DConsoleEvent* e = E_SetupConsoleEvent(); + FConsoleEvent e; // - e->Player = player; - e->Name = name; - e->Args[0] = arg1; - e->Args[1] = arg2; - e->Args[2] = arg3; - e->IsManual = manual; + e.Player = player; + e.Name = name; + e.Args[0] = arg1; + e.Args[1] = arg2; + e.Args[2] = arg3; + e.IsManual = manual; - VMValue params[2] = { (DStaticEventHandler*)this, e }; + VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } } diff --git a/src/events.h b/src/events.h index d41c2e26d3..6a84da3f64 100755 --- a/src/events.h +++ b/src/events.h @@ -163,76 +163,34 @@ public: extern DStaticEventHandler* E_FirstEventHandler; extern DStaticEventHandler* E_LastEventHandler; -// we cannot call this DEvent because in ZScript, 'event' is a keyword -class DBaseEvent : public DObject +struct FRenderEvent { - DECLARE_CLASS(DBaseEvent, DObject) -public: - - DBaseEvent() - { - // each type of event is created only once to avoid new/delete hell - // since from what I remember object creation and deletion results in a lot of GC processing - // (and we aren't supposed to pass event objects around anyway) - this->ObjectFlags |= OF_Fixed; - // we don't want to store events into the savegames because they are global. - this->ObjectFlags |= OF_Transient; - } -}; - -class DRenderEvent : public DBaseEvent -{ - DECLARE_CLASS(DRenderEvent, DBaseEvent) -public: // these are for all render events DVector3 ViewPos; DAngle ViewAngle; DAngle ViewPitch; DAngle ViewRoll; - double FracTic; // 0..1 value that describes where we are inside the current gametic, render-wise. - AActor* Camera; - - DRenderEvent() - { - FracTic = 0; - Camera = nullptr; - } + double FracTic = 0; // 0..1 value that describes where we are inside the current gametic, render-wise. + AActor* Camera = nullptr; }; -class DWorldEvent : public DBaseEvent +struct FWorldEvent { - DECLARE_CLASS(DWorldEvent, DBaseEvent) -public: // for loaded/unloaded - bool IsSaveGame; - bool IsReopen; + bool IsSaveGame = false; + bool IsReopen = false; // for thingspawned, thingdied, thingdestroyed - AActor* Thing; - // for thingdied - AActor* Inflictor; // can be null - // for damagemobj - int Damage; - AActor* DamageSource; // can be null + AActor* Thing = nullptr; // for thingdied + AActor* Inflictor = nullptr; // can be null - for damagemobj + AActor* DamageSource = nullptr; // can be null + int Damage = 0; FName DamageType; - int DamageFlags; + int DamageFlags = 0; DAngle DamageAngle; - - DWorldEvent() - { - IsSaveGame = false; - IsReopen = false; - Thing = nullptr; - Inflictor = nullptr; - Damage = 0; - DamageSource = nullptr; - DamageFlags = 0; - } }; -class DPlayerEvent : public DBaseEvent +struct FPlayerEvent { - DECLARE_CLASS(DPlayerEvent, DBaseEvent) -public: // we currently have only one member: player index // in ZScript, we have global players[] array from which we can // get both the player itself and player's body, @@ -240,18 +198,10 @@ public: int PlayerNumber; // we set this to true if level was reopened (RETURN scripts) bool IsReturn; - - DPlayerEvent() - { - PlayerNumber = -1; - IsReturn = false; - } }; -class DUiEvent : public DBaseEvent +struct FUiEvent { - DECLARE_CLASS(DUiEvent, DBaseEvent) -public: // this essentially translates event_t UI events to ZScript. EGUIEvent Type; // for keys/chars/whatever @@ -265,18 +215,13 @@ public: bool IsCtrl; bool IsAlt; - DUiEvent() - { - Type = EV_GUI_None; - } + FUiEvent(event_t *ev); }; -class DInputEvent : public DBaseEvent +struct FInputEvent { - DECLARE_CLASS(DInputEvent, DBaseEvent) -public: // this translates regular event_t events to ZScript (not UI, UI events are sent via DUiEvent and only if requested!) - EGenericEvent Type; + EGenericEvent Type = EV_None; // for keys int KeyScan; FString KeyString; @@ -285,16 +230,11 @@ public: int MouseX; int MouseY; - DInputEvent() - { - Type = EV_None; - } + FInputEvent(event_t *ev); }; -class DConsoleEvent : public DBaseEvent +struct FConsoleEvent { - DECLARE_CLASS(DConsoleEvent, DBaseEvent) -public: // player that activated this event. note that it's always -1 for non-playsim events (i.e. these not called with netevent) int Player; // @@ -302,12 +242,6 @@ public: int Args[3]; // bool IsManual; - - DConsoleEvent() - { - Player = -1; - IsManual = false; - } }; #endif \ No newline at end of file diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index a481dd24b7..15df785bf8 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -56,6 +56,7 @@ #include "menu/menu.h" #include "textures/textures.h" #include "virtual.h" +#include "events.h" // // Todo: Move these elsewhere @@ -173,15 +174,31 @@ DMenu::DMenu(DMenu *parent) bool DMenu::CallResponder(event_t *ev) { - IFVIRTUAL(DMenu, Responder) + if (ev->type == EV_GUI_Event) { - VMValue params[] = { (DObject*)this, ev}; - int retval; - VMReturn ret(&retval); - GlobalVMStack.Call(func, params, 2, &ret, 1, nullptr); - return !!retval; + IFVIRTUAL(DMenu, OnUIEvent) + { + FUiEvent e = ev; + VMValue params[] = { (DObject*)this, &e }; + int retval; + VMReturn ret(&retval); + GlobalVMStack.Call(func, params, 2, &ret, 1, nullptr); + return !!retval; + } } - else return false; + else + { + IFVIRTUAL(DMenu, OnInputEvent) + { + FInputEvent e = ev; + VMValue params[] = { (DObject*)this, &e }; + int retval; + VMReturn ret(&retval); + GlobalVMStack.Call(func, params, 2, &ret, 1, nullptr); + return !!retval; + } + } + return false; } //============================================================================= diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 49aba7ec5a..12a0c44e08 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -6063,10 +6063,9 @@ FxExpression *FxIdentifier::ResolveMember(FCompileContext &ctx, PStruct *classct object = nullptr; return nullptr; } - if ((vsym->Flags & VARF_Deprecated) && sym->mVersion >= ctx.Version) + if ((vsym->Flags & VARF_Deprecated) && sym->mVersion <= ctx.Version) { ScriptPosition.Message(MSG_WARNING, "Accessing deprecated member variable %s - deprecated since %d.%d.%d", sym->SymbolName.GetChars(), vsym->mVersion.major, vsym->mVersion.minor, vsym->mVersion.revision); - ScriptPosition.Message(MSG_WARNING, "Accessing deprecated member variable %s", vsym->SymbolName.GetChars()); } // We have 4 cases to consider here: @@ -8513,7 +8512,7 @@ bool FxVMFunctionCall::CheckAccessibility(const VersionInfo &ver) ScriptPosition.Message(MSG_ERROR, "%s not accessible to %s", Function->SymbolName.GetChars(), VersionString.GetChars()); return false; } - if ((Function->Variants[0].Flags & VARF_Deprecated) && Function->mVersion >= ver) + if ((Function->Variants[0].Flags & VARF_Deprecated) && Function->mVersion <= ver) { ScriptPosition.Message(MSG_WARNING, "Accessing deprecated function %s - deprecated since %d.%d.%d", Function->SymbolName.GetChars(), Function->mVersion.major, Function->mVersion.minor, Function->mVersion.revision); } diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index fa37a021c8..ab0760e12e 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -1,55 +1,3 @@ -struct InputEventData native version("2.4") -{ - native uint8 type; - native uint8 subtype; - native int16 data1; // keys / mouse/joystick buttons - native int16 data2; - native int16 data3; - native int x; // mouse/joystick x move - native int y; // mouse/joystick y move - - enum EGenericEvent - { - NoEvent, - KeyDown, // data1: scan code, data2: Qwerty ASCII code - KeyUp, // same - Mouse, // x, y: mouse movement deltas - GUI_Event, // subtype specifies actual event - DeviceChange,// a device has been connected or removed - } - - enum EGUIEvent - { - GUI_None, - GUI_KeyDown, // data1: unshifted ASCII, data2: shifted ASCII, data3: modifiers - GUI_KeyRepeat, // same - GUI_KeyUp, // same - GUI_Char, // data1: translated character (for user text input), data2: alt down? - GUI_FirstMouseEvent, - GUI_MouseMove, - GUI_LButtonDown, - GUI_LButtonUp, - GUI_LButtonDblClick, - GUI_MButtonDown, - GUI_MButtonUp, - GUI_MButtonDblClick, - GUI_RButtonDown, - GUI_RButtonUp, - GUI_RButtonDblClick, - GUI_WheelUp, // data3: shift/ctrl/alt - GUI_WheelDown, // " - GUI_WheelRight, // " - GUI_WheelLeft, // " - GUI_BackButtonDown, - GUI_BackButtonUp, - GUI_FwdButtonDown, - GUI_FwdButtonUp, - GUI_LastMouseEvent, - }; - - const KEY_ESCAPE = 0x01; -} - struct TexMan { enum EUseTypes diff --git a/wadsrc/static/zscript/events.txt b/wadsrc/static/zscript/events.txt index d7e39e1c0f..f0b0db0d55 100755 --- a/wadsrc/static/zscript/events.txt +++ b/wadsrc/static/zscript/events.txt @@ -1,6 +1,5 @@ -class BaseEvent native version("2.4") { } // just a base class. it doesn't inherit from Object on the scripting side so you can't call Destroy() on it and break everything. -class RenderEvent : BaseEvent native ui version("2.4") +struct RenderEvent native ui version("2.4") { native readonly Vector3 ViewPos; native readonly double ViewAngle; @@ -10,7 +9,7 @@ class RenderEvent : BaseEvent native ui version("2.4") native readonly Actor Camera; } -class WorldEvent : BaseEvent native play version("2.4") +struct WorldEvent native play version("2.4") { // for loaded/unloaded native readonly bool IsSaveGame; @@ -28,7 +27,7 @@ class WorldEvent : BaseEvent native play version("2.4") native readonly double DamageAngle; } -class PlayerEvent : BaseEvent native play version("2.4") +struct PlayerEvent native play version("2.4") { // this is the player number that caused the event. // note: you can get player struct from this by using players[e.PlayerNumber] @@ -37,7 +36,7 @@ class PlayerEvent : BaseEvent native play version("2.4") native readonly bool IsReturn; } -class UiEvent : BaseEvent native ui version("2.4") +struct UiEvent native ui version("2.4") { // d_gui.h enum EGUIEvent @@ -121,7 +120,7 @@ class UiEvent : BaseEvent native ui version("2.4") native readonly bool IsAlt; } -class InputEvent : BaseEvent native play version("2.4") +struct InputEvent native play version("2.4") { enum EGenericEvent { @@ -270,7 +269,7 @@ class InputEvent : BaseEvent native play version("2.4") native readonly int MouseY; } -class ConsoleEvent : BaseEvent native version("2.4") +struct ConsoleEvent native version("2.4") { // for net events, this will be the activator. // for UI events, this is always -1, and you need to check if level is loaded and use players[consoleplayer]. diff --git a/wadsrc/static/zscript/menu/conversationmenu.txt b/wadsrc/static/zscript/menu/conversationmenu.txt index 9d1d9f4941..abda3dee28 100644 --- a/wadsrc/static/zscript/menu/conversationmenu.txt +++ b/wadsrc/static/zscript/menu/conversationmenu.txt @@ -335,18 +335,18 @@ class ConversationMenu : Menu // //============================================================================= - override bool Responder(InputEventData ev) + override bool OnUIEvent(UIEvent ev) { if (demoplayback) { // No interaction during demo playback return false; } - if (ev.type == InputEventData.GUI_Event && ev.subtype == InputEventData.GUI_Char && ev.data1 >= 48 && ev.data1 <= 57) + if (ev.type == UIEvent.Type_Char && ev.KeyChar >= 48 && ev.KeyChar <= 57) { // Activate an item of type numberedmore (dialogue only) - mSelection = ev.data1 == 48 ? 9 : ev.data1 - 49; + mSelection = ev.KeyChar == 48 ? 9 : ev.KeyChar - 49; return MenuEvent(MKEY_Enter, false); } - return Super.Responder(ev); + return Super.OnUIEvent(ev); } //============================================================================ diff --git a/wadsrc/static/zscript/menu/listmenu.txt b/wadsrc/static/zscript/menu/listmenu.txt index a7a9f71ae5..e0bb72af92 100644 --- a/wadsrc/static/zscript/menu/listmenu.txt +++ b/wadsrc/static/zscript/menu/listmenu.txt @@ -99,37 +99,34 @@ class ListMenu : Menu // //============================================================================= - override bool Responder (InputEventData ev) + override bool OnUIEvent(UIEvent ev) { - if (ev.type == InputEventData.GUI_Event) + if (ev.Type == UIEvent.Type_KeyDown) { - if (ev.subtype == InputEventData.GUI_KeyDown) - { - // tolower - int ch = ev.data1; - ch = ch >= 65 && ch <91? ch + 32 : ch; + // tolower + int ch = ev.KeyChar; + ch = ch >= 65 && ch <91? ch + 32 : ch; - for(int i = mDesc.mSelectedItem + 1; i < mDesc.mItems.Size(); i++) + for(int i = mDesc.mSelectedItem + 1; i < mDesc.mItems.Size(); i++) + { + if (mDesc.mItems[i].CheckHotkey(ch)) { - if (mDesc.mItems[i].CheckHotkey(ch)) - { - mDesc.mSelectedItem = i; - MenuSound("menu/cursor"); - return true; - } + mDesc.mSelectedItem = i; + MenuSound("menu/cursor"); + return true; } - for(int i = 0; i < mDesc.mSelectedItem; i++) + } + for(int i = 0; i < mDesc.mSelectedItem; i++) + { + if (mDesc.mItems[i].CheckHotkey(ch)) { - if (mDesc.mItems[i].CheckHotkey(ch)) - { - mDesc.mSelectedItem = i; - MenuSound("menu/cursor"); - return true; - } + mDesc.mSelectedItem = i; + MenuSound("menu/cursor"); + return true; } } } - return Super.Responder(ev); + return Super.OnUIEvent(ev); } //============================================================================= diff --git a/wadsrc/static/zscript/menu/loadsavemenu.txt b/wadsrc/static/zscript/menu/loadsavemenu.txt index 05638d393b..2154e10154 100644 --- a/wadsrc/static/zscript/menu/loadsavemenu.txt +++ b/wadsrc/static/zscript/menu/loadsavemenu.txt @@ -383,42 +383,39 @@ class LoadSaveMenu : ListMenu // //============================================================================= - override bool Responder (InputEventData ev) + override bool OnUIEvent(UIEvent ev) { - if (ev.type == InputEventData.GUI_Event) + if (ev.Type == UIEvent.Type_KeyDown) { - if (ev.subtype == InputEventData.GUI_KeyDown) + if (Selected < manager.SavegameCount()) { - if (Selected < manager.SavegameCount()) + switch (ev.KeyChar) { - switch (ev.data1) - { - case UIEvent.Key_F1: - manager.SetFileInfo(Selected); - return true; + case UIEvent.Key_F1: + manager.SetFileInfo(Selected); + return true; - case UIEvent.Key_DEL: - { - String EndString; - EndString = String.Format("%s%s%s%s?\n\n%s", Stringtable.Localize("$MNU_DELETESG"), TEXTCOLOR_WHITE, manager.GetSavegame(Selected).SaveTitle, TEXTCOLOR_NORMAL, Stringtable.Localize("$PRESSYN")); - StartMessage (EndString, 0); - } - return true; + case UIEvent.Key_DEL: + { + String EndString; + EndString = String.Format("%s%s%s%s?\n\n%s", Stringtable.Localize("$MNU_DELETESG"), TEXTCOLOR_WHITE, manager.GetSavegame(Selected).SaveTitle, TEXTCOLOR_NORMAL, Stringtable.Localize("$PRESSYN")); + StartMessage (EndString, 0); } + return true; } } - else if (ev.subtype == InputEventData.GUI_WheelUp) - { - if (TopItem > 0) TopItem--; - return true; - } - else if (ev.subtype == InputEventData.GUI_WheelDown) - { - if (TopItem < manager.SavegameCount() - listboxRows) TopItem++; - return true; - } } - return Super.Responder(ev); + else if (ev.Type == UIEvent.Type_WheelUp) + { + if (TopItem > 0) TopItem--; + return true; + } + else if (ev.Type == UIEvent.Type_WheelDown) + { + if (TopItem < manager.SavegameCount() - listboxRows) TopItem++; + return true; + } + return Super.OnUIEvent(ev); } @@ -503,13 +500,13 @@ class SaveMenu : LoadSaveMenu // //============================================================================= - override bool Responder (InputEventData ev) + override bool OnUIEvent(UIEvent ev) { - if (ev.subtype == InputEventData.GUI_KeyDown) + if (ev.Type == UIEvent.Type_KeyDown) { if (Selected != -1) { - switch (ev.data1) + switch (ev.KeyChar) { case UIEvent.Key_DEL: // cannot delete 'new save game' item @@ -523,9 +520,14 @@ class SaveMenu : LoadSaveMenu } } } - return Super.Responder(ev); + return Super.OnUIEvent(ev); } + //============================================================================= + // + // + // + //============================================================================= override void Ticker() { diff --git a/wadsrc/static/zscript/menu/menu.txt b/wadsrc/static/zscript/menu/menu.txt index e2861cdd34..d29211b772 100644 --- a/wadsrc/static/zscript/menu/menu.txt +++ b/wadsrc/static/zscript/menu/menu.txt @@ -169,47 +169,50 @@ class Menu : Object native ui version("2.4") // //============================================================================= - virtual bool Responder(InputEventData ev) + virtual bool OnUIEvent(UIEvent ev) { bool res = false; - if (ev.type == InputEventData.GUI_Event) + int y = ev.MouseY; + if (ev.type == UIEvent.Type_LButtonDown) { - if (ev.subtype == InputEventData.GUI_LButtonDown) + res = MouseEventBack(MOUSE_Click, ev.MouseX, y); + // make the menu's mouse handler believe that the current coordinate is outside the valid range + if (res) y = -1; + res |= MouseEvent(MOUSE_Click, ev.MouseX, y); + if (res) { - res = MouseEventBack(MOUSE_Click, ev.data1, ev.data2); - // make the menu's mouse handler believe that the current coordinate is outside the valid range - if (res) ev.data2 = -1; - res |= MouseEvent(MOUSE_Click, ev.data1, ev.data2); - if (res) - { - SetCapture(true); - } - + SetCapture(true); } - else if (ev.subtype == InputEventData.GUI_MouseMove) + + } + else if (ev.type == UIEvent.Type_MouseMove) + { + BackbuttonTime = 4*Thinker.TICRATE; + if (mMouseCapture || m_use_mouse == 1) { - BackbuttonTime = 4*Thinker.TICRATE; - if (mMouseCapture || m_use_mouse == 1) - { - res = MouseEventBack(MOUSE_Move, ev.data1, ev.data2); - if (res) ev.data2 = -1; - res |= MouseEvent(MOUSE_Move, ev.data1, ev.data2); - } + res = MouseEventBack(MOUSE_Move, ev.MouseX, y); + if (res) y = -1; + res |= MouseEvent(MOUSE_Move, ev.MouseX, y); } - else if (ev.subtype == InputEventData.GUI_LButtonUp) + } + else if (ev.type == UIEvent.Type_LButtonUp) + { + if (mMouseCapture) { - if (mMouseCapture) - { - SetCapture(false); - res = MouseEventBack(MOUSE_Release, ev.data1, ev.data2); - if (res) ev.data2 = -1; - res |= MouseEvent(MOUSE_Release, ev.data1, ev.data2); - } + SetCapture(false); + res = MouseEventBack(MOUSE_Release, ev.MouseX, y); + if (res) y = -1; + res |= MouseEvent(MOUSE_Release, ev.MouseX, y); } } return false; } + virtual bool OnInputEvent(InputEvent ev) + { + return false; + } + //============================================================================= // // diff --git a/wadsrc/static/zscript/menu/messagebox.txt b/wadsrc/static/zscript/menu/messagebox.txt index f5a60d9d40..48d9949a39 100644 --- a/wadsrc/static/zscript/menu/messagebox.txt +++ b/wadsrc/static/zscript/menu/messagebox.txt @@ -171,14 +171,14 @@ class MessageBoxMenu : Menu // //============================================================================= - override bool Responder(InputEventData ev) + override bool OnUIEvent(UIEvent ev) { - if (ev.type == InputEventData.GUI_Event && ev.subtype == InputEventData.GUI_KeyDown) + if (ev.type == UIEvent.Type_KeyDown) { if (mMessageMode == 0) { // tolower - int ch = ev.data1; + int ch = ev.KeyChar; ch = ch >= 65 && ch <91? ch + 32 : ch; if (ch == 110 /*'n'*/ || ch == 32) @@ -199,12 +199,17 @@ class MessageBoxMenu : Menu } return false; } - else if (ev.type == InputEventData.KeyDown) + return Super.OnUIEvent(ev); + } + + override bool OnInputEvent(InputEvent ev) + { + if (ev.type == InputEvent.Type_KeyDown) { Close(); return true; } - return Super.Responder(ev); + return Super.OnInputEvent(ev); } //============================================================================= diff --git a/wadsrc/static/zscript/menu/optionmenu.txt b/wadsrc/static/zscript/menu/optionmenu.txt index f0917654ae..99405cd889 100644 --- a/wadsrc/static/zscript/menu/optionmenu.txt +++ b/wadsrc/static/zscript/menu/optionmenu.txt @@ -155,35 +155,32 @@ class OptionMenu : Menu // //============================================================================= - override bool Responder (InputEventData ev) + override bool OnUIEvent(UIEvent ev) { - if (ev.type == InputEventData.GUI_Event) + if (ev.type == UIEvent.Type_WheelUp) { - if (ev.subtype == InputEventData.GUI_WheelUp) - { - int scrollamt = MIN(2, mDesc.mScrollPos); - mDesc.mScrollPos -= scrollamt; - return true; - } - else if (ev.subtype == InputEventData.GUI_WheelDown) - { - if (CanScrollDown) - { - if (VisBottom >= 0 && VisBottom < (mDesc.mItems.Size()-2)) - { - mDesc.mScrollPos += 2; - VisBottom += 2; - } - else - { - mDesc.mScrollPos++; - VisBottom++; - } - } - return true; - } + int scrollamt = MIN(2, mDesc.mScrollPos); + mDesc.mScrollPos -= scrollamt; + return true; } - return Super.Responder(ev); + else if (ev.type == UIEvent.Type_WheelDown) + { + if (CanScrollDown) + { + if (VisBottom >= 0 && VisBottom < (mDesc.mItems.Size()-2)) + { + mDesc.mScrollPos += 2; + VisBottom += 2; + } + else + { + mDesc.mScrollPos++; + VisBottom++; + } + } + return true; + } + return Super.OnUIEvent(ev); } //============================================================================= diff --git a/wadsrc/static/zscript/menu/optionmenuitems.txt b/wadsrc/static/zscript/menu/optionmenuitems.txt index 404ce5b36f..c57391d442 100644 --- a/wadsrc/static/zscript/menu/optionmenuitems.txt +++ b/wadsrc/static/zscript/menu/optionmenuitems.txt @@ -396,16 +396,16 @@ class EnterKey : Menu } } - override bool Responder(InputEventData ev) + override bool OnInputEvent(InputEvent ev) { - // This checks raw keys, not GUI keys. - if (ev.type == InputEventData.KeyDown) + // This menu checks raw keys, not GUI keys because it needs the raw codes for binding. + if (ev.type == InputEvent.Type_KeyDown) { - mOwner.SendKey(ev.data1); + mOwner.SendKey(ev.KeyScan); menuactive = Menu.On; SetMenuMessage(0); Close(); - mParentMenu.MenuEvent((ev.data1 == InputEventData.KEY_ESCAPE)? Menu.MKEY_Abort : Menu.MKEY_Input, 0); + mParentMenu.MenuEvent((ev.KeyScan == InputEvent.KEY_ESCAPE)? Menu.MKEY_Abort : Menu.MKEY_Input, 0); return true; } return false; diff --git a/wadsrc/static/zscript/menu/playermenu.txt b/wadsrc/static/zscript/menu/playermenu.txt index 4502cc9fa8..dac376ee90 100644 --- a/wadsrc/static/zscript/menu/playermenu.txt +++ b/wadsrc/static/zscript/menu/playermenu.txt @@ -372,9 +372,9 @@ class PlayerMenu : ListMenu // //============================================================================= - override bool Responder (InputEventData ev) + override bool OnUIEvent(UIEvent ev) { - if (ev.type == InputEventData.GUI_Event && ev.subtype == InputEventData.GUI_Char && ev.data1 == 32) + if (ev.Type == UIEvent.Type_Char && ev.KeyChar == 32) { // turn the player sprite around mRotation = 8 - mRotation; @@ -385,7 +385,7 @@ class PlayerMenu : ListMenu } return true; } - return Super.Responder(ev); + return Super.OnUIEvent(ev); } //============================================================================= diff --git a/wadsrc/static/zscript/menu/textentermenu.txt b/wadsrc/static/zscript/menu/textentermenu.txt index b92932aaf3..69a6694f31 100644 --- a/wadsrc/static/zscript/menu/textentermenu.txt +++ b/wadsrc/static/zscript/menu/textentermenu.txt @@ -108,59 +108,56 @@ class TextEnterMenu : Menu // //============================================================================= - override bool Responder(InputEventData ev) + override bool OnUIEvent(UIEvent ev) { - if (ev.type == InputEventData.GUI_Event) + // Save game and player name string input + if (ev.Type == UIEvent.Type_Char) { - // Save game and player name string input - if (ev.subtype == InputEventData.GUI_Char) + mInputGridOkay = false; + if (mEnterString.Length() < mEnterSize && + (mSizeMode == 2/*entering player name*/ || SmallFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) { - mInputGridOkay = false; - if (mEnterString.Length() < mEnterSize && - (mSizeMode == 2/*entering player name*/ || SmallFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) - { - mEnterString.AppendFormat("%c", ev.data1); - } + mEnterString.AppendFormat("%c", ev.KeyChar); + } + return true; + } + int ch = ev.KeyChar; + if ((ev.Type == UIEvent.Type_KeyDown || ev.Type == UIEvent.Type_KeyRepeat) && ch == 8) + { + if (mEnterString.Length() > 0) + { + mEnterString.Truncate(mEnterString.Length() - 1); + } + } + else if (ev.Type == UIEvent.Type_KeyDown) + { + if (ch == UIEvent.Key_ESCAPE) + { + Menu parent = mParentMenu; + Close(); + parent.MenuEvent(MKEY_Abort, false); return true; } - int ch = ev.data1; - if ((ev.subtype == InputEventData.GUI_KeyDown || ev.subtype == InputEventData.GUI_KeyRepeat) && ch == 8) + else if (ch == 13) { if (mEnterString.Length() > 0) { - mEnterString.Truncate(mEnterString.Length() - 1); - } - } - else if (ev.subtype == InputEventData.GUI_KeyDown) - { - if (ch == UIEvent.Key_ESCAPE) - { + // [TP] If we allow color codes, colorize the string now. + if (AllowColors) + mEnterString = mEnterString.Filter(); + Menu parent = mParentMenu; + parent.MenuEvent(MKEY_Input, false); Close(); - parent.MenuEvent(MKEY_Abort, false); return true; } - else if (ch == 13) - { - if (mEnterString.Length() > 0) - { - // [TP] If we allow color codes, colorize the string now. - if (AllowColors) - mEnterString = mEnterString.Filter(); - - Menu parent = mParentMenu; - parent.MenuEvent(MKEY_Input, false); - Close(); - return true; - } - } - } - if (ev.subtype == InputEventData.GUI_KeyDown || ev.subtype == InputEventData.GUI_KeyRepeat) - { - return true; } } - return Super.Responder(ev); + if (ev.Type == UIEvent.Type_KeyDown || ev.Type == UIEvent.Type_KeyRepeat) + { + return true; + } + return Super.OnUIEvent(ev); } //============================================================================= diff --git a/wadsrc/static/zscript/menu/videomenu.txt b/wadsrc/static/zscript/menu/videomenu.txt index 1377f528e6..a9e9400958 100644 --- a/wadsrc/static/zscript/menu/videomenu.txt +++ b/wadsrc/static/zscript/menu/videomenu.txt @@ -57,9 +57,9 @@ class VideoModeMenu : OptionMenu return Super.MenuEvent(mkey, fromcontroller); } - override bool Responder(InputEventData ev) + override bool OnUIEvent(UIEvent ev) { - if (ev.type == InputEventData.GUI_Event && ev.subtype == InputEventData.GUI_KeyDown && (ev.data1 == 0x54 || ev.data1 == 0x74)) + if (ev.Type == UIEvent.Type_KeyDown && (ev.KeyChar == 0x54 || ev.KeyChar == 0x74)) { if (SetSelectedSize()) { @@ -67,7 +67,7 @@ class VideoModeMenu : OptionMenu return true; } } - return Super.Responder(ev); + return Super.OnUIEvent(ev); } }