Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Flesh Golem: Remake sometimes hangs #141

Closed
crabel opened this issue Oct 28, 2017 · 11 comments
Closed

Flesh Golem: Remake sometimes hangs #141

crabel opened this issue Oct 28, 2017 · 11 comments

Comments

@crabel
Copy link

crabel commented Oct 28, 2017

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
Copy link
Owner

davewx7 commented Oct 28, 2017 via email

@crabel
Copy link
Author

crabel commented Oct 29, 2017

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
Copy link
Author

crabel commented Oct 29, 2017

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<game_logic::FormulaCallable>, std::allocator<ffl::IntrusivePtr<game_logic::FormulaCallable> > >&, 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<game_logic::FormulaCallable>, std::allocator<ffl::IntrusivePtr<game_logic::FormulaCallable> > >&, 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<game_logic::FormulaCallable>, std::allocator<ffl::IntrusivePtr<game_logic::FormulaCallable> > >&, 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
Copy link
Owner

davewx7 commented Oct 29, 2017

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
Copy link
Author

crabel commented Oct 29, 2017

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
Copy link
Owner

davewx7 commented Oct 29, 2017

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
Copy link
Author

crabel commented Oct 29, 2017

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
Copy link
Owner

davewx7 commented Oct 29, 2017

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
Copy link
Author

crabel commented Nov 1, 2017

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
Copy link
Owner

davewx7 commented Nov 1, 2017

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

@davewx7
Copy link
Owner

davewx7 commented Nov 2, 2017

Should be fixed now, thank you!

@davewx7 davewx7 closed this as completed Nov 2, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants