Beispiel #1
0
        public bool Create(CSUser user, int numTeams, int numPlayerPerTeam, out uint roomID)
        {
            roomID = 0;

            //是否已在房间
            if (this._userIDToBattleUser.ContainsKey(user.gcNID))
            {
                return(false);
            }

            var room = RoomPool.Pop(this);

            room.Setup(numTeams, numPlayerPerTeam);

            BattleUser battleUser = new BattleUser(user.gcNID);

            if (!room.AddUser(battleUser))
            {
                RoomPool.Push(room);
                return(false);
            }
            this._userIDToBattleUser[user.gcNID] = battleUser;
            this._userToRoom[user.gcNID]         = room;
            this._idToRoom[room.id] = room;
            this.CheckRoom(room);
            roomID = room.id;
            return(true);
        }
Beispiel #2
0
        public async Task Battle(IUser user)
        {
            try
            {
                //if (Context.User.Id == user.Id)
                //    await ReplyAsync("you can't battle your self");
                EmbedBuilder builder = new EmbedBuilder
                {
                    Color     = Color.DarkTeal,
                    Timestamp = DateTimeOffset.Now,
                    Title     = $"a battle betwean {Context.User.Username} and {user.Username}"
                };
                Random     rand  = new Random();
                BattleUser user1 = new BattleUser(Context.User.Id);
                BattleUser user2 = new BattleUser(user.Id);
                BattleInfo Info  = new BattleInfo();

                while (user1.Healt > 0.0 && user2.Healt > 0.0)
                {
                    int turn = rand.Next(2);
                    if (turn == 0)
                    {
                        int    damage     = rand.Next(int.Parse(user1.Damage[0]), int.Parse(user1.Damage[1]));
                        double dealdamage = double.Parse(damage.ToString()) * user1.DamageMultiplier;
                        user2.Healt -= dealdamage;
                        Info.AddDamage(dealdamage);
                    }
                    else if (turn == 1)
                    {
                        int    damage     = rand.Next(int.Parse(user2.Damage[0]), int.Parse(user2.Damage[1]));
                        double dealdamage = double.Parse(damage.ToString()) * user2.DamageMultiplier;
                        user1.Healt -= dealdamage;
                        Info.AddDamage(dealdamage);
                    }
                    Info.Addturn();
                }
                if (user1.Healt > 0.0)
                {
                    builder.AddField("Victory", $"{Context.User.Username} has won this match");
                    //user1.AddWin();
                    //user2.AddLoss();
                }
                else
                {
                    builder.AddField("Victory", $"{user.Username} has won this match");
                    //user1.AddLoss();
                    //user2.AddWin();
                }
                builder.AddField("Battle info", $"Total damage dealt: {Info.TotalDamage}\nTotal turns taken: {Info.Totalturs}");
                CommandUsed.TotalDamageAdd(Info.TotalDamage);
                await ReplyAsync("", false, builder.Build());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
Beispiel #3
0
        internal bool RemoveUser(BattleUser user)
        {
            int index = Array.IndexOf(this._users, user);

            if (index < 0)
            {
                return(false);
            }
            this._users[index] = null;
            --this.currUserCount;
            return(true);
        }
Beispiel #4
0
        internal bool AddUser(BattleUser user)
        {
            int index = Array.IndexOf(this._users, null);

            if (index < 0)
            {
                return(false);
            }
            this._users[index] = user;
            ++this.currUserCount;
            return(true);
        }
Beispiel #5
0
        public bool Join(CSUser user, uint roomID, System.Action successHandler, System.Action failedHandler)
        {
            if (!this._idToRoom.TryGetValue(roomID, out Room room))
            {
                failedHandler();
                return(false);
            }

            BattleUser battleUser = new BattleUser(user.gcNID);

            if (!room.AddUser(battleUser))
            {
                failedHandler();
                return(false);
            }

            this._userIDToBattleUser[user.gcNID] = battleUser;
            this._userToRoom[user.gcNID]         = room;
            successHandler();
            this.CheckRoom(room);
            return(true);
        }
Beispiel #6
0
        private void OnEvent(MatchEvent.Type type, MatchRoomUser sender, BattleUserInfo battleUserInfo)
        {
            switch (type)
            {
            case MatchEvent.Type.AddToRoom:
            {
                Protos.CS2GC_AddToMatch response = ProtoCreator.Q_CS2GC_AddToMatch();
                CS.instance.userMgr.GetUser(sender.id).Send(response);
            }
            break;

            case MatchEvent.Type.RemoveFromRoom:
            {
                Protos.CS2GC_RemoveFromMatch response = ProtoCreator.Q_CS2GC_RemoveFromMatch();
                CS.instance.userMgr.GetUser(sender.id).Send(response);
            }
            break;

            case MatchEvent.Type.RoomInfo:
            {
                Protos.CS2GC_MatchState pMatchState = ProtoCreator.Q_CS2GC_MatchState();
                int c1 = battleUserInfo.tUsers.Length;
                for (int i = 0; i < c1; i++)
                {
                    BattleUser[] roomUsers = battleUserInfo.tUsers[i];
                    int          c2        = roomUsers.Length;
                    for (int j = 0; j < c2; j++)
                    {
                        BattleUser roomUser = roomUsers[j];
                        if (roomUser == null)
                        {
                            Protos.CS2GC_PlayerInfo playerInfo = new Protos.CS2GC_PlayerInfo
                            {
                                Vaild = false,
                            };
                            pMatchState.PlayerInfos.Add(playerInfo);
                        }
                        else
                        {
                            CSUser user = CS.instance.userMgr.GetUser(roomUser.id);
                            Protos.CS2GC_PlayerInfo playerInfo = new Protos.CS2GC_PlayerInfo
                            {
                                Vaild    = true,
                                GcNID    = user.gcNID,
                                Team     = i,
                                ActorID  = user.actorID,
                                Nickname = user.nickname,
                                Avatar   = user.avatar,
                                Gender   = user.gender,
                                Money    = user.money,
                                Diamoned = user.diamoned,
                                Rank     = user.rank
                            };
                            pMatchState.PlayerInfos.Add(playerInfo);
                        }
                    }
                }
                CS.instance.battleEntry.Broadcast(battleUserInfo.users, pMatchState);
            }
            break;

            case MatchEvent.Type.MatchSuccess:
                foreach (MatchRoomUser user in battleUserInfo.users)
                {
                    this._userIDToRoomUser.Remove(user.id);
                }
                CS.instance.battleEntry.BeginBattle(battleUserInfo.users, battleUserInfo.tUsers);
                break;
            }
        }