private void SetDisplayColor(Color color) { List <Tinter> sprites = CurrentCraftBody.GetChildrenOfTypeRecursive <Tinter>(); foreach (Tinter sprite in sprites) { sprite.VertexColorTint = color; } }
public void Update(DwarfTime gameTime, GameMaster player) { if (!IsEnabled) { if (CurrentCraftBody != null) { CurrentCraftBody.Delete(); CurrentCraftBody = null; } return; } if (Faction == null) { Faction = player.Faction; } if (CurrentCraftType != null && CurrentCraftBody == null) { CurrentCraftBody = EntityFactory.CreateEntity <Body>(CurrentCraftType.Name, player.VoxSelector.VoxelUnderMouse.Position); CurrentCraftBody.SetActiveRecursive(false); CurrentDesignation = new CraftDesignation() { ItemType = CurrentCraftType, Location = new Voxel(new Point3(0, 0, 0), null) }; SetDisplayColor(Color.Green); } if (CurrentCraftBody == null || player.VoxSelector.VoxelUnderMouse == null) { return; } CurrentCraftBody.LocalPosition = player.VoxSelector.VoxelUnderMouse.Position + Vector3.One * 0.5f; CurrentCraftBody.GlobalTransform = CurrentCraftBody.LocalTransform; CurrentCraftBody.OrientToWalls(); if (CurrentDesignation.Location.IsSameAs(player.VoxSelector.VoxelUnderMouse)) { return; } CurrentDesignation.Location = new Voxel(player.VoxSelector.VoxelUnderMouse); SetDisplayColor(IsValid(CurrentDesignation) ? Color.Green : Color.Red); }
private void HandleOrientation() { if (CurrentDesignation == null || CurrentCraftBody == null) { return; } KeyboardState state = Keyboard.GetState(); bool leftKey = state.IsKeyDown(ControlSettings.Mappings.RotateObjectLeft); bool rightKey = state.IsKeyDown(ControlSettings.Mappings.RotateObjectRight); if (leftPressed && !leftKey) { OverrideOrientation = true; leftPressed = false; CurrentOrientation += (float)(Math.PI / 2); CurrentCraftBody.Orient(CurrentOrientation); CurrentCraftBody.UpdateBoundingBox(); CurrentCraftBody.UpdateTransform(); CurrentCraftBody.PropogateTransforms(); SoundManager.PlaySound(ContentPaths.Audio.Oscar.sfx_gui_confirm_selection, CurrentCraftBody.Position, 0.5f); CurrentCraftBody.SetTintRecursive(IsValid(CurrentDesignation) ? Color.Green : Color.Red); } if (rightPressed && !rightKey) { OverrideOrientation = true; rightPressed = false; CurrentOrientation -= (float)(Math.PI / 2); CurrentCraftBody.Orient(CurrentOrientation); CurrentCraftBody.UpdateBoundingBox(); CurrentCraftBody.UpdateTransform(); CurrentCraftBody.PropogateTransforms(); SoundManager.PlaySound(ContentPaths.Audio.Oscar.sfx_gui_confirm_selection, CurrentCraftBody.Position, 0.5f); CurrentCraftBody.SetTintRecursive(IsValid(CurrentDesignation) ? Color.Green : Color.Red); } leftPressed = leftKey; rightPressed = rightKey; CurrentDesignation.OverrideOrientation = this.OverrideOrientation; CurrentDesignation.Orientation = this.CurrentOrientation; }
public bool IsValid(CraftDesignation designation) { if (!designation.Valid) { return(false); } if (IsDesignation(designation.Location)) { World.ShowToolPopup("Something is already being built there!"); return(false); } if (!String.IsNullOrEmpty(designation.ItemType.CraftLocation) && Faction.FindNearestItemWithTags(designation.ItemType.CraftLocation, designation.Location.WorldPosition, false) == null) { World.ShowToolPopup("Can't build, need " + designation.ItemType.CraftLocation); return(false); } if (!Faction.HasResources(designation.ItemType.RequiredResources)) { string neededResources = ""; foreach (Quantitiy <Resource.ResourceTags> amount in designation.ItemType.RequiredResources) { neededResources += "" + amount.NumResources + " " + amount.ResourceType.ToString() + " "; } World.ShowToolPopup("Not enough resources! Need " + neededResources + "."); return(false); } foreach (var req in designation.ItemType.Prerequisites) { switch (req) { case CraftItem.CraftPrereq.NearWall: { var neighborFound = VoxelHelpers.EnumerateManhattanNeighbors2D(designation.Location.Coordinate) .Select(c => new VoxelHandle(World.ChunkManager.ChunkData, c)) .Any(v => v.IsValid && !v.IsEmpty); if (!neighborFound) { World.ShowToolPopup("Must be built next to wall!"); return(false); } break; } case CraftItem.CraftPrereq.OnGround: { var below = VoxelHelpers.GetNeighbor(designation.Location, new GlobalVoxelOffset(0, -1, 0)); if (!below.IsValid || below.IsEmpty) { World.ShowToolPopup("Must be built on solid ground!"); return(false); } break; } } } if (CurrentCraftBody != null) { var intersectsAnyOther = Faction.OwnedObjects.FirstOrDefault( o => o != null && o != CurrentCraftBody && o.GetRotatedBoundingBox().Intersects(CurrentCraftBody.GetRotatedBoundingBox().Expand(-0.1f))); var intersectsBuildObjects = Faction.Designations.EnumerateEntityDesignations(DesignationType.Craft) .Any(d => d.Body != CurrentCraftBody && d.Body.GetRotatedBoundingBox().Intersects( CurrentCraftBody.GetRotatedBoundingBox().Expand(-0.1f))); bool intersectsWall = VoxelHelpers.EnumerateCoordinatesInBoundingBox (CurrentCraftBody.GetRotatedBoundingBox().Expand(-0.1f)).Any( v => { var tvh = new VoxelHandle(World.ChunkManager.ChunkData, v); return(tvh.IsValid && !tvh.IsEmpty); }); if (intersectsAnyOther != null) { World.ShowToolPopup("Can't build here: intersects " + intersectsAnyOther.Name); } else if (intersectsBuildObjects) { World.ShowToolPopup("Can't build here: intersects something else being built"); } else if (intersectsWall && !designation.ItemType.Prerequisites.Contains(CraftItem.CraftPrereq.NearWall)) { World.ShowToolPopup("Can't build here: intersects wall."); } return(intersectsAnyOther == null && !intersectsBuildObjects && (!intersectsWall || designation.ItemType.Prerequisites.Contains(CraftItem.CraftPrereq.NearWall))); } return(true); }
public void Update(DwarfTime gameTime, GameMaster player) { if (!IsEnabled) { if (CurrentCraftBody != null) { CurrentCraftBody.Delete(); CurrentCraftBody = null; } return; } if (Faction == null) { Faction = player.Faction; } if (CurrentCraftType != null && CurrentCraftBody == null) { CurrentCraftBody = EntityFactory.CreateEntity <Body>(CurrentCraftType.Name, player.VoxSelector.VoxelUnderMouse.WorldPosition, Blackboard.Create <List <ResourceAmount> >("Resources", SelectedResources)); EntityFactory.GhostEntity(CurrentCraftBody, Color.White); CurrentDesignation = new CraftDesignation() { ItemType = CurrentCraftType, Location = VoxelHandle.InvalidHandle, Valid = true }; OverrideOrientation = false; CurrentCraftBody.SetTintRecursive(Color.Green); } if (CurrentCraftBody == null || !player.VoxSelector.VoxelUnderMouse.IsValid) { return; } CurrentCraftBody.LocalPosition = player.VoxSelector.VoxelUnderMouse.WorldPosition + new Vector3(0.5f, 0.0f, 0.5f) + CurrentCraftType.SpawnOffset; CurrentCraftBody.GlobalTransform = CurrentCraftBody.LocalTransform; CurrentCraftBody.UpdateTransform(); CurrentCraftBody.PropogateTransforms(); if (OverrideOrientation) { CurrentCraftBody.Orient(CurrentOrientation); } else { CurrentCraftBody.OrientToWalls(); } HandleOrientation(); if (CurrentDesignation != null) { if (CurrentDesignation.Location.Equals(player.VoxSelector.VoxelUnderMouse)) { return; } CurrentDesignation.Location = player.VoxSelector.VoxelUnderMouse; World.ShowTooltip("Click to build. Press R/T to rotate."); CurrentCraftBody.SetTintRecursive(IsValid(CurrentDesignation) ? Color.Green : Color.Red); } }