using Godot; using System; using System.Collections.Generic; 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; } } 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; // 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.IsDragging = true; parent.DraggingTarget = this; var desk = GetNode("Desk"); _mouseOffset = desk.LocalToMap(GetLocalMousePosition()); GD.Print($"_mouseOffset = {_mouseOffset}"); } } else if (@event.IsActionReleased("mouse_left_press")) { var parent = GetParent(); parent.IsDragging = false; parent.DraggingTarget = null; } 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; } public void RandomChangeTheme() { tableThemes[GD.RandRange(0, tableThemes.Length-1)].Apply(GetNode("Desk")); table2Themes[GD.RandRange(0, table2Themes.Length-1)].Apply(GetNode("Desk2")); chairThemes[GD.RandRange(0, chairThemes.Length-1)].Apply(GetNode("Chair")); chair2Themes[GD.RandRange(0, chair2Themes.Length-1)].Apply(GetNode("Chair2")); equipThemes[GD.RandRange(0, equipThemes.Length-1)].Apply(GetNode("Equip")); var x =GD.RandRange(0, equip2Themes.Length-1); GD.Print(GD.RandRange(0, equip2Themes.Length-1)); equip2Themes[x].Apply(GetNode("Equip2")); } }