void Session::playHand(SessionLog& log) { _init_hand(); HandState hand_state(_betting_rules->getStackSize(), _button); log.recordHandStart(*this, hand_state); _main_loop(log, hand_state); _finish_hand(log, hand_state); }
static void move_donkeys() { DONKEY *donkey; int new_flags; int flags; int x, y; /* see the `hand' */ get_hand(); if (hand_state() == HAND_FULL) { kill_hand(); get_hand(); /* speed up */ move_freq -= get_level()->donkey.move_freq_countdown; if (move_freq < get_level()->donkey.move_freq_min) move_freq = get_level()->donkey.move_freq_min; } /* move the donkeys... */ /* EXIT */ /* go to first `exit' */ if (!get_first_hand_pos(&x, &y)) { for(ever) { /* get the donkey in the block */ donkey = get_block_donkey(x, y); /* ok? */ if (donkey) { flags = get_block_flags2(donkey->x, donkey->y); donkey->xold = donkey->x; donkey->yold = donkey->y; move_donkey_position(donkey, flags); /* the flags of the block to come */ new_flags = get_block_flags2(donkey->x, donkey->y); /* next position not is a `exit' block */ if (!(new_flags & BLOCK_FLAG_EXIT)) { if (hand_state() != HAND_BAD) { /* return to old position */ donkey->x = donkey->xold; donkey->y = donkey->yold; } } else { if ((get_block_donkey2(donkey->x, donkey->y)) && (get_block_donkey2(donkey->x, donkey->y) != donkey)) { if (hand_state() != HAND_BAD) { /* return to old position */ donkey->x = donkey->xold; donkey->y = donkey->yold; } } } /* restore `donkey' pointers in the block */ if (get_block_donkey2(donkey->xold, donkey->yold) == donkey) set_block_donkey2(donkey->xold, donkey->yold, NULL); set_block_donkey2(donkey->x, donkey->y, donkey); donkey->moved = TRUE; donkey->flip = (donkey->xold == donkey->x)? donkey->flip: (donkey->xold > donkey->x)? TRUE: FALSE; } /* go to next `exit' */ if (get_next_hand_pos(&x, &y)) break; } } /* OTHERS */ for (donkey=donkey_list; donkey; donkey=donkey->next) { if (donkey->moved) continue; flags = get_block_flags2(donkey->x, donkey->y); if (flags & BLOCK_FLAG_STOP) continue; donkey->xold = donkey->x; donkey->yold = donkey->y; move_donkey_position(donkey, flags); /* restore `donkey' pointers in the block */ if (get_block_donkey2(donkey->xold, donkey->yold) == donkey) set_block_donkey2(donkey->xold, donkey->yold, NULL); set_block_donkey2(donkey->x, donkey->y, donkey); donkey->moved = TRUE; donkey->flip = (donkey->xold == donkey->x)? donkey->flip: (donkey->xold > donkey->x)? TRUE: FALSE; } /* STOP */ for (donkey=donkey_list; donkey; donkey=donkey->next) { if (donkey->moved) { donkey->moved = FALSE; continue; } flags = get_block_flags2(donkey->x, donkey->y); donkey->xold = donkey->x; donkey->yold = donkey->y; move_donkey_position(donkey, flags); /* is new position occupied? */ if ((get_block_donkey2(donkey->x, donkey->y)) && (get_block_donkey2(donkey->x, donkey->y) != donkey)) { /* if yes... return to old position */ donkey->x = donkey->xold; donkey->y = donkey->yold; active_red_alarm(100); } /* restore `donkey' pointers in the block */ if (get_block_donkey2(donkey->xold, donkey->yold) == donkey) set_block_donkey2(donkey->xold, donkey->yold, NULL); set_block_donkey2(donkey->x, donkey->y, donkey); donkey->flip = (donkey->xold == donkey->x)? donkey->flip: (donkey->xold > donkey->x)? TRUE: FALSE; } }