private bool HandleHMessage(string cop, string cmdrst) { bool cinCalled = false; switch (cop) { //case "H1NW": // { // int idx = cmdrst.IndexOf(','); // ushort who = ushort.Parse(cmdrst.Substring(0, idx)); // string name = cmdrst.Substring(idx + 1); // if (Z0D.ContainsKey(who)) // Z0D[who] = new ZeroPlayer(name, this) { Uid = who }; // else // Z0D.Add(who, new ZeroPlayer(name, this) { Uid = who }); // } // break; case "H0SD": { string[] blocks = Algo.Splits(cmdrst, ","); for (int i = 0; i < blocks.Length; i += 3) { ushort ut = ushort.Parse(blocks[i]); ushort aut = ushort.Parse(blocks[i + 1]); string name = blocks[i + 2]; if (Z0D.ContainsKey(ut)) { if (Z0D[ut].Name != name) Z0D[ut] = new ZeroPlayer(name, this) { Uid = ut }; } else Z0D.Add(ut, new ZeroPlayer(name, this) { Uid = ut }); if (aut == auid) Uid = ut; } string members = ""; for (ushort i = 1; i <= totalPlayer; ++i) { if (i == Uid) members += (",[" + i + "#:" + Z0D[i].Name + "]"); else members += ("," + i + "#:" + Z0D[i].Name); } if (members != "") VI.Cout(Uid, "座位排序如下:" + members.Substring(1)); } break; case "H0SM": { string[] blocks = cmdrst.Split(','); SelMode = int.Parse(blocks[0]); LevelCode = int.Parse(blocks[1]); } break; case "H0SW": { string[] splits = cmdrst.Split(','); ushort type = ushort.Parse(splits[0]); List<ushort> pys = Algo.TakeRange(splits, 1, splits.Length) .Select(p => ushort.Parse(p)).ToList(); pys.Remove(Uid); if (pys.Count > 0) { string[] words = new string[] { "选择", "禁选" }; VI.Cout(Uid, "等待玩家{0}{1}人物...", "{" + string.Join(",", pys) + "}", words[type]); } } break; //case "H1LV": // Z0D.Remove(ushort.Parse(cmdrst)); // break; //case "H1CN": // VI.Cout(uid, "游戏开始啦!"); // break; case "H0RT": casting = new Base.Rules.CastingPick(); break; case "H0RM": { List<int> cands = cmdrst.Split(',').Select(p => int.Parse(p)).ToList(); bool randomed = false; var cp = casting as Base.Rules.CastingPick; if (cands.Count > 0 && cands.Last() == 0) { cands.RemoveAt(cands.Count - 1); randomed = true; } cp.Init(Uid, cands, randomed ? new int[] { 0 }.ToList() : null); cinCalled = StartCinEtc(); while (true) { string input = VI.Cin(Uid, "您可选角色-{0}{1}", zd.HeroWithCode(cp.Xuan[Uid]), (cp.Huan.ContainsKey(Uid) && cp.Huan[Uid].Count > 0 ? "(按0随机替换1人)" : "")); int hero; if (int.TryParse(input, out hero)) { if ((hero != 0 && cp.Xuan[Uid].Contains(hero)) || cp.Huan[Uid].Count > 0) { WI.Send("H0RN," + hero, Uid, 0); break; } } } VI.CloseCinTunnel(Uid); } break; case "H0RO": { string[] args = cmdrst.Split(','); int code = int.Parse(args[0]); if (code == 0) { ushort puid = ushort.Parse(args[1]); VI.Cout(Uid, "玩家{0}#已经选定角色.", puid); } else if (code == 1) { ushort puid = ushort.Parse(args[1]); int heroCode = int.Parse(args[2]); if ((casting as Base.Rules.CastingPick).Pick(puid, heroCode)) { if (puid == Uid) VI.Cout(Uid, "确认您的选择为{0}.", zd.Hero(heroCode)); else VI.Cout(Uid, "玩家{0}#已选择了角色{1}.", puid, zd.Hero(heroCode)); Z0D[puid].SelectHero = heroCode; Z0D[puid].IsAlive = true; } } } break; case "H0RS": { int jdx = cmdrst.IndexOf(','); int from = int.Parse(cmdrst.Substring(0, jdx)); int to = int.Parse(cmdrst.Substring(jdx + 1)); Base.Rules.CastingPick cp = casting as Base.Rules.CastingPick; if (cp.SwitchTo(Uid, from, to) != 0) { cinCalled = StartCinEtc(); while (true) { string input = VI.Cin(Uid, "您可选角色-{0}.", zd.HeroWithCode(cp.Xuan[Uid])); int hero; if (int.TryParse(input, out hero)) { if ((hero != 0 && cp.Xuan[Uid].Contains(hero))) { WI.Send("H0RN," + hero, Uid, 0); break; } } } VI.CloseCinTunnel(Uid); } } break; case "H0TT": { string[] args = cmdrst.Split(','); int xsz = int.Parse(args[0]); List<int> x = Algo.TakeRange(args, 1, 1 + xsz) .Select(p => int.Parse(p)).ToList(); int bsz1 = int.Parse(args[xsz + 1]); List<int> b1 = Algo.TakeRange(args, 2 + xsz, 2 + xsz + bsz1) .Select(p => int.Parse(p)).ToList(); int bsz2 = int.Parse(args[xsz + bsz1 + 2]); List<int> b2 = Algo.TakeRange(args, 3 + xsz + bsz1, 3 + xsz + bsz1 + bsz2) .Select(p => int.Parse(p)).ToList(); Base.Rules.CastingTable ct = new Base.Rules.CastingTable(x, b1, b2); casting = ct; VI.Cout(Uid, "当前可选角色-{0}.", zd.HeroWithCode(ct.Xuan)); } break; case "H0TX": { // Verify whether these lists are the same. //string[] args = cmdrst.Split(','); //List<int> cands = Algo.TakeRange(args, 0, args.Length) // .Select(p => int.Parse(p)).ToList(); //selCandidates.Clear(); selCandidates.AddRange(cands); cinCalled = StartCinEtc(); Base.Rules.CastingTable ct = casting as Base.Rules.CastingTable; while (true) { string input = VI.Cin(Uid, "请选择一名角色,当前可选角色:\n{0}", zd.HeroWithCode(ct.Xuan)); int hero; if (int.TryParse(input, out hero) && ct.Xuan.Contains(hero)) { WI.Send("H0TN," + hero, Uid, 0); break; } } VI.CloseCinTunnel(Uid); } break; case "H0TO": { string[] args = cmdrst.Split(','); ushort puid = ushort.Parse(args[0]); int heroCode = int.Parse(args[1]); if (puid == Uid) VI.Cout(Uid, "确认您的选择为{0}.", zd.Hero(heroCode)); else VI.Cout(Uid, "玩家{0}#已选择了角色{1}.", puid, zd.Hero(heroCode)); Z0D[puid].SelectHero = heroCode; Z0D[puid].IsAlive = true; (casting as Base.Rules.CastingTable).Pick(puid, heroCode); } break; case "H0TA": { Base.Rules.CastingTable ct = casting as Base.Rules.CastingTable; string[] args = cmdrst.Split(','); cinCalled = StartCinEtc(); while (true) { bool canGiveup = args.Contains("0"); string input = VI.Cin(Uid, "请禁选一名角色" + (canGiveup ? "(0为不禁选)" : "") + ",当前可选角色:\n{0}", zd.HeroWithCode(ct.Xuan)); int hero; if (int.TryParse(input, out hero) && (ct.Xuan.Contains(hero) || canGiveup && hero == 0)) { WI.Send("H0TB," + hero, Uid, 0); break; } } VI.CloseCinTunnel(Uid); } break; case "H0TC": { string[] args = cmdrst.Split(','); ushort puid = ushort.Parse(args[0]); List<int> hrs = Algo.TakeRange(args, 1, args.Length) .Select(p => int.Parse(p)).ToList(); Base.Rules.CastingTable ct = casting as Base.Rules.CastingTable; if (hrs.Count == 0 && hrs[0] == 0) VI.Cout(Uid, "玩家{0}#未禁选.", puid, zd.Hero(hrs)); else { VI.Cout(Uid, "玩家{0}#禁选了角色{1}.", puid, zd.Hero(hrs)); foreach (int heroCode in hrs) ct.Ban(puid, heroCode); } if (ct.Xuan.Count > 0) VI.Cout(Uid, "当前剩余角色:\n{0}.", zd.HeroWithCode(ct.Xuan)); } break; case "H0TJ": { string[] args = cmdrst.Split(','); List<int> hrs = Algo.TakeRange(args, 0, args.Length) .Select(p => int.Parse(p)).ToList(); VI.Cout(Uid, "新增了角色{0}.", zd.Hero(hrs)); Base.Rules.CastingTable ct = casting as Base.Rules.CastingTable; foreach (int heroCode in hrs) ct.PutBack(heroCode); if (ct.Xuan.Count > 0) VI.Cout(Uid, "当前剩余角色:\n{0}.", zd.HeroWithCode(ct.Xuan)); } break; case "H0PT": { string[] args = cmdrst.Split(','); int idx = 0; int xsz = int.Parse(args[idx]); ++idx; List<int> x = Algo.TakeRange(args, idx, idx + xsz) .Select(p => int.Parse(p)).ToList(); idx += xsz; int drsz = int.Parse(args[idx]); ++idx; List<int> dr = Algo.TakeRange(args, idx, idx + drsz) .Select(p => int.Parse(p)).ToList(); idx += drsz; int dbsz = int.Parse(args[idx]); ++idx; List<int> db = Algo.TakeRange(args, idx, idx + dbsz) .Select(p => int.Parse(p)).ToList(); idx += dbsz; int brsz = int.Parse(args[idx]); ++idx; List<int> br = Algo.TakeRange(args, idx, idx + brsz) .Select(p => int.Parse(p)).ToList(); idx += brsz; int bbsz = int.Parse(args[idx]); ++idx; List<int> bb = Algo.TakeRange(args, idx, idx + bbsz) .Select(p => int.Parse(p)).ToList(); idx += bbsz; Base.Rules.CastingPublic cp = new Base.Rules.CastingPublic(x, dr, db, br, bb); casting = cp; cp.ToHint(Uid, VI, zd.HeroWithCode, zd.Hero); } break; case "H0PA": { string[] args = cmdrst.Split(','); ushort who = ushort.Parse(args[0]); if (who == Uid) { Base.Rules.CastingPublic cp = casting as Base.Rules.CastingPublic; cinCalled = StartCinEtc(); while (true) { string input = VI.Cin(Uid, "请禁选一名角色,当前可选角色:\n{0}", zd.HeroWithCode(cp.Xuan)); int hero; if (int.TryParse(input, out hero) && cp.Xuan.Contains(hero)) { WI.Send("H0PB," + hero, Uid, 0); break; } } VI.CloseCinTunnel(Uid); } else VI.Cout(Uid, "请等待{0}#禁将.", who); } break; case "H0PC": { string[] args = cmdrst.Split(','); int team = int.Parse(args[0]); int selAva = int.Parse(args[1]); Base.Rules.CastingPublic cp = casting as Base.Rules.CastingPublic; cp.Ban(team == 1, selAva); VI.Cout(Uid, "{0}方禁选{1}.", team == 1 ? "红" : "蓝", zd.Hero(selAva)); } break; case "H0PM": { string[] args = cmdrst.Split(','); ushort who = ushort.Parse(args[0]); if (who == Uid) { Base.Rules.CastingPublic cp = casting as Base.Rules.CastingPublic; cinCalled = StartCinEtc(); while (true) { string input = VI.Cin(Uid, "请选择一名角色,当前可选角色:\n{0}", zd.HeroWithCode(cp.Xuan)); int hero; if (int.TryParse(input, out hero) && cp.Xuan.Contains(hero)) { WI.Send("H0PN," + hero, Uid, 0); break; } } VI.CloseCinTunnel(Uid); } else VI.Cout(Uid, "请等待{0}#选将.", who); } break; case "H0PO": { string[] args = cmdrst.Split(','); int team = int.Parse(args[0]); int selAva = int.Parse(args[1]); Base.Rules.CastingPublic cp = casting as Base.Rules.CastingPublic; cp.Pick(team == 1, selAva); VI.Cout(Uid, "{0}方选择了{1}.", team == 1 ? "红" : "蓝", zd.Hero(selAva)); } break; case "H0CT": { string[] args = cmdrst.Split(','); int xsz1 = int.Parse(args[0]); List<int> x1 = Algo.TakeRange(args, 1, 1 + xsz1) .Select(p => int.Parse(p)).ToList(); int xsz2 = int.Parse(args[xsz1 + 1]); List<int> x2 = Algo.TakeRange(args, 2 + xsz1, 2 + xsz1 + xsz2) .Select(p => int.Parse(p)).ToList(); Base.Rules.CastingCongress cc = new Base.Rules.CastingCongress(x1, x2, new List<int>()); casting = cc; cc.CaptainMode = false; for (int i = xsz1 + xsz2 + 2; i < args.Length; i += 2) cc.Init(ushort.Parse(args[i]), int.Parse(args[i + 1])); cc.ToHint(Uid, VI, zd.HeroWithCode, zd.Hero); cinCalled = StartCinEtc(); while ((Uid % 2 == 0 && !cc.DecidedAo) || (Uid % 2 == 1 && !cc.DecidedAka)) { List<int> xuanR = (Uid % 2 == 0) ? cc.XuanAo : cc.XuanAka; if (VI is ClientZero.VW.Ayvi) { string op = VI.Cin(Uid, null); op = op.Trim().ToUpper(); int selAva; bool has = cc.Ding[Uid] != 0; if (op == "X" && cc.IsCaptain(Uid)) WI.Send("H0CD,0", Uid, 0); else if (op == "0" && has) WI.Send("H0CB," + cc.Ding[Uid], Uid, 0); else if (int.TryParse(op, out selAva) && xuanR.Contains(selAva)) WI.Send("H0CN," + Uid + "," + selAva, Uid, 0); } } VI.CloseCinTunnel(Uid); } break; case "H0CI": { string[] args = cmdrst.Split(','); int xsz1 = int.Parse(args[0]); List<int> x1 = Algo.TakeRange(args, 1, 1 + xsz1) .Select(p => int.Parse(p)).ToList(); int xsz2 = int.Parse(args[xsz1 + 1]); List<int> x2 = Algo.TakeRange(args, 2 + xsz1, 2 + xsz1 + xsz2) .Select(p => int.Parse(p)).ToList(); Base.Rules.CastingCongress cc = new Base.Rules.CastingCongress(x1, x2, new List<int>()); casting = cc; cc.CaptainMode = true; for (int i = xsz1 + xsz2 + 2; i < args.Length; i += 2) cc.Init(ushort.Parse(args[i]), int.Parse(args[i + 1])); cc.ToHint(Uid, VI, zd.HeroWithCode, zd.Hero); if (cc.IsCaptain(Uid)) // Captain Only { VI.Cout(Uid, "===> 选择目标玩家与角色,以逗号分隔;0为退回,X为选将确定."); cinCalled = StartCinEtc(); bool isAka = (Uid % 2 == 1); while ((isAka && !cc.DecidedAka) || (!isAka && !cc.DecidedAo)) { //List<int> xuanR = (Uid % 2 == 0) ? cc.XuanAo : cc.XuanAka; if (VI is ClientZero.VW.Ayvi) { string op = VI.Cin(Uid, null); op = op.Trim().ToUpper(); //bool has = cc.Ding[Uid] != 0; if (op == "X") WI.Send("H0CD,0", Uid, 0); else { int idx = op.IndexOf(','); if (idx >= 0) { ushort who; int selAva; if (ushort.TryParse(op.Substring(0, idx), out who) && int.TryParse(op.Substring(idx + 1), out selAva)) { if (selAva == 0 && cc.Ding[who] != 0) WI.Send("H0CB," + cc.Ding[who], Uid, 0); else WI.Send("H0CN," + who + "," + selAva, Uid, 0); } } } } } VI.CloseCinTunnel(Uid); } } break; case "H0CO": { string[] args = cmdrst.Split(','); ushort puid = ushort.Parse(args[0]); int heroCode = int.Parse(args[1]); int backCode = int.Parse(args[2]); ushort backTo = ushort.Parse(args[3]); if (puid == Uid) VI.Cout(Uid, "您预选了{0}.", zd.Hero(heroCode)); else VI.Cout(Uid, "玩家{0}#已预选了{1}.", puid, zd.Hero(heroCode)); if (backTo != 0) VI.Cout(Uid, "玩家{0}#已预选了{1}.", backTo, zd.Hero(backCode)); Base.Rules.CastingCongress cc = casting as Base.Rules.CastingCongress; cc.Set(puid, heroCode); cc.ToHint(Uid, VI, zd.HeroWithCode, zd.Hero); if (!cc.CaptainMode || cc.IsCaptain(Uid)) cc.ToInputRequire(Uid, VI); } break; case "H0CC": { string[] args = cmdrst.Split(','); //ushort puid = ushort.Parse(args[0]); int heroCode = int.Parse(args[1]); VI.Cout(Uid, "{0}被放回选将池中.", zd.Hero(heroCode)); Base.Rules.CastingCongress cc = casting as Base.Rules.CastingCongress; cc.Set(0, heroCode); cc.ToHint(Uid, VI, zd.HeroWithCode, zd.Hero); if (!cc.CaptainMode || cc.IsCaptain(Uid)) cc.ToInputRequire(Uid, VI); } break; case "H0CE": { string[] args = cmdrst.Split(','); int code = int.Parse(args[0]); if (code == 0) VI.Cout(Uid, "抱歉,您队伍角色尚未全部选定。"); else if (code == 1) { // The Opponent int team = int.Parse(args[1]); if (IsUtTeam(team)) VI.Cout(Uid, "我方已经选定角色."); else if (!IsUtOpp(team)) VI.Cout(Uid, "对方已经选定角色."); else VI.Cout(Uid, "{0}方已经选定角色.", team == 2 ? "蓝" : "红"); } else if (code == 2) { Base.Rules.CastingCongress cc = casting as Base.Rules.CastingCongress; if (IsUtAo()) cc.DecidedAo = true; else cc.DecidedAka = true; // VI.TerminCinTunnel(Uid); string msg = "我方选择结果为:"; for (int i = 1; i < args.Length; i += 2) { ushort ut = ushort.Parse(args[i]); int ava = int.Parse(args[i + 1]); Z0D[ut].SelectHero = ava; Z0D[ut].IsAlive = true; msg += (ut + ":" + zd.Hero(ava) + ","); } VI.Cout(Uid, "{0}.", msg.Substring(0, msg.Length - 1)); } } break; case "H0SL": { string[] args = cmdrst.Split(','); for (int i = 0; i < args.Length; i += 2) { ushort puid = ushort.Parse(args[i]); int heroCode = ushort.Parse(args[i + 1]); //msg += (puid + ":" + zd.Hero(heroCode) + ","); Z0D[puid].SelectHero = heroCode; Z0D[puid].ParseFromHeroLib(); } VI.Cout(Uid, "选择结果为-" + string.Join(",", Z0D.Values .Where(p => p.SelectHero != 0) .Select(p => p.Uid + ":" + zd.Hero(p.SelectHero)))); Z0F = new ZeroField(this); Z0M = new ZeroMe(this); if (Uid > 0 && Uid < 1000) // not watcher Z0M.SelectHero = Z0D[Uid].SelectHero; } break; case "H0DP": { string[] args = cmdrst.Split(','); Z0P = new ZeroPiles(this) { TuxCount = int.Parse(args[0]), MonCount = int.Parse(args[1]), EveCount = int.Parse(args[2]), TuxDises = 0, MonDises = 0, EveDises = 0 }; } break; case "H0SN": break; case "H0ST": if (cmdrst.StartsWith("0")) { VI.Cout(Uid, "游戏开始阶段开始..."); //VI.ReleaseCin(uid); } else if (cmdrst.StartsWith("1")) { VI.Cout(Uid, "游戏开始阶段结束..."); //VI.ReleaseCin(uid); } break; case "H0TM": VI.Cout(Uid, "游戏结束啦。"); break; case "H09N": { string[] blocks = cmdrst.Split(','); for (int idx = 0; idx < blocks.Length; idx += 2) { ushort who = ushort.Parse(blocks[idx]); string name = blocks[idx + 1]; Z0D[who] = new ZeroPlayer(name, this); } break; } case "H09G": Algo.LongMessageParse(("H09G," + cmdrst).Split(','), (who) => { Z0D[who].Uid = who; }, (who, key, value) => { ZeroPlayer zp = Z0D[who]; switch (key) { case "hero": zp.SelectHero = (int)value; break; case "state": zp.IsAlive = (((int)value & 1) != 0); zp.IsLoved = (((int)value & 2) != 0); zp.Immobilized = (((int)value & 4) != 0); zp.PetDisabled = (((int)value & 8) != 0); break; case "hp": zp.HP = (ushort)value; break; case "hpa": zp.HPa = (ushort)value; break; case "str": zp.STR = (ushort)value; break; case "stra": zp.STRa = (ushort)value; break; case "dex": zp.DEX = (ushort)value; break; case "dexa": zp.DEXa = (ushort)value; break; case "tuxCount": zp.TuxCount = (int)value; break; case "wp": zp.Weapon = (ushort)value; break; case "am": zp.Armor = (ushort)value; break; case "tr": zp.Trove = (ushort)value; break; case "exq": zp.ExEquip = (ushort)value; break; case "lug": { string[] lugs = (string[])value; if (lugs.Length > 0 && zp.Trove != 0) { if (!zp.Treasures.ContainsKey(zp.Trove)) zp.Treasures[zp.Trove] = new List<string>(); zp.Treasures[zp.Trove].AddRange(lugs); } break; } case "guard": zp.Guardian = (ushort)value; break; case "coss": zp.Coss = (ushort)value; break; case "pet": zp.Pets.Clear(); zp.Pets.AddRange((ushort[])value); break; case "excard": zp.ExCards.Clear(); zp.ExCards.AddRange((ushort[])value); break; case "token": zp.Token = (int)value; break; case "fakeq": for (int i = 0; i < ((string[])value).Length; i += 2) zp.Fakeq[ushort.Parse(((string[])value)[i])] = ((string[])value)[i + 1]; break; case "rune": zp.Runes.Clear(); zp.Runes.AddRange((ushort[])value); break; case "excl": zp.SpecialCards.Clear(); zp.SpecialCards.AddRange((string[])value); break; case "tar": zp.PlayerTars.Clear(); zp.PlayerTars.AddRange((ushort[])value); break; case "awake": zp.AwakeSignal = (ushort)value == 1; break; case "foldsz": zp.FolderCount = (int)value; break; case "escue": zp.Escue.Clear(); zp.Escue.AddRange((ushort[])value); break; } }, Board.StatusKey); break; case "H09P": { Z0M = new ZeroMe(this); Z0F = new ZeroField(this); Z0P = new ZeroPiles(this); string[] blocks = cmdrst.Split(','); Z0P.TuxCount = int.Parse(blocks[0]); Z0P.MonCount = int.Parse(blocks[1]); Z0P.EveCount = int.Parse(blocks[2]); Z0P.TuxDises = int.Parse(blocks[3]); Z0P.MonDises = int.Parse(blocks[4]); Z0P.EveDises = int.Parse(blocks[5]); ushort rounder = ushort.Parse(blocks[6]); ushort supporter = ushort.Parse(blocks[7]); //bool shit = blocks[8] == "1"; ushort hinder = ushort.Parse(blocks[9]); //bool hhit = blocks[10] == "1"; Z0F.Hinder = hinder; Z0F.Supporter = supporter; int idx = 11; ushort[] drums = Algo.TakeArrayWithSize(blocks, idx, out idx, 2); for (int i = 0; i < drums.Length; i += 2) Z0F.Drums.Add(drums[i]); //ushort wang = ushort.Parse(blocks[idx]); ushort mon1 = ushort.Parse(blocks[idx + 1]); ushort mon2 = ushort.Parse(blocks[idx + 2]); ushort eve1 = ushort.Parse(blocks[idx + 3]); Z0F.Monster1 = mon1; Z0F.Monster2 = mon2; Z0F.Eve1 = eve1; for (int i = idx + 4; i < Math.Min(blocks.Length, idx + 8); i += 2) { if (blocks[i] == "1") { if (rounder % 2 == 0) Z0F.RPool = int.Parse(blocks[i + 1]); else Z0F.OPool = int.Parse(blocks[i + 1]); } else if (blocks[i] == "2") { if (rounder % 2 == 0) Z0F.OPool = int.Parse(blocks[i + 1]); else Z0F.RPool = int.Parse(blocks[i + 1]); } } for (int i = idx + 8; i < blocks.Length; i += 2) Z0P.Score[int.Parse(blocks[i])] = int.Parse(blocks[i + 1]); } break; case "H0LT": if (!GameGraceEnd) { ushort who = ushort.Parse(cmdrst); if (who != 0) VI.Cout(Uid, "玩家{0}#逃跑,游戏终结。", who); else VI.Cout(Uid, "服务器被延帝抓走啦,游戏结束。", who); } break; case "H0WT": if (!GameGraceEnd) { ushort who = ushort.Parse(cmdrst); if (who != 0) VI.Cout(Uid, "玩家{0}#断线,请耐心等待其重连~", who); } break; case "H0WD": if (!GameGraceEnd) { int secLeft = int.Parse(cmdrst); VI.Cout(Uid, "房间将在{0}秒后彻底关闭。", secLeft); } break; case "H0BK": { ushort who = ushort.Parse(cmdrst); if (who != 0) VI.Cout(Uid, "玩家{0}#恢复连接。", who); } break; case "H0RK": VI.Cout(Uid, "房间已恢复正常。"); break; case "H09F": { string[] blocks = cmdrst.Split(','); int idx = 0; int tuxCount = int.Parse(blocks[idx]); ++idx; List<ushort> tuxes = Algo.TakeRange(blocks, idx, idx + tuxCount) .Select(p => ushort.Parse(p)).ToList(); Z0M.Tux = tuxes; idx += tuxCount; int folderCount = int.Parse(blocks[idx]); ++idx; List<ushort> folders = Algo.TakeRange(blocks, idx, idx + folderCount) .Select(p => ushort.Parse(p)).ToList(); Z0M.Folder = folders; idx += folderCount; int skillCount = int.Parse(blocks[idx]); ++idx; //List<string> skills = Algo.TakeRange(blocks, idx, idx + skillCount).ToList(); //Z0M.Skills = skills; idx += skillCount; } break; } return cinCalled; }
private bool HandleHMessage(string cop, string cmdrst) { bool cinCalled = false; switch (cop) { //case "H1NW": // { // int idx = cmdrst.IndexOf(','); // ushort who = ushort.Parse(cmdrst.Substring(0, idx)); // string name = cmdrst.Substring(idx + 1); // if (Z0D.ContainsKey(who)) // Z0D[who] = new ZeroPlayer(name, this) { Uid = who }; // else // Z0D.Add(who, new ZeroPlayer(name, this) { Uid = who }); // } // break; case "H0SD": { string[] blocks = Algo.Splits(cmdrst, ","); for (int i = 0; i < blocks.Length; i += 3) { ushort aut = ushort.Parse(blocks[i + 1]); if (aut == auid) { Uid = ushort.Parse(blocks[i]); break; } } int[] delta; ushort besu; AoPlayer[] players = new AoPlayer[] {ad.yfPlayerR2.AoPlayer, ad.yfPlayerO2.AoPlayer, ad.yfPlayerR3.AoPlayer, ad.yfPlayerO3.AoPlayer, ad.yfPlayerR1.AoPlayer, ad.yfPlayerO1.AoPlayer}; if (IsUtAo()) { besu = Uid; delta = new int[] { 0, -1, 2, 1, 4, 3 }; } else if (IsUtAka()) { besu = Uid; delta = new int[] { 0, 1, 2, 3, 4, 5 }; } else { besu = 1; delta = new int[] { 0, 1, 2, 3, 4, 5 }; } for (int i = 0; i < totalPlayer; ++i) A0P.Add(RoundUid(besu, delta[i]), players[i]); for (int i = 0; i < blocks.Length; i += 3) { ushort ut = ushort.Parse(blocks[i]); string name = blocks[i + 2]; A0P[ut].Nick = name; A0P[ut].Rank = ut; } } break; case "H0SM": { string[] blocks = cmdrst.Split(','); SelMode = int.Parse(blocks[0]); LevelCode = int.Parse(blocks[1]); } break; case "H0SW": { string[] splits = cmdrst.Split(','); ushort type = ushort.Parse(splits[0]); List<ushort> pys = Algo.TakeRange(splits, 1, splits.Length) .Select(p => ushort.Parse(p)).ToList(); pys.Remove(Uid); if (pys.Count > 0) { string[] words = new string[] { "选择", "禁选" }; VI.ShowTip("等待其它玩家{0}人物...", words[type]); foreach (ushort ut in pys) ad.ShowProgressBar(ut); } } break; // case "H1LV": // //Z0D.Remove(ushort.Parse(cmdrst)); // break; // case "H1CN": // VI.Cout(uid, "游戏开始啦!"); // break; // case "H0ST": // if (cmdrst.StartsWith("0")) // { // VI.Cout(uid, "游戏开始阶段开始..."); // //VI.ReleaseCin(uid); // } // else if (cmdrst.StartsWith("1")) // { // VI.Cout(uid, "游戏开始阶段结束..."); // //VI.ReleaseCin(uid); // } // break; case "H0RT": ad.yfArena.AoArena.Casting = new Base.Rules.CastingPick(); break; case "H0RM": { List<int> cands = cmdrst.Split(',').Select(p => int.Parse(p)).ToList(); bool randomed = false; var cp = ad.yfArena.AoArena.Casting as Base.Rules.CastingPick; if (cands.Count > 0 && cands.Last() == 0) { cands.RemoveAt(cands.Count - 1); randomed = true; } cp.Init(Uid, cands, randomed ? new int[] { 0 }.ToList() : null); string hint = randomed ? "请选择您的角色,空白牌为随机替换。" : "请选择您的角色。"; ad.yfArena.AoArena.Show(); if (!isReplay) { cinCalled = StartCinEtc(); ad.ShowProgressBar(Uid); while (true) { string input = VI.Cin48(Uid, hint); int hero; if (input == VI.CinSentinel) break; if (int.TryParse(input, out hero)) { if ((hero != 0 && cp.Xuan[Uid].Contains(hero)) || cp.Huan[Uid].Count > 0) { WI.Send("H0RN," + hero, Uid, 0); break; } } } VI.CloseCinTunnel(Uid); } } break; case "H0RO": { string[] args = cmdrst.Split(','); int code = int.Parse(args[0]); if (code == 0) { ushort puid = ushort.Parse(args[1]); VI.Cout(Uid, "玩家{0}#已经选定角色.", puid); ad.HideProgressBar(puid); } else if (code == 1) { ushort puid = ushort.Parse(args[1]); int heroCode = int.Parse(args[2]); var cp = ad.yfArena.AoArena.Casting as Base.Rules.CastingPick; if (cp.Pick(puid, heroCode)) { if (puid == Uid) { VI.Cout(Uid, "确认您的选择为{0}.", zd.Hero(heroCode)); ad.yfArena.AoArena.Shutdown(); } else VI.Cout(Uid, "玩家{0}#已选择了角色{1}.", puid, zd.Hero(heroCode)); ad.HideProgressBar(puid); A0P[puid].SelectHero = heroCode; A0P[puid].IsAlive = true; } } } break; case "H0RS": { int jdx = cmdrst.IndexOf(','); int from = int.Parse(cmdrst.Substring(0, jdx)); int to = int.Parse(cmdrst.Substring(jdx + 1)); var cp = ad.yfArena.AoArena.Casting as Base.Rules.CastingPick; if (cp.SwitchTo(Uid, from, to) != 0) { ad.yfArena.AoArena.Switch(from, to); if (!isReplay) { cinCalled = StartCinEtc(); while (true) { string input = VI.Cin48(Uid, "请选择您的角色。"); int hero; if (input == VI.CinSentinel) break; if (int.TryParse(input, out hero)) { if ((hero != 0 && cp.Xuan[Uid].Contains(hero))) { WI.Send("H0RN," + hero, Uid, 0); break; } } } VI.CloseCinTunnel(Uid); } } } break; case "H0TT": { string[] args = cmdrst.Split(','); int xsz = int.Parse(args[0]); List<int> x = Algo.TakeRange(args, 1, 1 + xsz) .Select(p => int.Parse(p)).ToList(); int bsz1 = int.Parse(args[xsz + 1]); List<int> b1 = Algo.TakeRange(args, 2 + xsz, 2 + xsz + bsz1) .Select(p => int.Parse(p)).ToList(); int bsz2 = int.Parse(args[xsz + bsz1 + 2]); List<int> b2 = Algo.TakeRange(args, 3 + xsz + bsz1, 3 + xsz + bsz1 + bsz2) .Select(p => int.Parse(p)).ToList(); Base.Rules.CastingTable ct = new Base.Rules.CastingTable(x, b1, b2); ad.yfArena.AoArena.Casting = ct; ad.yfArena.AoArena.Show(); } break; case "H0TX": { // Verify whether these lists are the same. //string[] args = cmdrst.Split(','); //List<int> cands = Algo.TakeRange(args, 0, args.Length) // .Select(p => int.Parse(p)).ToList(); //selCandidates.Clear(); selCandidates.AddRange(cands); cinCalled = StartCinEtc(); var ct = ad.yfArena.AoArena.Casting as Base.Rules.CastingTable; ad.yfArena.AoArena.Active(null, false); if (!isReplay) { while (true) { string input = VI.Cin48(Uid, "请选择一名角色."); int hero; if (input == VI.CinSentinel) break; if (int.TryParse(input, out hero) && ct.Xuan.Contains(hero)) { WI.Send("H0TN," + hero, Uid, 0); break; } } VI.CloseCinTunnel(Uid); } } break; case "H0TO": { string[] args = cmdrst.Split(','); ushort puid = ushort.Parse(args[0]); int heroCode = int.Parse(args[1]); var ct = ad.yfArena.AoArena.Casting as Base.Rules.CastingTable; if (ct.Pick(puid, heroCode)) { if (puid == Uid) { VI.Cout(Uid, "确认您的选择为{0}.", zd.Hero(heroCode)); ad.yfArena.AoArena.Disactive(null); } else VI.Cout(Uid, "玩家{0}#已选择了角色{1}.", puid, zd.Hero(heroCode)); ad.HideProgressBar(puid); A0P[puid].SelectHero = heroCode; A0P[puid].IsAlive = true; ad.yfArena.AoArena.Remove(heroCode); } } break; case "H0TA": { cinCalled = StartCinEtc(); string[] args = cmdrst.Split(','); var ct = ad.yfArena.AoArena.Casting as Base.Rules.CastingTable; if (!isReplay) { while (true) { bool canGiveup = args.Contains("0"); ad.yfArena.AoArena.Active(null, canGiveup); string input = VI.Cin48(Uid, "请禁选一名角色."); int hero; if (input == VI.CinSentinel) break; if (input == "0" && canGiveup) { WI.Send("H0TB,0", Uid, 0); break; } else if (int.TryParse(input, out hero) && ct.Xuan.Contains(hero)) { WI.Send("H0TB," + hero, Uid, 0); break; } } VI.CloseCinTunnel(Uid); } } break; case "H0TC": { string[] args = cmdrst.Split(','); ushort puid = ushort.Parse(args[0]); List<int> hrs = Algo.TakeRange(args, 1, args.Length) .Select(p => int.Parse(p)).ToList(); if (hrs.Count == 0 && hrs[0] == 0) VI.Cout(Uid, "玩家{0}#未禁选.", puid, zd.Hero(hrs)); else { var ct = ad.yfArena.AoArena.Casting as Base.Rules.CastingTable; foreach (int heroCode in hrs) { if (ct.Ban(puid, heroCode)) ad.yfArena.AoArena.BanBy(puid, heroCode); } VI.Cout(Uid, "玩家{0}#禁选了角色{1}.", puid, zd.Hero(hrs)); } ad.HideProgressBar(puid); if (Uid == puid) ad.yfArena.AoArena.Disactive(null); //if (ct.Xuan.Count > 0) // VI.Cout(Uid, "当前剩余角色:\n{0}.", zd.HeroWithCode(ct.Xuan)); } break; case "H0TJ": { string[] args = cmdrst.Split(','); List<int> hrs = Algo.TakeRange(args, 0, args.Length) .Select(p => int.Parse(p)).ToList(); VI.Cout(Uid, "新增了角色{0}.", zd.Hero(hrs)); var ct = ad.yfArena.AoArena.Casting as Base.Rules.CastingTable; foreach (int heroCode in hrs) { if (ct.PutBack(heroCode)) ad.yfArena.AoArena.PuckBack(heroCode); } ad.yfArena.AoArena.Disactive(null); //if (ct.Xuan.Count > 0) // VI.Cout(Uid, "当前剩余角色:\n{0}.", zd.HeroWithCode(ct.Xuan)); } break; case "H0PT": { string[] args = cmdrst.Split(','); int idx = 0; int xsz = int.Parse(args[idx]); ++idx; List<int> x = Algo.TakeRange(args, idx, idx + xsz) .Select(p => int.Parse(p)).ToList(); idx += xsz; int drsz = int.Parse(args[idx]); ++idx; List<int> dr = Algo.TakeRange(args, idx, idx + drsz) .Select(p => int.Parse(p)).ToList(); idx += drsz; int dbsz = int.Parse(args[idx]); ++idx; List<int> db = Algo.TakeRange(args, idx, idx + dbsz) .Select(p => int.Parse(p)).ToList(); idx += dbsz; int brsz = int.Parse(args[idx]); ++idx; List<int> br = Algo.TakeRange(args, idx, idx + brsz) .Select(p => int.Parse(p)).ToList(); idx += brsz; int bbsz = int.Parse(args[idx]); ++idx; List<int> bb = Algo.TakeRange(args, idx, idx + bbsz) .Select(p => int.Parse(p)).ToList(); idx += bbsz; if (ad.yfArena.AoArena.Casting as Base.Rules.CastingPublic == null) { Base.Rules.CastingPublic cp = new Base.Rules.CastingPublic(x, dr, db, br, bb); ad.yfArena.AoArena.Casting = cp; ad.yfArena.AoArena.Show(); } //else // ad.yfArena.AoArena.Check(); } break; case "H0PA": { string[] args = cmdrst.Split(','); ushort who = ushort.Parse(args[0]); if (who == Uid) { var cp = ad.yfArena.AoArena.Casting as Base.Rules.CastingPublic; if (!isReplay) { cinCalled = StartCinEtc(); while (true) { ad.yfArena.AoArena.Active(new int[] { 1, 2 }, false); string input = VI.Cin(Uid, "请禁选一名角色."); int hero; if (input == VI.CinSentinel) break; if (int.TryParse(input, out hero) && cp.Xuan.Contains(hero)) { WI.Send("H0PB," + hero, Uid, 0); break; } } VI.CloseCinTunnel(Uid); } } else VI.Cout(Uid, "请等待{0}#禁将.", who); } break; case "H0PC": { string[] args = cmdrst.Split(','); int team = int.Parse(args[0]); int selAva = int.Parse(args[1]); var cp = ad.yfArena.AoArena.Casting as Base.Rules.CastingPublic; if (cp.Ban(team == 1, selAva)) { VI.Cout(Uid, "{0}方禁选{1}.", team == 1 ? "红" : "蓝", zd.Hero(selAva)); ad.yfArena.AoArena.BanBy((ushort)team, selAva); ad.yfArena.AoArena.Disactive(new int[] { 1, 2 }); } } break; case "H0PM": { string[] args = cmdrst.Split(','); ushort who = ushort.Parse(args[0]); if (who == Uid) { var cp = ad.yfArena.AoArena.Casting as Base.Rules.CastingPublic; if (!isReplay) { cinCalled = StartCinEtc(); while (true) { ad.yfArena.AoArena.Active(new int[] { 1, 2 }, false); string input = VI.Cin(Uid, "请选择一名角色.", zd.HeroWithCode(cp.Xuan)); if (input == VI.CinSentinel) break; int hero; if (int.TryParse(input, out hero)) if (cp.Xuan.Contains(hero) || (hero == 0 && cp.SilencedIdx < cp.Secrets.Count)) { WI.Send("H0PN," + hero, Uid, 0); break; } } VI.CloseCinTunnel(Uid); } } else VI.Cout(Uid, "请等待{0}#选将.", who); } break; case "H0PO": { string[] args = cmdrst.Split(','); int team = int.Parse(args[0]); int selAva = int.Parse(args[1]); var cp = ad.yfArena.AoArena.Casting as Base.Rules.CastingPublic; bool real = cp.PickReport(team == 1, selAva); if (selAva == 0) { VI.Cout(Uid, "{0}方选择了未知人物.", team == 1 ? "红" : "蓝"); ad.yfArena.AoArena.PickBy((ushort)team, 0); ad.yfArena.AoArena.Disactive(new int[] { 1, 2 }); } else { VI.Cout(Uid, "{0}方选择了{1}.", team == 1 ? "红" : "蓝", zd.Hero(selAva)); ad.yfArena.AoArena.PickBy((ushort)team, selAva); ad.yfArena.AoArena.Disactive(new int[] { 1, 2 }); } } break; case "H0CT": { string[] args = cmdrst.Split(','); int xsz1 = int.Parse(args[0]); List<int> x1 = Algo.TakeRange(args, 1, 1 + xsz1) .Select(p => int.Parse(p)).ToList(); int xsz2 = int.Parse(args[xsz1 + 1]); List<int> x2 = Algo.TakeRange(args, 2 + xsz1, 2 + xsz1 + xsz2) .Select(p => int.Parse(p)).ToList(); Base.Rules.CastingCongress cc = new Base.Rules.CastingCongress(x1, x2, new List<int>()); ad.yfArena.AoArena.Casting = cc; cc.CaptainMode = false; for (int i = xsz1 + xsz2 + 2; i < args.Length; i += 2) cc.Init(ushort.Parse(args[i]), int.Parse(args[i + 1])); ad.yfArena.AoArena.Show(); //cc.ToHint(Uid, VI, zd.HeroWithCode, zd.Hero); cinCalled = StartCinEtc(); bool isAka = (Uid % 2 == 1); if (!isReplay) { while ((!isAka && !cc.DecidedAo) || (isAka && !cc.DecidedAka)) { List<int> xuanR = isAka ? cc.XuanAka : cc.XuanAo; if (VI is VW.Cyvi) { string op = (VI as VW.Cyvi).Cin48(Uid, "请选择您的角色。"); op = op.Trim().ToUpper(); int selAva; bool has = cc.Ding[Uid] != 0; if (op == "X" && cc.IsCaptain(Uid)) WI.Send("H0CD,0", Uid, 0); else if (op == "0" && has) WI.Send("H0CB," + cc.Ding[Uid], Uid, 0); else if (int.TryParse(op, out selAva) && xuanR.Contains(selAva)) WI.Send("H0CN," + Uid + "," + selAva, Uid, 0); } } } VI.CloseCinTunnel(Uid); } break; case "H0CI": { string[] args = cmdrst.Split(','); int xsz1 = int.Parse(args[0]); List<int> x1 = Algo.TakeRange(args, 1, 1 + xsz1) .Select(p => int.Parse(p)).ToList(); int xsz2 = int.Parse(args[xsz1 + 1]); List<int> x2 = Algo.TakeRange(args, 2 + xsz1, 2 + xsz1 + xsz2) .Select(p => int.Parse(p)).ToList(); Base.Rules.CastingCongress cc = new Base.Rules.CastingCongress(x1, x2, new List<int>()); ad.yfArena.AoArena.Casting = cc; cc.CaptainMode = true; for (int i = xsz1 + xsz2 + 2; i < args.Length; i += 2) cc.Init(ushort.Parse(args[i]), int.Parse(args[i + 1])); ad.yfArena.AoArena.Show(); if (cc.IsCaptain(Uid) && !isReplay) // Captain Only { cinCalled = StartCinEtc(); bool isAka = (Uid % 2 == 1); while ((isAka && !cc.DecidedAka) || (!isAka && !cc.DecidedAo)) { List<int> xuanR = isAka ? cc.XuanAka : cc.XuanAo; if (VI is VW.Cyvi) { string op = (VI as VW.Cyvi).Cin48(Uid, "请为我方玩家分配角色."); op = op.Trim().ToUpper(); bool has = cc.Ding[Uid] != 0; if (op == "X") WI.Send("H0CD,0", Uid, 0); else { int idx = op.IndexOf(','); if (idx >= 0) { ushort who; int selAva; if (ushort.TryParse(op.Substring(0, idx), out who) && int.TryParse(op.Substring(idx + 1), out selAva)) { if (selAva == 0 && cc.Ding[who] != 0) WI.Send("H0CB," + cc.Ding[who], Uid, 0); else WI.Send("H0CN," + who + "," + selAva, Uid, 0); } } } } } VI.CloseCinTunnel(Uid); } } break; case "H0CO": { string[] args = cmdrst.Split(','); ushort puid = ushort.Parse(args[0]); int heroCode = int.Parse(args[1]); int backCode = int.Parse(args[2]); ushort backTo = ushort.Parse(args[3]); var cc = ad.yfArena.AoArena.Casting as Base.Rules.CastingCongress; cc.Set(puid, heroCode); if (puid == Uid) VI.Cout(Uid, "您预选了{0}.", zd.Hero(heroCode)); else VI.Cout(Uid, "玩家{0}#已预选了{1}.", puid, zd.Hero(heroCode)); ad.yfArena.AoArena.CongressDing(puid, heroCode, cc.CaptainMode); if (backCode != 0) { if (backTo != 0) { VI.Cout(Uid, "玩家{0}#已预选了{1}.", backTo, zd.Hero(backCode)); ad.yfArena.AoArena.CongressDing(backTo, backCode, cc.CaptainMode); } else { VI.Cout(Uid, "{0}被放回选将池中.", zd.Hero(backCode)); ad.yfArena.AoArena.CongressBack(backCode); } } //if (!cc.CaptainMode || (Uid == 1 || Uid == 2)) // cc.ToInputRequire(Uid, VI); } break; case "H0CC": { string[] args = cmdrst.Split(','); ushort puid = ushort.Parse(args[0]); int heroCode = int.Parse(args[1]); VI.Cout(Uid, "{0}被放回选将池中.", zd.Hero(heroCode)); var cc = ad.yfArena.AoArena.Casting as Base.Rules.CastingCongress; cc.Set(0, heroCode); ad.yfArena.AoArena.CongressBack(heroCode); //if (!cc.CaptainMode || (Uid == 1 || Uid == 2)) // cc.ToInputRequire(Uid, VI); } break; case "H0CE": { string[] args = cmdrst.Split(','); int code = int.Parse(args[0]); if (code == 0) VI.Cout(Uid, "抱歉,您队伍角色尚未全部选定。"); else if (code == 1) { // The Opponent int team = int.Parse(args[1]); if (IsUtTeam(team)) VI.Cout(Uid, "我方已经选定角色."); else if (!IsUtOpp(team)) VI.Cout(Uid, "对方已经选定角色."); else VI.Cout(Uid, "{0}方已经选定角色.", team == 2 ? "蓝" : "红"); } else if (code == 2) { var cc = ad.yfArena.AoArena.Casting as Base.Rules.CastingCongress; if (IsUtAo()) cc.DecidedAo = true; else cc.DecidedAka = true; // VI.TerminCinTunnel(Uid); ad.yfArena.AoArena.Shutdown(); string msg = "我方选择结果为:"; for (int i = 1; i < args.Length; i += 2) { ushort ut = ushort.Parse(args[i]); int ava = int.Parse(args[i + 1]); A0P[ut].SelectHero = ava; A0P[ut].IsAlive = true; msg += (ut + ":" + zd.Hero(ava) + ","); } VI.Cout(Uid, "{0}.", msg.Substring(0, msg.Length - 1)); } } break; case "H0SN": ad.yfArena.AoArena.Shutdown(); break; case "H0SL": { string[] args = cmdrst.Split(','); for (int i = 0; i < args.Length; i += 2) { ushort puid = ushort.Parse(args[i]); int heroCode = ushort.Parse(args[i + 1]); //msg += (puid + ":" + zd.Hero(heroCode) + ","); A0P[puid].SelectHero = heroCode; A0P[puid].ParseFromHeroLib(); } VI.Cout(Uid, "选择结果为-" + string.Join(",", A0P.Values .Where(p => p.SelectHero != 0) .Select(p => p.Rank + ":" + zd.Hero(p.SelectHero)))); } break; case "H0DP": { string[] args = cmdrst.Split(','); A0F.TuxCount = int.Parse(args[0]); A0F.TuxDises = 0; A0F.MonCount = int.Parse(args[1]); A0F.MonDises = 0; A0F.EveCount = int.Parse(args[2]); A0F.TuxDises = 0; } break; case "H0ST": if (cmdrst.StartsWith("0")) { VI.Cout(Uid, "游戏开始阶段开始..."); //VI.ReleaseCin(uid); } else if (cmdrst.StartsWith("1")) { VI.Cout(Uid, "游戏开始阶段结束..."); //VI.ReleaseCin(uid); } break; case "H0TM": VI.Cout(Uid, "游戏结束啦。"); break; case "H09N": { A0P.Clear(); AoPlayer[] players = new AoPlayer[] {ad.yfPlayerR2.AoPlayer, ad.yfPlayerO2.AoPlayer, ad.yfPlayerR3.AoPlayer, ad.yfPlayerO3.AoPlayer, ad.yfPlayerR1.AoPlayer, ad.yfPlayerO1.AoPlayer}; ushort besu; int[] delta; if (IsUtAo()) { besu = Uid; delta = new int[] { 0, -1, 2, 1, 4, 3 }; } else if (IsUtAka()) { besu = Uid; delta = new int[] { 0, 1, 2, 3, 4, 5 }; } else { besu = WATCHER_1ST_PERSPECT; delta = new int[] { 0, 1, 2, 3, 4, 5 }; } for (int i = 0; i < totalPlayer; ++i) A0P.Add(RoundUid(besu, delta[i]), players[i]); string[] blocks = cmdrst.Split(','); for (int idx = 0; idx < blocks.Length; idx += 2) { ushort who = ushort.Parse(blocks[idx]); string name = blocks[idx + 1]; A0P[who].Nick = name; A0P[who].Rank = who; } break; } case "H09R": if (WI is VW.Eywi) { Uid = ushort.Parse(cmdrst); } break; case "H09G": Algo.LongMessageParse(("H09G," + cmdrst).Split(','), InitPlayerPositionFromLongMessage, InitPlayerFullFromLongMessage, Board.StatusKey); break; case "H09P": { //Z0M = new ZeroMe(this); //Z0F = new ZeroField(this); //Z0P = new ZeroPiles(this); string[] blocks = cmdrst.Split(','); A0F.TuxCount = int.Parse(blocks[0]); A0F.MonCount = int.Parse(blocks[1]); A0F.EveCount = int.Parse(blocks[2]); A0F.TuxDises = int.Parse(blocks[3]); A0F.MonDises = int.Parse(blocks[4]); A0F.EveDises = int.Parse(blocks[5]); //A0F.Rounder ushort rounder = ushort.Parse(blocks[6]); ushort supporter = ushort.Parse(blocks[7]); bool shit = blocks[8] == "1"; ushort hinder = ushort.Parse(blocks[9]); bool hhit = blocks[10] == "1"; foreach (AoPlayer ap in A0P.Values) ap.SetAsClear(); if (rounder != 0) A0P[rounder].SetAsRounder(); A0F.Supporter = supporter; if (supporter != 0 && supporter < 1000) { if (shit) { A0P[supporter].SetAsSpSucc(); } else { A0P[supporter].SetAsSpFail(); } } A0F.Hinder = hinder; if (hinder != 0 && hinder < 1000) { if (hhit) { A0P[hinder].SetAsSpSucc(); } else { A0P[hinder].SetAsSpFail(); } } int idx = 11; ushort[] drums = Algo.TakeArrayWithSize(blocks, idx, out idx, 2); for (int i = 0; i < drums.Length; i += 2) { ushort d = drums[i]; if (d != 0) { A0F.Drums.Add(d); if (d < 1000) { if (drums[i + 1] == 1) A0P[d].SetAsSpSucc(); else A0P[d].SetAsSpFail(); } } } ushort wang = ushort.Parse(blocks[idx]); ushort mon1 = ushort.Parse(blocks[idx + 1]); ushort mon2 = ushort.Parse(blocks[idx + 2]); ushort eve1 = ushort.Parse(blocks[idx + 3]); A0F.Eve1 = eve1; A0F.Wang = wang; A0F.Monster1 = mon1; A0F.Monster2 = mon2; for (int i = idx + 4; i < Math.Min(blocks.Length, idx + 8); i += 2) { if (blocks[i] == "1") A0F.PoolAka = int.Parse(blocks[i + 1]); else if (blocks[i] == "2") A0F.PoolAo = int.Parse(blocks[i + 1]); } for (int i = idx + 8; i < blocks.Length; i += 2) { if (blocks[i] == "1") A0F.ScoreAka = int.Parse(blocks[i + 1]); else if (blocks[i] == "2") A0F.ScoreAo = int.Parse(blocks[i + 1]); } } break; case "H0LT": if (!GameGraceEnd) { ushort who = ushort.Parse(cmdrst); if (who != 0) VI.Cout(Uid, "玩家{0}#断线,游戏结束。", who); else VI.Cout(Uid, "服务器被延帝抓走啦,游戏结束。"); ad.SetCanan(CananPaint.CananSignal.FAIL_CONNECTION); GameInDanger = true; } break; case "H0WT": if (!GameGraceEnd) { ushort who = ushort.Parse(cmdrst); if (who != 0) { VI.Cout(Uid, "玩家{0}#断线,请耐心等待其重连~", who); A0P[who].SetAsLoser(); } ReportConnectionLost(); } break; case "H0WD": if (!GameGraceEnd) { int secLeft = int.Parse(cmdrst); VI.Cout(Uid, "房间将在{0}秒后彻底关闭。", secLeft); if (secLeft == 180) ad.SetCanan(CananPaint.CananSignal.LOSE_COUNTDOWN_48); else if (secLeft == 60) ad.SetCanan(CananPaint.CananSignal.LOSE_COUNTDOWN_12); GameInDanger = true; } break; case "H0BK": { ushort who = ushort.Parse(cmdrst); if (who != 0 && who != Uid) { VI.Cout(Uid, "玩家{0}#恢复连接。", who); if (A0P.ContainsKey(who)) A0P[who].SetAsBacker(); } } break; case "H0RK": VI.Cout(Uid, "房间已恢复正常。"); GameInDanger = false; ad.SetCanan(CananPaint.CananSignal.NORMAL); break; case "H09F": { A0M.Reset(); string[] blocks = cmdrst.Split(','); int idx = 0; int tuxCount = int.Parse(blocks[idx]); ++idx; List<ushort> tuxes = Algo.TakeRange(blocks, idx, idx + tuxCount) .Select(p => ushort.Parse(p)).ToList(); A0M.insTux(tuxes); idx += tuxCount; int folderCount = int.Parse(blocks[idx]); ++idx; List<ushort> folders = Algo.TakeRange(blocks, idx, idx + folderCount) .Select(p => ushort.Parse(p)).ToList(); A0P[Uid].InsMyFolder(folders); //A0M.InsMyFolder(folders); idx += folderCount; int skillCount = int.Parse(blocks[idx]); ++idx; if (skillCount > 0) { List<string> skills = Algo.TakeRange(blocks, idx, idx + skillCount).ToList(); A0P[Uid].ClearSkill(); A0P[Uid].GainSkill(skills); } idx += skillCount; } break; } return cinCalled; }