This commit is contained in:
Rachael Alexanderson 2017-03-06 19:40:55 -05:00
commit bd50b5d05a
17 changed files with 388 additions and 541 deletions

View file

@ -2676,7 +2676,7 @@ void Net_DoCommand (int type, BYTE **stream, int player)
int arg[3] = { 0, 0, 0 }; int arg[3] = { 0, 0, 0 };
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
arg[i] = ReadLong(stream); arg[i] = ReadLong(stream);
bool manual = ReadByte(stream); bool manual = !!ReadByte(stream);
E_Console(player, s, arg[0], arg[1], arg[2], manual); E_Console(player, s, arg[0], arg[1], arg[2], manual);
} }
break; break;

View file

@ -473,58 +473,51 @@ IMPLEMENT_POINTER(prev)
IMPLEMENT_POINTERS_END IMPLEMENT_POINTERS_END
IMPLEMENT_CLASS(DEventHandler, false, false); 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, Order);
DEFINE_FIELD_X(StaticEventHandler, DStaticEventHandler, IsUiProcessor); DEFINE_FIELD_X(StaticEventHandler, DStaticEventHandler, IsUiProcessor);
DEFINE_FIELD_X(StaticEventHandler, DStaticEventHandler, RequireMouse); DEFINE_FIELD_X(StaticEventHandler, DStaticEventHandler, RequireMouse);
DEFINE_FIELD_X(RenderEvent, DRenderEvent, ViewPos); DEFINE_FIELD_X(RenderEvent, FRenderEvent, ViewPos);
DEFINE_FIELD_X(RenderEvent, DRenderEvent, ViewAngle); DEFINE_FIELD_X(RenderEvent, FRenderEvent, ViewAngle);
DEFINE_FIELD_X(RenderEvent, DRenderEvent, ViewPitch); DEFINE_FIELD_X(RenderEvent, FRenderEvent, ViewPitch);
DEFINE_FIELD_X(RenderEvent, DRenderEvent, ViewRoll); DEFINE_FIELD_X(RenderEvent, FRenderEvent, ViewRoll);
DEFINE_FIELD_X(RenderEvent, DRenderEvent, FracTic); DEFINE_FIELD_X(RenderEvent, FRenderEvent, FracTic);
DEFINE_FIELD_X(RenderEvent, DRenderEvent, Camera); DEFINE_FIELD_X(RenderEvent, FRenderEvent, Camera);
DEFINE_FIELD_X(WorldEvent, DWorldEvent, IsSaveGame); DEFINE_FIELD_X(WorldEvent, FWorldEvent, IsSaveGame);
DEFINE_FIELD_X(WorldEvent, DWorldEvent, IsReopen); DEFINE_FIELD_X(WorldEvent, FWorldEvent, IsReopen);
DEFINE_FIELD_X(WorldEvent, DWorldEvent, Thing); DEFINE_FIELD_X(WorldEvent, FWorldEvent, Thing);
DEFINE_FIELD_X(WorldEvent, DWorldEvent, Inflictor); DEFINE_FIELD_X(WorldEvent, FWorldEvent, Inflictor);
DEFINE_FIELD_X(WorldEvent, DWorldEvent, Damage); DEFINE_FIELD_X(WorldEvent, FWorldEvent, Damage);
DEFINE_FIELD_X(WorldEvent, DWorldEvent, DamageSource); DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageSource);
DEFINE_FIELD_X(WorldEvent, DWorldEvent, DamageType); DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageType);
DEFINE_FIELD_X(WorldEvent, DWorldEvent, DamageFlags); DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageFlags);
DEFINE_FIELD_X(WorldEvent, DWorldEvent, DamageAngle); DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageAngle);
DEFINE_FIELD_X(PlayerEvent, DPlayerEvent, PlayerNumber); DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, PlayerNumber);
DEFINE_FIELD_X(PlayerEvent, DPlayerEvent, IsReturn); DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, IsReturn);
DEFINE_FIELD_X(UiEvent, DUiEvent, Type); DEFINE_FIELD_X(UiEvent, FUiEvent, Type);
DEFINE_FIELD_X(UiEvent, DUiEvent, KeyString); DEFINE_FIELD_X(UiEvent, FUiEvent, KeyString);
DEFINE_FIELD_X(UiEvent, DUiEvent, KeyChar); DEFINE_FIELD_X(UiEvent, FUiEvent, KeyChar);
DEFINE_FIELD_X(UiEvent, DUiEvent, MouseX); DEFINE_FIELD_X(UiEvent, FUiEvent, MouseX);
DEFINE_FIELD_X(UiEvent, DUiEvent, MouseY); DEFINE_FIELD_X(UiEvent, FUiEvent, MouseY);
DEFINE_FIELD_X(UiEvent, DUiEvent, IsShift); DEFINE_FIELD_X(UiEvent, FUiEvent, IsShift);
DEFINE_FIELD_X(UiEvent, DUiEvent, IsAlt); DEFINE_FIELD_X(UiEvent, FUiEvent, IsAlt);
DEFINE_FIELD_X(UiEvent, DUiEvent, IsCtrl); DEFINE_FIELD_X(UiEvent, FUiEvent, IsCtrl);
DEFINE_FIELD_X(InputEvent, DInputEvent, Type); DEFINE_FIELD_X(InputEvent, FInputEvent, Type);
DEFINE_FIELD_X(InputEvent, DInputEvent, KeyScan); DEFINE_FIELD_X(InputEvent, FInputEvent, KeyScan);
DEFINE_FIELD_X(InputEvent, DInputEvent, KeyString); DEFINE_FIELD_X(InputEvent, FInputEvent, KeyString);
DEFINE_FIELD_X(InputEvent, DInputEvent, KeyChar); DEFINE_FIELD_X(InputEvent, FInputEvent, KeyChar);
DEFINE_FIELD_X(InputEvent, DInputEvent, MouseX); DEFINE_FIELD_X(InputEvent, FInputEvent, MouseX);
DEFINE_FIELD_X(InputEvent, DInputEvent, MouseY); DEFINE_FIELD_X(InputEvent, FInputEvent, MouseY);
DEFINE_FIELD_X(ConsoleEvent, DConsoleEvent, Player) DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Player)
DEFINE_FIELD_X(ConsoleEvent, DConsoleEvent, Name) DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Name)
DEFINE_FIELD_X(ConsoleEvent, DConsoleEvent, Args) DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Args)
DEFINE_FIELD_X(ConsoleEvent, DConsoleEvent, IsManual) DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, IsManual)
DEFINE_ACTION_FUNCTION(DStaticEventHandler, SetOrder) DEFINE_ACTION_FUNCTION(DStaticEventHandler, SetOrder)
{ {
@ -719,19 +712,12 @@ void DStaticEventHandler::OnUnregister()
} }
} }
static DWorldEvent* E_SetupWorldEvent() static FWorldEvent E_SetupWorldEvent()
{ {
static DWorldEvent* e = nullptr; FWorldEvent e;
if (!e) e = (DWorldEvent*)RUNTIME_CLASS(DWorldEvent)->CreateNew(); e.IsSaveGame = savegamerestore;
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->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;
e->Thing = nullptr;
e->Inflictor = nullptr;
e->Damage = 0;
e->DamageAngle = 0.0;
e->DamageFlags = 0;
e->DamageSource = 0;
e->DamageType = NAME_None;
return e; return e;
} }
@ -742,8 +728,8 @@ void DStaticEventHandler::WorldLoaded()
// don't create excessive DObjects if not going to be processed anyway // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldLoaded_VMPtr) if (func == DStaticEventHandler_WorldLoaded_VMPtr)
return; return;
DWorldEvent* e = E_SetupWorldEvent(); FWorldEvent e = E_SetupWorldEvent();
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldUnloaded_VMPtr) if (func == DStaticEventHandler_WorldUnloaded_VMPtr)
return; return;
DWorldEvent* e = E_SetupWorldEvent(); FWorldEvent e = E_SetupWorldEvent();
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldThingSpawned_VMPtr) if (func == DStaticEventHandler_WorldThingSpawned_VMPtr)
return; return;
DWorldEvent* e = E_SetupWorldEvent(); FWorldEvent e = E_SetupWorldEvent();
e->Thing = actor; e.Thing = actor;
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldThingDied_VMPtr) if (func == DStaticEventHandler_WorldThingDied_VMPtr)
return; return;
DWorldEvent* e = E_SetupWorldEvent(); FWorldEvent e = E_SetupWorldEvent();
e->Thing = actor; e.Thing = actor;
e->Inflictor = inflictor; e.Inflictor = inflictor;
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldThingRevived_VMPtr) if (func == DStaticEventHandler_WorldThingRevived_VMPtr)
return; return;
DWorldEvent* e = E_SetupWorldEvent(); FWorldEvent e = E_SetupWorldEvent();
e->Thing = actor; e.Thing = actor;
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldThingDamaged_VMPtr) if (func == DStaticEventHandler_WorldThingDamaged_VMPtr)
return; return;
DWorldEvent* e = E_SetupWorldEvent(); FWorldEvent e = E_SetupWorldEvent();
e->Thing = actor; e.Thing = actor;
e->Damage = damage; e.Damage = damage;
e->DamageSource = source; e.DamageSource = source;
e->DamageType = mod; e.DamageType = mod;
e->DamageFlags = flags; e.DamageFlags = flags;
e->DamageAngle = angle; e.DamageAngle = angle;
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldThingDestroyed_VMPtr) if (func == DStaticEventHandler_WorldThingDestroyed_VMPtr)
return; return;
DWorldEvent* e = E_SetupWorldEvent(); FWorldEvent e = E_SetupWorldEvent();
e->Thing = actor; e.Thing = actor;
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldLightning_VMPtr) if (func == DStaticEventHandler_WorldLightning_VMPtr)
return; return;
DWorldEvent* e = E_SetupWorldEvent(); FWorldEvent e = E_SetupWorldEvent();
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_WorldTick_VMPtr) if (func == DStaticEventHandler_WorldTick_VMPtr)
return; return;
DWorldEvent* e = E_SetupWorldEvent(); FWorldEvent e = E_SetupWorldEvent();
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr);
} }
} }
static DRenderEvent* E_SetupRenderEvent() static FRenderEvent E_SetupRenderEvent()
{ {
static DRenderEvent* e = nullptr; FRenderEvent e;
if (!e) e = (DRenderEvent*)RUNTIME_CLASS(DRenderEvent)->CreateNew(); e.ViewPos = ::ViewPos;
e->ViewPos = ::ViewPos; e.ViewAngle = ::ViewAngle;
e->ViewAngle = ::ViewAngle; e.ViewPitch = ::ViewPitch;
e->ViewPitch = ::ViewPitch; e.ViewRoll = ::ViewRoll;
e->ViewRoll = ::ViewRoll; e.FracTic = ::r_TicFracF;
e->FracTic = ::r_TicFracF; e.Camera = ::camera;
e->Camera = ::camera;
return e; return e;
} }
@ -883,8 +868,8 @@ void DStaticEventHandler::RenderFrame()
// don't create excessive DObjects if not going to be processed anyway // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_RenderFrame_VMPtr) if (func == DStaticEventHandler_RenderFrame_VMPtr)
return; return;
DRenderEvent* e = E_SetupRenderEvent(); FRenderEvent e = E_SetupRenderEvent();
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_RenderOverlay_VMPtr) if (func == DStaticEventHandler_RenderOverlay_VMPtr)
return; return;
DRenderEvent* e = E_SetupRenderEvent(); FRenderEvent e = E_SetupRenderEvent();
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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) void DStaticEventHandler::PlayerEntered(int num, bool fromhub)
{ {
IFVIRTUAL(DStaticEventHandler, PlayerEntered) 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_PlayerEntered_VMPtr) if (func == DStaticEventHandler_PlayerEntered_VMPtr)
return; return;
DPlayerEvent* e = E_SetupPlayerEvent(); FPlayerEvent e = { num, fromhub };
e->IsReturn = fromhub; VMValue params[2] = { (DStaticEventHandler*)this, &e };
e->PlayerNumber = num;
VMValue params[2] = { (DStaticEventHandler*)this, e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_PlayerRespawned_VMPtr) if (func == DStaticEventHandler_PlayerRespawned_VMPtr)
return; return;
DPlayerEvent* e = E_SetupPlayerEvent(); FPlayerEvent e = { num, false };
e->PlayerNumber = num; VMValue params[2] = { (DStaticEventHandler*)this, &e };
VMValue params[2] = { (DStaticEventHandler*)this, e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_PlayerDied_VMPtr) if (func == DStaticEventHandler_PlayerDied_VMPtr)
return; return;
DPlayerEvent* e = E_SetupPlayerEvent(); FPlayerEvent e = { num, false };
e->PlayerNumber = num; VMValue params[2] = { (DStaticEventHandler*)this, &e };
VMValue params[2] = { (DStaticEventHandler*)this, e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_PlayerDisconnected_VMPtr) if (func == DStaticEventHandler_PlayerDisconnected_VMPtr)
return; return;
DPlayerEvent* e = E_SetupPlayerEvent(); FPlayerEvent e = { num, false };
e->PlayerNumber = num; VMValue params[2] = { (DStaticEventHandler*)this, &e };
VMValue params[2] = { (DStaticEventHandler*)this, e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr);
} }
} }
static DUiEvent* E_SetupUiEvent() FUiEvent::FUiEvent(event_t *ev)
{ {
static DUiEvent* e = nullptr; Type = (EGUIEvent)ev->subtype;
if (!e) e = (DUiEvent*)RUNTIME_CLASS(DUiEvent)->CreateNew(); KeyChar = 0;
e->Type = EV_GUI_None; IsShift = false;
e->IsShift = false; IsAlt = false;
e->IsAlt = false; IsCtrl = false;
e->IsCtrl = false; MouseX = 0;
e->MouseX = e->MouseY = 0; MouseY = 0;
e->KeyChar = 0; // we don't want the modders to remember what weird fields mean what for what events.
e->KeyString = ""; switch (ev->subtype)
return e; {
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) 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_UiProcess_VMPtr) if (func == DStaticEventHandler_UiProcess_VMPtr)
return false; return false;
DUiEvent* e = E_SetupUiEvent(); FUiEvent e = ev;
//
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;
}
int processed; int processed;
VMReturn results[1] = { &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); GlobalVMStack.Call(func, params, 2, results, 1, nullptr);
return !!processed; return !!processed;
} }
@ -1033,16 +998,31 @@ bool DStaticEventHandler::UiProcess(event_t* ev)
return false; return false;
} }
static DInputEvent* E_SetupInputEvent() FInputEvent::FInputEvent(event_t *ev)
{ {
static DInputEvent* e = nullptr; Type = (EGenericEvent)ev->type;
if (!e) e = (DInputEvent*)RUNTIME_CLASS(DInputEvent)->CreateNew(); // we don't want the modders to remember what weird fields mean what for what events.
e->Type = EV_None; KeyScan = 0;
e->KeyScan = 0; KeyChar = 0;
e->KeyChar = 0; MouseX = 0;
e->KeyString = ""; MouseY = 0;
e->MouseX = e->MouseY = 0; switch (Type)
return e; {
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) 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_InputProcess_VMPtr) if (func == DStaticEventHandler_InputProcess_VMPtr)
return false; 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; int processed;
VMReturn results[1] = { &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); GlobalVMStack.Call(func, params, 2, results, 1, nullptr);
return !!processed; return !!processed;
} }
@ -1085,18 +1046,6 @@ bool DStaticEventHandler::InputProcess(event_t* ev)
return false; 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) void DStaticEventHandler::ConsoleProcess(int player, FString name, int arg1, int arg2, int arg3, bool manual)
{ {
if (player < 0) 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_ConsoleProcess_VMPtr) if (func == DStaticEventHandler_ConsoleProcess_VMPtr)
return; return;
DConsoleEvent* e = E_SetupConsoleEvent(); FConsoleEvent e;
// //
e->Player = player; e.Player = player;
e->Name = name; e.Name = name;
e->Args[0] = arg1; e.Args[0] = arg1;
e->Args[1] = arg2; e.Args[1] = arg2;
e->Args[2] = arg3; e.Args[2] = arg3;
e->IsManual = manual; e.IsManual = manual;
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); 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 // don't create excessive DObjects if not going to be processed anyway
if (func == DStaticEventHandler_NetworkProcess_VMPtr) if (func == DStaticEventHandler_NetworkProcess_VMPtr)
return; return;
DConsoleEvent* e = E_SetupConsoleEvent(); FConsoleEvent e;
// //
e->Player = player; e.Player = player;
e->Name = name; e.Name = name;
e->Args[0] = arg1; e.Args[0] = arg1;
e->Args[1] = arg2; e.Args[1] = arg2;
e->Args[2] = arg3; e.Args[2] = arg3;
e->IsManual = manual; e.IsManual = manual;
VMValue params[2] = { (DStaticEventHandler*)this, e }; VMValue params[2] = { (DStaticEventHandler*)this, &e };
GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr);
} }
} }

View file

@ -163,76 +163,34 @@ public:
extern DStaticEventHandler* E_FirstEventHandler; extern DStaticEventHandler* E_FirstEventHandler;
extern DStaticEventHandler* E_LastEventHandler; extern DStaticEventHandler* E_LastEventHandler;
// we cannot call this DEvent because in ZScript, 'event' is a keyword struct FRenderEvent
class DBaseEvent : public DObject
{ {
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 // these are for all render events
DVector3 ViewPos; DVector3 ViewPos;
DAngle ViewAngle; DAngle ViewAngle;
DAngle ViewPitch; DAngle ViewPitch;
DAngle ViewRoll; DAngle ViewRoll;
double FracTic; // 0..1 value that describes where we are inside the current gametic, render-wise. double FracTic = 0; // 0..1 value that describes where we are inside the current gametic, render-wise.
AActor* Camera; AActor* Camera = nullptr;
DRenderEvent()
{
FracTic = 0;
Camera = nullptr;
}
}; };
class DWorldEvent : public DBaseEvent struct FWorldEvent
{ {
DECLARE_CLASS(DWorldEvent, DBaseEvent)
public:
// for loaded/unloaded // for loaded/unloaded
bool IsSaveGame; bool IsSaveGame = false;
bool IsReopen; bool IsReopen = false;
// for thingspawned, thingdied, thingdestroyed // for thingspawned, thingdied, thingdestroyed
AActor* Thing; AActor* Thing = nullptr; // for thingdied
// for thingdied AActor* Inflictor = nullptr; // can be null - for damagemobj
AActor* Inflictor; // can be null AActor* DamageSource = nullptr; // can be null
// for damagemobj int Damage = 0;
int Damage;
AActor* DamageSource; // can be null
FName DamageType; FName DamageType;
int DamageFlags; int DamageFlags = 0;
DAngle DamageAngle; 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 // we currently have only one member: player index
// in ZScript, we have global players[] array from which we can // in ZScript, we have global players[] array from which we can
// get both the player itself and player's body, // get both the player itself and player's body,
@ -240,18 +198,10 @@ public:
int PlayerNumber; int PlayerNumber;
// we set this to true if level was reopened (RETURN scripts) // we set this to true if level was reopened (RETURN scripts)
bool IsReturn; 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. // this essentially translates event_t UI events to ZScript.
EGUIEvent Type; EGUIEvent Type;
// for keys/chars/whatever // for keys/chars/whatever
@ -265,18 +215,13 @@ public:
bool IsCtrl; bool IsCtrl;
bool IsAlt; bool IsAlt;
DUiEvent() FUiEvent(event_t *ev);
{
Type = EV_GUI_None;
}
}; };
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!) // 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 // for keys
int KeyScan; int KeyScan;
FString KeyString; FString KeyString;
@ -285,16 +230,11 @@ public:
int MouseX; int MouseX;
int MouseY; int MouseY;
DInputEvent() FInputEvent(event_t *ev);
{
Type = EV_None;
}
}; };
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) // player that activated this event. note that it's always -1 for non-playsim events (i.e. these not called with netevent)
int Player; int Player;
// //
@ -302,12 +242,6 @@ public:
int Args[3]; int Args[3];
// //
bool IsManual; bool IsManual;
DConsoleEvent()
{
Player = -1;
IsManual = false;
}
}; };
#endif #endif

View file

@ -56,6 +56,7 @@
#include "menu/menu.h" #include "menu/menu.h"
#include "textures/textures.h" #include "textures/textures.h"
#include "virtual.h" #include "virtual.h"
#include "events.h"
// //
// Todo: Move these elsewhere // Todo: Move these elsewhere
@ -173,15 +174,31 @@ DMenu::DMenu(DMenu *parent)
bool DMenu::CallResponder(event_t *ev) bool DMenu::CallResponder(event_t *ev)
{ {
IFVIRTUAL(DMenu, Responder) if (ev->type == EV_GUI_Event)
{ {
VMValue params[] = { (DObject*)this, ev}; IFVIRTUAL(DMenu, OnUIEvent)
{
FUiEvent e = ev;
VMValue params[] = { (DObject*)this, &e };
int retval; int retval;
VMReturn ret(&retval); VMReturn ret(&retval);
GlobalVMStack.Call(func, params, 2, &ret, 1, nullptr); GlobalVMStack.Call(func, params, 2, &ret, 1, nullptr);
return !!retval; 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;
} }
//============================================================================= //=============================================================================

View file

@ -6063,10 +6063,9 @@ FxExpression *FxIdentifier::ResolveMember(FCompileContext &ctx, PStruct *classct
object = nullptr; object = nullptr;
return 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 - 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: // 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()); ScriptPosition.Message(MSG_ERROR, "%s not accessible to %s", Function->SymbolName.GetChars(), VersionString.GetChars());
return false; 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); 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);
} }

View file

@ -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 struct TexMan
{ {
enum EUseTypes enum EUseTypes

View file

@ -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 Vector3 ViewPos;
native readonly double ViewAngle; native readonly double ViewAngle;
@ -10,7 +9,7 @@ class RenderEvent : BaseEvent native ui version("2.4")
native readonly Actor Camera; native readonly Actor Camera;
} }
class WorldEvent : BaseEvent native play version("2.4") struct WorldEvent native play version("2.4")
{ {
// for loaded/unloaded // for loaded/unloaded
native readonly bool IsSaveGame; native readonly bool IsSaveGame;
@ -28,7 +27,7 @@ class WorldEvent : BaseEvent native play version("2.4")
native readonly double DamageAngle; 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. // this is the player number that caused the event.
// note: you can get player struct from this by using players[e.PlayerNumber] // 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; native readonly bool IsReturn;
} }
class UiEvent : BaseEvent native ui version("2.4") struct UiEvent native ui version("2.4")
{ {
// d_gui.h // d_gui.h
enum EGUIEvent enum EGUIEvent
@ -121,7 +120,7 @@ class UiEvent : BaseEvent native ui version("2.4")
native readonly bool IsAlt; native readonly bool IsAlt;
} }
class InputEvent : BaseEvent native play version("2.4") struct InputEvent native play version("2.4")
{ {
enum EGenericEvent enum EGenericEvent
{ {
@ -270,7 +269,7 @@ class InputEvent : BaseEvent native play version("2.4")
native readonly int MouseY; 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 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]. // for UI events, this is always -1, and you need to check if level is loaded and use players[consoleplayer].

View file

@ -335,18 +335,18 @@ class ConversationMenu : Menu
// //
//============================================================================= //=============================================================================
override bool Responder(InputEventData ev) override bool OnUIEvent(UIEvent ev)
{ {
if (demoplayback) if (demoplayback)
{ // No interaction during demo playback { // No interaction during demo playback
return false; 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) { // 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 MenuEvent(MKEY_Enter, false);
} }
return Super.Responder(ev); return Super.OnUIEvent(ev);
} }
//============================================================================ //============================================================================

View file

@ -99,14 +99,12 @@ 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 // tolower
int ch = ev.data1; int ch = ev.KeyChar;
ch = ch >= 65 && ch <91? ch + 32 : ch; 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++)
@ -128,8 +126,7 @@ class ListMenu : Menu
} }
} }
} }
} return Super.OnUIEvent(ev);
return Super.Responder(ev);
} }
//============================================================================= //=============================================================================

View file

@ -383,15 +383,13 @@ 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.data1) switch (ev.KeyChar)
{ {
case UIEvent.Key_F1: case UIEvent.Key_F1:
manager.SetFileInfo(Selected); manager.SetFileInfo(Selected);
@ -407,18 +405,17 @@ class LoadSaveMenu : ListMenu
} }
} }
} }
else if (ev.subtype == InputEventData.GUI_WheelUp) else if (ev.Type == UIEvent.Type_WheelUp)
{ {
if (TopItem > 0) TopItem--; if (TopItem > 0) TopItem--;
return true; return true;
} }
else if (ev.subtype == InputEventData.GUI_WheelDown) else if (ev.Type == UIEvent.Type_WheelDown)
{ {
if (TopItem < manager.SavegameCount() - listboxRows) TopItem++; if (TopItem < manager.SavegameCount() - listboxRows) TopItem++;
return true; return true;
} }
} return Super.OnUIEvent(ev);
return Super.Responder(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) if (Selected != -1)
{ {
switch (ev.data1) switch (ev.KeyChar)
{ {
case UIEvent.Key_DEL: case UIEvent.Key_DEL:
// cannot delete 'new save game' item // cannot delete 'new save game' item
@ -523,9 +520,14 @@ class SaveMenu : LoadSaveMenu
} }
} }
} }
return Super.Responder(ev); return Super.OnUIEvent(ev);
} }
//=============================================================================
//
//
//
//=============================================================================
override void Ticker() override void Ticker()
{ {

View file

@ -169,44 +169,47 @@ class Menu : Object native ui version("2.4")
// //
//============================================================================= //=============================================================================
virtual bool Responder(InputEventData ev) virtual bool OnUIEvent(UIEvent ev)
{ {
bool res = false; 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);
{
res = MouseEventBack(MOUSE_Click, ev.data1, ev.data2);
// make the menu's mouse handler believe that the current coordinate is outside the valid range // make the menu's mouse handler believe that the current coordinate is outside the valid range
if (res) ev.data2 = -1; if (res) y = -1;
res |= MouseEvent(MOUSE_Click, ev.data1, ev.data2); res |= MouseEvent(MOUSE_Click, ev.MouseX, y);
if (res) if (res)
{ {
SetCapture(true); SetCapture(true);
} }
} }
else if (ev.subtype == InputEventData.GUI_MouseMove) else if (ev.type == UIEvent.Type_MouseMove)
{ {
BackbuttonTime = 4*Thinker.TICRATE; BackbuttonTime = 4*Thinker.TICRATE;
if (mMouseCapture || m_use_mouse == 1) if (mMouseCapture || m_use_mouse == 1)
{ {
res = MouseEventBack(MOUSE_Move, ev.data1, ev.data2); res = MouseEventBack(MOUSE_Move, ev.MouseX, y);
if (res) ev.data2 = -1; if (res) y = -1;
res |= MouseEvent(MOUSE_Move, ev.data1, ev.data2); 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); SetCapture(false);
res = MouseEventBack(MOUSE_Release, ev.data1, ev.data2); res = MouseEventBack(MOUSE_Release, ev.MouseX, y);
if (res) ev.data2 = -1; if (res) y = -1;
res |= MouseEvent(MOUSE_Release, ev.data1, ev.data2); res |= MouseEvent(MOUSE_Release, ev.MouseX, y);
} }
} }
return false;
} }
virtual bool OnInputEvent(InputEvent ev)
{
return false; return false;
} }

View file

@ -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) if (mMessageMode == 0)
{ {
// tolower // tolower
int ch = ev.data1; int ch = ev.KeyChar;
ch = ch >= 65 && ch <91? ch + 32 : ch; ch = ch >= 65 && ch <91? ch + 32 : ch;
if (ch == 110 /*'n'*/ || ch == 32) if (ch == 110 /*'n'*/ || ch == 32)
@ -199,12 +199,17 @@ class MessageBoxMenu : Menu
} }
return false; return false;
} }
else if (ev.type == InputEventData.KeyDown) return Super.OnUIEvent(ev);
}
override bool OnInputEvent(InputEvent ev)
{
if (ev.type == InputEvent.Type_KeyDown)
{ {
Close(); Close();
return true; return true;
} }
return Super.Responder(ev); return Super.OnInputEvent(ev);
} }
//============================================================================= //=============================================================================

View file

@ -155,17 +155,15 @@ 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); int scrollamt = MIN(2, mDesc.mScrollPos);
mDesc.mScrollPos -= scrollamt; mDesc.mScrollPos -= scrollamt;
return true; return true;
} }
else if (ev.subtype == InputEventData.GUI_WheelDown) else if (ev.type == UIEvent.Type_WheelDown)
{ {
if (CanScrollDown) if (CanScrollDown)
{ {
@ -182,8 +180,7 @@ class OptionMenu : Menu
} }
return true; return true;
} }
} return Super.OnUIEvent(ev);
return Super.Responder(ev);
} }
//============================================================================= //=============================================================================

View file

@ -396,16 +396,16 @@ class EnterKey : Menu
} }
} }
override bool Responder(InputEventData ev) override bool OnInputEvent(InputEvent ev)
{ {
// This checks raw keys, not GUI keys. // This menu checks raw keys, not GUI keys because it needs the raw codes for binding.
if (ev.type == InputEventData.KeyDown) if (ev.type == InputEvent.Type_KeyDown)
{ {
mOwner.SendKey(ev.data1); mOwner.SendKey(ev.KeyScan);
menuactive = Menu.On; menuactive = Menu.On;
SetMenuMessage(0); SetMenuMessage(0);
Close(); 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 true;
} }
return false; return false;

View file

@ -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 // turn the player sprite around
mRotation = 8 - mRotation; mRotation = 8 - mRotation;
@ -385,7 +385,7 @@ class PlayerMenu : ListMenu
} }
return true; return true;
} }
return Super.Responder(ev); return Super.OnUIEvent(ev);
} }
//============================================================================= //=============================================================================

View file

@ -108,30 +108,28 @@ 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 // Save game and player name string input
if (ev.subtype == InputEventData.GUI_Char) if (ev.Type == UIEvent.Type_Char)
{ {
mInputGridOkay = false; mInputGridOkay = false;
if (mEnterString.Length() < mEnterSize && if (mEnterString.Length() < mEnterSize &&
(mSizeMode == 2/*entering player name*/ || SmallFont.StringWidth(mEnterString) < (mEnterSize-1)*8)) (mSizeMode == 2/*entering player name*/ || SmallFont.StringWidth(mEnterString) < (mEnterSize-1)*8))
{ {
mEnterString.AppendFormat("%c", ev.data1); mEnterString.AppendFormat("%c", ev.KeyChar);
} }
return true; return true;
} }
int ch = ev.data1; int ch = ev.KeyChar;
if ((ev.subtype == InputEventData.GUI_KeyDown || ev.subtype == InputEventData.GUI_KeyRepeat) && ch == 8) if ((ev.Type == UIEvent.Type_KeyDown || ev.Type == UIEvent.Type_KeyRepeat) && ch == 8)
{ {
if (mEnterString.Length() > 0) if (mEnterString.Length() > 0)
{ {
mEnterString.Truncate(mEnterString.Length() - 1); mEnterString.Truncate(mEnterString.Length() - 1);
} }
} }
else if (ev.subtype == InputEventData.GUI_KeyDown) else if (ev.Type == UIEvent.Type_KeyDown)
{ {
if (ch == UIEvent.Key_ESCAPE) if (ch == UIEvent.Key_ESCAPE)
{ {
@ -155,12 +153,11 @@ class TextEnterMenu : Menu
} }
} }
} }
if (ev.subtype == InputEventData.GUI_KeyDown || ev.subtype == InputEventData.GUI_KeyRepeat) if (ev.Type == UIEvent.Type_KeyDown || ev.Type == UIEvent.Type_KeyRepeat)
{ {
return true; return true;
} }
} return Super.OnUIEvent(ev);
return Super.Responder(ev);
} }
//============================================================================= //=============================================================================

View file

@ -57,9 +57,9 @@ class VideoModeMenu : OptionMenu
return Super.MenuEvent(mkey, fromcontroller); 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()) if (SetSelectedSize())
{ {
@ -67,7 +67,7 @@ class VideoModeMenu : OptionMenu
return true; return true;
} }
} }
return Super.Responder(ev); return Super.OnUIEvent(ev);
} }
} }