Пример #1
0
    public void Update(out bool _mWin, out bool _oWin)
    {
        MemoryStream mMs = null;

        MemoryStream oMs = null;

        BinaryWriter mBw = null;

        BinaryWriter oBw = null;

        if (!isClient)
        {
            mMs = new MemoryStream();

            mBw = new BinaryWriter(mMs);

            oMs = new MemoryStream();

            oBw = new BinaryWriter(oMs);

            ServerUpdate(mBw, true);

            ServerUpdate(oBw, false);
        }

        //do command
        if (commandPool.ContainsKey(roundNum))
        {
            Dictionary <int, CommandData> tmpDic = commandPool[roundNum];

            Dictionary <int, CommandData> .ValueCollection.Enumerator enumerator = tmpDic.Values.GetEnumerator();

            while (enumerator.MoveNext())
            {
                DoCommand(enumerator.Current);
            }

            commandPool.Remove(roundNum);
        }

        //服务器必须在波次到来前N帧将新增单位指令添加到pool中
        if (!isClient && (roundNum + gameConfig.GetCommandDelay()) % gameConfig.GetSpawnStep() == 0)
        {
            Dictionary <int, Dictionary <int, UnitCommandData> > .ValueCollection.Enumerator enumerator = mUnitCommandPool.Values.GetEnumerator();

            while (enumerator.MoveNext())
            {
                Dictionary <int, UnitCommandData> tmpDic = enumerator.Current;

                Dictionary <int, UnitCommandData> .ValueCollection.Enumerator enumerator2 = tmpDic.Values.GetEnumerator();

                while (enumerator2.MoveNext())
                {
                    DoCommand(enumerator2.Current);
                }
            }

            mUnitCommandPool.Clear();

            enumerator = oUnitCommandPool.Values.GetEnumerator();

            while (enumerator.MoveNext())
            {
                Dictionary <int, UnitCommandData> tmpDic = enumerator.Current;

                Dictionary <int, UnitCommandData> .ValueCollection.Enumerator enumerator2 = tmpDic.Values.GetEnumerator();

                while (enumerator2.MoveNext())
                {
                    DoCommand(enumerator2.Current);
                }
            }

            oUnitCommandPool.Clear();
        }
        //客户端必须在波次到来的这一帧将新增单位指令添加到pool中  同时还要将下一个波次的新增单位指令继续保存
        else if (isClient && roundNum % gameConfig.GetSpawnStep() == 0)
        {
            Dictionary <int, Dictionary <int, UnitCommandData> > newDic = null;

            Dictionary <int, Dictionary <int, UnitCommandData> > .Enumerator enumerator = mUnitCommandPool.GetEnumerator();

            while (enumerator.MoveNext())
            {
                if (enumerator.Current.Key > roundNum)
                {
                    if (newDic == null)
                    {
                        newDic = new Dictionary <int, Dictionary <int, UnitCommandData> >();
                    }

                    newDic.Add(enumerator.Current.Key, enumerator.Current.Value);
                }
                else
                {
                    Dictionary <int, UnitCommandData> tmpDic = enumerator.Current.Value;

                    Dictionary <int, UnitCommandData> .ValueCollection.Enumerator enumerator2 = tmpDic.Values.GetEnumerator();

                    while (enumerator2.MoveNext())
                    {
                        DoCommand(enumerator2.Current);
                    }
                }
            }

            if (newDic != null)
            {
                mUnitCommandPool = newDic;

                newDic = null;
            }
            else
            {
                mUnitCommandPool.Clear();
            }

            enumerator = oUnitCommandPool.GetEnumerator();

            while (enumerator.MoveNext())
            {
                if (enumerator.Current.Key > roundNum)
                {
                    if (newDic == null)
                    {
                        newDic = new Dictionary <int, Dictionary <int, UnitCommandData> >();
                    }

                    newDic.Add(enumerator.Current.Key, enumerator.Current.Value);
                }
                else
                {
                    Dictionary <int, UnitCommandData> tmpDic = enumerator.Current.Value;

                    Dictionary <int, UnitCommandData> .ValueCollection.Enumerator enumerator2 = tmpDic.Values.GetEnumerator();

                    while (enumerator2.MoveNext())
                    {
                        DoCommand(enumerator2.Current);
                    }
                }
            }

            if (newDic != null)
            {
                oUnitCommandPool = newDic;
            }
            else
            {
                oUnitCommandPool.Clear();
            }
        }
        //----

        //do round action
        if (roundNum % gameConfig.GetSpawnStep() == 0)
        {
            Spawn();
        }

        simulator.BuildAgentTree();

        UpdateSkill();//use tree

        _mWin = false;

        _oWin = false;

        Dictionary <int, LinkedList <int> > clientAttackData = null;

        UpdateUnit(ref _mWin, ref _oWin, ref clientAttackData); //use tree

        CheckSkillEnd();                                        //destroy tree

        for (int i = 0; i < gameConfig.GetMoveTimes() - 1; i++)
        {
            simulator.BuildAgentTree();

            simulator.doStep();
        }

        simulator.BuildAgentTree();

        double result = simulator.doStepFinal();

        Log.Write("round:" + roundNum + "------------------\n");

        var tt = unitList.GetEnumerator();

        while (tt.MoveNext())
        {
            Log.Write("uid:" + tt.Current.uid + "  hp:" + tt.Current.nowHp + "  x:" + tt.Current.pos.x + "  y:" + tt.Current.pos.y + "\n");
        }
        //----

        mMoney += gameConfig.GetMoneyPerStep();

        oMoney += gameConfig.GetMoneyPerStep();

        if (isClient)
        {
            if (resultDic.ContainsKey(roundNum))
            {
                double serverResult = resultDic[roundNum];

                if (result.ToString("F4") != serverResult.ToString("F4"))
                {
                    throw new Exception("我就日了  myRound:" + roundNum + "  serverRound:" + serverRoundNum + "    myResult:" + result + "  serverResult:" + serverResult);
                }
                else
                {
                    resultDic.Remove(roundNum);
                }
            }
            else
            {
                resultDic.Add(roundNum, result);
            }

            updateCallBack(clientAttackData);
        }
        else
        {
            mBw.Write(result);

            oBw.Write(result);

            serverSendDataCallBack(true, mMs);

            serverSendDataCallBack(false, oMs);

            mMs.Dispose();

            mBw.Close();

            oMs.Dispose();

            oBw.Close();

            mShowMoney += gameConfig.GetMoneyPerStep();

            oShowMoney += gameConfig.GetMoneyPerStep();
        }

        if (!isClient && (_mWin || _oWin))
        {
            Over();

            using (MemoryStream ms = new MemoryStream())
            {
                using (BinaryWriter bw = new BinaryWriter(ms))
                {
                    bw.Write((int)S2CCommand.BATTLE_OVER);

                    bw.Write(roundNum);

                    bw.Write(_mWin);

                    bw.Write(_oWin);

                    serverSendDataCallBack(true, ms);

                    serverSendDataCallBack(false, ms);
                }
            }
        }
        else
        {
            roundNum++;
        }
    }