예제 #1
0
        protected void SplitTaskCompleted(TaskInfo taskInfo)
        {
            Assert.DoesNotThrow(() =>
            {
                EndTest();
            });

            Assert.AreEqual(TaskState.Completed, taskInfo.State);
            Assert.IsFalse(taskInfo.IsFailed);

            const int            playerId   = 3;
            IMatchUnitController controller = m_engine.GetUnitController(playerId, taskInfo.Cmd.UnitIndex);

            Assert.IsNull(controller);

            Coordinate[] coords = m_map.FindDataOfType((int)KnownVoxelTypes.Eater, playerId);
            Assert.AreEqual(2, coords.Length);
            for (int i = 0; i < coords.Length; ++i)
            {
                Assert.AreEqual(2, coords[i].Weight);

                VoxelData data = m_map.Get(coords[i]);
                Assert.IsNotNull(data);
                Assert.AreEqual((int)KnownVoxelTypes.Eater, data.Type);
            }

            Assert.AreEqual(1, coords[0].MapPos.SqDistanceTo(coords[1].MapPos));
            Assert.Pass();
        }
        public void DestroyAllUnitsAndAssets()
        {
            for (int i = 0; i < m_units.Length; ++i)
            {
                IMatchUnitController unit = m_units[i];
                if (!unit.IsAlive)
                {
                    continue;
                }
                Coordinate c    = unit.DataController.Coordinate;
                MapCell    cell = m_engine.Map.Get(c.Row, c.Col, c.Weight);
                cell.RemoveVoxelDataAndDecreaseHeight(unit.Data);
                RemoveUnitController(true, unit);
            }

            m_units = new IMatchUnitController[0];

            long[] assetIds = m_idToAsset.Keys.ToArray();
            for (int i = 0; i < assetIds.Length; ++i)
            {
                long       assetId = assetIds[i];
                MatchAsset asset   = m_idToAsset[assetId];
                asset.Cell.RemoveVoxelDataAndDecreaseHeight(asset.VoxelData);
                RemoveAsset(asset.VoxelData);
            }
        }
        private bool RemoveUnitController(bool unitsChanged, IMatchUnitController unitController)
        {
            if (m_idToUnit.ContainsKey(unitController.Id))
            {
                if (VoxelData.IsControllableUnit(unitController.DataController.ControlledData.Type))
                {
                    m_controllableUnitsCount--;
                }

                MatchFactory.DestroyUnitController(unitController);
                m_idToUnit.Remove(unitController.Id);
                unitsChanged = true;

                if (unitController.Assignment != null)
                {
                    AssignmentsController.RemoveAssignment(unitController, null);
                }

                if (unitController.TargetForAssignments != null)
                {
                    AssignmentsController.RemoveTargetFromAssignments(unitController, null);
                }

                if (UnitRemoved != null)
                {
                    UnitRemoved(unitController);
                }
            }

            return(unitsChanged);
        }
예제 #4
0
        protected void DiminishTaskCompleted(TaskInfo taskInfo)
        {
            Assert.DoesNotThrow(() =>
            {
                EndTest();
            });

            Assert.AreEqual(TaskState.Completed, taskInfo.State);
            Assert.IsFalse(taskInfo.IsFailed);

            IMatchUnitController controller = m_engine.GetUnitController(1, taskInfo.Cmd.UnitIndex);

            Assert.IsNotNull(controller);
            Assert.AreEqual(controller.Data.Weight, 2);

            Assert.Pass();
        }
        private void CreateUnitController(VoxelData voxelData, Coordinate coordinate)
        {
            voxelData.UnitOrAssetIndex = m_identity;
            IMatchUnitController unit = MatchFactory.CreateUnitController(m_engine, coordinate, voxelData.Type, m_playerIndex, m_allAbilities);

            m_idToUnit.Add(m_identity, unit);

            if (VoxelData.IsControllableUnit(unit.DataController.ControlledData.Type))
            {
                m_controllableUnitsCount++;
            }

            unchecked
            {
                m_identity++;
            }

            if (UnitCreated != null)
            {
                UnitCreated(unit);
            }
        }
예제 #6
0
        public bool IsSuitableCmdFor(Guid playerId, long unitIndex, int cmdCode)
        {
            IMatchPlayerController playerController;

            if (m_idToPlayers.TryGetValue(playerId, out playerController))
            {
                IMatchUnitController unitController = playerController.GetUnitController(unitIndex);
                if (unitController.Data.Type == (int)KnownVoxelTypes.Spawner)
                {
                    return(false);
                }
                switch (cmdCode)
                {
                //case CmdCode.Automatic:
                //    return true;
                case CmdCode.Convert:
                    return(unitController.DataController.CanConvertImmediate(-1) == CmdResultCode.Success);

                case CmdCode.Grow:
                    return(unitController.DataController.CanGrowImmediate() == CmdResultCode.Success);

                case CmdCode.Split4:
                    return(unitController.DataController.CanSplit4Immediate() == CmdResultCode.Success);

                case CmdCode.Split:
                    return(unitController.DataController.CanSplitImmediate() == CmdResultCode.Success);

                case CmdCode.Move:
                    return(!unitController.DataController.IsCollapsedOrBlocked);

                case CmdCode.Explode:
                    return(unitController.Data.Type == (int)KnownVoxelTypes.Bomb);
                }
            }
            return(false);
        }
        private bool PostprocessCmd(bool unitsChanged, IMatchUnitController unitController, Cmd cmd)
        {
            if (cmd.IsFailed)
            {
                return(unitsChanged);
            }
            if (cmd.Code == CmdCode.Split || cmd.Code == CmdCode.Split4)
            {
                CoordinateCmd splitCmd = (CoordinateCmd)cmd;
                for (int c = 0; c < splitCmd.Coordinates.Length; ++c)
                {
                    Coordinate coordinate = splitCmd.Coordinates[c];
                    VoxelData  voxelData  = m_engine.Map.Get(coordinate);

                    if (voxelData != null)
                    {
                        CreateUnitController(voxelData, coordinate);
                        unitsChanged = true;
                    }
                }
            }
            else if (cmd.Code == CmdCode.Convert)
            {
                Coordinate coord     = unitController.DataController.Coordinate;
                MapCell    cell      = m_engine.Map.Get(coord.Row, coord.Col, coord.Weight);
                VoxelData  voxelData = cell.GetVoxelDataAt(coord.Altitude);

                if (voxelData != null)
                {
                    if (VoxelData.IsUnit(voxelData.Type))
                    {
                        CreateUnitController(voxelData, unitController.DataController.Coordinate);
                        unitsChanged = true;
                    }
                    else
                    {
                        CreateAsset(voxelData, cell);
                    }
                }
            }
            else if (cmd.Code == CmdCode.CreateAssignment)
            {
                CreateAssignmentCmd addCmd = (CreateAssignmentCmd)cmd;
                if (addCmd.CreatePreview)
                {
                    Coordinate coord     = addCmd.PreviewCoordinate;
                    MapCell    cell      = m_engine.Map.Get(coord.Row, coord.Col, coord.Weight);
                    VoxelData  voxelData = cell.GetPreviewAt(m_playerIndex, coord.Altitude);
                    Debug.Assert(voxelData != null);
                    CreateUnitController(voxelData, coord);

                    addCmd.HasTarget         = true;
                    addCmd.TargetId          = voxelData.UnitOrAssetIndex;
                    addCmd.TargetPlayerIndex = voxelData.Owner;
                }

                m_assignmentController.CreateAssignment(addCmd.GroupId, addCmd.UnitIndex, addCmd.TaskLaunchInfo, addCmd.HasTarget, addCmd.TargetPlayerIndex, addCmd.TargetId);
            }

            return(unitsChanged);
        }
        public bool Tick(long tick, out CommandsArray commands)
        {
            m_isPlayerInRoom = !m_isPlayerLeftRoom;

            bool isChanged = false;

            if (m_units.Length != m_commandBuffer.Commands.Length)
            {
                m_commandBuffer = new CommandsArray(new Cmd[m_idToUnit.Count]);
            }

            bool unitsChanged = false;

            for (int i = 0; i < m_units.Length; ++i)
            {
                IMatchUnitController unitController = m_units[i];

                Cmd cmd;
                unitController.Tick(tick, out cmd);

                IList <VoxelDataCellPair> createdVoxels = unitController.CreatedVoxels;
                if (createdVoxels.Count != 0)
                {
                    CreateAssets(createdVoxels);
                    for (int j = 0; j < m_otherPlayerControllers.Length; ++j)
                    {
                        m_otherPlayerControllers[j].CreateAssets(createdVoxels);
                    }
                }

                IList <VoxelData> eatenOrDestroyed = unitController.EatenOrDestroyedVoxels;
                if (eatenOrDestroyed.Count != 0)
                {
                    RemoveAssets(eatenOrDestroyed);
                    for (int j = 0; j < m_otherPlayerControllers.Length; ++j)
                    {
                        m_otherPlayerControllers[j].RemoveAssets(eatenOrDestroyed);
                    }
                }

                m_commandBuffer.Commands[i] = cmd;

                if (cmd != null)
                {
                    isChanged = true;

                    if (cmd.Code == CmdCode.Composite)
                    {
                        CompositeCmd composite = (CompositeCmd)cmd;
                        for (int c = 0; c < composite.Commands.Length; ++c)
                        {
                            unitsChanged = PostprocessCmd(unitsChanged, unitController, composite.Commands[c]);
                        }
                    }
                    else
                    {
                        unitsChanged = PostprocessCmd(unitsChanged, unitController, cmd);
                    }
                }


                if (!unitController.IsAlive)
                {
                    unitsChanged = RemoveUnitController(unitsChanged, unitController);
                }
            }


            if (unitsChanged)
            {
                m_units = m_idToUnit.Values.ToArray();
            }

            commands = m_commandBuffer;

            return(isChanged);
        }
예제 #9
0
 public static void DestroyUnitController(IMatchUnitController unitController)
 {
     unitController.Destroy();
 }