Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.51 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6.  
  7. namespace TurnBasedCombat
  8. {
  9. class Program
  10. {
  11. public static class StaticRandom
  12. {
  13. private static int seed;
  14.  
  15. private static ThreadLocal<Random> threadLocal = new ThreadLocal<Random>
  16. (() => new Random(Interlocked.Increment(ref seed)));
  17.  
  18. static StaticRandom()
  19. {
  20. seed = Environment.TickCount;
  21. }
  22.  
  23. public static Random Instance { get { return threadLocal.Value; } }
  24. }
  25.  
  26. class Unit
  27. {
  28. Random RNG = new Random();
  29. public int curHP = 0;
  30. public int maxHP = 0;
  31.  
  32. public int curMP;
  33. public int maxMP;
  34. public float pow;
  35. public float vit;
  36. public float agi;
  37. public float dex;
  38. public float Dmg;
  39. public float randPow;
  40. public float hitRate;
  41. public int job;
  42. public float bonusDamage;
  43. public int chance = 0;
  44. public float bonusHP;
  45. public string name;
  46. public string team;
  47.  
  48. public List<Skill> Skill
  49. {
  50. get;
  51. set;
  52. }
  53. public Unit()
  54. {
  55. Skill = new List<Skill>();
  56. }
  57. public virtual void DisplayStats()
  58. {
  59. Console.WriteLine("Name: " + this.name);
  60. Console.WriteLine("HP: " + this.curHP + "/" + this.maxHP);
  61. Console.WriteLine("MP: " + curMP + "/" + maxMP);
  62. Console.WriteLine("POW: " + this.pow);
  63. Console.WriteLine("VIT: " + this.vit);
  64. Console.WriteLine("AGI: " + this.agi);
  65. Console.WriteLine("DEX: " + this.dex);
  66. }
  67. public int calculateBaseDmg()
  68. {
  69. float percent = StaticRandom.Instance.Next(20);
  70. percent /= 100;
  71. int baseDmg = (int)this.pow + (int)(percent * this.pow);
  72. this.randPow = this.Dmg + percent;
  73.  
  74. return baseDmg;
  75. }
  76. public virtual int calcuDmg(Unit Target, float skillDamage)
  77. {
  78. this.Dmg = (int)((calculateBaseDmg() - Target.vit) * calculateBnsDmg(Target) * skillDamage);
  79. if (Dmg == 0 || Dmg < 0)
  80. {
  81. Dmg = 1;
  82. }
  83. else if (Target.Dmg == 0 || Target.Dmg < 0)
  84. {
  85. Target.Dmg = 1;
  86. }
  87.  
  88. return (int)Dmg;
  89. }
  90.  
  91.  
  92. public virtual void calculateHitRate(Unit Target)
  93. {
  94. this.hitRate = (this.dex / Target.agi) * 100;
  95. Target.hitRate = (Target.dex / this.agi) * 100;
  96.  
  97. if (this.hitRate > 80)
  98. {
  99. this.hitRate = 80;
  100. }
  101. else if (Target.hitRate > 80)
  102. {
  103. Target.hitRate = 80;
  104. }
  105. else if (this.hitRate < 20)
  106. {
  107. this.hitRate = 20;
  108. }
  109. else if (Target.hitRate < 20)
  110. {
  111. Target.hitRate = 20;
  112. }
  113.  
  114. }
  115. public virtual void printHitRate(Unit target)
  116. {
  117. Console.WriteLine(this.hitRate);
  118. Console.WriteLine(target.hitRate);
  119. }
  120.  
  121. public virtual float calculateBnsDmg(Unit Target)
  122. {
  123. if (job == 3 && Target.job == 3 ||
  124. job == 1 && Target.job == 3 ||
  125. job == 2 && Target.job == 1)
  126. {
  127. return 1.5f;
  128. }
  129. else
  130. {
  131. return 1.0f;
  132. }
  133. }
  134.  
  135. public int takeDmg(int Damage)
  136. {
  137. this.curHP = this.curHP -= Damage;
  138.  
  139. return Damage;
  140. }
  141.  
  142. public int takeHeal()
  143. {
  144. this.bonusHP = (int)maxHP * 0.30f;
  145. this.curHP += (int)bonusHP;
  146.  
  147. return (int)this.bonusHP;
  148. }
  149.  
  150. public void mpCost(int cost)
  151. {
  152. curMP -= cost;
  153. }
  154. public int critHit(int Dmg)
  155. {
  156. float critDmg = Dmg * 0.20f;
  157.  
  158. curHP -= Dmg + (int)critDmg;
  159.  
  160. return Dmg;
  161. }
  162. }
  163.  
  164. class Warrior : Unit
  165. {
  166. public void Initialize(string _name, string _team)
  167. {
  168. job = 2;
  169. this.name = _name;
  170. team = _team;
  171. maxHP = StaticRandom.Instance.Next(290, 750);
  172. curHP = maxHP;
  173. maxMP = StaticRandom.Instance.Next(100, 250);
  174. //curMP = maxMP;
  175. curMP = 0;
  176. pow = StaticRandom.Instance.Next(400, 550);
  177. vit = StaticRandom.Instance.Next(300, 600);
  178. agi = StaticRandom.Instance.Next(10, 250);
  179. dex = StaticRandom.Instance.Next(50, 340);
  180. }
  181. public override void DisplayStats()
  182. {
  183. base.DisplayStats();
  184. }
  185.  
  186.  
  187. }
  188.  
  189. class Assassin : Unit
  190. {
  191. public void Initialize(string _name, string _team)
  192. {
  193. job = 1;
  194. this.name = _name;
  195. team = _team;
  196. maxHP = StaticRandom.Instance.Next(120, 750);
  197. curHP = maxHP;
  198. maxMP = StaticRandom.Instance.Next(100, 250);
  199. //curMP = maxMP;
  200. curMP = 0;
  201. pow = StaticRandom.Instance.Next(150, 340);
  202. vit = StaticRandom.Instance.Next(50, 250);
  203. agi = StaticRandom.Instance.Next(300, 650);
  204. dex = StaticRandom.Instance.Next(250, 590);
  205. }
  206. public override void DisplayStats()
  207. {
  208. base.DisplayStats();
  209. }
  210. }
  211.  
  212. class Mage : Unit
  213. {
  214. public void Initialize(string _name, string _team)
  215. {
  216. job = 3;
  217. this.name = _name;
  218. team = _team;
  219. maxHP = StaticRandom.Instance.Next(500, 550);
  220. curHP = maxHP;
  221. maxMP = StaticRandom.Instance.Next(100, 250);
  222. //curMP = maxMP;
  223. curMP = 0;
  224. pow = StaticRandom.Instance.Next(100, 330);
  225. vit = StaticRandom.Instance.Next(200, 620);
  226. agi = StaticRandom.Instance.Next(100, 390);
  227. dex = StaticRandom.Instance.Next(140, 310);
  228. }
  229.  
  230. public override void DisplayStats()
  231. {
  232. base.DisplayStats();
  233. }
  234. }
  235.  
  236. class Skill
  237. {
  238. public int mpCost = 0;
  239. public Random RNG = new Random();
  240. public virtual void Use(Unit user, List<Unit> targets)
  241. {
  242.  
  243. }
  244.  
  245. public int findLowest(List<Unit> targets, int lowestHP, int targeted, int index)
  246. {
  247. foreach (Unit unit in targets)
  248. {
  249. index++;
  250. if (unit.curHP <= lowestHP)
  251. {
  252. lowestHP = unit.curHP;
  253. targeted = index;
  254. }
  255. }
  256. return targeted;
  257. }
  258. }
  259.  
  260. class basicAtk : Skill
  261. {
  262. public override void Use(Unit user, List<Unit> Targets)
  263. {
  264. int random = StaticRandom.Instance.Next(Targets.Count);
  265. int chance = StaticRandom.Instance.Next(1, 101);
  266. int critChance = StaticRandom.Instance.Next(1, 101);
  267.  
  268. user.calculateBnsDmg(Targets[random]);
  269. user.calcuDmg(Targets[random], 1);
  270.  
  271. Console.WriteLine(user.calcuDmg(Targets[random], 1));
  272.  
  273. user.calculateHitRate(user);
  274. Console.WriteLine("Hit Rate: " + (int)user.hitRate);
  275. Console.WriteLine("Chance: " + chance);
  276.  
  277. //no mp cost
  278. int randTarget = StaticRandom.Instance.Next(Targets.Count);
  279. if (chance <= user.hitRate)
  280. {
  281. if (critChance <= 20)
  282. {
  283. Console.WriteLine("Critcical!");
  284. Targets[randTarget].critHit((int)user.Dmg);
  285. }
  286. else if (critChance > 20)
  287. {
  288. Targets[randTarget].takeDmg((int)user.Dmg);
  289. Console.WriteLine();
  290. }
  291. }
  292. else if (chance > user.hitRate)
  293. {
  294. Console.WriteLine("Missed!");
  295. return;
  296. }
  297.  
  298.  
  299. Console.WriteLine("---->" + user.name + " dealt " + user.Dmg + " to " + Targets[random].name + "!<------");
  300. Console.WriteLine("---->" + Targets[random].name + " has " + Targets[random].curHP + "/" + Targets[random].maxHP + " left!<------");
  301. }
  302. }
  303.  
  304. class Assassinate : Skill
  305. {
  306.  
  307. int index = -1;
  308. int lowestHP = int.MaxValue;
  309. int targeted = 10;
  310. public override void Use(Unit user, List<Unit> Targets)
  311. {
  312. mpCost = 5;
  313. user.curMP = user.curMP - mpCost;
  314. int target = findLowest(Targets, lowestHP, targeted, index);
  315. int damage = user.calcuDmg(Targets[target], 0.9f);
  316. user.calculateBnsDmg(Targets[target]);
  317. user.calcuDmg(Targets[target], 1);
  318. user.calculateHitRate(user);
  319. Targets[target].takeDmg((int)damage);
  320. Console.WriteLine(user.name + " ASSASSINATED " + Targets[target].name + " dealing " + user.Dmg + " damage!");
  321. Console.WriteLine(Targets[target].name + " has " + Targets[target].curHP + "/" + Targets[target].maxHP + " left!");
  322. }
  323. }
  324.  
  325. class Shockwave : Skill
  326. {
  327. public override void Use(Unit user, List<Unit> Targets)
  328. {
  329. foreach (Unit unit in Targets)
  330. {
  331. mpCost = 7;
  332. user.curMP = user.curMP - mpCost;
  333. int damage = user.calcuDmg(unit, 0.9f);
  334. unit.takeDmg((int)damage);
  335. Console.WriteLine(user.name + " used Shockwave on " + unit.name + " dealing " + unit.Dmg + " damage!");
  336. Console.WriteLine(unit.name + " has " + unit.curHP + "/" + unit.maxHP + " left!");
  337. }
  338. //base.Use(user, Targets);
  339. }
  340. }
  341.  
  342. class Heal : Skill
  343. {
  344. int index = -1;
  345. int lowestHP = int.MaxValue;
  346. int targeted = 10;
  347. public override void Use(Unit user, List<Unit> Targets)
  348. {
  349. mpCost = 10;
  350. user.curMP = user.curMP - mpCost;
  351. int target = findLowest(Targets, lowestHP, targeted, index);
  352. Console.WriteLine(user.name + " healed " + Targets[target].name + " for " + Targets[target].takeHeal());
  353. Console.WriteLine(Targets[target].name + " has " + Targets[target].curHP + "/" + Targets[target].maxHP + " left!");
  354. }
  355. }
  356. static List<Unit> turnOrder(List<Unit> playerList, List<Unit> enemyList, List<Unit> orderTurn)
  357. {
  358. // List<Unit> orderTurn = new List<Unit>();
  359. //add participants
  360. for (int p = 0; p < playerList.Count(); p++)
  361. {
  362. orderTurn.Add(playerList[p]);
  363. }
  364. for (int e = 0; e < enemyList.Count(); e++)
  365. {
  366. orderTurn.Add(enemyList[e]);
  367. }
  368.  
  369. Unit tempUnit;
  370. for (int i = 0; i < orderTurn.Count(); i++)
  371. {
  372. for (int j = 0; j < orderTurn.Count(); j++)
  373. {
  374. if (orderTurn[i].agi > orderTurn[j].agi)
  375. {
  376. tempUnit = orderTurn[j];
  377. orderTurn[j] = orderTurn[i];
  378. orderTurn[i] = tempUnit;
  379. }
  380. }
  381. }
  382. return orderTurn;
  383. }
  384.  
  385. static void battleSystem(List<Unit> turnOrders, List<Unit> playerTeam, List<Unit> enemyTeam)
  386. {
  387. Unit firstUnit = turnOrders.First();
  388.  
  389. for (int i = 0; i < turnOrders.Count; i++)
  390. {
  391. if (firstUnit.curHP <= 0)
  392. {
  393. Console.WriteLine(firstUnit.name + " is dead!");
  394. turnOrders.Remove(firstUnit);
  395. }
  396. }
  397. int choice;
  398. int enemyChoice;
  399. enemyChoice = StaticRandom.Instance.Next(0, 1);
  400.  
  401. if (firstUnit.team == "Player Team")
  402. {
  403.  
  404. Console.WriteLine("==========Current Turn: " + firstUnit.name + "==========");
  405. firstUnit.DisplayStats();
  406. Console.WriteLine("0: Attack\n1: Skill");
  407.  
  408. //choice = Convert.ToInt32(Console.ReadLine());
  409. while(true)
  410. {
  411. if (int.TryParse(Console.ReadLine(), out choice))
  412. {
  413. break;
  414. }
  415. }
  416. Skill skill = firstUnit.Skill[choice];
  417. if (choice == 0)
  418. {
  419. skill.Use(firstUnit, enemyTeam);
  420. }
  421. if (choice == 1)
  422. {
  423. if (firstUnit.curMP >= skill.mpCost)
  424. {
  425. if (firstUnit.job == 3)
  426. {
  427. skill.Use(firstUnit, playerTeam); //heal
  428. }
  429.  
  430. else if (firstUnit.job != 3)
  431. {
  432. skill.Use(firstUnit, enemyTeam); //attack with skill
  433. }
  434. }
  435. else if (firstUnit.curMP < skill.mpCost)
  436. {
  437. Console.WriteLine("Insufficient Mana!");
  438. }
  439. }
  440. }
  441.  
  442. else if (firstUnit.team == "Enemy Team")
  443. {
  444. Skill skill = firstUnit.Skill[enemyChoice];
  445. Console.WriteLine("==========Current Turn: " + firstUnit.name + "==========");
  446. firstUnit.DisplayStats();
  447. enemyChoice = StaticRandom.Instance.Next(0, 1);
  448. if (enemyChoice == 0)
  449. {
  450. skill.Use(firstUnit, playerTeam);
  451. }
  452. else if (enemyChoice == 1)
  453. {
  454.  
  455. if (firstUnit.job == 3)
  456. {
  457. skill.Use(firstUnit, enemyTeam);
  458. }
  459.  
  460. else
  461. {
  462. skill.Use(firstUnit, playerTeam);
  463. }
  464. // skill.Use(firstUnit, playerTeam);
  465. }
  466. }
  467. Console.WriteLine("\nNext Turn!");
  468.  
  469. NextTurn(turnOrders);
  470. }
  471.  
  472. static void NextTurn(List<Unit> Participants)
  473. {
  474. int i = 0;
  475. Unit temp;
  476.  
  477. for (int j = i + 1; j < Participants.Count; j++)
  478. {
  479. temp = Participants[i];
  480. Participants[i] = Participants[j];
  481. Participants[j] = temp;
  482. i++;
  483. }
  484. }
  485.  
  486. static void Main(string[] args)
  487. {
  488. //Skills
  489. basicAtk basicAttack = new basicAtk();
  490. Assassinate asssinate = new Assassinate();
  491. Shockwave shockwave = new Shockwave();
  492. Heal heal = new Heal();
  493. /////////
  494.  
  495. //Create Player Team//
  496. List<Unit> playerTeam = new List<Unit>();
  497.  
  498. //Create skills
  499.  
  500. List<Unit> turnOrders = new List<Unit>();
  501.  
  502. //Create Player Members//
  503.  
  504. Warrior playerWarrior = new Warrior();
  505. playerWarrior.Initialize("Grand Saber Cody", "Player Team");
  506. playerTeam.Add(playerWarrior);
  507. playerWarrior.Skill.Add(basicAttack);
  508. playerWarrior.Skill.Add(shockwave);
  509. Skill playerShockwave = playerWarrior.Skill[1];
  510.  
  511. Mage playerMage = new Mage();
  512. playerMage.Initialize("Grand Caster Paolo", "Player Team");
  513. playerTeam.Add(playerMage);
  514. playerMage.Skill.Add(basicAttack);
  515. playerMage.Skill.Add(heal);
  516. Skill playerHeal = playerMage.Skill[1];
  517.  
  518. Assassin playerAssassin = new Assassin();
  519. playerAssassin.Initialize("Grand Assassin Virgilio", "Player Team");
  520. playerTeam.Add(playerAssassin);
  521. playerAssassin.Skill.Add(basicAttack);
  522. playerAssassin.Skill.Add(asssinate);
  523. Skill playerAssassinate = playerAssassin.Skill[1];
  524.  
  525. // Initialize Enemy Team
  526. List<Unit> enemyTeam = new List<Unit>();
  527.  
  528. // Initialize Enemy Members
  529.  
  530. Warrior enemyWarrior = new Warrior();
  531. enemyWarrior.Initialize("The Rude Warrior", "Enemy Team");
  532. enemyTeam.Add(enemyWarrior);
  533. enemyWarrior.Skill.Add(basicAttack);
  534. enemyWarrior.Skill.Add(shockwave);
  535. Skill enemyShockwave = playerWarrior.Skill[1];
  536.  
  537. Mage enemyMage = new Mage();
  538. enemyMage.Initialize("Filthy Mage", "Enemy Team");
  539. enemyTeam.Add(enemyMage);
  540. enemyMage.Skill.Add(basicAttack);
  541. enemyMage.Skill.Add(heal);
  542. Skill enemyHeal = enemyMage.Skill[1];
  543.  
  544. Assassin enenmyAssassin = new Assassin();
  545. enenmyAssassin.Initialize("Meme Assassin", "Enemy Team");
  546. enemyTeam.Add(enenmyAssassin);
  547. enenmyAssassin.Skill.Add(basicAttack);
  548. enenmyAssassin.Skill.Add(asssinate);
  549. Skill enemyAssassinate = enenmyAssassin.Skill[1];
  550.  
  551. Console.WriteLine("Team: [The F2Ps]");
  552. foreach (Unit unit in playerTeam) unit.DisplayStats();
  553. Console.WriteLine("\nTeam: [The Whales]");
  554. foreach (Unit unit in enemyTeam) unit.DisplayStats();
  555.  
  556. turnOrder(playerTeam, enemyTeam, turnOrders);
  557.  
  558.  
  559. ///////////////////
  560. //turn order//
  561. Console.WriteLine();
  562. Console.WriteLine("Turn Order: ");
  563. for (int i = 0; i < turnOrders.Count; i++)
  564. Console.WriteLine("[" + i + "]" + turnOrders[i].name);
  565. ///////////////////
  566. while (playerTeam.Count > 0 || enemyTeam.Count > 0)
  567. {
  568. battleSystem(turnOrders, playerTeam, enemyTeam);
  569.  
  570. Console.ReadKey();
  571. }
  572. Console.ReadKey();
  573. }
  574. }
  575. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement