diff --git a/src/events.cpp b/src/events.cpp index 7ef72b0db..17fc30bea 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -174,8 +174,9 @@ bool E_CheckHandler(DStaticEventHandler* handler) bool E_IsStaticType(PClass* type) { - return (type->IsDescendantOf(RUNTIME_CLASS(DStaticEventHandler)) && // make sure it's from our hierarchy at all. - !type->IsDescendantOf(RUNTIME_CLASS(DEventHandler))); + assert(type != nullptr); + assert(type->IsDescendantOf(RUNTIME_CLASS(DStaticEventHandler))); + return !type->IsDescendantOf(RUNTIME_CLASS(DEventHandler)); } void E_SerializeEvents(FSerializer& arc) @@ -230,27 +231,24 @@ void E_SerializeEvents(FSerializer& arc) } } -static void E_InitStaticHandler(PClass* type, FString typestring, bool map) +static PClass* E_GetHandlerClass(const FString& typeName) { + PClass* type = PClass::FindClass(typeName); + if (type == nullptr) { - I_Error("Fatal: unknown event handler class %s in MAPINFO!\n", typestring.GetChars()); - return; - + I_Error("Fatal: unknown event handler class %s", typeName.GetChars()); + } + else if (!type->IsDescendantOf(RUNTIME_CLASS(DStaticEventHandler))) + { + I_Error("Fatal: event handler class %s is not derived from StaticEventHandler", typeName.GetChars()); } - if (E_IsStaticType(type) && map) - { - I_Error("Fatal: invalid event handler class %s in MAPINFO!\nMap-specific event handlers cannot be static.\n", typestring.GetChars()); - return; - } - /* - if (!E_IsStaticType(type) && !map) - { - Printf("%cGWarning: invalid event handler class %s in MAPINFO!\nMAPINFO event handlers should inherit Static* directly!\n", TEXTCOLOR_ESCAPE, typestring.GetChars()); - return; - }*/ + return type; +} +static void E_InitHandler(PClass* type) +{ // check if type already exists, don't add twice. bool typeExists = false; for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) @@ -269,41 +267,34 @@ static void E_InitStaticHandler(PClass* type, FString typestring, bool map) void E_InitStaticHandlers(bool map) { + // don't initialize map handlers if restoring from savegame. if (savegamerestore) return; // just make sure E_Shutdown(map); - if (map) // don't initialize map handlers if restoring from savegame. + // initialize event handlers from gameinfo + for (const FString& typeName : gameinfo.EventHandlers) { - // load non-static handlers from gameinfo - for (unsigned int i = 0; i < gameinfo.EventHandlers.Size(); i++) - { - FString typestring = gameinfo.EventHandlers[i]; - PClass* type = PClass::FindClass(typestring); - if (!type || E_IsStaticType(type)) // don't init the really global stuff here. - continue; - E_InitStaticHandler(type, typestring, false); - } - - for (unsigned int i = 0; i < level.info->EventHandlers.Size(); i++) - { - FString typestring = level.info->EventHandlers[i]; - PClass* type = PClass::FindClass(typestring); - E_InitStaticHandler(type, typestring, true); - } + PClass* type = E_GetHandlerClass(typeName); + // don't init the really global stuff here on startup initialization. + // don't init map-local global stuff here on level setup. + if (map == E_IsStaticType(type)) + continue; + E_InitHandler(type); } - else + + if (!map) + return; + + // initialize event handlers from mapinfo + for (const FString& typeName : level.info->EventHandlers) { - for (unsigned int i = 0; i < gameinfo.EventHandlers.Size(); i++) - { - FString typestring = gameinfo.EventHandlers[i]; - PClass* type = PClass::FindClass(typestring); - if (!type || !E_IsStaticType(type)) // don't init map-local global stuff here. - continue; - E_InitStaticHandler(type, typestring, false); - } + PClass* type = E_GetHandlerClass(typeName); + if (E_IsStaticType(type)) + I_Error("Fatal: invalid event handler class %s in MAPINFO!\nMap-specific event handlers cannot be static.\n", typeName.GetChars()); + E_InitHandler(type); } }