//================================================================================================= void Quest_DeliverParcel::SetProgress(int prog2) { bool apply = true; switch(prog2) { case Progress::Started: // give parcel to player { Location& loc = *game->locations[end_loc]; const Item* base_item = FindItem("parcel"); game->PreloadItem(base_item); CreateItemCopy(parcel, base_item); parcel.id = "$parcel"; parcel.name = Format(game->txQuest[8], LocationHelper::IsCity(loc) ? game->txForMayor : game->txForSoltys, loc.name.c_str()); parcel.refid = refid; game->current_dialog->pc->unit->AddItem(&parcel, 1, true); start_time = game->worldtime; state = Quest::Started; name = game->txQuest[9]; quest_index = quest_manager.quests.size(); quest_manager.quests.push_back(this); RemoveElement<Quest*>(quest_manager.unaccepted_quests, this); quest_manager.quests_timeout2.push_back(this); Location& loc2 = *game->locations[start_loc]; msgs.push_back(Format(game->txQuest[3], LocationHelper::IsCity(loc2) ? game->txForMayor : game->txForSoltys, loc2.name.c_str(), game->day + 1, game->month + 1, game->year)); msgs.push_back(Format(game->txQuest[10], LocationHelper::IsCity(loc) ? game->txForMayor : game->txForSoltys, loc.name.c_str(), GetLocationDirName(loc2.pos, loc.pos))); game->game_gui->journal->NeedUpdate(Journal::Quests, quest_index); game->AddGameMsg3(GMS_JOURNAL_UPDATED); if(Rand() % 4 != 0) { Encounter* e = game->AddEncounter(enc); e->pos = (loc.pos + loc2.pos) / 2; e->zasieg = 64; e->szansa = 45; e->dont_attack = true; e->dialog = FindDialog("q_deliver_parcel_bandits"); e->grupa = SG_BANDYCI; e->text = game->txQuest[11]; e->quest = this; e->timed = true; e->location_event_handler = nullptr; } if(Net::IsOnline()) { game->Net_AddQuest(refid); game->Net_RegisterItem(&parcel, base_item); if(!game->current_dialog->is_local) { game->Net_AddItem(game->current_dialog->pc, &parcel, true); game->Net_AddedItemMsg(game->current_dialog->pc); } else game->AddGameMsg3(GMS_ADDED_ITEM); } else game->AddGameMsg3(GMS_ADDED_ITEM); } break; case Progress::DeliverAfterTime: // player failed to deliver parcel in time, but gain some gold anyway { state = Quest::Failed; ((City*)game->locations[start_loc])->quest_mayor = CityQuestState::Failed; game->current_dialog->pc->unit->RemoveQuestItem(refid); game->AddReward(125); msgs.push_back(game->txQuest[12]); game->game_gui->journal->NeedUpdate(Journal::Quests, quest_index); game->AddGameMsg3(GMS_JOURNAL_UPDATED); RemoveElementTry(quest_manager.quests_timeout2, (Quest*)this); RemoveEncounter(); if(Net::IsOnline()) { game->Net_UpdateQuest(refid); if(!game->current_dialog->is_local) game->Net_RemoveQuestItem(game->current_dialog->pc, refid); } } break; case Progress::Timeout: // player failed to deliver parcel in time { state = Quest::Failed; ((City*)game->locations[start_loc])->quest_mayor = CityQuestState::Failed; msgs.push_back(game->txQuest[13]); game->game_gui->journal->NeedUpdate(Journal::Quests, quest_index); game->AddGameMsg3(GMS_JOURNAL_UPDATED); RemoveElementTry(quest_manager.quests_timeout2, (Quest*)this); RemoveEncounter(); if(Net::IsOnline()) game->Net_UpdateQuest(refid); } break; case Progress::Finished: // parcel delivered, end of quest { state = Quest::Completed; ((City*)game->locations[start_loc])->quest_mayor = CityQuestState::None; game->current_dialog->pc->unit->RemoveQuestItem(refid); game->AddReward(250); RemoveEncounter(); msgs.push_back(game->txQuest[14]); game->game_gui->journal->NeedUpdate(Journal::Quests, quest_index); game->AddGameMsg3(GMS_JOURNAL_UPDATED); RemoveElementTry(quest_manager.quests_timeout2, (Quest*)this); if(Net::IsOnline()) { game->Net_UpdateQuest(refid); if(!game->current_dialog->is_local) game->Net_RemoveQuestItem(game->current_dialog->pc, refid); } } break; case Progress::AttackedBandits: // don't giver parcel to bandits, get attacked { RemoveEncounter(); apply = false; msgs.push_back(game->txQuest[15]); game->game_gui->journal->NeedUpdate(Journal::Quests, quest_index); game->AddGameMsg3(GMS_JOURNAL_UPDATED); if(Net::IsOnline()) game->Net_UpdateQuest(refid); } break; case Progress::ParcelGivenToBandits: // give parcel to bandits { RemoveEncounter(); game->current_dialog->talker->AddItem(&parcel, 1, true); game->RemoveQuestItem(&parcel, refid); msgs.push_back(game->txQuest[16]); game->game_gui->journal->NeedUpdate(Journal::Quests, quest_index); game->AddGameMsg3(GMS_JOURNAL_UPDATED); if(Net::IsOnline()) game->Net_UpdateQuest(refid); } break; case Progress::NoParcelAttackedBandits: // no parcel, attacked by bandits apply = false; RemoveEncounter(); break; } if(apply) prog = prog2; }
//================================================================================================= void Quest_SpreadNews::SetProgress(int prog2) { switch(prog2) { case Progress::Started: // told info to spread by player { OnStart(game->txQuest[213]); QM.quests_timeout2.push_back(this); prog = Progress::Started; Location& loc = GetStartLocation(); bool is_city = LocationHelper::IsCity(loc); msgs.push_back(Format(game->txQuest[3], is_city ? game->txForMayor : game->txForSoltys, loc.name.c_str(), W.GetDate())); msgs.push_back(Format(game->txQuest[17], Upper(is_city ? game->txForMayor : game->txForSoltys), loc.name.c_str(), FormatString("targets"))); } break; case Progress::Deliver: // player told news to mayor { uint count = 0; for(vector<Entry>::iterator it = entries.begin(), end = entries.end(); it != end; ++it) { if(W.GetCurrentLocationIndex() == it->location) { it->given = true; ++count; } else if(it->given) ++count; } Location& loc = *W.GetCurrentLocation(); cstring msg = Format(game->txQuest[18], LocationHelper::IsCity(loc) ? game->txForMayor : game->txForSoltys, loc.name.c_str()); if(count == entries.size()) { prog = Progress::Deliver; OnUpdate({ msg, Format(game->txQuest[19], GetStartLocationName()) }); } else OnUpdate(msg); RemoveElementTry(QM.quests_timeout2, static_cast<Quest*>(this)); } break; case Progress::Timeout: // player failed to spread news in time { prog = Progress::Timeout; state = Quest::Failed; ((City&)GetStartLocation()).quest_mayor = CityQuestState::Failed; OnUpdate(game->txQuest[20]); } break; case Progress::Finished: // player spread news to all mayors, end of quest { prog = Progress::Finished; state = Quest::Completed; ((City&)GetStartLocation()).quest_mayor = CityQuestState::None; Team.AddReward(500, 2000); OnUpdate(game->txQuest[21]); } break; } }