public Game(string user, List <Card> fgc) { //Rnd = new Random(); lastHitInfo = new LastHitInfo(); Gamers.Add(user); currUsr = user; firstGamerCards = new List <Card>(fgc); Program.UserThreadLock.EnterReadLock(); fGamer = Program.OnlineUsers.Find(u => u.nick == user); Program.UserThreadLock.ExitReadLock(); gameState = 1; }
public LastHitInfo DoAttack(string nickname, int myslot, int enslot) { int dmg = -1; LastHitInfo lhi = null; try { Program.GameThreadLock.EnterReadLock(); Game game = Program.OnlineGames.Find(g => g.Gamers.Contains(nickname)); Program.GameThreadLock.ExitReadLock(); bool isWin = false; if (game != null) { lock (game) { if (game.currUsr != nickname) { return(lhi); } foreach (var item in game.firstGamerCards) { item.IsAttacked = false; } foreach (var item in game.twoGamerCards) { item.IsAttacked = false; } game.lastHitInfo.isMissed = false; game.lastHitInfo.IsCritical = false; if (game.gameState == 2) { Card myC = game.firstGamerCards.Find(cc => cc.slot == myslot); Card enC = game.twoGamerCards.Find(cc => cc.slot == enslot); //myC.Enabled = false; if (!Formulas.IsMiss()) //miss? { //calc real damage dmg = Formulas.CalculateDamage(myC.dmg, enC.def); if (dmg <= 0) { dmg = 1; } else { if (Formulas.IsCrit()) //crit damage { dmg = Formulas.CalculateCritDamage(dmg); game.lastHitInfo.IsCritical = true; } } int temp = enC.hp; //save curr hp enC.hp = enC.hp - dmg; //test //enC.dmg = enC.dmg - dmg/2; //if (enC.dmg < 1) enC.dmg = 1; if (enC.hp <= 0) { if (enC.hp < 0) { dmg = temp; //if overhit -> change hp } enC.hp = 0; enC.Enabled = false; } else { enC.TryEnjured((double)dmg, (double)temp); } } else { game.lastHitInfo.isMissed = true; } game.lastHitInfo.slot = myslot; game.lastHitInfo.dmg = dmg; lhi = game.lastHitInfo; enC.IsAttacked = true; isWin = game.CheckWinner(); //if (!isWin && game.firstGamerCards.Find(cc => cc.Enabled == true) == null) if (!isWin) //3 or < cards per turn... test { /* int cardsPerTurn = 3; * * if (game.firstGamerCards.FindAll(cc=> cc.hp > 0).Count >= 3) * cardsPerTurn = 3; * else if (game.firstGamerCards.FindAll(cc => cc.hp > 0).Count == 2) * cardsPerTurn = 2; * else if (game.firstGamerCards.FindAll(cc => cc.hp > 0).Count == 1) * cardsPerTurn = 1; * * * if (game.firstGamerCards.FindAll(cc => cc.Enabled == false && cc.hp > 0).Count >= cardsPerTurn) * { * foreach (var item in game.firstGamerCards) * { * if (item.hp > 0) item.Enabled = true; * } */ game.currUsr = game.Gamers[1]; game.gameState = 3; //} } else if (isWin) { setReward(game.Gamers[0], game.WinGamerReward, game, true); setReward(game.Gamers[1], game.LooseGamerReward, game, false); } } else if (game.gameState == 3) { Card myC = game.twoGamerCards.Find(cc => cc.slot == myslot); Card enC = game.firstGamerCards.Find(cc => cc.slot == enslot); //myC.Enabled = false; if (!Formulas.IsMiss()) //miss? { //calc real damage dmg = Formulas.CalculateDamage(myC.dmg, enC.def); if (dmg <= 0) { dmg = 1; } else { if (Formulas.IsCrit()) //crit damage { dmg = Formulas.CalculateCritDamage(dmg); game.lastHitInfo.IsCritical = true; } } int temp = enC.hp; //save curr hp enC.hp = enC.hp - dmg; //test //enC.dmg = enC.dmg - dmg/2; //if (enC.dmg < 1) enC.dmg = 1; if (enC.hp <= 0) { if (enC.hp < 0) { dmg = temp; //if overhit -> change hp } enC.hp = 0; enC.Enabled = false; } else { enC.TryEnjured((double)dmg, (double)temp); } } else { game.lastHitInfo.isMissed = true; } game.lastHitInfo.slot = myslot; game.lastHitInfo.dmg = dmg; lhi = game.lastHitInfo; enC.IsAttacked = true; isWin = game.CheckWinner(); //if (!isWin && game.twoGamerCards.Find(cc => cc.Enabled == true) == null) if (!isWin) //3 or < cards per turn... test { /*int cardsPerTurn = 3; * * if (game.twoGamerCards.FindAll(cc => cc.hp > 0).Count >= 3) * cardsPerTurn = 3; * else if (game.twoGamerCards.FindAll(cc => cc.hp > 0).Count == 2) * cardsPerTurn = 2; * else if (game.twoGamerCards.FindAll(cc => cc.hp > 0).Count == 1) * cardsPerTurn = 1; * * * if (game.twoGamerCards.FindAll(cc => cc.Enabled == false && cc.hp > 0).Count >= cardsPerTurn) * { * foreach (var item in game.twoGamerCards) * { * if (item.hp > 0) item.Enabled = true; * } */ game.currUsr = game.Gamers[0]; game.gameState = 2; // } } else if (isWin) { setReward(game.Gamers[1], game.WinGamerReward, game, true); setReward(game.Gamers[0], game.LooseGamerReward, game, false); } } } } } catch (Exception exc) { Console.WriteLine("ERROR: " + exc.Message + "\r\n" + exc.StackTrace); Program.dumpException(exc); } return(lhi); }