34 lines
1.8 KiB
GDScript
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)
|