semi-idle-arpg/scripts/NPC.gd

61 lines
1.7 KiB
GDScript3
Raw Normal View History

# base NPC class
2024-09-19 19:03:06 -06:00
class_name NPC
extends CharacterBody2D
2024-09-19 19:03:06 -06:00
enum NPCDifficulty {MINION, NORMAL, ELITE, BOSS, ELITEBOSS, BBEG}
enum NPCTier {I, II, III, IV, V, VI, VII, VIII, IX, X}
2024-09-19 19:03:06 -06:00
signal npc_died(npcTier: NPCTier)
@export var charName := "Character"
@export var maxHealth := 10
@export var damageTaken := 0
@export var npcDifficulty: NPCDifficulty
@export var npcTier: NPCTier
2024-10-20 16:44:08 -06:00
@export var faction: Globals.World.Faction
2024-09-19 19:03:06 -06:00
func _random_mod_health() -> void:
randomize()
# noise factor
var noise_factor = randf_range(7, 10)
2024-10-21 16:57:48 -06:00
self.maxHealth = round(noise_factor * self.maxHealth)
2024-09-19 19:03:06 -06:00
# difficulty factor
match self.npcDifficulty:
NPCDifficulty.MINION:
2024-09-19 19:03:06 -06:00
self.maxHealth /= 2
NPCDifficulty.ELITE:
2024-09-19 19:03:06 -06:00
self.maxHealth *= 2
NPCDifficulty.BOSS:
2024-09-19 19:03:06 -06:00
self.maxHealth *= 4
NPCDifficulty.ELITEBOSS:
2024-09-19 19:03:06 -06:00
self.maxHealth *= 8
NPCDifficulty.BBEG:
2024-09-19 19:03:06 -06:00
self.maxHealth *= 16
# npcTier factor
2024-10-21 16:57:48 -06:00
self.maxHealth = round(exp(self.npcTier) * self.maxHealth)
2024-09-19 19:03:06 -06:00
# fun factor (just additional factor to tweak)
self.maxHealth *= 10
2024-10-20 16:44:08 -06:00
# func _init() -> void:
# self.npcDifficulty = NPCDifficulty.NORMAL
# self.npcTier = NPCTier.I
func _ready() -> void:
# modify max health value based on the various factors
2024-09-19 19:03:06 -06:00
_random_mod_health()
# set health bar
%Healthbar.max_value = maxHealth
%Healthbar.value = maxHealth
func _process(_delta: float) -> void:
%Healthbar.value = maxHealth - damageTaken
if damageTaken >= maxHealth:
# send signal that I died to be counted, gen loot, etc.
npc_died.emit(self.npcTier)
# delete node
self.free()