Example #1
0
        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;
        }
Example #2
0
        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);
        }