From 8aa09768f045f258aaabba38d806d141e2787037 Mon Sep 17 00:00:00 2001 From: Braden Obrzut Date: Tue, 20 Sep 2016 21:23:37 -0400 Subject: [PATCH 01/11] - Fixed: Memory(Array)Reader's seek range didn't include the end of file. Since GetLength exists this is inconsequential for ZDoom, but still incorrect. --- src/files.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/files.cpp b/src/files.cpp index 0b7203236..93a8c9729 100644 --- a/src/files.cpp +++ b/src/files.cpp @@ -527,7 +527,7 @@ long MemoryReader::Seek (long offset, int origin) break; } - FilePos=clamp(offset,0,Length-1); + FilePos=clamp(offset,0,Length); return 0; } @@ -583,7 +583,7 @@ long MemoryArrayReader::Seek (long offset, int origin) break; } - FilePos=clamp(offset,0,Length-1); + FilePos=clamp(offset,0,Length); return 0; } From b5b9baaa87a621e8236e8645890e3ba3651768b8 Mon Sep 17 00:00:00 2001 From: Leonard2 Date: Wed, 14 Sep 2016 13:56:58 +0200 Subject: [PATCH 02/11] The VM now aborts when a wrong self pointer is used with user variables to avoid random crashes --- src/thingdef/thingdef_expression.cpp | 13 +++++++++++++ src/zscript/vm.h | 1 + src/zscript/vmdisasm.cpp | 13 ++++++++++++- src/zscript/vmexec.h | 6 +++++- src/zscript/vmframe.cpp | 4 ++++ src/zscript/vmops.h | 3 ++- 6 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/thingdef/thingdef_expression.cpp b/src/thingdef/thingdef_expression.cpp index ce603f261..695b12799 100644 --- a/src/thingdef/thingdef_expression.cpp +++ b/src/thingdef/thingdef_expression.cpp @@ -3373,6 +3373,19 @@ FxExpression *FxClassMember::Resolve(FCompileContext &ctx) ExpEmit FxClassMember::Emit(VMFunctionBuilder *build) { + if (~membervar->Flags & VARF_Native) + { // Check if this is a user-defined variable. + // As of right now, FxClassMember is only ever used with FxSelf. + // This very user variable was defined in stateowner so if + // self (a0) != stateowner (a1) then the offset is most likely + // going to end up being totally wrong even if the variable was + // redefined in self which means we have to abort to avoid reading + // or writing to a random address and possibly crash. + build->Emit(OP_EQA_R, 1, 0, 1); + build->Emit(OP_JMP, 1); + build->Emit(OP_THROW, 2, X_BAD_SELF); + } + ExpEmit obj = classx->Emit(build); assert(obj.RegType == REGT_POINTER); diff --git a/src/zscript/vm.h b/src/zscript/vm.h index 0d45ad90a..a000e9533 100644 --- a/src/zscript/vm.h +++ b/src/zscript/vm.h @@ -163,6 +163,7 @@ enum EVMAbortException X_TOO_MANY_TRIES, X_ARRAY_OUT_OF_BOUNDS, X_DIVISION_BY_ZERO, + X_BAD_SELF, }; class VMFunction : public DObject diff --git a/src/zscript/vmdisasm.cpp b/src/zscript/vmdisasm.cpp index 35eb6085d..4e6f33ec7 100644 --- a/src/zscript/vmdisasm.cpp +++ b/src/zscript/vmdisasm.cpp @@ -371,7 +371,18 @@ void VMDisasm(FILE *out, const VMOP *code, int codesize, const VMScriptFunction col = print_reg(out, 0, a, (mode & MODE_ATYPE) >> MODE_ASHIFT, 24, func); if ((mode & MODE_BCTYPE) == MODE_BCTHROW) { - mode = (code[i].a == 0) ? (MODE_BP | MODE_CUNUSED) : (MODE_BKP | MODE_CUNUSED); + if (code[i].a == 0) + { + mode = (MODE_BP | MODE_CUNUSED); + } + else if (code[i].a == 1) + { + mode = (MODE_BKP | MODE_CUNUSED); + } + else + { + mode = (MODE_BCJOINT | MODE_BCIMMS); + } } else if ((mode & MODE_BCTYPE) == MODE_BCCATCH) { diff --git a/src/zscript/vmexec.h b/src/zscript/vmexec.h index 42a374030..adf2986c5 100644 --- a/src/zscript/vmexec.h +++ b/src/zscript/vmexec.h @@ -616,12 +616,16 @@ begin: ASSERTA(B); throw((VMException *)reg.a[B]); } - else + else if (a == 1) { ASSERTKA(B); assert(konstatag[B] == ATAG_OBJECT); throw((VMException *)konsta[B].o); } + else + { + THROW(BC); + } NEXTOP; OP(CATCH): // This instruction is handled by our own catch handler and should diff --git a/src/zscript/vmframe.cpp b/src/zscript/vmframe.cpp index 29da0c5b9..50c7d78d9 100644 --- a/src/zscript/vmframe.cpp +++ b/src/zscript/vmframe.cpp @@ -440,6 +440,10 @@ int VMFrameStack::Call(VMFunction *func, VMValue *params, int numparams, VMRetur case X_DIVISION_BY_ZERO: Printf("division by zero."); break; + + case X_BAD_SELF: + Printf("invalid self pointer."); + break; } Printf("\n"); diff --git a/src/zscript/vmops.h b/src/zscript/vmops.h index decb0b93d..39d224f5c 100644 --- a/src/zscript/vmops.h +++ b/src/zscript/vmops.h @@ -83,7 +83,8 @@ xx(RETI, reti, I8I16), // Copy immediate from BC to return value A, possibly re xx(TRY, try, I24), // When an exception is thrown, start searching for a handler at pc + ABC xx(UNTRY, untry, I8), // Pop A entries off the exception stack xx(THROW, throw, THROW), // A == 0: Throw exception object pB - // A != 0: Throw exception object pkB + // A == 1: Throw exception object pkB + // A >= 2: Throw VM exception of type BC xx(CATCH, catch, CATCH), // A == 0: continue search on next try // A == 1: continue execution at instruction immediately following CATCH (catches any exception) // A == 2: (pB == ) then pc++ ; next instruction must JMP to another CATCH From 780d672b255022562f4ac12b94c5aac720c8f6a9 Mon Sep 17 00:00:00 2001 From: raa-eruanna Date: Fri, 16 Sep 2016 03:01:52 -0400 Subject: [PATCH 03/11] Adds user-definable weapon bob speed --- src/d_netinfo.cpp | 2 ++ src/d_player.h | 4 ++++ src/namedef.h | 1 + src/p_pspr.cpp | 6 +++++- wadsrc/static/language.enu | 1 + wadsrc/static/menudef.txt | 1 + 6 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/d_netinfo.cpp b/src/d_netinfo.cpp index 0b99fd73d..3504c5874 100644 --- a/src/d_netinfo.cpp +++ b/src/d_netinfo.cpp @@ -70,6 +70,7 @@ CVAR (String, gender, "male", CVAR_USERINFO | CVAR_ARCHIVE); CVAR (Bool, neverswitchonpickup, false, CVAR_USERINFO | CVAR_ARCHIVE); CVAR (Float, movebob, 0.25f, CVAR_USERINFO | CVAR_ARCHIVE); CVAR (Float, stillbob, 0.f, CVAR_USERINFO | CVAR_ARCHIVE); +CVAR (Float, wbobspeed, 1.f, CVAR_USERINFO | CVAR_ARCHIVE); CVAR (String, playerclass, "Fighter", CVAR_USERINFO | CVAR_ARCHIVE); enum @@ -83,6 +84,7 @@ enum INFO_NeverSwitchOnPickup, INFO_MoveBob, INFO_StillBob, + INFO_WBobSpeed, INFO_PlayerClass, INFO_ColorSet, }; diff --git a/src/d_player.h b/src/d_player.h index e932223aa..6f68aa6f7 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -337,6 +337,10 @@ struct userinfo_t : TMap { return *static_cast(*CheckKey(NAME_StillBob)); } + double GetWBobSpeed() const + { + return *static_cast(*CheckKey(NAME_WBobSpeed)); + } int GetPlayerClassNum() const { return *static_cast(*CheckKey(NAME_PlayerClass)); diff --git a/src/namedef.h b/src/namedef.h index e5b6c452a..f1279d27c 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -644,6 +644,7 @@ xx(ColorSet) xx(NeverSwitchOnPickup) xx(MoveBob) xx(StillBob) +xx(WBobSpeed) xx(PlayerClass) xx(Wi_NoAutostartMap) diff --git a/src/p_pspr.cpp b/src/p_pspr.cpp index 9f1233609..4274d81a8 100644 --- a/src/p_pspr.cpp +++ b/src/p_pspr.cpp @@ -524,9 +524,13 @@ void P_DropWeapon (player_t *player) // A_WeaponReady every tic, and it looks bad if they don't bob smoothly. // // [XA] Added new bob styles and exposed bob properties. Thanks, Ryan Cordell! +// [SP] Added new user option for bob speed // //============================================================================ +// [SP] Changes how quickly the weapon bobs +EXTERN_CVAR(Float, wbobspeed) + void P_BobWeapon (player_t *player, float *x, float *y, double ticfrac) { static float curbob; @@ -552,7 +556,7 @@ void P_BobWeapon (player_t *player, float *x, float *y, double ticfrac) for (int i = 0; i < 2; i++) { // Bob the weapon based on movement speed. - FAngle angle = (BobSpeed * 35 / TICRATE*(level.time - 1 + i)) * (360.f / 8192.f); + FAngle angle = (BobSpeed * wbobspeed * 35 / TICRATE*(level.time - 1 + i)) * (360.f / 8192.f); // [RH] Smooth transitions between bobbing and not-bobbing frames. // This also fixes the bug where you can "stick" a weapon off-center by diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index e91c9dd43..4839e1146 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1802,6 +1802,7 @@ DSPLYMNU_MENUDIM = "Menu dim"; DSPLYMNU_DIMCOLOR = "Dim color"; DSPLYMNU_MOVEBOB = "View bob amount while moving"; DSPLYMNU_STILLBOB = "View bob amount while not moving"; +DSPLYMNU_BOBSPEED = "Weapon bob speed"; // HUD Options HUDMNU_TITLE = "HUD Options"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index a605b5cc4..0bcbd3af7 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -690,6 +690,7 @@ OptionMenu "VideoOptions" ColorPicker "$DSPLYMNU_DIMCOLOR", "dimcolor" Slider "$DSPLYMNU_MOVEBOB", "movebob", 0, 1.0, 0.05, 2 Slider "$DSPLYMNU_STILLBOB", "stillbob", 0, 1.0, 0.05, 2 + Slider "$DSPLYMNU_BOBSPEED", "wbobspeed", 0, 2.0, 0.1, 2 } //------------------------------------------------------------------------------------------- From bc0624e3b2c8c8993a120e1d17d82dd117742fce Mon Sep 17 00:00:00 2001 From: raa-eruanna Date: Fri, 16 Sep 2016 03:48:09 -0400 Subject: [PATCH 04/11] Fixed my error where I was using a local session variable rather than the proper user info for the weapon bob speed. --- src/d_player.h | 2 +- src/p_pspr.cpp | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 6f68aa6f7..5206fd770 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -337,7 +337,7 @@ struct userinfo_t : TMap { return *static_cast(*CheckKey(NAME_StillBob)); } - double GetWBobSpeed() const + float GetWBobSpeed() const { return *static_cast(*CheckKey(NAME_WBobSpeed)); } diff --git a/src/p_pspr.cpp b/src/p_pspr.cpp index 4274d81a8..099a39f02 100644 --- a/src/p_pspr.cpp +++ b/src/p_pspr.cpp @@ -528,9 +528,6 @@ void P_DropWeapon (player_t *player) // //============================================================================ -// [SP] Changes how quickly the weapon bobs -EXTERN_CVAR(Float, wbobspeed) - void P_BobWeapon (player_t *player, float *x, float *y, double ticfrac) { static float curbob; @@ -555,8 +552,9 @@ void P_BobWeapon (player_t *player, float *x, float *y, double ticfrac) for (int i = 0; i < 2; i++) { - // Bob the weapon based on movement speed. - FAngle angle = (BobSpeed * wbobspeed * 35 / TICRATE*(level.time - 1 + i)) * (360.f / 8192.f); + // Bob the weapon based on movement speed. ([SP] And user's bob speed setting) + FAngle angle = (BobSpeed * player->userinfo.GetWBobSpeed() * 35 / + TICRATE*(level.time - 1 + i)) * (360.f / 8192.f); // [RH] Smooth transitions between bobbing and not-bobbing frames. // This also fixes the bug where you can "stick" a weapon off-center by From 4f7e1f01717a4c3e1d7092c6e28a8aedb7303641 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 17 Sep 2016 16:53:19 +0300 Subject: [PATCH 05/11] FluisSynth dynamic library is now referenced by system specific name on macOS --- src/sound/music_fluidsynth_mididevice.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sound/music_fluidsynth_mididevice.cpp b/src/sound/music_fluidsynth_mididevice.cpp index b3f7b7d45..9777494fd 100644 --- a/src/sound/music_fluidsynth_mididevice.cpp +++ b/src/sound/music_fluidsynth_mididevice.cpp @@ -59,7 +59,11 @@ #else #include +#ifdef __APPLE__ +#define FLUIDSYNTHLIB "libfluidsynth.1.dylib" +#else // !__APPLE__ #define FLUIDSYNTHLIB "libfluidsynth.so.1" +#endif // __APPLE__ #endif #define FLUID_REVERB_DEFAULT_ROOMSIZE 0.2f From 0a24c1544517a052c00da0c76107d90b008454fe Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 17 Sep 2016 16:54:02 +0300 Subject: [PATCH 06/11] Added ability to customize path to FluidSynth dynamic library Use fluid_lib CVAR to set path or default name of dynamic library will be used instead --- src/sound/music_fluidsynth_mididevice.cpp | 54 ++++++++++++++++++----- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/src/sound/music_fluidsynth_mididevice.cpp b/src/sound/music_fluidsynth_mididevice.cpp index 9777494fd..fd0bab645 100644 --- a/src/sound/music_fluidsynth_mididevice.cpp +++ b/src/sound/music_fluidsynth_mididevice.cpp @@ -96,6 +96,8 @@ // PUBLIC DATA DEFINITIONS ------------------------------------------------- +CVAR(String, fluid_lib, "", CVAR_ARCHIVE|CVAR_GLOBALCONFIG) + CVAR(String, fluid_patchset, "", CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Float, fluid_gain, 0.5, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) @@ -693,22 +695,54 @@ bool FluidSynthMIDIDevice::LoadFluidSynth() const char *libname; #ifdef _WIN32 - FluidSynthDLL = LoadLibrary((libname = FLUIDSYNTHLIB1)); - if (FluidSynthDLL == NULL) + if (strlen(fluid_lib) > 0) { - FluidSynthDLL = LoadLibrary((libname = FLUIDSYNTHLIB2)); - if (FluidSynthDLL == NULL) + FluidSynthDLL = LoadLibrary(libname = fluid_lib); + if (nullptr == FluidSynthDLL) { - Printf(TEXTCOLOR_RED"Could not load " FLUIDSYNTHLIB1 " or " FLUIDSYNTHLIB2 "\n"); - return false; + Printf(TEXTCOLOR_RED "Could not load %s\n", libname); + } + } + else + { + FluidSynthDLL = nullptr; + } + + if (nullptr == FluidSynthDLL) + { + FluidSynthDLL = LoadLibrary(libname = FLUIDSYNTHLIB1); + if (nullptr == FluidSynthDLL) + { + FluidSynthDLL = LoadLibrary(libname = FLUIDSYNTHLIB2); + if (nullptr == FluidSynthDLL) + { + Printf(TEXTCOLOR_RED "Could not load " FLUIDSYNTHLIB1 " or " FLUIDSYNTHLIB2 "\n"); + return false; + } } } #else - FluidSynthSO = dlopen((libname = FLUIDSYNTHLIB), RTLD_LAZY); - if (FluidSynthSO == NULL) + if (strlen(fluid_lib) > 0) { - Printf(TEXTCOLOR_RED"Could not load " FLUIDSYNTHLIB ": %s\n", dlerror()); - return false; + FluidSynthSO = dlopen(libname = fluid_lib, RTLD_LAZY); + if (nullptr == FluidSynthSO) + { + Printf(TEXTCOLOR_RED "Could not load %s: %s\n", libname, dlerror()); + } + } + else + { + FluidSynthSO = nullptr; + } + + if (nullptr == FluidSynthSO) + { + FluidSynthSO = dlopen(libname = FLUIDSYNTHLIB, RTLD_LAZY); + if (nullptr == FluidSynthSO) + { + Printf(TEXTCOLOR_RED "Could not load " FLUIDSYNTHLIB ": %s\n", dlerror()); + return false; + } } #endif From 76c5ff29febf7c866da693559b40f7c4db9fb147 Mon Sep 17 00:00:00 2001 From: raa-eruanna Date: Sun, 18 Sep 2016 02:26:03 -0400 Subject: [PATCH 07/11] If Inventory.MaxAmount > 1 on weapons, allow and track multiple pickups. --- src/g_shared/a_weapons.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/g_shared/a_weapons.cpp b/src/g_shared/a_weapons.cpp index 575914fe8..6143f5206 100644 --- a/src/g_shared/a_weapons.cpp +++ b/src/g_shared/a_weapons.cpp @@ -222,6 +222,10 @@ bool AWeapon::HandlePickup (AInventory *item) { item->ItemFlags |= IF_PICKUPGOOD; } + if (MaxAmount > 1) //[SP] If amount Date: Mon, 19 Sep 2016 10:49:38 -0500 Subject: [PATCH 08/11] Removed the positive-only ripper level requirement. - Several mods were able to just take advantage of A_SetRipperLevel and the likes, essentially bypassing this gate so there really is no point in doing this anymore. --- src/thingdef/thingdef_properties.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/thingdef/thingdef_properties.cpp b/src/thingdef/thingdef_properties.cpp index 52194435b..3cb424ea3 100644 --- a/src/thingdef/thingdef_properties.cpp +++ b/src/thingdef/thingdef_properties.cpp @@ -1576,10 +1576,6 @@ DEFINE_PROPERTY(telefogdesttype, S, Actor) DEFINE_PROPERTY(ripperlevel, I, Actor) { PROP_INT_PARM(id, 0); - if (id < 0) - { - I_Error ("RipperLevel must not be negative"); - } defaults->RipperLevel = id; } @@ -1589,10 +1585,6 @@ DEFINE_PROPERTY(ripperlevel, I, Actor) DEFINE_PROPERTY(riplevelmin, I, Actor) { PROP_INT_PARM(id, 0); - if (id < 0) - { - I_Error ("RipLevelMin must not be negative"); - } defaults->RipLevelMin = id; } @@ -1602,10 +1594,6 @@ DEFINE_PROPERTY(riplevelmin, I, Actor) DEFINE_PROPERTY(riplevelmax, I, Actor) { PROP_INT_PARM(id, 0); - if (id < 0) - { - I_Error ("RipLevelMax must not be negative"); - } defaults->RipLevelMax = id; } From 2d55f713c22c070f0a0d4a0ca41540fab51a4b5a Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Mon, 19 Sep 2016 22:54:41 +0300 Subject: [PATCH 09/11] Fixed support for automatic graphics switching on macOS The corresponding setting in .plist is wrong but Xcode fixes it automatically This doesn't happen however when building via makefiles --- src/posix/osx/zdoom-info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/posix/osx/zdoom-info.plist b/src/posix/osx/zdoom-info.plist index 73be09aa8..e2f896560 100644 --- a/src/posix/osx/zdoom-info.plist +++ b/src/posix/osx/zdoom-info.plist @@ -44,6 +44,6 @@ NSPrincipalClass NSApplication NSSupportsAutomaticGraphicsSwitching - YES + From 715aa80cf2da39c74d4066438a9be09696d35a7d Mon Sep 17 00:00:00 2001 From: LordMisfit Date: Tue, 20 Sep 2016 14:32:40 -0400 Subject: [PATCH 10/11] - Fix for DamageFactor bug w/ PowerDamage & PowerProtection --- src/g_shared/a_artifacts.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_shared/a_artifacts.cpp b/src/g_shared/a_artifacts.cpp index b5ac970ca..72ad84c2d 100644 --- a/src/g_shared/a_artifacts.cpp +++ b/src/g_shared/a_artifacts.cpp @@ -1668,7 +1668,7 @@ void APowerDamage::ModifyDamage(int damage, FName damageType, int &newdamage, bo newdam = damage * 4; } if (Owner != NULL && newdam > damage) S_Sound(Owner, 5, ActiveSound, 1.0f, ATTN_NONE); - newdamage = newdam; + newdamage = damage = newdam; } if (Inventory != NULL) Inventory->ModifyDamage(damage, damageType, newdamage, passive); } @@ -1743,7 +1743,7 @@ void APowerProtection::ModifyDamage(int damage, FName damageType, int &newdamage newdam = damage / 4; } if (Owner != NULL && newdam < damage) S_Sound(Owner, CHAN_AUTO, ActiveSound, 1.0f, ATTN_NONE); - newdamage = newdam; + newdamage = damage = newdam; } if (Inventory != NULL) { From a49e15c5416fae67ed7908e1507acf5c63a38c4b Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 29 Aug 2016 22:45:28 +0800 Subject: [PATCH 11/11] Added REOPEN script type. These scripts behave just like OPEN scripts, except they will re-execute themselves every time the level is re-entered (ie as part of a hub). --- src/g_level.cpp | 3 +++ src/p_acs.cpp | 3 ++- src/p_acs.h | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 60e9b0699..fadfd9245 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1291,6 +1291,9 @@ void G_FinishTravel () if (level.FromSnapshot) { FBehavior::StaticStartTypedScripts (SCRIPT_Return, pawn, true); + + // [Nash] run REOPEN scripts upon map re-entry + FBehavior::StaticStartTypedScripts(SCRIPT_Reopen, NULL, false); } } diff --git a/src/p_acs.cpp b/src/p_acs.cpp index ffac7a78f..c85cc65d6 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -2822,7 +2822,8 @@ void FBehavior::StaticStartTypedScripts (WORD type, AActor *activator, bool alwa "Lightning", "Unloading", "Disconnect", - "Return" + "Return", + "Reopen" }; DPrintf(DMSG_NOTIFY, "Starting all scripts of type %d (%s)\n", type, type < countof(TypeNames) ? TypeNames[type] : TypeNames[SCRIPT_Lightning - 1]); diff --git a/src/p_acs.h b/src/p_acs.h index 243e2ccf3..d26829c61 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -272,6 +272,7 @@ enum SCRIPT_Return = 15, SCRIPT_Event = 16, // [BB] SCRIPT_Kill = 17, // [JM] + SCRIPT_Reopen = 18, // [Nash] }; // Script flags