Proper Item Pool Handling

This commit is contained in:
Melvin Weiß 2025-09-23 15:50:34 +02:00
parent 408fbb40e3
commit bd42aa7963
8 changed files with 38 additions and 38 deletions

View file

@ -0,0 +1,4 @@
class_name ItemPool extends Resource
@export var common : Array[PackedScene]
@export var rare : Array[PackedScene]
@export var unique : Array[PackedScene]

View file

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

View file

@ -0,0 +1,18 @@
[gd_resource type="Resource" load_steps=11 format=3 uid="uid://m6yj45qvoecs"]
[ext_resource type="PackedScene" uid="uid://b00185vygcka1" path="res://items/immediate_items/heal_item/heal_item.tscn" id="1_2l6sh"]
[ext_resource type="PackedScene" uid="uid://wc7kgtomy6xm" path="res://items/permanent_items/extrajump/extrajump.tscn" id="2_rli0f"]
[ext_resource type="PackedScene" uid="uid://gwctb2xqsbj" path="res://items/immediate_items/healthup/healthup.tscn" id="3_g002j"]
[ext_resource type="PackedScene" uid="uid://ewe36lqcjojk" path="res://items/active_items/updash/updash.tscn" id="4_vpswe"]
[ext_resource type="PackedScene" uid="uid://ddn025xnjngko" path="res://items/active_items/bow/bow.tscn" id="5_jwi73"]
[ext_resource type="PackedScene" uid="uid://bbpf28ohayd8n" path="res://items/permanent_items/backslash/backslash.tscn" id="6_73uum"]
[ext_resource type="Script" uid="uid://bgbqefa6h7ckv" path="res://items/generic/item_pool.gd" id="6_rli0f"]
[ext_resource type="PackedScene" uid="uid://bpgo1djj8f1rg" path="res://items/permanent_items/high_jump/high_jump.tscn" id="7_k6eth"]
[ext_resource type="PackedScene" uid="uid://bwtdls58ajair" path="res://items/permanent_items/upslash/upslash.tscn" id="8_8cxou"]
[ext_resource type="PackedScene" uid="uid://dy17xhg1yrl0o" path="res://items/active_items/horizontal_dash/horizontal_dash.tscn" id="9_esvgx"]
[resource]
script = ExtResource("6_rli0f")
common = Array[PackedScene]([ExtResource("1_2l6sh")])
rare = Array[PackedScene]([ExtResource("2_rli0f"), ExtResource("3_g002j"), ExtResource("4_vpswe"), ExtResource("5_jwi73")])
unique = Array[PackedScene]([ExtResource("6_73uum"), ExtResource("7_k6eth"), ExtResource("8_8cxou"), ExtResource("9_esvgx")])

View file

@ -1,14 +1,12 @@
class_name ItemSpawn extends Node2D class_name ItemSpawn extends Node2D
@export var common_items : Array[PackedScene] static var item_pool : ItemPool = ResourceLoader.load("res://items/generic/item_pool.tres","ItemPool",ResourceLoader.CACHE_MODE_IGNORE)
@export var rare_items : Array[PackedScene]
static var unique_items : Array[PackedScene] = []
@export var rarity_bonus : float = 0 @export var rarity_bonus : float = 0
@export var guarantee_rare : bool = false @export var guarantee_rare : bool = false
@export var unique_base_chance = .02 @export var unique_base_chance = 0.08
@export var rare_base_chance = .04 @export var rare_base_chance = .16
@export var unique_bonus_multiplier = .025 @export var unique_bonus_multiplier = .025
@export var rare_bonus_multiplier = .1 @export var rare_bonus_multiplier = .1
@ -19,27 +17,19 @@ func choose_pool() -> Array[PackedScene]:
var rare_chance = rare_base_chance + rare_bonus_multiplier * rarity_bonus var rare_chance = rare_base_chance + rare_bonus_multiplier * rarity_bonus
var random = randf() var random = randf()
if random < unique_chance && unique_items.size() > 0: if random < unique_chance && item_pool.unique.size() > 0:
remove_after_spawn = true remove_after_spawn = true
return unique_items return item_pool.unique
elif random < unique_chance + rare_chance || guarantee_rare: elif random < unique_chance + rare_chance || guarantee_rare:
return rare_items return item_pool.rare
return common_items return item_pool.common
func _ready(): func _ready():
var pool = choose_pool() var pool = choose_pool()
var index = randi_range(0, pool.size() - 1) var index = randi_range(0, pool.size() - 1)
var packed_scene : PackedScene = pool[index] var packed_scene : PackedScene = pool[index]
if remove_after_spawn: if remove_after_spawn:
unique_items.remove_at(index) item_pool.unique.remove_at(index)
var object = packed_scene.instantiate() var object = packed_scene.instantiate()
add_child.call_deferred(object) add_child.call_deferred(object)
object.reparent.call_deferred(get_parent()) object.reparent.call_deferred(get_parent())
static func refill_unique_item_pool():
unique_items = [
load("res://items/permanent_items/backslash/backslash.tscn"),
load("res://items/permanent_items/high_jump/high_jump.tscn"),
load("res://items/permanent_items/upslash/upslash.tscn"),
load("res://items/active_items/horizontal_dash/horizontal_dash.tscn")
]

View file

@ -1,19 +1,10 @@
[gd_scene load_steps=8 format=3 uid="uid://xj0of571aur1"] [gd_scene load_steps=3 format=3 uid="uid://xj0of571aur1"]
[ext_resource type="Script" uid="uid://b8em61mqgdi58" path="res://items/generic/item_spawn.gd" id="1_ms6tn"] [ext_resource type="Script" uid="uid://b8em61mqgdi58" path="res://items/generic/item_spawn.gd" id="1_ms6tn"]
[ext_resource type="PackedScene" uid="uid://b00185vygcka1" path="res://items/immediate_items/heal_item/heal_item.tscn" id="2_w6i8k"]
[ext_resource type="PackedScene" uid="uid://chs0u61f45nau" path="res://utils/earth_aligner.tscn" id="3_5pwuf"] [ext_resource type="PackedScene" uid="uid://chs0u61f45nau" path="res://utils/earth_aligner.tscn" id="3_5pwuf"]
[ext_resource type="PackedScene" uid="uid://gwctb2xqsbj" path="res://items/immediate_items/healthup/healthup.tscn" id="3_yi7ag"]
[ext_resource type="PackedScene" uid="uid://ddn025xnjngko" path="res://items/active_items/bow/bow.tscn" id="4_v0ua0"]
[ext_resource type="PackedScene" uid="uid://ewe36lqcjojk" path="res://items/active_items/updash/updash.tscn" id="5_uitgx"]
[ext_resource type="PackedScene" uid="uid://wc7kgtomy6xm" path="res://items/permanent_items/extrajump/extrajump.tscn" id="6_xqgya"]
[node name="ItemSpawn" type="Node2D"] [node name="ItemSpawn" type="Node2D"]
script = ExtResource("1_ms6tn") script = ExtResource("1_ms6tn")
common_items = Array[PackedScene]([ExtResource("2_w6i8k")])
rare_items = Array[PackedScene]([ExtResource("4_v0ua0"), ExtResource("5_uitgx"), ExtResource("3_yi7ag"), ExtResource("6_xqgya")])
unique_base_chance = 0.05
rare_base_chance = 0.1
metadata/_custom_type_script = "uid://b8em61mqgdi58" metadata/_custom_type_script = "uid://b8em61mqgdi58"
[node name="EarthAligner" parent="." instance=ExtResource("3_5pwuf")] [node name="EarthAligner" parent="." instance=ExtResource("3_5pwuf")]

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=15 format=3 uid="uid://cxo6bq26huau7"] [gd_scene load_steps=14 format=3 uid="uid://cxo6bq26huau7"]
[ext_resource type="PackedScene" uid="uid://cmaovvr15b3qk" path="res://player/player.tscn" id="2_1bvp3"] [ext_resource type="PackedScene" uid="uid://cmaovvr15b3qk" path="res://player/player.tscn" id="2_1bvp3"]
[ext_resource type="Texture2D" uid="uid://d3fpq76anm4t7" path="res://world/Background Prototype/Background prototype.png" id="3_kek77"] [ext_resource type="Texture2D" uid="uid://d3fpq76anm4t7" path="res://world/Background Prototype/Background prototype.png" id="3_kek77"]
@ -13,7 +13,6 @@
[ext_resource type="PackedScene" uid="uid://ca5ndobertnp4" path="res://water/water.tscn" id="10_4c57u"] [ext_resource type="PackedScene" uid="uid://ca5ndobertnp4" path="res://water/water.tscn" id="10_4c57u"]
[ext_resource type="Script" uid="uid://cpaskpj67pnaj" path="res://enemies/boss/boss_spawner.gd" id="10_efxa6"] [ext_resource type="Script" uid="uid://cpaskpj67pnaj" path="res://enemies/boss/boss_spawner.gd" id="10_efxa6"]
[ext_resource type="PackedScene" uid="uid://cpe4s6vsn0ujd" path="res://enemies/boss/boss.tscn" id="11_efxa6"] [ext_resource type="PackedScene" uid="uid://cpe4s6vsn0ujd" path="res://enemies/boss/boss.tscn" id="11_efxa6"]
[ext_resource type="PackedScene" uid="uid://ddn025xnjngko" path="res://items/active_items/bow/bow.tscn" id="14_w48qg"]
[node name="main" type="Node2D"] [node name="main" type="Node2D"]
@ -89,9 +88,6 @@ texture = ExtResource("3_kek77")
script = ExtResource("10_efxa6") script = ExtResource("10_efxa6")
boss = ExtResource("11_efxa6") boss = ExtResource("11_efxa6")
[node name="Bow" parent="." instance=ExtResource("14_w48qg")]
position = Vector2(128, -3178)
[connection signal="active_item_changed" from="Player" to="UIOverlay/ItemUI" method="_on_player_active_item_changed"] [connection signal="active_item_changed" from="Player" to="UIOverlay/ItemUI" method="_on_player_active_item_changed"]
[connection signal="health_changed" from="Player" to="UIOverlay/Healthbar" method="_on_player_health_changed"] [connection signal="health_changed" from="Player" to="UIOverlay/Healthbar" method="_on_player_health_changed"]
[connection signal="max_hp_changed" from="Player" to="UIOverlay/Healthbar" method="_on_player_max_hp_changed"] [connection signal="max_hp_changed" from="Player" to="UIOverlay/Healthbar" method="_on_player_max_hp_changed"]

View file

@ -4,8 +4,8 @@
[ext_resource type="Texture2D" uid="uid://b8aih0qr3hssc" path="res://player/sword.png" id="2_hv1tj"] [ext_resource type="Texture2D" uid="uid://b8aih0qr3hssc" path="res://player/sword.png" id="2_hv1tj"]
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_e4ynd"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_e4ynd"]
radius = 18.048504 radius = 18.288715
height = 36.097008 height = 36.57743
[sub_resource type="SpriteFrames" id="SpriteFrames_fahsa"] [sub_resource type="SpriteFrames" id="SpriteFrames_fahsa"]
animations = [{ animations = [{
@ -23,9 +23,9 @@ collision_mask = 18
script = ExtResource("1_hv1tj") script = ExtResource("1_hv1tj")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."] [node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(-18.97778, 0.61333394) position = Vector2(-27, 0.613)
rotation = 1.5708 rotation = 1.5708
scale = Vector2(-0.635, -1.5) scale = Vector2(-0.635, -1.1)
shape = SubResource("CapsuleShape2D_e4ynd") shape = SubResource("CapsuleShape2D_e4ynd")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]

View file

@ -1,7 +1,7 @@
extends Node2D extends Node2D
func _ready() -> void: func _ready() -> void:
ItemSpawn.refill_unique_item_pool() ItemSpawn.item_pool = ResourceLoader.load("res://items/generic/item_pool.tres","ItemPool",ResourceLoader.CACHE_MODE_IGNORE)
func get_grid() -> Grid: func get_grid() -> Grid:
return $Grid return $Grid