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; } }
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); }
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); }
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); }
public void Play(BattleReplay replay, Action <byte[]> msgHandler) { for (var i = 0; i < replay.Messages.Count; i++) { var msg = replay.Messages[i]; msgHandler(msg); } }
public void AddReplay(BattleReplay replay) { replays.Add(replay); while (replays.Count > MAX_REPLAYS_RECORD) { replays.RemoveAt(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 + " )"); }
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; }
public void ReadFromBuffer(IReadableBuffer data) { var r = BattleReplay.Deserialize(data); msgHistroy = r.Msgs; }
// 开始游戏,可能是新游戏,也可能是播放录像 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(); }
public void PlayReplay(BattleReplay replay) { Battle.Replay.Messages.AddRange(replay.Messages); Recoder.Play(replay, (data) => msgLooper.SendRaw(data)); }
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); }
public bool Exists(BattleReplay replay) { return(replays.Contains(replay)); }