Party progress

This commit is contained in:
2026-01-10 23:00:05 -06:00
parent 6f036aac77
commit 78cc69bffe
15 changed files with 276 additions and 82 deletions

View File

@@ -1 +1,10 @@
class_name BattleSingleton extends Node
class_name BattleSingleton extends Node
var battleScene:BattleScene = null
func startBattle(
fighters:Dictionary[BattleScene.BattlePosition, BattleFighter]
) -> void:
assert(battleScene != null)
battleScene.startBatle(fighters
)

View File

@@ -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(
@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])

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -0,0 +1 @@
uid://bgycdhsouwhwt

View File

@@ -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")