Files
hotdesking/Gameplay/Marble.cs
2025-07-09 18:00:42 -04:00

207 lines
4.3 KiB
C#

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<CollisionShape2D>("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<CollisionShape2D>("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);
}
}
}