END_TEST START_TEST (a_deck_with_21_cards_is_not_busted) { Deck *sut = new_deck(); Card* card1 = new_card(1, 10); Card* card2 = new_card(2, 11); deck_push_card(sut,card1); deck_push_card(sut,card2); ck_assert_msg (is_busted(sut) == 0, "Deck with 21 Cards Is Not Busted"); }
END_TEST START_TEST (should_be_able_to_tell_if_a_busted_deck_has_busted) { Deck *sut = new_deck(); Card* card1 = new_card(1, 11); Card* card2 = new_card(2, 12); deck_push_card(sut,card1); deck_push_card(sut,card2); ck_assert_msg (is_busted(sut) == 1, "23 Point Deck Should Bust"); }
duel::duel() { lua = new interpreter(this); game_field = new field(this); game_field->temp_card = new_card(0); bufferlen = 0; bufferp = buffer; }
duel::duel(script_reader sreader_, card_reader creader_, message_handler mhandler_) { sreader = sreader_; creader = creader_; mhandler = mhandler_; lua = new interpreter(this); game_field = new field(this); game_field->temp_card = new_card(0); clear_buffer(); }
void duel::clear() { for(auto cit = cards.begin(); cit != cards.end(); ++cit) delete *cit; for(auto git = groups.begin(); git != groups.end(); ++git) delete *git; for(auto eit = effects.begin(); eit != effects.end(); ++eit) delete *eit; delete game_field; cards.clear(); groups.clear(); effects.clear(); game_field = new field(this); game_field->temp_card = new_card(0); }
void duel::clear() { for(std::set<card*>::iterator cit = cards.begin(); cit != cards.end(); ++cit) delete *cit; for(std::set<group*>::iterator git = groups.begin(); git != groups.end(); ++git) delete *git; for(std::set<effect*>::iterator eit = effects.begin(); eit != effects.end(); ++eit) delete *eit; delete game_field; cards.clear(); groups.clear(); effects.clear(); game_field = new field(this); game_field->temp_card = new_card(0); }
int ReplayMode::ReplayThread(void* param) { ReplayHeader rh = cur_replay.pheader; mainGame->dInfo.isFirst = true; mtrandom rnd; int seed = rh.seed; rnd.reset(seed); cur_replay.ReadData(mainGame->dInfo.hostname, 40); cur_replay.ReadData(mainGame->dInfo.clientname, 40); set_card_reader((card_reader)DataManager::CardReader); set_message_handler((message_handler)MessageHandler); pduel = create_duel(rnd.rand()); int start_lp = cur_replay.ReadInt32(); int start_hand = cur_replay.ReadInt32(); int draw_count = cur_replay.ReadInt32(); int opt = cur_replay.ReadInt32(); set_player_info(pduel, 0, start_lp, start_hand, draw_count); set_player_info(pduel, 1, start_lp, start_hand, draw_count); mainGame->dInfo.lp[0] = start_lp; mainGame->dInfo.lp[1] = start_lp; myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]); myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]); mainGame->dInfo.turn = 0; mainGame->dInfo.strTurn[0] = 0; int main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, 0); int extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, 0); mainGame->dField.Initial(0, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, 0); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, 0); mainGame->dField.Initial(1, main, extra); start_duel(pduel, opt); mainGame->dInfo.isStarted = true; mainGame->dInfo.isReplay = true; char engineBuffer[0x1000]; is_continuing = true; exit_pending = false; int len = 0, flag = 0; while (is_continuing && !exit_pending) { int result = process(pduel); len = result & 0xffff; flag = result >> 16; if (len > 0) { get_message(pduel, (byte*)engineBuffer); is_continuing = ReplayAnalyze(engineBuffer, len); } } end_duel(pduel); if(!is_closing) { mainGame->stMessage->setText(dataManager.GetSysString(1501)); mainGame->actionSignal.Reset(); mainGame->PopupElement(mainGame->wMessage); mainGame->actionSignal.Wait(); mainGame->dInfo.isStarted = false; mainGame->dInfo.isReplay = false; mainGame->CloseDuelWindow(); mainGame->ClearTextures(); mainGame->ShowElement(mainGame->wReplay); mainGame->device->setEventReceiver(&mainGame->menuHandler); } return 0; }
bool ReplayMode::StartDuel() { const ReplayHeader& rh = cur_replay.pheader; mtrandom rnd; int seed = rh.seed; rnd.reset(seed); if(mainGame->dInfo.isTag) { cur_replay.ReadName(mainGame->dInfo.hostname); cur_replay.ReadName(mainGame->dInfo.hostname_tag); cur_replay.ReadName(mainGame->dInfo.clientname_tag); cur_replay.ReadName(mainGame->dInfo.clientname); } else { cur_replay.ReadName(mainGame->dInfo.hostname); cur_replay.ReadName(mainGame->dInfo.clientname); } pduel = create_duel(rnd.rand()); int start_lp = cur_replay.ReadInt32(); int start_hand = cur_replay.ReadInt32(); int draw_count = cur_replay.ReadInt32(); int opt = cur_replay.ReadInt32(); int duel_rule = opt >> 16; mainGame->dInfo.duel_rule = duel_rule; set_player_info(pduel, 0, start_lp, start_hand, draw_count); set_player_info(pduel, 1, start_lp, start_hand, draw_count); mainGame->dInfo.lp[0] = start_lp; mainGame->dInfo.lp[1] = start_lp; myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]); myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]); mainGame->dInfo.turn = 0; if(!mainGame->dInfo.isSingleMode) { if(!(opt & DUEL_TAG_MODE)) { int main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); int extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(0, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(1, main, extra); } else { int main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); int extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(0, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_DECK); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_EXTRA); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(1, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_DECK); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_EXTRA); } } else { char filename[256]; size_t slen = cur_replay.ReadInt16(); cur_replay.ReadData(filename, slen); filename[slen] = 0; if(!preload_script(pduel, filename, 0)) { return false; } } start_duel(pduel, opt); return true; }
bool ReplayMode::StartDuel() { const ReplayHeader& rh = cur_replay.pheader; mtrandom rnd; int seed = rh.seed; rnd.reset(seed); if (mainGame->dInfo.isRelay) { cur_replay.ReadName(mainGame->dInfo.hostname[0]); cur_replay.ReadName(mainGame->dInfo.hostname[1]); cur_replay.ReadName(mainGame->dInfo.hostname[2]); cur_replay.ReadName(mainGame->dInfo.clientname[0]); cur_replay.ReadName(mainGame->dInfo.clientname[1]); cur_replay.ReadName(mainGame->dInfo.clientname[2]); } else if (mainGame->dInfo.isTag) { cur_replay.ReadName(mainGame->dInfo.hostname[0]); cur_replay.ReadName(mainGame->dInfo.hostname[1]); cur_replay.ReadName(mainGame->dInfo.clientname[1]); cur_replay.ReadName(mainGame->dInfo.clientname[0]); } else { cur_replay.ReadName(mainGame->dInfo.hostname[0]); cur_replay.ReadName(mainGame->dInfo.clientname[0]); } pduel = create_duel(rnd.rand()); int start_lp = cur_replay.ReadInt32(); int start_hand = cur_replay.ReadInt32(); int draw_count = cur_replay.ReadInt32(); int opt = cur_replay.ReadInt32(); int duel_rule = opt >> 16; int rule = opt >> 16; //backwards compatibility with master rule replays if (rule) switch (rule) { case 1: { opt |= MASTER_RULE_1; break; } case 2: { opt |= MASTER_RULE_2; break; } case 3: { opt |= MASTER_RULE_3; break; } case 4: { opt |= MASTER_RULE_4; break; } } //pre mr4 replay compatibility if (opt & DUEL_OBSOLETE_RULING) { opt &= ~DUEL_OBSOLETE_RULING; opt |= MASTER_RULE_1; } else if (!(opt & 0xff80)) opt |= MASTER_RULE_3; mainGame->dInfo.duel_field = 2; if ((opt & DUEL_PZONE) && (opt & DUEL_SEPARATE_PZONE) && (opt & DUEL_EMZONE)) mainGame->dInfo.duel_field = 5; else if (opt & DUEL_EMZONE) mainGame->dInfo.duel_field = 4; else if (opt & DUEL_PZONE) mainGame->dInfo.duel_field = 3; mainGame->dInfo.extraval = (opt & SPEED_DUEL) ? 1 : 0; mainGame->SetPhaseButtons(); set_player_info(pduel, 0, start_lp, start_hand, draw_count); set_player_info(pduel, 1, start_lp, start_hand, draw_count); mainGame->dInfo.lp[0] = start_lp; mainGame->dInfo.lp[1] = start_lp; mainGame->dInfo.startlp = start_lp; myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]); myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]); mainGame->dInfo.turn = 0; if (!mainGame->dInfo.isSingleMode) { if (!(opt & DUEL_TAG_MODE)) { int main = cur_replay.ReadInt32(); for (int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); int extra = cur_replay.ReadInt32(); for (int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(0, main, extra); main = cur_replay.ReadInt32(); for (int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); extra = cur_replay.ReadInt32(); for (int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(1, main, extra); } else { int main = cur_replay.ReadInt32(); for (int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); int extra = cur_replay.ReadInt32(); for (int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(0, main, extra); main = cur_replay.ReadInt32(); for (int i = 0; i < main; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_DECK); extra = cur_replay.ReadInt32(); for (int i = 0; i < extra; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_EXTRA); main = cur_replay.ReadInt32(); for (int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); extra = cur_replay.ReadInt32(); for (int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(1, main, extra); main = cur_replay.ReadInt32(); for (int i = 0; i < main; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_DECK); extra = cur_replay.ReadInt32(); for (int i = 0; i < extra; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_EXTRA); } } else { char filename[256]; size_t slen = cur_replay.ReadInt16(); cur_replay.ReadData(filename, slen); filename[slen] = 0; if (!preload_script(pduel, filename, slen)) { return false; } } start_duel(pduel, opt); return true; }
int ReplayMode::ReplayThread(void* param) { const ReplayHeader& rh = cur_replay.pheader; mainGame->dInfo.isFirst = true; mtrandom rnd; int seed = rh.seed; rnd.reset(seed); if(rh.flag & REPLAY_TAG) { cur_replay.ReadData(mainGame->dInfo.hostname, 40); cur_replay.ReadData(mainGame->dInfo.hostname_tag, 40); cur_replay.ReadData(mainGame->dInfo.clientname_tag, 40); cur_replay.ReadData(mainGame->dInfo.clientname, 40); mainGame->dInfo.isTag = true; mainGame->dInfo.tag_player[0] = false; mainGame->dInfo.tag_player[1] = false; } else { cur_replay.ReadData(mainGame->dInfo.hostname, 40); cur_replay.ReadData(mainGame->dInfo.clientname, 40); } set_script_reader(default_script_reader); set_card_reader((card_reader)DataManager::CardReader); set_message_handler((message_handler)MessageHandler); pduel = create_duel(rnd.rand()); int start_lp = cur_replay.ReadInt32(); int start_hand = cur_replay.ReadInt32(); int draw_count = cur_replay.ReadInt32(); int opt = cur_replay.ReadInt32(); set_player_info(pduel, 0, start_lp, start_hand, draw_count); set_player_info(pduel, 1, start_lp, start_hand, draw_count); mainGame->dInfo.lp[0] = start_lp; mainGame->dInfo.lp[1] = start_lp; myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]); myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]); mainGame->dInfo.turn = 0; if(!(opt & DUEL_TAG_MODE)) { int main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); int extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(0, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(1, main, extra); } else { int main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); int extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(0, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_DECK); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_EXTRA); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(1, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_DECK); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_EXTRA); } start_duel(pduel, opt); ReplayRefreshDeck(0); ReplayRefreshDeck(1); ReplayRefreshExtra(0); ReplayRefreshExtra(1); mainGame->dInfo.isStarted = true; mainGame->dInfo.isReplay = true; char engineBuffer[0x1000]; is_continuing = true; exit_pending = false; current_step = 0; skip_step = 0; if(skip_turn < 0) skip_turn = 0; if(skip_turn) { mainGame->dInfo.isReplaySkiping = true; mainGame->gMutex.Lock(); } else mainGame->dInfo.isReplaySkiping = false; int len = 0; while (is_continuing && !exit_pending) { int result = process(pduel); len = result & 0xffff; /*int flag = result >> 16;*/ if (len > 0) { get_message(pduel, (byte*)engineBuffer); is_continuing = ReplayAnalyze(engineBuffer, len); } } if(mainGame->dInfo.isReplaySkiping) { mainGame->dInfo.isReplaySkiping = false; mainGame->dField.RefreshAllCards(); mainGame->gMutex.Unlock(); } end_duel(pduel); if(!is_closing) { mainGame->actionSignal.Reset(); mainGame->gMutex.Lock(); mainGame->stMessage->setText(dataManager.GetSysString(1501)); if(mainGame->wCardSelect->isVisible()) mainGame->HideElement(mainGame->wCardSelect); mainGame->PopupElement(mainGame->wMessage); mainGame->gMutex.Unlock(); mainGame->actionSignal.Wait(); mainGame->gMutex.Lock(); mainGame->dInfo.isStarted = false; mainGame->dInfo.isReplay = false; mainGame->gMutex.Unlock(); mainGame->closeDoneSignal.Reset(); mainGame->closeSignal.Set(); mainGame->closeDoneSignal.Wait(); mainGame->gMutex.Lock(); mainGame->ShowElement(mainGame->wReplay); mainGame->device->setEventReceiver(&mainGame->menuHandler); mainGame->gMutex.Unlock(); if(exit_on_return) mainGame->device->closeDevice(); } return 0; }
void ReplayMode::Restart(bool refresh) { end_duel(pduel); mainGame->dInfo.isStarted = false; mainGame->dField.panel = 0; mainGame->dField.hovered_card = 0; mainGame->dField.clicked_card = 0; mainGame->dField.Clear(); //mainGame->device->setEventReceiver(&mainGame->dField); cur_replay.Rewind(); const ReplayHeader& rh = cur_replay.pheader; //mainGame->dInfo.isFirst = true; mtrandom rnd; int seed = rh.seed; rnd.reset(seed); if(rh.flag & REPLAY_TAG) { cur_replay.ReadData(mainGame->dInfo.hostname, 40); cur_replay.ReadData(mainGame->dInfo.hostname_tag, 40); cur_replay.ReadData(mainGame->dInfo.clientname_tag, 40); cur_replay.ReadData(mainGame->dInfo.clientname, 40); mainGame->dInfo.isTag = true; mainGame->dInfo.tag_player[0] = false; mainGame->dInfo.tag_player[1] = false; } else { cur_replay.ReadData(mainGame->dInfo.hostname, 40); cur_replay.ReadData(mainGame->dInfo.clientname, 40); } //set_card_reader((card_reader)DataManager::CardReader); //set_message_handler((message_handler)MessageHandler); pduel = create_duel(rnd.rand()); int start_lp = cur_replay.ReadInt32(); int start_hand = cur_replay.ReadInt32(); int draw_count = cur_replay.ReadInt32(); int opt = cur_replay.ReadInt32(); set_player_info(pduel, 0, start_lp, start_hand, draw_count); set_player_info(pduel, 1, start_lp, start_hand, draw_count); mainGame->dInfo.lp[0] = start_lp; mainGame->dInfo.lp[1] = start_lp; myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]); myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]); mainGame->dInfo.turn = 0; if(!(opt & DUEL_TAG_MODE)) { int main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); int extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(0, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(1, main, extra); } else { int main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); int extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(0, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_DECK); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_EXTRA); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); mainGame->dField.Initial(1, main, extra); main = cur_replay.ReadInt32(); for(int i = 0; i < main; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_DECK); extra = cur_replay.ReadInt32(); for(int i = 0; i < extra; ++i) new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_EXTRA); } start_duel(pduel, opt); if(refresh) { mainGame->dField.RefreshAllCards(); mainGame->dInfo.isStarted = true; //mainGame->dInfo.isReplay = true; } skip_turn = 0; is_restarting = true; }
void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { if(dp->state != CTOS_TP_RESULT) return; bool swapped = false; mtrandom rnd; pplayer[0] = players[0]; pplayer[1] = players[1]; if((tp && dp->type == 1) || (!tp && dp->type == 0)) { DuelPlayer* p = players[0]; players[0] = players[1]; players[1] = p; players[0]->type = 0; players[1]->type = 1; Deck d = pdeck[0]; pdeck[0] = pdeck[1]; pdeck[1] = d; swapped = true; } dp->state = CTOS_RESPONSE; ReplayHeader rh; rh.id = 0x31707279; rh.version = PRO_VERSION; rh.flag = 0; time_t seed = time(0); rh.seed = seed; last_replay.BeginRecord(); last_replay.WriteHeader(rh); rnd.reset(seed); last_replay.WriteData(players[0]->name, 40, false); last_replay.WriteData(players[1]->name, 40, false); if(!host_info.no_shuffle_deck) { for(size_t i = pdeck[0].main.size() - 1; i > 0; --i) { int swap = rnd.real() * (i + 1); std::swap(pdeck[0].main[i], pdeck[0].main[swap]); } for(size_t i = pdeck[1].main.size() - 1; i > 0; --i) { int swap = rnd.real() * (i + 1); std::swap(pdeck[1].main[i], pdeck[1].main[swap]); } } time_limit[0] = host_info.time_limit; time_limit[1] = host_info.time_limit; set_card_reader((card_reader)DataManager::CardReader); set_message_handler((message_handler)SingleDuel::MessageHandler); rnd.reset(seed); pduel = create_duel(rnd.rand()); set_player_info(pduel, 0, host_info.start_lp, host_info.start_hand, host_info.draw_count); set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count); int opt = 0; if(host_info.enable_priority) opt |= DUEL_OBSOLETE_RULING; if(host_info.no_shuffle_deck) opt |= DUEL_PSEUDO_SHUFFLE; last_replay.WriteInt32(host_info.start_lp, false); last_replay.WriteInt32(host_info.start_hand, false); last_replay.WriteInt32(host_info.draw_count, false); last_replay.WriteInt32(opt, false); last_replay.Flush(); last_replay.WriteInt32(pdeck[0].main.size(), false); for(int32 i = (int32)pdeck[0].main.size() - 1; i >= 0; --i) { new_card(pduel, pdeck[0].main[i]->first, 0, 0, LOCATION_DECK, 0, 0); last_replay.WriteInt32(pdeck[0].main[i]->first, false); } last_replay.WriteInt32(pdeck[0].extra.size(), false); for(int32 i = (int32)pdeck[0].extra.size() - 1; i >= 0; --i) { new_card(pduel, pdeck[0].extra[i]->first, 0, 0, LOCATION_EXTRA, 0, 0); last_replay.WriteInt32(pdeck[0].extra[i]->first, false); } last_replay.WriteInt32(pdeck[1].main.size(), false); for(int32 i = (int32)pdeck[1].main.size() - 1; i >= 0; --i) { new_card(pduel, pdeck[1].main[i]->first, 1, 1, LOCATION_DECK, 0, 0); last_replay.WriteInt32(pdeck[1].main[i]->first, false); } last_replay.WriteInt32(pdeck[1].extra.size(), false); for(int32 i = (int32)pdeck[1].extra.size() - 1; i >= 0; --i) { new_card(pduel, pdeck[1].extra[i]->first, 1, 1, LOCATION_EXTRA, 0, 0); last_replay.WriteInt32(pdeck[1].extra[i]->first, false); } last_replay.Flush(); char startbuf[32], *pbuf = startbuf; BufferIO::WriteInt8(pbuf, MSG_START); BufferIO::WriteInt8(pbuf, 0); BufferIO::WriteInt32(pbuf, host_info.start_lp); BufferIO::WriteInt32(pbuf, host_info.start_lp); BufferIO::WriteInt16(pbuf, query_field_count(pduel, 0, 0x1)); BufferIO::WriteInt16(pbuf, query_field_count(pduel, 0, 0x40)); BufferIO::WriteInt16(pbuf, query_field_count(pduel, 1, 0x1)); BufferIO::WriteInt16(pbuf, query_field_count(pduel, 1, 0x40)); NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, startbuf, 18); startbuf[1] = 1; NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, startbuf, 18); if(!swapped) startbuf[1] = 0x10; else startbuf[1] = 0x11; for(auto oit = observers.begin(); oit != observers.end(); ++oit) NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18); RefreshExtra(0); RefreshExtra(1); start_duel(pduel, opt); Process(); }
CliqueTree Inference::CreateCliqueTreeHMMFast( vector<Factor> factors ) { int maxVar = 0; // get the max var id for ( vector<Factor>::iterator iter = factors.begin(); iter != factors.end(); iter ++ ) { double max_now = iter->var.max(); if ( max_now > maxVar ) { maxVar = max_now; } } int numNodes = maxVar - 1; int card = factors[0].card(0); CliqueTree P(numNodes); //P.cliqueList = repmat(struct('var', [], 'card', [], 'val', []), numNodes, 1); //P.edges = zeros(numNodes); for ( int i = 0; i != numNodes; i++ ) { P.cliqueList[i].var << i+1 << i+2; P.cliqueList[i].card << card << card; P.cliqueList[i].val = ones<vec>(card * card); if (i > 0) { P.edges(i, i-1) = 1; P.edges(i-1, i) = 1; } } // the name of the variable starts from 1 !!!! for ( int i = 0; i != factors.size(); i ++ ) { Factor f = factors[i]; int cliqueIdx = 0; if (f.var.n_rows == 1) { if (f.var(0) > 1) { cliqueIdx = f.var(0) - 1; }else{ cliqueIdx = 1; } vec updateIdxs; mat assignments = zeros<mat>(card, 2); vec cards; cards << card << card; for ( int assignment = 0; assignment != card; assignment ++ ) { if (f.var(0) == cliqueIdx) { assignments.col(0) = linspace<vec>(0, card - 1, card); assignments.col(1) = assignment*ones<vec>(card); updateIdxs = Utils::AssignmentToIndex(assignments, cards); }else{ assignments.col(1) = linspace<vec>(0, card - 1, card); assignments.col(0) = assignment*ones<vec>(card); updateIdxs = Utils::AssignmentToIndex(assignments, cards); } for (int step = 0; step != updateIdxs.n_rows; step ++) { P.cliqueList[cliqueIdx - 1].val(updateIdxs(step)) += f.val(step); } } }else{ if ( f.var.n_rows != 2 ) { std::cout << "ERROR: var more than 2!" << std::endl; } cliqueIdx = min(f.var); if (f.var(0) > f.var(1)) { // % sort the factor val so it's in increasing var order uvec order = sort_index(f.var); //%#ok mat oldAssignments = Utils::IndexToAssignment(linspace<vec>(0,f.val.n_rows-1,f.val.n_rows), f.card); mat newAssignments = oldAssignments; // (:, order) for (int step = 0; step != oldAssignments.n_cols; step ++) { newAssignments.col(step) = oldAssignments.col(order(step)); } vec new_card = f.card; for (int step = 0; step != f.card.n_rows; step ++) { new_card(step) = f.card(order(step)); } f.card = new_card; f.var = sort(f.var); vec new_index = Utils::AssignmentToIndex(newAssignments, f.card); vec new_val = f.val; for ( int step = 0; step != f.val.n_rows; step ++ ) { new_val(step) = f.val( new_index(step) ); } f.val = new_val; } P.cliqueList[cliqueIdx - 1].val += f.val; } } return P; }
int load_cards() { //Load all paths from images for each card and store them in char * arrays const char * card_path1[] = { "/usr/src/drivers/proj/images/image_b1.mg", "/usr/src/drivers/proj/images/image_b2.mg", "/usr/src/drivers/proj/images/image_b3.mg", "/usr/src/drivers/proj/images/image_b4.mg", "/usr/src/drivers/proj/images/image_b5.mg", "/usr/src/drivers/proj/images/image_b6.mg", "/usr/src/drivers/proj/images/image_1a.mg", "/usr/src/drivers/proj/images/image_1aa.mg", "/usr/src/drivers/proj/images/image_1aaa.mg", "/usr/src/drivers/proj/images/image_1b.mg", "/usr/src/drivers/proj/images/image_1c.mg" }; const char * card_path2[] = { "/usr/src/drivers/proj/images/image_b1.mg", "/usr/src/drivers/proj/images/image_b2.mg", "/usr/src/drivers/proj/images/image_b3.mg", "/usr/src/drivers/proj/images/image_b4.mg", "/usr/src/drivers/proj/images/image_b5.mg", "/usr/src/drivers/proj/images/image_b6.mg", "/usr/src/drivers/proj/images/image_2a.mg", "/usr/src/drivers/proj/images/image_2aa.mg", "/usr/src/drivers/proj/images/image_2aaa.mg", "/usr/src/drivers/proj/images/image_2b.mg", "/usr/src/drivers/proj/images/image_2c.mg" }; const char * card_path3[] = { "/usr/src/drivers/proj/images/image_b1.mg", "/usr/src/drivers/proj/images/image_b2.mg", "/usr/src/drivers/proj/images/image_b3.mg", "/usr/src/drivers/proj/images/image_b4.mg", "/usr/src/drivers/proj/images/image_b5.mg", "/usr/src/drivers/proj/images/image_b6.mg", "/usr/src/drivers/proj/images/image_3a.mg", "/usr/src/drivers/proj/images/image_3aa.mg", "/usr/src/drivers/proj/images/image_3aaa.mg", "/usr/src/drivers/proj/images/image_3b.mg", "/usr/src/drivers/proj/images/image_3c.mg" }; const char * card_path4[] = { "/usr/src/drivers/proj/images/image_b1.mg", "/usr/src/drivers/proj/images/image_b2.mg", "/usr/src/drivers/proj/images/image_b3.mg", "/usr/src/drivers/proj/images/image_b4.mg", "/usr/src/drivers/proj/images/image_b5.mg", "/usr/src/drivers/proj/images/image_b6.mg", "/usr/src/drivers/proj/images/image_4a.mg", "/usr/src/drivers/proj/images/image_4aa.mg", "/usr/src/drivers/proj/images/image_4aaa.mg", "/usr/src/drivers/proj/images/image_4b.mg", "/usr/src/drivers/proj/images/image_4c.mg" }; const char * card_path5[] = { "/usr/src/drivers/proj/images/image_b1.mg", "/usr/src/drivers/proj/images/image_b2.mg", "/usr/src/drivers/proj/images/image_b3.mg", "/usr/src/drivers/proj/images/image_b4.mg", "/usr/src/drivers/proj/images/image_b5.mg", "/usr/src/drivers/proj/images/image_b6.mg", "/usr/src/drivers/proj/images/image_5a.mg", "/usr/src/drivers/proj/images/image_5aa.mg", "/usr/src/drivers/proj/images/image_5aaa.mg", "/usr/src/drivers/proj/images/image_5b.mg", "/usr/src/drivers/proj/images/image_5c.mg" }; //Create all cards new_card(&a1, 150, 220, card_path1, 0, 0, 1); new_card(&a2, 150, 220, card_path2, 0, 0, 2); new_card(&a3, 150, 220, card_path3, 0, 0, 3); new_card(&a4, 150, 220, card_path4, 0, 0, 4); new_card(&a5, 150, 220, card_path5, 0, 0, 5); new_card(&a6, 150, 220, card_path1, 0, 0, 1); new_card(&a7, 150, 220, card_path2, 0, 0, 2); new_card(&a8, 150, 220, card_path3, 0, 0, 3); new_card(&a9, 150, 220, card_path4, 0, 0, 4); new_card(&a10, 150, 220, card_path5, 0, 0, 5); card * cards[] = { &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, &a9, &a10 }; //Create cards positions int xpos[10] = { 50, 240, 430, 620, 810, 50, 240, 430, 620, 810 }; int ypos[10] = { 155, 155, 155, 155, 155, 415, 415, 415, 415, 415 }; //Create new deck new_deck(&d1, 10, cards, 3, xpos, ypos); }