277 lines
8.2 KiB
C#
277 lines
8.2 KiB
C#
public sealed class Actions
|
|
{
|
|
private static readonly Lazy<Actions> _instance = new Lazy<Actions>(() => new Actions());
|
|
private Actions() { }
|
|
public static Actions Instance
|
|
{
|
|
get { return _instance.Value; }
|
|
}
|
|
|
|
public void GetAction(Character character)
|
|
{
|
|
while (true)
|
|
{
|
|
var type = character.GetType().ToString();
|
|
switch (type)
|
|
{
|
|
case "Player": PlayerActions(character); break;
|
|
case "Skeleton": MonsterActions(character); break;
|
|
case "UncodedOne": MonsterActions(character); break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void PlayerActions(Character character)
|
|
{
|
|
string? action;
|
|
|
|
while (true)
|
|
{
|
|
Console.Clear();
|
|
GameState.Instance.DisplayStatus();
|
|
Console.WriteLine($"Current Round: {GameState.Instance.currentRound}");
|
|
Console.WriteLine("\n1. Do Nothing");
|
|
Console.WriteLine("2. Punch");
|
|
if (GameState.Instance.herosAIControl == true)
|
|
{
|
|
action = AIPickAction();
|
|
}
|
|
else
|
|
{
|
|
Console.Write($"\n{character.name}, select an action: ");
|
|
action = Console.ReadLine();
|
|
}
|
|
switch (action)
|
|
{
|
|
case "1": DoNothing(character); break;
|
|
case "2": Punch(character); break;
|
|
default:
|
|
Console.WriteLine("Sorry, you can't do that...");
|
|
Thread.Sleep(1000);
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void MonsterActions(Character character)
|
|
{
|
|
while (true)
|
|
{
|
|
string? action;
|
|
Console.Clear();
|
|
GameState.Instance.DisplayStatus();
|
|
Console.WriteLine($"Current Round: {GameState.Instance.currentRound}");
|
|
if (character.name == "Skeleton")
|
|
{
|
|
Console.WriteLine("\n1. Do Nothing");
|
|
Console.WriteLine("2. Bone Crunch");
|
|
if (GameState.Instance.monstersAIControl == true)
|
|
{
|
|
action = AIPickAction();
|
|
}
|
|
else
|
|
{
|
|
Console.Write($"\n{character.name}, select an action: ");
|
|
action = Console.ReadLine();
|
|
}
|
|
switch (action)
|
|
{
|
|
case "1": DoNothing(character); break;
|
|
case "2": BoneCrunch(character); break;
|
|
default:
|
|
Console.WriteLine("Sorry, you can't do that...");
|
|
Thread.Sleep(1000);
|
|
continue;
|
|
}
|
|
}
|
|
if (character.name == "The Uncoded One")
|
|
{
|
|
Console.WriteLine("\n1. Do Nothing");
|
|
Console.WriteLine("2. Unraveling");
|
|
if (GameState.Instance.monstersAIControl == true)
|
|
{
|
|
action = AIPickAction();
|
|
}
|
|
else
|
|
{
|
|
Console.Write($"\n{character.name}, select and action: ");
|
|
action = Console.ReadLine();
|
|
}
|
|
switch (action)
|
|
{
|
|
case "1": DoNothing(character); break;
|
|
case "2": Unraveling(character); break;
|
|
default: Console.WriteLine("Sorry, you can't do that...");
|
|
Thread.Sleep(1000);
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
public Character SelectTarget(Character character)
|
|
{
|
|
int target;
|
|
|
|
while (true)
|
|
{
|
|
if (GameState.Instance.heros.Contains(character))
|
|
{
|
|
Console.WriteLine();
|
|
int number = 1;
|
|
foreach (var monster in GameState.Instance.monsters)
|
|
{
|
|
Console.WriteLine($"{number}. {monster.name}");
|
|
number++;
|
|
}
|
|
}
|
|
else if (GameState.Instance.monsters.Contains(character))
|
|
{
|
|
int number = 1;
|
|
Console.WriteLine();
|
|
foreach (var hero in GameState.Instance.heros)
|
|
{
|
|
Console.WriteLine($"{number}. {hero.name}");
|
|
number++;
|
|
}
|
|
}
|
|
Console.Write("\nSelect a target: ");
|
|
try
|
|
{
|
|
target = Int32.Parse(Console.ReadLine());
|
|
}
|
|
catch (System.FormatException)
|
|
{
|
|
Console.WriteLine("\nSorry, that's not a valid target...");
|
|
continue;
|
|
}
|
|
try
|
|
{
|
|
if (GameState.Instance.heros.Contains(character))
|
|
{
|
|
return GameState.Instance.monsters[target - 1];
|
|
}
|
|
else if (GameState.Instance.monsters.Contains(character))
|
|
{
|
|
return GameState.Instance.heros[target - 1];
|
|
}
|
|
}
|
|
catch (System.ArgumentOutOfRangeException)
|
|
{
|
|
Console.WriteLine("\nSorry, that's not a valid target...");
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void DoNothing(Character character)
|
|
{
|
|
|
|
Console.WriteLine($"\n{character.name} does nothing...");
|
|
Thread.Sleep(1000);
|
|
}
|
|
|
|
public void Punch(Character character)
|
|
{
|
|
Character target = null;
|
|
if (GameState.Instance.herosAIControl == true)
|
|
{
|
|
target = AIPickTarget(character);
|
|
}
|
|
else
|
|
{
|
|
target = SelectTarget(character);
|
|
}
|
|
|
|
Console.WriteLine($"\n{character.name} uses PUNCH on {target.name}!");
|
|
Console.WriteLine($"{target.name} took 1 damage!");
|
|
target.currentHP -= 1;
|
|
Thread.Sleep(1000);
|
|
return;
|
|
}
|
|
|
|
public void BoneCrunch(Character character)
|
|
{
|
|
Character target = null;
|
|
if (GameState.Instance.monstersAIControl == true)
|
|
{
|
|
target = AIPickTarget(character);
|
|
}
|
|
else
|
|
{
|
|
target = SelectTarget(character);
|
|
}
|
|
|
|
Random random = new Random();
|
|
int coin = random.Next(1, 101);
|
|
Console.WriteLine($"\n{character.name} used Bone Crunch on {target.name}!");
|
|
if (coin > 50)
|
|
{
|
|
Console.WriteLine($"{target.name} took 1 damage!");
|
|
target.currentHP -= 1;
|
|
Thread.Sleep(1000);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("Nothing happened!");
|
|
Thread.Sleep(1000);
|
|
return;
|
|
}
|
|
}
|
|
|
|
public void Unraveling(Character character)
|
|
{
|
|
Character target = null;
|
|
if (GameState.Instance.monstersAIControl == true)
|
|
{
|
|
target = AIPickTarget(character);
|
|
}
|
|
else
|
|
{
|
|
target = SelectTarget(character);
|
|
}
|
|
Random random = new Random();
|
|
Console.WriteLine($"\n{character.name} used Unraveling on {target.name}!");
|
|
int damage = random.Next(3);
|
|
if (damage > 0)
|
|
{
|
|
Console.WriteLine($"{target.name} took {damage} damage!");
|
|
target.currentHP -= damage;
|
|
Thread.Sleep(1000);
|
|
return;
|
|
}
|
|
}
|
|
|
|
public Character AIPickTarget(Character character)
|
|
{
|
|
Random random = new Random();
|
|
if (GameState.Instance.heros.Contains(character))
|
|
{
|
|
var lastItem = GameState.Instance.monsters.Count();
|
|
var target = random.Next(1, lastItem + 1);
|
|
return GameState.Instance.monsters[target - 1];
|
|
}
|
|
else
|
|
{
|
|
var lastItem = GameState.Instance.heros.Count();
|
|
var target = random.Next(1, lastItem + 1);
|
|
return GameState.Instance.heros[target - 1];
|
|
}
|
|
}
|
|
|
|
public string AIPickAction()
|
|
{
|
|
Random random = new Random();
|
|
Thread.Sleep(1000);
|
|
return random.Next(1, 3).ToString();
|
|
}
|
|
}
|
|
|