added battle state as globals, adds half working battle flow

This commit is contained in:
Luca 2024-09-29 16:18:32 +02:00
parent b09eee0805
commit 4963131d3e
12 changed files with 250 additions and 95 deletions

View file

@ -45,3 +45,13 @@ func _physics_process(delta: float) -> void:
velocity = Vector3.ZERO velocity = Vector3.ZERO
in_battle = true in_battle = true
collider.start_battle(self) collider.start_battle(self)
func faint() -> void:
self.queue_free()
func attack_enemy(enemy: Monster) -> int:
var damage = data.attack_enemy(enemy.data)
return damage
func take_damage(amount: int) -> void:
data.take_damage(amount)

View file

@ -9,6 +9,12 @@ extends Node3D
## List that holds all spawnable monsters ## List that holds all spawnable monsters
@export var spawnable_monsters: Array[MonsterSpawnpointProbability] @export var spawnable_monsters: Array[MonsterSpawnpointProbability]
## Minimum Level the spawnable monsters have
@export var min_level = 1
## Maximum level the spawnable monsters can have
@export var max_level = 1
## Ignore spawning only if visible ## Ignore spawning only if visible
@export var ignore_visibility: bool = false @export var ignore_visibility: bool = false
@ -66,10 +72,19 @@ func spawn() -> void:
# instantiate a monster .tscn scene # instantiate a monster .tscn scene
var monster_to_spawn = monster_tscn.instantiate() var monster_to_spawn = monster_tscn.instantiate()
# get a random monster data # Create a new MonsterData for the monster to spawn
var monster_data: MonsterData = MonsterData.new()
# Get a random monster data as a template
var random := randi() % spawnable_monsters.size() var random := randi() % spawnable_monsters.size()
var data : MonsterData = spawnable_monsters[random].monster_data var template_data : MonsterData = spawnable_monsters[random].monster_data
monster_to_spawn.data = data monster_data.set_values(template_data.unique_id, {}, randi_range(min_level, max_level))
## Heal the wild monster fully
monster_data.heal(9999)
## Set the data of the Node3D monster to spawn
monster_to_spawn.data = monster_data
# keep track of the current monster # keep track of the current monster
active_monsters.append(monster_to_spawn) active_monsters.append(monster_to_spawn)

View file

@ -1,32 +1,25 @@
extends CharacterBody3D extends CharacterBody3D
@onready var animated_mesh = $GobotSkin @onready var animated_mesh: Node3D = %GobotSkin
@onready var camera: Camera3D = %Camera3D
## State
@export var battle_state := Global.BattleState.NOT_IN_BATTLE
var in_battle: bool = false var in_battle: bool = false
var enemy: MonsterData = null var player_monster: Monster = null
var enemy: Monster = null
## Movement
const SPEED = 5.0 const SPEED = 5.0
const JUMP_VELOCITY = 4.5 const JUMP_VELOCITY = 4.5
func _ready() -> void: func _ready() -> void:
Utils.set_player(self) Utils.set_player(self)
func on_save_game(saved_data : Array[SavedData]):
var data = SavedData.new()
data.position = global_position
data.scene_path = scene_file_path
saved_data.append(data)
func on_before_load_game():
get_parent().remove_child(self)
queue_free()
func on_load_game(saved_data: SavedData):
global_position = saved_data.position
# Update the global reference to the player
Utils.set_player(self)
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
if in_battle == true: # If the player is in a battle, handle it via start_battle and then handle_battle
if battle_state != Global.BattleState.NOT_IN_BATTLE:
return return
animated_mesh.idle() animated_mesh.idle()
@ -79,41 +72,121 @@ func _physics_process(delta: float) -> void:
if velocity.length() < 0.05: if velocity.length() < 0.05:
animated_mesh.idle() animated_mesh.idle()
# what happens when a battle starts?
# the player is positioned (mostly somewhere else than the current position) func on_save_game(saved_data : Array[SavedData]):
# ui changes var data = SavedData.new()
# music changes data.position = global_position
func start_battle(p_enemy: Node3D) -> void: data.scene_path = scene_file_path
enemy = p_enemy.data saved_data.append(data)
var camera: Camera3D = $CameraRoot/SpringArm3D/Camera3D
# local z axis of the camera
var local_z = camera.global_transform.basis.z
var new_player_position = camera.global_transform.origin + local_z * 3
var monster_position = camera.global_transform.origin + local_z * 2
position = Vector3(new_player_position.x, position.y, new_player_position.z)
in_battle = true func on_before_load_game():
get_parent().remove_child(self)
queue_free()
func on_load_game(saved_data: SavedData):
global_position = saved_data.position
# Update the global reference to the player
Utils.set_player(self)
func handle_battle() -> void:
match battle_state:
Global.BattleState.STARTED:
# disable battle_UI
# UI.battle_ui.disable()
UI.battle_ui.set_message("A wild %s appeared!" % enemy.data.name)
await get_tree().create_timer(3.0).timeout
battle_state = Global.BattleState.PLAYER_TURN
handle_battle()
Global.BattleState.PLAYER_TURN:
UI.battle_ui.set_message("What will you do?")
# todo: enable battle_ui again
# UI.battle_ui.enable()
UI.battle_ui.update()
Global.BattleState.ENEMY_TURN:
# If the enemy has no health left, we win
if enemy.data.current_health <= 0:
print("win")
battle_state = Global.BattleState.WIN
handle_battle()
return
UI.battle_ui.set_message("What will the enemy do?")
await get_tree().create_timer(3.0).timeout
var damage_amount: int = enemy.attack_enemy(player_monster)
UI.battle_ui.set_message("The enemy attacked you for %s damage!" % str(damage_amount))
await get_tree().create_timer(1.0).timeout
UI.battle_ui.update()
battle_state = Global.BattleState.PLAYER_TURN
handle_battle()
Global.BattleState.CATCH:
print("Catch")
await get_tree().create_timer(3.0).timeout
Global.BattleState.WIN:
UI.battle_ui.set_message("You won!")
await get_tree().create_timer(3.0).timeout
battle_state = Global.BattleState.NOT_IN_BATTLE
UI.ingame_menu.update()
UI.show_battle_ui(false)
UI.show_ingame_controls(true)
Global.BattleState.LOSE:
print("LOSE")
await get_tree().create_timer(3.0).timeout
## This method sets up a battle between the player and an enemy monster
func start_battle(p_enemy: Monster) -> void:
# Don't start a battle if we are already in one
# TODO: Maybe add a cooldown of 1.5s after the battle ended
if battle_state != Global.BattleState.NOT_IN_BATTLE:
return
# Stop the player
velocity = Vector3.ZERO velocity = Vector3.ZERO
animated_mesh.idle() animated_mesh.idle()
# Set the current enemy
enemy = p_enemy
# Get the loccal z axis of the camera to position the player
var local_z = camera.global_transform.basis.z
# Get the new player and monster positions
var new_player_position = camera.global_transform.origin + local_z * 3
var monster_position = camera.global_transform.origin + local_z * 3
# Set the players new position
position = Vector3(new_player_position.x, position.y, new_player_position.z)
# Change the UI
UI.show_battle_ui(true) UI.show_battle_ui(true)
UI.show_ingame_controls(false) UI.show_ingame_controls(false)
# Spawn player monster # Create the player's monster
player_monster = Monster.new()
# Get the data from the party
var monster_data : MonsterData = SaveManager.current_save.party[0] var monster_data : MonsterData = SaveManager.current_save.party[0]
var monster = Monster.new()
monster.data = monster_data
monster.idle = true
print("%s (%s), Lv. %s, %s XP" % [monster.data.name, monster.data.nickname, monster.data.level, monster.data.xp])
monster.position = Vector3(monster_position.x, position.y + 1, monster_position.z)
add_child(monster)
camera.look_at(monster.position, Vector3.UP, false)
# How to attack and finish the battle? # And add it to the monster
player_monster.data = monster_data
player_monster.idle = true
player_monster.position = Vector3(monster_position.x, position.y + 1, monster_position.z)
add_child(player_monster)
# Get into the battle and switch between the states
battle_state = Global.BattleState.STARTED
handle_battle()
func attack_enemy():
UI.battle_ui.set_message("You attacked the enemy!")
await get_tree().create_timer(1.0).timeout
# this should rather be player_monster.attack_enemy(enemy) for correct values
await get_tree().create_timer(5.0).timeout enemy.take_damage(7)
print("Battle over") UI.battle_ui.update()
remove_child(monster) await get_tree().create_timer(1.0).timeout
monster.queue_free() battle_state = Global.BattleState.ENEMY_TURN
in_battle = false handle_battle()

View file

@ -14,6 +14,7 @@ axis_lock_angular_z = true
script = ExtResource("1_mv2yl") script = ExtResource("1_mv2yl")
[node name="GobotSkin" parent="." instance=ExtResource("2_a4t6w")] [node name="GobotSkin" parent="." instance=ExtResource("2_a4t6w")]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0) transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
@ -26,4 +27,5 @@ shape = SubResource("CapsuleShape3D_xuba7")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.64528, 2.83335) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.64528, 2.83335)
[node name="Camera3D" type="Camera3D" parent="CameraRoot/SpringArm3D"] [node name="Camera3D" type="Camera3D" parent="CameraRoot/SpringArm3D"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, 0, 0.0210915, 0.372644) transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, 0, 0.0210915, 0.372644)

11
globals/Global.gd Normal file
View file

@ -0,0 +1,11 @@
extends Node
enum BattleState {
NOT_IN_BATTLE = -1,
STARTED = 0,
PLAYER_TURN = 1,
ENEMY_TURN = 2,
CATCH = 3,
WIN = 4,
LOSE = 5
}

View file

@ -2,11 +2,11 @@ extends Node
var player: Node3D = null var player: Node3D = null
func set_player(p_player: Node3D) -> void:
# Called when the node enters the scene tree for the first time. player = p_player
func _ready() -> void:
pass # Replace with function body. func get_player() -> Node3D:
return player
func load_base_monster_data(p_unique_id) -> MonsterData: func load_base_monster_data(p_unique_id) -> MonsterData:
var path = "res://resources/monsters/" + p_unique_id + ".tres" var path = "res://resources/monsters/" + p_unique_id + ".tres"
@ -16,9 +16,3 @@ func load_base_monster_data(p_unique_id) -> MonsterData:
else: else:
printerr("Monster.gd: No monster with the ID %s found" % p_unique_id) printerr("Monster.gd: No monster with the ID %s found" % p_unique_id)
return null return null
func set_player(p_player) -> void:
player = p_player
func get_player() -> Node3D:
return player

View file

@ -18,6 +18,7 @@ config/icon="res://assets/logo/logo.png"
[autoload] [autoload]
Global="*res://globals/Global.gd"
Utils="*res://globals/Utils.gd" Utils="*res://globals/Utils.gd"
SaveManager="*res://resources/save_game/save_manager.gd" SaveManager="*res://resources/save_game/save_manager.gd"
SceneManager="*res://globals/scene_manager.gd" SceneManager="*res://globals/scene_manager.gd"

View file

@ -96,6 +96,7 @@ func attack_enemy(enemy_data: MonsterData) -> int:
var base_damage: int = 2 var base_damage: int = 2
damage = floor(floor((level * 2/5 + 2)) * base_damage * (float(attack) / (2 * enemy_data.defense)) + 2) damage = floor(floor((level * 2/5 + 2)) * base_damage * (float(attack) / (2 * enemy_data.defense)) + 2)
enemy_data.take_damage(damage)
return damage return damage

View file

@ -18,14 +18,15 @@ func update() -> void:
%PartyFighterHealthbar.max_value = player_fighter.health %PartyFighterHealthbar.max_value = player_fighter.health
%PartyFighterHealthbar.value = player_fighter.current_health %PartyFighterHealthbar.value = player_fighter.current_health
%EnemyMonsterLevel.text = "Lv. %s" % player.enemy.level %EnemyMonsterLevel.text = "Lv. %s" % player.enemy.data.level
%EnemyMonsterName.text = player.enemy.name %EnemyMonsterName.text = player.enemy.data.name
%EnemyMonsterHealthbar.max_value = player.enemy.health %EnemyMonsterHealthbar.max_value = player.enemy.data.health
%EnemyMonsterHealthbar.value = player.enemy.current_health %EnemyMonsterHealthbar.value = player.enemy.data.current_health
func _on_battle_button_pressed() -> void: func _on_battle_button_pressed() -> void:
print("attack here") print("attacking enemy")
# attack here Utils.get_player().attack_enemy()
#%MainBattleMenu.visible = false
#%BattleMovesMenu.visible = true
pass # Replace with function body. func set_message(msg: String) -> void:
%Message.text = msg

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=19 format=3 uid="uid://dyroahq85mhws"] [gd_scene load_steps=21 format=3 uid="uid://dyroahq85mhws"]
[ext_resource type="Script" path="res://ui/battle_ui/battle_ui.gd" id="1_jyqir"] [ext_resource type="Script" path="res://ui/battle_ui/battle_ui.gd" id="1_jyqir"]
[ext_resource type="Texture2D" uid="uid://ve2k0qrfpwxw" path="res://assets/textures/Generic/Vector/generic_button_circle_fill.svg" id="2_keyyt"] [ext_resource type="Texture2D" uid="uid://ve2k0qrfpwxw" path="res://assets/textures/Generic/Vector/generic_button_circle_fill.svg" id="2_keyyt"]
@ -56,6 +56,20 @@ expand_margin_top = 1.0
expand_margin_right = 1.0 expand_margin_right = 1.0
expand_margin_bottom = 1.0 expand_margin_bottom = 1.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jwbwi"]
bg_color = Color(0, 0, 0, 1)
border_width_left = 3
border_width_top = 3
border_width_right = 3
border_width_bottom = 3
border_color = Color(1, 1, 1, 1)
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6
[sub_resource type="LabelSettings" id="LabelSettings_5e62u"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_eqgks"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_eqgks"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4ki2k"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4ki2k"]
@ -193,25 +207,53 @@ theme_override_constants/margin_left = 30
theme_override_constants/margin_right = 30 theme_override_constants/margin_right = 30
theme_override_constants/margin_bottom = 50 theme_override_constants/margin_bottom = 50
[node name="HBoxContainer" type="HBoxContainer" parent="BottomMarginContainer"] [node name="VBoxContainer" type="VBoxContainer" parent="BottomMarginContainer"]
layout_mode = 2
theme_override_constants/separation = 20
alignment = 2
[node name="MessageContainer" type="MarginContainer" parent="BottomMarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="PanelContainer" type="PanelContainer" parent="BottomMarginContainer/VBoxContainer/MessageContainer"]
custom_minimum_size = Vector2(0, 100)
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_jwbwi")
[node name="MarginContainer" type="MarginContainer" parent="BottomMarginContainer/VBoxContainer/MessageContainer/PanelContainer"]
layout_mode = 2
theme_override_constants/margin_left = 8
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 8
theme_override_constants/margin_bottom = 8
[node name="Message" type="Label" parent="BottomMarginContainer/VBoxContainer/MessageContainer/PanelContainer/MarginContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 1
text = "A wild monster appeared!"
label_settings = SubResource("LabelSettings_5e62u")
[node name="HBoxContainer" type="HBoxContainer" parent="BottomMarginContainer/VBoxContainer"]
layout_mode = 2 layout_mode = 2
[node name="PartyFighterContainer" type="HBoxContainer" parent="BottomMarginContainer/HBoxContainer"] [node name="PartyFighterContainer" type="HBoxContainer" parent="BottomMarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2 layout_mode = 2
size_flags_vertical = 8 size_flags_vertical = 8
theme_override_constants/separation = 16 theme_override_constants/separation = 16
[node name="PartyAliveStatus" type="VBoxContainer" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer"] [node name="PartyAliveStatus" type="VBoxContainer" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer"]
layout_mode = 2 layout_mode = 2
[node name="PartyAliveStatus1" type="TextureRect" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"] [node name="PartyAliveStatus1" type="TextureRect" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"]
custom_minimum_size = Vector2(32, 32) custom_minimum_size = Vector2(32, 32)
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
texture = ExtResource("2_keyyt") texture = ExtResource("2_keyyt")
expand_mode = 2 expand_mode = 2
[node name="PartyAliveStatus2" type="TextureRect" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"] [node name="PartyAliveStatus2" type="TextureRect" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"]
self_modulate = Color(1, 1, 1, 0.392157) self_modulate = Color(1, 1, 1, 0.392157)
custom_minimum_size = Vector2(32, 32) custom_minimum_size = Vector2(32, 32)
layout_mode = 2 layout_mode = 2
@ -219,7 +261,7 @@ size_flags_horizontal = 0
texture = ExtResource("2_keyyt") texture = ExtResource("2_keyyt")
expand_mode = 2 expand_mode = 2
[node name="PartyAliveStatus3" type="TextureRect" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"] [node name="PartyAliveStatus3" type="TextureRect" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"]
self_modulate = Color(1, 1, 1, 0.392157) self_modulate = Color(1, 1, 1, 0.392157)
custom_minimum_size = Vector2(32, 32) custom_minimum_size = Vector2(32, 32)
layout_mode = 2 layout_mode = 2
@ -227,7 +269,7 @@ size_flags_horizontal = 0
texture = ExtResource("2_keyyt") texture = ExtResource("2_keyyt")
expand_mode = 2 expand_mode = 2
[node name="PartyAliveStatus4" type="TextureRect" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"] [node name="PartyAliveStatus4" type="TextureRect" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"]
self_modulate = Color(1, 1, 1, 0.392157) self_modulate = Color(1, 1, 1, 0.392157)
custom_minimum_size = Vector2(32, 32) custom_minimum_size = Vector2(32, 32)
layout_mode = 2 layout_mode = 2
@ -235,7 +277,7 @@ size_flags_horizontal = 0
texture = ExtResource("2_keyyt") texture = ExtResource("2_keyyt")
expand_mode = 2 expand_mode = 2
[node name="PartyAliveStatus5" type="TextureRect" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"] [node name="PartyAliveStatus5" type="TextureRect" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"]
self_modulate = Color(1, 1, 1, 0.392157) self_modulate = Color(1, 1, 1, 0.392157)
custom_minimum_size = Vector2(32, 32) custom_minimum_size = Vector2(32, 32)
layout_mode = 2 layout_mode = 2
@ -243,7 +285,7 @@ size_flags_horizontal = 0
texture = ExtResource("2_keyyt") texture = ExtResource("2_keyyt")
expand_mode = 2 expand_mode = 2
[node name="PartyAliveStatus6" type="TextureRect" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"] [node name="PartyAliveStatus6" type="TextureRect" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyAliveStatus"]
self_modulate = Color(1, 1, 1, 0.392157) self_modulate = Color(1, 1, 1, 0.392157)
custom_minimum_size = Vector2(32, 32) custom_minimum_size = Vector2(32, 32)
layout_mode = 2 layout_mode = 2
@ -251,25 +293,25 @@ size_flags_horizontal = 0
texture = ExtResource("2_keyyt") texture = ExtResource("2_keyyt")
expand_mode = 2 expand_mode = 2
[node name="PartyFighterInfo" type="VBoxContainer" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer"] [node name="PartyFighterInfo" type="VBoxContainer" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer"]
layout_mode = 2 layout_mode = 2
size_flags_vertical = 0 size_flags_vertical = 0
theme_override_constants/separation = 10 theme_override_constants/separation = 10
[node name="LevelAndGender" type="HBoxContainer" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo"] [node name="LevelAndGender" type="HBoxContainer" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo"]
layout_mode = 2 layout_mode = 2
[node name="Level" type="PanelContainer" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo/LevelAndGender"] [node name="Level" type="PanelContainer" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo/LevelAndGender"]
layout_mode = 2 layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_6o8cs") theme_override_styles/panel = SubResource("StyleBoxFlat_6o8cs")
[node name="PartyFighterLevel" type="Label" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo/LevelAndGender/Level"] [node name="PartyFighterLevel" type="Label" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo/LevelAndGender/Level"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "Lv. 99" text = "Lv. 99"
label_settings = SubResource("LabelSettings_38ujs") label_settings = SubResource("LabelSettings_38ujs")
[node name="PartyFighterGender" type="TextureRect" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo/LevelAndGender"] [node name="PartyFighterGender" type="TextureRect" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo/LevelAndGender"]
unique_name_in_owner = true unique_name_in_owner = true
self_modulate = Color(0.450091, 0.470517, 0.93375, 1) self_modulate = Color(0.450091, 0.470517, 0.93375, 1)
custom_minimum_size = Vector2(12, 12) custom_minimum_size = Vector2(12, 12)
@ -278,13 +320,13 @@ texture = ExtResource("3_fa6tk")
expand_mode = 2 expand_mode = 2
stretch_mode = 4 stretch_mode = 4
[node name="PartyFighterName" type="Label" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo"] [node name="PartyFighterName" type="Label" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "Monstername" text = "Monstername"
label_settings = SubResource("LabelSettings_kcdfy") label_settings = SubResource("LabelSettings_kcdfy")
[node name="PartyFighterHealthbar" type="ProgressBar" parent="BottomMarginContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo"] [node name="PartyFighterHealthbar" type="ProgressBar" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/PartyFighterContainer/PartyFighterInfo"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
theme_override_styles/background = SubResource("StyleBoxFlat_auqmk") theme_override_styles/background = SubResource("StyleBoxFlat_auqmk")
@ -292,17 +334,17 @@ theme_override_styles/fill = SubResource("StyleBoxFlat_84eln")
value = 50.0 value = 50.0
show_percentage = false show_percentage = false
[node name="Spacer" type="Control" parent="BottomMarginContainer/HBoxContainer"] [node name="Spacer" type="Control" parent="BottomMarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
size_flags_stretch_ratio = 0.5 size_flags_stretch_ratio = 0.5
[node name="MainBattleMenu" type="VBoxContainer" parent="BottomMarginContainer/HBoxContainer"] [node name="MainBattleMenu" type="VBoxContainer" parent="BottomMarginContainer/VBoxContainer/HBoxContainer"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
[node name="BattleButton" type="Button" parent="BottomMarginContainer/HBoxContainer/MainBattleMenu"] [node name="BattleButton" type="Button" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/MainBattleMenu"]
layout_mode = 2 layout_mode = 2
theme_override_constants/h_separation = 18 theme_override_constants/h_separation = 18
theme_override_constants/icon_max_width = 20 theme_override_constants/icon_max_width = 20
@ -318,11 +360,11 @@ theme_override_styles/pressed_mirrored = ExtResource("5_w48y1")
theme_override_styles/pressed = ExtResource("5_w48y1") theme_override_styles/pressed = ExtResource("5_w48y1")
theme_override_styles/normal_mirrored = ExtResource("4_r2q1k") theme_override_styles/normal_mirrored = ExtResource("4_r2q1k")
theme_override_styles/normal = ExtResource("4_r2q1k") theme_override_styles/normal = ExtResource("4_r2q1k")
text = "Battle" text = "Attack"
icon = ExtResource("4_saqy8") icon = ExtResource("4_saqy8")
alignment = 0 alignment = 0
[node name="PartyButton" type="Button" parent="BottomMarginContainer/HBoxContainer/MainBattleMenu"] [node name="PartyButton" type="Button" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/MainBattleMenu"]
layout_mode = 2 layout_mode = 2
theme_override_constants/h_separation = 18 theme_override_constants/h_separation = 18
theme_override_constants/icon_max_width = 20 theme_override_constants/icon_max_width = 20
@ -342,7 +384,7 @@ text = "Party"
icon = ExtResource("5_pnobx") icon = ExtResource("5_pnobx")
alignment = 0 alignment = 0
[node name="ItemsButton" type="Button" parent="BottomMarginContainer/HBoxContainer/MainBattleMenu"] [node name="ItemsButton" type="Button" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/MainBattleMenu"]
layout_mode = 2 layout_mode = 2
theme_override_constants/h_separation = 18 theme_override_constants/h_separation = 18
theme_override_constants/icon_max_width = 20 theme_override_constants/icon_max_width = 20
@ -362,7 +404,7 @@ text = "Items"
icon = ExtResource("6_ikm1n") icon = ExtResource("6_ikm1n")
alignment = 0 alignment = 0
[node name="RunButton" type="Button" parent="BottomMarginContainer/HBoxContainer/MainBattleMenu"] [node name="RunButton" type="Button" parent="BottomMarginContainer/VBoxContainer/HBoxContainer/MainBattleMenu"]
layout_mode = 2 layout_mode = 2
theme_override_constants/h_separation = 18 theme_override_constants/h_separation = 18
theme_override_constants/icon_max_width = 20 theme_override_constants/icon_max_width = 20
@ -382,10 +424,10 @@ text = "Run"
icon = ExtResource("7_tihhr") icon = ExtResource("7_tihhr")
alignment = 0 alignment = 0
[node name="BattleMovesMenu" type="VBoxContainer" parent="BottomMarginContainer/HBoxContainer"] [node name="BattleMovesMenu" type="VBoxContainer" parent="BottomMarginContainer/VBoxContainer/HBoxContainer"]
unique_name_in_owner = true unique_name_in_owner = true
visible = false visible = false
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
[connection signal="pressed" from="BottomMarginContainer/HBoxContainer/MainBattleMenu/BattleButton" to="." method="_on_battle_button_pressed"] [connection signal="pressed" from="BottomMarginContainer/VBoxContainer/HBoxContainer/MainBattleMenu/BattleButton" to="." method="_on_battle_button_pressed"]

View file

@ -11,6 +11,9 @@ func _on_close_button_pressed() -> void:
visible = false visible = false
pass # Replace with function body. pass # Replace with function body.
func update() -> void:
_update_monster_list()
func _update_monster_list() -> void: func _update_monster_list() -> void:
for i in SaveManager.current_save.party.size(): for i in SaveManager.current_save.party.size():
var monster = SaveManager.current_save.party[i] var monster = SaveManager.current_save.party[i]

View file

@ -153,6 +153,8 @@ skeleton = NodePath("../..")
[node name="MonsterSpawnpointDebug" parent="MonsterSpawnpoints" instance=ExtResource("1_3qqsk")] [node name="MonsterSpawnpointDebug" parent="MonsterSpawnpoints" instance=ExtResource("1_3qqsk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, -9) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, -9)
spawnable_monsters = Array[ExtResource("2_pmb72")]([SubResource("Resource_13u2y")]) spawnable_monsters = Array[ExtResource("2_pmb72")]([SubResource("Resource_13u2y")])
min_level = 3
max_level = 7
ignore_visibility = true ignore_visibility = true
[node name="Mushrooms" type="Node3D" parent="."] [node name="Mushrooms" type="Node3D" parent="."]