This is an appeal to the development team from the modders.
Modding Imperator can be a very rewarding pastime, and there is a lively community of dedicated modders working on mods from UI changes to total overhauls. There is a problem, however, in resolving CTDs: while some basic CTDs can be resolved through the error log, the log is inconsistent at best and downright opaque at the worst of times, to the extent that modders can experience repeatable CTDs with a totally empty error log.
This is problematic for modding; it's a waste of time and can make modding off-putting when indecipherable CTDs occur. They may be repeatable, but sometimes the cause is in a piece of code you would never think of looking at based on the in-game actions needed to replicate a crash. This issue gets worse the more complicated the mod; CTDs are also a major issue when starting out, making starting afresh for new modders obstructively difficult without excessive handholding from more experienced modders. Of course, we're all very happy as a community to help out anyone who is starting out, but we also don't always know what is causing crashes, and for new people it is often easier to just give up than to ask again and again for help when the solution is so obscure.
We really want to continue making mods for the game, but more ambitious mods won't be possible without access to the beta version of the game which outputs full tracebacks, allowing the cause of CTDs to be immediately identified. Some modders were given access to this branch before the game launched, and some of them still have it. At times, I have asked these modders to run my mod for me and within minutes of getting a report back the crash is easily solved. This isn't a sustainable way of working, though - it wastes everyone's time and depends on files being trafficked back and forth when everyone could simply have access to these tools.
Here is an example in the difference of tracebacks below:
Regular version (unusable):
Beta version (immediately indicates cause of the problem):
In the beta crashlog above, it is obvious that the cause was due to an exception in the mapobject manager. In this example, we quickly triaged map_object_data files and fixed the crash in minutes.
Modding Imperator can be a very rewarding pastime, and there is a lively community of dedicated modders working on mods from UI changes to total overhauls. There is a problem, however, in resolving CTDs: while some basic CTDs can be resolved through the error log, the log is inconsistent at best and downright opaque at the worst of times, to the extent that modders can experience repeatable CTDs with a totally empty error log.
This is problematic for modding; it's a waste of time and can make modding off-putting when indecipherable CTDs occur. They may be repeatable, but sometimes the cause is in a piece of code you would never think of looking at based on the in-game actions needed to replicate a crash. This issue gets worse the more complicated the mod; CTDs are also a major issue when starting out, making starting afresh for new modders obstructively difficult without excessive handholding from more experienced modders. Of course, we're all very happy as a community to help out anyone who is starting out, but we also don't always know what is causing crashes, and for new people it is often easier to just give up than to ask again and again for help when the solution is so obscure.
We really want to continue making mods for the game, but more ambitious mods won't be possible without access to the beta version of the game which outputs full tracebacks, allowing the cause of CTDs to be immediately identified. Some modders were given access to this branch before the game launched, and some of them still have it. At times, I have asked these modders to run my mod for me and within minutes of getting a report back the crash is easily solved. This isn't a sustainable way of working, though - it wastes everyone's time and depends on files being trafficked back and forth when everyone could simply have access to these tools.
Here is an example in the difference of tracebacks below:
Regular version (unusable):
Code:
Application: Imperator
Version: 1.5.3
Date/Time: 2020-09-09 23:26:50
Unhandled Exception C0000005 (EXCEPTION_ACCESS_VIOLATION) at address 0x00007FF657296D9A
Stack Trace:
1 imperator.exe PHYSFS_swapULE64 (+ 12240234)
2 imperator.exe SDL_StopTextInput (+ 794753)
3 imperator.exe PHYSFS_swapULE64 (+ 14614082)
4 imperator.exe PHYSFS_swapULE64 (+ 14614297)
5 imperator.exe PHYSFS_swapULE64 (+ 14614297)
6 imperator.exe PHYSFS_swapULE64 (+ 14614297)
7 imperator.exe PHYSFS_swapULE64 (+ 14614297)
8 imperator.exe PHYSFS_swapULE64 (+ 14614297)
9 imperator.exe PHYSFS_swapULE64 (+ 14614297)
10 imperator.exe PHYSFS_swapULE64 (+ 14614297)
11 imperator.exe PHYSFS_swapULE64 (+ 14614297)
12 imperator.exe PHYSFS_swapULE64 (+ 14613192)
13 imperator.exe PHYSFS_swapULE64 (+ 14566862)
14 imperator.exe PHYSFS_swapULE64 (+ 14561259)
15 imperator.exe SDL_StopTextInput (+ 1939123)
16 imperator.exe SDL_StopTextInput (+ 1938770)
17 imperator.exe SDL_StopTextInput (+ 2218748)
18 imperator.exe SDL_StopTextInput (+ 2219815)
19 imperator.exe SDL_StopTextInput (+ 2219881)
20 imperator.exe SDL_DYNAPI_entry (+ 1640316)
21 KERNEL32.DLL BaseThreadInitThunk (+ 20)
22 ntdll.dll RtlUserThreadStart (+ 33)
23 ntdll.dll RtlUserThreadStart (+ 33)
Beta version (immediately indicates cause of the problem):
Code:
Application: Sulla
Version: 1.5.2-beta
Date/Time: 2020-08-18 20:33:59
Unhandled Exception C0000005 (EXCEPTION_ACCESS_VIOLATION) at address 0x00007FF7D67AA1F9
Stack Trace:
1 imperator_D_opt.exe NJominiMap::CMapObjectManager::CCell::AddTempObject (jomini_mapobject_manager.cpp: 747)
2 imperator_D_opt.exe NJominiMap::CMapObjectManager::SpawnTempObject (jomini_mapobject_manager.cpp: 3008)
3 imperator_D_opt.exe NJominiMap::CMapObjectManager::AddTempObject (jomini_mapobject_manager.cpp: 2825)
4 imperator_D_opt.exe PdxMapEditor::CMapObjectPainterTool::UpdateMeshes (map_object_painter.cpp: 373)
5 imperator_D_opt.exe PdxMapEditor::CMapObjectPainterTool::FinishGenerateTask (map_object_painter.cpp: 272)
6 imperator_D_opt.exe PdxMapEditor::CMapObjectPainterTool::Setup (map_object_painter.cpp: 525)
7 imperator_D_opt.exe PdxMapEditor::CBaseTool::Init (mapeditor_brush.cpp: 314)
8 imperator_D_opt.exe PdxMapEditor::CMapObjectPainterMode::Setup (map_object_painter.cpp: 967)
9 imperator_D_opt.exe CPdxMapEditor::Init (mapeditor.cpp: 473)
10 imperator_D_opt.exe CPdxMapEditorIdler::SetAsCurrentIdler (mapeditor_idler.cpp: 288)
11 imperator_D_opt.exe CApplication::UpdateOneFrame (application.cpp: 594)
12 imperator_D_opt.exe CApplication::Update (application.cpp: 736)
13 imperator_D_opt.exe CPdxLegacyApplicationRunner::Update (pdx_legacy_application_runner.cpp: 23)
14 imperator_D_opt.exe `anonymous namespace'::UpdateRunners (pdx_application.cpp: 41)
15 imperator_D_opt.exe CPdxApplication::Run (pdx_application.cpp: 94)
16 imperator_D_opt.exe SDL_main (main.cpp: 482)
17 imperator_D_opt.exe main_getcmdline (sdl_windows_main.c: 175)
18 imperator_D_opt.exe WinMain (sdl_windows_main.c: 205)
19 imperator_D_opt.exe invoke_main (exe_common.inl: 99)
20 imperator_D_opt.exe __scrt_common_main_seh (exe_common.inl: 253)
21 imperator_D_opt.exe __scrt_common_main (exe_common.inl: 296)
22 imperator_D_opt.exe WinMainCRTStartup (exe_winmain.cpp: 17)
23 KERNEL32.DLL BaseThreadInitThunk (+ 20)
24 ntdll.dll RtlUserThreadStart (+ 33)
25 ntdll.dll RtlUserThreadStart (+ 33)
In the beta crashlog above, it is obvious that the cause was due to an exception in the mapobject manager. In this example, we quickly triaged map_object_data files and fixed the crash in minutes.
- 26
- 17
- 3