コード例 #1
0
ファイル: DBFuncs.cs プロジェクト: paulvanwamelen/api-aws
        public static GamesData NewGame(MyContext db, NewGameInput input)
        {
            var newgame = new GamesData
            {
                EntryId     = GuidGenerator.GenerateSequentialGuid(),
                GameMetaId  = db.GamesMeta.Single(x => x.Shortcode.Equals(input.Shortcode)).GameId,
                Closed      = false,
                Alert       = false,
                ClockStart  = input.ClockStart,
                ClockInc    = input.ClockInc,
                ClockMax    = input.ClockMax,
                ClockFrozen = false,
                Variants    = input.Variants
            };

            db.GamesData.Add(newgame);

            foreach (var p in input.Gameobj.Players)
            {
                var oid      = PlayerId2OwnerId(db, GuidGenerator.HelperStringToBA(p));
                var newclock = new GamesDataClocks
                {
                    GameId  = newgame.EntryId,
                    OwnerId = oid,
                    Bank    = (short)newgame.ClockStart
                };
                db.GamesDataClocks.Add(newclock);
                var newplayer = new GamesDataPlayers
                {
                    GameId  = newgame.EntryId,
                    OwnerId = oid,
                };
                db.GamesDataPlayers.Add(newplayer);
            }

            foreach (var p in input.Gameobj.Whoseturn())
            {
                var newwho = new GamesDataWhoseturn
                {
                    GameId  = newgame.EntryId,
                    OwnerId = PlayerId2OwnerId(db, GuidGenerator.HelperStringToBA(p)),
                };
                db.GamesDataWhoseturn.Add(newwho);
            }

            var newstate = new GamesDataStates
            {
                StateId   = GuidGenerator.GenerateSequentialGuid(),
                GameId    = newgame.EntryId,
                State     = input.Gameobj.Serialize(),
                RenderRep = input.Gameobj.Render()
            };

            db.GamesDataStates.Add(newstate);
            return(newgame);
        }
コード例 #2
0
ファイル: DBFuncs.cs プロジェクト: paulvanwamelen/api-aws
        public static void UpdateGame(MyContext db, UpdateGameInput input)
        {
            //Add new state
            var newstate = new GamesDataStates
            {
                StateId   = GuidGenerator.GenerateSequentialGuid(),
                GameId    = input.Gamerec.EntryId,
                State     = input.Gameobj.Serialize(),
                RenderRep = input.Gameobj.Render(),
                Timestamp = DateTime.UtcNow
            };

            db.GamesDataStates.Add(newstate);

            //Add chat
            if (!String.IsNullOrEmpty(input.Gameobj.ChatMsgs))
            {
                var newchat = new GamesDataChats
                {
                    ChatId  = GuidGenerator.GenerateSequentialGuid(),
                    GameId  = input.Gamerec.EntryId,
                    OwnerId = null,
                    Message = input.Gameobj.ChatMsgs
                };
                db.GamesDataChats.Add(newchat);
            }

            if (!input.Gameobj.Gameover)
            {
                //Update clocks
                var clock   = db.GamesDataClocks.Single(x => x.GameId.Equals(input.Gamerec.EntryId) && x.OwnerId.Equals(input.Mover));
                var newbank = clock.Bank + input.Gamerec.ClockInc;
                if (newbank > input.Gamerec.ClockMax)
                {
                    newbank = input.Gamerec.ClockMax;
                }
                clock.Bank = (short)newbank;
            }

            //Update whoseturn
            db.GamesDataWhoseturn.RemoveRange(db.GamesDataWhoseturn.Where(x => x.GameId.Equals(input.Gamerec.EntryId)));
            foreach (var p in input.Gameobj.Whoseturn())
            {
                var node = new GamesDataWhoseturn
                {
                    GameId  = input.Gamerec.EntryId,
                    OwnerId = GuidGenerator.HelperStringToBA(PlayerId2OwnerId(db, p))
                };
                db.GamesDataWhoseturn.Add(node);
            }

            //Check for end of game
            if (input.Gameobj.Gameover)
            {
                input.Gamerec.Closed = true;

                //Archive the game
                List <GamesDataStates> allstates = db.GamesDataStates.Where(x => x.GameId.Equals(input.Gamerec.EntryId)).ToList();
                allstates.Add(newstate);
                JObject rec = JObject.FromObject(new
                {
                    header = new
                    {
                        reportId = GuidGenerator.HelperBAToString(input.Gamerec.EntryId),
                        game     = new
                        {
                            id       = GuidGenerator.HelperBAToString(input.Gamerec.GameMetaId),
                            name     = input.Gamerec.GameMeta.Name,
                            variants = String.IsNullOrWhiteSpace(input.Gamerec.Variants) ? new string[0] : input.Gamerec.Variants.Split('\n'),
                        },
                        dates = new
                        {
                            start = allstates.First().Timestamp,
                            end   = allstates.Last().Timestamp.Truncate(TimeSpan.FromSeconds(1))
                        },
                        //Add `event` one day
                        timeControl = String.Join('/', new string[] { input.Gamerec.ClockStart.ToString(), input.Gamerec.ClockInc.ToString(), input.Gamerec.ClockMax.ToString() }),
                        players     = input.Gameobj.Players,
                        results     = input.Gameobj.Results()
                                      //Add `termination` one day
                    },
                    moves = input.Gameobj.MovesArchive(allstates.Select(x => x.State).ToArray())
                }
                                                 );

                GamesArchive archive = new GamesArchive
                {
                    ReportId = input.Gamerec.EntryId,
                    Json     = rec.ToString()
                };
                db.GamesArchive.Add(archive);
            }
        }