diff --git a/Translation/localization.csv b/Translation/localization.csv new file mode 100644 index 0000000..1284759 --- /dev/null +++ b/Translation/localization.csv @@ -0,0 +1,135 @@ +keys,en,fr +STORY_TEXT,"[b]You are a lone robot, sent on a contaminated planet.[/b] +Your job : planting seeds to restore life on the planet. Each seed has different effects and grant you garden points, [b]you have to reach a certain garden score each 7 days to continue[/b]. +Be careful, [b]you can only plant in the decontamined zone[/b], but some plants can decontaminate your garden. +[b]Good luck![/b]","[b]Vous êtes un robot, envoyé seul sur une planète contaminée.[/b] +Votre mission : planter des graines pour redonner vie à cette planète. Chaque graine a des effets uniques et vous octroie des points de jardin, [b]vous devrez atteindre un certain score de jardin tous les 7 jours pour continuer[/b]. +Attention, [b]vous ne pouvez planter que dans la zone décontaminée[/b], mais certaines plantes peuvent décontaminer votre jardin. +[b]Bonne chance ![/b]" +CONTROLS_TEXT,"Directional Arrows/Right Click : Move +Left Click : Interact/Pick up +Mouse Wheel : Change held item +X : Drop Item","Flèches directionnelles/Clic droit : Se déplacer +Clic Gauche : Interagir/Ramasser +Molette : Changer l'objet en main +X : Lâcher l’objet" +STORY,Story,Histoire +OK,Ok,Ok +COMMA,", ","," +OR," or "," ou " +PAUSE,Pause,Pause +CONTROLS,Controls,Contrôles +RESUME_GAME,Resume,Reprendre +RESTART,Restart,Recommencer +QUIT,Quit,Quitter +SEED,Seed,Graine +TAKE,Take,Prendre +PACKAGE,Crate,Caisse de matériel +DESCRIPTION,Description,Description +USE,Use,Utiliser +ON_MATURE,On maturation,Une fois mature +WHEN_HARVESTED,When harvested,A la récolte +EACH_DAY_WHEN_MATURE,"Each day, when mature,","Chaque jour, après maturation," +COMMON,Common,Commun +RARE,Rare,Rare +VERY_RARE,Very rare,Très rare +IMPOSSIBLE,Impossible,Impossible +EFFECT,Effect,Effet +MATURE,Mature,Mature +GROWING,Growing,En train de pousser +DECONTAMINATE,Decontaminate,Décontamine +%d_DAY_LEFT,%d days left,%d jours restants +NEW_QUOTA,New Quota,Nouveau Quota +REACH_%d_GARDEN_SCORE_BEFORE_%d_DAYS,Reach %d garden score before %d days,Atteins un score de jardin de %d avant %d jours +LAST_DAY_FOR_REACHING_QUOTA,Last day to reach the quota,Dernier jour pour atteindre le quota +RECHARGE_%d_ENERGY,Recharge %d energy,Recharge %d d’énergie +%d_DAYS_BEFORE_CHARGE,%d days before being charged,%d jours avant d’être chargé +1_DAY_BEFORE_CHARGE,1 day before being charged,1 jour avant avant d’être chargé +CHARGED,Charged,Chargé +WHEN_FILLED,When filled,Si rempli +GIVE_THE_FOLLOWING_ITEM_%s,Give the following item : [b]%s[/b],Donne l’objet suivant : [b]%s[/b] +UPGRADE_MAX_ENERGY,Increases maximum energy,Augmente l’énergie maximum +UPGRADE_MAX_INVENTORY_SIZE,Increases inventory size,Augmente la taille de l’inventaire +DECONTAMINATE_%d_UNIT_AROUND_IT,Decontaminate %d unit around it,Décontamine %d unités autour d’elle +SEED_PRODUCTION,Seed Production,Production de graines +PRODUCE_%s_SEEDS,Produce %s seeds,Produit %s graines +DAY_%d,Day [b]%d[/b],Jour [b]%d[/b] +MATURE_ON_DAY_%d,Mature on day [b]%d[/b],Mature au jour [b]%d[/b] +%d_SCORE_WHEN_MATURE,Grants [b]%d[/b] garden points when mature,Donne [b]%d[/b] points de jardin une fois mature +ABSURD,[rainbow]Absurd[/rainbow],[rainbow]Absurde[rainbow] +GROW_IN_%d,Grow in [b]%d[/b] days,Mature dans [b]%d[/b] jours +%s_SCORE_WHEN_MATURE,Grants [b]%s[/b] garden points when mature,Donne [b]%s[/b] points de jardin une fois mature +DISCOVER_%s,Discover %s,Découvre %s +EVOLVE_%s,Upgrade %s,Améliore %s +%s_SEEDS_CAN_NOW_BE_FOUND,%s seeds can now be found,Des graines de %s peuvent maintenant être trouvées +%s_SCORE_EVOLUTION,%s score evolution,Évolution de score de %s +ADD_%s_TO_THE_DEFAULT_SCORE_OF_THE_PLANT,Add [b]%s[/b] to the default score of the plant,Améliore le score de jardin de la plante de [b]%s[/b] +%s_EVOLUTION,%s evolution,Évolution de %s +UPGRADE_THE_LEVEL_OF_%s_EFFECT_OF_%d_LEVEL,Upgrade the level of %s effect of %d level,Améliore l'effet %s de %d niveau +ANCIENT,Ancient,Ancien +ANCIENT_EFFECT_TEXT_LEVEL_%d,"When mature, grants [b]1[/b] garden points each [b]%d[/b] days","Une fois mature, donne [b]1[/b] points de jardin tous les [b]%d[/b] jours" +ELITIST,Elitist,Élitiste +ELITIST_EFFECT_TEXT_LEVEL_%d,"When mature, grants [b]%d[/b] garden points for each plant of the same species around, but do not give any points if it is alone.","Une fois mature, donne [b]%d[/b] points de jardin pour chaque plante de la même espèce aux alentours, mais n’en donne aucun si elle est seule." +ERMIT,Hermit,Ermite +ERMIT_EFFECT_TEXT_LEVEL_%d,"Multiply the garden score by [b]%d[/b] if no plants are nearby, otherwise, set it to 0.","Multiplie le score de jardin par [b]%d[/b] si aucune plante n’est proche, sinon le score est nul." +PRECOCIOUS,Precocious,Précoce +PRECOCIOUS_EFFECT_TEXT_LEVEL_%d,Grants [b]%d[/b] garden points while the plant is growing,Donne [b]%d[/b] points de jardin pendant que la plante grandit +QUALITY,Quality,Qualité +QUALITY_EFFECT_TEXT_LEVEL_%d,Grants [b]%d[/b] garden points if the plant is mature.,Donne [b]%d[/b] points de jardin si la plante est mature. +QUICK,Quick,Rapide +QUICK_EFFECT_TEXT_LEVEL_%d,Reduce the growing time by %d,Réduit le temps de maturation de %d +SOCIABLE,Outgoing,Sociable +SOCIABLE_EFFECT_TEXT_LEVEL_%d,"When mature, grants [b]%d[/b] garden points if it is nearby %d other plants","Une fois mature, donne [b]%d[/b] points de jardin si elle est à côté de %d autres plantes" +STRONG,Strong,Fort +STRONG_EFFECT_TEXT_LEVEL_%d,Plus [b]%d[/b] % of the score,Augmente le score de [b]%d[/b] % +COST_%d_ENERGY,Cost %d energy,Coûte %d d’énergie +ONE_TIME_USE,Single use,Usage unique +BUILD_%s,Build %s,Construit %s +FORK,Fork,Fourche +FORK_DESC_TEXT,"Use it to [b]harvest mature plants[/b].","Utilise-la pour [b]récolter les plantes mature[/b]." +HARVEST,Harvest,Récolter +KNIFE,Knife,Couteau +KNIFE_DESC_TEXT,"Use it to [b]harvest mature plants[/b]. Does not consume energy.",Utilise-le pour [b]récolter les plantes mature[/b]. Ne consomme pas d’énergie. +SHOVEL,Shovel,Pelle +SHOVEL_DESC_TEXT,"Use it to [b]dig up seeds[/b] and [b]harvest mature plants[/b].","Utilise-la pour [b]déterrer les graines[/b] et pour [b]récolter les plantes mature[/b]." +TROWEL,Trowel,Truelle +TROWEL_DESC_TEXT,"Use it to [b]harvest mature plants[/b]. Can grant a [b]bonus seed[/b].","Utilise-la pour [b]récolter les plantes mature[/b]. Peut donner une [b]graine supplémentaire[/b]." +DIG,Dig,Creuser +OPEN,Open,Ouvrir +%s_SEED,%s Seed,Graine de %s +PLANT_%s_MUST_BE_USED_IN_DECONTAMINATED_ZONE,Plant [b]%s[/b]. Must be used in the decontamined zone.,Plante [b]%s[/b]. Doit être utilisée dans la zone décontaminée. +PLANT_%s,Plant [b]%s[/b],Planter [b]%s[/b] +BURIED_SEEDS,Buried seeds,Graines enterrées +BURIED_SEEDS_DESC_TEXT,"Contain some random seeds. [b]Dig it with a shovel.[/b]","Contient des graines enterrées. [b]Peuvent être déterrées avec une pelle[/b]" +TAKE_THE_SHOVEL,Take the shovel,Prend la pelle +DIG_UNDERGROUND_LOOT,Dig up the buried resources,Déterre les graines enterrées +TAKE_A_SEED,Take a seed,Prend une graine +PLANT_THE_SEED_IN_DECONTAMINED_ZONE,Plant the seed in the decontamined zone,Plante la graine dans la zone décontaminée +RECHARGE_TO_PASS_DAYS,Recharge to pass the day,Recharge-toi pour passer la journée +HARVEST_MATURE_PLANTS_WITH_SHOVEL,Harvest mature plants with the shovel,Récolte les plantes matures avec la pelle +SCORE_%d,Score : %d,Score : %d +SOLAR_PANNEL,Solar panel,Panneau solaire +SOLAR_PANNEL_DESCRIPTION_TEXT,Grants energy when charged. Take several days to recharge,Donne de l’énergie quand chargé. Prend plusieurs jours à se recharger +TRUCK_ENTRANCE,Truck entrance,Entrée du camion +ENTER_TRUCK,Enter truck,Entrer dans le camion +EXIT,Exit,Sortie +EXIT_TRUCK,Exit truck,Sortir du camion +LADDER_DESC_TEXT,A good old ladder,Une bonne vieille échelle +RECHARGE_STATION,Recharge station,Station de recharge +RECHARGE,Recharge,Recharger +RECHARGE_STATION_DESC_TEXT,"[b]You can recharge yourself here.[/b] When recharging, time pass and plants grow.","[b]Tu peux te recharger ici.[/b] Pendant la recharge, le temps passe et les plantes grandissent." +COMPOST,Compost,Compost +PLACE_SEED,Place seed,Placer la graine +COMPOST_DESC_TEXT,This research station can provide some bonuses when filled with seeds,Cette station de recherche peut offrir certains avantages une fois remplie de graines +CHOOSE_A_REWARD,Choose a reward,Choisis une récompense +REWARD_SCREEN_TEXT,Discover new plants or upgrade already discovered ones,Découvre de nouvelles plantes ou améliore celles déjà découvertes +THANKS_FOR_PLAYING,Thanks for playing !,Merci d’avoir joué ! +WIN_SCREEN_TEXT,We need your feedback ! Give us your thoughts on the game on our Discord or in the comments section of this page !,Nous avons besoin de ton retour ! Donne-le nous sur notre Discord ou dans la section commentaire de cette page ! +JOIN_OUR_DISCORD,Join our Discord,Rejoins-nous +ART,Art,Art +DEV_AND_GAME_DESIGN,Development and Game Design,Développement et Game Design +MUSIC,Music,Musique +START,Start,Commencer +CHOOSE_A_LANGUAGE,Choose a language,Choisissez une langue +NO_ENERGY_LEFT," (no energy left)", " (pas d'énergie restante)" +%d_GARDEN_SCORE_LEFT,"%d garden score left","%d score de jardin restant" \ No newline at end of file diff --git a/Translation/localization.csv.import b/Translation/localization.csv.import new file mode 100644 index 0000000..fcd13d2 --- /dev/null +++ b/Translation/localization.csv.import @@ -0,0 +1,17 @@ +[remap] + +importer="csv_translation" +type="Translation" +uid="uid://dfymfpql8yxwt" + +[deps] + +files=["res://translation/localization.en.translation", "res://translation/localization.fr.translation"] + +source_file="res://translation/localization.csv" +dest_files=["res://translation/localization.en.translation", "res://translation/localization.fr.translation"] + +[params] + +compress=true +delimiter=0 diff --git a/common/game_data/scripts/game_data.gd b/common/game_data/scripts/game_data.gd index 54b0376..becdce4 100644 --- a/common/game_data/scripts/game_data.gd +++ b/common/game_data/scripts/game_data.gd @@ -8,6 +8,8 @@ func _init(): @export var tutorial_done = false +@export var settings : SettingsData = SettingsData.new() + @export var current_planet_data : PlanetData = PlanetData.new() : set(v): current_planet_data = v @@ -21,7 +23,6 @@ func _init(): @export var truck_data : TruckData = TruckData.new() func set_default_unlocked(): - unlocked_plant_types = all_plant_types() unlocked_plant_mutations = all_plant_mutations() unlocked_machines = all_machines() @@ -39,6 +40,25 @@ func reset_all(): reset_player() reset_truck() + 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 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]: diff --git a/common/game_data/scripts/settings_data.gd b/common/game_data/scripts/settings_data.gd new file mode 100644 index 0000000..59cebd6 --- /dev/null +++ b/common/game_data/scripts/settings_data.gd @@ -0,0 +1,11 @@ +extends Resource +class_name SettingsData + +const AVAILABLE_LANGUAGES = [ + "en", + "fr", +] +const AVAILABLE_LANGUAGES_LABEL = [ + "English", + "Français", +] \ No newline at end of file diff --git a/common/game_data/scripts/settings_data.gd.uid b/common/game_data/scripts/settings_data.gd.uid new file mode 100644 index 0000000..422c953 --- /dev/null +++ b/common/game_data/scripts/settings_data.gd.uid @@ -0,0 +1 @@ +uid://babsy24iv5yox diff --git a/common/music/assets/ambiance/ambiance_phase_1.ogg.import b/common/music/assets/ambiance/ambiance_phase_1.ogg.import index 767c45b..a3af819 100644 --- a/common/music/assets/ambiance/ambiance_phase_1.ogg.import +++ b/common/music/assets/ambiance/ambiance_phase_1.ogg.import @@ -12,8 +12,8 @@ dest_files=["res://.godot/imported/ambiance_phase_1.ogg-4ec046572bfe46745950c2c7 [params] -loop=false -loop_offset=0 -bpm=0 +loop=true +loop_offset=0.0 +bpm=0.0 beat_count=0 bar_beats=4 diff --git a/common/music/assets/ambiance/ambiance_phase_2.ogg.import b/common/music/assets/ambiance/ambiance_phase_2.ogg.import index 2bda51c..82ddb9c 100644 --- a/common/music/assets/ambiance/ambiance_phase_2.ogg.import +++ b/common/music/assets/ambiance/ambiance_phase_2.ogg.import @@ -12,7 +12,7 @@ dest_files=["res://.godot/imported/ambiance_phase_2.ogg-2260c3829d7e53dd94462ea7 [params] -loop=false +loop=true loop_offset=0.0 bpm=0.0 beat_count=0 diff --git a/common/music/assets/morceaux/forest_phase_1.ogg.import b/common/music/assets/morceaux/forest_phase_1.ogg.import index 303424d..33d074a 100644 --- a/common/music/assets/morceaux/forest_phase_1.ogg.import +++ b/common/music/assets/morceaux/forest_phase_1.ogg.import @@ -12,8 +12,8 @@ dest_files=["res://.godot/imported/forest_phase_1.ogg-6bf54bf177c3c359a54aab9723 [params] -loop=false -loop_offset=0 -bpm=0 +loop=true +loop_offset=0.0 +bpm=0.0 beat_count=0 bar_beats=4 diff --git a/common/music/assets/morceaux/forest_phase_2.ogg.import b/common/music/assets/morceaux/forest_phase_2.ogg.import index bdfa4d5..f570bca 100644 --- a/common/music/assets/morceaux/forest_phase_2.ogg.import +++ b/common/music/assets/morceaux/forest_phase_2.ogg.import @@ -12,8 +12,8 @@ dest_files=["res://.godot/imported/forest_phase_2.ogg-0fc72a5b1a0f8f7e98246db80e [params] -loop=false -loop_offset=0 -bpm=0 +loop=true +loop_offset=0.0 +bpm=0.0 beat_count=0 bar_beats=4 diff --git a/common/music/assets/morceaux/truck_music.ogg.import b/common/music/assets/morceaux/truck_music.ogg.import index b4c6f74..aef069c 100644 --- a/common/music/assets/morceaux/truck_music.ogg.import +++ b/common/music/assets/morceaux/truck_music.ogg.import @@ -12,8 +12,8 @@ dest_files=["res://.godot/imported/truck_music.ogg-cb4f770bcd6358719b9d817459f5f [params] -loop=false -loop_offset=0 -bpm=0 +loop=true +loop_offset=0.0 +bpm=0.0 beat_count=0 bar_beats=4 diff --git a/common/music/scripts/music.gd b/common/music/scripts/music.gd index 041b64d..39f0599 100644 --- a/common/music/scripts/music.gd +++ b/common/music/scripts/music.gd @@ -48,7 +48,6 @@ func get_all_audio_stream() -> Array[AudioStreamPlayer]: var all_children = %Ambiance.get_children() all_children.append_array(%Musics.get_children()) - print(all_children) for c in all_children: if c is AudioStreamPlayer: all_audio_stream.append(c) @@ -60,9 +59,9 @@ func _on_current_planet_data_updated(planet_data : PlanetData): planet_data.updated.connect(update_garden_phase) func update_garden_phase(planet_data : PlanetData): - var phase : int = 0 + var phase : int = garden_phase for i in range(len(garden_phases_scores)): - if planet_data.garden_score >= garden_phases_scores[i]: + if planet_data.garden_score >= garden_phases_scores[i] and i > garden_phase: phase = i update_phase() diff --git a/default_bus_layout.tres b/default_bus_layout.tres deleted file mode 100644 index cb362df..0000000 --- a/default_bus_layout.tres +++ /dev/null @@ -1,3 +0,0 @@ -[gd_resource type="AudioBusLayout" format=3 uid="uid://br1p68sy17lcg"] - -[resource] diff --git a/entities/interactables/item_object/script/item_object.gd b/entities/interactables/item_object/script/item_object.gd index 27d0e2a..bd4b9e1 100644 --- a/entities/interactables/item_object/script/item_object.gd +++ b/entities/interactables/item_object/script/item_object.gd @@ -28,14 +28,14 @@ func pointer_text() -> String: var name_suffix = "" if item is Seed: - name_suffix = "Seed" + name_suffix = tr("SEED") if item is Package: - name_suffix = "Package" + name_suffix = tr("PACKAGE") return item.name + (" " + name_suffix if name_suffix else "") func interact_text(): - return "Take" + return tr("TAKE") func card_info() -> CardInfo: return item.card_info() @@ -54,6 +54,7 @@ func pickup_animation(player : Player): tween.tween_property(self, "position", player.position, 0.2) tween.tween_callback( func(): + Pointer.stop_inspect(self) queue_free() ) if object_sprite: diff --git a/entities/interactables/machines/solar_pannel/scripts/solar_pannel.gd b/entities/interactables/machines/solar_pannel/scripts/solar_pannel.gd index 0310166..c85f3b6 100644 --- a/entities/interactables/machines/solar_pannel/scripts/solar_pannel.gd +++ b/entities/interactables/machines/solar_pannel/scripts/solar_pannel.gd @@ -1,6 +1,8 @@ extends Machine class_name SolarPanel +const ENERGY_ICON = preload("res://common/icons/bolt.svg") + var charged : bool = false var recharge_days : int = 0 @@ -37,13 +39,44 @@ func set_charged(_charged = true, with_anim : bool = true): %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 "Recharge " + str(get_energy_production()) + " energy" + return tr("RECHARGE_%d_ENERGY") % get_energy_production() func can_interact(_p : Player) -> bool: return charged @@ -54,4 +87,4 @@ func interact(p : Player) -> bool: return true func save() -> EntityData: - return SolarPanelData.new(self) \ No newline at end of file + return SolarPanelData.new(self) diff --git a/entities/interactables/machines/solar_pannel/solar_pannel.tres b/entities/interactables/machines/solar_pannel/solar_pannel.tres index 258718f..3803c89 100644 --- a/entities/interactables/machines/solar_pannel/solar_pannel.tres +++ b/entities/interactables/machines/solar_pannel/solar_pannel.tres @@ -5,7 +5,7 @@ [resource] script = ExtResource("1_ctita") -name = "Solar Pannel" +name = "SOLAR_PANNEL" scene = ExtResource("1_naexs") -description = "Charge every 2 days. When charged, can be used to recharge player energy." +description = "SOLAR_PANNEL_DESCRIPTION_TEXT" metadata/_custom_type_script = "uid://bepx311a3f0o" diff --git a/entities/interactables/machines/solar_pannel/solar_pannel.tscn b/entities/interactables/machines/solar_pannel/solar_pannel.tscn index 7577be8..959e6e1 100644 --- a/entities/interactables/machines/solar_pannel/solar_pannel.tscn +++ b/entities/interactables/machines/solar_pannel/solar_pannel.tscn @@ -70,6 +70,9 @@ _data = { [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="."] diff --git a/entities/interactables/truck/compost/compost.tscn b/entities/interactables/truck/compost/compost.tscn index 50ff189..37389db 100644 --- a/entities/interactables/truck/compost/compost.tscn +++ b/entities/interactables/truck/compost/compost.tscn @@ -78,9 +78,9 @@ _data = { [node name="Compost" type="Area2D"] script = ExtResource("1_ux0j5") -default_interact_text = "Place Seed" -default_info_title = "Compost" -default_info_desc = "This research station can provide some bonus if filled with seeds." +default_interact_text = "PLACE_SEED" +default_info_title = "COMPOST" +default_info_desc = "COMPOST_DESC_TEXT" [node name="CollisionShape2D" type="CollisionShape2D" parent="."] position = Vector2(0, -3) diff --git a/entities/interactables/truck/compost/scripts/compost.gd b/entities/interactables/truck/compost/scripts/compost.gd index abb3819..a254bbb 100644 --- a/entities/interactables/truck/compost/scripts/compost.gd +++ b/entities/interactables/truck/compost/scripts/compost.gd @@ -49,7 +49,7 @@ func card_info() -> CardInfo: if default_info_desc != "": var desc_section = CardSectionInfo.new( - "Description", + tr("DESCRIPTION"), default_info_desc ) desc_section.title_icon = DESC_ICON @@ -58,7 +58,7 @@ func card_info() -> CardInfo: ) var reward_section = CardSectionInfo.new( - "When filled", + tr("WHEN_FILLED"), reward.desc() ) reward_section.title_icon = FILLED_ICON diff --git a/entities/interactables/truck/compost/scripts/rewards/give_item_reward.gd b/entities/interactables/truck/compost/scripts/rewards/give_item_reward.gd index 3cd068d..1f31286 100644 --- a/entities/interactables/truck/compost/scripts/rewards/give_item_reward.gd +++ b/entities/interactables/truck/compost/scripts/rewards/give_item_reward.gd @@ -14,7 +14,7 @@ func reward(p: Player): p.pick_item(item) func desc() -> String: - return "Give the following item : [b]%s[/b]. %s" % [item.name, item.description] + return tr("GIVE_THE_FOLLOWING_ITEM_%s") % tr(item.name) + ". " + tr(item.description) func icon() -> Texture: return item.icon \ No newline at end of file diff --git a/entities/interactables/truck/compost/scripts/rewards/upgrade_max_energy_reward.gd b/entities/interactables/truck/compost/scripts/rewards/upgrade_max_energy_reward.gd index ae7f2e4..6daf701 100644 --- a/entities/interactables/truck/compost/scripts/rewards/upgrade_max_energy_reward.gd +++ b/entities/interactables/truck/compost/scripts/rewards/upgrade_max_energy_reward.gd @@ -4,7 +4,7 @@ func reward(p: Player): p.upgrade_max_energy(1) func desc() -> String: - return "Upgrade max energy" + return tr("UPGRADE_MAX_ENERGY") func icon() -> Texture: return preload("res://common/icons/bolt.svg") \ No newline at end of file diff --git a/entities/interactables/truck/compost/scripts/rewards/upgrade_max_inventory_reward.gd b/entities/interactables/truck/compost/scripts/rewards/upgrade_max_inventory_reward.gd index 4a3a785..6ce3035 100644 --- a/entities/interactables/truck/compost/scripts/rewards/upgrade_max_inventory_reward.gd +++ b/entities/interactables/truck/compost/scripts/rewards/upgrade_max_inventory_reward.gd @@ -5,7 +5,7 @@ func reward(p: Player): p.upgrade_inventory_size() func desc() -> String: - return "Upgrade max inventory size" + return tr("UPGRADE_MAX_INVENTORY_SIZE") func icon() -> Texture: return preload("res://common/icons/backpack.svg") \ No newline at end of file diff --git a/entities/interactables/truck/ladder/truck_ladder.tscn b/entities/interactables/truck/ladder/truck_ladder.tscn index 6a5f928..97cd165 100644 --- a/entities/interactables/truck/ladder/truck_ladder.tscn +++ b/entities/interactables/truck/ladder/truck_ladder.tscn @@ -14,9 +14,9 @@ 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 = "A good old ladder." +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="."] diff --git a/entities/interactables/truck/recharge/truck_recharge.tscn b/entities/interactables/truck/recharge/truck_recharge.tscn index 324558a..b16a38f 100644 --- a/entities/interactables/truck/recharge/truck_recharge.tscn +++ b/entities/interactables/truck/recharge/truck_recharge.tscn @@ -14,9 +14,9 @@ region = Rect2(64, 161, 101, 205) [node name="TruckRecharge" type="Area2D"] script = ExtResource("1_ipgcv") -default_interact_text = "Recharge" -default_info_title = "Recharge Station" -default_info_desc = "[b]You can recharge your robot here.[/b] When recharging, time will pass and plants may grow." +default_interact_text = "RECHARGE" +default_info_title = "RECHARGE_STATION" +default_info_desc = "RECHARGE_STATION_DESC_TEXT" metadata/_custom_type_script = "uid://dyprcd68fjstf" [node name="CollisionShape2D" type="CollisionShape2D" parent="."] diff --git a/entities/objectives/assets/sprites/arbre_mort.png b/entities/objectives/assets/sprites/arbre_mort.png deleted file mode 100644 index c945b23..0000000 Binary files a/entities/objectives/assets/sprites/arbre_mort.png and /dev/null differ diff --git a/entities/objectives/assets/sprites/arbre_mort.png.import b/entities/objectives/assets/sprites/arbre_mort.png.import deleted file mode 100644 index 95abe8c..0000000 --- a/entities/objectives/assets/sprites/arbre_mort.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dbednu7eygtrf" -path="res://.godot/imported/arbre_mort.png-eea217ee3fbf6520e6fbde71f18bbeef.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://entities/objectives/assets/sprites/arbre_mort.png" -dest_files=["res://.godot/imported/arbre_mort.png-eea217ee3fbf6520e6fbde71f18bbeef.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 diff --git a/entities/objectives/assets/sprites/herbe.png b/entities/objectives/assets/sprites/herbe.png deleted file mode 100644 index d8fe040..0000000 Binary files a/entities/objectives/assets/sprites/herbe.png and /dev/null differ diff --git a/entities/objectives/assets/sprites/herbe.png.import b/entities/objectives/assets/sprites/herbe.png.import deleted file mode 100644 index 7251cb0..0000000 --- a/entities/objectives/assets/sprites/herbe.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://4iukrxpg34y4" -path="res://.godot/imported/herbe.png-0b71f9ccc1e3943af9b0f3a135d3651b.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://entities/objectives/assets/sprites/herbe.png" -dest_files=["res://.godot/imported/herbe.png-0b71f9ccc1e3943af9b0f3a135d3651b.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 diff --git a/entities/objectives/assets/sprites/herbe3.png b/entities/objectives/assets/sprites/herbe3.png deleted file mode 100644 index 5b274d7..0000000 Binary files a/entities/objectives/assets/sprites/herbe3.png and /dev/null differ diff --git a/entities/objectives/assets/sprites/herbe3.png.import b/entities/objectives/assets/sprites/herbe3.png.import deleted file mode 100644 index 7966fff..0000000 --- a/entities/objectives/assets/sprites/herbe3.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bsetwgt5tqv7v" -path="res://.godot/imported/herbe3.png-a47f3310ca32019ca3d036e811d21212.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://entities/objectives/assets/sprites/herbe3.png" -dest_files=["res://.godot/imported/herbe3.png-a47f3310ca32019ca3d036e811d21212.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 diff --git a/entities/objectives/assets/sprites/herbe4.png b/entities/objectives/assets/sprites/herbe4.png deleted file mode 100644 index ab2e042..0000000 Binary files a/entities/objectives/assets/sprites/herbe4.png and /dev/null differ diff --git a/entities/objectives/assets/sprites/herbe4.png.import b/entities/objectives/assets/sprites/herbe4.png.import deleted file mode 100644 index 3a64b24..0000000 --- a/entities/objectives/assets/sprites/herbe4.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://k4v52q6eejv" -path="res://.godot/imported/herbe4.png-c674d45256bbf00e0fd646fd55e2e33b.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://entities/objectives/assets/sprites/herbe4.png" -dest_files=["res://.godot/imported/herbe4.png-c674d45256bbf00e0fd646fd55e2e33b.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 diff --git a/entities/objectives/assets/sprites/herbe8_glow.png b/entities/objectives/assets/sprites/herbe8_glow.png deleted file mode 100644 index 947e1cd..0000000 Binary files a/entities/objectives/assets/sprites/herbe8_glow.png and /dev/null differ diff --git a/entities/objectives/assets/sprites/herbe8_glow.png.import b/entities/objectives/assets/sprites/herbe8_glow.png.import deleted file mode 100644 index 9d3a4ea..0000000 --- a/entities/objectives/assets/sprites/herbe8_glow.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ckb8w7hsfevvt" -path="res://.godot/imported/herbe8_glow.png-c4d058e6fea519767afa64e839e5f87f.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://entities/objectives/assets/sprites/herbe8_glow.png" -dest_files=["res://.godot/imported/herbe8_glow.png-c4d058e6fea519767afa64e839e5f87f.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 diff --git a/entities/objectives/assets/sprites/little_plant.png b/entities/objectives/assets/sprites/little_plant.png deleted file mode 100644 index 6ee7a08..0000000 Binary files a/entities/objectives/assets/sprites/little_plant.png and /dev/null differ diff --git a/entities/objectives/assets/sprites/little_plant.png.import b/entities/objectives/assets/sprites/little_plant.png.import deleted file mode 100644 index 98c5425..0000000 --- a/entities/objectives/assets/sprites/little_plant.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c4pv2o7crchc0" -path="res://.godot/imported/little_plant.png-e9ed84e9420c629c3911ff755b194643.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://entities/objectives/assets/sprites/little_plant.png" -dest_files=["res://.godot/imported/little_plant.png-e9ed84e9420c629c3911ff755b194643.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 diff --git a/entities/objectives/assets/sprites/plante_morte.png b/entities/objectives/assets/sprites/plante_morte.png deleted file mode 100644 index eb0b224..0000000 Binary files a/entities/objectives/assets/sprites/plante_morte.png and /dev/null differ diff --git a/entities/objectives/assets/sprites/plante_morte.png.import b/entities/objectives/assets/sprites/plante_morte.png.import deleted file mode 100644 index 79cb56a..0000000 --- a/entities/objectives/assets/sprites/plante_morte.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bxb13hfnhxpvv" -path="res://.godot/imported/plante_morte.png-308d7033b9ec4bc89434e061a168e35b.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://entities/objectives/assets/sprites/plante_morte.png" -dest_files=["res://.godot/imported/plante_morte.png-308d7033b9ec4bc89434e061a168e35b.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 diff --git a/entities/objectives/objective.tscn b/entities/objectives/objective.tscn deleted file mode 100644 index 2ff2d21..0000000 --- a/entities/objectives/objective.tscn +++ /dev/null @@ -1,255 +0,0 @@ -[gd_scene load_steps=10 format=3 uid="uid://djl2le58ckgdx"] - -[ext_resource type="Script" uid="uid://j8fpi8rd8eyy" path="res://entities/objectives/scripts/objective.gd" id="1_3hqw5"] -[ext_resource type="Texture2D" uid="uid://4iukrxpg34y4" path="res://entities/objectives/assets/sprites/herbe.png" id="2_047qm"] -[ext_resource type="Texture2D" uid="uid://bxb13hfnhxpvv" path="res://entities/objectives/assets/sprites/plante_morte.png" id="3_bvagy"] -[ext_resource type="Texture2D" uid="uid://k4v52q6eejv" path="res://entities/objectives/assets/sprites/herbe4.png" id="4_lrlky"] -[ext_resource type="Texture2D" uid="uid://ckb8w7hsfevvt" path="res://entities/objectives/assets/sprites/herbe8_glow.png" id="5_6uhem"] - -[sub_resource type="Animation" id="Animation_v08i5"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("ArbreMort:modulate") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Color(0.627451, 0.85490197, 0.8980392, 1)] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("LittlePlant:visible") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("LittlePlant:scale") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0.094358, 0.094358)] -} -tracks/3/type = "value" -tracks/3/imported = false -tracks/3/enabled = true -tracks/3/path = NodePath("LittlePlant2:visible") -tracks/3/interp = 1 -tracks/3/loop_wrap = true -tracks/3/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} -tracks/4/type = "value" -tracks/4/imported = false -tracks/4/enabled = true -tracks/4/path = NodePath("LittlePlant2:scale") -tracks/4/interp = 1 -tracks/4/loop_wrap = true -tracks/4/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0.094358, 0.094358)] -} -tracks/5/type = "value" -tracks/5/imported = false -tracks/5/enabled = true -tracks/5/path = NodePath("LittlePlant3:visible") -tracks/5/interp = 1 -tracks/5/loop_wrap = true -tracks/5/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} -tracks/6/type = "value" -tracks/6/imported = false -tracks/6/enabled = true -tracks/6/path = NodePath("ArbreMort:scale") -tracks/6/interp = 1 -tracks/6/loop_wrap = true -tracks/6/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0.162791, 0.162791)] -} -tracks/7/type = "value" -tracks/7/imported = false -tracks/7/enabled = true -tracks/7/path = NodePath("LittlePlant3:scale") -tracks/7/interp = 1 -tracks/7/loop_wrap = true -tracks/7/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0.094358, 0.094358)] -} - -[sub_resource type="Animation" id="Animation_6uhem"] -resource_name = "activate" -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("ArbreMort:modulate") -tracks/0/interp = 2 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.266667), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Color(0.62835556, 0.85348916, 0.8974243, 1), Color(1, 1, 1, 1)] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("LittlePlant:visible") -tracks/1/interp = 2 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0.0333333), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [true] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("LittlePlant:scale") -tracks/2/interp = 2 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0.433333, 0.6), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Vector2(0, 0), Vector2(0.044, 0.044)] -} -tracks/3/type = "value" -tracks/3/imported = false -tracks/3/enabled = true -tracks/3/path = NodePath("LittlePlant2:visible") -tracks/3/interp = 1 -tracks/3/loop_wrap = true -tracks/3/keys = { -"times": PackedFloat32Array(0.0333333), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [true] -} -tracks/4/type = "value" -tracks/4/imported = false -tracks/4/enabled = true -tracks/4/path = NodePath("LittlePlant2:scale") -tracks/4/interp = 2 -tracks/4/loop_wrap = true -tracks/4/keys = { -"times": PackedFloat32Array(0.6, 0.8), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Vector2(0, 0), Vector2(0.044, 0.044)] -} -tracks/5/type = "value" -tracks/5/imported = false -tracks/5/enabled = true -tracks/5/path = NodePath("LittlePlant3:visible") -tracks/5/interp = 1 -tracks/5/loop_wrap = true -tracks/5/keys = { -"times": PackedFloat32Array(0.0333333), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [true] -} -tracks/6/type = "value" -tracks/6/imported = false -tracks/6/enabled = true -tracks/6/path = NodePath("ArbreMort:scale") -tracks/6/interp = 2 -tracks/6/loop_wrap = true -tracks/6/keys = { -"times": PackedFloat32Array(0, 0.1, 0.266667, 0.4), -"transitions": PackedFloat32Array(1, 1, 1, 1), -"update": 0, -"values": [Vector2(0.162791, 0.162791), Vector2(0.183, 0.093), Vector2(0.123, 0.178), Vector2(0.162791, 0.162791)] -} -tracks/7/type = "value" -tracks/7/imported = false -tracks/7/enabled = true -tracks/7/path = NodePath("LittlePlant3:scale") -tracks/7/interp = 2 -tracks/7/loop_wrap = true -tracks/7/keys = { -"times": PackedFloat32Array(0.4, 0.533333), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Vector2(0, 0), Vector2(0.054, 0.054)] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_047qm"] -_data = { -&"RESET": SubResource("Animation_v08i5"), -&"activate": SubResource("Animation_6uhem") -} - -[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_bvagy"] -radius = 15.0 -height = 68.0 - -[node name="Objective" type="Area2D"] -script = ExtResource("1_3hqw5") -metadata/_custom_type_script = "uid://d3bk52402ylvl" - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -unique_name_in_owner = true -libraries = { -&"": SubResource("AnimationLibrary_047qm") -} - -[node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(-1, -16) -rotation = 1.5708 -shape = SubResource("CapsuleShape2D_bvagy") - -[node name="LittlePlant" type="Sprite2D" parent="."] -visible = false -position = Vector2(-15, -25) -scale = Vector2(0.094358, 0.094358) -texture = ExtResource("2_047qm") - -[node name="ArbreMort" type="Sprite2D" parent="."] -modulate = Color(0.627451, 0.85490197, 0.8980392, 1) -position = Vector2(0, -17) -scale = Vector2(0.162791, 0.162791) -texture = ExtResource("3_bvagy") -offset = Vector2(0, -85.55) - -[node name="LittlePlant2" type="Sprite2D" parent="."] -visible = false -position = Vector2(21, -22) -scale = Vector2(0.094358, 0.094358) -texture = ExtResource("4_lrlky") - -[node name="LittlePlant3" type="Sprite2D" parent="."] -visible = false -position = Vector2(0, -15.000002) -scale = Vector2(0.094358, 0.094358) -texture = ExtResource("5_6uhem") diff --git a/entities/objectives/scripts/objective.gd b/entities/objectives/scripts/objective.gd deleted file mode 100644 index 50b23f8..0000000 --- a/entities/objectives/scripts/objective.gd +++ /dev/null @@ -1,18 +0,0 @@ -extends InspectableEntity -class_name Objective - -const RANDOM_MAX_OBJECTIVE_INTERVAL = 1. -const DECONTAMINATION_ICON = preload("res://common/icons/skull.svg") - -var completed : bool = false -@export var reward : ObjectiveReward = null - -func pointer_text() -> String: - return "Contamination Objective" - -func _end_pass_day(): - if planet and not completed: - if not planet.garden.is_there_contamination(global_position): - reward.reward(self) - %AnimationPlayer.play("activate") - completed = true diff --git a/entities/objectives/scripts/objective.gd.uid b/entities/objectives/scripts/objective.gd.uid deleted file mode 100644 index 5243287..0000000 --- a/entities/objectives/scripts/objective.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://j8fpi8rd8eyy diff --git a/entities/objectives/scripts/objective_reward.gd b/entities/objectives/scripts/objective_reward.gd deleted file mode 100644 index fbaa828..0000000 --- a/entities/objectives/scripts/objective_reward.gd +++ /dev/null @@ -1,14 +0,0 @@ -extends Resource -class_name ObjectiveReward - -func reward(_objective : Objective): - pass - -func get_icon() -> Texture: - return null - -func get_text() -> String: - return "" - -func get_description() -> String: - return "" \ No newline at end of file diff --git a/entities/objectives/scripts/objective_reward.gd.uid b/entities/objectives/scripts/objective_reward.gd.uid deleted file mode 100644 index b96959b..0000000 --- a/entities/objectives/scripts/objective_reward.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bsh4b8miag8w1 diff --git a/entities/objectives/scripts/rewards/loot_item_reward.gd b/entities/objectives/scripts/rewards/loot_item_reward.gd deleted file mode 100644 index 440090a..0000000 --- a/entities/objectives/scripts/rewards/loot_item_reward.gd +++ /dev/null @@ -1,25 +0,0 @@ -extends ObjectiveReward -class_name LootItemReward - -const REWARD_ITEM_RANDOM_DISPLACEMENT_FACTOR = 100 - -@export var item : Item - -func _init(i : Item): - item = i - -func get_icon() -> Texture: - return preload("res://common/icons/package.svg") - -func get_text() -> String: - return "" - -func get_description() -> String: - return "Loot the following item: [b]%s[/b]. %s" % [item.name, item.description] - -func reward(objective : Objective): - objective.terrain.drop_item( - item, - objective.global_position, - REWARD_ITEM_RANDOM_DISPLACEMENT_FACTOR - ) diff --git a/entities/objectives/scripts/rewards/loot_item_reward.gd.uid b/entities/objectives/scripts/rewards/loot_item_reward.gd.uid deleted file mode 100644 index 54abc4d..0000000 --- a/entities/objectives/scripts/rewards/loot_item_reward.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dva05p817w00f diff --git a/entities/objectives/scripts/rewards/loot_items_reward.gd.uid b/entities/objectives/scripts/rewards/loot_items_reward.gd.uid deleted file mode 100644 index 871c587..0000000 --- a/entities/objectives/scripts/rewards/loot_items_reward.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dot5gfkbm7p6s diff --git a/entities/objectives/scripts/rewards/loot_random_seeds_reward.gd b/entities/objectives/scripts/rewards/loot_random_seeds_reward.gd deleted file mode 100644 index 561a0de..0000000 --- a/entities/objectives/scripts/rewards/loot_random_seeds_reward.gd +++ /dev/null @@ -1,26 +0,0 @@ -extends ObjectiveReward -class_name LootRandomSeedsReward - -const REWARD_SEED_RANDOM_DISPLACEMENT_FACTOR = 100 - -@export var seeds_number : int - -func _init(number : int): - seeds_number = number - -func get_icon() -> Texture: - return preload("res://common/icons/seedling.svg") - -func get_text() -> String: - return str(seeds_number) - -func get_description() -> String: - return "Loot " + str(seeds_number) + " random seeds." - -func reward(objective : Objective): - for i in range(seeds_number): - objective.terrain.drop_item( - Seed.new(GameInfo.game_data.unlocked_plant_types.pick_random()), - objective.global_position, - REWARD_SEED_RANDOM_DISPLACEMENT_FACTOR - ) \ No newline at end of file diff --git a/entities/objectives/scripts/rewards/loot_random_seeds_reward.gd.uid b/entities/objectives/scripts/rewards/loot_random_seeds_reward.gd.uid deleted file mode 100644 index 6665067..0000000 --- a/entities/objectives/scripts/rewards/loot_random_seeds_reward.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bcdilfb4j7f6d diff --git a/entities/objectives/scripts/rewards/recharge_player_reward.gd b/entities/objectives/scripts/rewards/recharge_player_reward.gd deleted file mode 100644 index c1067f3..0000000 --- a/entities/objectives/scripts/rewards/recharge_player_reward.gd +++ /dev/null @@ -1,19 +0,0 @@ -extends ObjectiveReward -class_name RechargePlayerReward - -@export var recharge_amount = 1 - -func _init(_recharge_amount : int = 1): - recharge_amount = _recharge_amount - -func reward(objective : Objective): - objective.terrain.player.recharge(recharge_amount) - -func get_icon() -> Texture: - return preload("res://common/icons/bolt.svg") - -func get_text() -> String: - return "+"+str(recharge_amount)+" " - -func get_description() -> String: - return "Recharge player energy by " + str(recharge_amount) + "." diff --git a/entities/objectives/scripts/rewards/recharge_player_reward.gd.uid b/entities/objectives/scripts/rewards/recharge_player_reward.gd.uid deleted file mode 100644 index 81e14d1..0000000 --- a/entities/objectives/scripts/rewards/recharge_player_reward.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://4ak4kre3emnd diff --git a/entities/objectives/scripts/rewards/upgrade_player_inventory_size_reward.gd b/entities/objectives/scripts/rewards/upgrade_player_inventory_size_reward.gd deleted file mode 100644 index 58b029e..0000000 --- a/entities/objectives/scripts/rewards/upgrade_player_inventory_size_reward.gd +++ /dev/null @@ -1,19 +0,0 @@ -extends ObjectiveReward -class_name UpgradePlayerMaxEnergyReward - -@export var upgrade_amount = 1 - -func _init(_upgrade_amount : int = 1): - upgrade_amount = _upgrade_amount - -func reward(objective : Objective): - objective.terrain.player.upgrade_max_energy(upgrade_amount) - -func get_icon() -> Texture: - return preload("res://common/icons/bolt.svg") - -func get_text() -> String: - return "+"+str(upgrade_amount)+" max" - -func get_description() -> String: - return "Increase player max energy by " + str(upgrade_amount) + "." diff --git a/entities/objectives/scripts/rewards/upgrade_player_inventory_size_reward.gd.uid b/entities/objectives/scripts/rewards/upgrade_player_inventory_size_reward.gd.uid deleted file mode 100644 index 36a6d2d..0000000 --- a/entities/objectives/scripts/rewards/upgrade_player_inventory_size_reward.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://qywwuv3et7oq diff --git a/entities/objectives/scripts/rewards/upgrade_player_max_energy_reward.gd b/entities/objectives/scripts/rewards/upgrade_player_max_energy_reward.gd deleted file mode 100644 index bb8935f..0000000 --- a/entities/objectives/scripts/rewards/upgrade_player_max_energy_reward.gd +++ /dev/null @@ -1,19 +0,0 @@ -extends ObjectiveReward -class_name UpgradePlayerInventorySizeReward - -@export var upgrade_amount = 1 - -func _init(_upgrade_amount : int = 1): - upgrade_amount = _upgrade_amount - -func reward(objective : Objective): - objective.terrain.player.upgrade_inventory_size(upgrade_amount) - -func get_icon() -> Texture: - return preload("res://common/icons/backpack.svg") - -func get_text() -> String: - return "+"+str(upgrade_amount)+" max" - -func get_description() -> String: - return "Increase player inventory size by " + str(upgrade_amount) + "." diff --git a/entities/objectives/scripts/rewards/upgrade_player_max_energy_reward.gd.uid b/entities/objectives/scripts/rewards/upgrade_player_max_energy_reward.gd.uid deleted file mode 100644 index 1af2ed2..0000000 --- a/entities/objectives/scripts/rewards/upgrade_player_max_energy_reward.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cflvw3bfcocnn diff --git a/entities/plants/resources/plant_types/champ.tres b/entities/plants/resources/plant_types/champ.tres index d366d8c..3a6c463 100644 --- a/entities/plants/resources/plant_types/champ.tres +++ b/entities/plants/resources/plant_types/champ.tres @@ -24,5 +24,5 @@ default_growing_time = 3 seed_texture = SubResource("AtlasTexture_my6by") growing_texture = ExtResource("2_l2hi3") mature_texture = ExtResource("3_y8qve") -default_mature_effects = Array[ExtResource("1_l2hi3")]([SubResource("Resource_cf34j")]) +mature_effects = Array[ExtResource("1_l2hi3")]([SubResource("Resource_cf34j")]) metadata/_custom_type_script = "uid://jnye5pe1bgqw" diff --git a/entities/plants/resources/plant_types/chardi.tres b/entities/plants/resources/plant_types/chardi.tres index 13b1c28..0ae97d4 100644 --- a/entities/plants/resources/plant_types/chardi.tres +++ b/entities/plants/resources/plant_types/chardi.tres @@ -13,7 +13,7 @@ script = ExtResource("2_prk5s") level = 2 metadata/_custom_type_script = "uid://ceqx5va1ormau" -[sub_resource type="Resource" id="Resource_k7yib"] +[sub_resource type="Resource" id="Resource_ajihu"] script = ExtResource("3_ajihu") level = 1 metadata/_custom_type_script = "uid://cgscbuxe4dawb" @@ -29,6 +29,6 @@ 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") -default_harvest_effects = Array[ExtResource("1_40c3e")]([SubResource("Resource_40c3e")]) -default_mature_effects = Array[ExtResource("1_40c3e")]([SubResource("Resource_k7yib")]) +harvest_effects = Array[ExtResource("1_40c3e")]([SubResource("Resource_40c3e")]) +mature_effects = Array[ExtResource("1_40c3e")]([SubResource("Resource_ajihu")]) metadata/_custom_type_script = "uid://jnye5pe1bgqw" diff --git a/entities/plants/resources/plant_types/ferno.tres b/entities/plants/resources/plant_types/ferno.tres index b44c81e..c161b8c 100644 --- a/entities/plants/resources/plant_types/ferno.tres +++ b/entities/plants/resources/plant_types/ferno.tres @@ -8,12 +8,12 @@ [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_0ofiq"] +[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_7wddl"] +[sub_resource type="Resource" id="Resource_s6g12"] script = ExtResource("3_s6g12") level = 1 metadata/_custom_type_script = "uid://cgscbuxe4dawb" @@ -29,5 +29,5 @@ description = "This mysterious flower emmit a strong signal in the ground when h seed_texture = SubResource("AtlasTexture_g1td4") growing_texture = ExtResource("4_5qaoo") mature_texture = ExtResource("5_er4cp") -default_harvest_effects = Array[ExtResource("1_srjq6")]([SubResource("Resource_0ofiq"), SubResource("Resource_7wddl")]) +harvest_effects = Array[ExtResource("1_srjq6")]([SubResource("Resource_rb4mq"), SubResource("Resource_s6g12")]) metadata/_custom_type_script = "uid://jnye5pe1bgqw" diff --git a/entities/plants/resources/plant_types/maias.tres b/entities/plants/resources/plant_types/maias.tres index 694d6e9..588f59e 100644 --- a/entities/plants/resources/plant_types/maias.tres +++ b/entities/plants/resources/plant_types/maias.tres @@ -7,7 +7,7 @@ [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_1llfc"] +[sub_resource type="Resource" id="Resource_740j2"] script = ExtResource("2_740j2") level = 3 metadata/_custom_type_script = "uid://ceqx5va1ormau" @@ -23,5 +23,5 @@ 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") -default_harvest_effects = Array[ExtResource("1_740j2")]([SubResource("Resource_1llfc")]) +harvest_effects = Array[ExtResource("1_740j2")]([SubResource("Resource_740j2")]) metadata/_custom_type_script = "uid://jnye5pe1bgqw" diff --git a/entities/plants/resources/plant_types/philea.tres b/entities/plants/resources/plant_types/philea.tres index 48aab62..f644156 100644 --- a/entities/plants/resources/plant_types/philea.tres +++ b/entities/plants/resources/plant_types/philea.tres @@ -7,7 +7,7 @@ [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_0x8ki"] +[sub_resource type="Resource" id="Resource_jyjjp"] script = ExtResource("2_jyjjp") level = 1 metadata/_custom_type_script = "uid://ceqx5va1ormau" @@ -25,5 +25,5 @@ default_plant_score = 3 seed_texture = SubResource("AtlasTexture_ogrgq") growing_texture = ExtResource("3_n0hvm") mature_texture = ExtResource("4_cafy4") -default_mature_effects = Array[ExtResource("1_mi4ef")]([SubResource("Resource_0x8ki")]) +mature_effects = Array[ExtResource("1_mi4ef")]([SubResource("Resource_jyjjp")]) metadata/_custom_type_script = "uid://jnye5pe1bgqw" diff --git a/entities/plants/resources/plant_types/pili.tres b/entities/plants/resources/plant_types/pili.tres index b4b8b58..db4a62b 100644 --- a/entities/plants/resources/plant_types/pili.tres +++ b/entities/plants/resources/plant_types/pili.tres @@ -8,12 +8,12 @@ [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_kidty"] +[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_8fstu"] +[sub_resource type="Resource" id="Resource_26e4l"] script = ExtResource("2_8fstu") level = 2 metadata/_custom_type_script = "uid://cgscbuxe4dawb" @@ -30,6 +30,6 @@ default_growing_time = 3 seed_texture = SubResource("AtlasTexture_kidty") growing_texture = ExtResource("2_k4b1k") mature_texture = ExtResource("3_8fstu") -default_harvest_effects = Array[ExtResource("1_8fstu")]([SubResource("Resource_kidty")]) -default_mature_effects = Array[ExtResource("1_8fstu")]([SubResource("Resource_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" diff --git a/entities/plants/resources/plant_types/solita.tres b/entities/plants/resources/plant_types/solita.tres index 329c947..72e9c3b 100644 --- a/entities/plants/resources/plant_types/solita.tres +++ b/entities/plants/resources/plant_types/solita.tres @@ -7,7 +7,7 @@ [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_3fdsj"] +[sub_resource type="Resource" id="Resource_j4n5p"] script = ExtResource("2_1q5bp") level = 2 metadata/_custom_type_script = "uid://ceqx5va1ormau" @@ -25,5 +25,5 @@ default_plant_score = 2 seed_texture = SubResource("AtlasTexture_auuc2") growing_texture = ExtResource("3_j4n5p") mature_texture = ExtResource("4_njidq") -default_harvest_effects = Array[ExtResource("1_mksys")]([SubResource("Resource_3fdsj")]) +harvest_effects = Array[ExtResource("1_mksys")]([SubResource("Resource_j4n5p")]) metadata/_custom_type_script = "uid://jnye5pe1bgqw" diff --git a/entities/plants/scripts/plant.gd b/entities/plants/scripts/plant.gd index 8b8ef28..05391d5 100644 --- a/entities/plants/scripts/plant.gd +++ b/entities/plants/scripts/plant.gd @@ -15,10 +15,6 @@ 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 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") - const SPRITE_SCENE : PackedScene = preload("res://entities/plants/plant_sprite.tscn") enum State {PLANTED, GROWING, MATURE} @@ -32,9 +28,6 @@ var state: State = State.PLANTED @onready var collision_shape: CollisionShape2D @onready var influence_zone : PlantInfluenceZone -var harvest_effects = [] -var mature_effects = [] -var cyclic_effects = [] var plant_score = 0 var plant_mutations : Array[PlantMutation] = [] @@ -44,9 +37,6 @@ func _init( _day = 0, ): plant_type = _plant_type - harvest_effects = plant_type.default_harvest_effects.duplicate_deep() - mature_effects = plant_type.default_mature_effects.duplicate_deep() - cyclic_effects = plant_type.default_cyclic_effects.duplicate_deep() day = _day @@ -96,8 +86,8 @@ func generate_influence_zone() -> PlantInfluenceZone: func _pass_day(): await get_tree().create_timer(randf_range(0., RANDOM_MAX_GROW_INTERVAL)).timeout - if state == State.MATURE and len(cyclic_effects): - for effect in cyclic_effects: + if state == State.MATURE and len(plant_type.cyclic_effects): + for effect in plant_type.cyclic_effects: effect.effect(self) var old_state = state @@ -106,9 +96,9 @@ func _pass_day(): update_plant() if old_state != state and state == State.MATURE: - for effect in mature_effects: + for effect in plant_type.mature_effects: if effect : effect.effect(self) - for effect in cyclic_effects: + for effect in plant_type.cyclic_effects: if effect : effect.effect(self) func update_plant(with_animation : bool = true): @@ -137,7 +127,7 @@ func calculate_grow_time() -> int: for m in plant_mutations: mutated_grow_time = m.mutate_grow_time(self, mutated_grow_time) - return mutated_grow_time + return max(1, mutated_grow_time) func change_state(_state: State, with_animation : bool = true): if state != _state: @@ -148,7 +138,7 @@ func change_state(_state: State, with_animation : bool = true): func harvest(): if state == State.MATURE: - for effect in harvest_effects: + for effect in plant_type.harvest_effects: if effect : effect.effect(self) plant_sprite.start_harvest_animation() @@ -169,12 +159,12 @@ func card_info() -> CardInfo: info.texture = plant_type.mature_texture info.type_icon = PLANT_TYPE_ICON - var state_text = "Mature" + var state_text = tr("MATURE") if state != State.MATURE: - state_text = "Growing" + state_text = tr("GROWING") info.stats.append(CardStatInfo.new( - "Day [b]%d[/b]" % day, + tr("DAY_%d") % day, LIFETIME_ICON )) @@ -185,12 +175,12 @@ func card_info() -> CardInfo: if state != State.MATURE: info.stats.append(CardStatInfo.new( - "Mature on day [b]%d[/b]" % calculate_grow_time(), + tr("MATURE_ON_DAY_%d") % calculate_grow_time(), GROWING_ICON )) info.stats.append(CardStatInfo.new( - "[b]%d[/b] score when mature" % calculate_plant_score(State.MATURE), + tr("%d_SCORE_WHEN_MATURE") % calculate_plant_score(State.MATURE), PLANT_POINT_ICON )) @@ -203,39 +193,10 @@ func card_info() -> CardInfo: for m in plant_mutations: info.sections.append(m.card_section()) - info.sections.append_array(card_effect_sections()) + info.sections.append_array(PlantEffect.card_effect_sections( + plant_type.mature_effects, + plant_type.harvest_effects, + plant_type.cyclic_effects, + )) - return info - -func card_effect_sections() -> 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): - 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 + return info \ No newline at end of file diff --git a/entities/plants/scripts/plant_effect.gd b/entities/plants/scripts/plant_effect.gd index bdeddc0..505f189 100644 --- a/entities/plants/scripts/plant_effect.gd +++ b/entities/plants/scripts/plant_effect.gd @@ -2,6 +2,10 @@ 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): @@ -15,7 +19,7 @@ func get_effect_description() -> String: printerr("Classe abstraite PlantEffect appelée") return "" -func effect(plant): +func effect(_plant): printerr("Classe abstraite PlantEffect appelée") func get_styled_effect_name(): @@ -31,4 +35,42 @@ func get_styled_effect_name(): 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] \ No newline at end of file + 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 \ No newline at end of file diff --git a/entities/plants/scripts/plant_effects/decontaminate_terrain_effect.gd b/entities/plants/scripts/plant_effects/decontaminate_terrain_effect.gd index 6e968e6..af34ac4 100644 --- a/entities/plants/scripts/plant_effects/decontaminate_terrain_effect.gd +++ b/entities/plants/scripts/plant_effects/decontaminate_terrain_effect.gd @@ -5,10 +5,10 @@ func get_decontamination_radius(): return 50 + 50 * level func get_effect_name() -> String: - return "Decontaminate" + return tr("DECONTAMINATE") func get_effect_description() -> String: - var ret = "Decontaminate %d unit around it" % [get_decontamination_radius()] + var ret = tr("DECONTAMINATE_%d_UNIT_AROUND_IT") % [get_decontamination_radius()] return ret func effect(plant): diff --git a/entities/plants/scripts/plant_effects/produce_seeds.gd b/entities/plants/scripts/plant_effects/produce_seeds.gd index cb7a63d..89d1a40 100644 --- a/entities/plants/scripts/plant_effects/produce_seeds.gd +++ b/entities/plants/scripts/plant_effects/produce_seeds.gd @@ -5,7 +5,7 @@ func get_produce_number(): return [level - 1, level] func get_effect_name() -> String: - return "Seed Production" + return tr("SEED_PRODUCTION") func get_effect_description() -> String: var number_str = "" @@ -13,12 +13,12 @@ func get_effect_description() -> String: for i in range(len(get_produce_number())): if i != 0: if i == len(get_produce_number()) - 1: - number_str += " or " + number_str += tr("OR") else : - number_str += ", " + number_str += tr("COMMA") number_str += str(get_produce_number()[i]) - return "Produce %s seeds" % [number_str] + return tr("PRODUCE_%s_SEEDS") % [number_str] func effect(plant): for _i in range(get_produce_number().pick_random()): diff --git a/entities/plants/scripts/plant_mutation.gd b/entities/plants/scripts/plant_mutation.gd index 5c3b6ab..78b71b8 100644 --- a/entities/plants/scripts/plant_mutation.gd +++ b/entities/plants/scripts/plant_mutation.gd @@ -1,13 +1,6 @@ extends Resource class_name PlantMutation -const BASE_RARITY_CHANCE : Array[float] = [ - 0.75, - 0.9, - 1, - 1, -] - @export var level : int = 1 func _init(_level : int = 1): @@ -45,7 +38,7 @@ func get_rarity() -> int: func card_section() -> CardSectionInfo: var section = CardSectionInfo.new( get_mutation_name() + (" %d" % level if level > 1 else ""), - "[b]%s[/b] %s" % [PlantMutation.get_rarity_text(get_rarity()), get_mutation_description()] + "[b]%s[/b] %s" % [tr(PlantMutation.get_rarity_text(get_rarity())), get_mutation_description()] ) section.title_color = PlantMutation.get_rarity_color(get_rarity()) @@ -56,11 +49,11 @@ func card_section() -> CardSectionInfo: static func get_rarity_text(rarity) -> String: var rarity_text : Array[String] = [ - "Common", - "Rare", - "Very rare", - "Impossible", - "[rainbow]Absurd[/rainbow]", + "COMMON", + "RARE", + "VERY_RARE", + "IMPOSSIBLE", + "ABSURD", ] if rarity < len(rarity_text): @@ -78,21 +71,15 @@ static func get_rarity_color(rarity : int) -> Color: return rarity_colors[min(rarity, len(rarity_colors) - 1)] -static func random_rarity() -> int: - var random_float = randf() - - for i in range(len(BASE_RARITY_CHANCE) - 1): - if random_float < BASE_RARITY_CHANCE[i]: - return i - return len(BASE_RARITY_CHANCE) - 1 - -static func random_mutation(rarity = PlantMutation.random_rarity()) -> PlantMutation: +static func random_mutation(except_mutations : Array[PlantMutation] = []) -> PlantMutation: var all_mutations = GameInfo.game_data.unlocked_plant_mutations.duplicate_deep() - all_mutations.shuffle() - for new_mutation in all_mutations: - var level_for_rarity = new_mutation.get_level_for_rarity(rarity) - if level_for_rarity >= 1: - new_mutation.level = level_for_rarity - return new_mutation - return null - + 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 diff --git a/entities/plants/scripts/plant_mutation/ancient_mutation.gd b/entities/plants/scripts/plant_mutation/ancient_mutation.gd index 97e19ba..61d865a 100644 --- a/entities/plants/scripts/plant_mutation/ancient_mutation.gd +++ b/entities/plants/scripts/plant_mutation/ancient_mutation.gd @@ -10,10 +10,10 @@ func get_base_rarity() -> int: return 0 func get_mutation_name() -> String: - return "Ancient" + return tr("ANCIENT") func get_mutation_description() -> String: - return "When mature, add [b]1[/b] to the score for each [b]%d[/b] days passed" % get_day_factor() + return tr("ANCIENT_EFFECT_TEXT_LEVEL_%d") % get_day_factor() func get_day_factor(): return max(1, DEFAULT_DAY_FACTOR - level + 1) diff --git a/entities/plants/scripts/plant_mutation/elitist_mutation.gd b/entities/plants/scripts/plant_mutation/elitist_mutation.gd index 9f0b5b7..67338ad 100644 --- a/entities/plants/scripts/plant_mutation/elitist_mutation.gd +++ b/entities/plants/scripts/plant_mutation/elitist_mutation.gd @@ -8,10 +8,10 @@ func get_base_rarity() -> int: return 0 func get_mutation_name() -> String: - return "Elitist" + return tr("ELITIST") func get_mutation_description() -> String: - return "When mature, add [b]%d[/b] to the score for each plant of the same species around, but score become 0 if none is around." % level + return tr("ELITIST_EFFECT_TEXT_LEVEL_%d") % level func mutate_score(plant_state : Plant.State, plant : Plant, score) -> int: if plant.influence_zone == null: diff --git a/entities/plants/scripts/plant_mutation/ermit_mutation.gd b/entities/plants/scripts/plant_mutation/ermit_mutation.gd index aed6967..f47e7b6 100644 --- a/entities/plants/scripts/plant_mutation/ermit_mutation.gd +++ b/entities/plants/scripts/plant_mutation/ermit_mutation.gd @@ -8,10 +8,10 @@ func get_base_rarity() -> int: return 0 func get_mutation_name() -> String: - return "Ermit" + return tr("ERMIT") func get_mutation_description() -> String: - return "Multiply the score by [b]%d[/b] if no plant is near, but set it to 0 otherwise." % get_score_multiplier() + return tr("ERMIT_EFFECT_TEXT_LEVEL_%d") % get_score_multiplier() func get_score_multiplier(): return level + 1 diff --git a/entities/plants/scripts/plant_mutation/precocious_mutation.gd b/entities/plants/scripts/plant_mutation/precocious_mutation.gd index 72cdc81..6563c28 100644 --- a/entities/plants/scripts/plant_mutation/precocious_mutation.gd +++ b/entities/plants/scripts/plant_mutation/precocious_mutation.gd @@ -8,10 +8,10 @@ func get_base_rarity() -> int: return 0 func get_mutation_name() -> String: - return "Precocious" + return tr("PRECOCIOUS") func get_mutation_description() -> String: - return "Add [b]%d[/b] to the score while the plant is growing" % level + return tr("PRECOCIOUS_EFFECT_TEXT_LEVEL_%d") % level func mutate_score(plant_state : Plant.State, _plant : Plant, score) -> int: return score + (0 if plant_state == Plant.State.MATURE else level) \ No newline at end of file diff --git a/entities/plants/scripts/plant_mutation/quality_mutation.gd b/entities/plants/scripts/plant_mutation/quality_mutation.gd index bb65e99..11b8e80 100644 --- a/entities/plants/scripts/plant_mutation/quality_mutation.gd +++ b/entities/plants/scripts/plant_mutation/quality_mutation.gd @@ -8,10 +8,10 @@ func get_base_rarity() -> int: return 0 func get_mutation_name() -> String: - return "Quality" + return tr("QUALITY") func get_mutation_description() -> String: - return "Add [b]%d[/b] to the score if the plant is mature." % level + return tr("QUALITY_EFFECT_TEXT_LEVEL_%d") % level func mutate_score(plant_state : Plant.State, _plant : Plant, score : int) -> int: return score + (level if plant_state == Plant.State.MATURE else 0) \ No newline at end of file diff --git a/entities/plants/scripts/plant_mutation/quick_mutation.gd b/entities/plants/scripts/plant_mutation/quick_mutation.gd index 37db9bf..6f0eeba 100644 --- a/entities/plants/scripts/plant_mutation/quick_mutation.gd +++ b/entities/plants/scripts/plant_mutation/quick_mutation.gd @@ -8,10 +8,10 @@ func get_base_rarity() -> int: return 0 func get_mutation_name() -> String: - return "Quick" + return tr("QUICK") func get_mutation_description() -> String: - return "Reduce the grow time by %d" % level + return tr("QUICK_EFFECT_TEXT_LEVEL_%d") % level func mutate_grow_time(_plant : Plant, grow_time : int) -> int: return max(grow_time - level, 0) \ No newline at end of file diff --git a/entities/plants/scripts/plant_mutation/sociable_mutation.gd b/entities/plants/scripts/plant_mutation/sociable_mutation.gd index 93dd6b1..36d774c 100644 --- a/entities/plants/scripts/plant_mutation/sociable_mutation.gd +++ b/entities/plants/scripts/plant_mutation/sociable_mutation.gd @@ -10,10 +10,10 @@ func get_base_rarity() -> int: return 0 func get_mutation_name() -> String: - return "Sociable" + return tr("SOCIABLE") func get_mutation_description() -> String: - return "When mature, add [b]%d[/b] to the score if near %d other plants" % [get_score_bonus(), NEAR_PLANT_NEEDED] + return tr("SOCIABLE_EFFECT_TEXT_LEVEL_%d") % [get_score_bonus(), NEAR_PLANT_NEEDED] func get_score_bonus(): return (level + 2) diff --git a/entities/plants/scripts/plant_mutation/strong_mutation.gd b/entities/plants/scripts/plant_mutation/strong_mutation.gd index 2f44373..2713f11 100644 --- a/entities/plants/scripts/plant_mutation/strong_mutation.gd +++ b/entities/plants/scripts/plant_mutation/strong_mutation.gd @@ -8,10 +8,10 @@ func get_base_rarity() -> int: return 0 func get_mutation_name() -> String: - return "Strong" + return tr("STRONG") func get_mutation_description() -> String: - return "Plus [b]%d[/b] percent of the score" % roundi(get_score_multiplier() * 100) + return tr("STRONG_EFFECT_TEXT_LEVEL_%d") % roundi(get_score_multiplier() * 100) func get_score_multiplier(): return float(level)/2. diff --git a/entities/plants/scripts/plant_type.gd b/entities/plants/scripts/plant_type.gd index 3101676..56a618b 100644 --- a/entities/plants/scripts/plant_type.gd +++ b/entities/plants/scripts/plant_type.gd @@ -11,6 +11,118 @@ class_name PlantType @export var growing_texture : Texture @export var mature_texture : Texture -@export var default_harvest_effects : Array[PlantEffect] = [] -@export var default_mature_effects : Array[PlantEffect] = [] -@export var default_cyclic_effects : Array[PlantEffect] = [] +@export var harvest_effects : Array[PlantEffect] = [] +@export var mature_effects : Array[PlantEffect] = [] +@export var cyclic_effects : Array[PlantEffect] = [] + +func card_info() -> CardInfo: + var info = CardInfo.new( + name + ) + + info.important_stat_icon = Plant.PLANT_POINT_ICON + info.important_stat_text = "%d" % default_plant_score + info.texture = mature_texture + info.type_icon = Plant.PLANT_TYPE_ICON + + info.stats.append(CardStatInfo.new( + tr("GROW_IN_%d") % default_growing_time, + Plant.GROWING_ICON + )) + + info.stats.append(CardStatInfo.new( + tr("%s_SCORE_WHEN_MATURE") % default_plant_score, + Plant.PLANT_POINT_ICON + )) + + info.sections.append_array(PlantEffect.card_effect_sections( + mature_effects, + harvest_effects, + cyclic_effects, + )) + + return info + +func get_available_evolution() -> Array[Evolution]: + var evolutions : Array[Evolution] = [ + ScoreEvolution.new(self) + ] + + if len(mature_effects) > 0: + evolutions.append(MatureEffectEvolution.new(self)) + if len(harvest_effects) > 0: + evolutions.append(HarvestEffectEvolution.new(self)) + if len(cyclic_effects) > 0: + evolutions.append(CyclicEffectEvolution.new(self)) + + return evolutions + +class Evolution: + + var level : int + var plant_type : PlantType + + func _init(_type : PlantType, _l : int = 1): + plant_type = _type + level = _l + + func get_title(): + return "" + + func get_description(): + return "" + + func evolve(_pt : PlantType = plant_type): + pass + +class ScoreEvolution extends Evolution: + + func get_title(): + return tr("%s_SCORE_EVOLUTION") % plant_type.name + + func get_description(): + return tr("ADD_%s_TO_THE_DEFAULT_SCORE_OF_THE_PLANT") % level + + func evolve(pt : PlantType = plant_type): + pt.default_plant_score += level + +class MatureEffectEvolution extends Evolution: + + var effect_index : int + + func _init(_type : PlantType, _l : int = 1): + plant_type = _type + level = _l + + pick_effect() + + func pick_effect(): + effect_index = randi() % len(plant_type.mature_effects) + + func get_effect(pt : PlantType = plant_type) -> PlantEffect: + return pt.mature_effects[effect_index] + + func get_title(): + return tr("%s_EVOLUTION") % plant_type.name + + func get_description(): + return tr("UPGRADE_THE_LEVEL_OF_%s_EFFECT_OF_%d_LEVEL") % [get_effect().get_effect_name(), level] + + func evolve(pt : PlantType = plant_type): + get_effect(pt).level += level + +class HarvestEffectEvolution extends MatureEffectEvolution: + + func pick_effect(): + effect_index = randi() % len(plant_type.harvest_effects) + + func get_effect(pt : PlantType = plant_type) -> PlantEffect: + return pt.harvest_effects[effect_index] + +class CyclicEffectEvolution extends MatureEffectEvolution: + + func pick_effect(): + effect_index = randi() % len(plant_type.harvest_effects) + + func get_effect(pt : PlantType = plant_type) -> PlantEffect: + return pt.harvest_effects[effect_index] \ No newline at end of file diff --git a/entities/player/inventory/scripts/inventory.gd b/entities/player/inventory/scripts/inventory.gd index a660aa0..e2866e8 100644 --- a/entities/player/inventory/scripts/inventory.gd +++ b/entities/player/inventory/scripts/inventory.gd @@ -5,9 +5,15 @@ signal updated(inventory: Inventory) @export var items: Array[Item] = [] @export var current_item_ind: int = 0 +@export var size = 0 : + set(s): + size = s + items.resize(size) + updated.emit(self) func _init(inventory_size: int = 1): - items.resize(inventory_size) + size = inventory_size + func get_best_available_slot_ind(): if items[current_item_ind] == null: diff --git a/entities/player/inventory/scripts/item.gd b/entities/player/inventory/scripts/item.gd index 2f79f30..0c5a574 100644 --- a/entities/player/inventory/scripts/item.gd +++ b/entities/player/inventory/scripts/item.gd @@ -33,13 +33,13 @@ func get_usage_object_affected(_i : InspectableEntity) -> bool: func is_one_time_use(): return false -func can_use(_player : Player, zone: Player.ActionZone) -> bool: +func can_use(_player : Player, _zone: Player.ActionZone) -> bool: return false func use_text() -> String: return "" -func use(_player : Player, zone: Player.ActionZone): +func use(_player : Player, _zone: Player.ActionZone): return false func card_info() -> CardInfo: @@ -51,7 +51,7 @@ func card_info() -> CardInfo: info.stats.append( CardStatInfo.new( - "Cost %d energy" % energy_usage, + tr("COST_%d_ENERGY") % energy_usage, ENERGY_ICON ) ) @@ -59,13 +59,13 @@ func card_info() -> CardInfo: if is_one_time_use(): info.stats.append( CardStatInfo.new( - "One time use", + tr("ONE_TIME_USE"), ONE_TIME_ICON ) ) var effect_section = CardSectionInfo.new( - "Effect", + tr("EFFECT"), get_description() ) effect_section.title_icon = ACTION_ICON diff --git a/entities/player/inventory/scripts/items/blueprint.gd b/entities/player/inventory/scripts/items/blueprint.gd index b78d5b6..900fdaf 100644 --- a/entities/player/inventory/scripts/items/blueprint.gd +++ b/entities/player/inventory/scripts/items/blueprint.gd @@ -18,18 +18,21 @@ func get_description() -> String: return machine_type.description return "" +func get_energy_used() -> int: + return 0 + func get_icon() -> Texture2D: return preload("res://common/icons/cube-3d-sphere.svg") func use_text() -> String: if machine_type: - return "Build " + machine_type.name + return tr("BUILD_%s") % machine_type.name return "" func is_one_time_use(): return true -func can_use(player : Player, zone : Player.ActionZone) -> bool: +func can_use(player : Player, _zone : Player.ActionZone) -> bool: return player.terrain is Planet func use(player : Player, zone : Player.ActionZone) -> bool: diff --git a/entities/player/inventory/scripts/items/fork.gd b/entities/player/inventory/scripts/items/fork.gd index b3e6e38..c9f7e6c 100644 --- a/entities/player/inventory/scripts/items/fork.gd +++ b/entities/player/inventory/scripts/items/fork.gd @@ -4,10 +4,10 @@ class_name Fork const USE_INTERVAL = 0.15 func get_item_name() -> String: - return "Fork" + return tr("FORK") func get_description() -> String: - return "Use it to harvest mature plants." + return tr("FORK_DESC_TEXT") func get_icon() -> Texture2D: return preload("res://common/icons/fork.svg") @@ -22,7 +22,7 @@ func get_usage_object_affected(i : InspectableEntity) -> bool: return i is Plant func use_text() -> String: - return "Harvest" + return tr("HARVEST") func can_use(_player : Player, zone : Player.ActionZone) -> bool: var areas = zone.get_affected_areas() diff --git a/entities/player/inventory/scripts/items/knife.gd b/entities/player/inventory/scripts/items/knife.gd index 8268a42..c41e5ac 100644 --- a/entities/player/inventory/scripts/items/knife.gd +++ b/entities/player/inventory/scripts/items/knife.gd @@ -4,11 +4,10 @@ class_name Knife const KNIFE_ZONE_RADIUS = 10 func get_item_name() -> String: - return "Knife" + return tr("KNIFE") func get_description() -> String: - return "Use it to harvest mature plants. Do not cost energy." - + return tr("KNIFE_DESC_TEXT") func get_energy_used() -> int: return 0 diff --git a/entities/player/inventory/scripts/items/package.gd b/entities/player/inventory/scripts/items/package.gd index 0dd48ed..87854ce 100644 --- a/entities/player/inventory/scripts/items/package.gd +++ b/entities/player/inventory/scripts/items/package.gd @@ -19,12 +19,12 @@ func get_icon() -> Texture2D: return preload("res://common/icons/package.svg") func use_text() -> String: - return "Open" + return tr("OPEN") func is_one_time_use(): return true -func can_use(player : Player, zone : Player.ActionZone) -> bool: +func can_use(player : Player, _zone : Player.ActionZone) -> bool: return player.planet != null func use(player : Player, zone : Player.ActionZone) -> bool: diff --git a/entities/player/inventory/scripts/items/seed.gd b/entities/player/inventory/scripts/items/seed.gd index 99db861..8257f7d 100644 --- a/entities/player/inventory/scripts/items/seed.gd +++ b/entities/player/inventory/scripts/items/seed.gd @@ -11,10 +11,10 @@ const SCORE_ICON = preload("res://common/icons/growth.svg") @export var plant_mutations: Array[PlantMutation] func get_item_name() -> String: - return "%s Seed" % plant_type.name + return tr("%s_SEED") % plant_type.name func get_description() -> String: - return "Plant [b]%s[/b]. Must be used in decontamined zone." % plant_type.name + return tr("PLANT_%s_MUST_BE_USED_IN_DECONTAMINATED_ZONE") % plant_type.name func get_icon() -> Texture2D: return plant_type.seed_texture @@ -23,7 +23,7 @@ func get_energy_used() -> int: return 1 func get_usage_zone_radius() -> int: - return 30 + return 35 func get_usage_object_affected(i : InspectableEntity) -> bool: return i is Plant @@ -36,7 +36,7 @@ func _init( plant_mutations = Seed.mutate(_parent_mutation) func use_text() -> String: - return "Plant " + plant_type.name + return tr("PLANT_%s") % plant_type.name func is_one_time_use(): return true @@ -80,7 +80,7 @@ func card_info() -> CardInfo: info.stats.append( CardStatInfo.new( - "Cost %d energy" % energy_usage, + tr("COST_%d_ENERGY") % energy_usage, ENERGY_ICON ) ) @@ -88,13 +88,13 @@ func card_info() -> CardInfo: if is_one_time_use(): info.stats.append( CardStatInfo.new( - "One time use", + tr("ONE_TIME_USE"), ONE_TIME_ICON ) ) var effect_section = CardSectionInfo.new( - "Effect", + tr("EFFECT"), get_description() ) effect_section.title_icon = ACTION_ICON @@ -137,11 +137,19 @@ static func mutate(parent_mutation : Array[PlantMutation] = []) -> Array[PlantMu AddMutation.new() ] - if len(parent_mutation): - possible_mutations.append_array( [ + if ( + len(parent_mutation) > 2 + ): + possible_mutations = [ UpgradeMutation.new(), RemoveMutation.new(), - ]) + ] + elif len(parent_mutation) > 0: + possible_mutations = [ + AddMutation.new(), + UpgradeMutation.new(), + RemoveMutation.new(), + ] var chosen_mutation = possible_mutations.pick_random() @@ -159,10 +167,10 @@ class DontMutate extends MutationPossibility: class AddMutation extends MutationPossibility: func mutate(parent_mutation : Array[PlantMutation] = [])-> Array[PlantMutation]: var new_mutations = parent_mutation.duplicate_deep() - var mut = PlantMutation.random_mutation() + var mut = PlantMutation.random_mutation(parent_mutation) if mut: - var existing_mut_id = new_mutations.find_custom(func(m:PlantMutation): m.get_mutation_name() == mut.get_mutation_name()) + var existing_mut_id = new_mutations.find_custom(func(m:PlantMutation): return m.get_mutation_name() == mut.get_mutation_name()) if existing_mut_id >= 0: new_mutations[existing_mut_id].level += 1 diff --git a/entities/player/inventory/scripts/items/shovel.gd b/entities/player/inventory/scripts/items/shovel.gd index 29d0d89..a0b6c99 100644 --- a/entities/player/inventory/scripts/items/shovel.gd +++ b/entities/player/inventory/scripts/items/shovel.gd @@ -4,10 +4,10 @@ class_name Shovel const SHOVEL_ZONE_RADIUS = 50 func get_item_name() -> String: - return "Shovel" + return tr("SHOVEL") func get_description() -> String: - return "Can dig up buried seeds and can be used to harvest mature plants." + return tr("SHOVEL_DESC_TEXT") func get_icon() -> Texture2D: return preload("res://common/icons/shovel.svg") @@ -19,7 +19,7 @@ func get_usage_object_affected(i : InspectableEntity) -> bool: return i is Plant or i is UndergroundLoot func use_text() -> String: - return "Dig" + return tr("DIG") func can_use(_player : Player, zone : Player.ActionZone) -> bool: var areas = zone.get_affected_areas() diff --git a/entities/player/inventory/scripts/items/trowel.gd b/entities/player/inventory/scripts/items/trowel.gd index 3004280..2b24424 100644 --- a/entities/player/inventory/scripts/items/trowel.gd +++ b/entities/player/inventory/scripts/items/trowel.gd @@ -4,10 +4,10 @@ class_name Trowel const TROWEL_ZONE_RADIUS = 50 func get_item_name() -> String: - return "Trowel" + return tr("TROWEL") func get_description() -> String: - return "Use it to harvest mature plants, can get a [b]bonus seed[/b] from each plant." + return tr("TROWEL_DESC_TEXT") func get_icon() -> Texture2D: return preload("res://common/icons/trowel.svg") diff --git a/entities/player/scripts/player.gd b/entities/player/scripts/player.gd index f2bf92d..1101278 100644 --- a/entities/player/scripts/player.gd +++ b/entities/player/scripts/player.gd @@ -187,7 +187,7 @@ func upgrade_max_energy(amount = 1): player_updated.emit(self) func upgrade_inventory_size(amount = 1): - data.inventory.items.resize(data.inventory.items.size() + amount) + data.inventory.size += 1 upgraded.emit() player_updated.emit(self) diff --git a/entities/scripts/inspectable_entity.gd b/entities/scripts/inspectable_entity.gd index 0a65c3f..5df2783 100644 --- a/entities/scripts/inspectable_entity.gd +++ b/entities/scripts/inspectable_entity.gd @@ -38,7 +38,7 @@ func card_info() -> CardInfo: if default_info_desc != "": var desc_section = CardSectionInfo.new( - "Description", + tr("DESCRIPTION"), default_info_desc ) desc_section.title_icon = DESC_ICON diff --git a/entities/underground_loot/scripts/underground_loot.gd b/entities/underground_loot/scripts/underground_loot.gd index bc0a3ee..3a045cf 100644 --- a/entities/underground_loot/scripts/underground_loot.gd +++ b/entities/underground_loot/scripts/underground_loot.gd @@ -4,27 +4,10 @@ class_name UndergroundLoot const AREA_WIDTH = 20 const LOOTED_ITEM_RANDOM_RANGE = 50 -const SPRITE_SCENE : PackedScene = preload("res://entities/underground_loot/underground_loot_sprite.tscn") - -@export var loot : Array[Item] - -@onready var sprite_object: Node2D = generate_sprite() -@onready var collision_shape: CollisionShape2D = generate_collision_shape() - - -func _init(_loot : Array[Item] = []): - loot = _loot - default_info_desc = "Contain some random seeds. [b]Dig it with a shovel.[/b]" +@export var item_number : int = 1 func pointer_text() -> String: - return "Buried Loot" - -func generate_sprite() -> Node2D: - var object = SPRITE_SCENE.instantiate() - - add_child(object) - - return object + return tr("BURIED_SEEDS") func generate_collision_shape() -> CollisionShape2D: var collision = CollisionShape2D.new() @@ -36,8 +19,19 @@ func generate_collision_shape() -> CollisionShape2D: return collision +func generate_loot() -> Array[Item]: + var seeds : Array[Item] = [] + if len(GameInfo.game_data.unlocked_plant_types): + seeds.append( + Seed.new( + GameInfo.game_data.unlocked_plant_types.pick_random() + ) + ) + return seeds + + func dig(): - for item in loot: + for item in generate_loot(): planet.drop_item(item, global_position, LOOTED_ITEM_RANDOM_RANGE) queue_free() diff --git a/entities/underground_loot/scripts/underground_loot_data.gd b/entities/underground_loot/scripts/underground_loot_data.gd index c691855..b75234b 100644 --- a/entities/underground_loot/scripts/underground_loot_data.gd +++ b/entities/underground_loot/scripts/underground_loot_data.gd @@ -1,11 +1,15 @@ extends EntityData class_name UndergroundLootData -@export var loot : Array[Item] +const SCENE = preload("res://entities/underground_loot/underground_loot.tscn") + +@export var item_number : int func _init(e : UndergroundLoot): - position = e.global_position - loot = e.loot + position = e.global_position + item_number = e.item_number func load() -> Entity: - return UndergroundLoot.new(loot) \ No newline at end of file + var loot : UndergroundLoot = (SCENE.instantiate() as UndergroundLoot) + loot.item_number = item_number + return loot diff --git a/entities/underground_loot/underground_loot.tscn b/entities/underground_loot/underground_loot.tscn new file mode 100644 index 0000000..5b79e09 --- /dev/null +++ b/entities/underground_loot/underground_loot.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=4 format=3 uid="uid://dxjud7bti0na0"] + +[ext_resource type="Script" uid="uid://dfd2hh12155lo" path="res://entities/underground_loot/scripts/underground_loot.gd" id="1_knus5"] +[ext_resource type="Texture2D" uid="uid://bu26h0iqutnky" path="res://entities/underground_loot/assets/sprites/underground_loot.svg" id="2_jfggo"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_knus5"] +radius = 20.09975 + +[node name="UndergroundLootSprites" type="Area2D"] +script = ExtResource("1_knus5") +default_info_title = "BURIED_SEEDS" +default_info_desc = "BURIED_SEEDS_DESC_TEXT" +metadata/_custom_type_script = "uid://d3bk52402ylvl" + +[node name="Sprite2D" type="Sprite2D" parent="."] +modulate = Color(0.286275, 0.219608, 0.313726, 1) +scale = Vector2(0.0806452, 0.0806452) +texture = ExtResource("2_jfggo") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_knus5") diff --git a/entities/underground_loot/underground_loot_sprite.tscn b/entities/underground_loot/underground_loot_sprite.tscn deleted file mode 100644 index d6002af..0000000 --- a/entities/underground_loot/underground_loot_sprite.tscn +++ /dev/null @@ -1,10 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dxjud7bti0na0"] - -[ext_resource type="Texture2D" uid="uid://bu26h0iqutnky" path="res://entities/underground_loot/assets/sprites/underground_loot.svg" id="1_t1xxm"] - -[node name="UndergroundLootSprites" type="Node2D"] - -[node name="Sprite2D" type="Sprite2D" parent="."] -modulate = Color(0.286275, 0.219608, 0.313726, 1) -scale = Vector2(0.0806452, 0.0806452) -texture = ExtResource("1_t1xxm") diff --git a/gui/game/card/card.tscn b/gui/game/card/card.tscn index 97afd84..0e8ed4d 100644 --- a/gui/game/card/card.tscn +++ b/gui/game/card/card.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=20 format=3 uid="uid://753270jjxmfg"] +[gd_scene load_steps=26 format=3 uid="uid://753270jjxmfg"] [ext_resource type="Theme" uid="uid://bgcmd213j6gk1" path="res://gui/ressources/default_theme.tres" id="1_m317d"] [ext_resource type="Script" uid="uid://b7f10wuounfan" path="res://gui/game/card/scripts/card.gd" id="2_kpm7h"] @@ -26,6 +26,30 @@ title_icon = ExtResource("6_7wc8v") text = "Text" metadata/_custom_type_script = "uid://dgbh38j13g5kn" +[sub_resource type="Resource" id="Resource_kpm7h"] +script = ExtResource("5_7wc8v") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_7wc8v"] +script = ExtResource("5_7wc8v") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_pmldi"] +script = ExtResource("5_7wc8v") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_gibok"] +script = ExtResource("5_7wc8v") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_vnqhg"] +script = ExtResource("5_7wc8v") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_on5kv"] +script = ExtResource("5_7wc8v") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + [sub_resource type="Resource" id="Resource_plgbn"] script = ExtResource("3_7wc8v") title = "Hello" @@ -33,7 +57,7 @@ type_icon = ExtResource("6_7wc8v") texture = ExtResource("7_mwhj8") important_stat_text = "10" important_stat_icon = ExtResource("3_kpm7h") -sections = Array[ExtResource("5_7wc8v")]([SubResource("Resource_mwhj8")]) +sections = Array[ExtResource("5_7wc8v")]([SubResource("Resource_mwhj8"), SubResource("Resource_kpm7h"), SubResource("Resource_7wc8v"), SubResource("Resource_pmldi"), SubResource("Resource_gibok"), SubResource("Resource_vnqhg"), SubResource("Resource_on5kv"), null]) metadata/_custom_type_script = "uid://dj2pv1hiwjfv0" [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vnqhg"] diff --git a/gui/game/card/card_visualiser.tscn b/gui/game/card/card_visualiser.tscn index 5d590a0..0539f1f 100644 --- a/gui/game/card/card_visualiser.tscn +++ b/gui/game/card/card_visualiser.tscn @@ -1,13 +1,14 @@ -[gd_scene load_steps=15 format=3 uid="uid://3ss8pvhsackj"] +[gd_scene load_steps=22 format=3 uid="uid://3ss8pvhsackj"] [ext_resource type="PackedScene" uid="uid://753270jjxmfg" path="res://gui/game/card/card.tscn" id="1_we78f"] [ext_resource type="Shader" uid="uid://bqjwmomh851lc" path="res://common/vfx/materials/shaders/skew.gdshader" id="1_x54se"] [ext_resource type="Script" uid="uid://dj5pld5ragrjp" path="res://gui/game/card/scripts/card_visualiser.gd" id="2_ntbk8"] [ext_resource type="Script" uid="uid://dj2pv1hiwjfv0" path="res://gui/game/card/scripts/card_info.gd" id="3_5yk1o"] +[ext_resource type="Texture2D" uid="uid://bd6qddv5ihkjr" path="res://common/icons/bucket.svg" id="3_r0jrf"] [ext_resource type="Script" uid="uid://dgbh38j13g5kn" path="res://gui/game/card/scripts/card_section_info.gd" id="4_7xkgc"] [ext_resource type="Script" uid="uid://b4tkium34c831" path="res://gui/game/card/scripts/card_stat_info.gd" id="5_1et8x"] -[ext_resource type="Texture2D" uid="uid://bt3g5bmar0icf" path="res://common/icons/growth.svg" id="6_7xkgc"] [ext_resource type="Texture2D" uid="uid://bsvxhafoxwmw0" path="res://common/icons/cube-3d-sphere.svg" id="7_1et8x"] +[ext_resource type="Texture2D" uid="uid://df0y0s666ui4h" path="res://icon.png" id="7_6vah0"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_r0jrf"] shader = ExtResource("1_x54se") @@ -17,13 +18,41 @@ shader_parameter/y_rot = -6e-45 shader_parameter/x_rot = -6e-45 shader_parameter/inset = 0.0 -[sub_resource type="ViewportTexture" id="ViewportTexture_5yk1o"] -viewport_path = NodePath("SubViewport") - [sub_resource type="Resource" id="Resource_r0jrf"] +script = ExtResource("4_7xkgc") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_6vah0"] +script = ExtResource("4_7xkgc") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_jjqcm"] +script = ExtResource("4_7xkgc") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_lj1tr"] +script = ExtResource("4_7xkgc") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_vabmf"] +script = ExtResource("4_7xkgc") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_1vjtn"] +script = ExtResource("4_7xkgc") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_l3vvu"] +script = ExtResource("4_7xkgc") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_bw03i"] script = ExtResource("3_5yk1o") title = "Hello" -texture = ExtResource("6_7xkgc") +texture = ExtResource("7_6vah0") +important_stat_text = "6" +important_stat_icon = ExtResource("3_r0jrf") +sections = Array[ExtResource("4_7xkgc")]([SubResource("Resource_r0jrf"), SubResource("Resource_6vah0"), SubResource("Resource_jjqcm"), SubResource("Resource_lj1tr"), SubResource("Resource_vabmf"), SubResource("Resource_1vjtn"), SubResource("Resource_l3vvu")]) metadata/_custom_type_script = "uid://dj2pv1hiwjfv0" [sub_resource type="Animation" id="Animation_1et8x"] @@ -39,31 +68,38 @@ _data = { &"appear": SubResource("Animation_7xkgc") } -[node name="CardVisualiser" type="TextureRect"] +[node name="CardVisualiser" type="SubViewportContainer"] material = SubResource("ShaderMaterial_r0jrf") -offset_left = -24.0 -offset_right = 276.0 -offset_bottom = 110.0 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -246.0 +offset_top = -134.0 +offset_right = 54.0 +offset_bottom = -24.0 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(1.0000002, 1.0000002) size_flags_horizontal = 0 size_flags_vertical = 4 mouse_filter = 2 -texture = SubResource("ViewportTexture_5yk1o") -stretch_mode = 4 script = ExtResource("2_ntbk8") -small_mode = true -card_info = SubResource("Resource_r0jrf") +card_info = SubResource("Resource_bw03i") [node name="SubViewport" type="SubViewport" parent="."] unique_name_in_owner = true transparent_bg = true +handle_input_locally = false size = Vector2i(300, 110) +size_2d_override_stretch = true +render_target_update_mode = 4 [node name="CardContainer" type="MarginContainer" parent="SubViewport"] unique_name_in_owner = true -clip_contents = true -offset_right = 350.0 +offset_right = 300.0 offset_bottom = 110.0 -size_flags_horizontal = 0 theme_override_constants/margin_left = 25 theme_override_constants/margin_top = 25 theme_override_constants/margin_right = 25 @@ -73,10 +109,11 @@ theme_override_constants/margin_bottom = 25 unique_name_in_owner = true self_modulate = Color(1, 1, 1, 0) layout_mode = 2 +size_flags_horizontal = 4 mouse_filter = 2 small_mode = true down_arrow = true -info = SubResource("Resource_r0jrf") +info = SubResource("Resource_bw03i") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] unique_name_in_owner = true diff --git a/gui/game/card/scripts/card_visualiser.gd b/gui/game/card/scripts/card_visualiser.gd index a25eae6..e7bd8c2 100644 --- a/gui/game/card/scripts/card_visualiser.gd +++ b/gui/game/card/scripts/card_visualiser.gd @@ -1,27 +1,55 @@ @tool -extends TextureRect +extends SubViewportContainer +class_name CardVisualiser + +signal clicked(c: CardVisualiser) const MAX_ROT = 15 -const ZOOM_SCALE = 1.0 +const ZOOM_SCALE = 1.2 var wanted_rot : Vector2 = Vector2.ZERO var real_rot : Vector2 = Vector2.ZERO -var wanted_scale : Vector2 = Vector2.ONE var is_ready = false -@export var small_mode : bool = false : +@export var card_width : int = 250 : set(v): + card_width = v + if is_ready : + update() + +@export var small_mode : bool = true : + set(v): + var old = small_mode small_mode = v - if is_ready : update() + if is_ready and old != small_mode : + update() + +@export var interactive_small_mode : bool = true +@export var interactive_zoom : bool = false + +@export var down_arrow : bool = true : + set(v): + var old = down_arrow + down_arrow = v + if is_ready and old != down_arrow : + update() @export var card_info : CardInfo = null : set(v): + var old = card_info card_info = v - if is_ready : update() + if is_ready and old != card_info: + update() @export_tool_button("Update", "Callable") var update_action = update +var updated_on_last_frame = false + +func _input(event): + if event.is_action_pressed("action") and is_mouse_over(): + clicked.emit(self) + func _ready(): material = material.duplicate() update() @@ -32,17 +60,21 @@ func _process(_d): if is_mouse_over(): wanted_rot = center_relative_mouse_position * MAX_ROT - small_mode = false + if interactive_small_mode: small_mode = false + if interactive_zoom: scale = scale.lerp(Vector2.ONE * ZOOM_SCALE, 0.2) else: wanted_rot = Vector2.ZERO - small_mode = true + if interactive_small_mode: small_mode = true + if interactive_zoom: scale = scale.lerp(Vector2.ONE, 0.2) real_rot = real_rot.lerp(wanted_rot, 0.1) material.set_shader_parameter("y_rot", - real_rot.x) material.set_shader_parameter("x_rot", real_rot.y) - %SubViewport.size.y = %CardContainer.size.y + %Card.custom_minimum_size.x = card_width + %CardContainer.size.y = 0 + %SubViewport.size = %CardContainer.size size = %SubViewport.size @@ -55,8 +87,10 @@ func is_mouse_over() -> bool: ) func update(): - if card_info: %Card.info = card_info %Card.small_mode = small_mode + %Card.down_arrow = down_arrow %Card.update() + + updated_on_last_frame = true diff --git a/gui/game/game_gui.tscn b/gui/game/game_gui.tscn index 50ae681..d7c16a8 100644 --- a/gui/game/game_gui.tscn +++ b/gui/game/game_gui.tscn @@ -1,74 +1,16 @@ -[gd_scene load_steps=29 format=3 uid="uid://12nak7amd1uq"] +[gd_scene load_steps=23 format=3 uid="uid://12nak7amd1uq"] [ext_resource type="Script" uid="uid://cqao7n800qy40" path="res://gui/game/scripts/game_gui.gd" id="1_udau0"] [ext_resource type="Theme" uid="uid://bgcmd213j6gk1" path="res://gui/ressources/default_theme.tres" id="2_nq5i2"] -[ext_resource type="Texture2D" uid="uid://cm3ehinvvj52i" path="res://gui/game/assets/texture/Interface sans boutons.png" id="3_n4kem"] [ext_resource type="PackedScene" uid="uid://fnv0qhkh40mv" path="res://gui/game/announce/announce.tscn" id="4_h6540"] [ext_resource type="Texture2D" uid="uid://dcgnamu7sb3ov" path="res://common/icons/bolt.svg" id="4_k4juk"] [ext_resource type="LabelSettings" uid="uid://dqwayi8yjwau2" path="res://gui/ressources/title_label_settings.tres" id="4_ujg5r"] +[ext_resource type="FontFile" uid="uid://qt80w6o01q5s" path="res://gui/ressources/fonts/TitanOne-Regular.ttf" id="5_2wykm"] +[ext_resource type="Script" uid="uid://0dhj8sdpil7q" path="res://gui/tools/control_animation_player.gd" id="6_id0t5"] [ext_resource type="Texture2D" uid="uid://bt3g5bmar0icf" path="res://common/icons/growth.svg" id="7_id0t5"] [ext_resource type="Texture2D" uid="uid://b5cuxgisrsfgt" path="res://common/icons/player-pause.svg" id="9_2wykm"] [ext_resource type="PackedScene" uid="uid://clicjf8ts51h8" path="res://gui/game/inventory_gui/inventory_gui.tscn" id="9_id0t5"] -[sub_resource type="Gradient" id="Gradient_id0t5"] -interpolation_mode = 1 -offsets = PackedFloat32Array(0, 0.115169, 0.41573, 0.620786, 0.924157) -colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_ykapk"] -gradient = SubResource("Gradient_id0t5") -fill_to = Vector2(1, 1) -repeat = 1 - -[sub_resource type="Animation" id="Animation_l73to"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:modulate") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Color(0.950568, 0, 0.346412, 1)] -} - -[sub_resource type="Animation" id="Animation_p6blc"] -resource_name = "default" -loop_mode = 1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:modulate") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.5, 1.03333), -"transitions": PackedFloat32Array(1, 1, 1), -"update": 0, -"values": [Color(0.950568, 0, 0.346412, 1), Color(0.999996, 0.39403, 0.49625, 1), Color(0.950568, 0, 0.346412, 1)] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_l3q4a"] -_data = { -&"RESET": SubResource("Animation_l73to"), -&"default": SubResource("Animation_p6blc") -} - -[sub_resource type="Gradient" id="Gradient_dr1y2"] -interpolation_mode = 1 -offsets = PackedFloat32Array(0, 0.697674) -colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_h6540"] -gradient = SubResource("Gradient_dr1y2") -width = 50 -height = 50 -fill = 1 -fill_from = Vector2(0.504274, 0.5) - [sub_resource type="Gradient" id="Gradient_2wykm"] offsets = PackedFloat32Array(0, 0.279476, 1) colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1) @@ -181,34 +123,10 @@ _data = { [sub_resource type="Animation" id="Animation_mbdxg"] length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("NoEnergyLeft:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0, -100)] -} [sub_resource type="Animation" id="Animation_w16yr"] resource_name = "no_energy_left_appear" length = 0.5 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("NoEnergyLeft:position") -tracks/0/interp = 2 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0.0666667, 0.5), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Vector2(0, -100), Vector2(0, 0)] -} [sub_resource type="AnimationLibrary" id="AnimationLibrary_p0xoq"] _data = { @@ -216,58 +134,23 @@ _data = { &"no_energy_left_appear": SubResource("Animation_w16yr") } -[node name="GameGui" type="Control"] +[node name="GameGui" type="CanvasLayer"] +script = ExtResource("1_udau0") + +[node name="ScoreParticles" type="Control" parent="."] +unique_name_in_owner = true layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -mouse_filter = 1 -script = ExtResource("1_udau0") - -[node name="NoEnergyLeft" type="VBoxContainer" parent="."] -unique_name_in_owner = true -visible = false -modulate = Color(0.950568, 0, 0.346412, 1) -layout_mode = 1 -anchors_preset = 10 -anchor_right = 1.0 -offset_top = -100.0 -offset_bottom = 2.0 -grow_horizontal = 2 -theme = ExtResource("2_nq5i2") -theme_override_constants/separation = 12 - -[node name="TextureRect" type="TextureRect" parent="NoEnergyLeft"] -custom_minimum_size = Vector2(0, 40) -layout_mode = 2 -texture = SubResource("GradientTexture2D_ykapk") -expand_mode = 1 -stretch_mode = 1 - -[node name="Label" type="Label" parent="NoEnergyLeft"] -layout_mode = 2 -theme = ExtResource("2_nq5i2") -text = "No energy left" -label_settings = ExtResource("4_ujg5r") -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="BlinkAnimation" type="AnimationPlayer" parent="NoEnergyLeft"] -libraries = { -&"": SubResource("AnimationLibrary_l3q4a") -} -autoplay = "default" +mouse_filter = 2 [node name="Announce" parent="." instance=ExtResource("4_h6540")] unique_name_in_owner = true -layout_mode = 1 [node name="MarginContainer" type="MarginContainer" parent="."] -layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -276,75 +159,86 @@ grow_vertical = 2 mouse_filter = 2 theme = ExtResource("2_nq5i2") -[node name="PlayerInfo" type="Control" parent="MarginContainer"] -custom_minimum_size = Vector2(337, 160) +[node name="EnergyInfo" type="HBoxContainer" parent="MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 0 +theme_override_constants/separation = 0 +metadata/_edit_use_anchors_ = true + +[node name="EnergyAnimationPlayer" type="Node" parent="MarginContainer/EnergyInfo"] +unique_name_in_owner = true +script = ExtResource("6_id0t5") +metadata/_custom_type_script = "uid://0dhj8sdpil7q" + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/EnergyInfo"] layout_mode = 2 size_flags_horizontal = 0 size_flags_vertical = 0 +theme_override_constants/margin_left = 0 +theme_override_constants/margin_top = -25 +theme_override_constants/margin_right = 0 +theme_override_constants/margin_bottom = -15 -[node name="Background" type="TextureRect" parent="MarginContainer/PlayerInfo"] +[node name="EnergyCount" type="RichTextLabel" parent="MarginContainer/EnergyInfo/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme = ExtResource("2_nq5i2") +theme_override_fonts/normal_font = ExtResource("5_2wykm") +theme_override_fonts/bold_font = ExtResource("5_2wykm") +theme_override_fonts/bold_italics_font = ExtResource("5_2wykm") +theme_override_fonts/italics_font = ExtResource("5_2wykm") +theme_override_font_sizes/normal_font_size = 30 +theme_override_font_sizes/bold_font_size = 100 +bbcode_enabled = true +text = "[b]X[/b] / X" +fit_content = true +autowrap_mode = 0 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Icon" type="TextureRect" parent="MarginContainer/EnergyInfo"] +custom_minimum_size = Vector2(50, 50) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 8 +texture = ExtResource("4_k4juk") +expand_mode = 4 +stretch_mode = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 4 + +[node name="DayCount" type="Label" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "Day 0" +label_settings = ExtResource("4_ujg5r") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="QuotaProgressBar" type="ProgressBar" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(400, 50) +layout_mode = 2 +theme = ExtResource("2_nq5i2") +rounded = true +show_percentage = false + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/QuotaProgressBar"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -texture = ExtResource("3_n4kem") -expand_mode = 2 -stretch_mode = 5 - -[node name="EnergyInfo" type="HBoxContainer" parent="MarginContainer/PlayerInfo"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = -1 -anchor_left = 0.27299702 -anchor_top = 0.453125 -anchor_right = 0.27299702 -anchor_bottom = 0.496875 -offset_left = -44.0 -offset_top = -12.5 -offset_right = 44.0 -offset_bottom = 12.5 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/separation = 0 -metadata/_edit_use_anchors_ = true - -[node name="Icon" type="TextureRect" parent="MarginContainer/PlayerInfo/EnergyInfo"] -custom_minimum_size = Vector2(36.64, 0) -layout_mode = 2 -texture = ExtResource("4_k4juk") -expand_mode = 2 -stretch_mode = 5 - -[node name="EnergyCount" type="Label" parent="MarginContainer/PlayerInfo/EnergyInfo"] -unique_name_in_owner = true -layout_mode = 2 -theme = ExtResource("2_nq5i2") -text = "X/X" -label_settings = ExtResource("4_ujg5r") -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="QuotaInfo" type="CenterContainer" parent="MarginContainer/PlayerInfo"] -layout_mode = 0 -offset_left = 176.0 -offset_top = 83.0 -offset_right = 247.0 -offset_bottom = 133.0 - -[node name="QuotaProgressBar" type="TextureProgressBar" parent="MarginContainer/PlayerInfo/QuotaInfo"] -unique_name_in_owner = true -modulate = Color(0.1801, 0.349497, 0.456794, 1) -layout_mode = 2 -fill_mode = 4 -texture_progress = SubResource("GradientTexture2D_h6540") - -[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/PlayerInfo/QuotaInfo"] -layout_mode = 2 theme_override_constants/separation = 2 +alignment = 1 -[node name="QuotaProgressText" type="Label" parent="MarginContainer/PlayerInfo/QuotaInfo/HBoxContainer"] +[node name="QuotaProgressText" type="Label" parent="MarginContainer/VBoxContainer/QuotaProgressBar/HBoxContainer"] unique_name_in_owner = true layout_mode = 2 text = "X" @@ -352,7 +246,7 @@ label_settings = ExtResource("4_ujg5r") horizontal_alignment = 1 vertical_alignment = 1 -[node name="TextureRect" type="TextureRect" parent="MarginContainer/PlayerInfo/QuotaInfo/HBoxContainer"] +[node name="TextureRect" type="TextureRect" parent="MarginContainer/VBoxContainer/QuotaProgressBar/HBoxContainer"] custom_minimum_size = Vector2(30, 30) layout_mode = 2 texture = ExtResource("7_id0t5") @@ -365,15 +259,6 @@ size_flags_horizontal = 8 size_flags_vertical = 0 alignment = 1 -[node name="DayCount" type="Label" parent="MarginContainer/TopRightContent"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 8 -size_flags_vertical = 0 -text = "Day 0" -label_settings = ExtResource("4_ujg5r") -vertical_alignment = 1 - [node name="Pause" type="Button" parent="MarginContainer/TopRightContent"] layout_mode = 2 size_flags_horizontal = 8 @@ -390,7 +275,6 @@ size_flags_vertical = 8 [node name="PassDayFade" type="ColorRect" parent="."] physics_interpolation_mode = 0 -layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -401,7 +285,6 @@ color = Color(0.0627451, 0.0588235, 0.168627, 0) [node name="Effect" type="TextureRect" parent="."] modulate = Color(1, 1, 1, 0) -layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 diff --git a/gui/game/inventory_gui/inventory_item/scripts/inventory_gui_item.gd b/gui/game/inventory_gui/inventory_item/scripts/inventory_gui_item.gd index ee6ed0c..8ce98a4 100644 --- a/gui/game/inventory_gui/inventory_item/scripts/inventory_gui_item.gd +++ b/gui/game/inventory_gui/inventory_item/scripts/inventory_gui_item.gd @@ -8,29 +8,27 @@ signal item_clicked() const MODULATE_INSPECTED_COLOR = Color.GRAY var current_item : Item = null +var item : Item = null var was_selected : bool = false func _ready(): - mouse_entered.connect(_on_mouse_entered) - mouse_exited.connect(_on_mouse_excited) + mouse_entered.connect( + func(): Pointer.inspect(self) + ) + mouse_exited.connect( + func(): Pointer.stop_inspect(self) + ) update(null, false) func inspect(is_inspected : bool = true): modulate = MODULATE_INSPECTED_COLOR if is_inspected else Color.WHITE -func _on_mouse_entered(): - if current_item: - Pointer.inspect(self) - -func _on_mouse_excited(): - if current_item: - Pointer.stop_inspect(self) - func _on_gui_input(_event: InputEvent) -> void: if Input.is_action_just_pressed("action"): emit_signal("item_clicked") -func update(item: Item, selected : bool): +func update(_item: Item, selected : bool): + item = _item if selected and not was_selected: %SelectedAnimation.play("selected") elif not selected and was_selected: diff --git a/gui/game/pause/pause.tscn b/gui/game/pause/pause.tscn index 47b67ff..8dfbc1f 100644 --- a/gui/game/pause/pause.tscn +++ b/gui/game/pause/pause.tscn @@ -120,37 +120,19 @@ alignment = 1 [node name="PauseTitle" type="Label" parent="Container/Tutorial/VBoxContainer"] layout_mode = 2 -text = "Pause" +text = "PAUSE" label_settings = SubResource("LabelSettings_apjlw") horizontal_alignment = 1 -[node name="StoryTitle" type="Label" parent="Container/Tutorial/VBoxContainer"] -layout_mode = 2 -text = "Story" -label_settings = ExtResource("3_0pdto") -horizontal_alignment = 1 - -[node name="StoryText" type="Label" parent="Container/Tutorial/VBoxContainer"] -layout_mode = 2 -text = "You are a robot who has recently arrived on a barren planet. Find and plant seeds to reduce the contamination. -You have limited energy, but can recharge when passing days. -Each 7 days, you have to meet a quota of decontaminted lands. -You get a machine to build each quota reached." -horizontal_alignment = 1 - [node name="ControlsTitle" type="Label" parent="Container/Tutorial/VBoxContainer"] layout_mode = 2 -text = "Controls" +text = "CONTROLS" label_settings = ExtResource("3_0pdto") horizontal_alignment = 1 [node name="ControlsText" type="Label" parent="Container/Tutorial/VBoxContainer"] layout_mode = 2 -text = "Directional Arrows/Right Click : Move -Left Click : Interact/Pickup Items -Mouse Wheel : Change current item -X : Drop Item -" +text = "CONTROLS_TEXT" horizontal_alignment = 1 [node name="HBoxContainer" type="HBoxContainer" parent="Container/Tutorial/VBoxContainer"] @@ -159,17 +141,17 @@ alignment = 1 [node name="Resume" type="Button" parent="Container/Tutorial/VBoxContainer/HBoxContainer"] layout_mode = 2 -text = "Resume Game" +text = "RESUME_GAME" icon = ExtResource("5_apjlw") [node name="Restart" type="Button" parent="Container/Tutorial/VBoxContainer/HBoxContainer"] layout_mode = 2 -text = "Restart" +text = "RESTART" icon = ExtResource("6_58dya") [node name="Quit" type="Button" parent="Container/Tutorial/VBoxContainer/HBoxContainer"] layout_mode = 2 -text = "Quit" +text = "QUIT" icon = ExtResource("7_yj6f1") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] diff --git a/gui/game/pause/scripts/pause.gd b/gui/game/pause/scripts/pause.gd index 66f6e7c..4feccc9 100644 --- a/gui/game/pause/scripts/pause.gd +++ b/gui/game/pause/scripts/pause.gd @@ -2,6 +2,8 @@ extends CanvasLayer var pause = false : set = set_pause +const PLANET_RUN_SCENE = preload("res://stages/planet_run/planet_run.tscn") + func set_pause(p): if p != pause: if p: @@ -22,7 +24,7 @@ func _on_resume_pressed(): func _on_restart_pressed(): GameInfo.game_data.reset_all() pause = false - get_tree().reload_current_scene() + get_tree().change_scene_to_packed(PLANET_RUN_SCENE) func _on_quit_pressed(): get_tree().quit() diff --git a/gui/game/quota_reward/quota_reward.tscn b/gui/game/quota_reward/quota_reward.tscn new file mode 100644 index 0000000..2a28022 --- /dev/null +++ b/gui/game/quota_reward/quota_reward.tscn @@ -0,0 +1,140 @@ +[gd_scene load_steps=10 format=3 uid="uid://doxm7uab8i3tq"] + +[ext_resource type="Script" uid="uid://12kjdou2kp5y" path="res://gui/game/quota_reward/scripts/quota_reward.gd" id="1_gye62"] +[ext_resource type="Shader" uid="uid://cuni3ggtw2uuy" path="res://gui/game/pause/resources/blur.gdshader" id="2_6ibex"] +[ext_resource type="Theme" uid="uid://bgcmd213j6gk1" path="res://gui/ressources/default_theme.tres" id="3_x2kx4"] +[ext_resource type="LabelSettings" uid="uid://dqwayi8yjwau2" path="res://gui/ressources/title_label_settings.tres" id="4_trw0e"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_gy0la"] +shader = ExtResource("2_6ibex") +shader_parameter/strength = 3.3 +shader_parameter/mix_percentage = 0.3 + +[sub_resource type="Theme" id="Theme_7fpy7"] + +[sub_resource type="Animation" id="Animation_8323k"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("RewardChoiceContainer:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("RewardChoiceContainer:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} + +[sub_resource type="Animation" id="Animation_4f1tl"] +resource_name = "show" +length = 0.3 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("RewardChoiceContainer:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0.033333335, 0.3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("RewardChoiceContainer:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.033333335), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_7fpy7"] +_data = { +&"RESET": SubResource("Animation_8323k"), +&"show": SubResource("Animation_4f1tl") +} + +[node name="RewardChoice" type="CanvasLayer"] +process_mode = 3 +script = ExtResource("1_gye62") + +[node name="RewardChoiceContainer" type="Control" parent="."] +unique_name_in_owner = true +modulate = Color(1, 1, 1, 0) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ColorRect" type="ColorRect" parent="RewardChoiceContainer"] +material = SubResource("ShaderMaterial_gy0la") +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.0352941, 0.0196078, 0.12549, 0.705882) + +[node name="Choice" type="MarginContainer" parent="RewardChoiceContainer"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("3_x2kx4") +theme_override_constants/margin_left = 30 +theme_override_constants/margin_top = 30 +theme_override_constants/margin_right = 30 +theme_override_constants/margin_bottom = 30 + +[node name="VSplitContainer" type="VBoxContainer" parent="RewardChoiceContainer/Choice"] +layout_mode = 2 +theme = ExtResource("3_x2kx4") +alignment = 1 + +[node name="Label" type="Label" parent="RewardChoiceContainer/Choice/VSplitContainer"] +layout_mode = 2 +theme = SubResource("Theme_7fpy7") +text = "CHOOSE_A_REWARD" +label_settings = ExtResource("4_trw0e") +horizontal_alignment = 1 + +[node name="Label2" type="Label" parent="RewardChoiceContainer/Choice/VSplitContainer"] +layout_mode = 2 +theme = ExtResource("3_x2kx4") +text = "REWARD_SCREEN_TEXT" +horizontal_alignment = 1 + +[node name="ChoicesContainer" type="HBoxContainer" parent="RewardChoiceContainer/Choice/VSplitContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme = ExtResource("3_x2kx4") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +libraries = { +&"": SubResource("AnimationLibrary_7fpy7") +} diff --git a/gui/game/quota_reward/quota_reward_choice/quota_reward_choice.tscn b/gui/game/quota_reward/quota_reward_choice/quota_reward_choice.tscn new file mode 100644 index 0000000..2fd145b --- /dev/null +++ b/gui/game/quota_reward/quota_reward_choice/quota_reward_choice.tscn @@ -0,0 +1,96 @@ +[gd_scene load_steps=20 format=3 uid="uid://caupeuds0holj"] + +[ext_resource type="Script" uid="uid://bhhhw2ywxmmba" path="res://gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice.gd" id="1_5arw8"] +[ext_resource type="LabelSettings" uid="uid://dqwayi8yjwau2" path="res://gui/ressources/title_label_settings.tres" id="1_pjvy1"] +[ext_resource type="Script" uid="uid://dj2pv1hiwjfv0" path="res://gui/game/card/scripts/card_info.gd" id="2_0lvi7"] +[ext_resource type="PackedScene" uid="uid://3ss8pvhsackj" path="res://gui/game/card/card_visualiser.tscn" id="2_5arw8"] +[ext_resource type="Script" uid="uid://bist0wp4nrswp" path="res://gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice_info.gd" id="2_hirys"] +[ext_resource type="Shader" uid="uid://bqjwmomh851lc" path="res://common/vfx/materials/shaders/skew.gdshader" id="3_07hub"] +[ext_resource type="Script" uid="uid://dgbh38j13g5kn" path="res://gui/game/card/scripts/card_section_info.gd" id="3_llc24"] +[ext_resource type="Texture2D" uid="uid://0hbdgalf04e" path="res://common/icons/wood.svg" id="4_llc24"] +[ext_resource type="Script" uid="uid://b4tkium34c831" path="res://gui/game/card/scripts/card_stat_info.gd" id="4_tsfju"] +[ext_resource type="Texture2D" uid="uid://bsvxhafoxwmw0" path="res://common/icons/cube-3d-sphere.svg" id="5_nnvhv"] + +[sub_resource type="Resource" id="Resource_tsfju"] +script = ExtResource("3_llc24") +title_colored = true +title_text = "Hello" +title_icon = ExtResource("4_llc24") +text = "This is text" +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_llc24"] +script = ExtResource("3_llc24") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_nnvhv"] +script = ExtResource("3_llc24") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_rnvv6"] +script = ExtResource("3_llc24") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_0or1o"] +script = ExtResource("3_llc24") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_46ofu"] +script = ExtResource("3_llc24") +metadata/_custom_type_script = "uid://dgbh38j13g5kn" + +[sub_resource type="Resource" id="Resource_3bvi2"] +script = ExtResource("2_0lvi7") +title = "Reward" +sections = Array[ExtResource("3_llc24")]([SubResource("Resource_tsfju"), SubResource("Resource_llc24"), SubResource("Resource_nnvhv"), SubResource("Resource_rnvv6"), SubResource("Resource_0or1o"), SubResource("Resource_46ofu")]) +metadata/_custom_type_script = "uid://dj2pv1hiwjfv0" + +[sub_resource type="Resource" id="Resource_apks8"] +script = ExtResource("2_hirys") +title = "One Reward" +text = "Je m" +card_info = SubResource("Resource_3bvi2") +metadata/_custom_type_script = "uid://bist0wp4nrswp" + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_llc24"] +shader = ExtResource("3_07hub") +shader_parameter/fov = 90.0 +shader_parameter/cull_back = true +shader_parameter/y_rot = -6e-45 +shader_parameter/x_rot = -6e-45 +shader_parameter/inset = 0.0 + +[node name="QuotaRewardChoice" type="VBoxContainer"] +size_flags_horizontal = 3 +size_flags_vertical = 3 +mouse_filter = 0 +alignment = 1 +script = ExtResource("1_5arw8") +info = SubResource("Resource_apks8") + +[node name="QuotaRewardTitle" type="Label" parent="."] +unique_name_in_owner = true +layout_mode = 2 +text = "One Reward" +label_settings = ExtResource("1_pjvy1") +horizontal_alignment = 1 + +[node name="QuotaRewardText" type="RichTextLabel" parent="."] +unique_name_in_owner = true +layout_mode = 2 +bbcode_enabled = true +text = "Je m" +fit_content = true +horizontal_alignment = 1 + +[node name="QuotaRewardCenterContainer" type="CenterContainer" parent="."] +layout_mode = 2 + +[node name="QuotaRewardCard" parent="QuotaRewardCenterContainer" instance=ExtResource("2_5arw8")] +unique_name_in_owner = true +material = SubResource("ShaderMaterial_llc24") +layout_mode = 2 +small_mode = false +interactive_small_mode = false +down_arrow = false +card_info = SubResource("Resource_3bvi2") diff --git a/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice.gd b/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice.gd new file mode 100644 index 0000000..76a20d6 --- /dev/null +++ b/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice.gd @@ -0,0 +1,30 @@ +@tool +extends VBoxContainer +class_name QuotaRewardChoice + +signal card_clicked(c : VBoxContainer) + +var is_ready = false + +@export var info : QuotaRewardChoiceInfo = null : + set(v): + info = v + if is_ready : update() + +@export_tool_button("Update", "Callable") var update_action = update + +func _ready(): + update() + %QuotaRewardCard.clicked.connect( + func (_c : CardVisualiser): + card_clicked.emit(self) + ) + is_ready = true + +func update(): + if info: + %QuotaRewardTitle.text = info.title + %QuotaRewardText.text = info.text + %QuotaRewardCard.card_info = info.card_info + %QuotaRewardCard.update() + diff --git a/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice.gd.uid b/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice.gd.uid new file mode 100644 index 0000000..52892c4 --- /dev/null +++ b/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice.gd.uid @@ -0,0 +1 @@ +uid://bhhhw2ywxmmba diff --git a/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice_info.gd b/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice_info.gd new file mode 100644 index 0000000..ffc66cf --- /dev/null +++ b/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice_info.gd @@ -0,0 +1,8 @@ +extends Resource +class_name QuotaRewardChoiceInfo + +@export var title : String = "" + +@export var text : String = "" + +@export var card_info : CardInfo = null diff --git a/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice_info.gd.uid b/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice_info.gd.uid new file mode 100644 index 0000000..5f3284f --- /dev/null +++ b/gui/game/quota_reward/quota_reward_choice/scripts/quota_reward_choice_info.gd.uid @@ -0,0 +1 @@ +uid://bist0wp4nrswp diff --git a/gui/game/quota_reward/scripts/quota_reward.gd b/gui/game/quota_reward/scripts/quota_reward.gd new file mode 100644 index 0000000..402d783 --- /dev/null +++ b/gui/game/quota_reward/scripts/quota_reward.gd @@ -0,0 +1,122 @@ +@tool +extends CanvasLayer +class_name QuotaReward + +const REWARD_CHOICE_SCENE : PackedScene = preload("res://gui/game/quota_reward/quota_reward_choice/quota_reward_choice.tscn") + +signal reward_chosen + +var showing_rewards: bool = false + +var rewards : Array[QuotaReward.RewardData] = [] + +func _ready(): + %RewardChoiceContainer.visible = false + +func show_rewards(): + showing_rewards = true + %AnimationPlayer.play("show") + +func hide_rewards(): + showing_rewards = false + %AnimationPlayer.play_backwards("show") + +func generate_rewards(nb : int = 3): + var new_rewards : Array[QuotaReward.RewardData] = [] + + var max_retry = 20 + + while len(new_rewards) < nb or max_retry < 0: + max_retry -= 1 + + var new_reward = ( + generate_discover_plant_reward() + if len(GameInfo.game_data.unlocked_plant_types) == 0 or randi() % 2 == 0 + else generate_evolution_plant_reward() + ) + + if new_rewards.find_custom(func(r): return r.reward_info().title == new_reward.reward_info().title) == -1: + new_rewards.append(new_reward) + else : + max_retry -= 1 + + rewards = new_rewards + +func generate_rewards_choices(): + for c in %ChoicesContainer.get_children(): + c.queue_free() + + for r in rewards: + var reward_choice : QuotaRewardChoice = REWARD_CHOICE_SCENE.instantiate() as QuotaRewardChoice + reward_choice.info = r.reward_info() + reward_choice.card_clicked.connect( + func (_c): + if showing_rewards: choose_reward(r) + ) + %ChoicesContainer.add_child(reward_choice) + +func generate_discover_plant_reward() -> RewardData: + return DiscoverPlantReward.new( + GameInfo.game_data.get_locked_plant_types().pick_random() + ) + +func generate_evolution_plant_reward() -> RewardData: + return EvolvePlantReward.new( + GameInfo.game_data.unlocked_plant_types.pick_random().get_available_evolution().pick_random() + ) + +func choose_reward(r : RewardData): + r.reward() + reward_chosen.emit() + hide_rewards() + +func trigger_reward(): + generate_rewards() + generate_rewards_choices() + show_rewards() + +class RewardData: + + func reward_info() -> QuotaRewardChoiceInfo: + return null + + func reward(): + pass + +class DiscoverPlantReward extends RewardData: + + var new_plant_type : PlantType + + func _init(_new_plant_type): + new_plant_type = _new_plant_type + + func reward_info() -> QuotaRewardChoiceInfo: + var info = QuotaRewardChoiceInfo.new() + info.title = tr("DISCOVER_%s") % new_plant_type.name + info.text = tr("%s_SEEDS_CAN_NOW_BE_FOUND") % new_plant_type.name + info.card_info = new_plant_type.card_info() + + return info + + func reward(): + GameInfo.game_data.unlock_plant_type(new_plant_type) + +class EvolvePlantReward extends RewardData: + + var plant_evolution : PlantType.Evolution + + func _init(_plant_evolution): + plant_evolution = _plant_evolution + + func reward_info() -> QuotaRewardChoiceInfo: + var info = QuotaRewardChoiceInfo.new() + info.title = tr("EVOLVE_%s") % plant_evolution.plant_type.name + info.text = plant_evolution.get_description() + var preview_evolved_plant = plant_evolution.plant_type.duplicate_deep() + plant_evolution.evolve(preview_evolved_plant) + info.card_info = preview_evolved_plant.card_info() + + return info + + func reward(): + plant_evolution.evolve() diff --git a/gui/game/reward_choice/scripts/reward_choice.gd.uid b/gui/game/quota_reward/scripts/quota_reward.gd.uid similarity index 100% rename from gui/game/reward_choice/scripts/reward_choice.gd.uid rename to gui/game/quota_reward/scripts/quota_reward.gd.uid diff --git a/gui/game/reward_choice/reward_choice.tscn b/gui/game/reward_choice/reward_choice.tscn deleted file mode 100644 index 66aba52..0000000 --- a/gui/game/reward_choice/reward_choice.tscn +++ /dev/null @@ -1,177 +0,0 @@ -[gd_scene load_steps=11 format=3 uid="uid://doxm7uab8i3tq"] - -[ext_resource type="Script" uid="uid://12kjdou2kp5y" path="res://gui/game/reward_choice/scripts/reward_choice.gd" id="1_4f1tl"] -[ext_resource type="Shader" uid="uid://cuni3ggtw2uuy" path="res://gui/game/pause/resources/blur.gdshader" id="1_iykpa"] -[ext_resource type="Theme" uid="uid://bgcmd213j6gk1" path="res://gui/ressources/default_theme.tres" id="2_c278i"] -[ext_resource type="FontFile" uid="uid://cpnsnrqhfkj3k" path="res://gui/ressources/fonts/spincycle_ot.otf" id="3_5sqh2"] -[ext_resource type="Texture2D" uid="uid://0xg54agef5gh" path="res://common/icons/package.svg" id="4_qmlcw"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_gy0la"] -shader = ExtResource("1_iykpa") -shader_parameter/strength = 3.3 -shader_parameter/mix_percentage = 0.3 - -[sub_resource type="LabelSettings" id="LabelSettings_4f1tl"] -font = ExtResource("3_5sqh2") -font_size = 50 - -[sub_resource type="Animation" id="Animation_8323k"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:visible") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".: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_4f1tl"] -resource_name = "show" -length = 0.3 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:visible") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.0333333), -"transitions": PackedFloat32Array(1, 1), -"update": 1, -"values": [false, true] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".:modulate") -tracks/1/interp = 2 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0.0333333, 0.3), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_7fpy7"] -_data = { -&"RESET": SubResource("Animation_8323k"), -&"show": SubResource("Animation_4f1tl") -} - -[node name="RewardChoice" type="Control"] -process_mode = 3 -visible = false -modulate = Color(1, 1, 1, 0) -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_4f1tl") - -[node name="ColorRect" type="ColorRect" parent="."] -material = SubResource("ShaderMaterial_gy0la") -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -color = Color(0.0352941, 0.0196078, 0.12549, 0.705882) - -[node name="Choice" type="MarginContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme = ExtResource("2_c278i") - -[node name="VSplitContainer" type="VBoxContainer" parent="Choice"] -layout_mode = 2 -theme = ExtResource("2_c278i") -alignment = 1 - -[node name="Label" type="Label" parent="Choice/VSplitContainer"] -layout_mode = 2 -text = "You reached the quota !" -label_settings = SubResource("LabelSettings_4f1tl") -horizontal_alignment = 1 - -[node name="Label2" type="Label" parent="Choice/VSplitContainer"] -layout_mode = 2 -text = "Choose a reward" -horizontal_alignment = 1 - -[node name="GridContainer" type="GridContainer" parent="Choice/VSplitContainer"] -layout_mode = 2 -theme = ExtResource("2_c278i") -columns = 2 - -[node name="Reward1" type="VBoxContainer" parent="Choice/VSplitContainer/GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="Reward1Button" type="Button" parent="Choice/VSplitContainer/GridContainer/Reward1"] -unique_name_in_owner = true -process_mode = 3 -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Compost" -icon = ExtResource("4_qmlcw") - -[node name="Reward1Desc" type="Label" parent="Choice/VSplitContainer/GridContainer/Reward1"] -unique_name_in_owner = true -layout_mode = 2 -text = "The Compost can do so mush things.... But it's a little gross !" -horizontal_alignment = 1 - -[node name="Reward2" type="VBoxContainer" parent="Choice/VSplitContainer/GridContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="Reward2Button" type="Button" parent="Choice/VSplitContainer/GridContainer/Reward2"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "Compost" -icon = ExtResource("4_qmlcw") - -[node name="Reward2Desc" type="Label" parent="Choice/VSplitContainer/GridContainer/Reward2"] -unique_name_in_owner = true -layout_mode = 2 -text = "The Compost can do so mush things.... But it's a little gross !" -horizontal_alignment = 1 - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] -unique_name_in_owner = true -libraries = { -&"": SubResource("AnimationLibrary_7fpy7") -} - -[connection signal="pressed" from="Choice/VSplitContainer/GridContainer/Reward1/Reward1Button" to="." method="_on_reward_1_button_pressed"] -[connection signal="pressed" from="Choice/VSplitContainer/GridContainer/Reward2/Reward2Button" to="." method="_on_reward_2_button_pressed"] diff --git a/gui/game/reward_choice/scripts/reward_choice.gd b/gui/game/reward_choice/scripts/reward_choice.gd deleted file mode 100644 index fd21437..0000000 --- a/gui/game/reward_choice/scripts/reward_choice.gd +++ /dev/null @@ -1,39 +0,0 @@ -extends Control - -var planet: Planet -var item1: Item -var item2: Item - -func show_rewards(): - get_tree().paused = true - %AnimationPlayer.play("show") - get_tree().paused = true - -func hide_rewards(): - get_tree().paused = false - %AnimationPlayer.play_backwards("show") - get_tree().paused = false - -func _on_planet_quota_reward_asked(_planet:Planet, _item1:Item, _item2:Item): - planet = _planet - item1 = _item1 - item2 = _item2 - - %Reward1Button.text = item1.name - %Reward1Button.icon = item1.icon - %Reward1Desc.text = item1.description - - %Reward2Button.text = item2.name - %Reward2Button.icon = item2.icon - %Reward2Desc.text = item2.description - show_rewards() - -func _on_reward_1_button_pressed(): - if planet: - planet.choose_quota_reward(item1) - hide_rewards() - -func _on_reward_2_button_pressed(): - if planet: - planet.choose_quota_reward(item2) - hide_rewards() \ No newline at end of file diff --git a/gui/game/scripts/game_gui.gd b/gui/game/scripts/game_gui.gd index ece9932..85af332 100644 --- a/gui/game/scripts/game_gui.gd +++ b/gui/game/scripts/game_gui.gd @@ -1,30 +1,38 @@ -extends Control +extends CanvasLayer class_name GameGui -signal pause_asked +const SCORE_ICON : Texture = preload("res://common/icons/growth.svg") + +@export var quota_reward : QuotaReward func _ready(): GameInfo.game_data.current_planet_data.updated.connect(_on_planet_updated) + GameInfo.game_data.current_planet_data.plant_gaining_score.connect(_on_plant_gaining_score) GameInfo.game_data.current_planet_data.new_quota_started.connect(_on_planet_new_quota_started) GameInfo.game_data.player_data.updated.connect(_on_player_updated) GameInfo.game_data.player_data.inventory.updated.connect(_on_inventory_updated) + planet_update(GameInfo.game_data.current_planet_data, false) + player_update(GameInfo.game_data.player_data, false) + inventory_update(GameInfo.game_data.player_data.inventory) + if not GameInfo.game_data.current_planet_data.is_quota_announced: + await quota_reward.reward_chosen announce_quota(GameInfo.game_data.current_planet_data) GameInfo.game_data.current_planet_data.is_quota_announced = true - planet_update(GameInfo.game_data.current_planet_data) - player_update(GameInfo.game_data.player_data) - inventory_update(GameInfo.game_data.player_data.inventory) + %EnergyInfo.update_minimum_size() func _on_player_updated(player_data : PlayerData): player_update(player_data) -func player_update(player_data : PlayerData): - %EnergyCount.text = "%d/%d" % [player_data.energy, player_data.max_energy] - %EnergyInfo.modulate = Color.WHITE if player_data.energy > 0 else Color.RED +func player_update(player_data : PlayerData, with_animation = true): + var energy_count_text = "[b]%d[/b] / %d" % [player_data.energy, player_data.max_energy] - update_no_energy_left_info(player_data.energy) + if energy_count_text != %EnergyCount.text and with_animation: + %EnergyAnimationPlayer.bounce() + %EnergyCount.text = energy_count_text + %EnergyInfo.modulate = Color.WHITE if player_data.energy > 0 else Color.RED func _on_inventory_updated(inventory : Inventory): inventory_update(inventory) @@ -35,26 +43,67 @@ func inventory_update(inventory : Inventory): func _on_planet_updated(planet_data : PlanetData): planet_update(planet_data) -func planet_update(planet_data : PlanetData): +func planet_update(planet_data : PlanetData, with_animation = true): if planet_data: - %DayCount.text = "%d days left" % (planet_data.quota_days) + %DayCount.text = tr("%d_DAY_LEFT") % (planet_data.quota_days) var quota_progression_percent : float = (float(planet_data.garden_score) / float(planet_data.get_quota_score())) * 100 %QuotaProgressText.text = "%d/%d" % [planet_data.garden_score, planet_data.get_quota_score()] - get_tree().create_tween().tween_property( - %QuotaProgressBar, - "value", - quota_progression_percent, - 0.5, + + if with_animation: + get_tree().create_tween().tween_property( + %QuotaProgressBar, + "value", + quota_progression_percent, + 0.5, + ) + else: %QuotaProgressBar.value = quota_progression_percent + +func _on_plant_gaining_score(plant: Plant, amount : int): + for i in range(amount): + var camera = get_viewport().get_camera_2d() + var screen_size = get_viewport().get_visible_rect().size + + spawn_score_particle( + plant.global_position - camera.global_position + screen_size / 2, + %QuotaProgressBar.global_position + %QuotaProgressBar.size / 2, + 0.8 ) + await get_tree().create_timer(0.3).timeout + +func spawn_score_particle( + from_position, + to_position, + duration +): + var sprite_particle = Sprite2D.new() + sprite_particle.texture = SCORE_ICON + %ScoreParticles.add_child(sprite_particle) + sprite_particle.position = from_position + + var tween = get_tree().create_tween() + + tween.set_trans(Tween.TransitionType.TRANS_SPRING) + + tween.tween_property( + sprite_particle, + "position", + to_position, + duration + ) + + + await tween.finished + sprite_particle.queue_free() + + func _on_player_action_tried_without_energy(): $AnimationPlayer.play("no_energy_left") func _on_pause_pressed(): Pause.pause = true - func _on_player_upgraded(): $EffectAnimation.play("upgrade") @@ -64,30 +113,23 @@ func _on_planet_pass_day_started(planet): await $PassDayAnimation.animation_finished $PassDayAnimation.speed_scale = 1 -func update_no_energy_left_info(energy): - if energy == 0 and not %NoEnergyLeft.visible: - %NoEnergyLeft.visible = true - $NoEnergyLeftAnimation.play("no_energy_left_appear") - elif energy != 0 and %NoEnergyLeft.visible: - %NoEnergyLeft.visible = false - - func _on_planet_new_quota_started(planet_data : PlanetData): - announce_quota(planet_data) planet_update(planet_data) + await quota_reward.reward_chosen + announce_quota(planet_data) planet_data.is_quota_announced = true func announce_quota(planet_data : PlanetData): %Announce.announce( - "New Quota", - "Reach %d garden score before %d days" % [planet_data.get_quota_score(), planet_data.get_quota_duration()] + tr("NEW_QUOTA"), + tr("REACH_%d_GARDEN_SCORE_BEFORE_%d_DAYS") % [planet_data.get_quota_score(), planet_data.get_quota_duration()] ) func _on_planet_pass_day_ended(planet:Planet): if planet.data.quota_days == 1: %Announce.announce( - "Last day for reaching quota", - str(roundi(planet.data.get_quota_score() - planet.garden.get_score())) + " garden score left", + tr("LAST_DAY_FOR_REACHING_QUOTA"), + tr("%d_GARDEN_SCORE_LEFT") % [planet.data.get_quota_score() - planet.garden.get_score()], Announce.RED_COLOR ) diff --git a/gui/game/tutorial/scripts/tutorial.gd b/gui/game/tutorial/scripts/tutorial.gd index 05ce0d9..0d809bd 100644 --- a/gui/game/tutorial/scripts/tutorial.gd +++ b/gui/game/tutorial/scripts/tutorial.gd @@ -61,7 +61,7 @@ class TakeShovelStep extends Step: func generate_indicators(_p: Player, planet : Planet) -> Array[InGameIndicator]: for entity in planet.entity_container.get_children(): if entity is ItemObject and entity.item is Shovel: - var indicator = generate_indicator("Take the Shovel") + var indicator = generate_indicator(tr("TAKE_THE_SHOVEL")) indicator.follow_entity(entity) return [ indicator @@ -88,7 +88,7 @@ class DigLootStep extends Step: closest_loot = entity if closest_loot: - var indicator = generate_indicator("Dig Underground Loot") + var indicator = generate_indicator(tr("DIG_UNDERGROUND_LOOT")) indicator.follow_entity(closest_loot) return [indicator] return [] @@ -104,7 +104,7 @@ class TakeSeedStep extends Step: var indicators : Array[InGameIndicator] = [] for entity in planet.entity_container.get_children(): if entity is ItemObject and entity.item is Seed: - var indicator = generate_indicator("Take a seed") + var indicator = generate_indicator(tr("TAKE_A_SEED")) indicator.follow_entity(entity) indicators.append( indicator @@ -119,7 +119,7 @@ class TakeSeedStep extends Step: class PlantSeedStep extends Step: func generate_indicators(_p: Player, planet : Planet) -> Array[InGameIndicator]: - var indicator = generate_indicator("Plant the seed in decontamined zone") + var indicator = generate_indicator(tr("PLANT_THE_SEED_IN_DECONTAMINED_ZONE")) indicator.follow_game_position(Vector2(0,0) + planet.entity_container.global_position) return [indicator] @@ -132,7 +132,7 @@ class PlantSeedStep extends Step: class RechargeStep extends Step: func generate_indicators(_p: Player, planet : Planet) -> Array[InGameIndicator]: for entity in planet.entity_container.get_children(): - var indicator = generate_indicator("Recharge to pass days") + var indicator = generate_indicator(tr("RECHARGE_TO_PASS_DAYS")) indicator.follow_entity(entity) if entity is TruckRecharge: return [ @@ -166,7 +166,7 @@ class HarvestMaturePlant extends Step: var indicators : Array[InGameIndicator] = [] for entity in planet.entity_container.get_children(): if entity is Plant and entity.state == Plant.State.MATURE: - var indicator = generate_indicator("Harvest mature plants with shovel") + var indicator = generate_indicator(tr("HARVEST_MATURE_PLANTS_WITH_SHOVEL")) indicator.follow_entity(entity) indicators.append( indicator diff --git a/gui/game/win/scripts/win.gd b/gui/game/win/scripts/win.gd index fe5e113..955c93c 100644 --- a/gui/game/win/scripts/win.gd +++ b/gui/game/win/scripts/win.gd @@ -1,17 +1,19 @@ extends Control +const PLANET_RUN_SCENE = preload("res://stages/planet_run/planet_run.tscn") + func _ready(): visible = false func win(planet : Planet): visible = true get_tree().paused = true - %WinTitle.text = "Score : " + str(roundi(planet.garden.get_score())) + %WinTitle.text = tr("SCORE_%d") % roundi(planet.garden.get_score()) func _on_restart_pressed(): GameInfo.game_data.reset_all() get_tree().paused = false - get_tree().reload_current_scene() + get_tree().change_scene_to_packed(PLANET_RUN_SCENE) func _on_quit_pressed(): get_tree().quit() diff --git a/gui/game/win/win.tscn b/gui/game/win/win.tscn index 8ef02d5..010aa25 100644 --- a/gui/game/win/win.tscn +++ b/gui/game/win/win.tscn @@ -63,13 +63,13 @@ horizontal_alignment = 1 [node name="ThanksTitle" type="Label" parent="Tutorial/VBoxContainer"] layout_mode = 2 -text = "Thanks for playing" +text = "THANKS_FOR_PLAYING" label_settings = ExtResource("3_0b3c6") horizontal_alignment = 1 [node name="ThanksText" type="Label" parent="Tutorial/VBoxContainer"] layout_mode = 2 -text = "We need your feedback! Give us your thoughts on the game on our Discord or in the comments section of the Itch page." +text = "WIN_SCREEN_TEXT" horizontal_alignment = 1 [node name="HBoxContainer2" type="HBoxContainer" parent="Tutorial/VBoxContainer"] @@ -80,7 +80,7 @@ alignment = 1 layout_mode = 2 theme = ExtResource("1_cl67j") theme_override_font_sizes/font_size = 24 -text = "Join our Discord" +text = "JOIN_OUR_DISCORD" uri = "https://discord.gg/VTFKvEvgfz" [node name="HBoxContainer" type="HBoxContainer" parent="Tutorial/VBoxContainer"] @@ -89,12 +89,12 @@ alignment = 1 [node name="Restart" type="Button" parent="Tutorial/VBoxContainer/HBoxContainer"] layout_mode = 2 -text = "Restart" +text = "RESTART" icon = ExtResource("4_8p3aj") [node name="Quit" type="Button" parent="Tutorial/VBoxContainer/HBoxContainer"] layout_mode = 2 -text = "Quit" +text = "QUIT" icon = ExtResource("5_j3wid") [connection signal="pressed" from="Tutorial/VBoxContainer/HBoxContainer/Restart" to="." method="_on_restart_pressed"] diff --git a/gui/menu/scripts/menu.gd b/gui/menu/scripts/menu.gd index b848242..50488e7 100644 --- a/gui/menu/scripts/menu.gd +++ b/gui/menu/scripts/menu.gd @@ -7,4 +7,6 @@ func _ready(): func _on_start_pressed(): GameInfo.game_data.current_planet_data = PlanetData.new() + var preferred_language = OS.get_locale_language() + TranslationServer.set_locale(preferred_language) get_tree().change_scene_to_file(start_scene_path) diff --git a/gui/pointer/pointer.tscn b/gui/pointer/pointer.tscn index 8660446..e198ace 100644 --- a/gui/pointer/pointer.tscn +++ b/gui/pointer/pointer.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=3 uid="uid://0yr6b2jtuttm"] +[gd_scene load_steps=15 format=3 uid="uid://0yr6b2jtuttm"] [ext_resource type="Script" uid="uid://vhumsfntpqcl" path="res://gui/pointer/scripts/pointer.gd" id="1_1pe2k"] [ext_resource type="Texture2D" uid="uid://bspffyprdywgc" path="res://gui/pointer/assets/cursors/pointer.svg" id="2_q4bvb"] @@ -13,17 +13,14 @@ [ext_resource type="Script" uid="uid://b4tkium34c831" path="res://gui/game/card/scripts/card_stat_info.gd" id="10_d4v46"] [ext_resource type="Texture2D" uid="uid://bsvxhafoxwmw0" path="res://common/icons/cube-3d-sphere.svg" id="11_s1ym6"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_s1ym6"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_6eft6"] shader = ExtResource("7_wgcdp") shader_parameter/fov = 90.0 shader_parameter/cull_back = true -shader_parameter/y_rot = 8.409235e-36 -shader_parameter/x_rot = -9.785961e-36 +shader_parameter/y_rot = -6e-45 +shader_parameter/x_rot = -6e-45 shader_parameter/inset = 0.0 -[sub_resource type="ViewportTexture" id="ViewportTexture_xb313"] -viewport_path = NodePath("SubViewport") - [sub_resource type="Resource" id="Resource_mrxa2"] script = ExtResource("8_xb313") metadata/_custom_type_script = "uid://dj2pv1hiwjfv0" @@ -33,10 +30,10 @@ process_mode = 3 script = ExtResource("1_1pe2k") default_cursor = ExtResource("2_q4bvb") -[node name="CanvasLayer" type="CanvasLayer" parent="."] +[node name="InspectorCanvasLayer" type="CanvasLayer" parent="."] layer = 128 -[node name="Inspector" type="Control" parent="CanvasLayer"] +[node name="Inspector" type="Control" parent="InspectorCanvasLayer"] unique_name_in_owner = true layout_mode = 3 anchors_preset = 0 @@ -44,49 +41,53 @@ offset_right = 40.0 offset_bottom = 40.0 mouse_filter = 2 -[node name="Container" type="VBoxContainer" parent="CanvasLayer/Inspector"] +[node name="Container" type="VBoxContainer" parent="InspectorCanvasLayer/Inspector"] layout_mode = 0 -offset_left = 40.0 -offset_right = 137.0 +offset_left = 28.0 +offset_right = 134.0 offset_bottom = 79.0 size_flags_horizontal = 0 size_flags_vertical = 0 mouse_filter = 2 -[node name="Action" type="HBoxContainer" parent="CanvasLayer/Inspector/Container"] +[node name="Action" type="HBoxContainer" parent="InspectorCanvasLayer/Inspector/Container"] unique_name_in_owner = true -modulate = Color(1, 1, 0.168627, 1) +custom_minimum_size = Vector2(0, 20) layout_mode = 2 -[node name="MouseImage" type="TextureRect" parent="CanvasLayer/Inspector/Container/Action"] +[node name="MouseImage" type="TextureRect" parent="InspectorCanvasLayer/Inspector/Container/Action"] layout_mode = 2 texture = ExtResource("3_pshoq") expand_mode = 2 +stretch_mode = 5 -[node name="ActionEnergyImage" type="TextureRect" parent="CanvasLayer/Inspector/Container/Action"] +[node name="ActionEnergyImage" type="TextureRect" parent="InspectorCanvasLayer/Inspector/Container/Action"] unique_name_in_owner = true layout_mode = 2 texture = ExtResource("4_b4uwv") expand_mode = 2 +stretch_mode = 5 -[node name="ActionText" type="Label" parent="CanvasLayer/Inspector/Container/Action"] +[node name="ActionText" type="RichTextLabel" parent="InspectorCanvasLayer/Inspector/Container/Action"] unique_name_in_owner = true -z_index = 1 layout_mode = 2 -text = "Take" -horizontal_alignment = 1 +bbcode_enabled = true +text = "Hello ?" +fit_content = true +scroll_active = false +autowrap_mode = 0 -[node name="ActionZone" type="Sprite2D" parent="CanvasLayer/Inspector"] +[node name="ActionZone" type="Sprite2D" parent="InspectorCanvasLayer/Inspector"] unique_name_in_owner = true z_index = 4096 script = ExtResource("5_b4uwv") opacity = 0.4 metadata/_custom_type_script = "uid://c60a1bjcuj4hd" -[node name="CardsCanvasLayer" type="CanvasLayer" parent="."] +[node name="CardCanvasLayer" type="CanvasLayer" parent="."] layer = 2 -[node name="CardPosition" type="Control" parent="CardsCanvasLayer"] +[node name="CardPosition" type="Control" parent="CardCanvasLayer"] unique_name_in_owner = true layout_mode = 3 anchors_preset = 8 @@ -98,7 +99,7 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -[node name="MarginContainer" type="MarginContainer" parent="CardsCanvasLayer/CardPosition"] +[node name="MarginContainer" type="MarginContainer" parent="CardCanvasLayer/CardPosition"] layout_mode = 1 anchors_preset = 7 anchor_left = 0.5 @@ -111,16 +112,18 @@ offset_right = 175.0 grow_horizontal = 2 grow_vertical = 0 mouse_filter = 2 -theme_override_constants/margin_bottom = 30 +theme_override_constants/margin_left = 0 +theme_override_constants/margin_top = 0 +theme_override_constants/margin_right = 0 +theme_override_constants/margin_bottom = 0 -[node name="CardVisualiser" parent="CardsCanvasLayer/CardPosition/MarginContainer" instance=ExtResource("6_7j4mj")] +[node name="CardVisualiser" parent="CardCanvasLayer/CardPosition/MarginContainer" instance=ExtResource("6_7j4mj")] unique_name_in_owner = true modulate = Color(1, 1, 1, 0.5003133) -material = SubResource("ShaderMaterial_s1ym6") +material = SubResource("ShaderMaterial_6eft6") layout_mode = 2 size_flags_horizontal = 4 mouse_filter = 0 -texture = SubResource("ViewportTexture_xb313") card_info = SubResource("Resource_mrxa2") [node name="Audio" type="Node" parent="."] diff --git a/gui/pointer/scripts/pointer.gd b/gui/pointer/scripts/pointer.gd index 1579b3c..7a74a29 100644 --- a/gui/pointer/scripts/pointer.gd +++ b/gui/pointer/scripts/pointer.gd @@ -1,7 +1,5 @@ extends Node -signal inspected_changed(info : Inspector.Info) - const DEFAULT_ACTION_COLOR = Color.WHITE const ENERGY_ACTION_COLOR = Color("ffff2b") const NO_ENERGY_ACTION_COLOR = Color.RED @@ -9,12 +7,14 @@ const ZONE_OPACITY = 0.4 const ZONE_ACTIVATED_COLOR = Color.TURQUOISE const ZONE_DEACTIVATED_COLOR = Color.REBECCA_PURPLE -const CARD_VISUALISATION_TIME = 1.0 +const CARD_VISUALISATION_TIME = 0.5 +const CARD_UP_PADDING = 20 @export var default_cursor : Texture2D +var current_inspect : Node = null var inspected : Node = null -var last_inspected : Node = null +var inspected_card_info : CardInfo = null var time_last_inspected : float = 0. var player : Player # renseigné par Player var can_interact : bool = false @@ -38,7 +38,7 @@ func _input(_event): if Input.is_action_just_pressed("action"): if can_interact: - var interactable = inspected as Interactable + var interactable = current_inspect as Interactable player.try_interact(interactable) elif can_use_item: player.try_use_item( @@ -47,14 +47,15 @@ func _input(_event): ) func _process(delta): - time_last_inspected += delta + if current_inspect != inspected: + time_last_inspected += delta %Inspector.position = get_viewport().get_mouse_position() if player: can_interact = ( - inspected - and inspected is Interactable - and player.can_interact(inspected) + current_inspect + and current_inspect is Interactable + and player.can_interact(current_inspect) ) current_selected_item = player.data.inventory.get_item() @@ -84,42 +85,55 @@ func _process(delta): update_inspector() func inspect(node : Node): - if inspected and inspected != node and inspected.has_method("inspect"): - inspected.inspect(false) + if current_inspect and current_inspect != node and current_inspect.has_method("inspect"): + current_inspect.inspect(false) + current_inspect = node inspected = node - last_inspected = node + if inspected is InspectableEntity: + inspected_card_info = inspected.card_info() + elif inspected is InventoryGuiItem and inspected.item != null: + inspected_card_info = inspected.item.card_info() + else : + inspected_card_info = null time_last_inspected = 0 - if inspected.has_method("inspect"): - inspected.inspect(true) + if current_inspect.has_method("inspect"): + current_inspect.inspect(true) update_inspector() func update_card(): - if not last_inspected or time_last_inspected > CARD_VISUALISATION_TIME: + if not inspected or inspected_card_info == null or time_last_inspected > CARD_VISUALISATION_TIME: %CardVisualiser.hide() - elif last_inspected != null and last_inspected is InspectableEntity: - %CardVisualiser.card_info = last_inspected.card_info() + elif inspected != null and ( + inspected is InspectableEntity + or inspected is InventoryGuiItem + ): + + if inspected_card_info != %CardVisualiser.card_info: + %CardVisualiser.card_info = inspected_card_info %CardVisualiser.show() var camera = get_viewport().get_camera_2d() var screen_size = get_viewport().get_visible_rect().size - %CardPosition.position = last_inspected.global_position - camera.global_position + screen_size / 2 + if inspected is InspectableEntity: + %CardPosition.position = inspected.global_position - camera.global_position + screen_size / 2 + CARD_UP_PADDING * Vector2.UP + elif inspected is InventoryGuiItem: + %CardPosition.position = inspected.global_position + inspected.size/2 + CARD_UP_PADDING * Vector2.UP if %CardVisualiser.is_mouse_over(): time_last_inspected = 0. func update_inspector(): - if player: - if can_interact and inspected and inspected is Interactable: + if can_interact and current_inspect and current_inspect is Interactable: %Action.visible = true - %ActionText.text = inspected.interact_text() - %Action.modulate = DEFAULT_ACTION_COLOR if inspected.interaction_cost(player) == 0 else ENERGY_ACTION_COLOR - %ActionEnergyImage.visible = inspected.interaction_cost(player) != 0 + %ActionText.text = current_inspect.interact_text() + %Action.modulate = DEFAULT_ACTION_COLOR if current_inspect.interaction_cost(player) == 0 else ENERGY_ACTION_COLOR + %ActionEnergyImage.visible = current_inspect.interaction_cost(player) != 0 elif current_selected_item and current_selected_item.use_text() != "": %Action.visible = true - %ActionText.text = current_selected_item.use_text() + (" (no energy left)" if not have_energy_to_use_item else "") + %ActionText.text = current_selected_item.use_text() + (tr("NO_ENERGY_LEFT") if not have_energy_to_use_item else "") if can_use_item: %Action.modulate = DEFAULT_ACTION_COLOR if current_selected_item.energy_usage == 0 else ENERGY_ACTION_COLOR else : @@ -134,6 +148,6 @@ func update_inspector(): func stop_inspect(node : Node): if node.has_method("inspect"): node.inspect(false) - if inspected == node: - inspected = null + if current_inspect == node: + current_inspect = null update_inspector() diff --git a/gui/ressources/default_theme.tres b/gui/ressources/default_theme.tres index 6abbfb8..a4d6e80 100644 --- a/gui/ressources/default_theme.tres +++ b/gui/ressources/default_theme.tres @@ -1,4 +1,4 @@ -[gd_resource type="Theme" load_steps=11 format=3 uid="uid://bgcmd213j6gk1"] +[gd_resource type="Theme" load_steps=13 format=3 uid="uid://bgcmd213j6gk1"] [ext_resource type="FontFile" uid="uid://qt80w6o01q5s" path="res://gui/ressources/fonts/TitanOne-Regular.ttf" id="1_g7s0b"] [ext_resource type="FontFile" uid="uid://c7k6ssq6ocwdk" path="res://gui/ressources/fonts/Ubuntu/Ubuntu-M.ttf" id="2_ab4w8"] @@ -45,6 +45,20 @@ corner_radius_bottom_left = 5 [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_g7s0b"] bg_color = Color(0.0627451, 0.05882353, 0.16862746, 1) +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ab4w8"] +bg_color = Color(0.03, 0.03, 0.03, 0.42745098) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_36amo"] +bg_color = Color(1, 0.6509804, 0.09019608, 1) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 + [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_hv6r3"] [resource] @@ -62,6 +76,8 @@ MarginContainer/constants/margin_left = 15 MarginContainer/constants/margin_right = 15 MarginContainer/constants/margin_top = 15 Panel/styles/panel = SubResource("StyleBoxFlat_g7s0b") +ProgressBar/styles/background = SubResource("StyleBoxFlat_ab4w8") +ProgressBar/styles/fill = SubResource("StyleBoxFlat_36amo") RichTextLabel/font_sizes/bold_font_size = 12 RichTextLabel/font_sizes/bold_italics_font_size = 12 RichTextLabel/font_sizes/italics_font_size = 12 diff --git a/gui/tools/control_animation_player.gd b/gui/tools/control_animation_player.gd new file mode 100644 index 0000000..9cd028f --- /dev/null +++ b/gui/tools/control_animation_player.gd @@ -0,0 +1,63 @@ +@tool +extends Node +class_name ControlAnimationPlayer + +@onready var target : Control = get_parent() + +@export_tool_button("Test Shake", "Callable") var shake_action = shake +@export_tool_button("Test Bounce", "Callable") var bounce_action = bounce + +func bounce( + duration : float = 0.4, + amount : float = 10, + direction : Vector2 = Vector2.UP, + transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_BOUNCE, +): + await add_tween( + "position", + target.position + direction * amount, + duration/2, + transition_type + ).finished + await add_tween( + "position", + target.position - direction * amount, + duration/2, + transition_type + ).finished + +func shake( + duration : float = 0.3, + amount : float = 10, + transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_LINEAR, +): + await add_tween( + "position", + target.position + Vector2.RIGHT * amount/2, + duration/3, + transition_type + ).finished + await add_tween( + "position", + target.position + Vector2.LEFT * amount, + duration/3, + transition_type + ).finished + await add_tween( + "position", + target.position + Vector2.RIGHT * amount/2, + duration/3, + transition_type + ).finished + + +func add_tween( + property : String, + value : Variant, + seconds: float = 1., + transition_type: Tween.TransitionType = Tween.TransitionType.TRANS_LINEAR +) -> Tween: + var tween : Tween = get_tree().create_tween() + tween.set_trans(transition_type) + tween.tween_property(target, property, value, seconds) + return tween \ No newline at end of file diff --git a/gui/tools/control_animation_player.gd.uid b/gui/tools/control_animation_player.gd.uid new file mode 100644 index 0000000..3dabd40 --- /dev/null +++ b/gui/tools/control_animation_player.gd.uid @@ -0,0 +1 @@ +uid://0dhj8sdpil7q diff --git a/project.godot b/project.godot index c77c34f..76a0658 100644 --- a/project.godot +++ b/project.godot @@ -17,6 +17,10 @@ run/main_scene="uid://c5bruelvqbm1k" config/features=PackedStringArray("4.5", "Forward Plus") config/icon="uid://df0y0s666ui4h" +[audio] + +buses/default_bus_layout="" + [autoload] Pointer="*res://gui/pointer/pointer.tscn" @@ -126,6 +130,11 @@ item_9={ ] } +[internationalization] + +locale/translation_remaps={} +locale/translations=PackedStringArray("res://translation/localization.en.translation", "res://translation/localization.fr.translation") + [rendering] renderer/rendering_method="gl_compatibility" diff --git a/root.tscn b/root.tscn index 690145b..b9acf84 100644 --- a/root.tscn +++ b/root.tscn @@ -10,7 +10,7 @@ [node name="Root" type="Node2D"] script = ExtResource("1_bf3um") -start_scene_path = "uid://d28cp7a21kwou" +start_scene_path = "uid://d0n52psuns1vl" [node name="CanvasLayer" type="CanvasLayer" parent="."] process_mode = 3 @@ -80,7 +80,7 @@ size_flags_horizontal = 4 size_flags_vertical = 4 theme = ExtResource("4_gd4vy") theme_override_font_sizes/font_size = 33 -text = "Start" +text = "START" icon = ExtResource("7_qwhpj") [node name="Credits" type="VBoxContainer" parent="CanvasLayer/MarginContainer/GridContainer"] @@ -92,7 +92,7 @@ size_flags_vertical = 4 layout_mode = 2 size_flags_horizontal = 3 theme = ExtResource("4_gd4vy") -text = "Art" +text = "ART" label_settings = ExtResource("8_bf3um") horizontal_alignment = 1 @@ -109,7 +109,7 @@ horizontal_alignment = 1 layout_mode = 2 size_flags_horizontal = 3 theme = ExtResource("4_gd4vy") -text = "Development / Game Design" +text = "DEV_AND_GAME_DESIGN" label_settings = ExtResource("8_bf3um") horizontal_alignment = 1 @@ -125,7 +125,7 @@ horizontal_alignment = 1 layout_mode = 2 size_flags_horizontal = 3 theme = ExtResource("4_gd4vy") -text = "Music" +text = "MUSIC" label_settings = ExtResource("8_bf3um") horizontal_alignment = 1 diff --git a/stages/intro/intro.tscn b/stages/intro/intro.tscn new file mode 100644 index 0000000..e3c0c9e --- /dev/null +++ b/stages/intro/intro.tscn @@ -0,0 +1,89 @@ +[gd_scene load_steps=6 format=3 uid="uid://d0n52psuns1vl"] + +[ext_resource type="Script" uid="uid://ddf3fktoer2ng" path="res://stages/intro/scripts/intro.gd" id="1_2nxbv"] +[ext_resource type="Theme" uid="uid://bgcmd213j6gk1" path="res://gui/ressources/default_theme.tres" id="1_u726n"] +[ext_resource type="Script" uid="uid://bel0lb7kd8bf6" path="res://stages/intro/scripts/intro_step_language.gd" id="2_mi20s"] +[ext_resource type="LabelSettings" uid="uid://dqwayi8yjwau2" path="res://gui/ressources/title_label_settings.tres" id="3_mi20s"] +[ext_resource type="Script" uid="uid://d2wapgm313xhr" path="res://stages/intro/scripts/intro_step_story.gd" id="5_tg2p4"] + +[node name="Intro" type="Node"] +script = ExtResource("1_2nxbv") +game_scene_path = "uid://d28cp7a21kwou" + +[node name="LanguageChoose" type="CanvasLayer" parent="."] +visible = false +script = ExtResource("2_mi20s") + +[node name="CenterContainer" type="VBoxContainer" parent="LanguageChoose"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_u726n") +alignment = 1 + +[node name="Label" type="Label" parent="LanguageChoose/CenterContainer"] +layout_mode = 2 +text = "CHOOSE_A_LANGUAGE" +label_settings = ExtResource("3_mi20s") +horizontal_alignment = 1 + +[node name="LanguageButtonsContainer" type="HBoxContainer" parent="LanguageChoose/CenterContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme = ExtResource("1_u726n") +alignment = 1 + +[node name="Story" type="CanvasLayer" parent="."] +visible = false +script = ExtResource("5_tg2p4") + +[node name="CenterContainer2" type="CenterContainer" parent="Story"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="CenterContainer" type="VBoxContainer" parent="Story/CenterContainer2"] +layout_mode = 2 +theme = ExtResource("1_u726n") +alignment = 1 + +[node name="Label" type="Label" parent="Story/CenterContainer2/CenterContainer"] +layout_mode = 2 +text = "STORY" +label_settings = ExtResource("3_mi20s") +horizontal_alignment = 1 + +[node name="Story" type="RichTextLabel" parent="Story/CenterContainer2/CenterContainer"] +custom_minimum_size = Vector2(500, 0) +layout_mode = 2 +theme = ExtResource("1_u726n") +theme_override_font_sizes/normal_font_size = 16 +theme_override_font_sizes/bold_font_size = 16 +theme_override_font_sizes/bold_italics_font_size = 16 +theme_override_font_sizes/italics_font_size = 16 +theme_override_font_sizes/mono_font_size = 16 +bbcode_enabled = true +text = "STORY_TEXT" +fit_content = true +horizontal_alignment = 1 + +[node name="ControlsTitle" type="Label" parent="Story/CenterContainer2/CenterContainer"] +layout_mode = 2 +text = "CONTROLS" +label_settings = ExtResource("3_mi20s") +horizontal_alignment = 1 + +[node name="ControlsText" type="Label" parent="Story/CenterContainer2/CenterContainer"] +layout_mode = 2 +text = "CONTROLS_TEXT" +horizontal_alignment = 1 + +[node name="Button" type="Button" parent="Story/CenterContainer2/CenterContainer"] +layout_mode = 2 +text = "OK" + +[connection signal="pressed" from="Story/CenterContainer2/CenterContainer/Button" to="Story" method="_on_button_pressed"] diff --git a/stages/intro/scripts/intro.gd b/stages/intro/scripts/intro.gd new file mode 100644 index 0000000..2e5e4e9 --- /dev/null +++ b/stages/intro/scripts/intro.gd @@ -0,0 +1,28 @@ +extends Node +class_name Intro + +var steps : Array[IntroStep] +@export_file var game_scene_path : String + +func _ready(): + for c in get_children(): + if c is IntroStep: + steps.append(c) + c.hide() + + for i in range(len(steps)): + steps[i].step_over.connect( + func(): + change_step(i+1) + ) + + change_step(0) + +func change_step(nb): + if nb >= len(steps): + get_tree().change_scene_to_file(game_scene_path) + for i in range(len(steps)): + if i == nb: + steps[i].show() + else : + steps[i].hide() \ No newline at end of file diff --git a/stages/intro/scripts/intro.gd.uid b/stages/intro/scripts/intro.gd.uid new file mode 100644 index 0000000..31ed722 --- /dev/null +++ b/stages/intro/scripts/intro.gd.uid @@ -0,0 +1 @@ +uid://ddf3fktoer2ng diff --git a/stages/intro/scripts/intro_step.gd b/stages/intro/scripts/intro_step.gd new file mode 100644 index 0000000..d85d04f --- /dev/null +++ b/stages/intro/scripts/intro_step.gd @@ -0,0 +1,5 @@ +extends CanvasLayer +class_name IntroStep + +signal step_over + diff --git a/stages/intro/scripts/intro_step.gd.uid b/stages/intro/scripts/intro_step.gd.uid new file mode 100644 index 0000000..c1d1fb5 --- /dev/null +++ b/stages/intro/scripts/intro_step.gd.uid @@ -0,0 +1 @@ +uid://c25snxxc5jdmp diff --git a/stages/intro/scripts/intro_step_language.gd b/stages/intro/scripts/intro_step_language.gd new file mode 100644 index 0000000..6820846 --- /dev/null +++ b/stages/intro/scripts/intro_step_language.gd @@ -0,0 +1,19 @@ +extends IntroStep +class_name IntroStepLanguage + +const DEFAULT_THEME = preload("res://gui/ressources/default_theme.tres") + +func _ready(): + for i in range(len(SettingsData.AVAILABLE_LANGUAGES)): + var button = Button.new() + button.theme = DEFAULT_THEME + button.text = SettingsData.AVAILABLE_LANGUAGES_LABEL[i] + button.pressed.connect( + func (): choose_language(SettingsData.AVAILABLE_LANGUAGES[i]) + ) + + %LanguageButtonsContainer.add_child(button) + +func choose_language(language_code): + TranslationServer.set_locale(language_code) + step_over.emit() \ No newline at end of file diff --git a/stages/intro/scripts/intro_step_language.gd.uid b/stages/intro/scripts/intro_step_language.gd.uid new file mode 100644 index 0000000..a05948b --- /dev/null +++ b/stages/intro/scripts/intro_step_language.gd.uid @@ -0,0 +1 @@ +uid://bel0lb7kd8bf6 diff --git a/stages/intro/scripts/intro_step_story.gd b/stages/intro/scripts/intro_step_story.gd new file mode 100644 index 0000000..99e699f --- /dev/null +++ b/stages/intro/scripts/intro_step_story.gd @@ -0,0 +1,5 @@ +extends IntroStep +class_name IntroStepStory + +func _on_button_pressed(): + step_over.emit() diff --git a/stages/intro/scripts/intro_step_story.gd.uid b/stages/intro/scripts/intro_step_story.gd.uid new file mode 100644 index 0000000..cd7b042 --- /dev/null +++ b/stages/intro/scripts/intro_step_story.gd.uid @@ -0,0 +1 @@ +uid://d2wapgm313xhr diff --git a/stages/planet_run/planet_run.tscn b/stages/planet_run/planet_run.tscn index 2f04d64..f1a18eb 100644 --- a/stages/planet_run/planet_run.tscn +++ b/stages/planet_run/planet_run.tscn @@ -2,7 +2,7 @@ [ext_resource type="PackedScene" uid="uid://12nak7amd1uq" path="res://gui/game/game_gui.tscn" id="1_yy1uy"] [ext_resource type="PackedScene" uid="uid://v41hfc7haaye" path="res://gui/game/win/win.tscn" id="3_6guxm"] -[ext_resource type="PackedScene" uid="uid://doxm7uab8i3tq" path="res://gui/game/reward_choice/reward_choice.tscn" id="4_fbkgs"] +[ext_resource type="PackedScene" uid="uid://doxm7uab8i3tq" path="res://gui/game/quota_reward/quota_reward.tscn" id="4_fbkgs"] [ext_resource type="PackedScene" uid="uid://bgvbgeq46wee2" path="res://entities/player/player.tscn" id="4_g33f4"] [ext_resource type="PackedScene" uid="uid://dt6mptqg80dew" path="res://gui/game/tutorial/tutorial.tscn" id="5_orelw"] [ext_resource type="PackedScene" uid="uid://tsi5j1uxppa4" path="res://stages/terrain/planet/planet.tscn" id="8_t31p7"] @@ -12,13 +12,15 @@ [node name="PlanetRun" type="Node2D"] +[node name="Reward" parent="." instance=ExtResource("4_fbkgs")] +layer = 2 + [node name="CanvasLayer" type="CanvasLayer" parent="."] -[node name="RootGui" parent="CanvasLayer" instance=ExtResource("1_yy1uy")] +[node name="RootGui" parent="CanvasLayer" node_paths=PackedStringArray("quota_reward") instance=ExtResource("1_yy1uy")] +quota_reward = NodePath("../../Reward") metadata/_edit_use_anchors_ = true -[node name="RewardChoice" parent="CanvasLayer" instance=ExtResource("4_fbkgs")] - [node name="Win" parent="CanvasLayer" instance=ExtResource("3_6guxm")] visible = false @@ -38,8 +40,9 @@ position = Vector2(33, -139) [node name="TruckRecharge" parent="Entities" instance=ExtResource("10_cnjsq")] position = Vector2(-36, -154) -[node name="Planet" parent="." node_paths=PackedStringArray("import_entities_from_node") instance=ExtResource("8_t31p7")] +[node name="Planet" parent="." node_paths=PackedStringArray("quota_reward", "import_entities_from_node") instance=ExtResource("8_t31p7")] loot_item_number = Array[int]([1]) +quota_reward = NodePath("../Reward") import_entities_from_node = NodePath("../Entities") [node name="Camera" parent="." node_paths=PackedStringArray("following") instance=ExtResource("16_m18ms")] @@ -49,4 +52,3 @@ following = NodePath("../Entities/Player") [connection signal="day_limit_exceed" from="Planet" to="CanvasLayer/Win" method="_on_planet_day_limit_exceed"] [connection signal="pass_day_ended" from="Planet" to="CanvasLayer/RootGui" method="_on_planet_pass_day_ended"] [connection signal="pass_day_started" from="Planet" to="CanvasLayer/RootGui" method="_on_planet_pass_day_started"] -[connection signal="quota_reward_asked" from="Planet" to="CanvasLayer/RewardChoice" method="_on_planet_quota_reward_asked"] diff --git a/stages/terrain/planet/scripts/chunk.gd b/stages/terrain/planet/scripts/chunk.gd index cb0aa5b..f1466d3 100644 --- a/stages/terrain/planet/scripts/chunk.gd +++ b/stages/terrain/planet/scripts/chunk.gd @@ -108,12 +108,8 @@ func generate_walls(): func generate_loot(number : int = LOOT_NUMBER.pick_random()): for i in range(number): - var loot = UndergroundLoot.new() - for j in range(LOOT_ITEM_NUMBER.pick_random()): - loot.loot.append( - Seed.new(GameInfo.game_data.unlocked_plant_types.pick_random()) - ) - + var loot : UndergroundLoot = (UndergroundLootData.SCENE.instantiate() as UndergroundLoot) + loot.item_number = LOOT_ITEM_NUMBER.pick_random() var max_placement_try = 10 var valid_coord = false diff --git a/stages/terrain/planet/scripts/garden.gd b/stages/terrain/planet/scripts/garden.gd index 8e0115d..72e3f44 100644 --- a/stages/terrain/planet/scripts/garden.gd +++ b/stages/terrain/planet/scripts/garden.gd @@ -17,6 +17,7 @@ var size = PlanetData.DEFAULT_GARDEN_SIZE func _init(_planet_data : PlanetData, _initial_plants : Array[Plant] = []): planet_data = _planet_data plants = _initial_plants + update_garden_score() func _ready(): contamination_sprite = generate_contamination_terrain_sprite() @@ -45,8 +46,14 @@ func generate_contamination_terrain_sprite() -> Polygon2D: func get_score(): var score = 0 - for p in plants: - score += p.calculate_plant_score() + planet_data.score_by_plant.resize(len(plants)) + for i in range(len(plants)): + var plant_score = plants[i].calculate_plant_score() + score += plant_score + var old_score = 0 if planet_data.score_by_plant[i] == null else planet_data.score_by_plant[i] + if old_score < plant_score: + planet_data.plant_has_gained_score(plants[i], plant_score - old_score) + planet_data.score_by_plant[i] = plant_score return score func plant( @@ -61,7 +68,6 @@ func plant( plants.append(new_plant) new_plant.harvested.connect(_on_plant_harvested) new_plant.state_changed.connect(_on_plant_state_changed) - update_garden_score() return new_plant func _on_plant_state_changed(_p: Plant): diff --git a/stages/terrain/planet/scripts/planet.gd b/stages/terrain/planet/scripts/planet.gd index b26837a..31e8af8 100644 --- a/stages/terrain/planet/scripts/planet.gd +++ b/stages/terrain/planet/scripts/planet.gd @@ -5,7 +5,6 @@ signal day_limit_exceed(planet : Planet) signal pass_day_started(planet : Planet) signal pass_day_proceeded(planet : Planet) signal pass_day_ended(planet : Planet) -signal quota_reward_asked(planet : Planet, item1 : Item, item2 : Item) const PASS_DAY_ANIMATION_TIME : float = 1.5 const DEFAULT_DAY_LIMIT : int = 7 @@ -14,7 +13,8 @@ const PLANET_TEXTURE_SCALE : float = 5.0 @export_group("Loot") @export var first_loot_number : int = 3 @export var loot_item_number : Array[int] = [1,2] - +@export var quota_reward : QuotaReward + var data : PlanetData var contamination_texture : ImageTexture @@ -37,6 +37,9 @@ func _ready(): garden = Garden.new(data, plants) add_child(garden) + if len(GameInfo.game_data.unlocked_plant_types) == 0: + quota_reward.trigger_reward() + generate_first_entities() Music.enter_planet() @@ -113,6 +116,7 @@ func plant( if garden.is_in_garden(plant_position): var new_plant = garden.plant(type, plant_mutations) add_entity(new_plant, plant_position) + garden.update_garden_score() return true return false @@ -146,11 +150,8 @@ func pass_day(): func generate_loot(number : int): for i in range(number): - var loot = UndergroundLoot.new() - for j in range(loot_item_number.pick_random()): - loot.loot.append( - Seed.new(GameInfo.game_data.unlocked_plant_types.pick_random()) - ) + var loot : UndergroundLoot = (UndergroundLootData.SCENE.instantiate() as UndergroundLoot) + loot.item_number = loot_item_number.pick_random() var loot_random_range = UndergroundLoot.LOOTED_ITEM_RANDOM_RANGE @@ -164,21 +165,11 @@ func generate_loot(number : int): func reach_quota(): data.quota += 1 + quota_reward.trigger_reward() + await quota_reward.reward_chosen + garden.update_garden_score() + if data.garden_score >= data.get_quota_score(): + reach_quota() data.quota_days = data.get_quota_duration() -func ask_quota_reward(): - quota_reward_asked.emit( - self, - generate_quota_reward(), - generate_quota_reward() - ) - -func generate_quota_reward() -> Item: - var random_level = randi_range( - max(data.quota - 1, 1), - min(data.quota, Machine.MAX_MACHINE_LEVEL), - ) - var random_machine_type = GameInfo.game_data.unlocked_machines.pick_random() - return Blueprint.new(random_machine_type, random_level) - #endregion diff --git a/stages/terrain/planet/scripts/planet_data.gd b/stages/terrain/planet/scripts/planet_data.gd index 4592d54..444e115 100644 --- a/stages/terrain/planet/scripts/planet_data.gd +++ b/stages/terrain/planet/scripts/planet_data.gd @@ -2,6 +2,7 @@ extends Resource class_name PlanetData signal new_quota_started(planet_data : PlanetData) +signal plant_gaining_score(p : Plant, amount : int) signal contamination_updated(decontamination_surface : float) signal updated(planet_data : PlanetData) @@ -27,6 +28,7 @@ const DEFAULT_GARDEN_SIZE = Vector2(1500,1500) quota_days = v updated.emit(self) @export var entities_saved_data : Array[EntityData] = [] +@export var score_by_plant : Array[int] = [] @export var generated_chunk_entities : Array[Vector2i] @export var tutorial_step : int = 0 @@ -41,7 +43,7 @@ func _init(_base_size : Vector2 = DEFAULT_GARDEN_SIZE): ) contamination_updated.emit(get_decontamination_surface()) - +#region ------------------ Contamination ------------------ func impact_contamination(position : Vector2, impact_radius : float, to_value : float = 1.): garden_contamination.draw_circle( position, @@ -66,29 +68,10 @@ func get_decontamination_coverage() -> float: func get_decontamination_surface() -> float: return garden_contamination.get_value_surface() -#region ------------------ Objectives ------------------ -func generate_objective_rewards(level = 0) -> Array[ObjectiveReward]: - var amount = level + 1 - - var possible_objective_rewards_path : Array[ObjectiveReward] = [ - LootRandomSeedsReward.new(randi_range(4+level, 6+level)) - ] - - var objectives_reward : Array[ObjectiveReward] = [] - - var i = 0 - while i < amount and len(possible_objective_rewards_path) > 0: - var r = possible_objective_rewards_path.pick_random() - possible_objective_rewards_path.erase(r) - objectives_reward.append(r) - i += 1 - - return objectives_reward - #endregion #region ------------------ Quotas ------------------ -func get_quota_score(q = quota) -> int: +func get_quota_score(q : int = quota) -> int: var first_quotas = [ 4, 10, @@ -106,4 +89,11 @@ func get_quota_duration(_q = quota) -> int: return 7 #endregion + +#region ------------------ Score ------------------ + +func plant_has_gained_score(plant : Plant, amount : int): + plant_gaining_score.emit(plant, amount) + +#endregion diff --git a/stages/terrain/planet/scripts/terrain_data.gd b/stages/terrain/planet/scripts/terrain_data.gd index fffd166..f8c50fa 100644 --- a/stages/terrain/planet/scripts/terrain_data.gd +++ b/stages/terrain/planet/scripts/terrain_data.gd @@ -23,7 +23,7 @@ func draw_random_zone( var noise: Noise = FastNoiseLite.new() noise.seed = random_seed noise.noise_type = FastNoiseLite.TYPE_CELLULAR - noise.frequency = 0.3 + noise.frequency = 0.1 var noise_image_size : Vector2i = Vector2i.ONE * (image_size) var noise_image_center = noise_image_size / 2 @@ -39,7 +39,7 @@ func draw_random_zone( ImageTools.draw_circle( noise_image, noise_image_center, - 80/UNIT_PER_PIXEL, + int(round(80./float(UNIT_PER_PIXEL))), Color.WHITE, ) diff --git a/stages/terrain/truck/scripts/truck_interior.gd b/stages/terrain/truck/scripts/truck_interior.gd index c706a13..972f36f 100644 --- a/stages/terrain/truck/scripts/truck_interior.gd +++ b/stages/terrain/truck/scripts/truck_interior.gd @@ -9,6 +9,9 @@ const PLANET_RUN_PATH = "res://stages/planet_run/planet_run.tscn" func _on_exit_interacted(_p : Player): data.entities_saved_data = save_entities() + data.rewards = [] + for c in composts: + data.rewards.append(c.reward) get_tree().change_scene_to_file(PLANET_RUN_PATH) func _ready(): diff --git a/stages/terrain/truck/truck_interior.tscn b/stages/terrain/truck/truck_interior.tscn index 52887f5..7ebd33a 100644 --- a/stages/terrain/truck/truck_interior.tscn +++ b/stages/terrain/truck/truck_interior.tscn @@ -39,9 +39,9 @@ scale = Vector2(0.5539248, 0.5539248) position = Vector2(47, 497.00003) scale = Vector2(0.5539248, 0.5539248) script = ExtResource("3_fk6sc") -default_interact_text = "Exit the truck" -default_info_title = "Exit" -default_info_desc = "A good old ladder." +default_interact_text = "EXIT_TRUCK" +default_info_title = "EXIT" +default_info_desc = "LADDER_DESC_TEXT" metadata/_custom_type_script = "uid://dyprcd68fjstf" [node name="Bolt" type="Sprite2D" parent="Exit"]