Randoloot/scripts/game/distant_loot.gd
2026-10-25 22:38:13 +01:00

34 lines
1.8 KiB
GDScript

extends RefCounted
const MAP_CHANCE := 0.15
const BANK_CHANCE := 0.15
const REPLICATION_CHANCE := 0.05
static func roll(level: int, boss: bool, seed_value: int, map_roll: float, orb_roll: float) -> Array[Dictionary]:
var result: Array[Dictionary] = []
if boss or map_roll < MAP_CHANCE:
var profile := {"id":"distant:%d" % seed_value,"seed":seed_value,"name":"Daleka wyprawa %d" % level}
result.append({"map":preload("res://scripts/planets/distant_expeditions.gd").offer(profile,level)})
if boss:
var pool := preload("res://scripts/items/special_orbs.gd").COMMON_IDS
result.append({"orb":pool[posmod(seed_value,pool.size())]})
if orb_roll < REPLICATION_CHANCE: result.append({"orb":"replication"})
return result
static func crystal_amount(level: int, tier: int, roll_value: int) -> int:
return clampi(roll_value,1,3) * maxi(1,ceili(maxi(1,level)/10.0)) * [1,2,5][clampi(tier,0,2)]
static func drop(enemy: Node2D) -> void:
var crystals := Node2D.new()
crystals.set_script(preload("res://scripts/items/time_crystal_pickup.gd"))
crystals.amount = crystal_amount(GameState.system_level,int(enemy.get("loot_tier")),randi_range(1,3))
crystals.position = enemy.position+Vector2(38,-20)
enemy.get_parent().call_deferred("add_child",crystals)
for payload in roll(GameState.system_level,int(enemy.get("loot_tier"))==2,randi(),randf(),randf()):
var pickup := Node2D.new()
pickup.set_script(preload("res://scripts/items/expedition_pickup.gd"))
if payload.has("orb"):
pickup.set_script(preload("res://scripts/items/loot_pickup.gd"))
pickup.item = preload("res://scripts/items/special_orbs.gd").create_item(str(payload.orb))
else:
pickup.payload = payload
pickup.position = enemy.position+Vector2(randf_range(-36,36),65)
enemy.get_parent().call_deferred("add_child",pickup)