ajouts d'objectifs sur la carte, déplacements des icônes et divers changements

This commit is contained in:
2025-09-13 12:48:52 +02:00
parent e56ec31069
commit 85cd832864
81 changed files with 983 additions and 307 deletions

View File

@@ -0,0 +1,59 @@
[gd_scene load_steps=10 format=3 uid="uid://d28cp7a21kwou"]
[ext_resource type="PackedScene" uid="uid://12nak7amd1uq" path="res://gui/game/game_gui.tscn" id="1_yy1uy"]
[ext_resource type="PackedScene" uid="uid://csiacsndm62ll" path="res://gui/game/pause/pause.tscn" id="2_bt4fd"]
[ext_resource type="PackedScene" uid="uid://v41hfc7haaye" path="res://gui/game/win/win.tscn" id="3_6guxm"]
[ext_resource type="PackedScene" uid="uid://bgvbgeq46wee2" path="res://entities/player/player.tscn" id="4_g33f4"]
[ext_resource type="Script" uid="uid://dedg615xudpoq" path="res://entities/interactables/item_object/script/item_object.gd" id="5_kgrdw"]
[ext_resource type="Resource" uid="uid://ddqalo1k30i5x" path="res://common/inventory/resources/items/default_shovel.tres" id="6_4rjiq"]
[ext_resource type="PackedScene" uid="uid://d324mlmgls4fs" path="res://entities/interactables/machines/recharge_station/recharge_station.tscn" id="7_h4bgy"]
[ext_resource type="PackedScene" uid="uid://tsi5j1uxppa4" path="res://stages/terrain/planet/planet.tscn" id="8_t31p7"]
[ext_resource type="PackedScene" uid="uid://dj7gp3crtg2yt" path="res://entities/camera/camera.tscn" id="16_m18ms"]
[node name="PlanetRun" type="Node2D"]
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="RootGui" parent="CanvasLayer" instance=ExtResource("1_yy1uy")]
metadata/_edit_use_anchors_ = true
[node name="Pause" parent="CanvasLayer" instance=ExtResource("2_bt4fd")]
process_mode = 3
visible = false
z_index = 1000
[node name="Win" parent="CanvasLayer" instance=ExtResource("3_6guxm")]
visible = false
[node name="Entities" type="Node2D" parent="."]
y_sort_enabled = true
[node name="Player" parent="Entities" instance=ExtResource("4_g33f4")]
position = Vector2(0, 13.49)
[node name="ItemObject" type="Area2D" parent="Entities"]
position = Vector2(0, 129)
script = ExtResource("5_kgrdw")
item = ExtResource("6_4rjiq")
metadata/_custom_type_script = "uid://dedg615xudpoq"
[node name="RechargeStation" parent="Entities" instance=ExtResource("7_h4bgy")]
[node name="Planet" parent="." node_paths=PackedStringArray("import_entities_from_node") instance=ExtResource("8_t31p7")]
loot_number = Array[int]([1])
loot_item_number = Array[int]([1])
objective_first_distance = 150
objective_between_distance = 150
import_entities_from_node = NodePath("../Entities")
[node name="Camera" parent="." node_paths=PackedStringArray("following") instance=ExtResource("16_m18ms")]
position = Vector2(2.22, 0)
following = NodePath("../Entities/Player")
[connection signal="pause_asked" from="CanvasLayer/RootGui" to="CanvasLayer/Pause" method="_on_root_gui_pause_asked"]
[connection signal="player_updated" from="Entities/Player" to="CanvasLayer/RootGui" method="_on_player_updated"]
[connection signal="upgraded" from="Entities/Player" to="CanvasLayer/RootGui" method="_on_player_upgraded"]
[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="planet_updated" from="Planet" to="CanvasLayer/RootGui" method="_on_planet_updated"]

15
stages/scripts/game.gd Normal file
View File

@@ -0,0 +1,15 @@
extends Node2D
class_name PlanetRun
@export var planet : Planet
@export var game_data : GameData
func _ready():
if not game_data:
game_data = GameData.new()
if not game_data.current_terrain_data:
game_data.current_terrain_data = TerrainData.new()
if planet:
planet.instant

View File

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

View File

@@ -8,14 +8,19 @@ signal pass_day_proceeded(planet : Planet)
signal pass_day_ended(planet : Planet)
const PASS_DAY_ANIMATION_TIME : float = 1.5
const DAY_LIMIT : int = 10
const DEFAULT_DAY_LIMIT : int = 10
const PLANET_TEXTURE_SCALE : float = 5.0
const OBJECTIVE_MAX_LEVEL : int = 10
const OBJECTIVE_MIN_ANGLE_DIFF = PI/2
@export_group("Loot")
@export var first_loot_number : int = 3
@export var loot_number : Array[int] = [0,1,2]
@export var loot_item_number : Array[int] = [1,2]
@export var loot_items : Array[Item] = []
@export_group("Objectives")
@export var objective_first_distance : int = 200
@export var objective_between_distance : int = 200
@export_group("Textures")
@export var background_texture : Texture2D
@@ -23,20 +28,43 @@ const PLANET_TEXTURE_SCALE : float = 5.0
@onready var background_sprite : Polygon2D = generate_background_sprite()
@onready var contamination_sprite : Polygon2D = generate_contamination_terrain_sprite()
@onready var decontamination_coverage : float = terrainData.get_decontamination_coverage() :
@onready var decontamination_surface : float = terrain_data.get_decontamination_surface() :
set(v):
decontamination_coverage = v
print(v)
decontamination_surface = v
planet_updated.emit(self)
@onready var objective_scene : PackedScene = preload("res://entities/objectives/objective.tscn")
var contamination_texture : ImageTexture
var day : int = 1 :
set(v):
day = v
planet_updated.emit(self)
var day_limit = DEFAULT_DAY_LIMIT :
set(v):
day_limit = v
planet_updated.emit(self)
var player : Player
func _ready():
planet_updated.emit(self)
generate_loot(first_loot_number)
generate_objectives()
# queue_redraw()
# func _draw():
# var factor = 10
# for x in range(terrain_data.terrain_size.x / factor):
# for y in range(terrain_data.terrain_size.y / factor):
# var point = Vector2(x, y) * factor
# draw_circle(
# point,
# factor/10,
# Color.BLUE if is_there_contamination(point) else Color.RED,
# true
# )
#region ------------------ Generation ------------------
@@ -53,12 +81,15 @@ func add_entity(e : Node2D, container : Node2D = entityContainer):
if "planet" in e:
e.planet = self
if e is Player:
player = e
container.add_child(e)
func generate_polygon_sprite(order : int = 0) -> Polygon2D:
var sprite = Polygon2D.new()
var size = terrainData.terrainSize
var size = terrain_data.terrain_size
sprite.polygon = PackedVector2Array([
Vector2(0,0),
Vector2(size.x, 0),
@@ -82,15 +113,15 @@ func generate_background_sprite() -> Polygon2D:
return sprite
func generate_contamination_terrain_sprite() -> Polygon2D:
if not terrainData.contamination:
terrainData.generate_default_contamination()
if not terrain_data.contamination:
terrain_data.generate_default_contamination()
var sprite :Polygon2D = generate_polygon_sprite(1)
contamination_texture = ImageTexture.create_from_image(terrainData.contamination)
contamination_texture = ImageTexture.create_from_image(terrain_data.contamination)
contamination_material.set_shader_parameter("data_texture", contamination_texture)
contamination_material.set_shader_parameter("data_texture_size", terrainData.terrainSize)
contamination_material.set_shader_parameter("data_texture_size", terrain_data.terrain_size)
contamination_material.set_shader_parameter("texture_scale", PLANET_TEXTURE_SCALE)
sprite.material = contamination_material
@@ -117,15 +148,15 @@ func plant(
return true
func impact_contamination(impact_position : Vector2, impact_radius : int, contamination : bool = false):
terrainData.impact_contamination(impact_position, impact_radius, 0. if contamination else 1.)
terrain_data.impact_contamination(impact_position, impact_radius, 0. if contamination else 1.)
if contamination_texture:
contamination_texture.update(terrainData.contamination)
contamination_texture.update(terrain_data.contamination)
func is_in_zone(point : Vector2) -> bool:
return terrainData.is_in_image(terrainData.get_pixel_point(point), terrainData.contamination)
return terrain_data.is_in_image(terrain_data.get_pixel_point(point), terrain_data.contamination)
func is_there_contamination(point : Vector2) -> bool:
return terrainData.get_contamination(point) < 0.5
return terrain_data.get_contamination(point) < 0.5
func pass_day():
for e : Node2D in entityContainer.get_children():
@@ -147,23 +178,50 @@ func pass_day():
if e.has_method("_end_pass_day"):
e._end_pass_day()
decontamination_coverage = terrainData.get_decontamination_coverage()
if day + 1 > DAY_LIMIT:
decontamination_surface = terrain_data.get_decontamination_surface()
if day + 1 > day_limit:
day_limit_exceed.emit(self)
func generate_loot(number : int = loot_number.pick_random()):
for i in range(number):
var loot = UndergroundLoot.new(self)
for j in range(loot_item_number.pick_random()):
loot.loot.append(loot_items.pick_random())
loot.loot.append(
Seed.new(GameInfo.game_data.unlocked_plant_types_path.pick_random())
)
add_entity(loot)
var loot_random_range = UndergroundLoot.LOOTED_ITEM_RANDOM_RANGE
loot.global_position = Vector2(
randf_range(loot_random_range, terrainData.terrainSize.x - loot_random_range),
randf_range(loot_random_range, terrainData.terrainSize.y - loot_random_range)
randf_range(loot_random_range, terrain_data.terrain_size.x - loot_random_range),
randf_range(loot_random_range, terrain_data.terrain_size.y - loot_random_range)
)
func generate_objectives():
var last_objective_angle = 10
for i in range(OBJECTIVE_MAX_LEVEL):
var objective_rewards : Array[ObjectiveReward] = terrain_data.generate_objective_rewards(i, 2)
for objective_reward in objective_rewards:
var objective_angle = randf_range(0, PI*2)
while abs(objective_angle - last_objective_angle) < OBJECTIVE_MIN_ANGLE_DIFF:
objective_angle = randf_range(0, PI*2)
last_objective_angle = objective_angle
generate_objective(
objective_first_distance + objective_between_distance * i,
objective_angle,
objective_reward,
)
func generate_objective(distance : int, angle : float, reward : ObjectiveReward):
var objective : Objective = objective_scene.instantiate() as Objective
add_entity(objective)
objective.reward = reward
objective.position = Vector2.ONE.rotated(angle) * distance
#endregion

View File

@@ -5,15 +5,11 @@ const BORDER_WIDTH = 100
@export var import_entities_from_node : Node2D = null
@export var terrainData : TerrainData
@onready var terrain_data : TerrainData = GameInfo.game_data.current_terrain_data if GameInfo.game_data.current_terrain_data else TerrainData.new()
@onready var borderLimit : StaticBody2D = create_border_limit()
@onready var entityContainer : Node2D = create_entity_container()
func _init():
if not terrainData:
terrainData = TerrainData.new()
func add_entity(e : Node2D, container : Node2D = entityContainer):
if e.get_parent():
e.get_parent().remove_child(e)
@@ -23,7 +19,7 @@ func add_entity(e : Node2D, container : Node2D = entityContainer):
func create_entity_container() -> Node2D:
var container = Node2D.new()
container.y_sort_enabled = true
container.position = terrainData.terrainSize/2
container.position = terrain_data.terrain_size/2
add_child(container)
@@ -33,10 +29,22 @@ func create_entity_container() -> Node2D:
return container
func drop_item(item: Item, item_position : Vector2) -> ItemObject:
func drop_item(item: Item, item_position : Vector2, random_displacement_factor = 0) -> ItemObject:
var item_object = ItemObject.new(item)
add_entity(item_object)
item_object.global_position = item_position
if random_displacement_factor:
var displacement_direction = randf_range(0,2*PI)
var displacement = Vector2.ONE.rotated(displacement_direction) * randf_range(0, random_displacement_factor)
var tween : Tween = get_tree().create_tween()
tween.tween_property(
item_object,
"position",
item_object.position + displacement,
0.2
)
return item_object
func create_border_limit() -> StaticBody2D:
@@ -46,7 +54,7 @@ func create_border_limit() -> StaticBody2D:
add_child(staticBody)
staticBody.add_child(staticBodyCollision)
var size = terrainData.terrainSize
var size = terrain_data.terrain_size
staticBodyCollision.polygon = PackedVector2Array([
Vector2(0,0),
Vector2(0, size.y),