//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; }