1 // Copyright 2020-2021 Ian Jackson and contributors to Otter
2 // SPDX-License-Identifier: AGPL-3.0-or-later
3 // There is NO WARRANTY.
11 fn move_money<PI:Idx>(&mut self,
12 a_pieces: &mut Pieces<PI>, piece: PI,
13 qty: i32, z: &str, pos: Pos) {
14 self.api_piece_op_single(PuSynch((&mut *a_pieces, piece)).id(), (
15 "multigrab", json!({ "n": qty, 'z': z })
18 self.api_piece(GH::Ungrab, PuSynch((&mut *a_pieces, piece)), pos)?;
24 fn multigrab(&mut self) {
25 let mut alice = self.connect_player(&self.alice)?;
26 let mut a_pieces = alice.pieces::<PIA>()?;
28 let bank = a_pieces.find_by_desc_glob("*400ƒ*");
30 let pile_pos = PosC::new(40,20);
31 let temp_pos = PosC::new(40,10);
33 alice.api_piece_op_single(PuSynch((&mut a_pieces, bank)).id(), (
34 "multigrab", json!({ "n": 50, 'z': "q000000000" })
36 alice.synchu(&mut a_pieces)?;
39 let bank = a_pieces.find_by_desc_glob("* 350ƒ*");
40 a_pieces[pile].assert_desc_contains(" 50ƒ");
42 alice.api_piece(GH::Ungrab, PuSynch((&mut a_pieces, pile)), pile_pos)?;
43 alice.synchu(&mut a_pieces)?;
45 alice.move_money(&mut a_pieces, bank, 13, "t000000000", temp_pos)?;
47 alice.synchu(&mut a_pieces)?;
48 let bank = a_pieces.find_by_desc_glob("* 337ƒ*");
49 a_pieces[moved].assert_desc_contains(" 13ƒ");
51 alice.api_piece(GH::With, PuSynch((&mut a_pieces, moved)), pile_pos)?;
52 alice.synchu(&mut a_pieces)?;
53 assert!(a_pieces[moved].info.is_null());
54 a_pieces[pile].assert_desc_contains(" 63ƒ");
56 // This saves us some complaints
63 fn occult(&mut self) {
64 self.clear_reset_to_demo()?;
66 let mut alice = self.connect_player(&self.alice)?;
67 let mut a_pieces = alice.pieces::<PIA>()?;
69 let mut bob = self.connect_player(&self.bob)?;
71 let hand = a_pieces.find_by_desc_glob(otter::hand::UNCLAIMED_HAND_DESC);
72 alice.api_piece(GH::With, PuSynch(&mut (&mut a_pieces, hand)),
73 ("k", json!({ "opname": "claim",
74 "wrc": WRC::Unpredictable })))?;
75 let hand_pos = a_pieces[hand].pos;
77 alice.synchu(&mut a_pieces)?;
79 let tmoney = a_pieces.find_by_desc_glob("*400ƒ*");
80 let pubmoney_pos = a_pieces[tmoney].pos;
82 alice.move_money(&mut a_pieces, tmoney, 399, "u000000000", hand_pos)?;
83 alice.synchu(&mut a_pieces)?;
84 // old tmoney has 1f, current piece has 399
86 let div1_pos = (hand_pos + PosC::new(-30,-5))?;
87 alice.move_money(&mut a_pieces, tmoney, 99, "u010000000", div1_pos)?;
88 // in hand has 300, current piece, aside, has 99
90 alice.move_money(&mut a_pieces, tmoney, 9, "u020000000", hand_pos)?;
91 alice.synchu(&mut a_pieces)?;
92 // aside has 90, in hand has 309 (original pos)
94 let tmoney = a_pieces.iter_enumerated().filter(|(_,p)| {
97 dbg!(p).info["desc"].as_str().unwrap().contains("ƒ")
99 let tmoney = match &*tmoney { [p] => p.0, x => panic!("{:?}", &x) };
101 alice.move_money(&mut a_pieces, tmoney, 20, "u030000000", pubmoney_pos)?;
102 alice.synchu(&mut a_pieces)?;
103 // alice has 90 (aside) and 289. Public got 20 and now has 21.
105 let expected = [1, 399, 20, 21];
106 let expected = expected.into_iter()
107 .map(|s| s.to_string())
108 .chain(iter::once("?".to_string()))
111 let mut qtys = vec![];
112 bob.synchx::<PIB,_>(None, None, |_session, gen, _k, v| v.tree_walk(|k,v| {
113 if let Some(s) = v.as_str() {
115 r#"(?x) ([0-9.?]*) (:?<tspan[^<>]*>)? ƒ "#
117 let qty = m.get(1).unwrap().as_str();
118 dbg!(gen, qty, k, s);
119 qtys.push(qty.to_string());
120 assert!(expected.iter().map(|s| &**s).contains(&qty));
126 for exp in expected {
127 assert!(qtys.contains(&exp), "{:?}", exp);
136 fn tests(mut c: Ctx) {
137 test!(c, "multigrab", c.multigrab() ?);
138 test!(c, "occult", c.occult() ?);
143 tests(Ctx::setup()?)?;