/* Autori: Adrians Zemturis 110 Ingus Zemturis 110 IDE: Visual Studio Community 2026 */ using System; using System.Net; namespace RPG_game { internal class Program { // Komandas static private Team FirstTeam = new Team() { }; static private Team SecondTeam = new Team() { }; private struct Team { public Player Class1; public Player Class2; } // Spēlētāju klases private abstract class Player { public bool dead = false; public string Name; // Vārds public float MaxHP; // Maksimālie dzīves punkti private float _hp; // Dzīves punkti public float HP { get { return _hp; } set { // Ierobežo _hp no 0 līdz MaxHP _hp = value; if (_hp > MaxHP) { _hp = MaxHP; } else if (_hp < 0) { _hp = 0; } } } public float DR; // (Damage Reduction) Bojājumu samazināšana public float DMGB; // Uzbrukumu pastiprinājums public float MaxENG; // Maksimālā energija private float _eng; // Energija public float ENG { get { return _eng; } set { // Ierobežo _eng no 0 līdz MaxENG _eng = value; if (_eng > MaxENG) { _eng = MaxENG; } else if (_eng < 0) { _eng = 0; } } } public float ENGR; // Energijas atjaunināšana katrā gājienā public Ability FirstAbility; // Pirmā spēja public Ability SecondAbility; // Otrā spēja public void TakeDamage(float DMG) { float damage = (DMG * (1 - this.DR)); this.HP -= damage; if (this.HP == 0) { this.dead = true; } } public void DisplayData() { Console.WriteLine($"---[{this.Name}]---"); Console.WriteLine($"HP: ({this.HP} / {this.MaxHP})"); Console.WriteLine($"ENERGY: ({this.ENG} / {this.MaxENG})"); Console.WriteLine($"ENERGY REGEN PER ROUND: {this.ENGR}"); Console.WriteLine($"DMG REDUCTION: {this.DR * 100}%"); Console.WriteLine($"DMG BUFF: {this.DMGB * 100}%"); Console.WriteLine($"---[{this.Name}]---\n"); } } private class Warrior : Player { public Warrior() { this.Name = "Warrior"; this.MaxHP = 200; this.HP = 200; this.DR = 0.15f; this.DMGB = 0.2f; this.MaxENG = 80; this.ENG = 80; this.ENGR = 3; this.FirstAbility = new Slash(); this.SecondAbility = new CycloneSlash(); } } private class Mage : Player { public Mage() { this.Name = "Mage"; this.MaxHP = 150; this.HP = 150; this.DR = 0f; this.DMGB = 0.35f; this.MaxENG = 120; this.ENG = 120; this.ENGR = 6.5f; this.FirstAbility = new MagicBolt(); this.SecondAbility = new ManaLance(); } } private class Saint : Player { public Saint() { this.Name = "Saint"; this.MaxHP = 150; this.HP = 150; this.DR = 0.1f; this.DMGB = 0.1f; this.MaxENG = 100; this.ENG = 100; this.ENGR = 4; this.FirstAbility = new Blessing(); this.SecondAbility = new Smite(); } } private class Tank : Player { public Tank() { this.Name = "Tank"; this.MaxHP = 350; this.HP = 350; this.DR = 0.2f; this.DMGB = 0f; this.MaxENG = 80; this.ENG = 80; this.ENGR = 3; this.FirstAbility = new Sacrifice(); this.SecondAbility = new ShieldBash(); } } // Spēju klases private abstract class Ability { public string Name; // Spēju vārds public string DESC; // Spēju apraksts public float VAL; // Vērtiba kuru izmantos spēju Attack() funkcija public float ENGC; // Energijas maksa // AuxiliaryAttacker ir uzbrucēja otrā klase, kura tagad netiek lietota // AuxiliaryEnemy ir pretinieka otrā klase, kura tagad netiek mērķēta public virtual void Attack(Player Attacker, Player AuxiliaryAttacker, Player Enemy, Player AuxiliaryEnemy) { if (this.CanAttack(Attacker)) { Attacker.ENG -= this.ENGC; float DMG = this.VAL * (1 + Attacker.DMGB); Enemy.TakeDamage(DMG); this.Special(Attacker, AuxiliaryAttacker, Enemy, AuxiliaryEnemy); } } public virtual void Special(Player Attacker, Player AuxiliaryAttacker, Player Enemy, Player AuxiliaryEnemy) { // TODO } public void DisplayData() { Console.WriteLine($"---[{this.Name}]---"); Console.WriteLine($"DESC: {this.DESC}"); Console.WriteLine($"DMG: {this.VAL}"); Console.WriteLine($"ENERGY COST: {this.ENGC}"); Console.WriteLine($"---[{this.Name}]---\n"); } public bool CanAttack(Player PLR) { if (PLR.ENG >= this.ENGC) { return true; } else { return false; } } } // Warrior klasei private class Slash : Ability { public Slash() { this.Name = "Slash"; this.DESC = "Single target slash"; this.VAL = 16; this.ENGC = 5; } } private class CycloneSlash : Ability { public CycloneSlash() { this.Name = "Cyclone Slash"; this.DESC = "Multi target slash"; this.VAL = 25; this.ENGC = 30; } public override void Attack(Player Attacker, Player AuxiliaryAttacker, Player Enemy, Player AuxiliaryEnemy) { if (this.CanAttack(Attacker)) { Attacker.ENG -= this.ENGC; float DMG = this.VAL * (1 + Attacker.DMGB); Enemy.TakeDamage(DMG); AuxiliaryEnemy.TakeDamage(DMG); this.Special(Attacker, AuxiliaryAttacker, Enemy, AuxiliaryEnemy); } } } // Mage klasei private class MagicBolt : Ability { public MagicBolt() { this.Name = "Magic bolt"; this.DESC = "Single target magic bolt"; this.VAL = 20; this.ENGC = 8; } } private class ManaLance : Ability { public ManaLance() { this.Name = "Mana Lance"; this.DESC = "Single target mana lance"; this.VAL = 65; this.ENGC = 65; } } // Saint klasei private class Blessing : Ability { public Blessing() { this.Name = "Blessing"; this.DESC = "Multi target team heal"; this.VAL = 40; this.ENGC = 50; } public override void Attack(Player Attacker, Player AuxiliaryAttacker, Player Enemy, Player AuxiliaryEnemy) { if (this.CanAttack(Attacker)) { Attacker.ENG -= this.ENGC; Attacker.TakeDamage(-this.VAL); AuxiliaryAttacker.TakeDamage(-this.VAL); } } } private class Smite : Ability { public Smite() { this.Name = "Smite"; this.DESC = "Multi target smite"; this.VAL = 12; this.ENGC = 10; } } // Tank klasei private class Sacrifice : Ability { public Sacrifice() { this.Name = "Sacrifice"; this.VAL = 60; this.ENGC = 60; this.DESC = $"Single target high damage move but the tank takes {this.VAL / 2} dmg"; } public override void Attack(Player Attacker, Player AuxiliaryAttacker, Player Enemy, Player AuxiliaryEnemy) { if (this.CanAttack(Attacker)) { Attacker.ENG -= this.ENGC; Attacker.TakeDamage(this.VAL/2); Enemy.TakeDamage(this.VAL); } } } private class ShieldBash : Ability { public ShieldBash() { this.Name = "Shield Bash"; this.DESC = "Single target shield bash"; this.VAL = 12; this.ENGC = 2; } } static void Main(string[] args) { string Stage = "TeamSelect"; string TeamStage = "Team1ClassSelection"; int RoundCounter = 1; Ability attacking_ability = null; Player attacking_player = null; Player attacking_aux_player = null; Player attacked_player = null; Player attacked_aux_player = null; while (true) { Console.Clear(); Console.WriteLine("Round: " + RoundCounter + "\n"); if (Stage == "TeamSelect") { int Class1 = 0; int Class2 = 0; Console.WriteLine("Input first teams first class by typing one of the following numbers:\n"); Console.WriteLine("(1) Warrior\n(2) Mage\n(3) Saint\n(4) Tank\n"); if (int.TryParse(Console.ReadLine(), out Class1) == false) { continue; } Console.Clear(); Console.WriteLine("Input first teams second class by typing one of the following numbers:\n"); Console.WriteLine("(1) Warrior\n(2) Mage\n(3) Saint\n(4) Tank\n"); if (int.TryParse(Console.ReadLine(), out Class2) == false) { continue; } // Pirmās komandas pirmā klase izvēlēšana switch (Class1) { case 1: FirstTeam.Class1 = new Warrior(); break; case 2: FirstTeam.Class1 = new Mage(); break; case 3: FirstTeam.Class1 = new Saint(); break; case 4: FirstTeam.Class1 = new Tank(); break; default: continue; } // Pirmās komandas otrā klases izvēlēšana switch (Class2) { case 1: FirstTeam.Class2 = new Warrior(); break; case 2: FirstTeam.Class2 = new Mage(); break; case 3: FirstTeam.Class2 = new Saint(); break; case 4: FirstTeam.Class2 = new Tank(); break; default: continue; } // Otrās komandas klases izvēlēšana Console.Clear(); Console.WriteLine("Input second teams first class by typing one of the following numbers:\n"); Console.WriteLine("(1) Warrior\n(2) Mage\n(3) Saint\n(4) Tank\n"); if (int.TryParse(Console.ReadLine(), out Class1) == false) { continue; } Console.Clear(); Console.WriteLine("Input second teams second class by typing one of the following numbers:\n"); Console.WriteLine("(1) Warrior\n(2) Mage\n(3) Saint\n(4) Tank\n"); if (int.TryParse(Console.ReadLine(), out Class2) == false) { continue; } // Otrās komandas pirmā klases izvēlēšana switch (Class1) { case 1: SecondTeam.Class1 = new Warrior(); break; case 2: SecondTeam.Class1 = new Mage(); break; case 3: SecondTeam.Class1 = new Saint(); break; case 4: SecondTeam.Class1 = new Tank(); break; default: continue; } // Otrās komandas otrā klases izvēlēšana switch (Class2) { case 1: SecondTeam.Class2 = new Warrior(); break; case 2: SecondTeam.Class2 = new Mage(); break; case 3: SecondTeam.Class2 = new Saint(); break; case 4: SecondTeam.Class2 = new Tank(); break; default: continue; } Stage = "Game"; } else if (Stage == "Game") // Spēles loģika { // Pirmās komandas klases, un spējas izvēle if (TeamStage == "Team1ClassSelection") { string SelectedClassName = ""; Console.WriteLine("-- -- -- [Team 1] -- -- --"); FirstTeam.Class1.DisplayData(); FirstTeam.Class2.DisplayData(); Console.WriteLine("\n-- -- -- [Team 2] -- -- --"); SecondTeam.Class1.DisplayData(); SecondTeam.Class2.DisplayData(); Console.WriteLine("\n~~~ TEAM 1 IS SELECTING ~~~\n"); Console.WriteLine($"Type the following numbers to select an attacking class:\n(1) {FirstTeam.Class1.Name}\n(2) {FirstTeam.Class2.Name}"); SelectedClassName = Console.ReadLine(); if (SelectedClassName == "1") { attacking_player = FirstTeam.Class1; attacking_aux_player = FirstTeam.Class2; TeamStage = "Team1Class1AbilitySelection"; } else if (SelectedClassName == "2") { attacking_player = FirstTeam.Class2; attacking_aux_player = FirstTeam.Class1; TeamStage = "Team1Class2AbilitySelection"; } else { continue; } } // Team 1 Class 1 ability else if (TeamStage == "Team1Class1AbilitySelection") { string SelectedAbility = ""; Console.WriteLine($"-- -- -- [Team 1 {FirstTeam.Class1.Name}] -- -- --\n"); FirstTeam.Class1.FirstAbility.DisplayData(); FirstTeam.Class1.SecondAbility.DisplayData(); Console.WriteLine($"Type the following numbers to select an ability:\n(1) {FirstTeam.Class1.FirstAbility.Name}\n(2) {FirstTeam.Class1.SecondAbility.Name}"); SelectedAbility = Console.ReadLine(); if (SelectedAbility == "1") { attacking_ability = FirstTeam.Class1.FirstAbility; TeamStage = "Team1EnemySelection"; } else if (SelectedAbility == "2") { attacking_ability = FirstTeam.Class1.SecondAbility; TeamStage = "Team1EnemySelection"; } else { continue; } }// Team 1 Class 2 ability else if (TeamStage == "Team1Class2AbilitySelection") { string SelectedAbility = ""; Console.WriteLine($"-- -- -- [Team 1 {FirstTeam.Class2.Name}] -- -- --\n"); FirstTeam.Class2.FirstAbility.DisplayData(); FirstTeam.Class2.SecondAbility.DisplayData(); Console.WriteLine($"Type the following numbers to select an ability:\n(1) {FirstTeam.Class2.FirstAbility.Name}\n(2) {FirstTeam.Class2.SecondAbility.Name}"); SelectedAbility = Console.ReadLine(); if (SelectedAbility == "1") { attacking_ability = FirstTeam.Class2.FirstAbility; TeamStage = "Team1EnemySelection"; } else if (SelectedAbility == "2") { attacking_ability = FirstTeam.Class2.SecondAbility; TeamStage = "Team1EnemySelection"; } else { continue; } } else if (TeamStage == "Team1EnemySelection") { string SelectedEnemy = ""; Console.WriteLine($"-- -- -- [Team 2] -- -- --\n"); SecondTeam.Class1.DisplayData(); SecondTeam.Class2.DisplayData(); Console.WriteLine($"Type the following numbers to select an enemy:\n(1) {SecondTeam.Class1.Name}\n(2) {SecondTeam.Class2.Name}"); SelectedEnemy = Console.ReadLine(); if (SelectedEnemy == "1") { attacked_player = SecondTeam.Class1; attacked_aux_player = SecondTeam.Class2; TeamStage = "Attack"; } else if (SelectedEnemy == "2") { attacked_player = SecondTeam.Class2; attacked_aux_player = SecondTeam.Class1; TeamStage = "Attack"; } else { continue; } } // OTRĀS KOMANDAS KLASES UN SPĒJAS IZVĒLE // // else if (TeamStage == "Team2ClassSelection") { string SelectedClassName = ""; Console.WriteLine("-- -- -- [Team 2] -- -- --"); SecondTeam.Class1.DisplayData(); SecondTeam.Class2.DisplayData(); Console.WriteLine("\n-- -- -- [Team 1] -- -- --"); FirstTeam.Class1.DisplayData(); FirstTeam.Class2.DisplayData(); Console.WriteLine("\n~~~ TEAM 2 IS SELECTING ~~~\n"); Console.WriteLine($"Type the following numbers to select an attacking class:\n(1) {SecondTeam.Class1.Name}\n(2) {SecondTeam.Class2.Name}"); SelectedClassName = Console.ReadLine(); if (SelectedClassName == "1") { attacking_player = SecondTeam.Class1; attacking_aux_player = SecondTeam.Class2; TeamStage = "Team2Class1AbilitySelection"; } else if (SelectedClassName == "2") { attacking_player = SecondTeam.Class2; attacking_aux_player = SecondTeam.Class1; TeamStage = "Team2Class2AbilitySelection"; } else { continue; } } // Team 1 Class 1 ability else if (TeamStage == "Team2Class1AbilitySelection") { string SelectedAbility = ""; Console.WriteLine($"-- -- -- [Team 2 {SecondTeam.Class1.Name}] -- -- --\n"); SecondTeam.Class1.FirstAbility.DisplayData(); SecondTeam.Class1.SecondAbility.DisplayData(); Console.WriteLine($"Type the following numbers to select an ability:\n(1) {SecondTeam.Class1.FirstAbility.Name}\n(2) {SecondTeam.Class1.SecondAbility.Name}"); SelectedAbility = Console.ReadLine(); if (SelectedAbility == "1") { attacking_ability = SecondTeam.Class1.FirstAbility; TeamStage = "Team2EnemySelection"; } else if (SelectedAbility == "2") { attacking_ability = SecondTeam.Class1.SecondAbility; TeamStage = "Team2EnemySelection"; } else { continue; } }// Team 1 Class 2 ability else if (TeamStage == "Team2Class2AbilitySelection") { string SelectedAbility = ""; Console.WriteLine($"-- -- -- [Team 2 {SecondTeam.Class2.Name}] -- -- --\n"); SecondTeam.Class2.FirstAbility.DisplayData(); SecondTeam.Class2.SecondAbility.DisplayData(); Console.WriteLine($"Type the following numbers to select an ability:\n(1) {SecondTeam.Class2.FirstAbility.Name}\n(2) {SecondTeam.Class2.SecondAbility.Name}"); SelectedAbility = Console.ReadLine(); if (SelectedAbility == "1") { attacking_ability = SecondTeam.Class2.FirstAbility; TeamStage = "Team2EnemySelection"; } else if (SelectedAbility == "2") { attacking_ability = SecondTeam.Class2.SecondAbility; TeamStage = "Team2EnemySelection"; } else { continue; } } else if (TeamStage == "Team2EnemySelection") { string SelectedEnemy = ""; Console.WriteLine($"-- -- -- [Team 2] -- -- --\n"); FirstTeam.Class1.DisplayData(); FirstTeam.Class2.DisplayData(); Console.WriteLine($"Type the following numbers to select an enemy:\n(1) {FirstTeam.Class1.Name}\n(2) {FirstTeam.Class2.Name}"); SelectedEnemy = Console.ReadLine(); if (SelectedEnemy == "1") { attacked_player = FirstTeam.Class1; attacked_aux_player = FirstTeam.Class2; TeamStage = "Attack"; } else if (SelectedEnemy == "2") { attacked_player = FirstTeam.Class2; attacked_aux_player = FirstTeam.Class1; TeamStage = "Attack"; } else { continue; } } else if (TeamStage == "Attack") { if (attacking_player.dead == true) { attacking_player.HP = 0; if (attacking_player == FirstTeam.Class1 || attacking_player == FirstTeam.Class2) { TeamStage = "Team1ClassSelection"; } else { TeamStage = "Team2ClassSelection"; } continue; } attacking_ability.Attack(attacking_player, attacking_aux_player, attacked_player, attacked_aux_player); if (attacking_player == FirstTeam.Class1 || attacking_player == FirstTeam.Class2) { TeamStage = "Team2ClassSelection"; } else { TeamStage = "Team1ClassSelection"; } FirstTeam.Class1.ENG += FirstTeam.Class1.ENGR; FirstTeam.Class2.ENG += FirstTeam.Class2.ENGR; SecondTeam.Class1.ENG += SecondTeam.Class1.ENGR; SecondTeam.Class2.ENG += SecondTeam.Class2.ENGR; RoundCounter += 1; } } } } } }