using Godot; using System; public partial class Marble : RigidBody2D { // Don't forget to rebuild the project so the editor knows about the new signal. [Signal] public delegate void HoverEventHandler(bool tf = true); [Signal] public delegate void SelectEventHandler(bool tf = true); [Signal] public delegate void AimEventHandler(bool tf = true); [Signal] public delegate void LaunchEventHandler(bool tf = true); [Signal] public delegate void MoveEventHandler(bool tf = true); [Signal] public delegate void BumpMarbleEventHandler(Marble marble); [Signal] public delegate void DefenseDownEventHandler(int damage); [Export] public bool Holding = false, Placed = false, Hovered = false, Selected = false, Aimed = false, Launched = false, Moving = false; [Export] public int Defense = 10, Speed = 400; [Export] public Vector2 Force = Vector2.Zero, Velocity = Vector2.Zero; [Export] public Vector2 ScreenSize; // Size of the game window. public int _defenseMax; public override void _Ready() { ScreenSize = GetViewportRect().Size; _defenseMax = Defense; //Hide(); } public override void _PhysicsProcess(double delta) //THIS IS LIKE THE UPDATE FUNCTION { if (Placed) { TrySelect(); TryAim(); TryLaunch(); TryMovement(delta); } else if (Holding) { GetNode("Bounds").Disabled = true; Position = GetGlobalMousePosition(); if (Input.IsActionJustReleased("left_click")) { Start(Position); } } } public void DefenseChange(int change) { Defense += change; if (Defense < 0) { EmitSignal(SignalName.DefenseDown, Defense); // transfer damage over 0 to player Defense = 0; // set defense back to 0 } } public void Start(Vector2 position) { Holding = false; Placed = true; Position = position; Show(); GetNode("Bounds").Disabled = false; } public void TryAim() { if (Selected && Input.IsActionPressed("left_click") && !Hovered && !Aimed) { Aimed = true; EmitSignal(SignalName.Aim); } if (Aimed) { Vector2 mousePosition = GetGlobalMousePosition(); Force = Position - mousePosition; //Rotation = Force.Angle() - 180; // if i want to implement this i need to work out the shader to accept rotation if (!Input.IsActionPressed("left_click")) { if (!Hovered) { Launched = true; EmitSignal(SignalName.Select, false); } else { Aimed = false; EmitSignal(SignalName.Aim, false); } } } } public void TryLaunch() { if (Aimed && Input.IsActionJustReleased("left_click")) { Selected = false; EmitSignal(SignalName.Select, false); Aimed = false; EmitSignal(SignalName.Aim, false); Launched = true; EmitSignal(SignalName.Launch); ApplyCentralForce(Force * Speed); Force = Vector2.Zero; } } public void TryMovement(double delta) { if (LinearVelocity.Length() > 0 && !Sleeping) { if (!Moving) { Moving = true; EmitSignal(SignalName.Move); } } if (Moving) { Vector2 Scroll = -LinearVelocity / 100; Sprite2D sprite = (Sprite2D)GetNode("Texture"); ShaderMaterial material = (ShaderMaterial)sprite.Material; float CurrentScrollX = (float)material.GetShaderParameter("scroll_x"); material.SetShaderParameter("scroll_x", (CurrentScrollX + Scroll.X * (float)delta) % 1.0f); float CurrentScrollY = (float)material.GetShaderParameter("scroll_y"); material.SetShaderParameter("scroll_y", (CurrentScrollY + Scroll.Y * (float)delta) % 1.0f); if (Sleeping) { Launched = false; Moving = false; EmitSignal(SignalName.Move, false); } } } public void TrySelect() { if (Hovered) { if (Input.IsActionJustPressed("left_click") && !Selected) { Selected = true; EmitSignal(SignalName.Select); } } if (Selected) { if (!Hovered) { if (Input.IsActionJustPressed("left_click") && Selected) { Selected = false; EmitSignal(SignalName.Select, false); } } } } private void OnMouseEntered() { Hovered = true; EmitSignal(SignalName.Hover); } private void OnMouseExited() { Hovered = false; EmitSignal(SignalName.Hover, false); } private void OnBodyEntered(Node2D body) { if (body.GetType() == typeof(Marble)) { EmitSignal(SignalName.BumpMarble, (Marble)body); } } }