@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 "" func get_logs() -> Array[Log]: 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: if difficulty_setting == 0: return 6 return 8 func has_cave_modifier(level : int, _difficulty_setting : int) -> bool: match level: 1: return false 2: return false 3: return true 4: return false 5: return true 6: return true 7: return false 8: return true _: return level % 2 == 0 func has_vending_machine_modifier(level : int, _difficulty_setting : int) -> bool: match level: 1: return false 2: return true 3: return false 4: return true 5: return false 6: return false 7: return true 8: return false _: return (level + 1) % 3 == 0 func get_challenge_chance(level : int, difficulty_setting : int) -> float: if is_run_point_dangerous(level, difficulty_setting): return 0. 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 difficulty_setting == 0: 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 40 5: return 60 6: return 80 7: return 110 8: return 150 _: 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 _: return difficult_objective_for_region(level-1) + (level-1) * 10 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): if has_vending_machine_modifier(level, difficulty_setting): modifiers.append(VendingMachineModifier.new()) if has_cave_modifier(level, difficulty_setting): 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 class Log: var key : String var title : String var text : String func _init( _key: String, _title : String, _text : String, ): key = _key title = _title text = _text