Files
seeding-planets/gui/game/scripts/game_gui.gd
Zacharie Guet 8efe8bce36 Dev pour la beta 1.4
* Changements de la texture des cristaux de Talion dans tous les assets 3D pour correspondre aux assets 2D
* Ajout d'un évenement en fin de région, une résurgence de Talion qui décontamine et fait looter les plantes mature aux alentours
* Ajout d'un path finding sur le mouvement du robot
* Modification du flow des actions à la souris : ajout d'un nouveau son, d'un icône à l'emplacement de l'action
* Modification du nombre et de l'ordre de mutation débloquées
* Augmentation de la valeur maximale de zoom
* Modification des scores à atteindre dans les premières régions
* Modification de l'interface du vaisseau, laissant apparaitre une roadmap plus claire, et laissant inspecter l'inventaire actuel
* Modification de l'icône d'action dans les scènes 3D
* Augmentation de la zone d'écart entre les plantes, et augmentation du taux de zone fertile en conséquence
* La station de recharge devient inutilisable après la fin de la région
* Ajout d'une transparence lors de la sélection d'objets derrières d'autres objets
* Les plantes juvéniles donneront toujours une graine si coupées
* Ajout d'un bouclage sur les couleurs des mutations
* Fix des hitbox des plantes pour l'inspection à la souris
* Fix de plusieurs bugs sur la manipulation de l'inventaire
* Ajout de nombreux screenshots d'utilisation des outils lors du tutoriel
* Amélioration mineure de la traduction/wording
2026-05-17 02:29:55 +02:00

168 lines
5.7 KiB
GDScript

extends CanvasLayer
class_name GameGui
const SCORE_ICON : Texture = preload("res://common/icons/growth.svg")
var score_by_plant : Dictionary[String, int] = {}
var score_mirror :
set(v):
score_mirror = v
score_update(true)
var objective_text : String = "" : set = set_objective_text
func _ready():
GameInfo.game_data.current_region_data.updated.connect(_on_region_updated)
GameInfo.game_data.player_data.updated.connect(_on_player_updated)
%ObjectiveProgressBar.visible = (
not GameInfo.game_data.current_run.story_step is TutorialStoryStep
and not GameInfo.game_data.current_region_data.objective_disabled
)
%SimplePlantPointScore.visible = GameInfo.game_data.current_run.story_step is TutorialStoryStep
state_update(GameInfo.game_data.current_region_data)
player_update(GameInfo.game_data.player_data, false)
%EnergyInfo.reset_size()
score_mirror = GameInfo.game_data.current_region_data.get_score()
for p : PlantData in GameInfo.game_data.current_region_data.plants:
score_by_plant[str(p.random_seed)] = p.get_score()
set_objective_text()
func _on_player_updated(player_data : PlayerData):
player_update(player_data)
func player_update(player_data : PlayerData, with_animation = true):
%EnergyInfo.update(
player_data.energy,
player_data.max_energy,
with_animation
)
if with_animation:
get_tree().create_tween().tween_property(
%NoEnergyVignette,
"modulate:a",
1. if player_data.energy == 0 else 0.,
0.3
)
else:
%NoEnergyVignette.modulate.a = 1. if player_data.energy == 0 else 0.
func _on_region_updated(region_data : RegionData):
await get_tree().create_timer(0.1).timeout
if score_mirror != region_data.get_score():
for p in region_data.plants:
var score = p.get_score()
if not str(p.random_seed) in score_by_plant:
score_by_plant[str(p.random_seed)] = 0
if score > score_by_plant[str(p.random_seed)]:
plant_changing_score(p, score - score_by_plant[str(p.random_seed)])
elif score < score_by_plant[str(p.random_seed)]:
score_mirror -= score_by_plant[str(p.random_seed)] - score
score_by_plant[str(p.random_seed)] = score
# Check for removed plants
for key in score_by_plant:
if region_data.plants.find_custom(
func (p): return str(p.random_seed) == key
) == -1:
score_mirror -= score_by_plant[key]
score_by_plant.erase(key)
state_update(region_data)
func score_update(with_animation = true):
var objective_progression : float
var objective = GameInfo.game_data.current_region_data.objective
if GameInfo.game_data.current_region_data.state == RegionData.State.SUCCEEDED:
objective_progression = 1.
%ObjectiveProgressBar.text = tr("FULL") + " %d" % [score_mirror]
else:
objective_progression = (float(score_mirror) / max(float(objective), 1))
%ObjectiveProgressBar.text = "%d/%d" % [score_mirror, objective]
if with_animation:
get_tree().create_tween().tween_property(
%ObjectiveProgressBar,
"progress",
objective_progression,
0.5,
)
else:
%ObjectiveProgressBar.set_progress(objective_progression)
if score_mirror > 1:
%SimplePlantPointScoreLabel.text = tr("%d_PLANT_POINTS") % score_mirror
else :
%SimplePlantPointScoreLabel.text = tr("%d_PLANT_POINT") % score_mirror
func state_update(region_data : RegionData):
if region_data.state == RegionData.State.SUCCEEDED:
objective_text = "COLLECT_YOUR_SEEDS_AND_TAKE_OFF"
if GameInfo.game_data.current_run.story_step is TutorialStoryStep:
objective_text = "PASS_THE_MYSTERIOUS_DOOR"
elif region_data.state == RegionData.State.FAILED:
objective_text = "NO_RECHARGE_LEFT"
func plant_changing_score(plant_data: PlantData, amount : int):
if GameInfo.game_data.current_region_data.in_passing_day_animation:
await GameInfo.game_data.current_region_data.pass_day_ended
if amount <= 0:
score_mirror += amount
else :
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_data.position - camera.global_position + screen_size / 2,
%ObjectiveProgressBar.global_position + %ObjectiveProgressBar.size / 2,
0.8
)
await get_tree().create_timer(0.5 / max(1.,i)).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
score_mirror += 1
AudioManager.play_sfx("PlantPoint")
sprite_particle.queue_free()
func set_objective_text(v : String = objective_text):
objective_text = v
if is_node_ready():
if (objective_text != "" and objective_text != %ObjectiveLabel.text):
%ObjectiveAnimationPlayer.play("bump")
AudioManager.play_sfx("Screen_interaction")
%ObjectiveLabel.text = v
func _on_player_action_tried_without_energy():
$AnimationPlayer.play("no_energy_left")
func _on_player_upgraded():
$EffectAnimation.play("upgrade")