Example #1
0
    void Create()
    {
        var sz   = MG.Room.MapSize;
        var cols = (int)sz.x;
        var rows = (int)sz.y;

        var lm  = transform.Find("Line").gameObject;
        var lst = new List <LineRenderer>();

        FC.For(rows + 2, (y) =>
        {
            var l            = Instantiate(lm) as GameObject;
            var lr           = l.GetComponent <LineRenderer>();
            lr.positionCount = 2;
            lr.SetPosition(0, new Vector3(0 - 0.5f, 0.1f, y - 0.5f));
            lr.SetPosition(1, new Vector3(cols + 0.5f, 0.1f, y - 0.5f));
            lr.gameObject.SetActive(true);
            lr.transform.SetParent(transform, false);
            lst.Add(lr);
        });
        FC.For(cols + 2, (x) =>
        {
            var l            = Instantiate(lm) as GameObject;
            var lr           = l.GetComponent <LineRenderer>();
            lr.positionCount = 2;
            lr.SetPosition(0, new Vector3(x - 0.5f, 0.1f, 0 - 0.5f));
            lr.SetPosition(1, new Vector3(x - 0.5f, 0.1f, rows + 0.5f));
            lr.gameObject.SetActive(true);
            lr.transform.SetParent(transform, false);
            lst.Add(lr);
        });

        lrs = lst.ToArray();
    }
Example #2
0
    // 更新血条旁边的技能图标
    public void UpdateSkillPicture(Warrior warrior)
    {
        var PassiveSkillFrame = PassiveSkill.transform.parent.gameObject;
        var ActiveSkillFrame  = ActiveSkill.transform.parent.gameObject;

        PassiveSkillFrame.SetActive(false);
        ActiveSkillFrame.SetActive(false);
        var AllBuffs = warrior.Buffs;

        if (warrior.GetDefaultActiveSkill() != null)
        {
            ActiveSkill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + warrior.GetDefaultActiveSkill().ID) as Sprite;
            ActiveSkillFrame.SetActive(true);
        }
        FC.For(AllBuffs.Length, (i) =>
        {
            if (AllBuffs[i] is PatternSkill)
            {
                ActiveSkill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + AllBuffs[i].ID) as Sprite;
                ActiveSkillFrame.SetActive(true);
            }
            else if (AllBuffs[i] is ISkillWithPassiveSkill)
            {
                PassiveSkill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + AllBuffs[i].ID) as Sprite;
                PassiveSkillFrame.SetActive(true);
            }
        });
    }
Example #3
0
        public bool RemoveBuff(Buff b)
        {
            bool found = false;

            FC.For(allBuffs.Length, (player) =>
            {
                var buffs = allBuffs[player];
                if (buffs == null)
                {
                    return;
                }

                if (buffs.Contains(b))
                {
                    allBuffs[player].Add(b);
                    foreach (var u in Room.GetAllUnitsByPlayer(player))
                    {
                        b.OffUnit(u);
                    }

                    buffs.Remove(b);
                    found = true;
                }
            }, () => !found);

            return(found);
        }
Example #4
0
    public void LoadAll()
    {
        if (!File.Exists(SaveFile))
        {
            return;
        }

        using (var r = new BinaryReader(new FileStream(SaveFile, FileMode.Open)))
        {
            try
            {
                var count = r.ReadInt32();
                var data  = r.ReadBytes((int)r.BaseStream.Length);
                var buff  = new RingBuffer();
                buff.Write(data);

                FC.For(count, (i) =>
                {
                    var replay = buff.Read <BattleReplay>();
                    replays.Add(replay);
                });
            }
            catch (Exception)
            {
                replays.Clear();
            }
            finally
            {
                r.Close();
            }
        }
    }
Example #5
0
    // 彻底销毁一个模型
    private void DestroyModel(MapUnit mu)
    {
        var lst = new List <Transform>();

        if (mu.Attack01Stub != null && mu.Attack01Stub.childCount > 0)
        {
            FC.For(mu.Attack01Stub.childCount, (i) => { lst.Add(mu.Attack01Stub.GetChild(i)); });
        }

        if (mu.Attack02Stub != null && mu.Attack02Stub.childCount > 0)
        {
            FC.For(mu.Attack02Stub.childCount, (i) => { lst.Add(mu.Attack02Stub.GetChild(i)); });
        }

        foreach (var c in lst)
        {
            var ae = c.GetComponent <AttackEffect>();
            if (ae != null)
            {
                EC.DestroyEffect(ae);
            }

            var aa = c.GetComponent <AttackAudio>();
            if (aa != null)
            {
                AC.DestroyAudio(aa);
            }
        }

        mu.MG = null;
        mu.transform.SetParent(null);
        mu.gameObject.SetActive(false);
        Destroy(mu.gameObject);
    }
Example #6
0
        // 反序列化一个录像
        public static BattleReplay Deserialize(IReadableBuffer data)
        {
            var replay = DeserializeHeader(data);

            string lastMsgTitle = null;

            byte[] lastMsgData = null;
            var    msgs        = new List <KeyValuePair <string, IReadableBuffer> >();
            var    cnt         = data.ReadInt();

            FC.For(cnt, (i) =>
            {
                // 这里生成 msg 必须用网络字节序,因为这里的数据等同于是直接伪装成了网络上的消息,
                // 对 Room4Client 来说是一致读取的

                var sameAsLastOne = data.ReadBool();
                if (!sameAsLastOne)
                {
                    var msgTitle = data.ReadString();
                    var msgLen   = data.ReadInt();
                    var msgBody  = data.ReadBytes(msgLen);
                    msgs.Add(new KeyValuePair <string, IReadableBuffer>(msgTitle, new RingBuffer(true, true, msgBody)));

                    lastMsgTitle = msgTitle;
                    lastMsgData  = msgBody;
                }
                else
                {
                    msgs.Add(new KeyValuePair <string, IReadableBuffer>(lastMsgTitle, new RingBuffer(true, true, lastMsgData)));
                }
            });

            replay.Msgs = msgs;
            return(replay);
        }
Example #7
0
    public void Build()
    {
        // 创建新按钮
        FC.For(choices.Length, (i) =>
        {
            var go = Instantiate(ChoiceBtn);
            go.transform.SetParent(SelectArea.transform);
            go.GetComponentInChildren <Text>().text = ChoicesName[i];
            var choiceTag = choices[i];
            go.GetComponent <Button>().onClick.AddListener(() => { OnSelectOne(choiceTag); });
            go.SetActive(true);
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;
            choiceBtns.Add(go);
        });

        // 菜单显示尺寸
        width  = choiceBtns[0].GetComponent <RectTransform>().rect.width;
        height = choiceBtns[0].GetComponent <RectTransform>().rect.height;

        choiceBtns[0].transform.localPosition = new Vector3(-width * 0.75f, 0, 0);
        choiceBtns[1].transform.localPosition = new Vector3(width * 0.75f, 0, 0);

        AdjustPos();
    }
Example #8
0
    void RefreshCells()
    {
        var sz   = MG.Room.MapSize;
        var cols = (int)sz.x;
        var rows = (int)sz.y;
        var n    = 0;
        var cm   = transform.Find("Cell").gameObject;

        FC.For2(cols, rows, (x, y) =>
        {
            if (MG.Room.CheckSpareSpace(x, y, 1))
            {
                return;
            }

            if (n >= cells.Count)
            {
                var c = Instantiate(cm) as GameObject;
                c.SetActive(true);
                c.transform.SetParent(transform, false);
                cells.Add(c);
            }

            cells[n++].transform.localPosition = new Vector3(x, 0.1f, y);
        });

        FC.For(n, cells.Count, (i) => { cells[i].SetActive(false); });
    }
Example #9
0
        protected override void Sync()
        {
            BeginSync();
            SyncLong(ref Time);
            SyncString(ref MapName);

            if (IsWrite)
            {
                W.Write(Messages.Count);
                FC.ForEach(Messages, (i, msg) =>
                {
                    W.Write(msg.Length);
                    W.Write(msg);
                });
            }
            else
            {
                Messages.Clear();

                var count = R.ReadInt();
                FC.For(count, (i) =>
                {
                    var dataLen = R.ReadInt();
                    var data    = R.ReadBytes(dataLen);
                    Messages.Add(data);
                });
            }

            EndSync();
        }
Example #10
0
    // 直接添加单位
    void OnAddUnitAtMsg(IReadableBuffer data)
    {
        var player = data.ReadInt();
        var type   = data.ReadString();
        var num    = data.ReadInt();
        var pos    = data.ReadVec2();

        FC.For(num, (i) => { AddNewUnit(null, type, pos, player); });
    }
Example #11
0
    // 隐藏出生点地块
    public void HideRespawnGrid()
    {
        var Maptile = GameObject.FindGameObjectsWithTag("MapTile");

        FC.For(Maptile.Length, (i) =>
        {
            Maptile[i].transform.Find("RespawnPlace").gameObject.SetActive(false);
        });
    }
Example #12
0
 // 随机打乱出生顺序
 public void GetRandomRespawnPlace(List <MapData> RespawnList, SRandom rand)
 {
     FC.For(RespawnList.Count, (i) =>
     {
         int RandomNum          = rand.Next(RespawnList.Count);
         var temp               = RespawnList[RandomNum];
         RespawnList[RandomNum] = RespawnList[i];
         RespawnList[i]         = temp;
     });
 }
Example #13
0
 // 直接放置单位
 public void SrvAddUnitAt(int player, string type, int num, Vec2 pos)
 {
     FC.For(num, (i) => { AddNewUnit(null, type, pos, player); });
     Broadcast("AddUnitAt", (buff) =>
     {
         buff.Write(player);
         buff.Write(type);
         buff.Write(num);
         buff.Write(pos);
     });
 }
Example #14
0
 // 清除攻击范围显示
 public void RemoveShowAttackRange()
 {
     FC.For(pathATKRange.Count, (i) =>
     {
         var avatar = BattleStage.GetAvatarAt(pathATKRange[i].X, pathATKRange[i].Y);
         if (avatar != null && avatar.AttackHint.activeSelf)
         {
             avatar.AttackHint.SetActive(false);
         }
     });
     BattleStage.RemoveTile(pathATKRange);
 }
Example #15
0
        // 生成随机战斗卡牌
        public BattleCard[] GenNextCards(int num)
        {
            var cards = new BattleCard[num];

            FC.For(num, (i) =>
            {
                var type = Srand.Next(0, BattleCard.BattleCardTypesNum);
                cards[i] = BattleCard.Create(BattleCard.CardTypes[type]);
            });

            return(cards);
        }
Example #16
0
        public static Vec2[] ReadVec2Arr(this IReadableBuffer data)
        {
            var cnt = data.ReadInt();

            if (cnt < 0)
            {
                return(null);
            }

            var arr = new Vec2[cnt];

            FC.For(cnt, (i) => { var v = data.ReadVec2(); arr[i] = v; });
            return(arr);
        }
Example #17
0
File: LvPVP.cs Project: radtek/SCM2
        public override void InitBuilding(Room r)
        {
            // 双方地方基地
            cc1    = r.AddNewUnit(null, "Base", poses[0], 1, true);
            cc1.Hp = cc1.cfg.MaxHp;
            cc2    = r.AddNewUnit(null, "Base", MapSize - poses[0], 2, true);
            cc2.Hp = cc2.cfg.MaxHp;

            // 添加初始矿机
            FC.For(4, (i) =>
            {
                r.AddNewUnit(null, "CrystalMachine", r.FindNextCrystalMachinePos(cc1), 1, true).Owner = cc1;
                r.AddNewUnit(null, "CrystalMachine", r.FindNextCrystalMachinePos(cc2), 2, true).Owner = cc2;
            });
        }
Example #18
0
File: Room.cs Project: radtek/SCM2
        // 空投伞兵到指定位置,路径随机
        public bool CreateSoldierCarrier(string type, int player, Vec2 dropPt)
        {
            var cfg = UnitConfiguration.GetDefaultConfig(type);

            var cost    = cfg.Cost;
            var gasCost = cfg.GasCost;

            if (GetResource(player, "Money") < cost || GetResource(player, "Gas") < gasCost)
            {
                return(false);
            }
            else if (cfg.Prerequisites != null && GetAllUnitsByPlayer(player,
                                                                      (u) => u.BuildingCompleted && CheckPrerequisites(player, u.UnitType)).Length == 0)
            {
                return(false);
            }

            var aps = GetUnitsByType(UnitConfiguration.GetMainBuilder(type), player);

            if (aps.Length == 0)
            {
                return(false);
            }

            AddResource(player, "Money", -cost);
            AddResource(player, "Gas", -gasCost);

            // 随机从一个机场出发
            var fromPt = aps[RandomNext(0, aps.Length)].Pos;
            var dir    = dropPt - fromPt;
            var mr     = MapSize.x > MapSize.y ? MapSize.x : MapSize.y;

            dir = dir.Length > 1 ? dir / dir.Length : Vec2.Zero;
            var toPt = dropPt + dir * mr;
            var stc  = AddNewUnit(null, type, fromPt, player);

            var pType = cfg.Pets[0];
            var pCnt  = int.Parse(cfg.Pets[1]);

            FC.For(pCnt, (i) => { stc.UnitCosntructingWaitingList.Add(pType); });
            stc.Dir = dir.Dir();
            stc.MovePath.Add(dropPt);
            stc.MovePath.Add(toPt);

            return(true);
        }
Example #19
0
        // 获取出生位置
        public void GetRespawnPlace()
        {
            FC.For(0, MapInfo.Count, (i) =>
            {
                if (MapInfo[i].RespawnForChamp == true)
                {
                    RespawnForChamp.Add(MapInfo[i]);
                }
                if (MapInfo[i].RespawnForEnemy == true)
                {
                    RespawnForEnemy.Add(MapInfo[i]);
                }
            });

            GetRandomRespawnPlace(RespawnForChamp, Battle.Srand);
            GetRandomRespawnPlace(RespawnForEnemy, Battle.Srand);
        }
Example #20
0
    public void UpdateSkill(Warrior warrior)
    {
        // 如果为敌军或者在空地则显示为地形改造按钮
        if (warrior == null || !(warrior is Hero))
        {
            UpdateItemUsage();
            return;
        }

        skill.SetActive(true);
        ItemUsage.SetActive(false);
        if (warrior.GetDefaultActiveSkill() is ActiveSkill) // 若为主动技能
        {
            skill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + warrior.GetDefaultActiveSkill().ID) as Sprite;
            energyHint.SetActive(true);
            skillHint.SetActive(false);

            // 如果是主动技能则使用button
            skill.GetComponent <Button>().enabled = true;
            energy.text = (warrior.GetDefaultActiveSkill() as ActiveSkill).EnergyCost.ToString();
        }
        else if (warrior.PatternSkill != null) // 若为pattern技能
        {
            skill.GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/Skill/" + warrior.PatternSkill.ID) as Sprite;
            energyHint.SetActive(false);
            skillHint.SetActive(true);

            // 如果是pattern技能则不使用button
            skill.GetComponent <Button>().enabled = false;

            // 先将显示技能提示区域变为不可见
            FC.For(skillCards.Length, (i) =>
            {
                skillCards[i].SetActive(false);
            });

            // 将技能提示栏的图片更换为pattern技能的出招顺序
            FC.For(warrior.PatternSkill.CardsPattern.Length, (i) =>
            {
                skillCards[i].SetActive(true);
                skillCards[i].GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/CardType/" + warrior.PatternSkill.CardsPattern[i]) as Sprite;
            });
        }
    }
Example #21
0
File: Utils.cs Project: radtek/SCM2
        // 递归遍历所有子节点
        public static bool TravelAllChild(Transform t, Func <Transform, bool> fun)
        {
            var continueTravel = fun(t);

            if (!continueTravel)
            {
                return(false);
            }

            var cnt = t.childCount;

            FC.For(cnt, (i) =>
            {
                var child      = t.GetChild(i);
                continueTravel = TravelAllChild(child, fun);
            }, () => continueTravel);

            return(continueTravel);
        }
Example #22
0
    static Transform FindFirstChildren(Transform t, string name)
    {
        Transform theChild = null;

        FC.For(t.childCount, (i) =>
        {
            var c = t.GetChild(i);
            if (c.name == name)
            {
                theChild = c;
            }
            else
            {
                theChild = FindFirstChildren(c, name);
            }
        }, () => theChild == null);

        return(theChild);
    }
Example #23
0
    // 显示人物信息栏左下角buff栏
    public void UpDateBUFF(Warrior warrior)
    {
        bool[] isBUFFPicTaken = new bool[BUFFPic.Length];
        FC.For(BUFFPic.Length, (w) => BUFFPic[w].SetActive(false));

        foreach (var buff in warrior.Buffs)
        {
            if (BuffDisplayList.BuffsToDisplay.Contains((name) => { return(name.Equals(buff.ID)); }))
            {
                for (int j = 0; j < BUFFPic.Length; j++)
                {
                    if (!isBUFFPicTaken[j])
                    {
                        BUFFPic[j].SetActive(true);
                        BUFFPic[j].GetComponent <Image>().sprite = Resources.Load <Sprite>("UI/BUFFs/" + buff.ID) as Sprite;
                        isBUFFPicTaken[j] = true;
                        break;
                    }
                }
            }
        }
        ;
    }
Example #24
0
        // 直接添加空降兵
        void OnAddSoldierCarrierUnit4TestAnyway(int _, IReadableBuffer data)
        {
            var player  = data.ReadInt();
            var genType = data.ReadString();
            var x       = data.ReadInt();
            var y       = data.ReadInt();

            Vec2 dropPt = new Vec2(x, y);
            var  fromPt = player == 1 ? new Vec2(30, 5) : new Vec2(30, 235);
            var  dir    = dropPt - fromPt;
            var  mr     = MapSize.x > MapSize.y ? MapSize.x : MapSize.y;

            dir = dir.Length > 1 ? dir / dir.Length : Vec2.Zero;
            var toPt = dropPt + dir * mr;
            var stc  = AddNewUnit(null, genType, fromPt, player);

            var cfg   = UnitConfiguration.GetDefaultConfig(genType);
            var pType = cfg.Pets[0];
            var pCnt  = int.Parse(cfg.Pets[1]);

            FC.For(pCnt, (i) => { stc.UnitCosntructingWaitingList.Add(pType); });

            stc.Dir = dir.Dir();
            stc.MovePath.Add(dropPt);
            stc.MovePath.Add(toPt);

            if (stc != null)
            {
                Broadcast("AddSoldierCarrierUnit4TestAnyway", (buff) =>
                {
                    buff.Write(player);
                    buff.Write(genType);
                    buff.Write((int)dropPt.x);
                    buff.Write((int)dropPt.y);
                });
            }
        }
Example #25
0
 // 显示攻击范围
 public void ShowAttackRange(float x, float y, Warrior worrior)
 {
     Debug.Assert(pathATKRange.Count == 0, "path range is not empty now.");
     FC.For(worrior.AttackRange.Length, (i) =>
     {
         int minX = (x - worrior.AttackRange[i]) < 0 ? 0 : (int)(x - worrior.AttackRange[i]);
         int maxX = (x + worrior.AttackRange[i]) >= BattleStage.Map.Width ? BattleStage.Map.Width : (int)(x + worrior.AttackRange[i] + 1);
         int minY = (y - worrior.AttackRange[i]) < 0 ? 0 : (int)(y - worrior.AttackRange[i]);
         int maxY = (y + worrior.AttackRange[i]) >= BattleStage.Map.Height ? BattleStage.Map.Height : (int)(y + worrior.AttackRange[i] + 1);
         FC.For2(minX, maxX, minY, maxY, (tx, ty) =>
         {
             if (MU.ManhattanDist((int)x, (int)y, tx, ty) == worrior.AttackRange[i])
             {
                 var tile = BattleStage.CreateMapTile(tx, ty);
                 pathATKRange.Add(tile);
                 var avatar = BattleStage.GetAvatarAt(tx, ty);
                 if (avatar != null && avatar.Warrior.Team != worrior.Team)
                 {
                     avatar.AttackHint.SetActive(true);
                 }
             }
         });
     });
 }
Example #26
0
    // 直接建造空降兵
    void OnAddSoldierCarrierUnit4TestAnyway(IReadableBuffer data)
    {
        var player = data.ReadInt();
        var type   = data.ReadString();
        var dropPt = new Vec2(data.ReadInt(), data.ReadInt());

        var fromPt = player == 1 ? new Vec2(30, 5) : new Vec2(30, 235);
        var dir    = dropPt - fromPt;
        var mr     = MapSize.x > MapSize.y ? MapSize.x : MapSize.y;

        dir = dir.Length > 1 ? dir / dir.Length : Vec2.Zero;
        var toPt = dropPt + dir * mr;
        var stc  = AddNewUnit(null, type, fromPt, player);

        var cfg   = UnitConfiguration.GetDefaultConfig(type);
        var pType = cfg.Pets[0];
        var pCnt  = int.Parse(cfg.Pets[1]);

        FC.For(pCnt, (i) => { stc.UnitCosntructingWaitingList.Add(pType); });

        stc.Dir = dir.Dir();
        stc.MovePath.Add(dropPt);
        stc.MovePath.Add(toPt);
    }
Example #27
0
    // 显示范围
    public void ShowRange(int cx, int cy, ActiveSkill skill, Action <int, int> onSelPos)
    {
        Debug.Assert(Range.Count == 0, "path asasrange is not empty now.");
        this.onSelPos = onSelPos;
        var map = BattleStage.Map;

        // 如果无释放范围的技能
        if (!(skill is ISkillWithRange))
        {
            // 需要过滤目标
            if (skill is ISkillWithTargetFilter)
            {
                var targetList = (skill as ISkillWithTargetFilter).AllAvaliableTargets();
                FC.For(targetList.Count, (i) =>
                {
                    var warrior = targetList[i] as Warrior;
                    if (warrior != null)
                    {
                        // 建立用于显示技能范围的地块
                        var avatar  = BattleStage.GetAvatarByWarrior(warrior);
                        var mapTile = BattleStage.CreateMapTile(avatar.X, avatar.Y);
                        mapTile.gameObject.SetActive(false);
                        Range.Add(mapTile);

                        // 显示人物身上的技能标识
                        if (warrior.Team == skill.Owner.Team)
                        {
                            avatar.FriendSkillDec.SetActive(true);
                        }
                        else
                        {
                            avatar.EnemySkillDec.SetActive(true);
                        }
                    }
                    else
                    {
                        Debug.Assert(warrior != null, "the target is not warrior");
                    }
                });
            }
        }
        else // 有释放范围的技能
        {
            var range = (skill as ISkillWithRange).Range;
            FC.SquareFor(cx, cy, range, (x, y) =>
            {
                if (x < 0 || x >= map.Width || y < 0 || y >= map.Height)
                {
                    return;
                }
                var obj = map.GetAt <BattleMapObj>(x, y);
                if (MU.ManhattanDist(x, y, cx, cy) == range)
                {
                    if (obj == null || (obj != null && obj is Hero))
                    {
                        var tile = BattleStage.CreateMapTile(x, y);
                        Range.Add(tile);
                    }
                }
            });
        }
    }
Example #28
0
        public void AutoSortCards(Warrior warrior)
        {
            // 没有pattern技能则不自动排序
            if (warrior.PatternSkill == null)
            {
                return;
            }

            BattleCard [] AfterSortingCards = new BattleCard[AvailableCards.Count];
            var           skillOrder        = warrior.PatternSkill.CardsPattern;

            bool[] visited      = new bool[AvailableCards.Count];
            int    currentIndex = 0;
            int    countNumber  = 0;

            int[] StoreIndex = new int[AvailableCards.Count];

            while (countNumber < AvailableCards.Count)
            {
                for (int i = 0; i < skillOrder.Length; i++)
                {
                    for (int j = 0; j < AvailableCards.Count; j++)
                    {
                        if (!visited[j] && AvailableCards[j].Name.Equals(skillOrder[i]))
                        {
                            visited[j] = true;
                            StoreIndex[currentIndex] = j; // 记录下排序后当前位置的卡牌原来的index
                            currentIndex++;
                            break;
                        }
                    }
                    countNumber++;
                }

                // 判断是否应该将StoreIndex储存的卡牌更新到排序后的卡组
                if (currentIndex % skillOrder.Length == 0 && currentIndex != 0)
                {
                    FC.For(currentIndex - skillOrder.Length, currentIndex, (i) =>
                    {
                        var j = StoreIndex[i];
                        AfterSortingCards[i] = AvailableCards[j];
                    });
                }
                else // 将不符合组合的卡牌退回到剩余卡牌中
                {
                    var remainder = currentIndex % skillOrder.Length;

                    FC.For(currentIndex - remainder, currentIndex, (i) =>
                    {
                        visited[StoreIndex[i]] = false;
                    });
                    currentIndex = currentIndex - remainder;
                    break;
                }
            }

            // 将不符合组合条件的剩余卡牌放入排序后的卡组
            for (int i = currentIndex; i < AfterSortingCards.Length; i++)
            {
                for (int j = 0; j < AvailableCards.Count; j++)
                {
                    if (!visited[j])
                    {
                        visited[j]           = true;
                        AfterSortingCards[i] = AvailableCards[j];
                        break;
                    }
                }
            }

            // 将排序后的卡组赋给原来卡组
            FC.For(AvailableCards.Count, (i) =>
            {
                AvailableCards[i] = AfterSortingCards[i];
            });
        }
Example #29
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();
    }
Example #30
0
    // 重新排列所有选项
    public void Refresh()
    {
        // 销毁原有的按钮
        foreach (var btn in choiceBtns)
        {
            Destroy(btn.gameObject);
        }

        // 创建新按钮
        FC.For(choices.Length, (i) =>
        {
            var go = Instantiate(SelChoiceBtn(Choices[i]));
            go.transform.SetParent(SelectArea.transform);
            //go.GetComponentInChildren<Text>().text = ChoicesName[i];

            if (!(Choices[i] == "DestroyBuilding" || Choices[i] == "Confirm" || Choices[i] == "Cancel"))
            {
                UnitDic.Add(Choices[i], go);
                ShowUnitInfo(Choices[i], go);
            }

            var name = go.transform.Find("Name");
            name.GetComponent <Text>().text = ChoicesName[i];

            if (Choices[i] == "DestroyBuilding")
            {
                name.GetComponent <Text>().color = Color.red;
            }

            var choiceTag = choices[i];
            go.GetComponent <Button>().onClick.AddListener(() => { OnSelectOne(choiceTag); });
            go.SetActive(true);
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;
            choiceBtns.Add(go);
        });

        // 重排列所有按钮
        var cnt = choiceBtns.Count;

        if (cnt == 0)
        {
            Hide();
            return;
        }

        // 菜单显示尺寸
        var w = choiceBtns[0].GetComponent <RectTransform>().rect.width;
        var h = choiceBtns[0].GetComponent <RectTransform>().rect.height;

        if (cnt == 1)
        {
            choiceBtns[0].transform.localPosition = Vector3.zero;
        }
        else if (cnt == 2)
        {
            choiceBtns[0].transform.localPosition = new Vector3(-w * 0.75f, 0, 0);
            choiceBtns[1].transform.localPosition = new Vector3(w * 0.75f, 0, 0);
            w *= 2.5f;
        }
        else if (cnt == 3)
        {
            choiceBtns[0].transform.localPosition = new Vector3(-w * 1.25f, 0, 0);
            choiceBtns[1].transform.localPosition = new Vector3(0, 0, 0);
            choiceBtns[2].transform.localPosition = new Vector3(w * 1.25f, 0, 0);
            w *= 3.75f;
        }
        else if (cnt < 6)
        {
            FC.For(cnt, (i) =>
            {
                var y = i < 3 ? h / 2 : -h / 2;
                var x = (i % 3) * w - w;
                choiceBtns[i].transform.localPosition = new Vector3(x, y, 0);
            });

            w *= 3;
            h *= 2;
        }
        else
        {
            FC.For(cnt, (i) =>
            {
                var y = i < 3 ? h : (i < 6 ? 0 : -h);
                var x = (i % 3) * w - w;
                choiceBtns[i].transform.localPosition = new Vector3(x, y, 0);
            });

            w *= 3;
            h *= 3;
        }

        // 检查边界调整位置
        var parentArea = SelectArea.parent.GetComponent <RectTransform>().rect;
        var uiPos      = SelectArea.transform.localPosition + Vector3.up * 40f;
        var uiPosX     = uiPos.x.Clamp(w / 2, parentArea.width - w / 2);
        var uiPosY     = uiPos.y.Clamp(h / 2, parentArea.height - h / 2);

        SelectArea.transform.localPosition = new Vector3(uiPosX, uiPosY, 0);
    }