mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-10 23:02:08 +00:00
This commit is contained in:
commit
bd50b5d05a
17 changed files with 388 additions and 541 deletions
|
@ -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;
|
||||
|
|
391
src/events.cpp
391
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);
|
||||
}
|
||||
}
|
||||
|
|
102
src/events.h
102
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
|
|
@ -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;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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].
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
//
|
||||
//
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue