/// <summary> /// Allows an attacking army to lay siege to an enemy fief /// </summary> /// <param name="attacker">The attacking army</param> /// <param name="target">The fief to be besieged</param> public static Siege SiegeStart(Army attacker, Fief target) { Army defenderGarrison = null; Army defenderAdditional = null; // check for existence of army in keep for (int i = 0; i < target.armies.Count; i++) { // get army Army armyInFief = Globals_Game.armyMasterList[target.armies[i]]; // check is in keep Character armyLeader = armyInFief.GetLeader(); if (armyLeader != null) { if (armyLeader.inKeep) { // check owner is same as that of fief (i.e. can help in siege) if (armyInFief.GetOwner() == target.owner) { defenderAdditional = armyInFief; break; } } } } // create defending force defenderGarrison = target.CreateDefendingArmy(); // get the minumum days of all army objects involved double minDays = Math.Min(attacker.days, defenderGarrison.days); if (defenderAdditional != null) { minDays = Math.Min(minDays, defenderAdditional.days); } // get defenderAdditional ID, or null if no defenderAdditional string defAddID = null; if (defenderAdditional != null) { defAddID = defenderAdditional.armyID; } // create siege object Siege mySiege = new Siege(Globals_Game.GetNextSiegeID(), Globals_Game.clock.currentYear, Globals_Game.clock.currentSeason, attacker.GetOwner().charID, target.owner.charID, attacker.armyID, defenderGarrison.armyID, target.id, minDays, target.keepLevel, defAdd: defAddID); // add to master list Globals_Game.siegeMasterList.Add(mySiege.siegeID, mySiege); // add to siege owners mySiege.GetBesiegingPlayer().mySieges.Add(mySiege.siegeID); mySiege.GetDefendingPlayer().mySieges.Add(mySiege.siegeID); // add to fief target.siege = mySiege.siegeID; // reduce expenditures in fief, except for garrison target.infrastructureSpendNext = 0; target.keepSpendNext = 0; target.officialsSpendNext = 0; // update days (NOTE: siege.days will be updated in syncDays) mySiege.totalDays++; // sychronise days mySiege.SyncSiegeDays(mySiege.days - 1); // =================== construct and send JOURNAL ENTRY // ID uint entryID = Globals_Game.GetNextJournalEntryID(); // personae List <string> tempPersonae = new List <string>(); tempPersonae.Add("all|all"); tempPersonae.Add(mySiege.GetDefendingPlayer().charID + "|fiefOwner"); tempPersonae.Add(mySiege.GetBesiegingPlayer().charID + "|attackerOwner"); tempPersonae.Add(attacker.GetLeader().charID + "|attackerLeader"); // get defenderLeader Character defenderLeader = defenderGarrison.GetLeader(); if (defenderLeader != null) { tempPersonae.Add(defenderLeader.charID + "|defenderGarrisonLeader"); } // get additional defending leader Character addDefendLeader = null; if (defenderAdditional != null) { addDefendLeader = defenderAdditional.GetLeader(); if (addDefendLeader != null) { tempPersonae.Add(addDefendLeader.charID + "|defenderAdditionalLeader"); } } string[] siegePersonae = tempPersonae.ToArray(); // location string siegeLocation = mySiege.GetFief().id; // description string[] fields = new string[6]; fields[0] = mySiege.GetBesiegingPlayer().firstName + " " + mySiege.GetBesiegingPlayer().familyName; fields[1] = attacker.GetLeader().firstName + " " + attacker.GetLeader().familyName; fields[2] = mySiege.GetFief().name; fields[3] = mySiege.GetDefendingPlayer().firstName + " " + mySiege.GetDefendingPlayer().familyName; fields[4] = fields[5] = ""; if (defenderLeader != null) { fields[4] = "The defending garrison is led by " + defenderLeader.firstName + " " + defenderLeader.familyName + "."; } if (addDefendLeader != null) { fields[5] = "Additional defending forces are led by " + addDefendLeader.firstName + " " + addDefendLeader.familyName + "."; } ProtoMessage siege = new ProtoMessage(); siege.MessageFields = fields; siege.ResponseType = DisplayMessages.PillageInitiateSiege; // put together new journal entry JournalEntry siegeResult = new JournalEntry(entryID, Globals_Game.clock.currentYear, Globals_Game.clock.currentSeason, siegePersonae, "siege", siege, loc: siegeLocation); // add new journal entry to pastEvents Globals_Game.AddPastEvent(siegeResult); return(mySiege); }
/// <summary> /// Implements the processes involved in the pillage of a fief by an army /// </summary> /// <param name="a">The pillaging army</param> /// <param name="f">The fief being pillaged</param> public static ProtoMessage PillageFief(Army a, Fief f) { ProtoMessage result = new ProtoMessage(); bool pillageCancelled = false; bool bailiffPresent = false; Army fiefArmy = null; // check if bailiff present in fief (he'll lead the army) if (f.bailiff != null) { for (int i = 0; i < f.charactersInFief.Count; i++) { if (f.charactersInFief[i] == f.bailiff) { bailiffPresent = true; break; } } } // if bailiff is present, create an army and attempt to give battle // no bailiff = no leader = pillage is unopposed by defending forces if (bailiffPresent) { // create temporary army for battle fiefArmy = f.CreateDefendingArmy(); // give battle and get result ProtoBattle battleResults; pillageCancelled = Battle.GiveBattle(fiefArmy, a, out battleResults, circumstance: "pillage"); if (pillageCancelled) { string toDisplay = "The pillaging force has been forced to retreat by the fief's defenders!"; result.ResponseType = DisplayMessages.PillageRetreat; // Let owner know that pillage attempt has been thwarted Globals_Game.UpdatePlayer(f.owner.playerID, DisplayMessages.PillageRetreat); return(result); } else { // check still have enough days left if (a.days < 7) { // Inform fief owner pillage attempt thwarted Globals_Game.UpdatePlayer(f.owner.playerID, DisplayMessages.PillageDays); result.ResponseType = DisplayMessages.PillageDays; pillageCancelled = true; return(result); } } } if (!pillageCancelled) { // process pillage return(Pillage_Siege.ProcessPillage(f, a)); } result.ResponseType = DisplayMessages.Success; result.Message = "The pillage was successful"; return(result); }