//================================================================================================= cstring Quest_Orcs2::FormatString(const string& str) { if(str == "name") return orc->hero->name.c_str(); else if(str == "close") return W.GetLocation(near_loc)->name.c_str(); else if(str == "close_dir") return GetLocationDirName(W.GetLocation(near_loc)->pos, GetTargetLocation().pos); else if(str == "target_loc") return GetTargetLocationName(); else if(str == "target_dir") return GetLocationDirName(W.GetWorldPos(), GetTargetLocation().pos); else { assert(0); return nullptr; } }
//================================================================================================= cstring Quest_StolenArtifact::FormatString(const string& str) { if(str == "przedmiot") return item->name.c_str(); else if(str == "target_loc") return game->locations[target_loc]->name.c_str(); else if(str == "target_dir") return GetLocationDirName(game->locations[start_loc]->pos, game->locations[target_loc]->pos); else if(str == "random_loc") return game->locations[game->GetRandomSettlement(start_loc)]->name.c_str(); else if(str == "Bandyci_ukradli") { switch(group) { case SG_BANDYCI: return game->txQuest[96]; case SG_ORKOWIE: return game->txQuest[97]; case SG_GOBLINY: return game->txQuest[98]; case SG_MAGOWIE: return game->txQuest[99]; case SG_ZLO: return game->txQuest[100]; default: assert(0); return nullptr; } } else if(str == "Ci_bandyci") { switch(group) { case SG_BANDYCI: return game->txQuest[101]; case SG_ORKOWIE: return game->txQuest[102]; case SG_GOBLINY: return game->txQuest[103]; case SG_MAGOWIE: return game->txQuest[104]; case SG_ZLO: return game->txQuest[105]; default: assert(0); return nullptr; } } else { assert(0); return nullptr; } }
//================================================================================================= cstring Quest_DeliverParcel::FormatString(const string& str) { Location& loc = *game->locations[end_loc]; if(str == "target_burmistrza") return (LocationHelper::IsCity(loc) ? game->txForMayor : game->txForSoltys); else if(str == "target_locname") return loc.name.c_str(); else if(str == "target_dir") return GetLocationDirName(game->locations[start_loc]->pos, loc.pos); else { assert(0); return nullptr; } }
//================================================================================================= void Quest_StolenArtifact::SetProgress(int prog2) { prog = prog2; switch(prog2) { case Progress::Started: { start_time = game->worldtime; state = Quest::Started; name = game->txQuest[86]; CreateItemCopy(quest_item, item); quest_item.id = Format("$%s", item->id.c_str()); quest_item.refid = refid; spawn_item = Quest_Dungeon::Item_GiveSpawned; item_to_give[0] = &quest_item; unit_to_spawn = g_spawn_groups[group].GetSpawnLeader(); unit_spawn_level = -3; Location& sl = *game->locations[start_loc]; target_loc = game->GetRandomSpawnLocation(sl.pos, group); Location& tl = *game->locations[target_loc]; at_level = tl.GetRandomLevel(); tl.active_quest = this; bool now_known = false; if(tl.state == LS_UNKNOWN) { tl.state = LS_KNOWN; now_known = true; } cstring kto; switch(group) { case SG_BANDYCI: kto = game->txQuest[87]; break; case SG_GOBLINY: kto = game->txQuest[88]; break; case SG_ORKOWIE: kto = game->txQuest[89]; break; case SG_MAGOWIE: kto = game->txQuest[90]; break; case SG_ZLO: kto = game->txQuest[91]; break; default: kto = game->txQuest[92]; break; } quest_index = quest_manager.quests.size(); quest_manager.quests.push_back(this); quest_manager.quests_timeout.push_back(this); RemoveElement<Quest*>(quest_manager.unaccepted_quests, this); game->current_dialog->talker->temporary = false; msgs.push_back(Format(game->txQuest[82], sl.name.c_str(), game->day + 1, game->month + 1, game->year)); msgs.push_back(Format(game->txQuest[93], item->name.c_str(), kto, tl.name.c_str(), GetLocationDirName(sl.pos, tl.pos))); game->game_gui->journal->NeedUpdate(Journal::Quests, quest_index); game->AddGameMsg3(GMS_JOURNAL_UPDATED); if(Net::IsOnline()) { game->Net_AddQuest(refid); game->Net_RegisterItem(&quest_item, item); if(now_known) game->Net_ChangeLocationState(target_loc, false); } } break; case Progress::Finished: { state = Quest::Completed; if(target_loc != -1) { Location& loc = *game->locations[target_loc]; if(loc.active_quest == this) loc.active_quest = nullptr; } RemoveElementTry<Quest_Dungeon*>(quest_manager.quests_timeout, this); msgs.push_back(game->txQuest[94]); game->AddReward(1200); game->game_gui->journal->NeedUpdate(Journal::Quests, quest_index); game->AddGameMsg3(GMS_JOURNAL_UPDATED); game->current_dialog->talker->temporary = true; game->current_dialog->talker->AddItem(&quest_item, 1, true); game->current_dialog->pc->unit->RemoveQuestItem(refid); 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: { state = Quest::Failed; if(target_loc != -1) { Location& loc = *game->locations[target_loc]; if(loc.active_quest == this) loc.active_quest = nullptr; } RemoveElementTry<Quest_Dungeon*>(quest_manager.quests_timeout, this); msgs.push_back(game->txQuest[95]); game->game_gui->journal->NeedUpdate(Journal::Quests, quest_index); game->AddGameMsg3(GMS_JOURNAL_UPDATED); game->current_dialog->talker->temporary = true; if(Net::IsOnline()) game->Net_UpdateQuest(refid); } break; } }
//================================================================================================= void Quest_Orcs2::SetProgress(int prog2) { bool apply = true; switch(prog2) { case Progress::TalkedOrc: // zapisz gorusha { orc = DialogContext::current->talker; orc->RevealName(true); } break; case Progress::NotJoined: break; case Progress::Joined: // dodaj questa { OnStart(game->txQuest[214]); msgs.push_back(Format(game->txQuest[170], W.GetDate())); msgs.push_back(game->txQuest[197]); // ustaw stan if(orcs_state == Quest_Orcs2::State::Accepted) orcs_state = Quest_Orcs2::State::OrcJoined; else { orcs_state = Quest_Orcs2::State::CompletedJoined; days = Random(30, 60); QM.quest_orcs->GetTargetLocation().active_quest = nullptr; QM.quest_orcs->target_loc = -1; } // do³¹cz do dru¿yny DialogContext::current->talker->dont_attack = false; Team.AddTeamMember(DialogContext::current->talker, true); if(Team.free_recruits > 0) --Team.free_recruits; } break; case Progress::TalkedAboutCamp: // powiedzia³ o obozie { target_loc = W.CreateCamp(W.GetWorldPos(), SG_ORCS, 256.f, false); Location& target = GetTargetLocation(); target.state = LS_HIDDEN; target.st = 11; target.active_quest = this; near_loc = W.GetNearestSettlement(target.pos); OnUpdate(game->txQuest[198]); orcs_state = Quest_Orcs2::State::ToldAboutCamp; } break; case Progress::TalkedWhereIsCamp: // powiedzia³ gdzie obóz { if(prog == Progress::TalkedWhereIsCamp) break; Location& target = GetTargetLocation(); Location& nearl = *W.GetLocation(near_loc); target.SetKnown(); done = false; location_event_handler = this; OnUpdate(Format(game->txQuest[199], GetLocationDirName(nearl.pos, target.pos), nearl.name.c_str())); } break; case Progress::ClearedCamp: // oczyszczono obóz orków { orc->StartAutoTalk(); W.AddNews(game->txQuest[200]); Team.AddExp(14000); } break; case Progress::TalkedAfterClearingCamp: // pogada³ po oczyszczeniu { orcs_state = Quest_Orcs2::State::CampCleared; days = Random(25, 50); GetTargetLocation().active_quest = nullptr; target_loc = -1; OnUpdate(game->txQuest[201]); } break; case Progress::SelectWarrior: // zostañ wojownikiem apply = false; ChangeClass(OrcClass::Warrior); break; case Progress::SelectHunter: // zostañ ³owc¹ apply = false; ChangeClass(OrcClass::Hunter); break; case Progress::SelectShaman: // zostañ szamanem apply = false; ChangeClass(OrcClass::Shaman); break; case Progress::SelectRandom: // losowo { OrcClass clas; if(DialogContext::current->pc->unit->GetClass() == Class::WARRIOR) { if(Rand() % 2 == 0) clas = OrcClass::Hunter; else clas = OrcClass::Shaman; } else if(DialogContext::current->pc->unit->GetClass() == Class::HUNTER) { if(Rand() % 2 == 0) clas = OrcClass::Warrior; else clas = OrcClass::Shaman; } else { int co = Rand() % 3; if(co == 0) clas = OrcClass::Warrior; else if(co == 1) clas = OrcClass::Hunter; else clas = OrcClass::Shaman; } apply = false; ChangeClass(clas); } break; case Progress::TalkedAboutBase: // pogada³ o bazie { done = false; Location& target = *W.CreateLocation(L_DUNGEON, W.GetWorldPos(), 256.f, THRONE_FORT, SG_ORCS, false); target.st = 15; target.active_quest = this; target.state = LS_HIDDEN; target_loc = target.index; OnUpdate(game->txQuest[202]); orcs_state = State::ToldAboutBase; } break; case Progress::TalkedWhereIsBase: // powiedzia³ gdzie baza { Location& target = GetTargetLocation(); target.SetKnown(); unit_to_spawn = UnitData::Get("q_orkowie_boss"); spawn_unit_room = RoomTarget::Throne; callback = WarpToThroneOrcBoss; at_level = target.GetLastLevel(); location_event_handler = nullptr; unit_event_handler = this; near_loc = W.GetNearestSettlement(target.pos); Location& nearl = *W.GetLocation(near_loc); OnUpdate(Format(game->txQuest[203], GetLocationDirName(nearl.pos, target.pos), nearl.name.c_str(), target.name.c_str())); done = false; orcs_state = State::GenerateOrcs; } break; case Progress::KilledBoss: // zabito bossa { orc->StartAutoTalk(); OnUpdate(game->txQuest[204]); W.AddNews(game->txQuest[205]); Team.AddLearningPoint(); } break; case Progress::Finished: // pogadano z gorushem { state = Quest::Completed; Team.AddReward(Random(9000, 11000), 25000); OnUpdate(game->txQuest[206]); QM.EndUniqueQuest(); // gorush Team.RemoveTeamMember(orc); Usable* tron = L.local_ctx.FindUsable("throne"); assert(tron); if(tron) { orc->ai->idle_action = AIController::Idle_WalkUse; orc->ai->idle_data.usable = tron; orc->ai->timer = 9999.f; } orc = nullptr; // orki UnitData* ud[12] = { UnitData::Get("orc"), UnitData::Get("q_orkowie_orc"), UnitData::Get("orc_fighter"), UnitData::Get("q_orkowie_orc_fighter"), UnitData::Get("orc_warius"), UnitData::Get("q_orkowie_orc_warius"), UnitData::Get("orc_hunter"), UnitData::Get("q_orkowie_orc_hunter"), UnitData::Get("orc_shaman"), UnitData::Get("q_orkowie_orc_shaman"), UnitData::Get("orc_chief"), UnitData::Get("q_orkowie_orc_chief") }; UnitData* ud_slaby = UnitData::Get("q_orkowie_slaby"); for(vector<Unit*>::iterator it = L.local_ctx.units->begin(), end = L.local_ctx.units->end(); it != end; ++it) { Unit& u = **it; if(u.IsAlive()) { if(u.data == ud_slaby) { // usuñ dont_attack, od tak :3 u.dont_attack = false; u.ai->change_ai_mode = true; } else { for(int i = 0; i < 6; ++i) { if(u.data == ud[i * 2]) { u.data = ud[i * 2 + 1]; u.ai->target = nullptr; u.ai->alert_target = nullptr; u.ai->state = AIController::Idle; u.ai->change_ai_mode = true; if(Net::IsOnline()) { NetChange& c = Add1(Net::changes); c.type = NetChange::CHANGE_UNIT_BASE; c.unit = &u; } break; } } } } } // zak³ada ¿e gadamy na ostatnim levelu, mam nadzieje ¿e gracz z tamt¹d nie spierdoli przed pogadaniem :3 MultiInsideLocation* multi = (MultiInsideLocation*)W.GetCurrentLocation(); for(vector<InsideLocationLevel>::iterator it = multi->levels.begin(), end = multi->levels.end() - 1; it != end; ++it) { for(vector<Unit*>::iterator it2 = it->units.begin(), end2 = it->units.end(); it2 != end2; ++it2) { Unit& u = **it2; if(u.IsAlive()) { for(int i = 0; i < 5; ++i) { if(u.data == ud[i * 2]) { u.data = ud[i * 2 + 1]; break; } } } } } // usuñ zw³oki po opuszczeniu lokacji orcs_state = State::ClearDungeon; } break; } if(apply) prog = prog2; }
//================================================================================================= 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; }
//================================================================================================= cstring Quest_Dungeon::GetTargetLocationDir() const { return GetLocationDirName(GetStartLocation().pos, GetTargetLocation().pos); }