using Godot; using System; using System.Collections.Generic; using System.Linq; using System.Xml; public partial class Cube : StaticBody2D, ITileDraggable { private static readonly Rect2I tableRect = new(0, 0, 3, 2); private static readonly Rect2I table2Rect = new(0, -1, 3, 1); private static readonly Rect2I chairRect = new(1, 1, 1, 2); private static readonly Rect2I chair2Rect = new(1, -2, 1, 2); private static readonly Rect2I equipRect = new(0, 0, 3, 2); private static readonly Rect2I equip2Rect = new(0, -1, 3, 1); private static readonly TileMapping[] tableThemes = { new(new Vector2I(1, 30), tableRect), new(new Vector2I(4, 30), tableRect), new(new Vector2I(7, 30), tableRect), new(new Vector2I(7, 28), tableRect), new(new Vector2I(10, 28), tableRect), }; private static readonly TileMapping[] table2Themes = { new(new Vector2I(1, 31), table2Rect), new(new Vector2I(4, 31), table2Rect), new(new Vector2I(7, 31), table2Rect), new(new Vector2I(7, 29), table2Rect), new(new Vector2I(10, 29), table2Rect), }; private static readonly TileMapping[] chairThemes = { new(new Vector2I(-1, 7), chairRect), new(new Vector2I(0, 7), chairRect), new(new Vector2I(-1, 9), chairRect), new(new Vector2I(0, 9), chairRect), }; private static readonly TileMapping[] chair2Themes = { new(new Vector2I(-1, 10), chair2Rect), new(new Vector2I(0, 10), chair2Rect), new(new Vector2I(-1, 12), chair2Rect), new(new Vector2I(0, 12), chair2Rect), }; private static readonly TileMapping[] equipThemes = { // one laptop new(new Vector2I(13, 26), equipRect), // one laptop with one monitor new(new Vector2I(7, 26), equipRect), // one desktop PC new(new Dictionary() { [new Vector2I(0, 0)] = new Vector2I(11, 17), [new Vector2I(1, 0)] = new Vector2I(8, 32), [new Vector2I(2, 0)] = new Vector2I(9, 32), [new Vector2I(0, 1)] = new Vector2I(11, 18), [new Vector2I(1, 1)] = new Vector2I(8, 33), [new Vector2I(2, 1)] = new Vector2I(9, 33), }), // one desktop PC with one monitors new(new Vector2I(7, 32), equipRect), }; private static readonly TileMapping[] equip2Themes = { // one laptop new(new Vector2I(13, 31), equip2Rect), // one laptop with one monitor new(new Dictionary() { [new Vector2I(0, -1)] = new Vector2I(13, 32), [new Vector2I(1, -1)] = new Vector2I(10, 7), [new Vector2I(2, -1)] = new Vector2I(15, 32), }), // one desktop PC new(new Dictionary() { [new Vector2I(0, -1)] = new Vector2I(13, 32), [new Vector2I(1, -1)] = new Vector2I(14, 32), [new Vector2I(2, -1)] = new Vector2I(15, 30), }), // one desktop PC with one monitors new(new Vector2I(13, 33), equip2Rect), }; private bool _draggable = false; public bool Draggable { get => _draggable; set { if (value == _draggable) return; _draggable = value; } } private readonly Guid _id = Guid.NewGuid(); public Guid ID => _id; public Vector2I TilePosition { get; set; } = new Vector2I(5,5); private bool _isCollided = true; public bool IsCollided { get => _isCollided; set { if (_isCollided == value) return; _isCollided = value; if (value) { GetNode("RedBG").Show(); } else { GetNode("RedBG").Hide(); } } } private static readonly Rect2I _tileRect = new(-1, -2, 4, 5); public Rect2I TileRect => _tileRect; private Vector2I _mouseOffset; public Vector2I MouseOffset => _mouseOffset; private static readonly ITileDraggable.SpecialTile[] _specialTiles = { new(new Vector2I(1,-1), Lab.MapNodeType.SeatDown | Lab.MapNodeType.Walkable), new(new Vector2I(1,2), Lab.MapNodeType.SeatUp | Lab.MapNodeType.Walkable), }; public ITileDraggable.SpecialTile[] SpecialTiles => _specialTiles; // Called when the node enters the scene tree for the first time. public override void _Ready() { RandomChangeTheme(); IsCollided = false; } public override void _InputEvent(Viewport viewport, InputEvent @event, int shapeIdx) { if (@event.IsActionPressed("mouse_left_press")) { if (Draggable) { var parent = GetParent(); parent.Pickup(this); var desk = GetNode("Desk"); _mouseOffset = desk.LocalToMap(GetLocalMousePosition()); GD.Print($"_mouseOffset = {_mouseOffset}"); } } else if (@event.IsActionReleased("mouse_left_press")) { if (_isCollided) return; var parent = GetParent(); parent.PutDown(this); } base._InputEvent(viewport, @event, shapeIdx); } // Called every frame. 'delta' is the elapsed time since the previous frame. public override void _Process(double delta) { GlobalPosition = TilePosition * 48; } private int tableThemeIdx; private int table2ThemeIdx; private int chairThemeIdx; private int chair2ThemeIdx; private int equipThemeIdx; private int equip2ThemeIdx; public void RandomChangeTheme() { tableThemeIdx = GD.RandRange(0, tableThemes.Length-1); chairThemeIdx = GD.RandRange(0, chairThemes.Length-1); equipThemeIdx = GD.RandRange(0, equipThemes.Length-1); table2ThemeIdx = GD.RandRange(0, table2Themes.Length-1); chair2ThemeIdx = GD.RandRange(0, chair2Themes.Length-1); equip2ThemeIdx = GD.RandRange(0, equip2Themes.Length-1); tableThemes[tableThemeIdx].Apply(GetNode("Desk")); chairThemes[chairThemeIdx].Apply(GetNode("Chair")); equipThemes[equipThemeIdx].Apply(GetNode("Equip")); table2Themes[table2ThemeIdx].Apply(GetNode("Desk2")); chair2Themes[chair2ThemeIdx].Apply(GetNode("Chair2")); equip2Themes[equip2ThemeIdx].Apply(GetNode("Equip2")); } private static readonly HashSet blockerTiles = new(new Vector2I[]{ new(0,0), new(1,0), new(2,0), new(0,1), new(1,1), new(2,1), }); public Lab.MapNodeType GetTileType(Vector2I pos) { GD.Print($"query position of {pos}"); if (blockerTiles.Contains(pos)) { return Lab.MapNodeType.Blocker; } if (_specialTiles.Any(t => t.Position == pos)) { return _specialTiles.First(t => t.Position == pos).NodeType; } return Lab.MapNodeType.Walkable; } public void ChairFaceTo(Vector2I target, int idx) { if (idx == 0) { var theme = chairThemes[chairThemeIdx]; } } }