3 Commits

Author SHA1 Message Date
96d1a4f4dd nettoyage de repo 2026-02-06 10:29:32 +01:00
cc421a951f système de sauvegarde, scène 3D de test sur la base astra et passage en forward+ 2026-02-06 10:28:36 +01:00
83d462f2f4 changement du scene manager, amélioration du cockpit et autres
* refonte du scene manager
* refonte du audio manager
* premier rework des plantes
* nettoyage des dossiers/fichiers
* renommage de planète en region
* fix des run
2026-01-23 18:06:27 +01:00
299 changed files with 4475 additions and 3616 deletions

View File

@@ -0,0 +1,13 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://dvvi1k5c5iowc"]
[ext_resource type="Texture2D" uid="uid://dlsx1mofjccib" path="res://common/assets/textures/3d_texture.png" id="1_cc1ni"]
[resource]
diffuse_mode = 3
specular_mode = 2
albedo_texture = ExtResource("1_cc1ni")
roughness = 0.0
rim_tint = 0.48
stencil_flags = 2
stencil_reference = 5
stencil_outline_thickness = 0.626

View File

@@ -0,0 +1,9 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://b5vlcdry8vtgi"]
[ext_resource type="Texture2D" uid="uid://dlsx1mofjccib" path="res://common/assets/textures/3d_texture.png" id="1_buts1"]
[resource]
transparency = 1
depth_draw_mode = 1
albedo_color = Color(1, 1, 1, 0.79607844)
albedo_texture = ExtResource("1_buts1")

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dlsx1mofjccib"
path.s3tc="res://.godot/imported/3d_texture.png-5d7cb2d23d37985e4dc0c0bd241d8e43.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://common/assets/textures/3d_texture.png"
dest_files=["res://.godot/imported/3d_texture.png-5d7cb2d23d37985e4dc0c0bd241d8e43.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dc8gajse5ti5t"
path.s3tc="res://.godot/imported/dither_texture.jpg-29df728b3fc6c30c4db6300481aaf214.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://common/assets/textures/dither_texture.jpg"
dest_files=["res://.godot/imported/dither_texture.jpg-29df728b3fc6c30c4db6300481aaf214.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@@ -1,12 +1,11 @@
[gd_scene load_steps=30 format=3 uid="uid://b6hscxcrj065q"]
[gd_scene load_steps=28 format=3 uid="uid://b6hscxcrj065q"]
[ext_resource type="Script" uid="uid://2p5d6vogtn82" path="res://common/audio_manager/scripts/audio_manager.gd" id="1_0tvca"]
[ext_resource type="AudioStream" uid="uid://dipnmlprwfo12" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_1.ogg" id="2_a4u5m"]
[ext_resource type="AudioStream" uid="uid://bm0tdi6bd2e65" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_2.ogg" id="3_8nsyr"]
[ext_resource type="AudioStream" uid="uid://dftxjfdqgsbd3" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_3.ogg" id="4_athui"]
[ext_resource type="AudioStream" uid="uid://dipnmlprwfo12" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_1.ogg" id="2_tuvql"]
[ext_resource type="AudioStream" uid="uid://dcbuhtc085q2x" path="res://common/audio_manager/assets/morceaux/niveau_v2/mines_phase_1.ogg" id="5_ajci6"]
[ext_resource type="AudioStream" uid="uid://bqwiaek5b5q00" path="res://common/audio_manager/assets/morceaux/niveau/forest_phase_2.ogg" id="6_ldyhq"]
[ext_resource type="AudioStream" uid="uid://d4lqhgf0lhgge" path="res://common/audio_manager/assets/morceaux/niveau/forest_phase_3.ogg" id="7_ol34x"]
[ext_resource type="AudioStream" uid="uid://bpf6witukorka" path="res://common/audio_manager/assets/morceaux/autres/main_menu.ogg" id="7_tuvql"]
[ext_resource type="AudioStream" uid="uid://brtjlgjqnrvcb" path="res://common/audio_manager/assets/morceaux/autres/truck_music.ogg" id="8_0e5ja"]
[ext_resource type="AudioStream" uid="uid://bnxsnege8qq6e" path="res://common/audio_manager/assets/morceaux/niveau/forest_phase_4.ogg" id="8_ajci6"]
[ext_resource type="AudioStream" uid="uid://dfrp66a4isnt6" path="res://common/audio_manager/assets/sfx/dig/dig_1.wav" id="9_gv65y"]
@@ -24,15 +23,6 @@
[ext_resource type="AudioStream" uid="uid://d1cpi438ep0ys" path="res://common/audio_manager/assets/sfx/announce/annnounce.wav" id="22_btfwx"]
[ext_resource type="AudioStream" uid="uid://ccq04ahrwr3bv" path="res://common/audio_manager/assets/sfx/alarm/alarm.wav" id="23_fwu3w"]
[sub_resource type="AudioStreamSynchronized" id="AudioStreamSynchronized_i5lxw"]
stream_count = 3
stream_0/stream = ExtResource("2_a4u5m")
stream_0/volume = 0.0
stream_1/stream = ExtResource("3_8nsyr")
stream_1/volume = -60.0
stream_2/stream = ExtResource("4_athui")
stream_2/volume = -60.0
[sub_resource type="AudioStreamPlaylist" id="AudioStreamPlaylist_ajci6"]
stream_count = 4
stream_0 = ExtResource("5_ajci6")
@@ -66,33 +56,32 @@ streams_count = 2
stream_0/stream = ExtResource("20_pu6t4")
stream_1/stream = ExtResource("21_dk5s6")
[node name="AudioManager" type="Node" node_paths=PackedStringArray("playing_soundtracks")]
[node name="AudioManager" type="Node"]
process_mode = 3
script = ExtResource("1_0tvca")
default_fade_time = 2.0
garden_phases_scores = Array[int]([0, 10, 30])
playing_soundtracks = [NodePath("Ambiance/Default")]
[node name="Ambiance" type="Node" parent="."]
unique_name_in_owner = true
[node name="Default" type="AudioStreamPlayer" parent="Ambiance"]
[node name="Exterior" type="AudioStreamPlayer" parent="Ambiance"]
unique_name_in_owner = true
stream = SubResource("AudioStreamSynchronized_i5lxw")
autoplay = true
stream = ExtResource("2_tuvql")
[node name="Musics" type="Node" parent="."]
unique_name_in_owner = true
[node name="Planet" type="AudioStreamPlayer" parent="Musics"]
[node name="Region" type="AudioStreamPlayer" parent="Musics"]
unique_name_in_owner = true
stream = SubResource("AudioStreamPlaylist_ajci6")
autoplay = true
[node name="Title" type="AudioStreamPlayer" parent="Musics"]
unique_name_in_owner = true
stream = ExtResource("7_tuvql")
[node name="Truck" type="AudioStreamPlayer" parent="Musics"]
unique_name_in_owner = true
stream = ExtResource("8_0e5ja")
autoplay = true
[node name="Sfx" type="Node" parent="."]
unique_name_in_owner = true

View File

@@ -3,136 +3,119 @@ extends Node
const MIN_VOLUME = -60.
const MAX_VOLUME = 24.
@onready var settings : SettingsData = GameInfo.game_data.settings
@onready var settings : SettingsData = GameInfo.settings_data
@export var default_fade_time = 1.0
@export var garden_phase = 0
@export var garden_phases_scores : Array[int]
@export var playing_soundtracks : Array[AudioStreamPlayer] = []
@export var playing_music : AudioStreamPlayer = null
@export var playing_ambiance : AudioStreamPlayer = null
var default_volumes := {}
func _ready():
GameInfo.game_data.current_planet_data_updated.connect(_on_current_planet_data_updated)
fetch_default_volumes()
setup_volume()
settings.sound_changed.connect(
func(_s) : setup_volume()
)
for player in get_all_soundtrack_players():
player.play()
for player in get_all_players():
player.stop()
fetch_default_volumes()
setup_volume()
settings.sound_changed.connect(
func(_s) : setup_volume()
)
SceneManager.scene_loaded.connect(_on_change_scene)
func _on_change_scene(scene : Scene):
play_ambiance()
match scene.scene_id:
"TITLE":
play_music("Title")
"REGION":
play_music("Region")
play_ambiance("Exterior")
"COCKPIT":
play_music("Truck")
func fetch_default_volumes():
var all_players := get_all_soundtrack_players()
all_players.append_array(get_all_sfx_players())
var all_players := get_all_players()
for player in all_players:
default_volumes[player] = player.volume_db
for player in all_players:
default_volumes[player] = player.volume_db
func setup_volume():
for player in get_all_soundtrack_players():
player.volume_db = get_volume_from_parent(player) if (
playing_soundtracks.find(player) != -1
) else MIN_VOLUME
setup_phase(player)
for player in get_all_sfx_players():
player.volume_db = get_volume_from_parent(player)
for player in get_all_players():
player.volume_db = get_volume_from_parent(player)
func get_volume_from_parent(player : AudioStreamPlayer) -> float:
var settings_volume = 0.5
var settings_volume = 0.5
if player.get_parent() == %Ambiance:
settings_volume = settings.ambiance_volume
elif player.get_parent() == %Sfx:
settings_volume = settings.sfx_volume
elif player.get_parent() == %Musics:
settings_volume = settings.music_volume
return default_volumes[player] + lerp(MIN_VOLUME, MAX_VOLUME, settings_volume)
if player.get_parent() == %Ambiance:
settings_volume = settings.ambiance_volume
elif player.get_parent() == %Sfx:
settings_volume = settings.sfx_volume
elif player.get_parent() == %Musics:
settings_volume = settings.music_volume
return default_volumes[player] + lerp(MIN_VOLUME, MAX_VOLUME, settings_volume)
func update_phase():
for player in get_all_soundtrack_players():
var playing : bool = player.volume_db != MIN_VOLUME
if playing:
await set_volume(player, MIN_VOLUME).finished
setup_phase(player)
if playing:
set_volume(player, get_volume_from_parent(player))
func get_all_players() -> Array[AudioStreamPlayer]:
var players : Array[AudioStreamPlayer] = []
players.append_array(get_players_from_node(%Musics))
players.append_array(get_players_from_node(%Ambiance))
players.append_array(get_players_from_node(%Sfx))
func get_all_soundtrack_players() -> Array[AudioStreamPlayer]:
var players : Array[AudioStreamPlayer] = []
players.append_array(get_players_from_node(%Musics))
players.append_array(get_players_from_node(%Ambiance))
return players
func get_all_sfx_players() -> Array[AudioStreamPlayer]:
return get_players_from_node(%Sfx)
return players
func get_players_from_node(node : Node) -> Array[AudioStreamPlayer]:
var streams : Array[AudioStreamPlayer] = []
var streams : Array[AudioStreamPlayer] = []
for c in node.get_children():
if c is AudioStreamPlayer:
streams.append(c)
return streams
for c in node.get_children():
if c is AudioStreamPlayer:
streams.append(c)
return streams
func set_volume(player : AudioStreamPlayer, to : float, fade_time = default_fade_time) -> Tween:
var fade_tween : Tween = get_tree().create_tween()
func _on_current_planet_data_updated(planet_data : PlanetData):
if planet_data:
update_garden_phase(planet_data)
planet_data.updated.connect(update_garden_phase)
func update_garden_phase(planet_data : PlanetData):
var phase : int = garden_phase
for i in range(len(garden_phases_scores)):
if planet_data.garden_score >= garden_phases_scores[i] and i > garden_phase:
phase = i
fade_tween.tween_property(player, "volume_db", to, fade_time)
if garden_phase != phase:
update_phase()
return fade_tween
garden_phase = phase
func reset_volume(player : AudioStreamPlayer):
player.volume_db = get_volume_from_parent(player)
func enter_planet():
play_music(%Planet, true)
stop_music(%Truck, true)
func play_sfx(sfx_name : String):
var player := %Sfx.find_child(sfx_name) as AudioStreamPlayer
if player:
player.play()
else:
printerr("Sfx %s not found" % sfx_name)
func enter_truck():
play_music(%Truck, true)
stop_music(%Planet, true)
func play_music(music_name : String = ""):
if playing_music:
await set_volume(playing_music, MIN_VOLUME).finished
if playing_music:
playing_music.stop()
reset_volume(playing_music)
playing_music = null
if music_name:
var player := %Musics.find_child(music_name) as AudioStreamPlayer
if player:
playing_music = player
player.play()
else:
printerr("Music %s not found" % music_name)
func stop_music(music : AudioStreamPlayer, with_fade = false):
if playing_soundtracks.find(music) != -1:
playing_soundtracks.remove_at(playing_soundtracks.find(music))
set_volume(music, MIN_VOLUME, with_fade)
func play_music(player : AudioStreamPlayer, with_fade = false):
playing_soundtracks.append(player)
set_volume(player, get_volume_from_parent(player), with_fade)
func setup_phase(music : AudioStreamPlayer):
if music.stream is AudioStreamSynchronized:
var sync_stream = music.stream as AudioStreamSynchronized
var phase_stream_id = min(garden_phase, sync_stream.stream_count - 1)
for i in range(sync_stream.stream_count):
sync_stream.set_sync_stream_volume(
i,
0. if i == phase_stream_id else MIN_VOLUME
)
func set_volume(music : AudioStreamPlayer, to : float, fade_time = default_fade_time) -> Tween:
var fade_tween : Tween = get_tree().create_tween()
fade_tween.tween_property(music, "volume_db", to, fade_time)
return fade_tween
func play_sfx(name : String):
var player := %Sfx.find_child(name) as AudioStreamPlayer
if player:
player.play()
else:
printerr("Sfx %s not found" % name)
func play_ambiance(ambiance_name : String = ""):
if playing_ambiance:
await set_volume(playing_ambiance, MIN_VOLUME).finished
if playing_ambiance:
playing_ambiance.stop()
reset_volume(playing_ambiance)
playing_ambiance = null
if ambiance_name:
var player := %Ambiance.find_child(ambiance_name) as AudioStreamPlayer
if player:
playing_ambiance = player
player.play()
else:
printerr("Sfx %s not found" % ambiance_name)

View File

@@ -1,100 +1,36 @@
extends Resource
class_name GameData
signal current_planet_data_updated(p : PlanetData)
signal current_region_data_updated(p : RegionData)
func _init():
set_default_unlocked()
@export var current_run : RunData = null
@export var tutorial_done = false
@export var settings : SettingsData = SettingsData.new()
@export var current_run : RunData = RunData.new()
@export var current_planet_data : PlanetData : get = get_current_planet_data
@export var current_region_data : RegionData = null
@export var player_data : PlayerData = PlayerData.new()
@export var unlocked_plant_types : Array[PlantType] = []
@export var unlocked_plant_mutations : Array[PlantMutation] = []
@export var unlocked_machines : Array[MachineType] = []
@export var max_mutations_by_plant : int = 2
@export var truck_data : TruckData = TruckData.new()
@export var dialogs_done : Array[String] = []
func _ready():
current_run.run_point_changed.connect(
func(): current_planet_data_updated.emit(get_current_planet_data)
)
@export var actual_scene : Scene = null
func set_default_unlocked():
unlocked_plant_types = all_plant_types()
unlocked_plant_mutations = all_plant_mutations()
unlocked_machines = all_machines()
func reset_run():
current_run = RunData.new()
current_planet_data_updated.emit()
func start_run():
player_data.inventory.clear()
current_run = RunData.new()
current_run.current_run_point_changed.connect(
func(rp : RunPoint):
start_region(rp.region_parameter)
)
func reset_player():
player_data = PlayerData.new()
func reset_truck():
truck_data = TruckData.new()
player_data = PlayerData.new()
func reset_all():
reset_run()
reset_player()
reset_truck()
start_run()
reset_player()
unlocked_plant_types = []
func unlock_plant_type(new_plant_type : PlantType):
if not is_plant_type_unlocked(new_plant_type):
unlocked_plant_types.append(new_plant_type.duplicate_deep())
func get_locked_plant_types() -> Array[PlantType]:
var locked_plant_type : Array[PlantType] = []
for pt in GameInfo.game_data.all_plant_types():
if not is_plant_type_unlocked(pt):
locked_plant_type.append(pt)
return locked_plant_type
func get_current_planet_data():
return current_run.get_current_planet_data()
func is_plant_type_unlocked(new_plant_type : PlantType):
return unlocked_plant_types.find_custom(
func (upt : PlantType): return new_plant_type.name == upt.name
) != -1
func all_plant_types() -> Array[PlantType]:
return [
preload("res://entities/plants/resources/plant_types/champ.tres"),
preload("res://entities/plants/resources/plant_types/chardi.tres"),
preload("res://entities/plants/resources/plant_types/ferno.tres"),
preload("res://entities/plants/resources/plant_types/maias.tres"),
preload("res://entities/plants/resources/plant_types/philea.tres"),
preload("res://entities/plants/resources/plant_types/pili.tres"),
preload("res://entities/plants/resources/plant_types/solita.tres"),
]
func all_machines() -> Array[MachineType]:
return [
preload("res://entities/interactables/machines/solar_pannel/solar_pannel.tres"),
]
func all_plant_mutations() -> Array[PlantMutation]:
return [
preload("res://entities/plants/resources/plant_mutations/ancient_mutation.tres"),
preload("res://entities/plants/resources/plant_mutations/elitist_mutation.tres"),
preload("res://entities/plants/resources/plant_mutations/ermit_mutation.tres"),
preload("res://entities/plants/resources/plant_mutations/precocious_mutation.tres"),
preload("res://entities/plants/resources/plant_mutations/quality_mutation.tres"),
preload("res://entities/plants/resources/plant_mutations/quick_mutation.tres"),
preload("res://entities/plants/resources/plant_mutations/sociable_mutation.tres"),
preload("res://entities/plants/resources/plant_mutations/strong_mutation.tres"),
]
func start_region(region_param : RegionParameter):
current_region_data = RegionData.new(region_param)
current_region_data_updated.emit(current_region_data)
GameInfo.save_game_data()

View File

@@ -1,22 +1,27 @@
extends Resource
class_name RunData
const RUN_POINT_POSITION_DERIVATION = 70
enum State {STARTED, IN_PROGRESS, FINISHED}
const RUN_POINT_POSITION_DERIVATION = 100
const DIFFICULTY_INCREASE_BY_LEVEL = 1
const RUN_POINTS_NEXT_NUMBER :Array[int] = [2,3]
const RUN_POINT_MAX_LEVEL = 10
signal run_point_changed
signal current_run_point_changed
var run_seed = randi()
@export var next_run_points : Array[RunPoint] = [generate_first_run_point()]
@export var current_run_point : RunPoint = null
@export var current_run_point : RunPoint = null :
set(v):
current_run_point = v
current_run_point_changed.emit(v)
@export var visited_run_points : Array[RunPoint] = []
#region ------------------ Generation ------------------
func generate_first_run_point() -> RunPoint:
return RunPoint.new(0, PlanetParameter.new())
return RunPoint.new(0, RegionParameter.new())
func generate_next_run_points(run_point : RunPoint) -> Array[RunPoint]:
var nb_next_run_points = RUN_POINTS_NEXT_NUMBER.pick_random()
@@ -38,18 +43,18 @@ func generate_next_run_points(run_point : RunPoint) -> Array[RunPoint]:
func generate_next_run_point(run_point : RunPoint) -> RunPoint:
return RunPoint.new(
run_point.level + 1,
generate_difficulty_increased_planet_parameter(run_point.planet_parameter, DIFFICULTY_INCREASE_BY_LEVEL),
generate_difficulty_increased_region_parameter(run_point.region_parameter, DIFFICULTY_INCREASE_BY_LEVEL),
(run_point.position + randi_range(-RUN_POINT_POSITION_DERIVATION, RUN_POINT_POSITION_DERIVATION)) % 360
)
func generate_difficulty_increased_planet_parameter(
planet_parameter : PlanetParameter,
func generate_difficulty_increased_region_parameter(
region_parameter : RegionParameter,
difficulty : int = 1
) -> PlanetParameter:
) -> RegionParameter:
var i_diff := difficulty
var new_planet_parameter = PlanetParameter.new(
planet_parameter.charges,
planet_parameter.objective
var new_region_parameter = RegionParameter.new(
region_parameter.charges,
region_parameter.objective
)
while i_diff > 0:
@@ -58,51 +63,56 @@ func generate_difficulty_increased_planet_parameter(
DifficultyIncreaseObjective.new()
].filter(
func (mod : DifficultyModifier):
return mod.get_difficulty_cost() <= i_diff and mod.can_modifiy(new_planet_parameter)
return mod.get_difficulty_cost() <= i_diff and mod.can_modifiy(new_region_parameter)
)
var selected_difficulty_modifier = available_difficulty_modifier.pick_random()
selected_difficulty_modifier.modify(new_planet_parameter)
selected_difficulty_modifier.modify(new_region_parameter)
i_diff -= max(1,selected_difficulty_modifier.get_difficulty_cost())
return new_planet_parameter
return new_region_parameter
#endregion
func get_next_run_points() -> Array[RunPoint]:
return next_run_points
func get_state() -> State:
if not current_run_point:
return State.STARTED
elif current_run_point.level == RUN_POINT_MAX_LEVEL:
return State.FINISHED
else :
return State.IN_PROGRESS
func get_current_planet_data() -> PlanetData:
if current_run_point:
return current_run_point.planet_data
else:
return null
func get_next_run_points() -> Array[RunPoint]:
if current_run_point and current_run_point.level == RUN_POINT_MAX_LEVEL:
return []
return next_run_points
func choose_next_run_point(run_point : RunPoint) -> RunPoint:
if current_run_point:
visited_run_points.append(current_run_point)
current_run_point = run_point
GameInfo.game_data.start_region(run_point.region_parameter)
next_run_points = generate_next_run_points(current_run_point)
return current_run_point
class DifficultyModifier:
func modify(_planet_parameter : PlanetParameter):
func modify(_region_parameter : RegionParameter):
pass
func can_modifiy(_planet_parameter : PlanetParameter) -> bool:
func can_modifiy(_region_parameter : RegionParameter) -> bool:
return true
func get_difficulty_cost() -> int:
return 1
class DifficultyIncreaseObjective extends DifficultyModifier:
func modify(planet_parameter : PlanetParameter):
planet_parameter.objective += 1
func modify(region_parameter : RegionParameter):
region_parameter.objective += 1
class DifficultyDecreaseCharge extends DifficultyModifier:
func modify(planet_parameter : PlanetParameter):
planet_parameter.charges -= 1
func modify(region_parameter : RegionParameter):
region_parameter.charges -= 1
func can_modifiy(planet_parameter : PlanetParameter) -> bool:
return planet_parameter.charges >= 3
func can_modifiy(region_parameter : RegionParameter) -> bool:
return region_parameter.charges >= 3

View File

@@ -8,53 +8,30 @@ const OBJECTIVE_ICON = preload("res://common/icons/dna.svg")
const CHARGE_ICON = preload("res://common/icons/bolt.svg")
@export var level : int = 0 # X pos along the planet, and difficulty
@export var planet_parameter : PlanetParameter = PlanetParameter.new() :
@export var region_parameter : RegionParameter = RegionParameter.new() :
set(v):
planet_parameter = v
planet_data = PlanetData.new(planet_parameter)
@export var region_name : String = generate_region_name()
region_parameter = v
@export var position : int = 0 # Y pos along the planet, 0 to 360
var planet_data : PlanetData
func _init(
_level : int = 0,
_planet_parameter : PlanetParameter = PlanetParameter.new(),
_region_parameter : RegionParameter = RegionParameter.new(),
_position : int = randi_range(0,360),
_region_name : String = generate_region_name()
):
level = _level
planet_parameter = _planet_parameter
region_parameter = _region_parameter
position = _position
region_name = _region_name
planet_data = PlanetData.new(planet_parameter)
func card_info() -> CardInfo:
var info = CardInfo.new(region_name)
var info = CardInfo.new(region_parameter.name)
info.important_stat_icon = DANGER_ICON
info.important_stat_text = "%d" % level
info.type_icon = TYPE_ICON
info.stats.append_array([
CardStatInfo.new(tr("%d_GARDEN_POINTS") % planet_parameter.objective, OBJECTIVE_ICON),
CardStatInfo.new(tr("%d_CHARGES_AVAILABLE") % planet_parameter.charges, CHARGE_ICON),
CardStatInfo.new(str(region_parameter.objective), OBJECTIVE_ICON),
CardStatInfo.new(str(region_parameter.charges), CHARGE_ICON),
])
return info
func generate_region_name() -> String:
var vowel = ["a","e","i","o","u","y"]
var consonants = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "z", "'"]
var word_len = randf_range(4,8)
var word = ''
var last_letter_is_vowel = false
for i in range(word_len):
if last_letter_is_vowel:
word += consonants.pick_random()
else:
word += vowel.pick_random()
last_letter_is_vowel = not last_letter_is_vowel
return word.capitalize()
return info

View File

@@ -1,34 +1,73 @@
extends Node
const SAVE_GAME_LOCATION = "res://stw_demo_save.tres"
const SAVE_SETTINGS_LOCATION = "res://stw_settings.tres"
var game_loaded = false
signal game_data_updated(g : GameData)
var game_data : GameData :
set(v):
game_data = v
game_data_updated.emit(v)
set(v):
game_data = v
game_data_updated.emit(v)
var settings_data : SettingsData
func load_game_data() -> GameData:
if ResourceLoader.exists(SAVE_GAME_LOCATION):
game_loaded = true
game_data = ResourceLoader.load(SAVE_GAME_LOCATION).duplicate_deep()
else :
game_data = GameData.new()
save_game_data()
return game_data
func save_game_data():
if game_data:
ResourceSaver.save(game_data, SAVE_GAME_LOCATION)
func load_settings_data() -> SettingsData:
if ResourceLoader.exists(SAVE_SETTINGS_LOCATION):
print("settings exists")
settings_data = ResourceLoader.load(SAVE_SETTINGS_LOCATION).duplicate_deep()
else :
settings_data = SettingsData.new()
save_settings()
return settings_data
func save_settings():
if settings_data:
ResourceSaver.save(settings_data, SAVE_SETTINGS_LOCATION)
func restart_game_data():
game_data = GameData.new()
save_game_data()
func _init():
if not game_data:
game_data = GameData.new()
update_language_settings(game_data.settings)
update_video_settings(game_data.settings)
game_data.settings.language_changed.connect(_on_settings_language_changed)
game_data.settings.video_changed.connect(_on_settings_video_changed)
load_game_data()
load_settings_data()
update_language_settings(settings_data)
update_video_settings(settings_data)
settings_data.language_changed.connect(_on_settings_language_changed)
settings_data.video_changed.connect(_on_settings_video_changed)
func _on_settings_video_changed(s : SettingsData):
update_video_settings(s)
update_video_settings(s)
func _on_settings_language_changed(s : SettingsData):
update_language_settings(s)
update_language_settings(s)
func update_language_settings(s : SettingsData):
TranslationServer.set_locale(s.language)
TranslationServer.set_locale(s.language)
func update_video_settings(s : SettingsData):
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN if s.full_screen else DisplayServer.WINDOW_MODE_WINDOWED)
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN if s.full_screen else DisplayServer.WINDOW_MODE_WINDOWED)
func update_input(action : String, old_event : InputEvent, event : InputEvent):
InputMap.action_erase_event(action, old_event)
InputMap.action_add_event(action, event)
InputMap.action_erase_event(action, old_event)
InputMap.action_add_event(action, event)

1
common/icons/coin.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff" class="icon icon-tabler icons-tabler-filled icon-tabler-coin"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M17 3.34a10 10 0 1 1 -15 8.66l.005 -.324a10 10 0 0 1 14.995 -8.336zm-5 2.66a1 1 0 0 0 -1 1a3 3 0 1 0 0 6v2a1.024 1.024 0 0 1 -.866 -.398l-.068 -.101a1 1 0 0 0 -1.732 .998a3 3 0 0 0 2.505 1.5h.161a1 1 0 0 0 .883 .994l.117 .007a1 1 0 0 0 1 -1l.176 -.005a3 3 0 0 0 -.176 -5.995v-2c.358 -.012 .671 .14 .866 .398l.068 .101a1 1 0 0 0 1.732 -.998a3 3 0 0 0 -2.505 -1.501h-.161a1 1 0 0 0 -1 -1zm1 7a1 1 0 0 1 0 2v-2zm-2 -4v2a1 1 0 0 1 0 -2z" /></svg>

After

Width:  |  Height:  |  Size: 662 B

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cqqlkm14lawpa"
path="res://.godot/imported/panneau_solaire_1.png-b9a4049f295152380ed394a82c03b8e2.ctex"
uid="uid://cs5jk1312wauu"
path="res://.godot/imported/coin.svg-08623932cd6c1ab8a19bb6ae049240d0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/interactables/machines/solar_pannel/assets/sprites/panneau_solaire_1.png"
dest_files=["res://.godot/imported/panneau_solaire_1.png-b9a4049f295152380ed394a82c03b8e2.ctex"]
source_file="res://common/icons/coin.svg"
dest_files=["res://.godot/imported/coin.svg-08623932cd6c1ab8a19bb6ae049240d0.ctex"]
[params]
@@ -38,3 +38,6 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=2.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

1
common/icons/focus.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-focus"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M11.5 12a.5 .5 0 1 0 1 0a.5 .5 0 1 0 -1 0" fill="#ffffff" /><path d="M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /></svg>

After

Width:  |  Height:  |  Size: 415 B

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b1n8nad43usw4"
path="res://.godot/imported/panneau_solaire_2.png-479b68803815c59c599ff8c3a78ca895.ctex"
uid="uid://ba8vh5h3r6pr2"
path="res://.godot/imported/focus.svg-cc30e969e976522254107343300a103b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/interactables/machines/solar_pannel/assets/sprites/panneau_solaire_2.png"
dest_files=["res://.godot/imported/panneau_solaire_2.png-479b68803815c59c599ff8c3a78ca895.ctex"]
source_file="res://common/icons/focus.svg"
dest_files=["res://.godot/imported/focus.svg-cc30e969e976522254107343300a103b.ctex"]
[params]
@@ -38,3 +38,6 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=2.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-hand-stop"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M8 13v-7.5a1.5 1.5 0 0 1 3 0v6.5" /><path d="M11 5.5v-2a1.5 1.5 0 1 1 3 0v8.5" /><path d="M14 5.5a1.5 1.5 0 0 1 3 0v6.5" /><path d="M17 7.5a1.5 1.5 0 0 1 3 0v8.5a6 6 0 0 1 -6 6h-2h.208a6 6 0 0 1 -5.012 -2.7a69.74 69.74 0 0 1 -.196 -.3c-.312 -.479 -1.407 -2.388 -3.286 -5.728a1.5 1.5 0 0 1 .536 -2.022a1.867 1.867 0 0 1 2.28 .28l1.47 1.47" /></svg>

After

Width:  |  Height:  |  Size: 651 B

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://3slhocr5wy3w"
path="res://.godot/imported/hand-stop.svg-bc0d0e986bcb4b50bdd5686b5bff814b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://common/icons/hand-stop.svg"
dest_files=["res://.godot/imported/hand-stop.svg-bc0d0e986bcb4b50bdd5686b5bff814b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=2.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,13 @@
[gd_scene load_steps=8 format=3 uid="uid://dac5wte80dwj0"]
[ext_resource type="Script" uid="uid://bb44144ckt2w7" path="res://common/scene_manager/scripts/scene_manager.gd" id="1_1c0qu"]
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="2_c1lr7"]
[ext_resource type="Resource" uid="uid://bvksiaiocwob5" path="res://common/scene_manager/scenes/cockpit.tres" id="3_e28ni"]
[ext_resource type="Resource" uid="uid://bvgdq43fpl1xs" path="res://common/scene_manager/scenes/intro.tres" id="4_msho1"]
[ext_resource type="Resource" uid="uid://boqgwjyxyb45r" path="res://common/scene_manager/scenes/region.tres" id="5_ytog4"]
[ext_resource type="Resource" uid="uid://c27wenetitwm" path="res://common/scene_manager/scenes/region_selection.tres" id="6_chs32"]
[ext_resource type="Resource" uid="uid://diro74w272onp" path="res://common/scene_manager/scenes/title.tres" id="7_ol3d5"]
[node name="SceneManager" type="Node"]
script = ExtResource("1_1c0qu")
scenes = Array[ExtResource("2_c1lr7")]([ExtResource("3_e28ni"), ExtResource("4_msho1"), ExtResource("5_ytog4"), ExtResource("6_chs32"), ExtResource("7_ol3d5")])

View File

@@ -0,0 +1,10 @@
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://bvksiaiocwob5"]
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_tkiq8"]
[resource]
script = ExtResource("1_tkiq8")
scene_id = "COCKPIT"
scene_path = "res://stages/cockpit/cockpit.tscn"
mouse_captured = true
metadata/_custom_type_script = "uid://1ejbvr3431ac"

View File

@@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://bvgdq43fpl1xs"]
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_6ws88"]
[resource]
script = ExtResource("1_6ws88")
scene_id = "INTRO"
scene_path = "res://stages/intro/intro.tscn"
metadata/_custom_type_script = "uid://1ejbvr3431ac"

View File

@@ -0,0 +1,10 @@
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://boqgwjyxyb45r"]
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_10qbh"]
[resource]
script = ExtResource("1_10qbh")
scene_id = "REGION"
scene_path = "res://stages/terrain/region/region.tscn"
need_terrain_generated = true
metadata/_custom_type_script = "uid://1ejbvr3431ac"

View File

@@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://c27wenetitwm"]
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_smjh0"]
[resource]
script = ExtResource("1_smjh0")
scene_id = "REGION_SELECTION"
scene_path = "res://stages/region_selection/region_selection.tscn"
metadata/_custom_type_script = "uid://1ejbvr3431ac"

View File

@@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://diro74w272onp"]
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_48g2j"]
[resource]
script = ExtResource("1_48g2j")
scene_id = "TITLE"
scene_path = "res://stages/title_screen/title_screen.tscn"
metadata/_custom_type_script = "uid://1ejbvr3431ac"

View File

@@ -0,0 +1,7 @@
extends Resource
class_name Scene
@export var scene_id : String
@export_file_path() var scene_path : String
@export var mouse_captured := false
@export var need_terrain_generated := false

View File

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

View File

@@ -1,25 +1,38 @@
extends Node
const TITLE_SCREEN = "res://stages/title_screen/title_screen.tscn"
const PLANET_SCENE = "res://stages/terrain/planet/planet.tscn"
const TRUCK_SCENE = "res://stages/terrain/truck/truck.tscn"
const INTRO_SCENE = "res://stages/intro/intro.tscn"
const COCKPIT_SCENE = "res://stages/cockpit/cockpit.tscn"
const REGION_SELECTION_SCREEN = "res://stages/region_selection/region_selection.tscn"
@export var scenes : Array[Scene]
signal scene_loaded
signal scene_node_ready
signal scene_loaded(scene : Scene)
signal scene_node_ready(scene : Scene)
var loading_scene = false
var generating_node = false
var scene_to_load := ""
var next_scene_node : Node
@onready var current_scene_node : Node = get_tree().root.get_children().back()
func change_scene(scene_path : String, with_loading = true):
func search_scenes(scene_id : String) -> Scene:
var scene_pos : int = scenes.find_custom(
func (s : Scene):
return s.scene_id == scene_id
)
if scene_pos == -1:
return null
else :
return scenes[scene_pos]
func change_scene(scene_id : String, with_loading = true):
if loading_scene or generating_node:
await scene_node_ready
var scene = search_scenes(scene_id)
if not scene:
printerr("Scene %s not found" % scene_id)
return
GameInfo.game_data.actual_scene = scene
loading_scene = true
scene_to_load = scene_path
ResourceLoader.load_threaded_request(scene_to_load)
var scene_path_to_load = scene.scene_path
ResourceLoader.load_threaded_request(scene_path_to_load)
LoadingScreen.loading_text = "LOADING_SCENE"
var scene_to_hide = current_scene_node
if with_loading:
@@ -31,16 +44,16 @@ func change_scene(scene_path : String, with_loading = true):
if loading_scene:
await scene_loaded
next_scene_node = ResourceLoader.load_threaded_get(scene_to_load).instantiate()
next_scene_node = ResourceLoader.load_threaded_get(scene_path_to_load).instantiate()
if next_scene_node.has_method("hide"):
next_scene_node.hide()
get_tree().root.add_child(next_scene_node)
generating_node = true
if next_scene_node is Planet:
if scene.need_terrain_generated:
LoadingScreen.loading_text = "GENERATING_TERRAIN"
if generating_node:
await scene_node_ready
await scene_node_ready
if current_scene_node:
current_scene_node.queue_free()
@@ -48,23 +61,27 @@ func change_scene(scene_path : String, with_loading = true):
if current_scene_node.has_method("show"):
current_scene_node.show()
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED if scene.mouse_captured else Input.MOUSE_MODE_VISIBLE
if with_loading:
LoadingScreen.hide_loading_screen()
func _process(_delta):
if loading_scene:
var progress = []
var load_status := ResourceLoader.load_threaded_get_status(scene_to_load, progress)
var load_status := ResourceLoader.load_threaded_get_status(GameInfo.game_data.actual_scene.scene_path, progress)
LoadingScreen.loading_value = progress[0]
if load_status == ResourceLoader.THREAD_LOAD_LOADED:
loading_scene = false
scene_loaded.emit()
scene_loaded.emit(GameInfo.game_data.actual_scene)
if load_status == ResourceLoader.THREAD_LOAD_FAILED or load_status == ResourceLoader.THREAD_LOAD_INVALID_RESOURCE:
printerr()
elif generating_node:
if next_scene_node is Planet:
if next_scene_node is Region:
LoadingScreen.loading_value = next_scene_node.generated_value
if next_scene_node.is_generated:
generating_node = false
scene_node_ready.emit()
elif next_scene_node.is_node_ready():
generating_node = false
scene_node_ready.emit()
scene_node_ready.emit(GameInfo.game_data.actual_scene)

View File

@@ -2,33 +2,33 @@ class_name Math
static func get_chunk_from_pos(coord) -> Vector2i:
return Vector2i(
floori(coord.x / (Planet.CHUNK_TILE_SIZE * Planet.TILE_SIZE)),
floori(coord.y / (Planet.CHUNK_TILE_SIZE * Planet.TILE_SIZE))
floori(coord.x / (Region.CHUNK_TILE_SIZE * Region.TILE_SIZE)),
floori(coord.y / (Region.CHUNK_TILE_SIZE * Region.TILE_SIZE))
)
static func get_tile_from_pos(coord) -> Vector2i:
return Vector2i(
floori(coord.x / (Planet.TILE_SIZE)),
floori(coord.y / (Planet.TILE_SIZE)),
floori(coord.x / (Region.TILE_SIZE)),
floori(coord.y / (Region.TILE_SIZE)),
)
static func get_tiles_in_circle(center: Vector2, radius : float) -> Array[Vector2i]:
var tiles : Array[Vector2i] = []
for x in range(
floori((center.x - radius/2.) / Planet.TILE_SIZE),
ceili((center.x + radius/2.) / Planet.TILE_SIZE),
floori((center.x - radius/2.) / Region.TILE_SIZE),
ceili((center.x + radius/2.) / Region.TILE_SIZE),
):
for y in range(
floori((center.y - radius/2.) / Planet.TILE_SIZE),
ceili((center.y + radius/2.) / Planet.TILE_SIZE),
floori((center.y - radius/2.) / Region.TILE_SIZE),
ceili((center.y + radius/2.) / Region.TILE_SIZE),
):
if is_tile_on_circle(Vector2i(x,y), center, radius):
tiles.append(Vector2i(x,y))
return tiles
static func is_tile_on_circle(tile_coord : Vector2i, circle_center: Vector2, circle_radius : float) -> bool:
var absolute_tile_pos : Vector2 = tile_coord * Planet.TILE_SIZE
var absolute_tile_pos : Vector2 = tile_coord * Region.TILE_SIZE
# Loop over tile corners to know if the area collide
var corners : Array[Vector2] = []
@@ -36,8 +36,8 @@ static func is_tile_on_circle(tile_coord : Vector2i, circle_center: Vector2, cir
for y in [0,1]:
corners.append(
absolute_tile_pos
+ Vector2.RIGHT * x * Planet.TILE_SIZE
+ Vector2.DOWN * y * Planet.TILE_SIZE
+ Vector2.RIGHT * x * Region.TILE_SIZE
+ Vector2.DOWN * y * Region.TILE_SIZE
)
# Check if segment touch area

View File

@@ -0,0 +1,59 @@
class_name Random
const MIN_WORD_LEN = 4
const MAX_WORD_LEN = 8
const VOWEL = ["a","e","i","o","u","y"]
const CONSONANTS = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "z"]
static func generate_random_word(random_seed = randi()) -> String:
var word_len = randf_range(4,8)
var word = ''
var last_letter_is_vowel = false
for i in range(word_len):
if last_letter_is_vowel:
word += CONSONANTS.pick_random()
else:
word += VOWEL.pick_random()
last_letter_is_vowel = not last_letter_is_vowel
return word.capitalize()
static func mutate_word(word : String) -> String:
var rand_int = randi()
if len(word) > MIN_WORD_LEN and rand_int % 3 == 0:
return shorten_word(word)
elif len(word) < MAX_WORD_LEN and rand_int % 3 == 1:
return elongate_word(word)
return replace_character(word)
static func shorten_word(word : String):
if randi()%2 == 0:
return word.left(len(word) - 1).capitalize()
else :
return word.right(len(word) - 1).capitalize()
static func elongate_word(word : String):
if randi()%2 == 0:
var letter = CONSONANTS.pick_random() if word.left(1) in VOWEL else VOWEL.pick_random()
return (letter + word).capitalize()
else :
var letter = CONSONANTS.pick_random() if word.right(1) in VOWEL else VOWEL.pick_random()
return (word + letter).capitalize()
static func replace_character(word : String):
var character_id = randi_range(0, len(word))
var character = word[character_id]
if character in VOWEL:
character = VOWEL.pick_random()
else:
character = CONSONANTS.pick_random()
word[character_id] = character
return word

View File

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

View File

@@ -0,0 +1,85 @@
shader_type spatial;
render_mode unshaded, depth_draw_opaque, depth_prepass_alpha;
// Inspired by https://godotshaders.com/shader/3d-pixel-art-outline-highlight-post-processing-shader/
uniform sampler2D DEPTH_TEXTURE : hint_depth_texture, filter_linear_mipmap;
uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap;
uniform sampler2D NORMAL_TEXTURE : hint_normal_roughness_texture, filter_nearest;
uniform vec3 shadow_color : source_color = vec3(0.0);
uniform float shadow_thickness = 2.0;
vec2 getDepth(vec2 screen_uv, sampler2D depth_texture, mat4 inv_projection_matrix){
float raw_depth = texture(depth_texture, screen_uv)[0];
vec3 normalized_device_coordinates = vec3(screen_uv * 2.0 - 1.0, raw_depth);
vec4 view_space = inv_projection_matrix * vec4(normalized_device_coordinates, 1.0);
view_space.xyz /= view_space.w;
return vec2(-view_space.z, raw_depth);
}
void fragment() {
vec2 e = vec2(1./VIEWPORT_SIZE.xy)*1.0;
float depth_diff = 0.0;
float neg_depth_diff = .5;
vec2 depth_data = getDepth(SCREEN_UV, DEPTH_TEXTURE, INV_PROJECTION_MATRIX);
float depth = depth_data.x;
vec3 color = texture(SCREEN_TEXTURE, SCREEN_UV).rgb;
vec3 c = vec3(0.0);
vec2 min_depth_data = depth_data;
float min_depth = 9999999.9;
vec3 normal = texture(NORMAL_TEXTURE, SCREEN_UV).rgb * 2.0 - 1.0;
for (float x = -shadow_thickness; x <= shadow_thickness;x += 1.0){
for (float y = -shadow_thickness; y <= shadow_thickness; y += 1.0){
if ((x == 0.0 && y == 0.0) || (shadow_thickness*shadow_thickness < (x*x + y*y))){
continue;
}
vec2 du_data = getDepth(SCREEN_UV+1.0*vec2(x, y)*e, DEPTH_TEXTURE, INV_PROJECTION_MATRIX);
vec2 dd_data = getDepth(SCREEN_UV+0.5*vec2(x, y)*e, DEPTH_TEXTURE, INV_PROJECTION_MATRIX);
float du = du_data.x;
float dd = dd_data.x;
float dd_diff = clamp(abs((depth - dd) - (dd - du)), 0.0, 1.0);
float val = clamp(abs(depth - du), 0., 1.)/(x*x + y*y)*dd_diff*dd_diff*5000.0;
val = clamp(val, 0.0, 1.0);
depth_diff += val;
if (du < min_depth){
min_depth = du;
min_depth_data = du_data;
c = texture(SCREEN_TEXTURE, SCREEN_UV+vec2(x, y)*e).rgb;
c *= clamp(0.5+ 0.5*dot(normalize(vec2(x, y)), (vec2(0.0, 1.0))), 0.0, 1.0);
}
vec3 nu = texture(NORMAL_TEXTURE, SCREEN_UV+vec2(x, y)*e).rgb * 2.0 - 1.0;
depth_diff += (1.0-abs(dot(nu, normal)))/max(min(dd, depth), 2.0);
}
}
depth_diff = smoothstep(0.2, 0.3, depth_diff);
vec3 final = c*shadow_color;
ALBEDO = final;
float alpha_mask = depth_diff;
DEPTH = min_depth_data.y*alpha_mask + depth_data.y*(1.0-alpha_mask);
ALPHA = clamp((alpha_mask) * 5., 0., 1.);
}

View File

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

View File

@@ -0,0 +1,56 @@
shader_type spatial;
render_mode blend_premul_alpha, unshaded, ambient_light_disabled;
uniform sampler2D depth_texture : hint_depth_texture;
uniform int step_count : hint_range(3, 15, 2) = 3; // 2 samples per step
uniform float thickness : hint_range(1.0, 16.0, 0.1) = 3.0;
uniform vec3 edge_color : source_color = vec3(0.);
uniform float fade_start : hint_range(1.0, 1000.0, 0.1) = 100.0;
uniform float fade_length : hint_range(1.0, 1000.0, 0.1) = 200.0;
void fragment() {
// Setup step parameters
vec2 step_length = 1.0 / VIEWPORT_SIZE * thickness;
float step_angle = TAU / float(step_count);
// Per-pixel jitter to reduce patterning
float start_angle = fract(sin(dot(SCREEN_UV, vec2(12.9898, 78.233))) * 43758.5453) * TAU;
vec2 dir = vec2(cos(start_angle), sin(start_angle));
// step rotation matrix
mat2 rot = mat2(
vec2(cos(step_angle), -sin(step_angle)),
vec2(sin(step_angle), cos(step_angle)));
vec3 avg_dx = vec3(0.0);
vec3 avg_dy = vec3(0.0);
// save closest pixel to uniformly fade line.
float min_z = 1e6;
// Sample and average derivatives for all pairs
for (int i = 0; i < step_count; i++) {
vec2 uv1 = SCREEN_UV + dir * step_length;
vec2 uv2 = SCREEN_UV - dir * step_length;
float d1 = texture(depth_texture, uv1).r;
float d2 = texture(depth_texture, uv2).r;
vec4 up1 = INV_PROJECTION_MATRIX * vec4(uv1 * 2.0 - 1.0, d1, 1.0);
vec4 up2 = INV_PROJECTION_MATRIX * vec4(uv2 * 2.0 - 1.0, d2, 1.0);
vec3 p1 = up1.xyz / up1.w;
vec3 p2 = up2.xyz / up2.w;
min_z = min(min_z, min(-p1.z, -p2.z));
vec3 diff = p1 - p2;
avg_dx += diff * dir.x;
avg_dy += diff * dir.y;
dir = rot * dir; // rotate direction for next step
}
// fade outline width with distance
float distance_fade = 1e-4 + smoothstep(fade_start + fade_length, fade_start, min_z);
// Edge mask
float edge = 1.0 - smoothstep(0.1, 0.15, dot(normalize(cross(avg_dy, avg_dx)), VIEW));
// Small vignette at screen edges
edge *= smoothstep(0.00, 0.015 * thickness,
1.0 - max(abs(SCREEN_UV.x - 0.5), abs(SCREEN_UV.y - 0.5)) * 2.0);
// blend_premul_alpha avoids need to sample screentexture.
ALBEDO = edge_color * edge;
ALPHA = edge * distance_fade;
}

View File

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

View File

@@ -1,62 +0,0 @@
shader_type canvas_item;
uniform vec4 color : source_color = vec4(1.0);
uniform float width : hint_range(0, 10) = 1.0;
uniform int pattern : hint_range(0, 2) = 0; // diamond, circle, square
uniform bool inside = false;
uniform bool add_margins = true; // only useful when inside is false
void vertex() {
if (add_margins) {
VERTEX += (UV * 2.0 - 1.0) * width;
}
}
bool hasContraryNeighbour(vec2 uv, vec2 texture_pixel_size, sampler2D texture) {
for (float i = -ceil(width); i <= ceil(width); i++) {
float x = abs(i) > width ? width * sign(i) : i;
float offset;
if (pattern == 0) {
offset = width - abs(x);
} else if (pattern == 1) {
offset = floor(sqrt(pow(width + 0.5, 2) - x * x));
} else if (pattern == 2) {
offset = width;
}
for (float j = -ceil(offset); j <= ceil(offset); j++) {
float y = abs(j) > offset ? offset * sign(j) : j;
vec2 xy = uv + texture_pixel_size * vec2(x, y);
if ((xy != clamp(xy, vec2(0.0), vec2(1.0)) || texture(texture, xy).a <= 0.0) == inside) {
return true;
}
}
}
return false;
}
void fragment() {
vec2 uv = UV;
if (add_margins) {
vec2 texture_pixel_size = vec2(1.0) / (vec2(1.0) / TEXTURE_PIXEL_SIZE + vec2(width * 2.0));
uv = (uv - texture_pixel_size * width) * TEXTURE_PIXEL_SIZE / texture_pixel_size;
if (uv != clamp(uv, vec2(0.0), vec2(1.0))) {
COLOR.a = 0.0;
} else {
COLOR = texture(TEXTURE, uv);
}
} else {
COLOR = texture(TEXTURE, uv);
}
if ((COLOR.a > 0.0) == inside && hasContraryNeighbour(uv, TEXTURE_PIXEL_SIZE, TEXTURE)) {
COLOR.rgb = inside ? mix(COLOR.rgb, color.rgb, color.a) : color.rgb;
COLOR.a += (1.0 - COLOR.a) * color.a;
}
}

View File

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

Binary file not shown.

View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://lajbj05iuxut"
path="res://.godot/imported/baguera.wav-a0e2179506d9f51c2a553ff65014308b.sample"
[deps]
source_file="res://dialogs/characters/typing_sounds/baguera.wav"
dest_files=["res://.godot/imported/baguera.wav-a0e2179506d9f51c2a553ff65014308b.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://xkiwnglpsqi0"
path="res://.godot/imported/sigourney_weaver.wav-045b3fe21e9c1474adb4b65507740115.sample"
[deps]
source_file="res://dialogs/characters/typing_sounds/sigourney_weaver.wav"
dest_files=["res://.godot/imported/sigourney_weaver.wav-045b3fe21e9c1474adb4b65507740115.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View File

@@ -1,4 +1,4 @@
[gd_resource type="Resource" script_class="DialogicStyle" load_steps=21 format=3 uid="uid://cujoao6hdwng6"]
[gd_resource type="Resource" script_class="DialogicStyle" format=3 uid="uid://cujoao6hdwng6"]
[ext_resource type="PackedScene" uid="uid://cqpb3ie51rwl5" path="res://addons/dialogic/Modules/DefaultLayoutParts/Base_Default/default_layout_base.tscn" id="1_bc2c1"]
[ext_resource type="Script" uid="uid://bwg6yncmh2cml" path="res://addons/dialogic/Resources/dialogic_style_layer.gd" id="2_gjyq6"]

View File

@@ -6,71 +6,71 @@ const ITEM_SPRITE_SIZE = 40.
const SPRITE_SCENE : PackedScene = preload("res://entities/interactables/item_object/item_object_sprite.tscn")
@export var item : Item :
set(_item):
item = _item
if object_sprite:
object_sprite.apply_texture_to_sprite(item.icon, ITEM_SPRITE_SIZE)
object_sprite.generate_particles(item.get_particles())
set(_item):
item = _item
if object_sprite:
object_sprite.apply_texture_to_sprite(item.icon, ITEM_SPRITE_SIZE)
object_sprite.generate_particles(item.get_particles())
@onready var object_sprite : ItemObjectSprite = generate_sprite()
func _init(_item = null):
if _item:
item = _item
if _item:
item = _item
func _ready():
generate_collision(ITEM_AREA_WIDTH)
if item and object_sprite:
object_sprite.apply_texture_to_sprite(item.icon, ITEM_SPRITE_SIZE)
object_sprite.generate_particles(item.get_particles())
generate_collision(ITEM_AREA_WIDTH)
if item and object_sprite:
object_sprite.apply_texture_to_sprite(item.icon, ITEM_SPRITE_SIZE)
object_sprite.generate_particles(item.get_particles())
func pointer_text() -> String:
var name_suffix = ""
var name_suffix = ""
if item is Seed:
name_suffix = tr("SEED")
if item is Package:
name_suffix = tr("PACKAGE")
if item is Seed:
name_suffix = tr("SEED")
if item is Package:
name_suffix = tr("PACKAGE")
return item.name + (" " + name_suffix if name_suffix else "")
return item.name + (" " + name_suffix if name_suffix else "")
func interact_text():
return tr("TAKE")
return tr("TAKE")
func card_info() -> CardInfo:
return item.card_info()
return item.card_info()
func interact(player : Player) -> bool:
player.pick_item(item)
pickup_animation(player)
return true
player.pick_item(item)
pickup_animation(player)
return true
func pickup_animation(player : Player):
available = false
var tween : Tween = get_tree().create_tween()
available = false
var tween : Tween = get_tree().create_tween()
tween.tween_property(self, "position", player.position, 0.2)
tween.tween_callback(
func():
Pointer.stop_inspect(self)
queue_free()
)
if object_sprite:
object_sprite.pickup_animation()
tween.tween_property(self, "position", player.position, 0.2)
tween.tween_callback(
func():
Pointer.stop_inspect(self)
queue_free()
)
if object_sprite:
object_sprite.pickup_animation()
func generate_sprite() -> ItemObjectSprite:
var sprite_node = SPRITE_SCENE.instantiate() as ItemObjectSprite
add_child(sprite_node)
var sprite_node = SPRITE_SCENE.instantiate() as ItemObjectSprite
add_child(sprite_node)
if item:
sprite_node.apply_texture_to_sprite(
item.icon,
ITEM_SPRITE_SIZE
)
if item:
sprite_node.apply_texture_to_sprite(
item.icon,
ITEM_SPRITE_SIZE
)
return sprite_node
return sprite_node
func save() -> EntityData:
return ItemObjectData.new(self)
return ItemObjectData.new(self)

View File

@@ -3,9 +3,9 @@ class_name ItemObjectData
@export var item : Item
func _init(e : ItemObject):
func _init(e : ItemObject = ItemObject.new()):
position = e.global_position
item = e.item
func load() -> Entity:
func load_entity() -> Entity:
return ItemObject.new(item)

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dlrj7tyi5wfh8"
path="res://.godot/imported/truck_ladder.png-00d93dc49c0cc6457febb75d7b82dec4.ctex"
path="res://.godot/imported/truck_ladder.png-925870bf5fd0f6bfe7226189e1ff2e75.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/interactables/truck/assets/sprites/truck_ladder.png"
dest_files=["res://.godot/imported/truck_ladder.png-00d93dc49c0cc6457febb75d7b82dec4.ctex"]
source_file="res://entities/interactables/ladder/assets/truck_ladder.png"
dest_files=["res://.godot/imported/truck_ladder.png-925870bf5fd0f6bfe7226189e1ff2e75.ctex"]
[params]

View File

@@ -0,0 +1,170 @@
[gd_scene load_steps=12 format=3 uid="uid://cg1visg52i21a"]
[ext_resource type="Script" uid="uid://buimaomxu01wj" path="res://entities/interactables/ladder/scripts/ladder.gd" id="1_26qdk"]
[ext_resource type="Texture2D" uid="uid://dlrj7tyi5wfh8" path="res://entities/interactables/ladder/assets/truck_ladder.png" id="2_xila4"]
[ext_resource type="Texture2D" uid="uid://dex283rx00fjb" path="res://common/icons/logout.svg" id="3_214ms"]
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_hslnw"]
radius = 26.0
height = 112.0
[sub_resource type="AtlasTexture" id="AtlasTexture_gmirm"]
atlas = ExtResource("2_xila4")
region = Rect2(205, 157, 87, 208)
[sub_resource type="Animation" id="Animation_4ixvu"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(1, 1)]
}
[sub_resource type="Animation" id="Animation_214ms"]
resource_name = "Pulse"
length = 0.8
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:scale")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.4, 0.8),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1.4, 1.4), Vector2(1, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_px7p1"]
_data = {
&"Pulse": SubResource("Animation_214ms"),
&"RESET": SubResource("Animation_4ixvu")
}
[sub_resource type="Animation" id="Animation_bgoyn"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("TruckLadder:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(-1.25, -30)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Icon:self_modulate:a")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0.0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("TruckLadder:modulate:a")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0.0]
}
[sub_resource type="Animation" id="Animation_xvoyd"]
resource_name = "appear"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("TruckLadder:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.7),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(0, -108), Vector2(-1.25, -30)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Icon:self_modulate:a")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0.6666667, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0.0, 1.0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("TruckLadder:modulate:a")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0.0, 1.0]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_orxxj"]
_data = {
&"RESET": SubResource("Animation_bgoyn"),
&"appear": SubResource("Animation_xvoyd")
}
[node name="Ladder" type="Area2D"]
script = ExtResource("1_26qdk")
default_interact_text = "ENTER_TRUCK"
default_info_title = "TRUCK_ENTRANCE"
default_info_desc = "LADDER_DESC_TEXT"
metadata/_custom_type_script = "uid://dyprcd68fjstf"
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(-0.25, -28)
shape = SubResource("CapsuleShape2D_hslnw")
[node name="TruckLadder" type="Sprite2D" parent="."]
modulate = Color(1, 1, 1, 0)
position = Vector2(-1.25, -30)
scale = Vector2(0.5, 0.5)
texture = SubResource("AtlasTexture_gmirm")
[node name="Icon" type="Sprite2D" parent="."]
self_modulate = Color(1, 1, 1, 0)
position = Vector2(0.75, -29.000004)
texture = ExtResource("3_214ms")
[node name="IconAnimationPlayer" type="AnimationPlayer" parent="Icon"]
unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_px7p1")
}
autoplay = "RESET"
[node name="LadderAnimationPlayer" type="AnimationPlayer" parent="."]
unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_orxxj")
}

View File

@@ -0,0 +1,20 @@
extends Interactable
class_name Ladder
func _ready():
appear()
# hide()
GameInfo.game_data.current_region_data.updated.connect(
func (region_data : RegionData):
if region_data.get_state() == RegionData.State.SUCCEEDED or region_data.get_state() == RegionData.State.FAILED:
%IconAnimationPlayer.play("Pulse")
)
func appear():
show()
%LadderAnimationPlayer.play("appear")
func interact(p : Player):
p.region.save()
SceneManager.change_scene("COCKPIT")
return true

View File

@@ -1,27 +0,0 @@
extends Interactable
class_name Machine
const MAX_MACHINE_LEVEL = 3
var level : int = 1
var type : MachineType
func pointer_text() -> String:
return type.name
static func get_level_color(l : int) -> Color:
match l:
1: return Color("4ed38a")
2: return Color("4ec6ee")
3: return Color("bd70e2")
_: return Color("bd70e2")
static func instantiate_machine(machine_type : MachineType, machine_level = 1) -> Machine:
var new_machine : Machine = machine_type.scene.instantiate() as Machine
new_machine.level = machine_level
new_machine.type = machine_type
return new_machine
func save() -> EntityData:
return MachineData.new(self)

View File

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

View File

@@ -1,13 +0,0 @@
extends EntityData
class_name MachineData
@export var level : int
@export var type : MachineType
func _init(m : Machine):
position = m.global_position
level = m.level
type = m.type
func load() -> Entity:
return Machine.instantiate_machine(type, level)

View File

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

View File

@@ -1,6 +0,0 @@
extends Resource
class_name MachineType
@export var name : String
@export var scene : PackedScene
@export_multiline var description : String

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 657 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 KiB

View File

@@ -1,90 +0,0 @@
extends Machine
class_name SolarPanel
const ENERGY_ICON = preload("res://common/icons/bolt.svg")
var charged : bool = false
var recharge_days : int = 0
func get_days_to_recharge(l : int = level) -> int:
match l:
1: return 2
2: return 2
3: return 2
_: return 1
func get_energy_production(l : int = level) -> int:
match l:
1: return 1
2: return 2
3: return 3
_: return 1
# Méthode déclenchée par la classe planet
func _pass_day():
if not charged:
recharge_days += 1
if recharge_days >= get_days_to_recharge():
set_charged(true)
func set_charged(_charged = true, with_anim : bool = true):
charged = _charged
recharge_days = 0
if with_anim:
if charged:
%AnimationPlayer.play("charged")
else :
%AnimationPlayer.play_backwards("charged")
await %AnimationPlayer.animation_finished
%Flair.modulate = Color.WHITE if charged else Color.TRANSPARENT
%Pannels.modulate = Color.WHITE if charged else Color("6c6c6c")
func card_info() -> CardInfo:
var info = CardInfo.new(
pointer_text()
)
if default_info_desc != "":
var desc_section = CardSectionInfo.new(
tr("DESCRIPTION"),
default_info_desc
)
desc_section.title_icon = DESC_ICON
info.sections.append(
desc_section
)
var charged_text = tr("CHARGED")
if not charged and (get_days_to_recharge() - recharge_days) == 1:
charged_text = tr("1_DAY_BEFORE_CHARGE")
elif not charged and (get_days_to_recharge() - recharge_days) > 1:
charged_text = tr("%d_DAYS_BEFORE_CHARGE") % (get_days_to_recharge() - recharge_days)
info.stats.append(
CardStatInfo.new(
charged_text,
ENERGY_ICON
)
)
return info
func setup_machine_sprite():
# %Base.self_modulate = Machine.get_level_color(level)
pass
func interact_text():
return tr("RECHARGE_%d_ENERGY") % get_energy_production()
func can_interact(_p : Player) -> bool:
return charged
func interact(p : Player) -> bool:
p.recharge(get_energy_production())
set_charged(false)
return true
func save() -> EntityData:
return SolarPanelData.new(self)

View File

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

View File

@@ -1,19 +0,0 @@
extends MachineData
class_name SolarPanelData
@export var charged : bool = false
@export var recharge_days : int = 0
func _init(m : SolarPanel):
position = m.global_position
level = m.level
type = m.type
charged = m.charged
recharge_days = m.recharge_days
func load() -> Entity:
var sp = Machine.instantiate_machine(type, level) as SolarPanel
sp.set_charged(charged, false)
sp.recharge_days = recharge_days
return sp

View File

@@ -1,11 +0,0 @@
[gd_resource type="Resource" script_class="MachineType" load_steps=3 format=3 uid="uid://dew3p4fffjryo"]
[ext_resource type="Script" uid="uid://bepx311a3f0o" path="res://entities/interactables/machines/scripts/machine_type.gd" id="1_ctita"]
[ext_resource type="PackedScene" uid="uid://gwq2oos6ljyp" path="res://entities/interactables/machines/solar_pannel/solar_pannel.tscn" id="1_naexs"]
[resource]
script = ExtResource("1_ctita")
name = "SOLAR_PANNEL"
scene = ExtResource("1_naexs")
description = "SOLAR_PANNEL_DESCRIPTION_TEXT"
metadata/_custom_type_script = "uid://bepx311a3f0o"

View File

@@ -1,104 +0,0 @@
[gd_scene load_steps=9 format=3 uid="uid://gwq2oos6ljyp"]
[ext_resource type="Script" uid="uid://bjy8gc0eyl2ss" path="res://entities/interactables/machines/solar_pannel/scripts/solar_pannel.gd" id="1_t4vnu"]
[ext_resource type="Texture2D" uid="uid://b1n8nad43usw4" path="res://entities/interactables/machines/solar_pannel/assets/sprites/panneau_solaire_2.png" id="2_ny3sb"]
[ext_resource type="Texture2D" uid="uid://cqqlkm14lawpa" path="res://entities/interactables/machines/solar_pannel/assets/sprites/panneau_solaire_1.png" id="3_bml32"]
[ext_resource type="Texture2D" uid="uid://c22re5wfsm1ax" path="res://entities/interactables/machines/solar_pannel/assets/sprites/panneau_solaire_3.png" id="4_ob8kj"]
[sub_resource type="CircleShape2D" id="CircleShape2D_6utw7"]
radius = 48.0
[sub_resource type="Animation" id="Animation_77hon"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprites/Pannels:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.42352942, 0.42352942, 0.42352942, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprites/Flair:modulate")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 0)]
}
[sub_resource type="Animation" id="Animation_gal8b"]
resource_name = "charged"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprites/Pannels:modulate")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0.033333335, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(0.42365062, 0.42365065, 0.42365062, 1), Color(1, 1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprites/Flair:modulate")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_5vw1f"]
_data = {
&"RESET": SubResource("Animation_77hon"),
&"charged": SubResource("Animation_gal8b")
}
[node name="SolarPannel" type="Area2D"]
script = ExtResource("1_t4vnu")
default_interact_text = "USE"
default_info_title = "SOLAR_PANNEL"
default_info_desc = "SOLAR_PANNEL_DESCRIPTION_TEXT"
metadata/_custom_type_script = "uid://du7qppxobx5nd"
[node name="Sprites" type="Node2D" parent="."]
position = Vector2(15.999999, -16.999998)
scale = Vector2(0.09, 0.09)
[node name="Pannels" type="Sprite2D" parent="Sprites"]
unique_name_in_owner = true
modulate = Color(0.42352942, 0.42352942, 0.42352942, 1)
texture = ExtResource("2_ny3sb")
[node name="Base" type="Sprite2D" parent="Sprites"]
unique_name_in_owner = true
texture = ExtResource("3_bml32")
[node name="Flair" type="Sprite2D" parent="Sprites"]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
texture = ExtResource("4_ob8kj")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(6, -23)
shape = SubResource("CircleShape2D_6utw7")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_5vw1f")
}

View File

@@ -1,7 +0,0 @@
extends Interactable
class_name TruckLadder
func interact(p : Player):
p.planet.save()
SceneManager.change_scene(SceneManager.COCKPIT_SCENE)
return true

View File

@@ -1,33 +0,0 @@
[gd_scene load_steps=6 format=3 uid="uid://cg1visg52i21a"]
[ext_resource type="Script" uid="uid://buimaomxu01wj" path="res://entities/interactables/truck/ladder/scripts/truck_ladder.gd" id="1_26qdk"]
[ext_resource type="Texture2D" uid="uid://dlrj7tyi5wfh8" path="res://entities/interactables/truck/assets/sprites/truck_ladder.png" id="2_xila4"]
[ext_resource type="Texture2D" uid="uid://dex283rx00fjb" path="res://common/icons/logout.svg" id="3_214ms"]
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_hslnw"]
radius = 26.0
height = 112.0
[sub_resource type="AtlasTexture" id="AtlasTexture_gmirm"]
atlas = ExtResource("2_xila4")
region = Rect2(205, 157, 87, 208)
[node name="TruckLadder" type="Area2D"]
script = ExtResource("1_26qdk")
default_interact_text = "ENTER_TRUCK"
default_info_title = "TRUCK_ENTRANCE"
default_info_desc = "LADDER_DESC_TEXT"
metadata/_custom_type_script = "uid://dyprcd68fjstf"
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(-0.25, -28)
shape = SubResource("CapsuleShape2D_hslnw")
[node name="TruckLadder" type="Sprite2D" parent="."]
position = Vector2(-1.25, -30)
scale = Vector2(0.5, 0.5)
texture = SubResource("AtlasTexture_gmirm")
[node name="Bolt" type="Sprite2D" parent="."]
position = Vector2(0.75, -29.000004)
texture = ExtResource("3_214ms")

View File

@@ -1,20 +1,24 @@
extends Interactable
class_name TruckRecharge
func _ready():
if region:
%Bolt.modulate = Color.WHITE if region.data.charges > 0 else Color.RED
func can_interact(_p : Player) -> bool:
return (
planet != null
and planet.data
and planet.data.charges > 0
region != null
and region.data
and region.data.charges > 0
)
func interact(_p: Player) -> bool:
if can_interact(_p):
planet.data.charges -= 1
planet.pass_day()
region.data.charges -= 1
region.pass_day()
%Bolt.modulate = Color.WHITE if planet.data.charges > 0 else Color.RED
%Bolt.modulate = Color.WHITE if region.data.charges > 0 else Color.RED
return true
return false

View File

@@ -1,7 +1,7 @@
[gd_scene load_steps=6 format=3 uid="uid://d324mlmgls4fs"]
[ext_resource type="Script" uid="uid://bsrn3gd2a532q" path="res://entities/interactables/truck/recharge/scripts/truck_recharge.gd" id="1_ipgcv"]
[ext_resource type="Texture2D" uid="uid://dlrj7tyi5wfh8" path="res://entities/interactables/truck/assets/sprites/truck_ladder.png" id="2_87dtp"]
[ext_resource type="Texture2D" uid="uid://dlrj7tyi5wfh8" path="res://entities/interactables/ladder/assets/truck_ladder.png" id="2_87dtp"]
[ext_resource type="Texture2D" uid="uid://dcgnamu7sb3ov" path="res://common/icons/bolt.svg" id="3_jcfmm"]
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_bjhct"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://d2p7h0aga85tn"
path="res://.godot/imported/truck_interior.png-ff9bd2d0107d83f7c4209d959ee69f15.ctex"
uid="uid://b0kllgnpxuh54"
path="res://.godot/imported/dead.png-ef8b87be14a560f3ce6b4050f956f227.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://stages/terrain/truck/assets/sprite/truck_interior.png"
dest_files=["res://.godot/imported/truck_interior.png-ff9bd2d0107d83f7c4209d959ee69f15.ctex"]
source_file="res://entities/plants/assets/sprites/default/dead.png"
dest_files=["res://.godot/imported/dead.png-ef8b87be14a560f3ce6b4050f956f227.ctex"]
[params]

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://c00jac2jlgdfu"
path="res://.godot/imported/growing.png-47abe743f83ddd7bdc16b98f9d66692f.ctex"
path="res://.godot/imported/growing.png-3f6fb3171589f3a22ebfeda1a4575199.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/plants/assets/sprites/solita/growing.png"
dest_files=["res://.godot/imported/growing.png-47abe743f83ddd7bdc16b98f9d66692f.ctex"]
source_file="res://entities/plants/assets/sprites/default/growing.png"
dest_files=["res://.godot/imported/growing.png-3f6fb3171589f3a22ebfeda1a4575199.ctex"]
[params]

View File

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 169 KiB

View File

@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b3wom2xu26g43"
path="res://.godot/imported/mature.png-834a1cd5820fc22805f96d5019fd7c30.ctex"
path="res://.godot/imported/mature.png-f8b2b72a84e90cfc6bf925d1d48f7f7e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/plants/assets/sprites/solita/mature.png"
dest_files=["res://.godot/imported/mature.png-834a1cd5820fc22805f96d5019fd7c30.ctex"]
source_file="res://entities/plants/assets/sprites/default/mature.png"
dest_files=["res://.godot/imported/mature.png-f8b2b72a84e90cfc6bf925d1d48f7f7e.ctex"]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bruce7ds0u8i1"
path="res://.godot/imported/seed.png-634c35552c5b52a8d7f2a15b4c2c65e4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://entities/plants/assets/sprites/default/seed.png"
dest_files=["res://.godot/imported/seed.png-634c35552c5b52a8d7f2a15b4c2c65e4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -0,0 +1,6 @@
[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://m48oo6cqbq37"]
[ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="1_v3qq7"]
[resource]
atlas = ExtResource("1_v3qq7")

View File

@@ -1,28 +0,0 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://cxrc5wchpqm18"]
[ext_resource type="Script" uid="uid://ceqx5va1ormau" path="res://entities/plants/scripts/plant_effects/produce_seeds.gd" id="1_cf34j"]
[ext_resource type="Script" uid="uid://jnye5pe1bgqw" path="res://entities/plants/scripts/plant_type.gd" id="1_ipcpv"]
[ext_resource type="Script" uid="uid://bpycohqas4hff" path="res://entities/plants/scripts/plant_effect.gd" id="1_l2hi3"]
[ext_resource type="Texture2D" uid="uid://dmsls8siudy1u" path="res://entities/plants/assets/sprites/champ/growing.png" id="2_l2hi3"]
[ext_resource type="Texture2D" uid="uid://crc4aop6ajiau" path="res://entities/plants/assets/sprites/champ/mature.png" id="3_y8qve"]
[ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="6_liopn"]
[sub_resource type="Resource" id="Resource_cf34j"]
script = ExtResource("1_cf34j")
level = 2
metadata/_custom_type_script = "uid://ceqx5va1ormau"
[sub_resource type="AtlasTexture" id="AtlasTexture_my6by"]
atlas = ExtResource("6_liopn")
region = Rect2(610, 315, 124, 180)
[resource]
script = ExtResource("1_ipcpv")
name = "Champ"
description = "A cool fluorescent mushroom that reproduce very fast."
default_growing_time = 3
seed_texture = SubResource("AtlasTexture_my6by")
growing_texture = ExtResource("2_l2hi3")
mature_texture = ExtResource("3_y8qve")
mature_effects = Array[ExtResource("1_l2hi3")]([SubResource("Resource_cf34j")])
metadata/_custom_type_script = "uid://jnye5pe1bgqw"

View File

@@ -1,34 +0,0 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=11 format=3 uid="uid://b04vho33bl52b"]
[ext_resource type="Script" uid="uid://bpycohqas4hff" path="res://entities/plants/scripts/plant_effect.gd" id="1_40c3e"]
[ext_resource type="Script" uid="uid://jnye5pe1bgqw" path="res://entities/plants/scripts/plant_type.gd" id="1_moyj3"]
[ext_resource type="Texture2D" uid="uid://c7mp7tkkkk6o5" path="res://entities/plants/assets/sprites/chardi/growing.png" id="1_prk5s"]
[ext_resource type="Script" uid="uid://ceqx5va1ormau" path="res://entities/plants/scripts/plant_effects/produce_seeds.gd" id="2_prk5s"]
[ext_resource type="Texture2D" uid="uid://bupl1y0cfj21q" path="res://entities/plants/assets/sprites/chardi/mature.png" id="3_40c3e"]
[ext_resource type="Script" uid="uid://cgscbuxe4dawb" path="res://entities/plants/scripts/plant_effects/decontaminate_terrain_effect.gd" id="3_ajihu"]
[ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="6_cky1j"]
[sub_resource type="Resource" id="Resource_40c3e"]
script = ExtResource("2_prk5s")
level = 2
metadata/_custom_type_script = "uid://ceqx5va1ormau"
[sub_resource type="Resource" id="Resource_ajihu"]
script = ExtResource("3_ajihu")
level = 1
metadata/_custom_type_script = "uid://cgscbuxe4dawb"
[sub_resource type="AtlasTexture" id="AtlasTexture_qt76e"]
atlas = ExtResource("6_cky1j")
region = Rect2(1140, 345, 141, 128)
[resource]
script = ExtResource("1_moyj3")
name = "Chardi"
description = "This fern use the bas component of the ground to grow."
seed_texture = SubResource("AtlasTexture_qt76e")
growing_texture = ExtResource("1_prk5s")
mature_texture = ExtResource("3_40c3e")
harvest_effects = Array[ExtResource("1_40c3e")]([SubResource("Resource_40c3e")])
mature_effects = Array[ExtResource("1_40c3e")]([SubResource("Resource_ajihu")])
metadata/_custom_type_script = "uid://jnye5pe1bgqw"

View File

@@ -1,33 +0,0 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=11 format=3 uid="uid://djap3rggcdf3r"]
[ext_resource type="Script" uid="uid://bpycohqas4hff" path="res://entities/plants/scripts/plant_effect.gd" id="1_srjq6"]
[ext_resource type="Script" uid="uid://jnye5pe1bgqw" path="res://entities/plants/scripts/plant_type.gd" id="2_72r72"]
[ext_resource type="Script" uid="uid://ceqx5va1ormau" path="res://entities/plants/scripts/plant_effects/produce_seeds.gd" id="2_rb4mq"]
[ext_resource type="Script" uid="uid://cgscbuxe4dawb" path="res://entities/plants/scripts/plant_effects/decontaminate_terrain_effect.gd" id="3_s6g12"]
[ext_resource type="Texture2D" uid="uid://ds1nf2876m6bh" path="res://entities/plants/assets/sprites/ferno/growing.png" id="4_5qaoo"]
[ext_resource type="Texture2D" uid="uid://bfj6wji21amgk" path="res://entities/plants/assets/sprites/ferno/mature.png" id="5_er4cp"]
[ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="7_0y7r8"]
[sub_resource type="Resource" id="Resource_rb4mq"]
script = ExtResource("2_rb4mq")
level = 2
metadata/_custom_type_script = "uid://ceqx5va1ormau"
[sub_resource type="Resource" id="Resource_s6g12"]
script = ExtResource("3_s6g12")
level = 1
metadata/_custom_type_script = "uid://cgscbuxe4dawb"
[sub_resource type="AtlasTexture" id="AtlasTexture_g1td4"]
atlas = ExtResource("7_0y7r8")
region = Rect2(57, 620, 159, 99)
[resource]
script = ExtResource("2_72r72")
name = "Ferno"
description = "This mysterious flower emmit a strong signal in the ground when harvested."
seed_texture = SubResource("AtlasTexture_g1td4")
growing_texture = ExtResource("4_5qaoo")
mature_texture = ExtResource("5_er4cp")
harvest_effects = Array[ExtResource("1_srjq6")]([SubResource("Resource_rb4mq"), SubResource("Resource_s6g12")])
metadata/_custom_type_script = "uid://jnye5pe1bgqw"

View File

@@ -1,27 +0,0 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://dsctivn1vrem2"]
[ext_resource type="Script" uid="uid://bpycohqas4hff" path="res://entities/plants/scripts/plant_effect.gd" id="1_740j2"]
[ext_resource type="Script" uid="uid://jnye5pe1bgqw" path="res://entities/plants/scripts/plant_type.gd" id="1_eqtut"]
[ext_resource type="Texture2D" uid="uid://dwr3c6r6piwaa" path="res://entities/plants/assets/sprites/maias/growing.png" id="1_vyplc"]
[ext_resource type="Script" uid="uid://ceqx5va1ormau" path="res://entities/plants/scripts/plant_effects/produce_seeds.gd" id="2_740j2"]
[ext_resource type="Texture2D" uid="uid://d3apfwbqsg5ha" path="res://entities/plants/assets/sprites/maias/mature.png" id="3_pi4ie"]
[ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="6_mwrj8"]
[sub_resource type="Resource" id="Resource_740j2"]
script = ExtResource("2_740j2")
level = 3
metadata/_custom_type_script = "uid://ceqx5va1ormau"
[sub_resource type="AtlasTexture" id="AtlasTexture_sri3b"]
atlas = ExtResource("6_mwrj8")
region = Rect2(1697, 331, 125, 158)
[resource]
script = ExtResource("1_eqtut")
name = "Maias"
description = "This gorgeous flower produce a lot of seeds when harvested."
seed_texture = SubResource("AtlasTexture_sri3b")
growing_texture = ExtResource("1_vyplc")
mature_texture = ExtResource("3_pi4ie")
harvest_effects = Array[ExtResource("1_740j2")]([SubResource("Resource_740j2")])
metadata/_custom_type_script = "uid://jnye5pe1bgqw"

View File

@@ -1,29 +0,0 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://dr4omh4gf85hl"]
[ext_resource type="Script" uid="uid://bpycohqas4hff" path="res://entities/plants/scripts/plant_effect.gd" id="1_mi4ef"]
[ext_resource type="Script" uid="uid://ceqx5va1ormau" path="res://entities/plants/scripts/plant_effects/produce_seeds.gd" id="2_jyjjp"]
[ext_resource type="Script" uid="uid://jnye5pe1bgqw" path="res://entities/plants/scripts/plant_type.gd" id="2_lqh06"]
[ext_resource type="Texture2D" uid="uid://dna7x371cs0tu" path="res://entities/plants/assets/sprites/philea/growing.png" id="3_n0hvm"]
[ext_resource type="Texture2D" uid="uid://bj801geprrhfu" path="res://entities/plants/assets/sprites/philea/mature.png" id="4_cafy4"]
[ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="6_oaspo"]
[sub_resource type="Resource" id="Resource_jyjjp"]
script = ExtResource("2_jyjjp")
level = 1
metadata/_custom_type_script = "uid://ceqx5va1ormau"
[sub_resource type="AtlasTexture" id="AtlasTexture_ogrgq"]
atlas = ExtResource("6_oaspo")
region = Rect2(322, 598, 159, 136)
[resource]
script = ExtResource("2_lqh06")
name = "Philea"
description = "A very cool shurb that glow in the night."
default_growing_time = 5
default_plant_score = 3
seed_texture = SubResource("AtlasTexture_ogrgq")
growing_texture = ExtResource("3_n0hvm")
mature_texture = ExtResource("4_cafy4")
mature_effects = Array[ExtResource("1_mi4ef")]([SubResource("Resource_jyjjp")])
metadata/_custom_type_script = "uid://jnye5pe1bgqw"

View File

@@ -1,35 +0,0 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=11 format=3 uid="uid://c5oxxif3h5yxo"]
[ext_resource type="Script" uid="uid://bpycohqas4hff" path="res://entities/plants/scripts/plant_effect.gd" id="1_8fstu"]
[ext_resource type="Script" uid="uid://jnye5pe1bgqw" path="res://entities/plants/scripts/plant_type.gd" id="1_vn146"]
[ext_resource type="Script" uid="uid://cgscbuxe4dawb" path="res://entities/plants/scripts/plant_effects/decontaminate_terrain_effect.gd" id="2_8fstu"]
[ext_resource type="Texture2D" uid="uid://xw47qw12d3dv" path="res://entities/plants/assets/sprites/pili/growing.png" id="2_k4b1k"]
[ext_resource type="Texture2D" uid="uid://4mh1w1f4q2sa" path="res://entities/plants/assets/sprites/pili/mature.png" id="3_8fstu"]
[ext_resource type="Script" uid="uid://ceqx5va1ormau" path="res://entities/plants/scripts/plant_effects/produce_seeds.gd" id="3_26e4l"]
[ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="5_26e4l"]
[sub_resource type="Resource" id="Resource_8fstu"]
script = ExtResource("3_26e4l")
level = 2
metadata/_custom_type_script = "uid://ceqx5va1ormau"
[sub_resource type="Resource" id="Resource_26e4l"]
script = ExtResource("2_8fstu")
level = 2
metadata/_custom_type_script = "uid://cgscbuxe4dawb"
[sub_resource type="AtlasTexture" id="AtlasTexture_kidty"]
atlas = ExtResource("5_26e4l")
region = Rect2(1415, 91, 149, 102)
[resource]
script = ExtResource("1_vn146")
name = "Pili"
description = "This cool plant produce softs and warms blue flames."
default_growing_time = 3
seed_texture = SubResource("AtlasTexture_kidty")
growing_texture = ExtResource("2_k4b1k")
mature_texture = ExtResource("3_8fstu")
harvest_effects = Array[ExtResource("1_8fstu")]([SubResource("Resource_8fstu")])
mature_effects = Array[ExtResource("1_8fstu")]([SubResource("Resource_26e4l")])
metadata/_custom_type_script = "uid://jnye5pe1bgqw"

View File

@@ -1,29 +0,0 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://cuk3hl5tkjhmg"]
[ext_resource type="Script" uid="uid://bpycohqas4hff" path="res://entities/plants/scripts/plant_effect.gd" id="1_mksys"]
[ext_resource type="Script" uid="uid://ceqx5va1ormau" path="res://entities/plants/scripts/plant_effects/produce_seeds.gd" id="2_1q5bp"]
[ext_resource type="Script" uid="uid://jnye5pe1bgqw" path="res://entities/plants/scripts/plant_type.gd" id="2_x4nie"]
[ext_resource type="Texture2D" uid="uid://c00jac2jlgdfu" path="res://entities/plants/assets/sprites/solita/growing.png" id="3_j4n5p"]
[ext_resource type="Texture2D" uid="uid://b3wom2xu26g43" path="res://entities/plants/assets/sprites/solita/mature.png" id="4_njidq"]
[ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="6_yn0yu"]
[sub_resource type="Resource" id="Resource_j4n5p"]
script = ExtResource("2_1q5bp")
level = 2
metadata/_custom_type_script = "uid://ceqx5va1ormau"
[sub_resource type="AtlasTexture" id="AtlasTexture_auuc2"]
atlas = ExtResource("6_yn0yu")
region = Rect2(335, 74, 134, 142)
[resource]
script = ExtResource("2_x4nie")
name = "Solita"
description = "A magnificient flower that reflect the light of nearest star."
default_growing_time = 3
default_plant_score = 2
seed_texture = SubResource("AtlasTexture_auuc2")
growing_texture = ExtResource("3_j4n5p")
mature_texture = ExtResource("4_njidq")
harvest_effects = Array[ExtResource("1_mksys")]([SubResource("Resource_j4n5p")])
metadata/_custom_type_script = "uid://jnye5pe1bgqw"

View File

@@ -1,205 +1,170 @@
extends InspectableEntity
class_name Plant
signal harvested(p: Plant)
signal state_changed(p: Plant)
const PLANT_AREA_RADIUS = 20
const PLANT_INFLUENCE_RADIUS = 100
const HARVESTED_SEED_DISPLACEMENT_FACTOR = 100
const RANDOM_MAX_GROW_INTERVAL = Planet.MIN_PASS_DAY_ANIMATION_TIME/2. - 0.1
const RANDOM_MAX_GROW_INTERVAL = Region.MIN_PASS_DAY_ANIMATION_TIME/2. - 0.1
const PLANT_TYPE_ICON = preload("res://common/icons/seedling.svg")
const PLANT_POINT_ICON = preload("res://common/icons/growth.svg")
const LIFETIME_ICON = preload("res://common/icons/calendar-week.svg")
const SHOVEL_ICON = preload("res://common/icons/shovel.svg")
const GROWING_ICON = preload("res://common/icons/chevrons-up.svg")
const DEATH_ICON = preload("res://common/icons/skull.svg")
const SPRITE_SCENE : PackedScene = preload("res://entities/plants/plant_sprite.tscn")
enum State {PLANTED, GROWING, MATURE}
@export var plant_type: PlantType
var state: State = State.PLANTED
@export var day: int
@export var data : PlantData
@onready var plant_sprite: PlantSprite
@onready var collision_shape: CollisionShape2D
@onready var influence_zone : PlantInfluenceZone
var plant_score = 0
var plant_mutations : Array[PlantMutation] = []
func _init(
_plant_type : PlantType,
_plant_mutations : Array[PlantMutation] = [],
_day = 0,
_data : PlantData
):
plant_type = _plant_type
day = _day
plant_mutations = _plant_mutations
data = _data
func _ready():
plant_sprite = generate_sprite()
collision_shape = generate_collision_shape()
influence_zone = generate_influence_zone()
plant_sprite = generate_sprite()
collision_shape = generate_collision_shape()
influence_zone = generate_influence_zone()
update_plant(false)
plant_sprite.update_plant_sprite(self, false)
plant_sprite.update_plant_sprite(data, false)
func pointer_text() -> String:
return plant_type.name
return data.plant_name
func inspect(is_inspected : bool = true):
plant_sprite.modulate = MODULATE_INSPECTED_COLOR if is_inspected else default_modulate
influence_zone.show_influence = is_inspected
plant_sprite.modulate = MODULATE_INSPECTED_COLOR if is_inspected else default_modulate
influence_zone.show_influence = is_inspected
func affect_preview(is_affected : bool = true):
plant_sprite.modulate = MODULATE_AFFECTED_COLOR if is_affected else default_modulate
plant_sprite.modulate = MODULATE_AFFECTED_COLOR if is_affected else default_modulate
func generate_sprite() -> PlantSprite:
var sprite_object : PlantSprite = SPRITE_SCENE.instantiate()
var sprite_object : PlantSprite = SPRITE_SCENE.instantiate()
add_child(sprite_object)
sprite_object.generate_mutation_effects(self)
add_child(sprite_object)
sprite_object.generate_mutation_effects(self)
return sprite_object
return sprite_object
func generate_collision_shape() -> CollisionShape2D:
var collision = CollisionShape2D.new()
var shape = CircleShape2D.new()
shape.radius = PLANT_AREA_RADIUS
var collision = CollisionShape2D.new()
var shape = CircleShape2D.new()
shape.radius = PLANT_AREA_RADIUS
collision.shape = shape
add_child(collision)
collision.shape = shape
add_child(collision)
return collision
return collision
func generate_influence_zone() -> PlantInfluenceZone:
var zone = PlantInfluenceZone.new(PLANT_INFLUENCE_RADIUS)
var zone = PlantInfluenceZone.new(PLANT_INFLUENCE_RADIUS)
add_child(zone)
add_child(zone)
return zone
return zone
# Méthode déclenchée par la classe planet
# Méthode déclenchée par la classe region
func _pass_day():
await get_tree().create_timer(randf_range(0., RANDOM_MAX_GROW_INTERVAL)).timeout
if state == State.MATURE and len(plant_type.cyclic_effects):
for effect in plant_type.cyclic_effects:
effect.effect(self)
var old_state = state
await get_tree().create_timer(randf_range(0., RANDOM_MAX_GROW_INTERVAL)).timeout
var last_state = data.get_state()
day += 1
update_plant()
data.day += 1
for m in data.mutations:
m._start_day_effect(self)
if old_state != state and state == State.MATURE:
for effect in plant_type.mature_effects:
if effect : effect.effect(self)
for effect in plant_type.cyclic_effects:
if effect : effect.effect(self)
match data.get_state():
PlantData.State.MATURE:
if last_state != PlantData.State.MATURE:
mature()
PlantData.State.DEAD:
die()
plant_sprite.update_plant_sprite(data, last_state != data.get_state())
func update_plant(with_animation : bool = true):
if day + 1 > calculate_grow_time():
if state != State.MATURE:
change_state(State.MATURE, with_animation)
elif day == 0:
change_state(State.PLANTED, with_animation)
else:
if state != State.GROWING:
change_state(State.GROWING, with_animation)
func calculate_plant_score(
overwite_state : State = state
with_state : PlantData.State = data.get_state()
) -> int:
var mutated_plant_score = plant_type.default_plant_score if overwite_state == State.MATURE else 0
for m in plant_mutations:
mutated_plant_score = m.mutate_score(overwite_state, self, mutated_plant_score)
return mutated_plant_score
func calculate_grow_time() -> int:
var mutated_grow_time = plant_type.default_growing_time
for m in plant_mutations:
mutated_grow_time = m.mutate_grow_time(self, mutated_grow_time)
return max(1, mutated_grow_time)
func change_state(_state: State, with_animation : bool = true):
if state != _state:
state = _state
plant_sprite.update_plant_sprite(self, with_animation)
state_changed.emit(self)
return data.get_score(with_state)
func harvest():
if state == State.MATURE:
for effect in plant_type.harvest_effects:
if effect : effect.effect(self)
for i in range(data.get_random_seed_income()):
produce_seed()
plant_sprite.start_harvest_animation()
await plant_sprite.harvest_animation_finished
harvested.emit(self)
queue_free()
if data.get_state() == PlantData.State.MATURE:
for m in data.mutations:
m._start_harvested_effect(self)
plant_sprite.start_harvest_animation()
await plant_sprite.harvest_animation_finished
disappear()
func produce_seed():
region.drop_item(
Seed.generate_from_parent(data),
global_position,
HARVESTED_SEED_DISPLACEMENT_FACTOR,
)
func mature():
for m in data.mutations:
m._start_maturation_effect(self)
func die():
for m in data.mutations:
m._start_dead_effect(self)
for i in range(data.get_random_seed_income()):
produce_seed()
disappear()
func disappear():
data.disappear()
queue_free()
func save() -> EntityData:
return PlantData.new(self)
return data
func card_info() -> CardInfo:
var info = CardInfo.new(
pointer_text()
)
var info = CardInfo.new(
data.plant_name,
data.archetype.archetype_name
)
info.important_stat_icon = PLANT_POINT_ICON
info.important_stat_text = "%d" % calculate_plant_score()
info.texture = plant_type.mature_texture
info.type_icon = PLANT_TYPE_ICON
var state = data.get_state()
var state_text = tr("MATURE")
if state != State.MATURE:
state_text = tr("GROWING")
info.important_stat_icon = PLANT_POINT_ICON
info.important_stat_text = "%d" % calculate_plant_score()
info.type_icon = PLANT_TYPE_ICON
info.stats.append(CardStatInfo.new(
tr("DAY_%d") % day,
LIFETIME_ICON
))
var state_text = tr("MATURE")
if state != PlantData.State.MATURE:
state_text = tr("GROWING")
info.stats.append(CardStatInfo.new(
state_text,
PLANT_TYPE_ICON
))
info.stats.append_array([
CardStatInfo.new(
str(data.day),
LIFETIME_ICON
),
CardStatInfo.new(
str(data.get_growing_time()),
GROWING_ICON
),
CardStatInfo.new(
str(data.get_lifetime()),
DEATH_ICON
),
])
if state != State.MATURE:
info.stats.append(CardStatInfo.new(
tr("MATURE_ON_DAY_%d") % calculate_grow_time(),
GROWING_ICON
))
if len(data.mutations) != 0:
for m in data.mutations:
info.sections.append(m.card_section())
info.stats.append(CardStatInfo.new(
tr("%d_SCORE_WHEN_MATURE") % calculate_plant_score(State.MATURE),
PLANT_POINT_ICON
))
if len(plant_mutations) != 0:
var rarest : int = plant_mutations.map(
func(m : PlantMutation) : return m.get_rarity()
).max()
info.bg_color = PlantMutation.get_rarity_color(rarest)
for m in plant_mutations:
info.sections.append(m.card_section())
info.sections.append_array(PlantEffect.card_effect_sections(
plant_type.mature_effects,
plant_type.harvest_effects,
plant_type.cyclic_effects,
))
return info
return info

View File

@@ -0,0 +1,27 @@
@tool
extends Resource
class_name PlantArchetype
@export var archetype_name = Random.generate_random_word()
@export var texture_builder = TextureBuilder.new()
@export var plant_area_radius = 20
@export var plant_influence_radius = 100
@export var growing_time= 2
@export var lifetime = 8
@export var base_score = 1
@export var seed_number = 2
@export var seed_random_loose = 1
@export var available_mutations : Array[PlantMutation] = [
AncientMutation.new(),
PrecociousMutation.new(),
QualityMutation.new(),
QuickMutation.new()
]
static func get_all() -> Array[PlantArchetype]:
return [
PlantArchetype.new()
]
static func get_random() -> PlantArchetype:
return get_all().pick_random()

View File

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

View File

@@ -1,20 +1,114 @@
extends EntityData
class_name PlantData
var plant_type : PlantType
var plant_mutations : Array[PlantMutation]
var day : int
signal updated(p : PlantData)
signal disappeared(p : PlantData)
func _init(plant : Plant):
position = plant.global_position
plant_type = plant.plant_type
plant_mutations = plant.plant_mutations
day = plant.day
enum State {PLANTED, GROWING, MATURE, DEAD}
func load() -> Entity:
var plant = Plant.new(
plant_type,
plant_mutations,
day
@export var archetype: PlantArchetype
@export var plant_name : String
@export var mutations : Array[PlantMutation]
@export var day : int :
set(v):
day = v
updated.emit(self)
@export var random_seed : int
@export var leafs = 0 # +1 score
@export var roots = 0 # +1 lifetime
func _init(
_position : Vector2 = Vector2.ZERO,
_archetype : PlantArchetype = PlantArchetype.get_random(),
_plant_name : String = Random.generate_random_word(),
_mutations : Array[PlantMutation] = [],
_day : int = 0,
_random_seed = randi()
):
position = _position
archetype = _archetype
plant_name = _plant_name
mutations = _mutations
day = _day
random_seed = _random_seed
for m in mutations:
m.mutate_plant_data(self)
static func generate_from_seed(plant_seed : Seed, plant_position : Vector2) -> PlantData:
return PlantData.new(
plant_position,
plant_seed.plant_archetype,
plant_seed.plant_name,
plant_seed.plant_mutations
)
return plant
func load_entity() -> Entity:
var plant = Plant.new(
self
)
return plant
func get_lifetime() -> int:
var lifetime = archetype.lifetime + roots
for m in mutations:
lifetime = m.mutate_lifetime(self, lifetime)
return lifetime
func get_growing_time() -> int:
var growing_time = archetype.growing_time
for m in mutations:
growing_time = m.mutate_growing_time(self, growing_time)
return growing_time
func get_score(state : State = get_state()) -> int:
var score = archetype.base_score + leafs if state == State.MATURE else 0
for m in mutations:
score = m.mutate_score(self, score)
return score
func get_state() -> State:
if day >= get_lifetime():
return State.DEAD
elif day == 0:
return State.PLANTED
elif day < archetype.growing_time:
return State.GROWING
return State.MATURE
func get_plant_texture() -> Texture:
return archetype.texture_builder.build_plant_texture(self)
func get_seed_texture():
return archetype.texture_builder.build_seed_texture(random_seed)
func get_seed_number(state = get_state()):
var seed_number = archetype.seed_number if (state == State.MATURE or state == State.DEAD) else 0
for m in mutations:
seed_number = m.mutate_seed_number(self, seed_number)
return seed_number
func get_seed_random_loose():
var seed_random_loose = archetype.seed_random_loose
for m in mutations:
seed_random_loose = m.mutate_seed_random_loose(self, seed_random_loose)
return seed_random_loose
func get_random_seed_income():
return max(
get_seed_number() - randi_range(0, get_seed_random_loose()),
0
)
func disappear():
disappeared.emit(self)

View File

@@ -1,76 +0,0 @@
# Classe abstraite permettant de développer divers effets de plantes
extends Resource
class_name PlantEffect
const HARVEST_EFFECT_ICON = preload("res://common/icons/shovel.svg")
const MATURE_EFFECT_ICON = preload("res://common/icons/chevrons-up.svg")
const CYCLIC_EFFECT_ICON = preload("res://common/icons/rotate-rectangle.svg")
@export var level : int
func _init(_level : int = 1):
level = _level
func get_effect_name() -> String:
printerr("Classe abstraite PlantEffect appelée")
return ""
func get_effect_description() -> String:
printerr("Classe abstraite PlantEffect appelée")
return ""
func effect(_plant):
printerr("Classe abstraite PlantEffect appelée")
func get_styled_effect_name():
var levels_bbcode = [
"[color=#2364AA]%s[/color]",
"[color=#25C147]%s %d[/color]",
"[color=#8B2DFF]%s %d[/color]",
"[color=#FF006E]%s %d[/color]",
"[color=#FFA617]%s %d[/color]",
"[rainbow]%s %d[/rainbow]"
]
if level == 1:
return levels_bbcode[0] % get_effect_name()
else :
return levels_bbcode[min(level - 1, len(levels_bbcode) - 1)] % [get_effect_name(), level]
static func card_effect_sections(
mature_effects : Array[PlantEffect],
harvest_effects : Array[PlantEffect],
cyclic_effects : Array[PlantEffect]
) -> Array[CardSectionInfo]:
var sections : Array[CardSectionInfo] = []
var effects_category = [
mature_effects,
harvest_effects,
cyclic_effects
]
var effects_category_labels : Array[String] = [
"ON_MATURE",
"WHEN_HARVESTED",
"EACH_DAY_WHEN_MATURE",
]
var effects_category_icon : Array[Texture] = [
MATURE_EFFECT_ICON,
HARVEST_EFFECT_ICON,
CYCLIC_EFFECT_ICON,
]
for i in range(len(effects_category)):
var effects = effects_category[i]
if len(effects) > 0:
var section = CardSectionInfo.new(
effects_category_labels[i]
)
section.title_icon = effects_category_icon[i]
var effects_text : Array = effects.map(
func (e : PlantEffect): return "[b]%s[/b] %s" % [e.get_styled_effect_name() , e.get_effect_description()]
)
section.text = "\n".join(effects_text)
sections.append(section)
return sections

View File

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

View File

@@ -1,20 +0,0 @@
extends PlantEffect
class_name DecontaminateTerrainEffect
func get_decontamination_radius():
return (1 + level)
func get_effect_name() -> String:
return tr("DECONTAMINATE")
func get_effect_description() -> String:
var ret = tr("DECONTAMINATE_%d_UNIT_AROUND_IT") % [get_decontamination_radius()]
return ret
func effect(plant):
var tiles := Math.get_tiles_in_circle(
plant.global_position,
get_decontamination_radius() * Planet.TILE_SIZE + Planet.TILE_SIZE/2.
)
plant.planet.decontamination_layer.place_decontaminations(tiles, true)

View File

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

View File

@@ -1,29 +0,0 @@
extends PlantEffect
class_name ProduceSeedsEffect
func get_produce_number():
return [level - 1, level]
func get_effect_name() -> String:
return tr("SEED_PRODUCTION")
func get_effect_description() -> String:
var number_str = ""
for i in range(len(get_produce_number())):
if i != 0:
if i == len(get_produce_number()) - 1:
number_str += tr("OR")
else :
number_str += tr("COMMA")
number_str += str(get_produce_number()[i])
return tr("PRODUCE_%s_SEEDS") % [number_str]
func effect(plant):
for _i in range(get_produce_number().pick_random()):
plant.planet.drop_item(
Seed.new(plant.plant_type, plant.plant_mutations),
plant.global_position,
plant.HARVESTED_SEED_DISPLACEMENT_FACTOR,
)

View File

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

View File

@@ -3,6 +3,8 @@ class_name PlantMutation
@export var level : int = 1
var name : String : get = get_mutation_name
func _init(_level : int = 1):
level = _level
@@ -20,13 +22,37 @@ func get_mutation_description() -> String:
printerr("Classe abstraite PlantMutation appelée")
return ""
func mutate_score(_plant_state : Plant.State, _plant : Plant, score,) -> int:
func mutate_plant_data(_plant_data : PlantData):
pass
func mutate_score(_plant_data : PlantData, score : int) -> int:
return score
func mutate_grow_time(_plant : Plant, grow_time : int) -> int:
return grow_time
func mutate_lifetime(_plant_data : PlantData, lifetime : int) -> int:
return lifetime
func mutate_plant(_plant : Plant):
func mutate_growing_time(_plant_data : PlantData, growing_time : int) -> int:
return growing_time
func mutate_seed_number(_plant_data, seed_number):
return seed_number
func mutate_seed_random_loose(_plant_data, seed_random_loose):
return seed_random_loose
func _start_planted_effect(_plant : Plant):
pass
func _start_day_effect(_plant : Plant):
pass
func _start_maturation_effect(_plant : Plant):
pass
func _start_dead_effect(_plant : Plant):
pass
func _start_harvested_effect(_plant : Plant):
pass
func get_level_for_rarity(rarity : int) -> int :
@@ -41,8 +67,7 @@ func card_section() -> CardSectionInfo:
"[b]%s[/b] %s" % [tr(PlantMutation.get_rarity_text(get_rarity())), get_mutation_description()]
)
section.title_color = PlantMutation.get_rarity_color(get_rarity())
section.title_colored = true
section.color = PlantMutation.get_rarity_color(get_rarity())
section.title_icon = get_icon()
return section
@@ -70,16 +95,3 @@ static func get_rarity_color(rarity : int) -> Color:
]
return rarity_colors[min(rarity, len(rarity_colors) - 1)]
static func random_mutation(except_mutations : Array[PlantMutation] = []) -> PlantMutation:
var all_mutations = GameInfo.game_data.unlocked_plant_mutations.duplicate_deep()
all_mutations = all_mutations.filter(
func (f1 : PlantMutation):
return except_mutations.find_custom(
func (f2 : PlantMutation): return f2.get_mutation_name() == f1.get_mutation_name()
) == -1
)
if len(all_mutations):
return all_mutations.pick_random()
else :
return null

View File

@@ -1,7 +1,7 @@
extends PlantMutation
class_name AncientMutation
const DEFAULT_DAY_FACTOR = 5
const DEFAULT_DAY_FACTOR = 3
func get_icon() -> Texture:
return preload("res://common/icons/wood.svg")
@@ -18,7 +18,7 @@ func get_mutation_description() -> String:
func get_day_factor():
return max(1, DEFAULT_DAY_FACTOR - level + 1)
func mutate_score(plant_state : Plant.State, plant : Plant, score) -> int:
if plant_state != Plant.State.MATURE:
func mutate_score(data : PlantData, score) -> int:
if data.get_state() != PlantData.State.MATURE:
return score
return score + floori(plant.day / get_day_factor())
return score + floori(data.day / get_day_factor())

View File

@@ -1,29 +0,0 @@
extends PlantMutation
class_name ElitistMutation
func get_icon() -> Texture:
return preload("res://common/icons/copy.svg")
func get_base_rarity() -> int:
return 0
func get_mutation_name() -> String:
return tr("ELITIST")
func get_mutation_description() -> String:
return tr("ELITIST_EFFECT_TEXT_LEVEL_%d") % level
func mutate_score(plant_state : Plant.State, plant : Plant, score) -> int:
if plant.influence_zone == null:
return score
if plant_state != Plant.State.MATURE:
return score
var plant_count = 0
for area in plant.influence_zone.get_overlapping_areas():
if area is Plant and area != plant and area.plant_type.name == plant.plant_type.name:
plant_count += 1
if plant_count == 0:
return 0
else :
return score + level * plant_count

View File

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

View File

@@ -1,26 +0,0 @@
extends PlantMutation
class_name ErmitMutation
func get_icon() -> Texture:
return preload("res://common/icons/seedling-off.svg")
func get_base_rarity() -> int:
return 0
func get_mutation_name() -> String:
return tr("ERMIT")
func get_mutation_description() -> String:
return tr("ERMIT_EFFECT_TEXT_LEVEL_%d") % get_score_multiplier()
func get_score_multiplier():
return level + 1
func mutate_score(_plant_state : Plant.State, plant : Plant, score) -> int:
if plant.influence_zone == null:
return score
for area in plant.influence_zone.get_overlapping_areas():
if area is Plant and area != plant:
return 0
return score * get_score_multiplier()

View File

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

Some files were not shown because too many files have changed in this diff Show More