• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

GDB Dump

Crevasse

惡名昭彰
Joined
Jan 13, 2017
Messages
139
Solutions
16
Reaction score
104
Location
Washington, D.C.
Hello,

Below is my GDB dump I'm getting when my server crashes. Hoping someone more knowledgeable than me can offer insight on where I need to look.

C++:
Thread 2 "tfs" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff493b700 (LWP 2308)]
0x00005555559192b8 in Tile::hasProperty(ITEMPROPERTY) const ()
(gdb) bt full
#0  0x00005555559192b8 in Tile::hasProperty(ITEMPROPERTY) const ()
No symbol table info available.
#1  0x00005555556d2680 in AreaCombat::getList(Position const&, Position const&, std::forward_list<T                                                               ile*, std::allocator<Tile*> >&) const ()
No symbol table info available.
#2  0x00005555556cf563 in Combat::getCombatArea(Position const&, Position const&, AreaCombat const*                                                               , std::forward_list<Tile*, std::allocator<Tile*> >&) ()
No symbol table info available.
#3  0x00005555556d0c51 in Combat::CombatFunc(Creature*, Position const&, AreaCombat const*, CombatP                                                               arams const&, void (*)(Creature*, Creature*, CombatParams const&, CombatDamage*), CombatDamage*)
    ()
No symbol table info available.
#4  0x00005555556d14c2 in Combat::doCombatHealth(Creature*, Position const&, AreaCombat const*, Com                                                               batDamage&, CombatParams const&) ()
No symbol table info available.
#5  0x00005555556d12a2 in Combat::doCombat(Creature*, Position const&) const ()
No symbol table info available.
#6  0x000055555590d790 in CombatSpell::castSpell(Creature*) ()
No symbol table info available.
#7  0x000055555590d967 in CombatSpell::castSpell(Creature*, Creature*) ()
No symbol table info available.
#8  0x0000555555862627 in Monster::doAttacking(unsigned int) ()
No symbol table info available.
#9  0x000055555570798b in Creature::onAttacking(unsigned int) ()
No symbol table info available.
#10 0x000055555573cbaf in Game::checkCreatures(unsigned long) ()
No symbol table info available.
#11 0x000055555576542d in void std::__invoke_impl<void, void (Game::*&)(unsigned long), Game*&, uns                                                               igned long&>(std::__invoke_memfun_deref, void (Game::*&)(unsigned long), Game*&, unsigned long&)
    ()
No symbol table info available.
#12 0x00005555557621b4 in std::__invoke_result<void (Game::*&)(unsigned long), Game*&, unsigned lon                                                               g&>::type std::__invoke<void (Game::*&)(unsigned long), Game*&, unsigned long&>(void (Game::*&)(uns                                                               igned long), Game*&, unsigned long&) ()
No symbol table info available.
---Type <return> to continue, or q <return> to quit---Thread 2 "tfs" received signal SIGSEGV, Segmentation fault.
#13 0x000055555575d144 in void std::_Bind<void (Game::*(Game*, unsigned long))(unsigned long)>::__call<void, , 0ul, 1ul>(std::tuple<>&&, std::_Index_tuple<0ul, 1ul>) ()
No symbol table info available.
#14 0x0000555555756759 in void std::_Bind<void (Game::*(Game*, unsigned long))(unsigned long)>::operator()<, void>() ()
No symbol table info available.
#15 0x0000555555750868 in std::_Function_handler<void (), std::_Bind<void (Game::*(Game*, unsigned long))(unsigned long)> >::_M_invoke(std::_Any_data const&) ()
No symbol table info available.
#16 0x00005555559180ca in std::function<void ()>::operator()() const ()
No symbol table info available.
#17 0x0000555555918020 in Task::operator()() ()
No symbol table info available.
#18 0x00005555559177e6 in Dispatcher::threadMain() ()
No symbol table info available.
#19 0x0000555555895a98 in void std::__invoke_impl<void, void (Dispatcher::*)(), Dispatcher*>(std::__invoke_memfun_deref, void (Dispatcher::*&&)(), Dispatcher*&&)
    ()
No symbol table info available.
#20 0x00005555558946c9 in std::__invoke_result<void (Dispatcher::*)(), Dispatcher*>::type std::__invoke<void (Dispatcher::*)(), Dispatcher*>(void (Dispatcher::*&&)(), Dispatcher*&&) ()
No symbol table info available.
#21 0x000055555589bfeb in decltype (__invoke((_S_declval<0ul>)(), (_S_declval<1ul>)())) std::thread::_Invoker<std::tuple<void (Dispatcher::*)(), Dispatcher*> >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) ()
No symbol table info available.
#22 0x000055555589bc38 in std::thread::_Invoker<std::tuple<void (Dispatcher::*)(), Dispatcher*> >::operator()() ()
No symbol table info available.
#23 0x000055555589b818 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (Dispatcher::*)(), Dispatcher*> > >::_M_run() ()
No symbol table info available.
#24 0x00007ffff67e06df in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#25 0x00007ffff6ab36db in start_thread (arg=0x7ffff493b700) at pthread_create.c:463
        pd = 0x7ffff493b700
        now = <optimized out>
        unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140737296709376, 7936763167146317490, 140737296707456, 0, 93824999949088, 140737488347536,
                -7936779416654768462, -7936783613110184270}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0,
              canceltype = 0}}}
        not_first_call = <optimized out>
#26 0x00007ffff5e9d71f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
No locals.
(gdb) [Switching to Thread 0x7ffff493b700 (LWP 2308)]
Undefined command: "".  Try "help".
(gdb) 0x00005555559192b8 in Tile::hasProperty(ITEMPROPERTY) const ()
Undefined command: "0x00005555559192b8".  Try "help".
(gdb) (gdb) bt full
Undefined command: "".  Try "help".
(gdb) #0  0x00005555559192b8 in Tile::hasProperty(ITEMPROPERTY) const ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #1  0x00005555556d2680 in AreaCombat::getList(Position const&, Position const&, std::forward_list<T                                                               ile*, std::allocator<Tile*> >&) const ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #2  0x00005555556cf563 in Combat::getCombatArea(Position const&, Position const&, AreaCombat const*                                                               , std::forward_list<Tile*, std::allocator<Tile*> >&) ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #3  0x00005555556d0c51 in Combat::CombatFunc(Creature*, Position const&, AreaCombat const*, CombatP                                                               arams const&, void (*)(Creature*, Creature*, CombatParams const&, CombatDamage*), CombatDamage*)
(gdb)     ()
Undefined command: "".  Try "help".
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #4  0x00005555556d14c2 in Combat::doCombatHealth(Creature*, Position const&, AreaCombat const*, Com                                                               batDamage&, CombatParams const&) ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #5  0x00005555556d12a2 in Combat::doCombat(Creature*, Position const&) const ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #6  0x000055555590d790 in CombatSpell::castSpell(Creature*) ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #7  0x000055555590d967 in CombatSpell::castSpell(Creature*, Creature*) ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #8  0x0000555555862627 in Monster::doAttacking(unsigned int) ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #9  0x000055555570798b in Creature::onAttacking(unsigned int) ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #10 0x000055555573cbaf in Game::checkCreatures(unsigned long) ()
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #11 0x000055555576542d in void std::__invoke_impl<void, void (Game::*&)(unsigned long), Game*&, uns                                                               igned long&>(std::__invoke_memfun_deref, void (Game::*&)(unsigned long), Game*&, unsigned long&)
(gdb)     ()
Undefined command: "".  Try "help".
(gdb) No symbol table info available.
Undefined command: "No".  Try "help".
(gdb) #12 0x00005555557621b4 in std::__invoke_result<void (Game::*&)(unsigned long), Game*&, unsigned lon                                                               g&>::type std::__invoke<void (Game::*&)(unsigned long), Game*&, unsigned long&>(void (Game::*&)(uns                                                               igned long), Game*&, unsigned long&) ()
(gdb) No symbol table info available.

I can post/link whatever source files are needed, not posting any yet since I don't even know what needs to be examined.

Thanks
 
Solution
hotfix without finding real problem. Replace ( mattyx14/otxserver (https://github.com/mattyx14/otxserver/blob/otxserv3/path_7_7/src/combat.cpp#L1044-L1049) ):
Code:
void AreaCombat::getList(const Position& centerPos, const Position& targetPos, std::forward_list<Tile*>& list) const
{
    Tile* tile = g_game.map.getTile(targetPos);
    if (tile->hasProperty(CONST_PROP_BLOCKPROJECTILE)) {
        return;
    }
with:
Code:
void AreaCombat::getList(const Position& centerPos, const Position& targetPos, std::forward_list<Tile*>& list) const
{
    Tile* tile = g_game.map.getTile(targetPos);
    if (!tile || tile->hasProperty(CONST_PROP_BLOCKPROJECTILE)) {
        return;
    }
You binary is compiled without 'debug info', so there is no infomation about 'which line of C++ code it crashed' and no variable values. It's almost
impossible to find crash reason without that, because it's probably related to OTS map. Would be nice to know map position and view what is there.

What can we read from that gdb? Some monster casted spell (like fire wave by dragon). OTS tried to list positions that this spell will hit and crashed, because it tried to check 'tile' that does not exist.
Is there any source modification that could remove tile from RAM? Do you use some 'map partial loading' system (load map .otbm file from LUA)?

Almost no chance to find crash reason with 'debug info', but you can post combat.h, combat.cpp, tile.h and tile.cpp
 
Hey Gesior,

(edited)

A debug version has been compiled, I will wait for it to crash again and post here.

I have made source edits, but nothing that, to my knowledge, would remove a tile from RAM. Map loading system/map system in general is untouched, it's whatever comes stock in OTX3.
 
Last edited:
@Gesior.pl

Here is the bt full from the binary compiled with debug info.


C++:
Thread 2 "tfs_debug_build" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff493b700 (LWP 16324)]
0x00005555559192b8 in Tile::hasProperty (this=0x0, prop=CONST_PROP_BLOCKPROJECTILE) at /home/username/OTX/src/tile.cpp:45
45        if (ground && ground->hasProperty(prop)) {
(gdb) bt full
#0  0x00005555559192b8 in Tile::hasProperty (this=0x0, prop=CONST_PROP_BLOCKPROJECTILE) at /home/username/OTX/src/tile.cpp:45
No locals.
#1  0x00005555556d2680 in AreaCombat::getList (this=0x7fffec6aaf00, centerPos=..., targetPos=..., list=empty std::forward_list) at /home/username/OTX/src/combat.cpp:1054
        tile = 0x0
        area = 0x3f44d77a065b8b7c
        centerY = 3302455872
        centerX = 0
        tmpPos = {x = 62611, y = 32767, z = 0 '\000'}
        cols = 4103317464
#2  0x00005555556cf563 in Combat::getCombatArea (centerPos=..., targetPos=..., area=0x7fffec6aaf00, list=empty std::forward_list) at /home/username/OTX/src/combat.cpp:93
No locals.
#3  0x00005555556d0c51 in Combat::CombatFunc (caster=0x7fffed903f60, pos=..., area=0x7fffec6aaf00, params=...,
    func=0x5555556d0372 <Combat::CombatHealthFunc(Creature*, Creature*, CombatParams const&, CombatDamage*)>, data=0x7ffff493a900) at /home/username/OTX/src/combat.cpp:645
        tileList = empty std::forward_list
        list = std::unordered_set with 93824993821906 elements = {[0] = 0x61800370433f2700,
          [1] = 0x5555556d14c2 <Combat::doCombatHealth(Creature*, Position const&, AreaCombat const*, CombatDamage&, CombatParams const&)+66>,
          [2] = 0x5555556d12a2 <Combat::doCombat(Creature*, Position const&) const+140>, [3] = 0x55555590d790 <CombatSpell::castSpell(Creature*)+370>,
          [4] = 0x55555590d967 <CombatSpell::castSpell(Creature*, Creature*)+399>, [5] = 0x555555862627 <Monster::doAttacking(unsigned int)+465>,
          [6] = 0x55555570798b <Creature::onAttacking(unsigned int)+191>, [7] = 0x55555573cbaf <Game::checkCreatures(unsigned long)+389>,
          [8] = 0x55555576542d <std::__invoke_impl<void, void (Game::*&)(unsigned long), Game*&, unsigned long&>(std::__invoke_memfun_deref, void (Game::*&)(unsigned long), Game*&, unsigned long&)+128>, [9] = 0x5555557621b4 <std::__invoke<void (Game::*&)(unsigned long), Game*&, unsigned long&>(void (Game::*&)(unsigned long), Game*&, unsigned long&)+102>,
          [10] = 0x55555575d144 <std::_Bind<void (Game::*(Game*, unsigned long))(unsigned long)>::__call<void, , 0ul, 1ul>(std::tuple<>&&, std::_Index_tuple<0ul, 1ul>)+132>,
          [11] = 0x555555756759 <std::_Bind<void (Game::*(Game*, unsigned long))(unsigned long)>::operator()<, void>()+57>,
          [12] = 0x555555750868 <std::_Function_handler<void (), std::_Bind<void (Game::*(Game*, unsigned long))(unsigned long)> >::_M_invoke(std::_Any_data const&)+32>,
          [13] = 0x5555559180ca <std::function<void ()>::operator()() const+50>, [14] = 0x555555918020 <Task::operator()()+28>,
          [15] = 0x5555559177e6 <Dispatcher::threadMain()+276>,
          [16] = 0x555555895a98 <std::__invoke_impl<void, void (Dispatcher::*)(), Dispatcher*>(std::__invoke_memfun_deref, void (Dispatcher::*&&)(), Dispatcher*&&)+103>,
          [17] = 0x5555558946c9 <std::__invoke<void (Dispatcher::*)(), Dispatcher*>(void (Dispatcher::*&&)(), Dispatcher*&&)+78>,
          [18] = 0x55555589bfeb <std::thread::_Invoker<std::tuple<void (Dispatcher::*)(), Dispatcher*> >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>)+67>,
          [19] = 0x55555589bc38 <std::thread::_Invoker<std::tuple<void (Dispatcher::*)(), Dispatcher*> >::operator()()+44>,
          [20] = 0x55555589b818 <std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (Dispatcher::*)(), Dispatcher*> > >::_M_run()+28>, [21] = 0x7ffff67e06df}
        maxX = 21845
        maxY = 1439290592
        rangeX = 21845
        rangeY = -318980832
        Second_Continue = 85
#4  0x00005555556d14c2 in Combat::doCombatHealth (caster=0x7fffed903f60, position=..., area=0x7fffec6aaf00, damage=..., params=...) at /home/username/OTX/src/combat.cpp:766
No locals.
#5  0x00005555556d12a2 in Combat::doCombat (this=0x7fffec6aae90, caster=0x7fffed903f60, position=...) at /home/username/OTX/src/combat.cpp:736
        damage = {primary = {type = COMBAT_EARTHDAMAGE, value = -171}, secondary = {type = COMBAT_NONE, value = 0}, origin = ORIGIN_SPELL}
#6  0x000055555590d790 in CombatSpell::castSpell (this=0x7fffec6ab1f0, creature=0x7fffed903f60) at /home/username/OTX/src/spells.cpp:309
        pos = {x = 869, y = 1148, z = 5 '\005'}
#7  0x000055555590d967 in CombatSpell::castSpell (this=0x7fffec6ab1f0, creature=0x7fffed903f60, target=0x7fffea027ff0) at /home/username/OTX/src/spells.cpp:339
No locals.
#8  0x0000555555862627 in Monster::doAttacking (this=0x7fffed903f60, interval=100) at /home/username/OTX/src/monster.cpp:774
        inRange = true
        spellBlock = @0x7fffec6aae60: {spell = 0x7fffec6ab208, chance = 13, speed = 750, range = 0, minCombatValue = -60, maxCombatValue = -320, combatSpell = true,
          isMelee = false}
        __for_range = std::vector of length 4, capacity 4 = {{spell = 0x7fffec6a7268, chance = 100, speed = 2000, range = 1, minCombatValue = 0, maxCombatValue = -227,
            combatSpell = true, isMelee = true}, {spell = 0x7fffec6aa9e8, chance = 12, speed = 750, range = 7, minCombatValue = 0, maxCombatValue = 0, combatSpell = true,
            isMelee = false}, {spell = 0x7fffec6aadd8, chance = 11, speed = 750, range = 0, minCombatValue = -150, maxCombatValue = -250, combatSpell = true, isMelee = false}, {
            spell = 0x7fffec6ab208, chance = 13, speed = 750, range = 0, minCombatValue = -60, maxCombatValue = -320, combatSpell = true, isMelee = false}}
        __for_begin = {spell = 0x7fffec6ab208, chance = 13, speed = 750, range = 0, minCombatValue = -60, maxCombatValue = -320, combatSpell = true, isMelee = false}
        __for_end = {spell = 0x0, chance = 117, speed = 0, range = 0, minCombatValue = 0, maxCombatValue = 0, combatSpell = false, isMelee = false}
        updateLook = false
        resetTicks = false
        myPos = @0x7fffed903f68: {x = 868, y = 1148, z = 5 '\005'}
        targetPos = @0x7fffea027ff8: {x = 869, y = 1147, z = 5 '\005'}
#9  0x000055555570798b in Creature::onAttacking (this=0x7fffed903f60, interval=100) at /home/username/OTX/src/creature.cpp:178
No locals.
#10 0x000055555573cbaf in Game::checkCreatures (this=0x555555c91900 <g_game>, index=0) at /home/username/OTX/src/game.cpp:3174
        creature = 0x7fffed903f60
        checkCreatureList = std::__cxx11::list = {[0] = 0x7fffeaee8d50, [1] = 0x7fffeabc2890, [2] = 0x7fffe1621cf0, [3] = 0x7fffe1672e70, [4] = 0x7fffef4c26b0,
          [5] = 0x7fffef4c2020, [6] = 0x7fffeb163dc0, [7] = 0x7fffeb830e60, [8] = 0x7fffe0b89cf0, [9] = 0x7fffdd978840, [10] = 0x7fffef49abf0, [11] = 0x7fffdd5e3680,
          [12] = 0x7fffdd5e2b80, [13] = 0x7fffdcbbd630, [14] = 0x7fffdcbbcdd0, [15] = 0x7fffdda205c0, [16] = 0x7fffdd60e390, [17] = 0x7fffdd60dba0, [18] = 0x7fffdd60d510,
          [19] = 0x7fffde441c20, [20] = 0x7fffe81ea6c0, [21] = 0x7fffe9fda890, [22] = 0x7fffe9fd9d20, [23] = 0x7fffe0adf6d0, [24] = 0x7fffe0adeba0, [25] = 0x7fffdf2d9970,
 
Something went veeery bad.

Monster stands on position:
Code:
x = 868, y = 1148, z = 5
Player or player summon (target) stands on position:
Code:
x = 869, y = 1147, z = 5
Spell is casted on position (it's not on target positon, but it's 1 SQM from monster, probably it's 'wave' which 'cast position' is 1 tile in front of caster):
Code:
x = 869, y = 1148, z = 5
Positions are ok, but then 'search in range' values go crazy:
Code:
        maxX = 21845
        maxY = 1439290592
        rangeX = 21845
        rangeY = -318980832
        Second_Continue = 85
Range 21845 tiles?!

I would search for monster that can be there [by position on map and spawns] and check it's .xml file. Maybe there is some invalid value in it's 'attacks' (like 'wave' with range -1 or 12345).
 
Crashes in area:getList or later when dereferencing tiles obtained in that method, because tile that is nullptr is dereferenced. You can see it from the invalid positions and tile = 0x0.
CenterY is also invalid.
Which means there may be something wrong with the area.

If you know how to reproduce this then you should share this information as it helps locating where is the problem.
 
Thanks for the replies.

@roriscrave Nothing is at Pos1: 62611, 32767, 0, my map is only 1256x1817 tiles, so I don't know how to interpret that part.

Range 21845 tiles?!

I would search for monster that can be there [by position on map and spawns] and check it's .xml file. Maybe there is some invalid value in it's 'attacks' (like 'wave' with range -1 or 12345).

I also saw that crazy range and knew something was wrong. The monster in that spot is just a regular Hydra. No crazy custom monster or anything, but I will check to see if there is an invalid value.

Crashes in area:getList or later when dereferencing tiles obtained in that method, because tile that is nullptr is dereferenced. You can see it from the invalid positions and tile = 0x0.
CenterY is also invalid.
Which means there may be something wrong with the area.

If you know how to reproduce this then you should share this information as it helps locating where is the problem.
My C++ is just good enough that I can also understand that there is something wrong, but not good enough that I know what to look for. As I said in my original post, I will share anything I possibly can, I just don't know what to share. I can share map files, source files, whatever, just let me know what will be helpful because I'm not totally sure. For reference, this is what is at 869, 1148, 5. Nothing. I hover over that exact tile in RME and there is literally nothing there, just a blank square.
1613134991018.png
 
Last edited:
hotfix without finding real problem. Replace ( mattyx14/otxserver (https://github.com/mattyx14/otxserver/blob/otxserv3/path_7_7/src/combat.cpp#L1044-L1049) ):
Code:
void AreaCombat::getList(const Position& centerPos, const Position& targetPos, std::forward_list<Tile*>& list) const
{
    Tile* tile = g_game.map.getTile(targetPos);
    if (tile->hasProperty(CONST_PROP_BLOCKPROJECTILE)) {
        return;
    }
with:
Code:
void AreaCombat::getList(const Position& centerPos, const Position& targetPos, std::forward_list<Tile*>& list) const
{
    Tile* tile = g_game.map.getTile(targetPos);
    if (!tile || tile->hasProperty(CONST_PROP_BLOCKPROJECTILE)) {
        return;
    }
 
Solution
hotfix without finding real problem. Replace ( mattyx14/otxserver (https://github.com/mattyx14/otxserver/blob/otxserv3/path_7_7/src/combat.cpp#L1044-L1049) ):
Code:
void AreaCombat::getList(const Position& centerPos, const Position& targetPos, std::forward_list<Tile*>& list) const
{
    Tile* tile = g_game.map.getTile(targetPos);
    if (tile->hasProperty(CONST_PROP_BLOCKPROJECTILE)) {
        return;
    }
with:
Code:
void AreaCombat::getList(const Position& centerPos, const Position& targetPos, std::forward_list<Tile*>& list) const
{
    Tile* tile = g_game.map.getTile(targetPos);
    if (!tile || tile->hasProperty(CONST_PROP_BLOCKPROJECTILE)) {
        return;
    }
Normally this is checked later (with canDoCombat), when iterating the area, but it's OTX so dunno. Nice to see I was guessing, but was actually right lol.
 
Wow that simple eh? So because the monster waves something that is not a tile, it crashes? Or rather it didn't know what to do if there wasn't a tile at all?

Either way, I'll recompile and test after work. Thanks!
 
Wow that simple eh? So because the monster waves something that is not a tile, it crashes? Or rather it didn't know what to do if there wasn't a tile at all?

Either way, I'll recompile and test after work. Thanks!
As I said, your combat (wave) was casted on non existent tile and you are dereferencing this tile before you push them to the forward_list in combat.cpp, you aren't even checking if that tile exists, so you are dereferencing invalid (null) pointer. Gesior added that check, so it should work now.
 
Because I can't create my own from scratch? Because it's available? Because I can do what I want? I know there's better ones out there but I started working on this when I was noob, gradually learning as I went. I'm still noob, but I've done lots of source edits and it has come along way from the vanilla distro.

Working, thanks for the help guys:
1613178135866.png
 
Back
Top