Ejemplo n.º 1
0
        public static BoardState FromSettings(GameSettings settings)
        {
            BoardState ret = new BoardState { Settings = settings, State = GameState.GameNotStarted };
            ret.Players = new List<Player>();
            ret.Loans = new List<Loan>();

            int numWorkers = settings.WokersPerPlayer * settings.NumPlayers;
            ret.Workers = new Worker[numWorkers];

            for (int i = 0; i < numWorkers; i++)
            {
                ret.Workers[i] = new Worker { Job = Job.Unemployed, Wage = 0m };
            }

            return ret;
        }
Ejemplo n.º 2
0
        private static BoardState CheckWin(BoardState game)
        {
            foreach (Player player in game.Players)
            {
                if (player.Cash > game.Settings.WinCashReservers)
                {
                    game.State = GameState.Finish;
                }
                else if (player.Income > game.Settings.WinIncome && player.Cash > 0)
                {
                    game.State = GameState.Finish;
                }
            }

            return game;
        }
Ejemplo n.º 3
0
        public static BoardState Apply(BoardState game, IEnumerable<GameAction> list)
        {
            TimeSpan tick = DateTime.Now - game.LastTick;

            foreach (GameAction action in list)
            {
                game = Tick.actionMap[action.ActionType].Apply(game, action);
            }

            game = Tick.TickWages(game, tick);
            game = Tick.TickLoans(game, tick);
            game = Tick.NormalizeMoney(game);

            game.GameTick++;
            game.LastTick = DateTime.Now;

            return Tick.CheckWin(game);
        }
Ejemplo n.º 4
0
        private static BoardState NormalizeMoney(BoardState game)
        {
            for (int w=0; w<game.Workers.Length; w++)
            {
                Worker worker = game.Workers[w];
                int money = (int)(worker.Wage * 100);
                game.Workers[w] = new Worker { Job = worker.Job, Wage = (decimal)money / 100m };
            }

            for (int p = 0; p < game.Players.Count; p++)
            {
                Player player = game.Players[p];
                int cash = (int)(player.Cash * 100);
                int income = (int)(player.Income * 100);

                player.Cash = (decimal)cash / 100m;
                player.Income = (decimal)income / 100m;
                game.Players[p] = player;
            }

            return game;
        }
Ejemplo n.º 5
0
 public Worker[] Workers(BoardState game)
 {
     return this.WorkerIds.Select(i => game.Workers[i]).ToArray();
 }
Ejemplo n.º 6
0
 private static int UnhiredWorkersCount(BoardState game)
 {
     return game.Workers.Where(w => w.Job == Job.Unemployed).Count();
 }
Ejemplo n.º 7
0
 private static Worker[] GetPlayerWorkers(BoardState game, int playerId)
 {
     return game.Players[playerId].WorkerIds.Select(i => game.Workers[i]).ToArray();
 }
Ejemplo n.º 8
0
 private static decimal PercentOfYear(BoardState game, TimeSpan tick)
 {
     return (decimal)tick.Ticks / game.Settings.YearLength.Ticks;
 }
Ejemplo n.º 9
0
        private static BoardState TickWages(BoardState game, TimeSpan tick)
        {
            if (game.State != GameState.Started)
            {
                return game;
            }

            decimal percent = Tick.PercentOfYear(game, tick);

            for (int i=0; i<game.Players.Count; i++)
            {
                Player player = game.Players[i];
                player.Income = 0m;

                foreach (int workerId in player.WorkerIds)
                {
                    Worker worker = game.Workers[workerId];
                    player.Cash -= percent * worker.Wage;

                    if (worker.Job == Job.Factory)
                    {
                        player.Income += percent * player.NumFactories * player.ResearchLevel;
                    }
                    else if (worker.Job == Job.Research)
                    {
                        player.NextResearchLevel += (int)(percent * 1000);
                        if (player.NextResearchLevel > 1000)
                        {
                            player.ResearchLevel += game.Settings.ResearchLevelIncrease;
                            player.NextResearchLevel = player.NextResearchLevel - 1000;
                        }
                    }
                }

                player.Cash += player.Income;
                game.Players[i] = player;
            }

            return game;
        }
Ejemplo n.º 10
0
        private static BoardState TickLoans(BoardState game, TimeSpan tick)
        {
            if ((game.Proposals.Count == 0) || (game.Proposals[0].PlayerId != -1))
            {
                game.Proposals.Insert(0, new LoanProposal
                {
                    PlayerId = -1,
                    LoanAmount = game.Settings.StartMoney,
                    PayBack = game.Settings.StartMoney * game.Settings.DefaultLoanAmountMultiplier,
                    Period = TimeSpan.FromTicks(game.Settings.YearLength.Ticks * game.Settings.DefaultLoanYears)
                });
            }

            List<int> removeLoans = new List<int>();

            for (int i = 0; i < game.Loans.Count; i++)
            {
                Loan loan = game.Loans[i];
                TimeSpan period = tick;

                if (loan.Start + loan.Period < DateTime.Now)
                {
                    period = (loan.Start + loan.Period) - game.LastTick;
                    removeLoans.Add(i);
                }

                decimal percent = Tick.PercentOfPeriod(period, loan.Period);
                Player borrower = game.Players[loan.BorrowerId];
                borrower.Cash -= percent * loan.Payment;
                game.Players[loan.BorrowerId] = borrower;

                if (loan.LenderId > -1)
                {
                    Player lender = game.Players[loan.LenderId];
                    lender.Cash += percent * loan.Payment;
                    game.Players[loan.LenderId] = lender;
                }
            }

            for (int i = removeLoans.Count - 1; i >= 0; i--)
            {
                int removeId = removeLoans[i];
                game.Loans.RemoveAt(removeId);
            }

            return game;
        }