//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; }
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); }
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); }
//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(); }
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..."; }
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; }
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; } }
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); }
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); }
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); }
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; } } } } }
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; } }
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; }
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); } }
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; } }
public static void InitTrade(Game g, string state, string userName) { Player from = g.GetPlayer(userName); InitTrade(g, state, from.Id); }
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; }
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; }
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); }
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; }