diasurgical/devilutionX

[Issue Report]: segfault load save

johndoe71rus opened this issue · 2 comments

Operating System

Linux x64

DevilutionX version

Custom build (please specify commit ID)

Describe

1.6.0-dev-Release-2ddcc7118
ERROR: Asset not found: lua\user.lua
./hellfire.sh: строка 3: 1148505 Segmentation error
at load save
linux x64 lubuntu 22.04

To Reproduce

  1. load save
  2. get error

Expected Behavior

No response

Additional context

single_0.zip

./hellfire.sh just script

#!/bin/bash

/home/johndoe/game/diablo/hellfire/devilutionx -n

Stack trace for crash:

 	devilutionx.exe!std::vector<devilution::MissileFileData,std::allocator<devilution::MissileFileData>>::operator[](const unsigned __int64 _Pos) Line 1893	C++
 	devilutionx.exe!devilution::GetMissileSpriteData(devilution::MissileGraphicID graphicId) Line 252	C++
>	devilutionx.exe!devilution::missiles_process_charge() Line 4181	C++
 	devilutionx.exe!devilution::LoadGame(bool firstflag) Line 2536	C++
 	devilutionx.exe!devilution::ShowProgress(devilution::interface_mode uMsg) Line 338	C++
 	devilutionx.exe!devilution::`anonymous namespace'::StartGame(devilution::interface_mode uMsg) Line 183	C++
 	devilutionx.exe!devilution::`anonymous namespace'::RunGameLoop(devilution::interface_mode uMsg) Line 824	C++
 	devilutionx.exe!devilution::StartGame(bool bNewGame, bool bSinglePlayer) Line 2515	C++
 	devilutionx.exe!devilution::`anonymous namespace'::InitMenu(devilution::_selhero_selections type) Line 59	C++
 	devilutionx.exe!devilution::`anonymous namespace'::InitSinglePlayerMenu() Line 70	C++
 	devilutionx.exe!devilution::mainmenu_loop() Line 161	C++
 	devilutionx.exe!devilution::DiabloMain(int argc, char * * argv) Line 2590	C++
 	devilutionx.exe!SDL_main(int argc, char * * argv) Line 52	C++
 	devilutionx.exe!main_getcmdline() Line 80	C
 	devilutionx.exe!WinMain(HINSTANCE__ * hInst, HINSTANCE__ * hPrev, char * szCmdLine, int sw) Line 110	C

The issue is that it's trying to retrieve the sprite for missile._miAnimType == MissileGraphicID::None in missiles_process_charge(). The missile in question is missile._miType == MissileID::Search. Seems to me the graphic type of "None" is appropriate so we can probably just check for it at the top of the loop.