refactor du code et ajouts des quotas, avec des récompense entre chaque quota #68

This commit is contained in:
2025-09-14 19:35:43 +02:00
parent 85cd832864
commit 43bdbc3581
44 changed files with 918 additions and 339 deletions

View File

@@ -6,6 +6,7 @@ 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 = 10
@@ -26,37 +27,46 @@ const OBJECTIVE_MIN_ANGLE_DIFF = PI/2
@export var background_texture : Texture2D
@export var contamination_material : ShaderMaterial
@onready var background_sprite : Polygon2D = generate_background_sprite()
@onready var contamination_sprite : Polygon2D = generate_contamination_terrain_sprite()
@onready var decontamination_surface : float = terrain_data.get_decontamination_surface() :
var background_sprite : Polygon2D
var contamination_sprite : Polygon2D
var decontamination_surface : float :
set(v):
print(v)
decontamination_surface = v
planet_updated.emit(self)
@onready var objective_scene : PackedScene = preload("res://entities/objectives/objective.tscn")
var planet_data : PlanetData
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 day : int = 1
var day_limit = DEFAULT_DAY_LIMIT
var surface_on_last_quota : float = 0
var next_quota : float = 1
var player : Player
func _ready():
planet_updated.emit(self)
planet_data = GameInfo.game_data.current_planet_data if GameInfo.game_data.current_planet_data else PlanetData.new()
terrain_size = planet_data.base_size
entityContainer.position = terrain_size/2
background_sprite = generate_background_sprite()
contamination_sprite = generate_contamination_terrain_sprite()
decontamination_surface = planet_data.get_decontamination_surface()
next_quota = planet_data.get_quota()
surface_on_last_quota = decontamination_surface
generate_loot(first_loot_number)
generate_objectives()
planet_updated.emit(self)
# queue_redraw()
# 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 factor = 20
# for x in range(terrain_size.x / factor):
# for y in range(terrain_size.y / factor):
# var point = Vector2(x, y) * factor
# draw_circle(
@@ -75,6 +85,14 @@ func instantiate_entity(s: PackedScene, entity_position : Vector2):
entity.global_position = entity_position
func instantiate_machine(m_type : MachineType, level, machine_position : Vector2):
var machine = m_type.scene.instantiate() as Machine
machine.setup_machine_info(m_type, level)
add_entity(machine)
machine.global_position = machine_position
func add_entity(e : Node2D, container : Node2D = entityContainer):
if e.get_parent():
e.get_parent().remove_child(e)
@@ -89,7 +107,7 @@ func add_entity(e : Node2D, container : Node2D = entityContainer):
func generate_polygon_sprite(order : int = 0) -> Polygon2D:
var sprite = Polygon2D.new()
var size = terrain_data.terrain_size
var size = terrain_size
sprite.polygon = PackedVector2Array([
Vector2(0,0),
Vector2(size.x, 0),
@@ -113,15 +131,15 @@ func generate_background_sprite() -> Polygon2D:
return sprite
func generate_contamination_terrain_sprite() -> Polygon2D:
if not terrain_data.contamination:
terrain_data.generate_default_contamination()
if not planet_data.contamination:
planet_data.generate_default_contamination()
var sprite :Polygon2D = generate_polygon_sprite(1)
contamination_texture = ImageTexture.create_from_image(terrain_data.contamination)
contamination_texture = ImageTexture.create_from_image(planet_data.contamination.image)
contamination_material.set_shader_parameter("data_texture", contamination_texture)
contamination_material.set_shader_parameter("data_texture_size", terrain_data.terrain_size)
contamination_material.set_shader_parameter("data_texture_size", terrain_size)
contamination_material.set_shader_parameter("texture_scale", PLANET_TEXTURE_SCALE)
sprite.material = contamination_material
@@ -148,15 +166,16 @@ func plant(
return true
func impact_contamination(impact_position : Vector2, impact_radius : int, contamination : bool = false):
terrain_data.impact_contamination(impact_position, impact_radius, 0. if contamination else 1.)
planet_data.impact_contamination(impact_position, impact_radius, 0. if contamination else 1.)
if contamination_texture:
contamination_texture.update(terrain_data.contamination)
contamination_texture.update(planet_data.contamination.image)
planet_updated.emit(self)
func is_in_zone(point : Vector2) -> bool:
return terrain_data.is_in_image(terrain_data.get_pixel_point(point), terrain_data.contamination)
func is_in_base(point : Vector2) -> bool:
return planet_data.is_in_base(point)
func is_there_contamination(point : Vector2) -> bool:
return terrain_data.get_contamination(point) < 0.5
return planet_data.get_contamination(point) < 0.5
func pass_day():
for e : Node2D in entityContainer.get_children():
@@ -178,10 +197,15 @@ func pass_day():
if e.has_method("_end_pass_day"):
e._end_pass_day()
decontamination_surface = terrain_data.get_decontamination_surface()
decontamination_surface = planet_data.get_decontamination_surface()
if day + 1 > day_limit:
day_limit_exceed.emit(self)
if decontamination_surface >= next_quota:
ask_quota_reward()
planet_updated.emit(self)
func generate_loot(number : int = loot_number.pick_random()):
for i in range(number):
var loot = UndergroundLoot.new(self)
@@ -195,14 +219,14 @@ func generate_loot(number : int = loot_number.pick_random()):
var loot_random_range = UndergroundLoot.LOOTED_ITEM_RANDOM_RANGE
loot.global_position = Vector2(
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)
randf_range(loot_random_range, terrain_size.x - loot_random_range),
randf_range(loot_random_range, 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)
var objective_rewards : Array[ObjectiveReward] = planet_data.generate_objective_rewards(i)
for objective_reward in objective_rewards:
var objective_angle = randf_range(0, PI*2)
@@ -224,4 +248,31 @@ func generate_objective(distance : int, angle : float, reward : ObjectiveReward)
objective.position = Vector2.ONE.rotated(angle) * distance
func ask_quota_reward():
planet_data.quota_number += 1
next_quota = planet_data.get_quota(planet_data.quota_number)
surface_on_last_quota = decontamination_surface
quota_reward_asked.emit(
self,
generate_quota_reward(),
generate_quota_reward()
)
func generate_quota_reward() -> Item:
var random_level = randi_range(
max(planet_data.quota_number - 1, 1),
min(planet_data.quota_number + 1, Machine.MAX_MACHINE_LEVEL),
)
var random_machine_type = GameInfo.game_data.unlocked_machines.pick_random()
return Blueprint.new(random_machine_type, random_level)
func choose_quota_reward(item : Item):
drop_item(item, player.global_position, 100)
if decontamination_surface >= next_quota:
ask_quota_reward()
#endregion

View File

@@ -5,7 +5,12 @@ const BORDER_WIDTH = 100
@export var import_entities_from_node : Node2D = null
@onready var terrain_data : TerrainData = GameInfo.game_data.current_terrain_data if GameInfo.game_data.current_terrain_data else TerrainData.new()
var terrain_size = Vector2.ONE * 1000 :
set(v):
terrain_size = v
if borderLimit:
borderLimit.queue_free()
borderLimit = create_border_limit()
@onready var borderLimit : StaticBody2D = create_border_limit()
@onready var entityContainer : Node2D = create_entity_container()
@@ -19,7 +24,6 @@ func add_entity(e : Node2D, container : Node2D = entityContainer):
func create_entity_container() -> Node2D:
var container = Node2D.new()
container.y_sort_enabled = true
container.position = terrain_data.terrain_size/2
add_child(container)
@@ -54,7 +58,7 @@ func create_border_limit() -> StaticBody2D:
add_child(staticBody)
staticBody.add_child(staticBodyCollision)
var size = terrain_data.terrain_size
var size = terrain_size
staticBodyCollision.polygon = PackedVector2Array([
Vector2(0,0),
Vector2(0, size.y),