public MatchPlayerController(IMatchEngine engine, int playerIndex, Dictionary <int, VoxelAbilities>[] allAbilities) { m_playerIndex = playerIndex; m_engine = engine; m_allAbilities = allAbilities; m_engine.Map.Root.ForEach(cell => { cell.ForEach(voxelData => { int owner = voxelData.Owner; if (owner == m_playerIndex) { if (VoxelData.IsUnit(voxelData.Type)) { Coordinate coordinate = new Coordinate(cell, voxelData); CreateUnitController(voxelData, coordinate); } else { if (!voxelData.IsNeutral) { CreateAsset(voxelData, cell); } } } }); }); m_units = m_idToUnit.Values.ToArray(); m_commandBuffer = new CommandsArray(new Cmd[m_idToUnit.Count]); }
private bool IsTargetForAnyone(VoxelData target) { if (target.Weight < GameConstants.MinVoxelActorWeight) { return(false); } for (int i = 0; i < m_selectedUnitDescriptors.Length; ++i) { SelectionDescriptor descriptor = m_selectedUnitDescriptors[i]; int playerIndex = PlayerIndex; if (target.IsTargetFor(descriptor.Type, descriptor.Weight, playerIndex)) { bool targetIsUnit = VoxelData.IsUnit(target.Type); if (!targetIsUnit || target.Owner != PlayerIndex) { if (descriptor.Type == (int)KnownVoxelTypes.Bomb || targetIsUnit) { return(true); } } } } return(false); }
public void Init(int playerIndex, Dictionary <int, VoxelAbilities>[] allAbilities) { m_allAbilities = allAbilities; m_idToUnit.Clear(); m_idToAsset.Clear(); m_voxelDataToId.Clear(); m_playerIndex = playerIndex; m_isLocalPlayer = m_gameState.IsLocalPlayer(m_playerIndex); Dictionary <int, VoxelAbilities> abilities = m_allAbilities[m_playerIndex]; m_voxelMap.Map.Root.ForEach(cell => { cell.ForEach(voxelData => { int owner = voxelData.Owner; if (owner == m_playerIndex) { if (VoxelData.IsUnit(voxelData.Type)) { Coordinate coordinate = new Coordinate(cell, voxelData); CreateUnitController(voxelData, coordinate); } else { if (!voxelData.IsNeutral) { CreateAsset(voxelData, abilities[voxelData.Type], cell); } } } }); }); }
private List <long> PostprocessCommand(List <long> spawnedUnitsList, Cmd cmd, IMatchUnitControllerCli unitController) { if (cmd.Code == CmdCode.Split || cmd.Code == CmdCode.Split4) { CoordinateCmd splitCmd = (CoordinateCmd)cmd; for (int i = 0; i < splitCmd.Coordinates.Length; ++i) { Coordinate coordinate = splitCmd.Coordinates[i]; VoxelData voxelData = m_voxelMap.Map.Get(coordinate); if (voxelData != null) { if (spawnedUnitsList == null) { spawnedUnitsList = new List <long>(); } spawnedUnitsList.Add(m_identity); CreateUnitController(voxelData, coordinate); } } } else if (cmd.Code == CmdCode.Convert) { Coordinate coordinate = unitController.DataController.Coordinate; MapCell cell = m_voxelMap.Map.Get(coordinate.Row, coordinate.Col, coordinate.Weight); VoxelData voxelData = cell.GetVoxelDataAt(coordinate.Altitude); if (voxelData != null) { if (VoxelData.IsUnit(voxelData.Type)) { if (spawnedUnitsList == null) { spawnedUnitsList = new List <long>(); } spawnedUnitsList.Add(m_identity); CreateUnitController(voxelData, coordinate); } else { CreateAsset(voxelData, m_allAbilities[voxelData.Owner][voxelData.Type], cell); } } } else if (cmd.Code == CmdCode.CreateAssignment) { CreateAssignmentCmd addCmd = (CreateAssignmentCmd)cmd; if (addCmd.CreatePreview) { Coordinate coord = addCmd.PreviewCoordinate; MapCell cell = m_voxelMap.Map.Get(coord.Row, coord.Col, coord.Weight); VoxelData voxelData = cell.GetPreviewAt(m_playerIndex, coord.Altitude); Debug.Assert(voxelData != null); if (spawnedUnitsList == null) { spawnedUnitsList = new List <long>(); } spawnedUnitsList.Add(m_identity); CreateUnitController(voxelData, coord); } AssignmentsController.CreateAssignment(addCmd.GroupId, addCmd.UnitIndex, addCmd.TaskLaunchInfo, addCmd.HasTarget, addCmd.TargetPlayerIndex, addCmd.TargetId); } return(spawnedUnitsList); }
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); }