From 78cc69bffe8398d41ce6dc915387139cc867ccb1 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Sat, 10 Jan 2026 23:00:05 -0600 Subject: [PATCH] Party progress --- battle/Battle.gd | 11 ++- battle/BattleScene.gd | 90 ++++++++++++++++++++++-- battle/BattleScene.tscn | 61 ++++++++++++++-- battle/BattleStats.gd | 49 ------------- battle/fighter/BattleFighter.gd | 66 +++++++++++++++-- battle/fighter/BattleFighter.tscn | 7 -- battle/fighter/BattleFighterScene.gd | 15 ++++ battle/fighter/BattleFighterScene.gd.uid | 1 + battle/fighter/BattleFighterScene.tscn | 16 +++++ party/Party.gd | 7 +- party/PartyMember.gd | 13 ++-- save/Save.gd | 10 ++- scene/RootScene.gd | 2 +- singleton/Pause.gd | 2 +- ui/mainmenu/MainMenu.gd | 8 ++- 15 files changed, 276 insertions(+), 82 deletions(-) delete mode 100644 battle/BattleStats.gd delete mode 100644 battle/fighter/BattleFighter.tscn create mode 100644 battle/fighter/BattleFighterScene.gd create mode 100644 battle/fighter/BattleFighterScene.gd.uid create mode 100644 battle/fighter/BattleFighterScene.tscn diff --git a/battle/Battle.gd b/battle/Battle.gd index 418be6f..1d52a75 100644 --- a/battle/Battle.gd +++ b/battle/Battle.gd @@ -1 +1,10 @@ -class_name BattleSingleton extends Node \ No newline at end of file +class_name BattleSingleton extends Node + +var battleScene:BattleScene = null + +func startBattle( + fighters:Dictionary[BattleScene.BattlePosition, BattleFighter] +) -> void: + assert(battleScene != null) + battleScene.startBatle(fighters +) diff --git a/battle/BattleScene.gd b/battle/BattleScene.gd index 899d406..9e14cb5 100644 --- a/battle/BattleScene.gd +++ b/battle/BattleScene.gd @@ -1,4 +1,4 @@ -class_name BattleScene extends Node3D +class_name BattleScene extends BattleFighterScene enum BattlePosition { LEFT_TOP_BACK, @@ -13,11 +13,89 @@ enum BattlePosition { RIGHT_MIDDLE_BACK, RIGHT_MIDDLE_FRONT, RIGHT_BOTTOM_BACK, - RIGHT_BOTTOM_FRONT, - - # Should have pinned positions for enemies as well? + RIGHT_BOTTOM_FRONT } -# @export var fighters:Node3D = null +var fighterMap:Dictionary[BattlePosition, BattleFighterScene] = {} -# func start( \ No newline at end of file +@export var fighterTopLeftBack:BattleFighterScene = null: + get: + return fighterMap.get(BattlePosition.LEFT_TOP_BACK, null) + set(value): + fighterMap[BattlePosition.LEFT_TOP_BACK] = value + +@export var fighterTopLeftFront:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.LEFT_TOP_FRONT, null) + set(value): + fighterMap[BattlePosition.LEFT_TOP_FRONT] = value + +@export var fighterMiddleLeftBack:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.LEFT_MIDDLE_BACK, null) + set(value): + fighterMap[BattlePosition.LEFT_MIDDLE_BACK] = value + +@export var fighterMiddleLeftFront:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.LEFT_MIDDLE_FRONT, null) + set(value): + fighterMap[BattlePosition.LEFT_MIDDLE_FRONT] = value + +@export var fighterBottomLeftBack:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.LEFT_BOTTOM_BACK, null) + set(value): + fighterMap[BattlePosition.LEFT_BOTTOM_BACK] = value + +@export var fighterBottomLeftFront:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.LEFT_BOTTOM_FRONT, null) + set(value): + fighterMap[BattlePosition.LEFT_BOTTOM_FRONT] = value + +@export var fighterTopRightBack:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.RIGHT_TOP_BACK, null) + set(value): + fighterMap[BattlePosition.RIGHT_TOP_BACK] = value + +@export var fighterTopRightFront:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.RIGHT_TOP_FRONT, null) + set(value): + fighterMap[BattlePosition.RIGHT_TOP_FRONT] = value + +@export var fighterMiddleRightBack:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.RIGHT_MIDDLE_BACK, null) + set(value): + fighterMap[BattlePosition.RIGHT_MIDDLE_BACK] = value + +@export var fighterMiddleRightFront:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.RIGHT_MIDDLE_FRONT, null) + set(value): + fighterMap[BattlePosition.RIGHT_MIDDLE_FRONT] = value + +@export var fighterBottomRightBack:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.RIGHT_BOTTOM_BACK, null) + set(value): + fighterMap[BattlePosition.RIGHT_BOTTOM_BACK] = value + +@export var fighterBottomRightFront:BattleFighterScene: + get: + return fighterMap.get(BattlePosition.RIGHT_BOTTOM_FRONT, null) + set(value): + fighterMap[BattlePosition.RIGHT_BOTTOM_FRONT] = value + +func _init() ->void: + BATTLE.battleScene = self + pass + +func startBatle(fighters:Dictionary[BattlePosition, BattleFighter]) -> void: + for position in fighters.keys(): + var fighterScene:BattleFighterScene = fighterMap.get(position, null) + assert(fighterScene != null) + fighterScene.setFighter(fighters[position]) diff --git a/battle/BattleScene.tscn b/battle/BattleScene.tscn index b010348..11a7e01 100644 --- a/battle/BattleScene.tscn +++ b/battle/BattleScene.tscn @@ -1,8 +1,23 @@ -[gd_scene load_steps=2 format=3 uid="uid://dy54m7dvjgqta"] +[gd_scene load_steps=3 format=3 uid="uid://dy54m7dvjgqta"] -[ext_resource type="PackedScene" uid="uid://cf4c61ij6elir" path="res://battle/fighter/BattleFighter.tscn" id="1_abr1f"] +[ext_resource type="PackedScene" uid="uid://d1xyb0hdf1yeh" path="res://battle/fighter/BattleFighterScene.tscn" id="1_abr1f"] +[ext_resource type="Script" uid="uid://dihfp05x6pktn" path="res://battle/BattleScene.gd" id="1_acaen"] -[node name="BattleScene" type="Node3D"] +[node name="BattleScene" type="Node3D" node_paths=PackedStringArray("fighterTopLeftBack", "fighterTopLeftFront", "fighterMiddleLeftBack", "fighterMiddleLeftFront", "fighterBottomLeftBack", "fighterBottomLeftFront", "fighterTopRightBack", "fighterTopRightFront", "fighterMiddleRightBack", "fighterMiddleRightFront", "fighterBottomRightBack", "fighterBottomRightFront")] +script = ExtResource("1_acaen") +fighterTopLeftBack = NodePath("Fighters/LeftTopBack") +fighterTopLeftFront = NodePath("Fighters/LeftTopFront") +fighterMiddleLeftBack = NodePath("Fighters/LeftMiddleBack") +fighterMiddleLeftFront = NodePath("Fighters/LeftMiddleFront") +fighterBottomLeftBack = NodePath("Fighters/LeftBottomBack") +fighterBottomLeftFront = NodePath("Fighters/LeftBottomFront") +fighterTopRightBack = NodePath("Fighters/RightTopBack") +fighterTopRightFront = NodePath("Fighters/RightTopFront") +fighterMiddleRightBack = NodePath("Fighters/RightMiddleBack") +fighterMiddleRightFront = NodePath("Fighters/RightMiddleFront") +fighterBottomRightBack = NodePath("Fighters/RightBottomBack") +fighterBottomRightFront = NodePath("Fighters/RightBottomFront") +metadata/_custom_type_script = "uid://dihfp05x6pktn" [node name="Control" type="Control" parent="."] layout_mode = 3 @@ -18,4 +33,42 @@ text = "Battle" [node name="Fighters" type="Node" parent="."] -[node name="BattleFighter" parent="Fighters" instance=ExtResource("1_abr1f")] +[node name="LeftTopBack" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 3, 0) + +[node name="LeftTopFront" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 3, 0) + +[node name="LeftMiddleBack" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0, 0) + +[node name="LeftMiddleFront" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.754, 0, 0) + +[node name="LeftBottomBack" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, -3, 0) + +[node name="LeftBottomFront" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, -3, 0) + +[node name="RightTopFront" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 3, 0) + +[node name="RightTopBack" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 3, 0) + +[node name="RightMiddleFront" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0) + +[node name="RightMiddleBack" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0, 0) + +[node name="RightBottomFront" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, -3, 0) + +[node name="RightBottomBack" parent="Fighters" instance=ExtResource("1_abr1f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, -3, 0) + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 6.9021) +current = true diff --git a/battle/BattleStats.gd b/battle/BattleStats.gd deleted file mode 100644 index a0744b9..0000000 --- a/battle/BattleStats.gd +++ /dev/null @@ -1,49 +0,0 @@ -class_name BattleStats - -# enum Type { -# NEUTRAL, -# FIRE, -# ICE, -# } - -enum Status { - NORMAL, - DEAD, -} - -var health:int = 100 -var maxHealth:int = 100 -var mp:int = 50 -var maxMp:int = 50 -# var type:Type = Type.NEUTRAL -var status:Status = Status.NORMAL - -func damage(amount:int) -> void: - assert(amount > 0) - if status == Status.DEAD: - return - health = max(health - amount, 0) - if health == 0: - status = Status.DEAD - -func heal(amount:int) -> void: - assert(amount > 0) - if status == Status.DEAD: - return - health = min(health + amount, maxHealth) - -func revive(health:int) -> void: - assert(health > 0) - if status != Status.DEAD: - return - health = min(health, maxHealth) - status = Status.NORMAL - self.health = health - -func mpConsume(amount:int) -> void: - assert(amount > 0) - mp = max(mp - amount, 0) - -func mpRestore(amount:int) -> void: - assert(amount > 0) - mp = min(mp + amount, maxMp) \ No newline at end of file diff --git a/battle/fighter/BattleFighter.gd b/battle/fighter/BattleFighter.gd index 50c3aac..afe2bd8 100644 --- a/battle/fighter/BattleFighter.gd +++ b/battle/fighter/BattleFighter.gd @@ -1,7 +1,63 @@ -class_name BattleFighter extends Node3D +class_name BattleFighter -var stats:BattleStats = null +enum Status { + NORMAL, + DEAD, +} -func setup(stats:BattleStats) -> void: - assert(stats != null) - self.stats = stats +var health:int +var maxHealth:int +var mp:int +var maxMp:int +var status:Status = Status.NORMAL + +var attack:int = 10 +var defense:int = 5 +var speed:int = 5 +var magic:int = 5 +var luck:int = 1 + +func _init( + maxHealth:int = 100, + maxMp:int = 50, +) -> void: + self.maxHealth = maxHealth + self.health = maxHealth + self.maxMp = maxMp + self.mp = maxMp + +func damage(amount:int) -> void: + assert(amount > 0) + if status == Status.DEAD: + return + health = max(health - amount, 0) + if health == 0: + status = Status.DEAD + +func heal(amount:int) -> void: + assert(amount > 0) + if status == Status.DEAD: + return + health = min(health + amount, maxHealth) + +func revive(health:int) -> void: + assert(health > 0) + if status != Status.DEAD: + return + health = min(health, maxHealth) + status = Status.NORMAL + self.health = health + +func mpConsume(amount:int) -> void: + assert(amount > 0) + mp = max(mp - amount, 0) + +func mpRestore(amount:int) -> void: + assert(amount > 0) + mp = min(mp + amount, maxMp) + +func isCrit() -> bool: + # 10% chance of a crit + var chance = 10 + min(luck * 5, 60) + var roll = randi() % 100 + return roll < chance diff --git a/battle/fighter/BattleFighter.tscn b/battle/fighter/BattleFighter.tscn deleted file mode 100644 index 046cc94..0000000 --- a/battle/fighter/BattleFighter.tscn +++ /dev/null @@ -1,7 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://cf4c61ij6elir"] - -[ext_resource type="Script" uid="uid://ck7wheiv8wptn" path="res://battle/fighter/BattleFighter.gd" id="1_xm54w"] - -[node name="BattleFighter" type="Node3D"] -script = ExtResource("1_xm54w") -metadata/_custom_type_script = "uid://ck7wheiv8wptn" diff --git a/battle/fighter/BattleFighterScene.gd b/battle/fighter/BattleFighterScene.gd new file mode 100644 index 0000000..ca0439d --- /dev/null +++ b/battle/fighter/BattleFighterScene.gd @@ -0,0 +1,15 @@ +class_name BattleFighterScene extends Node3D + +var fighter:BattleFighter + +func _ready() -> void: + self.visible = false + if fighter: + setFighter(fighter) + +func setFighter(fighter:BattleFighter) -> void: + print("Setting fighter: %s" % fighter) + # Set up the visual representation of the fighter here + self.fighter = fighter + self.visible = true + pass \ No newline at end of file diff --git a/battle/fighter/BattleFighterScene.gd.uid b/battle/fighter/BattleFighterScene.gd.uid new file mode 100644 index 0000000..a516f17 --- /dev/null +++ b/battle/fighter/BattleFighterScene.gd.uid @@ -0,0 +1 @@ +uid://bgycdhsouwhwt diff --git a/battle/fighter/BattleFighterScene.tscn b/battle/fighter/BattleFighterScene.tscn new file mode 100644 index 0000000..deba44b --- /dev/null +++ b/battle/fighter/BattleFighterScene.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=3 uid="uid://d1xyb0hdf1yeh"] + +[ext_resource type="Script" uid="uid://bgycdhsouwhwt" path="res://battle/fighter/BattleFighterScene.gd" id="1_veb1i"] + +[sub_resource type="BoxMesh" id="BoxMesh_veb1i"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_e55p4"] +shading_mode = 0 + +[node name="BattleFighterScene" type="Node3D"] +script = ExtResource("1_veb1i") +metadata/_custom_type_script = "uid://bgycdhsouwhwt" + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_veb1i") +surface_material_override/0 = SubResource("StandardMaterial3D_e55p4") diff --git a/party/Party.gd b/party/Party.gd index 4dd9c56..8cdaa0a 100644 --- a/party/Party.gd +++ b/party/Party.gd @@ -1,3 +1,8 @@ class_name PartySingleton extends Node -static var PARTY_JOHN = PartyMember.new() \ No newline at end of file +static var PARTY_JOHN = PartyMember.new("John") + +static func getFullParty() -> Array[PartyMember]: + return [ + PARTY_JOHN + ] \ No newline at end of file diff --git a/party/PartyMember.gd b/party/PartyMember.gd index eb8e786..57cd8a8 100644 --- a/party/PartyMember.gd +++ b/party/PartyMember.gd @@ -1,6 +1,11 @@ -class_name PartyMember +class_name PartyMember extends BattleFighter -var stats:BattleStats +var name:String -func _init() -> void: - stats = BattleStats.new() \ No newline at end of file +func _init( + name:String, + maxHealth:int = 100, + maxMp:int = 50, +) -> void: + super(maxHealth, maxMp) + self.name = name \ No newline at end of file diff --git a/save/Save.gd b/save/Save.gd index 1e3f7b8..2037602 100644 --- a/save/Save.gd +++ b/save/Save.gd @@ -1 +1,9 @@ -class_name SaveSingleton extends Node \ No newline at end of file +class_name SaveSingleton extends Node + +func load(data:Dictionary) -> void: + pass + +func save() -> Dictionary: + var data:Dictionary = {} + + return data \ No newline at end of file diff --git a/scene/RootScene.gd b/scene/RootScene.gd index d28135e..61de209 100644 --- a/scene/RootScene.gd +++ b/scene/RootScene.gd @@ -55,4 +55,4 @@ func onSceneChange(newScene:SceneSingleton.SceneType) -> void: removeAndHide(initial) removeAndHide(overworld) removeAndHide(battle) - removeAndHide(cooking) \ No newline at end of file + removeAndHide(cooking) diff --git a/singleton/Pause.gd b/singleton/Pause.gd index 21bd97d..1606d53 100644 --- a/singleton/Pause.gd +++ b/singleton/Pause.gd @@ -28,4 +28,4 @@ class_name PauseSingleton extends Node # # UI.PAUSE.close() # # else: # # UI.PAUSE.open() -# pass \ No newline at end of file +# pass diff --git a/ui/mainmenu/MainMenu.gd b/ui/mainmenu/MainMenu.gd index 107d196..a5571ba 100644 --- a/ui/mainmenu/MainMenu.gd +++ b/ui/mainmenu/MainMenu.gd @@ -10,8 +10,12 @@ func _ready() -> void: btnSettings.pressed.connect(onSettingsPressed) func onNewGamePressed() -> void: - SCENE.setScene(SceneSingleton.SceneType.OVERWORLD) - OVERWORLD.mapChange(newGameScene, "PlayerSpawnPoint") + #SCENE.setScene(SceneSingleton.SceneType.OVERWORLD) + #OVERWORLD.mapChange(newGameScene, "PlayerSpawnPoint") + SCENE.setScene(SceneSingleton.SceneType.BATTLE) + BATTLE.startBattle({ + BattleScene.BattlePosition.LEFT_TOP_BACK: PartySingleton.PARTY_JOHN, + }) func onSettingsPressed() -> void: print("Settings button pressed")