From d34d57fa39d63719c85c1cea051a314631f2c958 Mon Sep 17 00:00:00 2001 From: Demur Rumed Date: Mon, 11 Mar 2024 22:17:59 +0000 Subject: [PATCH] tgting: save 393 bytes with bit tricks --- src/rs/src/skill.rs | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/rs/src/skill.rs b/src/rs/src/skill.rs index 0373b83a..369f45c7 100644 --- a/src/rs/src/skill.rs +++ b/src/rs/src/skill.rs @@ -677,10 +677,10 @@ impl Tgt { pub fn check(self, ctx: &Game, c: i16, t: i16) -> bool { let mut x = self.0.get(); - let mut ops = [(0u8, 0u8); 4]; + let mut ops = 0u32; let mut opnum = 0; - let mut vals = [false; 4]; - let mut valnum = 0u8; + let mut vals = 0u32; + let mut valnum = 0u32; let mut ignore = 0; loop { @@ -688,11 +688,12 @@ impl Tgt { let f = (x >> 1) & 31; x >>= 6; if f == 0 { - ops[opnum] = (1, valnum); + ops = ops << 8 | 1 << 4 | valnum; opnum += 1; continue; } - vals[valnum as usize] = ignore == 0 && match f { + valnum += 1; + vals = (vals << 1) | (ignore == 0 && match f { Tgt::_own => ctx.get_owner(c) == ctx.get_owner(t), Tgt::_notself => c != t, Tgt::_card => c != t && ctx.get_kind(t) == Kind::Spell, @@ -791,42 +792,45 @@ impl Tgt { .is_some() } _ => unsafe { core::hint::unreachable_unchecked() }, - }; - valnum += 1; + }) as u32; } else { - ops[opnum] = ((x & 2) as u8, valnum); + ops = ops << 8 | ((x & 2) as u32) << 4 | valnum; opnum += 1; x >>= 2; continue; } loop { if opnum == 0 { - return vals[valnum as usize - 1]; + return vals & 1 == 1; } - if valnum <= ops[opnum - 1].1 { + if valnum <= ops & 15 { break } - let op = ops[opnum - 1].0; + let op = (ops >> 4) & 15; match op { 0 | 2 => { // AND | OR - if (op == 0) != vals[valnum as usize - 1] { + if (op == 0) != (vals & 1 == 1) { ignore += 1; - ops[opnum - 1] = (4, valnum); + ops = (ops & !0xff) | 4 << 4 | valnum; } else { valnum -= 1; - ops[opnum - 1] = (3, valnum); + ops = (ops & !0xff) | 3 << 4 | valnum; } } 1 => { // NOT + ops >>= 8; opnum -= 1; - vals[valnum as usize - 1] = !vals[valnum as usize - 1]; + vals ^= 1; } 3 => { // NEXT + ops >>= 8; opnum -= 1; } 4 => { // DROP + ops >>= 8; opnum -= 1; valnum -= 1; + vals >>= 1; ignore -= 1; } _ => unsafe { core::hint::unreachable_unchecked() },