コード例 #1
0
ファイル: Room4Server.cs プロジェクト: radtek/SCM2
        public static void LoadAllPVPReplays()
        {
            if (!Directory.Exists(ReplayFolder))
            {
                Directory.CreateDirectory(ReplayFolder);
            }

            // 获取所有文件名并排序
            var fs = Directory.GetFiles(ReplayFolder, "*.*", SearchOption.TopDirectoryOnly).Where((f) => f.EndsWith(".scm")).ToArray();

            fs.SwiftSort((f) =>
            {
                var pureFileName = Path.GetFileNameWithoutExtension(f);
                return(int.Parse(pureFileName));
            });

            if (fs.Length > 0)
            {
                var lastFile = Path.GetFileNameWithoutExtension(fs[fs.Length - 1]);
                nextReplayNo = int.Parse(lastFile);
            }

            nextReplayNo++;

            // 读取所有录像内容
            foreach (var f in fs)
            {
                byte[] data = null;
                using (var fr = new BinaryReader(new FileStream(f, FileMode.Open)))
                    data = fr.ReadBytes((int)fr.BaseStream.Length);

                var replay = BattleReplay.Deserialize(new RingBuffer(data));
                replays[Path.GetFileNameWithoutExtension(f)] = replay;
            }
        }
コード例 #2
0
ファイル: Room4Server.cs プロジェクト: radtek/SCM2
        public static BattleReplay SaveCurrentBattleReplay(string id1, string id2, string name1, string name2, ulong frames, bool isPVP, List <KeyValuePair <string, IReadableBuffer> > msgs, bool isCrashReplay = false)
        {
            if (!Directory.Exists(ReplayFolder))
            {
                Directory.CreateDirectory(ReplayFolder);
            }

            var replay = new BattleReplay();

            replay.ID            = (nextReplayNo++).ToString().PadLeft(10, '0');
            replay.Usr1          = id1;
            replay.Usr2          = id2;
            replay.UsrName1      = name1;
            replay.UsrName2      = name2;
            replay.Length        = frames;
            replay.Date          = DateTime.Now;
            replay.IsPVP         = isPVP;
            replay.IsCrashReplay = isCrashReplay;
            replay.Msgs          = msgs;

            replays[replay.ID] = replay;

            var writer = new WriteBuffer();

            replay.Serialize(writer);
            var ext = isCrashReplay ? ".crash" : (isPVP ? ".scm" : ".pve");

            using (var fw = new BinaryWriter(new FileStream(Path.Combine(ReplayFolder, replay.ID + ext), FileMode.CreateNew)))
                fw.Write(writer.Data, 0, writer.Available);

            return(replay);
        }
コード例 #3
0
    private void ShowMyReplayInfo(GameObject item, BattleReplay replay)
    {
        var opponent = replay.Usr1 == GameCore.Instance.MeID ? replay.UsrName2 : replay.UsrName1;

        item.transform.Find("Title").GetComponentInChildren <Text>().text = "vs " + opponent;
        item.transform.Find("Data").GetComponentInChildren <Text>().text  = FormatReplayDateTime(replay);
    }
コード例 #4
0
ファイル: MainMenuUI.cs プロジェクト: radtek/SCM2
    void FetchRecentReplayList()
    {
        var rl   = MAUI.ReplayListUI.GetComponentInChildren <ReplayListUI>();
        var conn = GameCore.Instance.ServerConnection;
        var buff = conn.Request2Srv("GetReplayList", (data) =>
        {
            var cnt = data.ReadInt();
            var arr = new BattleReplay[cnt];
            for (var i = 0; i < cnt; i++)
            {
                arr[i] = BattleReplay.DeserializeHeader(data);
            }

            rl.HotReplays = arr;
            if (arr == null || arr.Length == 0)
            {
                return;
            }

            rl.ShowReplays();
        });

        buff.Write(10);
        conn.End(buff);
    }
コード例 #5
0
 public void Play(BattleReplay replay, Action <byte[]> msgHandler)
 {
     for (var i = 0; i < replay.Messages.Count; i++)
     {
         var msg = replay.Messages[i];
         msgHandler(msg);
     }
 }
コード例 #6
0
 public void AddReplay(BattleReplay replay)
 {
     replays.Add(replay);
     while (replays.Count > MAX_REPLAYS_RECORD)
     {
         replays.RemoveAt(0);
     }
 }
コード例 #7
0
    string FormatReplayDateTime(BattleReplay replay)
    {
        var d    = replay.Date.ToString("MM-dd HH:mm");
        var secs = replay.Length / 10;
        var mins = secs / 60;

        secs -= mins * 60;
        var t = mins.ToString().PadLeft(2, '0') + ":" + secs.ToString().PadLeft(2, '0');

        return(d + " ( " + t + " )");
    }
コード例 #8
0
        public void DeserializeReplay(DataAnalysis da, BattleReplay r)
        {
            da.ID = r.ID;

            var info = new DataAnalysisInfo();

            info.User1     = r.Usr1;
            info.User2     = r.Usr2;
            info.UserName1 = r.UsrName1;
            info.UserName2 = r.UsrName2;

            info.Date = r.Date;

            var secs = r.Length * 100 / 1000;
            var min  = secs / 60;

            secs = secs - min * 60;
            var time = (min.ToString().PadLeft(2, '0')) + ":" + (secs.ToString().PadLeft(2, '0'));

            info.Length = time;

            foreach (var para in r.Msgs)
            {
                if (para.Value.Available <= 0)
                {
                    continue;
                }

                if (para.Key == "BattleEnd")
                {
                    info.Winner = para.Value.ReadString();
                }
                else if (para.Key == "DropSoldierFromCarrier")
                {
                    var player = para.Value.ReadInt();
                    if (player == 1)
                    {
                        info.SoldierCarrierCount1++;
                    }
                    else if (player == 2)
                    {
                        info.SoldierCarrierCount2++;
                    }
                }
                else if (para.Key == "AddBattleUnitAt")
                {
                    DeserializeReplayMag(info, para.Value);
                }
            }

            da.Info = info;
        }
コード例 #9
0
ファイル: BattleReplayer.cs プロジェクト: radtek/SCM2
    public void ReadFromBuffer(IReadableBuffer data)
    {
        var r = BattleReplay.Deserialize(data);

        msgHistroy = r.Msgs;
    }
コード例 #10
0
    // 开始游戏,可能是新游戏,也可能是播放录像
    public void StartGame(BattleReplay battleReplay = null)
    {
        var map = new BattleMap(10, 6, (x, y) => TileType.Grass); // test map
        var s   = DateTime.Now.ToLocalTime().ToString();
        var bt  = new BattlePVE(map, 0, new PlayerInfo {
            ID = "tester:" + s, Name = "战斗测试:" + s
        });                                                                                        // test battle
        var p = new Player();

        // 载入地图
        if (battleReplay == null)
        {
            map.MapInfo       = MapReader.ReloadMapInfo();
            bt.Replay.MapName = MapReader.MapNameList[MapReader.ArrayIndex];
        }
        else
        {
            MapReader.ReloadMapByName(battleReplay.MapName);
            map.MapInfo = MapReader.Map;
        }

        map.GetRespawnPlace();

        // 配置buff显示列表
        BattleStageUI.CharacterInfoUI.BuffDisplayList = Configuration.Config(new BuffToDisplay());

        // npcs
        FC.For(3, (i) =>
        {
            bt.AddWarriorAt(map.RespawnForEnemy[i].X, map.RespawnForEnemy[i].Y, Configuration.Config(new Boar(map)
            {
                Team = 2
            }));
        });

        // heros

        // 黛丽万
        var dlw = Configuration.Config(new DaiLiWan(bt)
        {
            Team = 1
        });

        dlw.AddRune(new DaiLiWanRune1());
        dlw.AddRune(new DaiLiWanRune2());
        dlw.AddRune(new DaiLiWanRune3());
        dlw.AddRune(new DaiLiWanRune4());
        dlw.RunAllRune2PrepareBattle();
        bt.AddWarriorAt(map.RespawnForChamp[0].X, map.RespawnForChamp[0].Y, dlw);

        // 洛里斯
        var lls = Configuration.Config(new LuoLiSi(bt)
        {
            Team = 1
        });

        lls.AddRune(new LuoLiSiRune1());
        lls.AddRune(new LuoLiSiRune2());
        lls.AddRune(new LuoLiSiRune3());
        lls.AddRune(new LuoLiSiRune4());
        lls.RunAllRune2PrepareBattle();
        bt.AddWarriorAt(map.RespawnForChamp[1].X, map.RespawnForChamp[1].Y, lls);

        // 巴洛克
        var blk = Configuration.Config(new BaLuoKe(bt)
        {
            Team = 1
        });

        blk.AddRune(new BaLuoKeRune1());
        blk.AddRune(new BaLuoKeRune2());
        blk.AddRune(new BaLuoKeRune3());
        blk.AddRune(new BaLuoKeRune4());
        blk.RunAllRune2PrepareBattle();
        bt.AddWarriorAt(map.RespawnForChamp[2].X, map.RespawnForChamp[2].Y, blk);

        // 游川隐
        var ycy = Configuration.Config(new YouChuanYin(bt)
        {
            Team = 1
        });

        ycy.AddRune(new YouChuanYinRune1());
        ycy.AddRune(new YouChuanYinRune2());
        ycy.AddRune(new YouChuanYinRune3());
        ycy.AddRune(new YouChuanYinRune4());
        ycy.RunAllRune2PrepareBattle();
        bt.AddWarriorAt(map.RespawnForChamp[3].X, map.RespawnForChamp[3].Y, ycy);

        // 装备
        var e1 = new Equip();

        e1.AddAttr(new CollageAdd()
        {
            P0 = 1
        });
        e1.AddAttr(new StartAddShd()
        {
            P0 = 50
        });
        e1.AddAttr(new BackNoRange());
        e1.AddAttr(new Spurt()
        {
            P0 = -50
        });
        p.AddEquip(e1);

        p.OnPreparingBattle(bt);

        // items
        // bt.AddItemAt(7, 2, Configuration.Config(new Trunk(map)));
        // bt.AddItemAt(7, 4, Configuration.Config(new Rock(map)));

        // test room
        var room = new BattleRoomClient(new BattlePVERoom(bt))
        {
            PlayerMe = 1
        };

        room.BattleRoom.ReplayChanged += () =>
        {
            if (!Recoder.Exists(bt.Replay))
            {
                Recoder.AddReplay(bt.Replay);
            }

            Recoder.SaveAll();
        };

        // setup the fake message loop
        room.BMS = msgLooper;
        msgLooper.Clear();
        room.RegisterBattleMessageHandlers(msgLooper);

        // build up the whole scene
        BattleStage.Build(room, (replay) =>
        {
            // var aniPlayer = BattleStage.GetComponent<MapAniPlayer>();
            // aniPlayer.AnimationTimeScaleFactor = 10000;
            StartGame();
            PlayReplay(replay);
        });

        // link the logic event to the stage and ui logic
        BattleStage.SetupEventHandler(room);
        BattleStage.SetupUIHandler(room);
        BattleStageUI.SetupEventHandler(room);
        this.SetupEventHandler(room);

        StartingUI.SetActive(false);
        PreparingUI.SetActive(true);
        BattleStage.gameObject.SetActive(true);
        BattleStage.StartPreparing();
    }
コード例 #11
0
 public void PlayReplay(BattleReplay replay)
 {
     Battle.Replay.Messages.AddRange(replay.Messages);
     Recoder.Play(replay, (data) => msgLooper.SendRaw(data));
 }
コード例 #12
0
 private void ShowHotReplayInfo(GameObject item, BattleReplay replay)
 {
     item.transform.Find("Title").GetComponentInChildren <Text>().text = replay.UsrName1 + " vs " + replay.UsrName2;
     item.transform.Find("Data").GetComponentInChildren <Text>().text  = FormatReplayDateTime(replay);
 }
コード例 #13
0
 public bool Exists(BattleReplay replay)
 {
     return(replays.Contains(replay));
 }