// Create the player and display the created player public static BaseCriminal CreatePlayer(List <BaseCriminal> crew) { string playerName = "this is not an empty string"; // Ask user to enter a name until they enter anything other than an empty string while (true) { Console.WriteLine(""); Console.WriteLine("Who are you?"); Console.Write("Enter your name: "); playerName = Console.ReadLine(); if (!string.IsNullOrWhiteSpace(playerName)) { break; } } // Create player object BaseCriminal player = new BaseCriminal(playerName, true, crew); // Display created player Console.WriteLine($@"{player.Face} {player.Name} _________ skill level: {player.BaseSkill} "); return(player); }
// Add associates to crew both on initial crew creation and later in game public static BaseCriminal RecruitNewAssociate(List <BaseCriminal> crew) { bool nameAvailable = true; // Set a blank new criminal that we can return after the loop completes BaseCriminal newAssociate = null; while (nameAvailable) { Console.Write("Enter associate's nickname: "); string enteredName = Console.ReadLine(); BaseCriminal isNameTaken = crew.Find(c => c.Name == enteredName); if (isNameTaken == null && !string.IsNullOrWhiteSpace(enteredName)) { newAssociate = new BaseCriminal(enteredName, false, crew); nameAvailable = false; DisplayCreatedAssociate(newAssociate); // Reset isNameTaken so more associates can be created isNameTaken = null; } } // Exit loop and return new criminal return(newAssociate); }
// Display player's speech public static void DisplayEncouragingSpeech(BaseCriminal player, bool isSplitMenu) { Color.SuccessGreen(); Console.WriteLine(Heading.DisplaySubheadingSpeech()); Console.WriteLine(player.Face); Console.WriteLine(""); // for the speeches, get names of the crew members and saying something dramatic about each person // will need to make some random compliments if (isSplitMenu == false) { Console.WriteLine("You give a big speech complimenting the crew's skills.\n"); Console.WriteLine("You promise everyone will get rich."); } if (isSplitMenu == true) { Console.WriteLine("You give a big speech congratulating the crew's heist expertise."); } Console.WriteLine(""); Console.WriteLine("Crew morale increased."); Console.WriteLine(""); Menu.Continue(); }
// Allow player to encourage crew public static List <BaseCriminal> EncourageCrew(List <BaseCriminal> crew, bool isSplitMenu) { // Takes an isSplitMenu because different encouragements require different speeches BaseCriminal player = crew.Find(c => c.IsPlayer); if (player.HasPlayerEncouragedCrew == false) { Random r = new Random(); crew.ForEach(c => { if (!c.IsPlayer) { int improvedMorale = c.Morale + r.Next(4, 25); if (improvedMorale > c.MoraleMax) { c.Morale = c.MoraleMax; } else { c.Morale = improvedMorale; } } if (c.IsPlayer) { c.HasPlayerEncouragedCrew = true; } }); DisplayEncouragingSpeech(player, isSplitMenu); return(crew); } return(crew); }
public static void WillCrewMemberShoot(List <BaseCriminal> crew, List <BaseLocation> locations, bool isPlayerAttemptingMoneySplit) // Check every crew member's morale to see if they will turn { // SIMILAR to WillCrewMemberTurnAfterHeist BaseCriminal player = crew.Find(c => c.IsPlayer); crew.ForEach(c => { int morale = c.Morale; if (c.IsPlayer == false && morale <= 40) { // Save as traitor for easy understanding BaseCriminal traitor = c; // Generate a new random number between 1-10 to handle the % a person will turn Random r = new Random(); int randomNumber = r.Next(101); int chance30 = 0; int chance50 = 0; int chance70 = 0; int chance100 = 0; // Based on this member's morale, generate a number by chance if (morale >= 30 && morale <= 40) { chance30 = r.Next(31); } else if (morale >= 20 && morale <= 29) { chance50 = r.Next(51); } else if (morale >= 10 && morale <= 19) { chance70 = r.Next(71); } // Chance100 equals the randomNumber so if they're at that level, they'll always turn else if (morale <= 9) { chance100 = randomNumber; } ChanceToShoot(chance30, randomNumber, crew, locations, traitor, isPlayerAttemptingMoneySplit); ChanceToShoot(chance50, randomNumber, crew, locations, traitor, isPlayerAttemptingMoneySplit); ChanceToShoot(chance70, randomNumber, crew, locations, traitor, isPlayerAttemptingMoneySplit); ChanceToShoot(chance100, randomNumber, crew, locations, traitor, isPlayerAttemptingMoneySplit); } }); // Find criminals WHERE they have not been marked as ICED and set them as the new crew crew = crew.Where(c => !c.isAssociateIced).ToList(); // After we have looped through every associate, go to the correct view if (isPlayerAttemptingMoneySplit) { Outro.GameOver(crew, locations, true, player); } if (!isPlayerAttemptingMoneySplit) { Outro.SplitCash(crew, locations); } }
// Display who the associate is static void DisplayCreatedAssociate(BaseCriminal associate) { Console.WriteLine($@"{associate.Face} {associate.Name} recruited! _________ base skill: {associate.BaseSkill} "); }
// Check if any crew members will turn on player/crew public static void WillCrewMemberTurnAfterHeist(List <BaseCriminal> crew, List <BaseLocation> locations, string locName) { // Get selected location BaseLocation selectedLocation = locations.Find(l => l.Name == locName); int locationCash = selectedLocation.Cash; // Loop through criminals to see if any fail the morale check // If criminal fails, heist is a success crew.ForEach(c => { if (!c.IsPlayer) { int morale = c.Morale; // if morale is less than 40 and another crew member hasn't turned and stole the money first if (morale <= 40 && selectedLocation.crewMemberStoleCash == false) { // Save as traitor for easy understanding BaseCriminal traitor = c; // Generate a new random number between 1-10 to handle the % a person will turn Random r = new Random(); int randomNumber = r.Next(101); int chance30 = 0; int chance50 = 0; int chance70 = 0; int chance100 = 0; // Based on this member's morale, generate a number by chance if (morale >= 30 && morale <= 40) { chance30 = r.Next(31) + 10; } else if (morale >= 20 && morale <= 29) { chance50 = r.Next(51) + 20; } else if (morale >= 10 && morale <= 19) { chance70 = r.Next(71) + 30; } // Chance100 equals the randomNumber so if they're at that level, they'll always turn else if (morale <= 9) { chance100 = randomNumber; } ChanceToTurnAfterHeist(chance30, randomNumber, crew, locations, traitor, locName); ChanceToTurnAfterHeist(chance50, randomNumber, crew, locations, traitor, locName); ChanceToTurnAfterHeist(chance70, randomNumber, crew, locations, traitor, locName); ChanceToTurnAfterHeist(chance100, randomNumber, crew, locations, traitor, locName); } } }); }
public static void ChanceToShoot( int chanceInt, int randFrom100, List <BaseCriminal> crew, List <BaseLocation> locations, BaseCriminal traitor, bool isPlayerAttemptingMoneySplit) { if (chanceInt != 0 && chanceInt >= randFrom100 && !traitor.isAssociateIced) { // This traitor WILL shoot // Get the traitor's index value int traitorIndex = crew.IndexOf(traitor); // Declare a target's index BaseCriminal target = null; Random r = new Random(); bool lookingForTarget = true; // WHILE we do not have a person to shoot while (lookingForTarget) { int possibleTargetIndex = 0; // Player is a possible target, only if the crew is smaller than a certain number if (crew.Count() > 2) { possibleTargetIndex = r.Next(1, crew.Count()); } else { possibleTargetIndex = r.Next(0, crew.Count()); } // If the target is not the shooter if (possibleTargetIndex != traitorIndex) { target = crew[possibleTargetIndex]; lookingForTarget = false; } } // Instead of removing the target, mark the target as "Iced." // Otherwise we crash because we've 'Modified a collection' while attempting to loop over it. crew.ForEach(c => { if (target.Name == c.Name) { c.isAssociateIced = true; } }); // pass traitor and target into display message DisplayWhoIcedWho(crew, locations, traitor, target, isPlayerAttemptingMoneySplit); } }
public static BaseCriminal ChanceToRun( int chanceInt, int randFrom100, BaseCriminal possibleTraitor) { // Check if they're a traitor if (chanceInt != 0 && chanceInt >= randFrom100) { possibleTraitor.HasRanInFear = true; AssociateRanInFear(possibleTraitor); return(possibleTraitor); } // Not a traitor return(possibleTraitor); }
public static void DisplayWhoWasIced(BaseCriminal whoWasIced) { Color.IcedRed(); // Display ASCII artwork for who was killed Console.WriteLine(Heading.DisplayHeadingIced()); Console.WriteLine($"{whoWasIced.FaceIced}"); Console.WriteLine(""); // Summary of events Console.WriteLine($"You iced {whoWasIced.Name}!"); Console.WriteLine(""); Console.WriteLine("Crew morale decreased."); Console.WriteLine("Everyone's cut increased."); // Player input to continue Console.WriteLine(""); Menu.Continue(); }
// If an associate turns, lower morale public static void ChanceToTurnAfterHeist( int chanceInt, int randFrom100, List <BaseCriminal> crew, List <BaseLocation> locations, BaseCriminal traitor, string locName) { // If the percentage chance is under the random value picked if (chanceInt != 0 && chanceInt >= randFrom100) { // Get selected location BaseLocation selectedLocation = locations.Find(l => l.Name == locName); // Lower everyone's Morale crew.ForEach(c => { if (c.IsPlayer == false) { c.Morale = c.Morale - new Random().Next(10, 35); } }); // Set the current location to stolen locations.ForEach(l => { if (l.Name == locName) { l.crewMemberStoleCash = true; } }); // Get the traitor's index value int traitorsIndex = crew.IndexOf(traitor); // Remove that index value crew.RemoveAt(traitorsIndex); // Remove the cash from the crew crew.ForEach(c => c.CrewTotalCash = c.CrewTotalCash - selectedLocation.Cash); TraitorScreen(crew, locations, locName, traitor); } }
// Display a shortened list of crew's info public static void DisplayCrewInfoShortened(List <BaseCriminal> crew) { // Get crew's cash int TotalCash; BaseCriminal player = crew.Find(c => c.IsPlayer); TotalCash = player.CrewTotalCash; int CurrentSplit = (TotalCash / crew.Count()); Console.WriteLine($@"Total associates in crew: {crew.Count()}"); Console.WriteLine("--------"); Console.WriteLine($"Cash: ${TotalCash}"); if (crew.Count() > 1) { Console.WriteLine($"Current cut: ${CurrentSplit}"); } Console.WriteLine("--------"); }
// Display crew info summary public static void DisplayCrewInfo(List <BaseCriminal> crew) { // Get crew's skills List <int> TotalSkills = new List <int>(); // Get morale skill bonus List <int> MoraleSkillBonus = new List <int>(); // Get crew's cash int TotalCash; crew.ForEach(c => { TotalSkills.Add(c.BaseSkill); MoraleSkillBonus.Add(c.MoraleSkillBonus); }); BaseCriminal player = crew.Find(c => c.IsPlayer); TotalCash = player.CrewTotalCash; int CurrentSplit = (TotalCash / crew.Count()); int CrewSkill = TotalSkills.Sum(); if (player.PlayerContactCount > 0) { Console.WriteLine($"Total associates available to hire: {player.PlayerContactCount}"); } Console.WriteLine($@"Total associates in crew: {crew.Count()}"); Console.WriteLine($"Crew's base skill level: {CrewSkill}"); if (crew.Count() > 1) { Console.WriteLine($"Morale bonus to skill: {MoraleSkillBonus.Sum()}"); } Console.WriteLine("--------"); Console.WriteLine($"Cash: ${TotalCash}"); if (crew.Count() > 1) { Console.WriteLine($"Current cut: ${CurrentSplit}"); } Console.WriteLine("--------"); }
public static void HeistSuccess(List <BaseCriminal> crew, List <BaseLocation> locations, string locName) { Color.SuccessGreen(); // Morale check before continuing CrewLogicHeist.WillCrewMemberTurnAfterHeist(crew, locations, locName); Console.WriteLine(Heading.DisplayHeistSuccess()); Console.WriteLine(Misc.DisplayMoney()); Console.WriteLine(Heading.DisplaySuccessOveriew()); BaseLocation currentLocation = locations.Find(l => l.Name == locName); BaseCriminal player = crew.Find(c => c.IsPlayer); int cashEarned = player.CrewTotalCash; // Display how much money we earned from location Console.WriteLine($"Crew stole: ${currentLocation.Cash}"); // Total earned if (cashEarned != currentLocation.Cash) { Console.WriteLine($"Total cash: ${cashEarned}"); } // how much the current split will be if it's more than one crew member if (crew.Count() > 1) { Console.WriteLine($"The split per crew member will be: ${cashEarned / crew.Count()}"); Console.WriteLine("----"); Console.WriteLine("Crew skill increased"); Console.WriteLine("Crew morale increased"); } else if (crew.Count() == 1) { Console.WriteLine("Your skill increased"); } Console.WriteLine(""); Menu.Continue(); Level.LevelSelect(crew, locations); }
static void AssociateRanInFear(BaseCriminal scared) { Color.CrewTurnedYellow(); Console.WriteLine(Heading.DisplayHeadingFled()); if (scared.CrewTotalCash == 0) { Console.WriteLine(Vehicle.DisplayAssociateRanInFear()); Console.WriteLine(scared.Face); Console.WriteLine(""); Console.WriteLine($"{scared.Name} fled from your horrifically violent action!"); } else { Console.WriteLine(Vehicle.DisplayAssociateRanWithCash()); Console.WriteLine(scared.Face); Console.WriteLine(""); Console.WriteLine($"Your horrifically violent act terrified {scared.Name}."); Console.WriteLine($"{scared.Name} fled with a large portion of the cash!"); } Console.WriteLine(""); Menu.Continue(); }
public static void DisplayWhoIcedWho(List <BaseCriminal> crew, List <BaseLocation> locations, BaseCriminal traitor, BaseCriminal gotShot, bool isPlayerAttemptingMoneySplit) { Color.IcedRed(); Console.WriteLine(Heading.DisplayHeadingIced()); Console.WriteLine(gotShot.FaceIced); Console.WriteLine(""); if (gotShot.IsPlayer) { Console.WriteLine($"{traitor.Name} iced YOU in the face!"); Console.WriteLine(""); Menu.Continue(); Outro.GameOver(crew, locations, false, gotShot); } else if (!gotShot.IsPlayer) { Console.WriteLine($"{traitor.Name} iced {gotShot.Name} in the face!"); Console.WriteLine(""); Console.WriteLine("Survivors' morale decreased."); Console.WriteLine(""); Menu.Continue(); // If player is NOT attempting to split the cash, return to SplitCash view if (!isPlayerAttemptingMoneySplit) { // Loop through the crew and find the members WHERE they have not been iced crew = crew.Where(c => !c.isAssociateIced).ToList(); Outro.SplitCash(crew, locations); } // Otherwise, continue the forEach check for each crew member } }
public static List <BaseCriminal> IceAssociateCheck(List <BaseCriminal> crew, List <BaseLocation> locations, bool splitCashMenu) { Console.Clear(); string name = "not empty for a base value"; if (!splitCashMenu) { while (name != "" && crew.Count() > 1) { Console.Clear(); Console.WriteLine(Heading.DisplayIce()); CrewManagement.DisplayCrewInfo(crew); DisplayIceAssociateWarning(crew); name = Console.ReadLine(); // Store the criminal who was iced for use in display BaseCriminal whoWasIced = crew.Find(c => c.Name == name); // Make a new list of criminals WITHOUT the iced crew member List <BaseCriminal> icedCrew = crew.Where(c => c.Name != name || c.IsPlayer == true).ToList(); // Only lower morale if we have iced a crew member if (icedCrew.Count() < crew.Count()) { // Lower the crews morale List <BaseCriminal> newCrew = LowerMoraleFromIce(icedCrew); // Display Who was iced, if not null if (whoWasIced != null) { DisplayWhoWasIced(whoWasIced); } WillCrewMemberRunAfterIce(newCrew, locations); crew = newCrew; } // We didn't type in a name, so return the new crew else { crew = icedCrew; } } } else if (splitCashMenu) { Console.Clear(); Console.WriteLine(Heading.DisplayIce()); CrewManagement.DisplayCrewInfoShortened(crew); DisplayIceAssociateWarning(crew); name = Console.ReadLine(); // Store the criminal who was iced for use in display BaseCriminal whoWasIced = crew.Find(c => c.Name == name); // Make a new list of criminals WITHOUT the iced crew member List <BaseCriminal> icedCrew = crew.Where(c => c.Name != name || c.IsPlayer == true).ToList(); // Only lower morale if we have iced a crew member if (icedCrew.Count() < crew.Count()) { // Lower the crews morale List <BaseCriminal> newCrew = LowerMoraleFromIce(icedCrew); // Display Who was iced, if not null if (whoWasIced != null) { DisplayWhoWasIced(whoWasIced); } newCrew.ForEach(c => { if (c.IsPlayer) { c.PlayerFiredWeapon = true; } }); crew = newCrew; } // We didn't type in a name, so return the new crew, and do not let anyone shoot else { crew = icedCrew.Select(c => { if (c.IsPlayer) { c.PlayerFiredWeapon = false; return(c); } else { return(c); } }).ToList(); } } // If the first check is false, return a crew return(crew); }
// Display traitor info public static void TraitorScreen(List <BaseCriminal> crew, List <BaseLocation> locations, string locName, BaseCriminal traitor) { Color.CrewTurnedYellow(); BaseLocation currentLocation = locations.Find(l => l.Name == locName); Console.WriteLine(Heading.DisplayHeadingTraitor()); Console.WriteLine(Heading.DisplaySubheadingTraitor()); Console.WriteLine(""); Console.WriteLine($"{traitor.Face}"); Console.WriteLine(""); Console.WriteLine($"{traitor.Name} stole ${currentLocation.Cash}"); Console.WriteLine("--------------------"); Console.WriteLine("Crew skill improved."); Console.WriteLine("Crew morale decreased."); Console.WriteLine(""); Console.WriteLine("Watch the crew. Unhappy members may turn."); Console.WriteLine(""); Menu.Continue(); Level.LevelSelect(crew, locations); }
public static void LevelSelect(List <BaseCriminal> crew, List <BaseLocation> locations) { Color.DefaultGray(); // While there are levels not yet completed, allow user to continue selecting levels List <BaseLocation> locationsLeftToRob = locations.Where(l => l.Completed == false).ToList(); BaseCriminal player = crew.Find(c => c.IsPlayer); while (locationsLeftToRob.Count() > 0) { Console.Clear(); Console.Write(Heading.DisplayPlanning()); CrewManagement.DisplayCrewInfo(crew); Console.WriteLine(LevelArt.DisplayNashville()); if (player.PlayerContactCount == 0 && crew.Count() == 1) { Console.WriteLine("No crew left to manage"); Console.WriteLine("______________________"); Console.WriteLine(""); } else { Console.WriteLine("1) manage crew"); Console.WriteLine("______________"); Console.WriteLine(""); } // Iterate through locations, for those that are not completed, then show those options locations.ForEach(l => { if (!l.Completed) { if (l.Name == "Annoying Neighbor's House") { Console.WriteLine("2) stakeout Annoying Neighbor's House"); } if (l.Name == "Corner Evan-Eleven") { Console.WriteLine("3) stock-up at Corner Evan-Eleven"); } if (l.Name == "Welts Fargo") { Console.WriteLine("4) stakeout Welts Fargo"); } if (l.Name == "Pinnackle National Bank") { Console.WriteLine("5) stakeout Pinnackle National Bank"); } if (l.Name == "Bank of Amereeka") { Console.WriteLine("6) stakeout Bank of Amereeka"); } } }); // IF you have ANY money, option 7 is available if (player.CrewTotalCash > 0) { Console.WriteLine("____________"); Console.WriteLine(""); if (crew.Count() == 1) { Console.WriteLine("7) end heist spree"); } else { Console.WriteLine("7) end heist spree and split cash"); } } // Check to ensure user typed only a number int selection = Menu.MenuInput(7); switch (selection) { case 1: if (player.PlayerContactCount == 0 && crew.Count() == 1) { LevelSelect(crew, locations); } else { CrewManagement.ManageCrew(crew, locations); } break; case 2: // Annoying Neighbor StakeOutLocation(crew, locations, 2); break; case 3: // Evan-Eleven StakeOutLocation(crew, locations, 3); break; case 4: // Welts Fargo StakeOutLocation(crew, locations, 4); break; case 5: // Pinnackle StakeOutLocation(crew, locations, 5); break; case 6: // Amereeka StakeOutLocation(crew, locations, 6); break; case 7: // End game - split cash if (player.CrewTotalCash > 0) { Outro.SplitCash(Outro.PrepCrewForEndGame(crew), locations); } break; } locationsLeftToRob = locations.Where(l => l.Completed == false).ToList(); } Outro.SplitCash(Outro.PrepCrewForEndGame(crew), locations); }
public static void WillCrewMemberRunAfterIce(List <BaseCriminal> crew, List <BaseLocation> locations) { // SIMILAR to WillCrewMemberTurnAfterHeist // But this checks EVERY member instead of until one turns List <BaseCriminal> checkedCrew = new List <BaseCriminal>(); List <BaseCriminal> notScaredCrew = new List <BaseCriminal>(); BaseCriminal player = crew.Find(c => c.IsPlayer); int currentCashTotal = player.CrewTotalCash; // Loop through criminals & check their morale checkedCrew = crew.Select(c => { if (!c.IsPlayer) { int morale = c.Morale; // if morale is less than 40, chance to run if (morale <= 40) { BaseCriminal possibleTraitor = c; // Get new random Random r = new Random(); int randFrom100 = r.Next(101); int chance10 = 0; int chance20 = 0; int chance40 = 0; int chance100 = 0; // Based on this member's morale, generate a number by chance if (morale >= 30 && morale <= 40) { chance10 = r.Next(11); } else if (morale >= 20 && morale <= 29) { chance20 = r.Next(21); } else if (morale >= 10 && morale <= 19) { chance40 = r.Next(41); } // Chance100 equals the randomNumber so if they're at that level, they'll always turn else if (morale <= 9) { chance100 = randFrom100; } possibleTraitor = ChanceToRun(chance10, randFrom100, possibleTraitor); possibleTraitor = ChanceToRun(chance20, randFrom100, possibleTraitor); possibleTraitor = ChanceToRun(chance40, randFrom100, possibleTraitor); possibleTraitor = ChanceToRun(chance100, randFrom100, possibleTraitor); return(possibleTraitor); } } return(c); }).ToList(); // Check if any traitors stole cash if (currentCashTotal > 2) { checkedCrew.ForEach(c => { // Did anyone run in fear? if (c.HasRanInFear) { // Reset the cash to the current amount c.CrewTotalCash = currentCashTotal; // Remove 50% of cash currentCashTotal = currentCashTotal - (currentCashTotal / 2); } }); } // Updated everyone's cash amount checkedCrew.ForEach(c => c.CrewTotalCash = currentCashTotal); // Filter only the crew members who didn't run in fear notScaredCrew = checkedCrew.Where(c => c.HasRanInFear == false).ToList(); CrewManagement.ManageCrew(notScaredCrew, locations); }
// Main view for managing crew public static void ManageCrew(List <BaseCriminal> crew, List <BaseLocation> locations) // Must always return the current crew and the current locations { Color.DefaultGray(); List <BaseCriminal> modifiedCrew = crew; DisplayCurrentCrew(modifiedCrew); BaseCriminal player = crew.Find(c => c.IsPlayer); // If only the player is in the crew & player has 0 contacts, return to level select if (crew.Count == 1 && player.PlayerContactCount == 0) { Level.LevelSelect(crew, locations); } Console.WriteLine(); if (player.PlayerContactCount > 0) { Console.WriteLine($"1) recruit an associate [{player.PlayerContactCount} associates available to contact]"); } else if (player.PlayerContactCount == 0) { Console.WriteLine("You've contacted every associate you know."); } if (crew.Count() > 1) { if (player.HasPlayerEncouragedCrew == false) { Console.WriteLine("2) give an encouraging speech"); } else if (player.HasPlayerEncouragedCrew == true) { Console.WriteLine("You can give another speech after a successful heist."); } Console.WriteLine("3) ice crew member"); } ; Console.WriteLine("4) return to planning"); int input = Menu.MenuInput(4); switch (input) { case 1: modifiedCrew = CrewManagement.ModifyCrew(modifiedCrew); ManageCrew(modifiedCrew, locations); break; case 2: if (crew.Count() > 1) { modifiedCrew = EncourageCrew(modifiedCrew, false); } ManageCrew(modifiedCrew, locations); break; case 3: modifiedCrew = Ice.IceCrewMember(modifiedCrew, locations, false); ManageCrew(modifiedCrew, locations); break; case 4: Level.LevelSelect(modifiedCrew, locations); break; } }
public static void SplitCash(List <BaseCriminal> crew, List <BaseLocation> locations) { Color.SplitYellow(); // get crew cash int totalCash = 0; crew.ForEach(c => totalCash = c.CrewTotalCash); BaseCriminal player = crew.Find(c => c.IsPlayer); if (totalCash > 0) { // If there is a crew, split cash. Else, end game if (crew.Count() > 1) { Console.Clear(); // Display headings and crew info Console.WriteLine(Heading.DisplayHeadingSplit()); Console.WriteLine(Heading.DisplaySubheadingSplit()); CrewManagement.DisplayCrewInfoShortened(crew); // Money bag image Console.WriteLine(Misc.DisplayMoneyBag()); // Display crews name and current morale status Console.WriteLine("Crew"); Console.WriteLine("-----"); crew.ForEach(c => { if (!c.IsPlayer) { Console.WriteLine($"{c.Name} - {c.MoraleDescription}"); } }); Console.WriteLine(""); Console.WriteLine("The more money you take, the better off you'll be when you skip town."); Console.WriteLine(""); Console.WriteLine("1) attempt to split cash evenly among crew members and part ways"); Console.WriteLine("2) ice a crew member"); if (player.HasPlayerEncouragedCrew == false) { Console.WriteLine("3) give congratulations speech"); } int select = Menu.MenuInput(3); switch (select) { case 1: // Player gives up chance to shoot. Otherwise the player will always have the chance to ice the last person Ice.WillCrewMemberShoot(crew, locations, true); GameOver(crew, locations, true, player); break; case 2: // Player ices an associate List <BaseCriminal> smallerCrew = Ice.IceCrewMember(crew, locations, true); if (player.PlayerFiredWeapon) { Ice.WillCrewMemberShoot(smallerCrew, locations, false); } smallerCrew.ForEach(c => { if (c.IsPlayer) { c.PlayerFiredWeapon = false; } }); SplitCash(smallerCrew, locations); break; case 3: SplitCash(CrewManagement.EncourageCrew(crew, true), locations); break; } GameOver(crew, locations, true, player); } else { GameOver(crew, locations, true, player); } } else { GameOver(crew, locations, true, player); } }
public static void HeistFailure(List <BaseCriminal> crew, List <BaseLocation> locations) { Color.PoliceBlue(); BaseCriminal player = crew.Find(c => c.IsPlayer); string moraleMsg = "Crew morale decreased."; // 50-50 chance for arrested or escaped Random random = new Random(); int r = random.Next(1, 3); // Arrested if (r == 1) { // Generate arrested summary Console.WriteLine(Heading.DisplayHeadingArrested()); Console.WriteLine(Heading.DisplaySubheadingArrested()); // If only player is in crew if (crew.Count == 1) { crew.ForEach(c => c.IsPlayerArrested = true); Console.WriteLine(Face.DisplayArrested()); Menu.Continue(); Outro.GameOver(crew, locations, true, player); } // If multiple crew members else if (crew.Count > 1) { // arrest a random crew member int crewSize = crew.Count(); int randomCrewMember = new Random().Next(1, crewSize); BaseCriminal arrestedMember = crew.ElementAt(randomCrewMember); Console.WriteLine(""); Console.WriteLine($"{arrestedMember.Face}"); Console.WriteLine(""); Console.WriteLine($"The cops got {arrestedMember.Name}!\n"); Console.WriteLine(moraleMsg); Console.WriteLine(""); Menu.Continue(); crew.RemoveAt(randomCrewMember); // Randomly lower every non-player's morale crew.ForEach(c => { if (c.IsPlayer == false) { int loweredMorale = c.Morale - new Random().Next(25, 54); if (loweredMorale < c.MoraleMin) { c.Morale = c.MoraleMin; } else { c.Morale = loweredMorale; } } }); // Return to level select menu Level.LevelSelect(crew, locations); } } // Escaped else if (r == 2) { // Randomly lower every non-player's morale crew.ForEach(c => { if (c.IsPlayer == false) { int loweredMorale = c.Morale - new Random().Next(15, 35); if (loweredMorale < c.MoraleMin) { c.Morale = c.MoraleMin; } else { c.Morale = loweredMorale; } } }); // Display escaped summary Console.WriteLine(Heading.DisplayHeadingEscaped()); Console.WriteLine(Heading.DisplaySubheadingEscaped()); Console.WriteLine(Vehicle.DisplayPoliceCar()); if (crew.Count() > 1) { Console.WriteLine(moraleMsg); } Console.WriteLine(""); Menu.Continue(); // Return to level select menu Level.LevelSelect(crew, locations); } }
public static void GameOver(List <BaseCriminal> crew, List <BaseLocation> locations, bool playerAlive, BaseCriminal player) { BaseCriminal firstIndex = crew[0]; int cashStolen = firstIndex.CrewTotalCash; int playersCut = cashStolen / crew.Count(); int totalCashAvailable = 0; locations.ForEach(l => totalCashAvailable = l.Cash + totalCashAvailable); Color.EndingBlue(); Console.WriteLine(Heading.DisplayHeadingGameOver()); Console.WriteLine(Heading.DisplaySubHeadingSummary()); Console.WriteLine($"Total cash stolen: ${cashStolen} / ${totalCashAvailable}"); if (playerAlive) { // Arrested Ending if (player.IsPlayerArrested == true) { // If we have a crew if (crew.Count() > 1) { // Minus you from crew.Count Console.WriteLine($"The cut per members not in jail: ${cashStolen / crew.Count() - 1}"); DisplayCrewMembersWhoSurvived(crew); } if (player.PlayerContactCount > 0) { Console.WriteLine($"Number of associates left you could have hired: {player.PlayerContactCount}"); } Console.WriteLine(""); Console.WriteLine(Face.DisplayArrested()); Console.WriteLine("You should have known, crime never pays."); ExitGame(); } if (player.CrewTotalCash == 0) { DisplayCrewMembersWhoSurvived(crew); if (player.PlayerContactCount > 0) { Console.WriteLine($"Number of associates left you could have hired: {player.PlayerContactCount}"); } Console.WriteLine(Heading.DisplaySubheadingWanted()); Console.WriteLine($"{player.Name} for multiple attempts at robbery."); Console.WriteLine($"{player.Face}"); Console.WriteLine(""); Console.WriteLine("You somehow ended up with nothing. You can't even get out of town."); Console.WriteLine("Police all over Tennessee and the ajoining states are hunting you."); Console.WriteLine($"Enjoy your freedom while you can, {player.Name}."); ExitGame(); } // the crew does have cash else { if (crew.Count() > 1) { Console.WriteLine($"Cut per member: ${cashStolen / crew.Count()}"); DisplayCrewMembersWhoSurvived(crew); if (player.PlayerContactCount > 0) { Console.WriteLine($"Number of associates left you could have hired: {player.PlayerContactCount}"); } } // Based on how much the playersCut was, display ending message if (playersCut > 0 && playersCut <= 10_000) { Console.WriteLine(Ending.DisplayEndingCamp()); } if (playersCut >= 10_001 && playersCut <= 999_999) { Console.WriteLine(Ending.DisplayEndingRoad()); } if (playersCut > 1_000_000) { Console.WriteLine(Ending.DisplayEndingBeach()); } } } else if (!playerAlive) { // REMOVE the player from the crew crew = crew.Where(c => !c.IsPlayer || !c.isAssociateIced).ToList(); Console.WriteLine($"The cut per member: ${cashStolen / crew.Count()}"); if (crew.Count() == 1) { Console.WriteLine($"The only survivor was: "); } else { Console.WriteLine($"Crew members who survived:"); } crew.ForEach(c => Console.WriteLine($" {c.Name}")); if (player.PlayerContactCount > 0) { Console.WriteLine($"Number of associates left you could have hired: {player.PlayerContactCount}"); } Console.WriteLine(player.FaceIced); Console.WriteLine(""); Console.WriteLine("Crime doesn't pay when you're dead."); } ExitGame(); }