@abstract extends Resource class_name StoryStep const COSY_ENERGY_ADDITION = 2 const COSY_OBJECTIVE_FACTOR = 0.5 #region ------------------ Story ------------------ @abstract func get_respawn_scene() -> Scene @abstract func get_destination_text() -> String func get_destination_scene() -> Scene: return BoreaScene.new() func get_run_progress(level : int, difficulty_setting : int) -> int: if is_region_sequence_infinite(): return 0 return get_region_sequence_length(difficulty_setting) - level func get_ship_dialog_path(_level : int, _difficulty_setting : int, _ship_in_space := true) -> String: return "" #region ------------------ Run ------------------ func is_run_finished(level : int, difficulty_setting : int) -> bool: if is_region_sequence_infinite(): return false return level == get_region_sequence_length(difficulty_setting) - 1 func is_region_sequence_infinite() -> bool: return false func get_player_max_energy(difficulty_setting : int) -> int: if difficulty_setting == 0: return PlayerData.DEFAULT_MAX_ENERGY + COSY_ENERGY_ADDITION return PlayerData.DEFAULT_MAX_ENERGY func get_player_max_inventory(_difficulty_setting : int) -> int: return PlayerData.DEFAULT_INVENTORY_SIZE func get_region_sequence_length(_difficulty_setting : int) -> int: return 8 func get_first_vending_machine_occurence(_level : int, _difficulty_setting : int) -> int: return 2 func get_vending_machine_occurence(_level : int, _difficulty_setting : int) -> int: return 3 func get_first_cave_occurence(level : int, difficulty_setting : int) -> int: return get_cave_occurence(level, difficulty_setting) func get_cave_occurence(_level : int, _difficulty_setting : int) -> int: return 3 func get_challenge_chance(_level : int, _difficulty_setting : int) -> float: return 0.15 func get_run_point_number(level : int, difficulty_setting : int) -> int: if is_run_finished(level, difficulty_setting): return 1 return 2 func get_charge_number(_level : int, _difficulty_setting : int) -> int: return 10 func is_run_point_dangerous(level : int, difficulty_setting : int) -> bool: if is_region_sequence_infinite(): return false return level == get_region_sequence_length(difficulty_setting) - 2 static func basic_objective_for_region(level : int) -> int: match level: 1: return 10 2: return 15 3: return 20 4: return 30 5: return 45 _: return basic_objective_for_region(level-1) + (level-2) * 5 static func difficult_objective_for_region(level : int) -> int: match level: 1: return 10 2: return 20 3: return 30 _: return difficult_objective_for_region(level-1) + (level-1) * 5 func get_objective_multiplier() -> float: return 1. func get_objective_for_region(level : int, difficulty_setting : int) -> int: var objective = basic_objective_for_region(level) if difficulty_setting == 0: objective = roundi(objective * COSY_OBJECTIVE_FACTOR) elif difficulty_setting == 2: return difficult_objective_for_region(level) return max(1,roundi(objective * get_objective_multiplier())) func get_story_modifiers_for_region(level : int, difficulty_setting : int) -> Array[RegionModifier]: var modifiers : Array[RegionModifier] = [] if is_run_finished(level, difficulty_setting): var dest_mod = DestinationModifier.new() dest_mod.destination_scene = get_destination_scene() modifiers.append(dest_mod) return modifiers func get_gameplay_modifiers_for_region(level : int, difficulty_setting : int) -> Array[RegionModifier]: var modifiers : Array[RegionModifier] = [] if need_gameplay_modifier(level,difficulty_setting): var first_vending = get_first_vending_machine_occurence(level, difficulty_setting) var vending_occurence = get_vending_machine_occurence(level, difficulty_setting) if vending_occurence > 0 and level >= first_vending: if (level - first_vending)%vending_occurence == 0: modifiers.append(VendingMachineModifier.new()) var first_cave = get_first_cave_occurence(level, difficulty_setting) var cave_occurence = get_cave_occurence(level, difficulty_setting) if cave_occurence > 0 and level >= first_cave: if (level - first_cave)%cave_occurence == 0: modifiers.append(CaveModifier.new()) return modifiers func need_gameplay_modifier(level : int, difficulty_setting : int): if is_run_finished(level, difficulty_setting): return false return true func _on_finish(): GameInfo.game_data.incubator_used = [] GameInfo.game_data.dead_orchid_position = Vector3.ZERO GameInfo.game_data.dead_orchid_rotation = Vector3.ZERO