Beispiel #1
0
        //example
        //from player: from have 2_russia + another 1_russia
        //to: to have 2_france + 1_france
        private static Trade CheckOnPlayersCells(Game g, TradeRule trd, int my)
        {
            var pfrom = g.GetPlayer(my);

            //from_pl get cells
            var wantedCellsGroupedByUser = g.Map.CellsByGroup(trd.GetLand)
                .Where(x => x.Owner.HasValue && x.Owner != my)
                .GroupBy(x => x.Owner.Value);

            if (!wantedCellsGroupedByUser.Any()) return null;

            //process for each player
            foreach (var wantedByUser in wantedCellsGroupedByUser)
            {
                if (wantedByUser.Count() != trd.GetCount) continue;

                var pto = g.GetPlayer(wantedByUser.First().Owner.Value);

                // i have
                var _myCells = g.Map.CellsByUserByGroup(my, trd.GetLand).Count() == trd.MyCount;

                //you have
                var _yourCells = g.Map.CellsByUserByGroup(pto.Id, trd.GiveLand).Count() == trd.YourCount;

                //i give to you
                var giveCells = g.Map.CellsByUserByGroup(my, trd.GiveLand);

                //money factor
                var money1 = g.GetPlayerAssets(my, false);
                var money2 = g.GetPlayerAssets(pto.Id, false);

                var mfac = (money1 / (double)money2) >= trd.MoneyFactor;

                if (giveCells.Count() == trd.GiveCount && _myCells && _yourCells && mfac)
                {
                    //g.trState = new TradeState
                    return new Trade
                    {
                        from = g.GetPlayer(my),
                        give_cells = giveCells.Select(x => x.Id).ToArray(),
                        giveMoney = trd.GiveMoney,
                        //fromMoney = string.IsNullOrEmpty(from_money) ? 0 : Int32.Parse(from_money),
                        to = pto,
                        get_cells = wantedByUser.Select(x => x.Id).ToArray(),
                        getMoney = trd.GetMoney,
                        ExchId = trd.Id,
                    };
                }
            }
            return null;
        }
Beispiel #2
0
 public static void MakeAuctionNo(Game g, string userName)
 {
     var p = g.GetPlayer(userName);
     g.Tlog("PlayerAction.AuctionNo.PlayerOut", "@p{0} выбывает", "@p{0} is out", p.Id);
     p.InAuction = false;
     GameManager.CheckAuctionWinner(g);
 }
Beispiel #3
0
        public static string RenderTradeProposal(Game g, string userName)
        {
            var res = "player {0} want trade with {1} <br />player {0} -> {2} <br /> player {1} -> {3} <br />";

            var action = "<input id=\"btnTrY\" type=\"button\" value=\"yes\" onclick=\"action('tr_y');\" />" +
            "<input id=\"btnTrNo\" type=\"button\" value=\"no\" onclick=\"action('tr_no');\" />";

            //request of player
            var pl = g.GetPlayer(userName);

            var fr = g.CurrTrade.from.htmlName;
            var to = g.CurrTrade.to.htmlName;

            var fromProposal = g.CurrTrade.give_cells.Aggregate("", (acc, i) => acc + "," + g.Cells[i].Name);
            fromProposal += g.CurrTrade.giveMoney == 0 ? "" : string.Format(", money = {0}K", g.CurrTrade.giveMoney);

            var toProposal = g.CurrTrade.get_cells.Aggregate("", (acc, i) => acc + "," + g.Cells[i].Name);
            toProposal += g.CurrTrade.getMoney == 0 ? "" : string.Format(", money = {0}K", g.CurrTrade.getMoney);

            if (pl != null && pl.Id == g.CurrTrade.to.Id)
            {
                return string.Format(res + action, fr, to, fromProposal, toProposal);
            }
            else return string.Format(res, fr, to, fromProposal, toProposal);
        }
Beispiel #4
0
        //state - p0-1-2-3-m400
        public static bool BuildOrSell(Game g, string state, string action, string userName)
        {
            //dont build if user on your land

            if (action == "build" && (g.State == GameState.NeedPay || g.State == GameState.CantPay)) return false;

            var pst = state.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

            var ss = pst.OrderByDescending(x => x.Length).Take(1).ToArray();

            Player from = g.GetPlayer(userName);

            var q = ss.Length == 1;

            if (q && from != null)
            {
                var from_ids = ss[0].Replace("p" + from.Id, "").Trim('-').Split('-').Select(x => Int32.Parse(x)).ToArray();
                if (action == "build")
                    return PlayerAction.Build(g, from.Id, from_ids);
                else
                {
                    PlayerAction.SellHouses(g, from.Id, from_ids);
                    return true;
                }

            }
            return false;
            //g.FinishStep();
        }
Beispiel #5
0
        public static string RenderRollButton(Game g, string uname)
        {
            var pl = g.GetPlayer(uname);

            if (g.State == GameState.BeginStep && pl != null)
                if (!g.IsManualMode)
                {
                    if (pl.Id == g.Curr.Id && !pl.IsBot)
                        return UIParts("ButtonRoll");
                }
                else
                {
                    if (pl.ManRoll != 0)
                    {
                        var tt = g.Text("manRoll.pressed", "вы нажали ", "you pressed ") + pl.ManRoll;
                        return tt;
                    }
                    return UIParts("PartManualRoll");
                }

            return "wait...";
        }
Beispiel #6
0
        public static bool Build(Game g, int pid, IEnumerable<int> ids)
        {
            var p = g.GetPlayer(pid);
            bool res = false;
            foreach (var id in ids)
            {
                var cell = g.Cells[id];

                if (cell.IsMonopoly)
                {
                    if (p.Money >= cell.HouseCost)
                    {
                        if (cell.HousesCount < 5)
                        {
                            cell.HousesCount++;
                            p.Money -= cell.HouseCost;
                            res = true;
                        }
                    }
                }
            }
            return res;
        }
Beispiel #7
0
        private static string RenderStartState(Game g, string uname)
        {
            var p = g.GetPlayer(uname);

            if (p != null && p.CaughtByPolice && p.Id == g.Curr.Id)
            {
                if (p.Police == 4)
                    return string.Format("you must pay {0}", UIParts("ButtonPay"));
                else
                {

                    if (p.FreePoliceKey > 0)
                    {
                        var tt = g.Text("Map.OutPoliceWithKey", "Хотите заплатить за выход {0} или ключ {1} ", "want pay to out from POLICE {0} or use key {1}");
                        return string.Format(tt, UIParts("ButtonPay"), UIParts("ButtonPoliceUseKey"));
                    }
                    else
                    {
                        var tt = g.Text("Map.OutPolice", "Хотите заплатить за выход {0}", "want pay to out from POLICE {0}");
                        return string.Format(tt, UIParts("ButtonPay"));
                    }

                }
            }
            else
            {
                var tt = "last roll " + RenderLastRoll(g)+"<br />";
                tt += g.Text("Map.StepOf", "ходит... ", "step of... ") + g.Curr.htmlName;
                return tt;
            }
        }
Beispiel #8
0
        public static string ShowGameState(Game g, string uname)
        {
            if (g == null) return "";

            var p = g.GetPlayer(uname);

            if (p == null) return g.Text("PlayerState.WatchingGame", "Вы наблюдаете за игрой", "You are watching game");

            string paction = "";

            string rolled = "";// string.Format("roll {0} <br />", g.Curr.PrintLastRoll);

            var IsCurrPlayer = g.IsCurrPlayer(uname);

            if (!IsCurrPlayer && !g.IsManualMode) paction = rolled + g.Text("Map.Waiting", "ждите ход...", "waiting...");

            if (p.IsBot) return rolled + g.Text("Map.RenderBotPlaying", "играет компьютер...", "Bot playing...");

            switch (g.State)
            {
                case GameState.BeginStep:
                    paction = GameRender.RenderStartState(g, uname);

                    paction += "<br />" + GameRender.RenderRollButton(g, uname);
                    break;

                case GameState.Mortgage:
                    paction = g.Text("Mortage.Cell", "земля заложена <br />", "land is mortgaged <br />");
                    break;

                case GameState.CanBuy:
                    if (IsCurrPlayer)
                    {
                        var tt = g.Text("pAction.CanBuy", "вы можете купить", "you can buy");
                        paction = string.Format("{0} {1}<br /> {2}", tt, g.CurrCell.Name,
                            UIParts("BuyOrAuc"));
                    }
                    break;

                case GameState.Auction:
                    paction = RenderAuction(g, uname);
                    break;

                case GameState.Trade:
                    paction = GameRender.RenderTradeProposal(g, uname);
                    break;

                case GameState.NeedPay:
                    if (IsCurrPlayer)
                    {
                        if (g.Curr.Police == 4)
                            paction = string.Format("{0} {1} {2}",
                                g.Text("pAction.MustPay", "вы должны заплатить", "you must pay"),
                                UIParts("ButtonPay"),
                                g.PayAmount.PrintMoney()
                                );
                        else
                            paction = string.Format("{0} {1}", UIParts("ButtonPay"), g.PayAmount.PrintMoney());
                    }
                    break;

                case GameState.CantPay:
                    if (IsCurrPlayer)
                    {
                        paction = g.Text("CannotPay",
                            "у вас нет денег, попробуйте заложить", "not enough money, try mortgage land");

                        if (g.CurrCell.Owner == null && g.CurrCell.IsLand)
                            paction += "<br />" + UIParts("BuyOrAuc");
                        else paction += "<br />" + UIParts("ButtonPay");
                    }
                    //g.State = GameState.Pay;
                    break;

                case GameState.MoveToCell:
                    if (IsCurrPlayer)
                    {
                        if (g.LastRandomCard != null && g.LastRandomCard.Pos != 10)
                            paction = string.Format("{0} {1} {2}",
                                 UIParts("ButtonRandomMove"),
                                g.Text("go.RanodmMove", " на клетку ", " to cell "),
                                g.LastRandomCard.Pos);
                        else
                            paction = string.Format("{0} {1}", UIParts("ButtonRandomMove"),
                       g.Text("go.RanodmMove.Police", "вас задержал интерпол", "go to Police"));

                    }
                    break;

                case GameState.RandomCell:
                    if (g.IsCurrPlayer(uname))
                    {
                        paction = string.Format("{0} {1}",
                            g.LastRandomCard.Text,
                             UIParts("ButtonOK"));
                    }
                    else paction = g.LastRandomCard.Text;

                    break;

                default:
                    paction = "Nothing";
                    break;
            }

            return string.Format("{0}", paction);

            //var lr = g.LastRoll != null ? g.LastRoll : new[] { 1, 1 };
            //var roll = string.Format("{0}<br /> {1} {2}",
            //    g.Text("Map.LastRoll", "последний бросок", "last roll"),
            //    //g.Curr.htmlName,
            //    ImageHelper.GetRollImage(lr[0]),
            //    ImageHelper.GetRollImage(lr[1]));

            //return string.Format("{0} <br /> {1}", roll, paction);
        }
Beispiel #9
0
        public static void MakeAuctionYes(Game g, string userName)
        {
            var pl = g.GetPlayer(userName);

            if (pl == null) return;

            //StartAction(g);
            g.CleanTimeOut();

            var mm = g.GetPlayerCash(pl.Id);

            var LastBiddedPlayer = g.currAuction.LastBiddedPlayer;

            if (LastBiddedPlayer != null)
            {
                if (LastBiddedPlayer.Id == pl.Id) return;
            }

            if (mm >= g.currAuction.nextBid)
            {
                g.currAuction.currBid += 50000;
                g.Tlog("Auction.Yes", "@p{0} дает {1}", "@p{0} bid {1}", pl.Id, g.currAuction.currBid.PrintMoney());
                g.currAuction.LastBiddedPlayer = pl;

            }
            else
            {
                g.Tlog("PlayerAction.AuctionYes.NoMoney", "@p{0} не хватает денег ", "@p{0} no money", pl.Id);
                pl.InAuction = false;
            }
            //GameManager.CheckAuctionWinner(g);
        }
Beispiel #10
0
        public ActionResult Roll(int roll)
        {
            g = GetGame();
            if (g == null) return RedirectToAction("Index", "Home");

            if (g.State == GameState.BeginStep)
            {
                if (g.IsManualMode)
                {
                    var p = g.GetPlayer(CurrUser);

                    if (p.ManRoll == 0)
                    {
                        p.ManRoll = roll;
                        g.Tlog("step.ManRoll.pressed", "{0} нажал", "{0} pressed", p.htmlName);
                    }
                }
                else
                    if (g.IsCurrPlayer(CurrUser))
                        PlayerStep.MakeStep(g);
            }

            return RenderGame(g);
        }
Beispiel #11
0
        public static void MortgageLands(Game g, int pid, IEnumerable<int> from_ids)
        {
            var p = g.GetPlayer(pid);

            foreach (var id in from_ids)
            {
                var c = g.Cells[id];
                if (!c.IsMortgage)
                {
                    c.IsMortgage = true;
                    p.Money += c.MortgageAmount;
                }
                else
                {
                    if (c.IsMortgage)
                    {
                        if (p.Money >= c.UnMortgageAmount)
                        {
                            c.IsMortgage = false;
                            p.Money -= c.UnMortgageAmount;
                        }
                    }
                }

            }
        }
Beispiel #12
0
 public static bool MakeTrade(Game g, string userName, bool isYes)
 {
     if (g.CurrTrade.to.Id == g.GetPlayer(userName).Id && isYes)
     {
         GameManager.MakeTrade(g);
         return true;
     }
     else
     {
         GameManager.AddToRejectedTrades(g);
         g.Tlogp("PlayerAction.Trade.AddToRej", "к игнорируемым {0}", "added to rejected trades {0}", g.CurrTrade.ToString());
         g.ToBeginRound();
         return false;
     }
 }
Beispiel #13
0
        private static Player GetNextAuctionPlayer(Game g)
        {
            int nextId = g.currAuction.LastBiddedPlayer != null ?
                g.currAuction.LastBiddedPlayer.Id :
                g.Curr.Id;

            var pls = g.Players.Where(x => x.InAuction).Select(x => x.Id).ToArray();

            Player next = null;

            for (int i = 0; i < pls.Length; i++)
            {
                if (pls[i] == nextId)
                    if (i != pls.Length - 1)
                        next = g.GetPlayer(pls[i + 1]);
                    else next = g.GetPlayer(pls[0]);
            }

            g.currAuction.CurrPlayer = next;

            if (g.conf.DebugMode)
                g.Tlog("GetNextAuctionPlayer", "next {0}", "next {0}", next.Id);
            return next;
        }
Beispiel #14
0
        public static void LeaveGame(Game g, string uname)
        {
            if (g.IsFinished) return;

            var p = g.GetPlayer(uname);

            if (p == null) return;

            if (g.Players.Count > 2)
            {
                foreach (var cell in g.Map.CellsByUser(p.Id))
                {
                    cell.Owner = null;
                    cell.HousesCount = 0;
                }
                g.Tlog("Game.LeaveGame.PlayerLeaveGame", "@p{0} покинул игру", "@p{0} leave Game ", p.Id);
                //g.Players.Remove(p);
                p.Deleted = true;
                g.pcount--;
                g.OnLeave(p.Name, false);

            }
            else
                if (g.Players.Count == 2)
                {
                    g.Winner = g.Players.First(x => x.Id != p.Id);
                    g.Tlog("Game.LeaveGame.PlayerIsWinner", "@p{0} ПОБЕДИТЕЛЬ", "@p{0} is WINNER ", g.Winner.Id);
                    g.SetState(GameState.FinishGame);
                    g.OnLeave(p.Name, false);
                    g.OnLeave(g.Winner.Name, true);

                }
        }
Beispiel #15
0
        public static void InitTrade(Game g, string state, int pid)
        {
            state = state.Replace("undefined", "");
            var pst = state.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

            Player from = g.GetPlayer(pid);

            var ss_from = pst.SingleOrDefault(x => x.StartsWith("p" + from.Id));

            var ss_to = pst.Where(x => !x.StartsWith("p" + from.Id)).OrderByDescending(x => x.Length).FirstOrDefault();
            if (ss_to == null)
            {
                return;
            }

            Player to = null;
            var q = ss_from.Length > 1;

            if (q)
            {
                foreach (var pp in g.Players)
                {
                    if (ss_to.StartsWith("p" + pp.Id)) to = pp;
                }

                var from_ids = ss_from.Replace("p" + from.Id, "").Trim('-').Split('-').Where(x => !x.StartsWith("m")).Select(x => Int32.Parse(x)).ToArray();
                var from_money_str = ss_from.Trim('-').Split('-').FirstOrDefault(x => x.StartsWith("m"));
                var from_money = from_money_str != null ? from_money_str.Replace("m", "") : "";

                var to_ids = ss_to.Replace("p" + to.Id, "").Trim('-').Split('-').Where(x => !x.StartsWith("m")).Select(x => Int32.Parse(x)).ToArray();
                var to_money_str = ss_to.Trim('-').Split('-').FirstOrDefault(x => x.StartsWith("m"));
                var to_money = to_money_str != null ? to_money_str.Replace("m", "") : "";

                var trState = new Trade
                {
                    from = from,
                    give_cells = from_ids,
                    giveMoney = string.IsNullOrEmpty(from_money) ? 0 : Int32.Parse(from_money),
                    to = to,
                    get_cells = to_ids,
                    getMoney = string.IsNullOrEmpty(to_money) ? 0 : Int32.Parse(to_money),
                };
                g.CurrTrade = trState;

            }
        }
Beispiel #16
0
 public static void InitTrade(Game g, string state, string userName)
 {
     Player from = g.GetPlayer(userName);
     InitTrade(g, state, from.Id);
 }
Beispiel #17
0
        public static bool Pay(Game g, bool needFinish = true)
        {
            //if (g.State != GameState.NeedPay) return ;

            var curr = g.Curr;
            var amount = g.PayAmount;
            //if (amount == 0) return true;

            var ok = curr.IsBot ?
                BotBrain.MortgageSell(g, curr, amount)
                : curr.Money > amount;

            if (ok)
            {
                curr.Money -= amount;
                if (g.PayToUserId.HasValue)
                {
                    var to = g.GetPlayer(g.PayToUserId.Value);
                    to.Money += amount;
                    g.PayToUserId = null;
                }
                if (needFinish) g.FinishStep("paid_" + g.PayAmount.PrintMoney());
                else g.SetState(GameState.BeginStep);

                g.PayAmount = 0;
                return true;
            }
            else
            {
                g.Tlogp("PlayerAction.PayAmount", "не хватает денег", "not enough money");
                g.ToCantPay();
            }
            return false;
        }
Beispiel #18
0
        public static bool SellHouses(Game g, int pid, IEnumerable<int> ids)
        {
            var p = g.GetPlayer(pid);
            g.Tlog("PlayerAction.SellHouses.Sell", "@p{0} продал дом", "@p{0} sell house", p.Id);

            bool res = false;
            foreach (var id in ids)
            {
                var cell = g.Cells[id];

                if (cell.IsMonopoly)
                {

                    if (cell.HousesCount > 0)
                    {
                        cell.HousesCount--;
                        p.Money += cell.HouseCost;
                        res = true;

                    }

                }

            }

            return res;
        }
Beispiel #19
0
        public ActionResult Go(string act)
        {
            g = GetGame();
            if (g == null) return RedirectToAction("Index", "Home");

            if (act == "exit")
            {
                GameManager.LeaveGame(g, CurrUser);
                return RedirectToAction("Index", "Home");
            }
            if (act == "InitManTrades")
            {
                SiteGameHelper.LoadResources(g, Server.MapPath(ConfigHelper.ResDir));
            }
            if (act == "SetAsBot")
            {
                var pl = g.GetPlayer(CurrUser);

                if (pl != null) pl.IsBot = !pl.IsBot;

            }

            GameHandlers.Go(g, act, CurrUser);

            return RenderGame(g);
        }
Beispiel #20
0
        public static bool Mortgage(Game g, string state, string userName)
        {
            var pst = state.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            Player p = g.GetPlayer(userName);

            var ss = pst.SingleOrDefault(x => x.StartsWith("p" + p.Id));
            if (ss.Trim() == "p" + p.Id) return false;

            if (ss != null && p != null)
            {
                var from_ids = ss.Replace("p" + p.Id, "").Trim('-').Split('-').Select(x => Int32.Parse(x)).ToArray();

                PlayerAction.MortgageLands(g, p.Id, from_ids);
            }
            return true;
        }