From abd288ac63e74c912bbc27abf0e46d76fee6526f Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 20 Mar 2021 23:52:42 +0000 Subject: [PATCH] Do occultation removal before actually removing the piece Otherwise the code in hidden gets *quite* unhappy. Signed-off-by: Ian Jackson --- daemon/cmdlistener.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index c966dc08..5a832703 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -582,18 +582,13 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( let ig = &mut **ig_g; let ipc = ig.ipieces.as_mut(modperm) .remove(piece).ok_or(ME::PieceNotFound)?; - let ioccults = &ig.ioccults; let gs = &mut ig.gs; - let gpc = gs.pieces.as_mut(modperm).remove(piece); - let desc_html = if let Some(gpc) = &gpc { - let pri = PieceRenderInstructions::new_visible(default()); - pri.describe(ioccults, gpc, &ipc) - } else { - Html::lit("<piece partially missing from game state!>") - }; + let gpc = gs.pieces.as_mut(modperm).get_mut(piece); let mut xupdates = vec![]; if let Some(gpc) = gpc { + gpc.occult.passive_delete_hook(&mut gs.occults, piece); if gpc.occult.is_active() { + drop(gpc); xupdates.append( &mut remove_occultation( @@ -607,7 +602,16 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( piece)? ); } - gpc.occult.passive_delete_hook(&mut gs.occults, piece); + } + let ioccults = &ig.ioccults; + let gpc = gs.pieces.as_mut(modperm).remove(piece); + let desc_html = if let Some(gpc) = &gpc { + let pri = PieceRenderInstructions::new_visible(default()); + pri.describe(ioccults, gpc, &ipc) + } else { + Html::lit("<piece partially missing from game state!>") + }; + if let Some(gpc) = gpc { ipc.p.into_inner().delete_hook(&gpc, gs); } if let Some(occilk) = ipc.occilk { ig.ioccults.ilks.dispose(occilk); } -- 2.30.2