Files
ClickRPG/Assets/Scripts/Character.cs
2025-10-06 15:32:09 +01:00

92 lines
2.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using EasyTalk.Controller;
using EasyTalk.Nodes;
[RequireComponent(typeof(CharacterController))]
public abstract class Character : MonoBehaviour, IInteractable
{
public enum Attitude { Friendly, Neutral, Hostile }
public Attitude attitude = Attitude.Neutral;
[Header("Stats")]
public int CurHp;
public int MaxHp;
public int Damage;
public int level = 1;
public float AttackRange = 2.0f;
public float ChaseRange = 5.0f;
public float AttackRate = 1.0f;
public float MoveSpeed = 5.0f;
[Header("Components")]
public CharacterController Controller;
protected Character target;
public string charName = "Character";
public Dialogue dialogue;
protected DialogueController dialogueController;
public event UnityAction onTakeDamage;
public Inventory Inventory { get { return inventory; } }
private Inventory inventory;
void Awake()
{
dialogueController = FindFirstObjectByType<DialogueController>();
CurHp = MaxHp;
// Get the Inventory component attached to this same GameObject
inventory = GetComponent<Inventory>();
}
public void TakeDamage(int damageToTake)
{
CurHp -= damageToTake;
onTakeDamage?.Invoke();
if (CurHp <= 0)
Die();
}
public void Die ()
{
Destroy(gameObject);
}
public void SetTarget (Character t)
{
target = t;
}
public virtual string GetInteractPrompt()
{
switch (attitude)
{
case Attitude.Friendly:
return $"Talk to {charName}";
case Attitude.Neutral:
return $"Talk to {charName}";
case Attitude.Hostile:
return $"Attack {charName}";
default:
return $"Interact with {charName}";
}
}
public virtual void OnInteract()
{
switch (attitude)
{
case Attitude.Friendly:
case Attitude.Neutral:
// Start dialogue for friendly or neutral characters
if (dialogue != null && dialogueController != null)
{
dialogueController.ChangeDialogue(dialogue);
dialogueController.PlayDialogue();
}
break;
case Attitude.Hostile:
// Interacting with a hostile character could set them as the combat target
Player.Current.SetTarget(this);
break;
}
}
}