davewx7 / citadel

A turn based strategy game based on the Anura engine
Other
98 stars 25 forks source link

Flesh Golem: Remake sometimes hangs #141

Closed crabel closed 6 years ago

crabel commented 6 years ago

When using Flesh Golems remake power, the game sometimes gets stuck. I still can click on things, but I cannot complete the "spell". Steps to reproduce: Flesh golem needs to be damaged. Click on Remake List of cards changes to "Remake" Click Remake Red arrows connect golem to remake card.

Whatever I try, I can never finish the spell. I need to restart the game

Edit: I probably made a mistake here. I tried to open a bug for Argentum Age.

davewx7 commented 6 years ago

When this occurs can you please get the file server-log.txt from the game's working directory and send it to me? It will have a log saying what's going wrong.

On Sat, Oct 28, 2017 at 1:43 PM, Christoph Rabel notifications@github.com wrote:

When using Flesh Golems remake power, the game sometimes gets stuck. I still can click on things, but I cannot complete the "spell". Steps to reproduce: Flesh golem needs to be damaged. Click on Remake List of cards changes to "Remake" Click Remake Red arrows connect golem to remake card.

Whatever I try, I can never finish the spell. I need to restart the game

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/davewx7/citadel/issues/141, or mute the thread https://github.com/notifications/unsubscribe-auth/AA0pohBffA3QqC0ZWarZ2QWUW4C_Bybvks5sw5H2gaJpZM4QKFe4 .

crabel commented 6 years ago

I don't think there is a logfile on Linux. It seems, it just writes to stderr. I have changed the run.sh file now to redirect the output to a file.

LIBGL_DRI3_DISABLE=1 \ LD_LIBRARY_PATH=./bin/:$LD_LIBRARY_PATH \ ./bin/anura --module=citadel --utility=update_launcher --update-module=true --update-anura=true --anura=anura_linux --anura-exe=./anura.sh --args --module=citadel $@ >citadel.log 2>&1

crabel commented 6 years ago

I think that's the relevant part of the error message in the logfile:

`ERROR: asserts.cpp:141 : ASSERT FAIL: formula_vm.cpp:451 ASSERTION FAILED: Assertion failed: Could not find item in find_or_die message: ["@eval deserialize('60ea5fc756dd4d4daba6911225c6c1bf')"] at in Virtual Machine: At /home/odie/.citadel//dlc/citadel/data/classes/game_state.cfg 357: if(info.ability, find_or_die(creature.activated_abilities, value._uuid = in... ^

---VM: 0: OP_LOOKUP 72 2: OP_JMP_UNLESS 9 ( -> 12) 4: OP_POP 5: OP_LOOKUP 72 7: OP_CONSTANT 0 ( "ability" ) 9: OP_INDEX 10: OP_JMP 82 ( -> 93) 12: OP_POP 13: OP_LOOKUP 152 15: OP_PUSH_SCOPE 16: OP_LOOKUP 13 18: OP_POP_SCOPE 19: OP_JMP_UNLESS 52 ( -> 72) 21: OP_POP 22: OP_LOOKUP 153 24: OP_PUSH_NULL 25: OP_NEQ 26: OP_JMP_IF 5 ( -> 32) 28: OP_CONSTANT 1 ( "creature != null" ) 30: OP_PUSH_NULL 31: OP_ASSERT 32: OP_POP 33: OP_LOOKUP 153 35: OP_PUSH_SCOPE 36: OP_LOOKUP 16 38: OP_POP_SCOPE 39: OP_PUSH_INT 158 41: OP_ALGO_FIND 14 43: OP_LOOKUP 154 45: OP_PUSH_SCOPE 46: OP_LOOKUP 8 48: OP_POP_SCOPE 49: OP_LOOKUP 152 51: OP_PUSH_SCOPE 52: OP_LOOKUP 15 54: OP_POP_SCOPE 55: OP_EQ 56: OP_PUSH_INT -1 58: OP_EQ 59: OP_POP_JMP_UNLESS 10 ( -> 70) 61: OP_CONSTANT 2 ( "Could not find item in find_or_die" ) 63: OP_LOOKUP 153 65: OP_PUSH_SCOPE 66: OP_LOOKUP 16 68: OP_POP_SCOPE -->69: OP_ASSERT 70: OP_JMP 22 ( -> 93) 72: OP_POP 73: OP_LOOKUP 21 75: OP_LOOKUP 152 77: OP_PUSH_SCOPE 78: OP_LOOKUP 26 80: OP_POP_SCOPE 81: OP_INDEX 82: OP_PUSH_SCOPE 83: OP_LOOKUP 55 85: OP_POP_SCOPE 86: OP_LOOKUP 152 88: OP_PUSH_SCOPE 89: OP_LOOKUP 25 91: OP_POP_SCOPE 92: OP_INDEX 93: OP_DUP 94: OP_CONSTANT 3 ( "@eval (UNSERIALIZABLE_OBJECT N12_GLOBAL__N_118variant_type_classE)" ) 96: OP_IS 97: OP_POP_JMP_IF 7 ( -> 105) 99: OP_CONSTANT 4 ( "Type mis-match. Expected class card_base found " ) 101: OP_SWAP 102: OP_ADD 103: OP_PUSH_NULL 104: OP_ASSERT

---STACK--- --TOS+0-- [(object at address 0xedf3b20){_data: '(Unknown)', value: null, self: (object at address 0xedf3b20){...}, me: (object at address 0xedf3b20){...}, new_in_update: true, orphaned_by_update: false, _class: 'activated_ability', lib: (object at address 0x20489e0){Uninspectable Object: object}, _uuid: '60ea5fc756dd4d4daba6911225c6c1bf', _internal_id: null, _invalid_target_reason: (0x52775c0)(game, avatar, targets, target)null, _standard_invalid_target_reasons: (0xece1410)(game, avatar, targets, target)instrument('invalid_target_reasons', if(cover_reason, cover_reason,

    if(building_reason, building_reason,

    if(indestructible_reason, indestructible_reason)

    where indestructible_reason =
        if(target.indestructible,
        eval_with_temp_modifications(me,
            if(target.loc in possible_targets(game, avatar, targets),
                'This creature is indestructible and cannot be targeted by this card.'
            ),
            set(target.abilities, filter(target.abilities, value != 'Indestructible')),
            set(target.abili

ERROR: ies, target.abilities) ) ) )

    where building_reason =
       if(target.is_building,
        eval_with_temp_modifications(me,
            if(target.loc in possible_targets(game, avatar, targets),
                'This spell must target creatures, not buildings.'
            ),
            set(target.is_building, false),
            set(target.is_building, true)
        )
       )

    )

    where cover_reason =

        if(target.controller != avatar.controller and target.has_cover(game),
        eval_with_temp_modifications(me,
            if(target.loc in possible_targets(game, avatar, targets),
                'This creature has <i>Cover</i> which protects it from enemy spells'
            ),
            set(target.abilities, filter(target.abilities, value != 'Cover')),
            set(target.abilities, target.abilities)
        )
        )
    ),

additional_cost: (0x527d110)(game, player)0, ai_eval_end_of_turn: true, ai_flags: [], ai_patterns: (0x527e080)(game, targets)[], ai_score: (0x527e2c0)(game, targets)0, all_buildings_as_possible_targets: (0xf57ac70)(game, avatar, targets)if(targets = [], [creature.loc | creature <- game.creatures, creature.is_building, creature.is_valid_target(game, avatar.controller, me)]), all_creatures_and_buildings_as_possible_targets: (0xa7824b0)(game, avatar, targets)if(targets = [], [creature.loc | creature <- game.creatures, creature.is_valid_target(game, avatar.controller, me)]), all_creatures_and_players_as_possible_targets: (0xea0c080)(game, avatar, targets)if(targets = [], [creature.loc | creature <- game.creatures, not creature.is_building, creature.is_valid_target(game, avatar.controller, me)] + [[-1, player.player_index] | player <- game.players]), all_creatures_as_possible_targets: (0xf188e30)(game, avatar, targets)if(targets = [], [creature.loc | creature <- game.creatures, not creature.is_building, creature.is_valid_target(game, avatar.controller, me)]), all_players_as_possible_targets: (0x5287500)(game, avatar, targets)if(targets = [], [[-1, player.player_index] | player <- game.players]), all_tiles_as_possible_targets: (0x528aec0)(game, avatar, targets)if(targets = [], game.all_locs), animation_sequence: [], arrow_texture: null, background_color_bot: {'blue': 0.1,'green': 0.05,'red': 0.05}, background_color_top: {'blue': 0.44,'green': 0.32,'red': 0.25}, calculate_invalid_target_reason: (0xf41b0b0)(game, avatar, targets, target)if(possible = null or (target.loc in possible), null, if(reason, reason, _standard_invalid_target_reasons(game, avatar, targets, target) ) where reason = _invalid_target_reason(game, avatar, targets, target) ) where possible = possible_targets(game, avatar, targets), card_font: 'CoreMellow35.otf', cost: 2, creature: null, creature_object: null, custom_reason_cannot_cast: (0x528e970)(game, avatar)null, default_channeled_mana: 0, draw_id: -1, enemy_buildings_as_possible_targets: (0x66b1e70)(game, avatar, targets)if(targets = [], [creature.loc | creature <- game.creatures, creature.is_building, creature.controller != avatar.controller, creature.is_valid_target(game, avatar.controller, me)]), enemy_creatures_as_possible_targets: ERROR: (0xf62b100)(game, avatar, targets)if(targets = [], [creature.loc | creature <- game.creatures, not creature.is_building, creature.controller != avatar.controller, creature.is_valid_target(game, avatar.controller, me)]), equipment_invalid_reason: (0x528edc0)(game, avatar, targets, target)if(target.turn_summoned != game.nturn, 'This spell may only be cast on creatures that were summoned this turn'), equipment_targets: (0xe8fa8e0)(game, avatar, targets)if(targets = [], [creature.loc | creature <- game.creatures, creature.turn_summoned = game.nturn, not creature.is_building, creature.is_valid_target(game, avatar.controller, me)]), first_school: 2, flavor_text: null, flavor_voice: null, help_strings: [], hero: false, hue_shift: 0.0, internal_id: 'Remake', is_building: false, is_channeled: false, is_instant: false, is_land: false, is_on_cooldown: false, is_play_likely_misclick: (0xf2e7930)(game, avatar, targets)if(possible_targets(game, avatar, targets) = null, if((AI_CARD_NEVER_TARGET_ONLY_FRIENDS in ai_flags) and find(targets, c = null or c.controller != avatar.controller where c = game.creature_at_loc(value)) = null, true, false ), false ), is_player_ability: false, is_regular_creature: false, is_response: false, is_usable: (0x8a206e0)(game, creature)true, loyalty_cost: 0, min_targets: null, modify_creature: (0xf62f0f0)(attr, value)if(creature_object and creature, if(unique_creature = null, set(creature, deep_copy(creature)) ); [ set(creature_object[attr], value), set(creature[attr], value), set(unique_creature, generate_uuid()), ] ), my_buildings_as_possible_targets: (0xf180e20)(game, avatar, targets)if(targets = [], [creature.loc | creature <- game.creatures, creature.is_building, creature.controller = avatar.controller, creature.is_valid_target(game, avatar.controller, me)]), my_creatures_as_possible_targets: (0xeecc640)(game, avatar, targets)if(targets = [], [creature.loc | creature <- game.creatures, not creature.is_building, creature.controller = avatar.controller, creature.is_valid_target(game, avatar.controller, me)]), name: 'Remake', no_targets: (0x529bc60)(game, avatar, targets)null, on_cast: (0x52a8210)(game, info)null, on_pay_cost: (0x5298370)(game, info)null, on_play: (0xf6412a0)(game, info)[ creature.restore(game) ] where creature = info.get_creature(game), once_ever: false, once_per_turn: false, plays_on_stack: true, portrait: 'flesh-golem.png', portrait_focus: [340, 222], portrait_focus_height: null, portrait_focus_width: null, possible_targets: (0x529d7e0)(game, avatar, targets)null, preload_objects: [], preloads: [], record_animation: (0xedc9b90)(game, nplayer, info, stack_id)add(game.animation_hints, [construct('animation.play_card_hint', { type: 'play_ability', card: me, player: nplayer, targets: [info.get_creature(game).loc] + info.targets, stack_id: stack_id, info: info, } )]), resolve_animation_delay: 0, resolve_delay: 0, resolve_effect: '', resolve_impact: null, resolve_impact_delay: 30, res ERROR: lve_launch: null, resolve_num_particles: 0, resolve_particle: '', resolve_projectile: null, rules: 'Restore Flesh Golem', rules_text: 'Restore Flesh Golem', rules_text_font_size: 16, rules_tips: [], school: [2], school_list: [2], second_portrait: null, settings: {}, shadow: false, sound_fizzle: 'gameplay/card-fizzle', sound_resolve: 'gameplay/card_resolve_generic', sound_windup: null, stretch_image_edges: true, subcard_tips: [], tags: [], targets_valid: (0xf623c60)(game, creature, targets, existing)if(possible = null, targets = [], if(possible = [], false, targets != [] and (targets[0] in possible) and targets_valid(game, creature, targets[1:], existing + [targets[0]]))) where possible = possible_targets(game, creature, existing), text_color: [1, 1, 1], tips: [], type: 'ability', type_text: 'Ability', unique_creature: null, unique_id: null, used_this_turn: false, user_info: {}, uses_attack: false, uses_movement: false, windup_sound: '', hidden_from_activating: false, hidden_on_creature: false}] --TOS+1-- 'Could not find item in find_or_die' --TOS+2-- null

CRITICAL: At /home/odie/.citadel//dlc/citadel/data/classes/game_state.cfg 355: where card = class card_base<- ^

At /home/odie/.citadel//dlc/citadel/data/objects/citadel_controller.cfg 1667: state.play_card(construct('message.play_card', play_card_message)) ^


CRITICAL: stack trace: CRITICAL: ./anura : validation_failure_exception::validation_failure_exception(std::string const&)+0x2d1 CRITICAL: ./anura : formula_vm::VirtualMachine::executeInternal(game_logic::FormulaCallable const&, std::vector<ffl::IntrusivePtr, std::allocator<ffl::IntrusivePtr > >&, std::vector<variant, std::allocator >&, std::vector<variant, std::allocator >&, short const, short const) const+0x50e9 CRITICAL: ./anura : formula_vm::VirtualMachine::execute(game_logic::FormulaCallable const&) const+0xb4 CRITICAL: ./anura() [0xca184d] CRITICAL: ./anura : game_logic::WhereVariables::getValueBySlot(int) const+0xc2 CRITICAL: ./anura : formula_vm::VirtualMachine::executeInternal(game_logic::FormulaCallable const&, std::vector<ffl::IntrusivePtr, std::allocator<ffl::IntrusivePtr > >&, std::vector<variant, std::allocator >&, std::vector<variant, std::allocator >&, short const, short const) const+0x2842 CRITICAL: ./anura : formula_vm::VirtualMachine::execute(game_logic::FormulaCallable const&) const+0xb4 CRITICAL: ./anura() [0xca184d] CRITICAL: ./anura() [0xcca855] CRITICAL: ./anura() [0xcb021d] CRITICAL: ./anura() [0xccae4b] CRITICAL: ./anura : game_logic::Formula::execute(game_logic::FormulaCallable const&) const+0x90 CRITICAL: ./anura : variant::operator()(std::vector<variant, std::allocator >) const+0xa91 CRITICAL: ./anura() [0xccc7ce] CRITICAL: ./anura() [0xcc26c0] CRITICAL: ./anura() [0xca0b4d] CRITICAL: ./anura() [0xd37a9c] CRITICAL: ./anura : formula_vm::VirtualMachine::executeInternal(game_logic::FormulaCallable const&, std::vector<ffl::IntrusivePtr, std::allocator<ffl::IntrusivePtr > >&, std::vector<variant, std::allocator >&, std::vector<variant, std::allocator >&, short const, short const) const+0x1d2d CRITICAL: ./anura : formula_vm::VirtualMachine::execute(game_logic::FormulaCallable const&) const+0xb4 CRITICAL: ./anura() [0xca184d] CRITICAL: ./anura() [0xca890c] CRITICAL: ./anura() [0xca94d9] CRITICAL: ./anura : game_logic::CommandCallable::runCommand(game_logic::FormulaCallable&) const+0x59 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0x61 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0xbc CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0xbc CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0xbc CRITICAL: ./anura : game_logic::CommandCallable::runCommand(game_logic::FormulaCallable&) const+0x31 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0x61 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0xbc CRITICAL: ./anura : game_logic::CommandCallable::runCommand(game_logic::FormulaCallable&) const+0x31 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0x61 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0xbc CRITICAL: ./anura() [0xca94fc] CRITICAL: ./anura : game_logic::CommandCallable::runCommand(game_logic::FormulaCallable&) const+0x59 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0x61 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0xbc CRITICAL: ./anura() [0xca94fc] CRITICAL: ./anura : game_logic::CommandCallable::runCommand(game_logic::FormulaCallable&) const+0x59 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0x61 CRITICAL: ./anura : CustomObject::executeCommand(variant const&)+0xbc CRITICAL: ./anura : CustomObject::handleEventInternal(int, game_logic::FormulaCallable const, bool)+0x2c1 CRITICAL: ./anura : CustomObject::handleEvent(int, game_logic::FormulaCallable const*)+0x18d CRITICAL: ./anura : LevelRunner::handle_mouse_events(SDL_Event const&)+0x124a CRITICAL: ./anura : LevelRunner::play_cycle()+0x28d5 CRITICAL: ./anura : LevelRunner::play_level()+0x15e CRITICAL: ./anura : main()+0x6862 CRITICAL: /lib/x86_64-linux-gnu/libc.so.6 : __libc_start_main()+0xf5 CRITICAL: ./anura() [0x6abcc5] CRITICAL: ---`

davewx7 commented 6 years ago

To be clear, is this in a game vs the AI? If you are playing against the AI another separate "server" process runs and should log to the server-log.txt file. You can see the process by using "ps ax|grep anura" in bash -- you'll see the client process and server process and the server process should be writing to server-log.txt

However, that error message you posted seems relevant. The way you describe it, the entire UI doesn't lock up? The arrow still moves, animtaions still occur? This would mean the server is crashing, not the client.

Does the problem reproduce for you every single time you use it on a damaged Flesh Golem? I am having trouble reproducing it (I am also using Linux, so it's not a platform difference).

crabel commented 6 years ago

Yes, game against AI. Saw the process now and used lsof now to find the open files. You should probably give people a little hint about the location, I would never have found it here: ~/.citadel/dlc/anura_linux/server-log.txt

The UI seems to work quite normal. I can click around and everything but I can't continue the game. I simply can't complete the spell.

The error doesn't seem to happen on the "happy path". To reproduce the issue, I click "Remake" and then I click somewhere else. Not on the card to complete the spell. e.g. on other cards. When I try then to complete the spell, the error happens.

davewx7 commented 6 years ago

If you download the latest version of the installer ( http://theargentlark.com/files/argentum-age.tar.bz2 ), it installs and runs in a much more straightforward location. If you do this you probably want to blow away ~/.citadel/dlc -- you will also have to do a full new downlad.

Where else do you click exactly? By design if you click elsewhere the Remake spell should disappear so you can't click it.

Do you think you could make a video of the issue and how you reproduce it? That might help.

crabel commented 6 years ago

Ok, thanks. Just to make sure: My saves, cards and everything are outside/elsewhere?

I will try to make a video. Tried it now, you are right, clicking on another card doesn't work and finishes the spell. I think, I clicked on the Golem. I will try again tomorrow and also send you the logfile.

davewx7 commented 6 years ago

Deleting just ~/.citadel/dlc is safe (in that you will only need to do a new download with the new installer) it won't delete any of your history. There are some settings stored elsewhere under ~/.citadel so you don't want to touch anything outside of the dlc directory

crabel commented 6 years ago

No video yet since I had to retry a couple of times to reproduce the effect. But I have a server log.

Click on Golem, invoke power. Before(!) completing power: Click again on golem and invoke the power a second time. (I think, that simply shouldn't be doable at all)

Server log: (one time link) https://send.firefox.com/download/5938a11aee/#UGmRmd7po5voyv84xRdVFg

davewx7 commented 6 years ago

Alright, thank you for these detailed instructions. I have managed to reproduce this issue now and should be able to fix it.

davewx7 commented 6 years ago

Should be fixed now, thank you!