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; }
int SingleMode::SinglePlayThread(void* param) { const wchar_t* name = mainGame->lstSinglePlayList->getListItem(mainGame->lstSinglePlayList->getSelected()); wchar_t fname[256]; myswprintf(fname, L"./single/%ls", name); char fname2[256]; size_t slen = BufferIO::EncodeUTF8(fname, fname2); mtrandom rnd; time_t seed = time(0); rnd.reset(seed); set_card_reader((card_reader)DataManager::CardReader); set_message_handler((message_handler)MessageHandler); pduel = create_duel(rnd.rand()); set_player_info(pduel, 0, 8000, 5, 1); set_player_info(pduel, 1, 8000, 5, 1); mainGame->dInfo.lp[0] = 8000; mainGame->dInfo.lp[1] = 8000; myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]); myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]); BufferIO::CopyWStr(mainGame->ebNickName->getText(), mainGame->dInfo.hostname, 20); mainGame->dInfo.clientname[0] = 0; mainGame->dInfo.turn = 0; mainGame->dInfo.strTurn[0] = 0; if(!preload_script(pduel, fname2, slen)) { end_duel(pduel); return 0; } mainGame->gMutex.Lock(); mainGame->HideElement(mainGame->wSinglePlay); mainGame->wCardImg->setVisible(true); mainGame->wInfos->setVisible(true); mainGame->btnLeaveGame->setVisible(true); mainGame->btnLeaveGame->setText(dataManager.GetSysString(1210)); mainGame->stName->setText(L""); mainGame->stInfo->setText(L""); mainGame->stDataInfo->setText(L""); mainGame->stText->setText(L""); mainGame->scrCardText->setVisible(false); mainGame->wPhase->setVisible(true); mainGame->dField.panel = 0; mainGame->dField.hovered_card = 0; mainGame->dField.clicked_card = 0; mainGame->dField.Clear(); mainGame->dInfo.isFirst = true; mainGame->dInfo.isStarted = true; mainGame->dInfo.isSingleMode = true; mainGame->device->setEventReceiver(&mainGame->dField); mainGame->gMutex.Unlock(); start_duel(pduel, 0); char engineBuffer[0x1000]; is_closing = false; is_continuing = true; int len = 0; while (is_continuing) { int result = process(pduel); len = result & 0xffff; /* int flag = result >> 16; */ if (len > 0) { get_message(pduel, (byte*)engineBuffer); is_continuing = SinglePlayAnalyze(engineBuffer, len); } } end_duel(pduel); if(!is_closing) { mainGame->gMutex.Lock(); mainGame->dInfo.isStarted = false; mainGame->dInfo.isSingleMode = false; mainGame->gMutex.Unlock(); mainGame->closeDoneSignal.Reset(); mainGame->closeSignal.Set(); mainGame->closeDoneSignal.Wait(); mainGame->gMutex.Lock(); mainGame->ShowElement(mainGame->wSinglePlay); mainGame->device->setEventReceiver(&mainGame->menuHandler); mainGame->gMutex.Unlock(); } return 0; }
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; }