Merge branch 'musique_et_son_3' of https://git.zacharie-guet.fr/zacharie/seeding-planets into musique_et_son_3
14
common/assets/materials/cristal.tres
Normal file
@@ -0,0 +1,14 @@
|
||||
[gd_resource type="StandardMaterial3D" format=3 uid="uid://di0m3uqgi3l08"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://dfd72vla6crn4" path="res://common/assets/textures/cristal.png" id="1_m4qy0"]
|
||||
|
||||
[resource]
|
||||
diffuse_mode = 3
|
||||
specular_mode = 1
|
||||
disable_fog = true
|
||||
albedo_texture = ExtResource("1_m4qy0")
|
||||
metallic_specular = 1.0
|
||||
rim_tint = 0.48
|
||||
stencil_flags = 2
|
||||
stencil_reference = 5
|
||||
stencil_outline_thickness = 0.626
|
||||
BIN
common/assets/textures/cristal.png
Normal file
|
After Width: | Height: | Size: 152 KiB |
41
common/assets/textures/cristal.png.import
Normal file
@@ -0,0 +1,41 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dfd72vla6crn4"
|
||||
path.s3tc="res://.godot/imported/cristal.png-542ce388785d47ebc69b0d8cd0728915.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/assets/textures/cristal.png"
|
||||
dest_files=["res://.godot/imported/cristal.png-542ce388785d47ebc69b0d8cd0728915.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://dq2nodhwnp73f"
|
||||
path="res://.godot/imported/solarmusic-dripping-water-in-cave-114694.ogg-81f5d41775da1d0914399edcb9214d3c.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/ambiance/cave/solarmusic-dripping-water-in-cave-114694.ogg"
|
||||
dest_files=["res://.godot/imported/solarmusic-dripping-water-in-cave-114694.ogg-81f5d41775da1d0914399edcb9214d3c.oggvorbisstr"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=true
|
||||
loop_offset=0.0
|
||||
bpm=0.0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="mp3"
|
||||
type="AudioStreamMP3"
|
||||
uid="uid://dnqq2sy3dxrb2"
|
||||
path="res://.godot/imported/freesound_community-wine-glass-clink-36036.mp3-bc462b7f4a73f6e9bc3696ca5c63bc97.mp3str"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/cristal/freesound_community-wine-glass-clink-36036.mp3"
|
||||
dest_files=["res://.godot/imported/freesound_community-wine-glass-clink-36036.mp3-bc462b7f4a73f6e9bc3696ca5c63bc97.mp3str"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="mp3"
|
||||
type="AudioStreamMP3"
|
||||
uid="uid://di6id2kyfy2e1"
|
||||
path="res://.godot/imported/sslc2022-earth-rumble-128880.mp3-cbdb82e7630ba8aed62692404d0e45e0.mp3str"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/earth_rumble/sslc2022-earth-rumble-128880.mp3"
|
||||
dest_files=["res://.godot/imported/sslc2022-earth-rumble-128880.mp3-cbdb82e7630ba8aed62692404d0e45e0.mp3str"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
BIN
common/audio_manager/assets/sfx/pickaxe/pickaxe_1_reverb.wav
Normal file
@@ -0,0 +1,24 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://3c4nxjasebyk"
|
||||
path="res://.godot/imported/pickaxe_1_reverb.wav-8d6172bc1e5c2f43ec5b5cf869d5b6e3.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_1_reverb.wav"
|
||||
dest_files=["res://.godot/imported/pickaxe_1_reverb.wav-8d6172bc1e5c2f43ec5b5cf869d5b6e3.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
||||
BIN
common/audio_manager/assets/sfx/pickaxe/pickaxe_2_reverb.wav
Normal file
@@ -0,0 +1,24 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://bs5ldhabymm5p"
|
||||
path="res://.godot/imported/pickaxe_2_reverb.wav-c953afb7e49205a0f4377738e1135a5b.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_2_reverb.wav"
|
||||
dest_files=["res://.godot/imported/pickaxe_2_reverb.wav-c953afb7e49205a0f4377738e1135a5b.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
||||
BIN
common/audio_manager/assets/sfx/pickaxe/pickaxe_3_reverb.wav
Normal file
@@ -0,0 +1,24 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://bu278eqn8krnb"
|
||||
path="res://.godot/imported/pickaxe_3_reverb.wav-d3e3d8b6b50a16c6757536f43c8c6ccd.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_3_reverb.wav"
|
||||
dest_files=["res://.godot/imported/pickaxe_3_reverb.wav-d3e3d8b6b50a16c6757536f43c8c6ccd.sample"]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=false
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=false
|
||||
edit/loop_mode=0
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
||||
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="mp3"
|
||||
type="AudioStreamMP3"
|
||||
uid="uid://rf7hachl3042"
|
||||
path="res://.godot/imported/universfield-bubble-pop-07-487896.mp3-9674fcc5b43af938e0c8845e16ca6bfd.mp3str"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/signal/universfield-bubble-pop-07-487896.mp3"
|
||||
dest_files=["res://.godot/imported/universfield-bubble-pop-07-487896.mp3-9674fcc5b43af938e0c8845e16ca6bfd.mp3str"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
@@ -1,6 +1,8 @@
|
||||
[gd_scene format=3 uid="uid://b6hscxcrj065q"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://2p5d6vogtn82" path="res://common/audio_manager/scripts/audio_manager.gd" id="1_0tvca"]
|
||||
[ext_resource type="AudioStream" uid="uid://dq2nodhwnp73f" path="res://common/audio_manager/assets/ambiance/cave/solarmusic-dripping-water-in-cave-114694.ogg" id="2_ge2sc"]
|
||||
[ext_resource type="AudioStream" uid="uid://dipnmlprwfo12" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_1.ogg" id="2_tuvql"]
|
||||
[ext_resource type="AudioStream" uid="uid://dipnmlprwfo12" path="res://common/audio_manager/assets/ambiance/niveau/ambiance.ogg" id="3_qvjf5"]
|
||||
[ext_resource type="AudioStream" uid="uid://b1hut6lc1jevh" path="res://common/audio_manager/assets/morceaux/niveau/mines_phase_2.ogg" id="4_2fduo"]
|
||||
[ext_resource type="AudioStream" uid="uid://cdohaice7nc8d" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_foggy.ogg" id="4_ipd1r"]
|
||||
@@ -129,6 +131,11 @@ script = ExtResource("1_0tvca")
|
||||
[node name="Ambiances" type="Node" parent="." unique_id=1989991562]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="Cave" type="AudioStreamPlayer" parent="Ambiances" unique_id=71769481]
|
||||
stream = ExtResource("2_ge2sc")
|
||||
volume_db = -7.195
|
||||
pitch_scale = 0.5
|
||||
|
||||
[node name="BaseRelais" type="AudioStreamPlayer" parent="Ambiances" unique_id=1895636918]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource("7_ge2sc")
|
||||
|
||||
@@ -67,6 +67,9 @@ func _on_change_scene(scene : Scene):
|
||||
elif scene is RelayBaseScene:
|
||||
stop_all_musics()
|
||||
play_ambiance_alone("BaseRelais", false)
|
||||
elif scene is CaveScene:
|
||||
stop_all_musics()
|
||||
play_ambiance_alone("Cave", false)
|
||||
|
||||
# Fonction s'exécutant à chaque début de timeline
|
||||
func _on_timeline_started():
|
||||
|
||||
@@ -39,6 +39,11 @@ materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={
|
||||
"materials": {
|
||||
"Cristal": {
|
||||
"use_external/enabled": true,
|
||||
"use_external/fallback_path": "res://common/assets/materials/cristal.tres",
|
||||
"use_external/path": "uid://di0m3uqgi3l08"
|
||||
},
|
||||
"Material": {
|
||||
"use_external/enabled": true,
|
||||
"use_external/fallback_path": "res://common/assets/materials/default_3d.tres",
|
||||
|
||||
@@ -39,6 +39,11 @@ materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={
|
||||
"materials": {
|
||||
"Cristal": {
|
||||
"use_external/enabled": true,
|
||||
"use_external/fallback_path": "res://common/assets/materials/cristal.tres",
|
||||
"use_external/path": "uid://di0m3uqgi3l08"
|
||||
},
|
||||
"Material": {
|
||||
"use_external/enabled": true,
|
||||
"use_external/fallback_path": "res://common/assets/materials/default_3d.tres",
|
||||
|
||||
@@ -33,6 +33,7 @@ signal current_region_data_updated(p : RegionData)
|
||||
@export var game_mode : GameMode = GameMode.STORY
|
||||
|
||||
@export var dialogs_done : Array[String] = [] #Chemin des dialogues terminés
|
||||
@export var tutorials_done : Array[String] = []
|
||||
|
||||
func start_run() -> RunData:
|
||||
player_data.clear_inventory()
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
extends Resource
|
||||
class_name ProgressionData
|
||||
|
||||
|
||||
@export var planted_mutation_ids: Array[String] = []
|
||||
@export var story_step_i := 0
|
||||
@export var ship_tutorial_done = false
|
||||
@export var mutations_unlocked = 8
|
||||
|
||||
var all_mutations: Array[PlantMutation] : get = get_all_mutations
|
||||
var available_mutations: Array[PlantMutation] : get = get_all_mutations
|
||||
var available_mutations: Array[PlantMutation] : get = get_available_mutations
|
||||
var available_artefacts: Array[Artefact] : get = get_all_artifacts
|
||||
var story_step : StoryStep : get = get_story_step
|
||||
|
||||
@@ -19,23 +18,26 @@ func next_story_step() -> void:
|
||||
if story_step_i + 1 < len(get_all_story_steps()):
|
||||
story_step_i += 1
|
||||
|
||||
func get_available_mutations() -> Array[PlantMutation]:
|
||||
return get_all_mutations().slice(0, mutations_unlocked)
|
||||
|
||||
func get_all_mutations() -> Array[PlantMutation]:
|
||||
return [
|
||||
AncientMutation.new(),
|
||||
FertileMutation.new(),
|
||||
GenerousMutation.new(),
|
||||
HurriedMutation.new(),
|
||||
PrecociousMutation.new(),
|
||||
ProlificMutation.new(),
|
||||
ProtectiveMutation.new(),
|
||||
PureMutation.new(),
|
||||
PurificationMutation.new(),
|
||||
QualityMutation.new(),
|
||||
AncientMutation.new(),
|
||||
ProlificMutation.new(),
|
||||
PrecociousMutation.new(),
|
||||
PurificationMutation.new(),
|
||||
VivaciousMutation.new(),
|
||||
QuickMutation.new(),
|
||||
RobustMutation.new(),
|
||||
SocialMutation.new(),
|
||||
FertileMutation.new(),
|
||||
HurriedMutation.new(),
|
||||
GenerousMutation.new(),
|
||||
ProtectiveMutation.new(),
|
||||
PureMutation.new(),
|
||||
ToughMutation.new(),
|
||||
VivaciousMutation.new(),
|
||||
]
|
||||
|
||||
func get_all_artifacts() -> Array[Artefact]:
|
||||
|
||||
@@ -32,42 +32,56 @@ func generate_next_run_points() -> Array[RunPoint]:
|
||||
next_run_points = []
|
||||
|
||||
for i in range(story_step.get_run_point_number(level+1)):
|
||||
var last_modifiers : Array[String] = []
|
||||
if len(next_run_points):
|
||||
for m in next_run_points[0].region_parameter.modifiers:
|
||||
last_modifiers.append(m.modifier_name)
|
||||
next_run_points.append(
|
||||
generate_next_run_point()
|
||||
generate_next_run_point(last_modifiers)
|
||||
)
|
||||
|
||||
return next_run_points
|
||||
|
||||
func generate_next_run_point() -> RunPoint:
|
||||
func generate_next_run_point(last_modifiers : Array[String] = []) -> RunPoint:
|
||||
var region_parameter = RegionParameter.new()
|
||||
|
||||
var next_level = level+1
|
||||
|
||||
var challenge_modifiers = generate_challenge_modifiers().filter(
|
||||
func(m : RegionModifier): return not m.modifier_name in last_modifiers
|
||||
)
|
||||
var benefic_modifiers = generate_benefic_modifiers().filter(
|
||||
func(m : RegionModifier): return not m.modifier_name in last_modifiers
|
||||
)
|
||||
var normal_modifiers = generate_normal_modifiers().filter(
|
||||
func(m : RegionModifier): return not m.modifier_name in last_modifiers
|
||||
)
|
||||
|
||||
if story_step.need_gameplay_modifier(next_level):
|
||||
var is_challenge = randf() < story_step.get_challenge_chance(next_level)
|
||||
if is_challenge:
|
||||
region_parameter.modifiers = [
|
||||
generate_challenge_modifiers().pick_random(),
|
||||
generate_benefic_modifiers().pick_random()
|
||||
challenge_modifiers.pick_random(),
|
||||
benefic_modifiers.pick_random()
|
||||
] as Array[RegionModifier]
|
||||
else:
|
||||
region_parameter.modifiers = [
|
||||
generate_normal_modifiers().pick_random()
|
||||
normal_modifiers.pick_random()
|
||||
] as Array[RegionModifier]
|
||||
|
||||
|
||||
var first_vending = story_step.get_first_vending_machine_occurence(next_level)
|
||||
var vending_occurence = story_step.get_vending_machine_occurence(next_level)
|
||||
if vending_occurence > 0:
|
||||
if (level - first_vending)%vending_occurence == 0:
|
||||
region_parameter.modifiers.append(VendingMachineModifier.new())
|
||||
|
||||
region_parameter.modifiers.append_array(
|
||||
story_step.get_gameplay_modifiers_for_region(next_level)
|
||||
)
|
||||
|
||||
region_parameter.modifiers.append_array(
|
||||
story_step.get_story_modifiers_for_region(next_level)
|
||||
)
|
||||
|
||||
region_parameter.objective = story_step.get_objective_for_region(next_level)
|
||||
|
||||
region_parameter.charge = story_step.get_charge_number(next_level)
|
||||
|
||||
|
||||
return RunPoint.new(
|
||||
region_parameter
|
||||
)
|
||||
@@ -94,7 +108,7 @@ func generate_normal_modifiers() -> Array[RegionModifier]:
|
||||
HarshModifier.new(),
|
||||
ToxicModifier.new(),
|
||||
SandyModifier.new(),
|
||||
|
||||
MagneticModifier.new(),
|
||||
]
|
||||
|
||||
func generate_benefic_modifiers() -> Array[RegionModifier]:
|
||||
@@ -102,6 +116,7 @@ func generate_benefic_modifiers() -> Array[RegionModifier]:
|
||||
VendingMachineModifier.new(),
|
||||
ResonnanceModifier.new(),
|
||||
InstableModifier.new(),
|
||||
CaveModifier.new(),
|
||||
]
|
||||
|
||||
|
||||
|
||||
@@ -57,8 +57,8 @@ const AVAILABLE_LANGUAGES_LABEL = [
|
||||
|
||||
#region ------------------ Game ------------------
|
||||
|
||||
const MAX_ZOOM = 1.8
|
||||
const MIN_ZOOM = 0.8
|
||||
const MAX_ZOOM = 2.
|
||||
const MIN_ZOOM = 0.5
|
||||
|
||||
# Not in settings pannel
|
||||
@export var zoom : float = 1. :
|
||||
|
||||
@@ -2,6 +2,7 @@ extends StoryStep
|
||||
class_name AstraStoryStep
|
||||
|
||||
const MERCURY_ARRIVAL_DIALOG_PATH="res://dialogs/timelines/astra/mercury_arrival.dtl"
|
||||
const CAVE_DIALOG_PATH="res://dialogs/timelines/astra/cave.dtl"
|
||||
|
||||
func get_respawn_scene() -> Scene:
|
||||
return AstraScene.new()
|
||||
@@ -15,9 +16,21 @@ func get_destination_scene() -> Scene:
|
||||
"001"
|
||||
)
|
||||
|
||||
func get_cave_occurence(_level : int) -> int:
|
||||
return 2
|
||||
|
||||
func get_region_sequence_length() -> int:
|
||||
return 4
|
||||
|
||||
func get_objective_for_region(level : int) -> int:
|
||||
match level:
|
||||
1: return 6
|
||||
2: return 10
|
||||
3: return 16
|
||||
4: return 24
|
||||
5: return 34
|
||||
_: return get_objective_for_region(level-1) + (level-2) * 5
|
||||
|
||||
func get_first_vending_machine_occurence(_level : int) -> int:
|
||||
return 0
|
||||
|
||||
@@ -28,6 +41,8 @@ func get_challenge_chance(_level : int) -> float:
|
||||
return 0.
|
||||
|
||||
func get_ship_dialog_path(level : int, ship_in_space := true) -> String:
|
||||
if ship_in_space and level == get_region_sequence_length() - 1:
|
||||
if ship_in_space and level == get_cave_occurence(level) - 1:
|
||||
return CAVE_DIALOG_PATH
|
||||
if ship_in_space and is_run_finished(level + 1):
|
||||
return MERCURY_ARRIVAL_DIALOG_PATH
|
||||
return ""
|
||||
@@ -22,11 +22,11 @@ func get_destination_scene() -> Scene:
|
||||
)
|
||||
|
||||
func get_first_vending_machine_occurence(_level : int) -> int:
|
||||
return 0
|
||||
return 1
|
||||
|
||||
func get_ship_dialog_path(level : int, ship_in_space := true) -> String:
|
||||
if level == 0:
|
||||
return MERCURY_DEPARTURE_DIALOG_PATH
|
||||
if ship_in_space and level == get_region_sequence_length() - 1:
|
||||
if ship_in_space and is_run_finished(level + 1):
|
||||
return VENUS_ARRIVAL_DIALOG_PATH
|
||||
return ""
|
||||
@@ -19,7 +19,7 @@ func get_ship_dialog_path(_level : int, _ship_in_space := true) -> String:
|
||||
#region ------------------ Run ------------------
|
||||
|
||||
func is_run_finished(level : int) -> bool:
|
||||
return level == get_region_sequence_length()
|
||||
return level == get_region_sequence_length() - 1
|
||||
|
||||
func get_region_sequence_length() -> int:
|
||||
return 6
|
||||
@@ -28,7 +28,13 @@ func get_first_vending_machine_occurence(_level : int) -> int:
|
||||
return 2
|
||||
|
||||
func get_vending_machine_occurence(_level : int) -> int:
|
||||
return 4
|
||||
return 3
|
||||
|
||||
func get_first_cave_occurence(level : int) -> int:
|
||||
return get_cave_occurence(level)
|
||||
|
||||
func get_cave_occurence(_level : int) -> int:
|
||||
return 3
|
||||
|
||||
func get_challenge_chance(_level : int) -> float:
|
||||
return 0.3
|
||||
@@ -38,15 +44,17 @@ func get_run_point_number(level : int) -> int:
|
||||
return 1
|
||||
return 2
|
||||
|
||||
func get_charge_number(_level : int) -> int:
|
||||
return 10
|
||||
|
||||
func get_objective_for_region(level : int) -> int:
|
||||
match level:
|
||||
0: return 1
|
||||
1: return 8
|
||||
2: return 10
|
||||
3: return 15
|
||||
4: return 20
|
||||
5: return 30
|
||||
_: return get_objective_for_region(level-1) + (level-3) * 5
|
||||
1: return 10
|
||||
2: return 15
|
||||
3: return 20
|
||||
4: return 30
|
||||
5: return 45
|
||||
_: return get_objective_for_region(level-1) + (level-2) * 5
|
||||
|
||||
func get_story_modifiers_for_region(level : int) -> Array[RegionModifier]:
|
||||
var modifiers : Array[RegionModifier] = []
|
||||
@@ -54,6 +62,25 @@ func get_story_modifiers_for_region(level : int) -> Array[RegionModifier]:
|
||||
var dest_mod = DestinationModifier.new()
|
||||
dest_mod.destination_scene = get_destination_scene()
|
||||
modifiers.append(dest_mod)
|
||||
|
||||
var first_cave = get_first_cave_occurence(level)
|
||||
var cave_occurence = get_cave_occurence(level)
|
||||
if cave_occurence > 0 and level >= first_cave:
|
||||
if (level - first_cave)%cave_occurence == 0:
|
||||
modifiers.append(CaveModifier.new())
|
||||
|
||||
return modifiers
|
||||
|
||||
func get_gameplay_modifiers_for_region(level : int) -> Array[RegionModifier]:
|
||||
var modifiers : Array[RegionModifier] = []
|
||||
|
||||
if need_gameplay_modifier(level):
|
||||
var first_vending = get_first_vending_machine_occurence(level)
|
||||
var vending_occurence = get_vending_machine_occurence(level)
|
||||
if vending_occurence > 0 and level >= first_vending:
|
||||
if (level - first_vending)%vending_occurence == 0:
|
||||
modifiers.append(VendingMachineModifier.new())
|
||||
|
||||
return modifiers
|
||||
|
||||
func need_gameplay_modifier(level : int):
|
||||
|
||||
23
common/icons/cristal.svg
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="#ffffff"
|
||||
class="icon icon-tabler icons-tabler-filled icon-tabler-globe"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs5" />
|
||||
<path
|
||||
id="path5"
|
||||
style="fill:#ffffff;stroke-width:21.0943;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 17.023734,4.3635641 a 0.381287,0.381287 0 0 0 -0.170042,0.058862 L 11.821685,7.6971107 A 0.63341096,0.63341096 0 0 0 11.534237,8.2108309 L 11.240336,19.008011 a 0.54999444,0.54999444 0 0 0 0.281243,0.495301 l 2.913668,1.633839 a 0.85528839,0.85528839 0 0 0 0.615008,0.08674 l 3.251881,-0.764304 a 0.54999441,0.54999441 0 0 0 0.407255,-0.3982 L 21.41304,9.6040507 A 0.633411,0.633411 0 0 0 21.276945,9.0305978 L 17.348792,4.4922505 A 0.381287,0.381287 0 0 0 17.023734,4.3635641 Z M 16.855445,5.710685 a 0.29045002,0.29045002 0 0 1 0.24822,0.1000976 l 2.992058,3.4556065 a 0.18188889,0.18188889 0 0 1 -0.06799,0.2862794 L 16.39349,11.042166 a 0.43339164,0.43339164 0 0 1 -0.433214,-0.0611 L 12.879721,8.5445752 a 0.18188888,0.18188888 0 0 1 0.01384,-0.2939165 l 3.831045,-2.4933356 a 0.29045002,0.29045002 0 0 1 0.130842,-0.046638 z" />
|
||||
<path
|
||||
id="path11"
|
||||
style="fill:#ffffff;stroke-width:30;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="M 11.299657,2.8712653 4.865863,8.4803941 A 0.83240115,0.83240115 109.32328 0 0 4.5938103,9.2562442 l 1.6673523,9.2015148 a 0.84433519,0.84433519 50.484116 0 0 0.5249373,0.63644 l 4.4292571,1.721467 a 1.216379,1.216379 3.6429642e-7 0 0 0.88129,0 l 4.429257,-1.721467 a 0.84433513,0.84433513 129.51588 0 0 0.524938,-0.63644 L 18.718193,9.2562442 A 0.83240121,0.83240121 70.676724 0 0 18.446141,8.4803941 L 12.012347,2.8712653 a 0.54226096,0.54226096 5.9568751e-7 0 0 -0.71269,0 z"
|
||||
transform="matrix(0.43145929,-0.11560917,0.11560917,0.43145929,0.83225312,12.978764)" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
44
common/icons/cristal.svg.import
Normal file
@@ -0,0 +1,44 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cqdyykjx6hdrr"
|
||||
path.s3tc="res://.godot/imported/cristal.svg-7e9a919e9dbc36092f14a8401b5f4888.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/icons/cristal.svg"
|
||||
dest_files=["res://.godot/imported/cristal.svg-7e9a919e9dbc36092f14a8401b5f4888.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
23
common/icons/flag-2.svg
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="icon icon-tabler icons-tabler-filled icon-tabler-flag-2"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<path
|
||||
stroke="none"
|
||||
d="M 0,0 H 24 V 24 H 0 Z"
|
||||
fill="none"
|
||||
id="path1" />
|
||||
<path
|
||||
d="m 19,4 a 1,1 0 0 1 0.993,0.883 L 20,5 v 9 a 1,1 0 0 1 -0.883,0.993 L 19,15 H 6 v 6 A 1,1 0 0 1 5.117,21.993 L 5,22 A 1,1 0 0 1 4.007,21.117 L 4,21 V 5 A 1,1 0 0 1 4.883,4.007 L 5,4 Z"
|
||||
id="path2"
|
||||
style="fill:#fefefe;fill-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 701 B |
43
common/icons/flag-2.svg.import
Normal file
@@ -0,0 +1,43 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://uckrw5fan88k"
|
||||
path="res://.godot/imported/flag-2.svg-b4658bfe95b153ec543e0e6f4d1176cb.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/icons/flag-2.svg"
|
||||
dest_files=["res://.godot/imported/flag-2.svg-b4658bfe95b153ec543e0e6f4d1176cb.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
39
common/icons/hand-finger
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="18.474695"
|
||||
height="20.999998"
|
||||
viewBox="0 0 18.474695 20.999998"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
class="icon icon-tabler icons-tabler-outline icon-tabler-hand-finger"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs5" />
|
||||
<path
|
||||
stroke="none"
|
||||
d="m -2.525305,-2.0000007 h 24 V 21.999999 h -24 z"
|
||||
fill="none"
|
||||
id="path1" />
|
||||
<path
|
||||
d="M 5.474695,10.999999 V 2.4999993 a 1.5,1.5 0 0 1 3,0 v 7.5"
|
||||
id="path2"
|
||||
style="stroke:#ffffff;stroke-opacity:1" />
|
||||
<path
|
||||
d="m 8.474695,9.4999993 v -2 a 1.5,1.5 0 1 1 3,0 v 2.5"
|
||||
id="path3"
|
||||
style="stroke:#ffffff;stroke-opacity:1" />
|
||||
<path
|
||||
d="m 11.474695,8.4999993 a 1.5,1.5 0 0 1 3,0 v 1.5"
|
||||
id="path4"
|
||||
style="stroke:#ffffff;stroke-opacity:1" />
|
||||
<path
|
||||
d="m 14.474695,9.4999993 a 1.5,1.5 0 0 1 3,0 v 4.4999997 a 6,6 0 0 1 -6,6 h -2 0.208 a 6,6 0 0 1 -5.012,-2.7 69.74,69.74 0 0 1 -0.196,-0.3 c -0.312,-0.479 -1.407,-2.388 -3.286,-5.728 a 1.5,1.5 0 0 1 0.536,-2.0219997 1.867,1.867 0 0 1 2.28,0.28 l 1.47,1.4699997"
|
||||
id="path5"
|
||||
style="stroke:#ffffff;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
39
common/icons/hand-finger.svg
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="18.474695"
|
||||
height="20.999998"
|
||||
viewBox="0 0 18.474695 20.999998"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
class="icon icon-tabler icons-tabler-outline icon-tabler-hand-finger"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs5" />
|
||||
<path
|
||||
stroke="none"
|
||||
d="m -2.525305,-2.0000007 h 24 V 21.999999 h -24 z"
|
||||
fill="none"
|
||||
id="path1" />
|
||||
<path
|
||||
d="M 5.474695,10.999999 V 2.4999993 a 1.5,1.5 0 0 1 3,0 v 7.5"
|
||||
id="path2"
|
||||
style="stroke:#ffffff;stroke-opacity:1" />
|
||||
<path
|
||||
d="m 8.474695,9.4999993 v -2 a 1.5,1.5 0 1 1 3,0 v 2.5"
|
||||
id="path3"
|
||||
style="stroke:#ffffff;stroke-opacity:1" />
|
||||
<path
|
||||
d="m 11.474695,8.4999993 a 1.5,1.5 0 0 1 3,0 v 1.5"
|
||||
id="path4"
|
||||
style="stroke:#ffffff;stroke-opacity:1" />
|
||||
<path
|
||||
d="m 14.474695,9.4999993 a 1.5,1.5 0 0 1 3,0 v 4.4999997 a 6,6 0 0 1 -6,6 h -2 0.208 a 6,6 0 0 1 -5.012,-2.7 69.74,69.74 0 0 1 -0.196,-0.3 c -0.312,-0.479 -1.407,-2.388 -3.286,-5.728 a 1.5,1.5 0 0 1 0.536,-2.0219997 1.867,1.867 0 0 1 2.28,0.28 l 1.47,1.4699997"
|
||||
id="path5"
|
||||
style="stroke:#ffffff;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
43
common/icons/hand-finger.svg.import
Normal file
@@ -0,0 +1,43 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b3vg3tipd4boh"
|
||||
path="res://.godot/imported/hand-finger.svg-4b9fa57a07066292554e8fd7f7ad9dac.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/icons/hand-finger.svg"
|
||||
dest_files=["res://.godot/imported/hand-finger.svg-4b9fa57a07066292554e8fd7f7ad9dac.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
45
common/icons/magnet.svg
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="icon icon-tabler icons-tabler-filled icon-tabler-magnet"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
sodipodi:docname="magnet.svg"
|
||||
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="namedview2"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#ffffff"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="1"
|
||||
inkscape:deskcolor="#505050"
|
||||
inkscape:zoom="18.5"
|
||||
inkscape:cx="18.621622"
|
||||
inkscape:cy="14.324324"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1009"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
stroke="none"
|
||||
d="M0 0h24v24H0z"
|
||||
fill="none"
|
||||
id="path1" />
|
||||
<path
|
||||
d="M21 9v4a9 9 0 0 1 -18 0v-4h7v4a2 2 0 1 0 4 0v-4zm-3 -7a3 3 0 0 1 3 3v2h-7v-2a3 3 0 0 1 3 -3zm-11 0a3 3 0 0 1 3 3v2h-7v-2a3 3 0 0 1 3 -3z"
|
||||
id="path2"
|
||||
style="fill:#ffffff;fill-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
43
common/icons/magnet.svg.import
Normal file
@@ -0,0 +1,43 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://mv0emix7dwio"
|
||||
path="res://.godot/imported/magnet.svg-210fc8631abfaf11eefb9e027a72fb42.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/icons/magnet.svg"
|
||||
dest_files=["res://.godot/imported/magnet.svg-210fc8631abfaf11eefb9e027a72fb42.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
31
common/scene_manager/scripts/scenes/cave_scene.gd
Normal file
@@ -0,0 +1,31 @@
|
||||
extends Scene
|
||||
class_name CaveScene
|
||||
|
||||
@export var cave_room_seed = 0
|
||||
|
||||
func _init(
|
||||
_crs : int = 0
|
||||
):
|
||||
cave_room_seed = _crs
|
||||
|
||||
func get_scene_id() -> String:
|
||||
return "CRISTAL_CAVE"
|
||||
|
||||
func get_scene_path() -> String:
|
||||
return "res://stages/3d_scenes/cave/cave.tscn"
|
||||
|
||||
func is_mouse_captured() -> bool:
|
||||
return true
|
||||
|
||||
func is_needed_to_be_announced() -> bool:
|
||||
return true
|
||||
|
||||
func get_scene_title() -> String:
|
||||
return tr("CRISTAL_CAVE")
|
||||
|
||||
func get_scene_icon() -> Texture:
|
||||
return preload("res://common/icons/cristal.svg")
|
||||
|
||||
func _on_generated(generated_scene : Node):
|
||||
var cave : Cave = generated_scene as Cave
|
||||
cave.setup_room(cave_room_seed)
|
||||
1
common/scene_manager/scripts/scenes/cave_scene.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://f143q00p8ph1
|
||||
@@ -12,16 +12,18 @@ static func get_tile_from_pos(coord) -> Vector2i:
|
||||
floori(coord.y / (Region.TILE_SIZE)),
|
||||
)
|
||||
|
||||
static func get_tiles_in_circle(center: Vector2, radius : float) -> Array[Vector2i]:
|
||||
static func get_tiles_in_circle(center: Vector2,radius : float) -> Array[Vector2i]:
|
||||
var tiles : Array[Vector2i] = []
|
||||
|
||||
var margin = ceili(radius * 0.5)
|
||||
|
||||
for x in range(
|
||||
floori((center.x - radius/2.) / Region.TILE_SIZE),
|
||||
ceili((center.x + radius/2.) / Region.TILE_SIZE),
|
||||
floori((center.x - radius/2.) / Region.TILE_SIZE) - margin,
|
||||
ceili((center.x + radius/2.) / Region.TILE_SIZE) + margin,
|
||||
):
|
||||
for y in range(
|
||||
floori((center.y - radius/2.) / Region.TILE_SIZE),
|
||||
ceili((center.y + radius/2.) / Region.TILE_SIZE),
|
||||
floori((center.y - radius/2.) / Region.TILE_SIZE) - margin,
|
||||
ceili((center.y + radius/2.) / Region.TILE_SIZE) + margin,
|
||||
):
|
||||
if is_tile_on_circle(Vector2i(x,y), center, radius):
|
||||
tiles.append(Vector2i(x,y))
|
||||
@@ -30,24 +32,29 @@ static func get_tiles_in_circle(center: Vector2, radius : float) -> Array[Vector
|
||||
static func is_tile_on_circle(tile_coord : Vector2i, circle_center: Vector2, circle_radius : float) -> bool:
|
||||
var absolute_tile_pos : Vector2 = tile_coord * Region.TILE_SIZE
|
||||
|
||||
# Loop over tile corners to know if the area collide
|
||||
var corners : Array[Vector2] = []
|
||||
for x in [0,1]:
|
||||
for y in [0,1]:
|
||||
corners.append(
|
||||
absolute_tile_pos
|
||||
+ Vector2.RIGHT * x * Region.TILE_SIZE
|
||||
+ Vector2.DOWN * y * Region.TILE_SIZE
|
||||
)
|
||||
|
||||
# Check if segment touch area
|
||||
for i in range(4):
|
||||
var a = corners[i%4]
|
||||
var b = corners[(i+1)%4]
|
||||
if segment_intersect_circle(a,b,circle_center,circle_radius):
|
||||
return true
|
||||
var tile_center = absolute_tile_pos + Vector2.ONE * Region.TILE_SIZE / 2
|
||||
var tile_radius = roundf(Region.TILE_SIZE/2.)
|
||||
|
||||
return false
|
||||
return pow(tile_center.x - circle_center.x, 2) + pow(tile_center.y - circle_center.y, 2) <= pow(tile_radius + circle_radius, 2)
|
||||
|
||||
# Loop over tile corners to know if the area collide
|
||||
# var corners : Array[Vector2] = []
|
||||
# for x in [0,1]:
|
||||
# for y in [0,1]:
|
||||
# corners.append(
|
||||
# absolute_tile_pos
|
||||
# + Vector2.RIGHT * x * Region.TILE_SIZE
|
||||
# + Vector2.DOWN * y * Region.TILE_SIZE
|
||||
# )
|
||||
|
||||
# # Check if segment touch area
|
||||
# for i in range(4):
|
||||
# var a = corners[i%4]
|
||||
# var b = corners[(i+1)%4]
|
||||
# if segment_intersect_circle(a,b,circle_center,circle_radius):
|
||||
# return true
|
||||
|
||||
# return false
|
||||
|
||||
|
||||
# Stolen here https://stackoverflow.com/questions/1073336/circle-line-segment-collision-detection-algorithm
|
||||
|
||||
3
common/tools/scripts/test_tiles.gd
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
|
||||
|
||||
1
common/tools/scripts/test_tiles.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bebwor5r5nnov
|
||||
9
common/tools/test_tiles.tscn
Normal file
@@ -0,0 +1,9 @@
|
||||
[gd_scene format=3 uid="uid://6or2rnjt5ixv"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bebwor5r5nnov" path="res://common/tools/scripts/test_tiles.gd" id="1_44t07"]
|
||||
|
||||
[node name="TestTiles" type="Node2D" unique_id=949540000]
|
||||
script = ExtResource("1_44t07")
|
||||
|
||||
[node name="Grid" type="Node2D" parent="." unique_id=2109744474]
|
||||
unique_name_in_owner = true
|
||||
40
common/vfx/materials/shaders/topology_map.gdshader
Normal file
@@ -0,0 +1,40 @@
|
||||
shader_type canvas_item;
|
||||
|
||||
uniform float line_number = 6;
|
||||
uniform vec4 line_color : source_color = vec4(1.);
|
||||
uniform float line_thickness : hint_range(0.0, 0.01) = 0.001;
|
||||
|
||||
const mat3 sobel_x = mat3(
|
||||
vec3( 1.0, 2.0, 1.0),
|
||||
vec3( 0.0, 0.0, 0.0),
|
||||
vec3(-1.0, -2.0, -1.0)
|
||||
);
|
||||
|
||||
const mat3 sobel_y = mat3(
|
||||
vec3(1.0, 0.0, -1.0),
|
||||
vec3(2.0, 0.0, -2.0),
|
||||
vec3(1.0, 0.0, -1.0)
|
||||
);
|
||||
|
||||
float sample_quantized(sampler2D text, vec2 uv) {
|
||||
return ceil(texture(text, uv).r * line_number) / line_number;
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
float gx = 0.0;
|
||||
float gy = 0.0;
|
||||
|
||||
for (int x = 0; x < 3; x++) {
|
||||
for (int y = 0; y < 3; y++) {
|
||||
vec2 offset = vec2(float(x) - 1.0, float(y) - 1.0) * line_thickness;
|
||||
float s = sample_quantized(TEXTURE, UV + offset);
|
||||
gx += s * sobel_x[x][y];
|
||||
gy += s * sobel_y[x][y];
|
||||
}
|
||||
}
|
||||
|
||||
float edge = length(vec2(gx, gy));
|
||||
float line = step(0.0001, edge);
|
||||
|
||||
COLOR = vec4(line_color.rgb, line * line_color.a * COLOR.r);
|
||||
}
|
||||
1
common/vfx/materials/shaders/topology_map.gdshader.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bklafn6ulmkij
|
||||
13
dialogs/timelines/astra/cave.dtl
Normal file
@@ -0,0 +1,13 @@
|
||||
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/incoming_transmission.wav"
|
||||
join demeter center [animation="Bounce In" length="1.0"]
|
||||
demeter: I hope everything is going well for you so far. I'm calling because the next regions you're heading to contain unique rock formations\: the [b]Caverns of Talion[/b]. #id:e5
|
||||
- Talion hadn't disappeared? #id:e6
|
||||
demeter: Precisely, I'd like you to check for me if its reappearance on the surface also means its reappearance in the caverns. #id:e7
|
||||
- How do you know? #id:e8
|
||||
demeter: These caverns were well known to humans. Some went there to study Talion, others to explore the cave. These explorations were very risky, but apparently some humans enjoyed risking their lives... #id:e9
|
||||
- What does that change for me? #id:ea
|
||||
demeter: The crystals in these caverns are special; they don't produce life, but they release a powerful mutagenic energy into the air. This will surely help you grow more powerfull plants for the rest of your journey. #id:eb
|
||||
demeter: Use your detector to find the entrance to the cave; humans had installed an elevator there. #id:ec
|
||||
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/closing_transmission.wav"
|
||||
[wait time="2.0"]
|
||||
[end_timeline]
|
||||
1
dialogs/timelines/astra/cave.dtl.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://pgqchxycwcpd
|
||||
@@ -1,29 +1,52 @@
|
||||
extends Camera2D
|
||||
class_name Camera
|
||||
class_name RegionCamera
|
||||
|
||||
const MOVE_LERP_WEIGHT = 0.9
|
||||
const ZOOM_LERP_WEIGHT = 0.05
|
||||
|
||||
const SHAKE_INTENSITY = 10.0
|
||||
const SHAKE_SPEED = 500.0
|
||||
|
||||
const ZOOM_STEP = 0.1
|
||||
|
||||
@export var following : Node2D
|
||||
@export var should_follow : bool = true
|
||||
@onready var settings = GameInfo.settings_data
|
||||
|
||||
@export var shake_active_time = -1
|
||||
var shake_noise := FastNoiseLite.new()
|
||||
|
||||
func _input(_e):
|
||||
if Input.is_action_just_pressed("zoom_in"):
|
||||
settings.zoom = settings.zoom + ZOOM_STEP
|
||||
GameInfo.save_settings()
|
||||
if Input.is_action_just_pressed("zoom_out"):
|
||||
settings.zoom = settings.zoom - ZOOM_STEP
|
||||
GameInfo.save_settings()
|
||||
if Input.is_action_just_pressed("zoom_in"):
|
||||
settings.zoom = settings.zoom + ZOOM_STEP
|
||||
GameInfo.save_settings()
|
||||
if Input.is_action_just_pressed("zoom_out"):
|
||||
settings.zoom = settings.zoom - ZOOM_STEP
|
||||
GameInfo.save_settings()
|
||||
|
||||
func _ready():
|
||||
if following:
|
||||
zoom = Vector2.ONE * settings.zoom
|
||||
global_position = following.global_position
|
||||
if following and should_follow:
|
||||
zoom = Vector2.ONE * settings.zoom
|
||||
global_position = following.global_position
|
||||
|
||||
func _process(_delta):
|
||||
if following:
|
||||
global_position = following.global_position.lerp(global_position, MOVE_LERP_WEIGHT)
|
||||
|
||||
zoom = zoom.lerp(Vector2.ONE * settings.zoom, MOVE_LERP_WEIGHT)
|
||||
func _process(delta):
|
||||
if following and should_follow:
|
||||
global_position = following.global_position.lerp(global_position, MOVE_LERP_WEIGHT)
|
||||
|
||||
zoom = zoom.lerp(Vector2.ONE * settings.zoom, MOVE_LERP_WEIGHT)
|
||||
|
||||
if shake_active_time > 0.:
|
||||
print(shake_noise.get_noise_2d(shake_active_time * SHAKE_SPEED, 0) * SHAKE_INTENSITY)
|
||||
shake_active_time -= delta
|
||||
|
||||
offset = Vector2(
|
||||
shake_noise.get_noise_2d(shake_active_time * SHAKE_SPEED, 0) * SHAKE_INTENSITY,
|
||||
shake_noise.get_noise_2d(0, shake_active_time * SHAKE_SPEED) * SHAKE_INTENSITY,
|
||||
)
|
||||
else :
|
||||
offset = lerp(offset, Vector2.ZERO, 10.5 * delta)
|
||||
|
||||
func shake(time := 5):
|
||||
shake_noise.seed = randi()
|
||||
|
||||
shake_active_time = time
|
||||
|
||||
294
entities/interactable_3d/cristal/artefact_announce.tscn
Normal file
@@ -0,0 +1,294 @@
|
||||
[gd_scene format=3 uid="uid://bhbc1monbgumh"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://xamd5y6tig71" path="res://entities/interactable_3d/cristal/scripts/artefact_announce.gd" id="1_2sroa"]
|
||||
[ext_resource type="Texture2D" uid="uid://bi5jo6pf0acjb" path="res://common/icons/carambola.svg" id="2_3vg7r"]
|
||||
[ext_resource type="LabelSettings" uid="uid://dqwayi8yjwau2" path="res://gui/ressources/title_label_settings.tres" id="3_doutq"]
|
||||
[ext_resource type="FontFile" uid="uid://qt80w6o01q5s" path="res://gui/ressources/fonts/TitanOne-Regular.ttf" id="4_bw55c"]
|
||||
[ext_resource type="Script" uid="uid://bqisp5hjs06rj" path="res://gui/game/announce/scripts/announce_inspectable.gd" id="5_5vr2f"]
|
||||
[ext_resource type="Script" uid="uid://dj2pv1hiwjfv0" path="res://gui/game/card/scripts/card_info.gd" id="7_tryv5"]
|
||||
[ext_resource type="Script" uid="uid://dgbh38j13g5kn" path="res://gui/game/card/scripts/card_section_info.gd" id="8_duftv"]
|
||||
[ext_resource type="Texture2D" uid="uid://dth2mj0nh2q70" path="res://common/icons/align-right.svg" id="9_qlk3h"]
|
||||
[ext_resource type="Script" uid="uid://b4tkium34c831" path="res://gui/game/card/scripts/card_stat_info.gd" id="10_d5x7w"]
|
||||
[ext_resource type="Texture2D" uid="uid://bsvxhafoxwmw0" path="res://common/icons/cube-3d-sphere.svg" id="11_mb83y"]
|
||||
[ext_resource type="Environment" uid="uid://bxyp24f85p0xf" path="res://gui/game/assets/gui_3d_environment.tres" id="13_uyc6b"]
|
||||
[ext_resource type="Theme" uid="uid://bgcmd213j6gk1" path="res://gui/ressources/hud.tres" id="14_kb1t6"]
|
||||
[ext_resource type="Texture2D" uid="uid://dcgnamu7sb3ov" path="res://common/icons/bolt.svg" id="15_ijwr2"]
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_6hxtc"]
|
||||
viewport_path = NodePath("Particles/SubViewport")
|
||||
|
||||
[sub_resource type="Curve" id="Curve_brrmr"]
|
||||
_limits = [-200.0, 200.0, 0.0, 1.0]
|
||||
_data = [Vector2(0, -200), 0.0, 560.0, 0, 0, Vector2(0.08235294, 92.384125), 1336.3082, 1336.3082, 0, 0, Vector2(0.34901965, 200), 0.0, 0.0, 0, 0, Vector2(0.854902, -200), 0.0, 0.0, 0, 0]
|
||||
point_count = 4
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_0u75y"]
|
||||
offsets = PackedFloat32Array(0, 0.8689956, 0.98253274)
|
||||
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_u8fe7"]
|
||||
font = ExtResource("4_bw55c")
|
||||
font_size = 50
|
||||
font_color = Color(1, 0.6509804, 0.09019608, 1)
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_smt8b"]
|
||||
viewport_path = NodePath("AnnounceContainer/ObjectVisualiser/SubViewport")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xdybx"]
|
||||
script = ExtResource("8_duftv")
|
||||
title_text = "DESCRIPTION"
|
||||
title_icon = ExtResource("9_qlk3h")
|
||||
text = "TALION_OVERLOADER_DESC_TEXT"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_041ff"]
|
||||
script = ExtResource("7_tryv5")
|
||||
title = "TALION_OVERLOADER"
|
||||
subtitle = "ARTEFACT"
|
||||
important_stat_icon = ExtResource("11_mb83y")
|
||||
sections = Array[ExtResource("8_duftv")]([SubResource("Resource_xdybx")])
|
||||
|
||||
[sub_resource type="Animation" id="Animation_aao0q"]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("ArtefactAnnounce/AnnounceContainer:theme_override_constants/separation")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 1,
|
||||
"values": [4]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("ArtefactAnnounce/Particles: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, 1)]
|
||||
}
|
||||
tracks/2/type = "value"
|
||||
tracks/2/imported = false
|
||||
tracks/2/enabled = true
|
||||
tracks/2/path = NodePath("ArtefactAnnounce/AnnounceContainer:modulate")
|
||||
tracks/2/interp = 1
|
||||
tracks/2/loop_wrap = true
|
||||
tracks/2/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Color(1, 1, 1, 1)]
|
||||
}
|
||||
tracks/3/type = "value"
|
||||
tracks/3/imported = false
|
||||
tracks/3/enabled = true
|
||||
tracks/3/path = NodePath("ArtefactAnnounce/MarginContainer/BackgroundRect:modulate:a")
|
||||
tracks/3/interp = 1
|
||||
tracks/3/loop_wrap = true
|
||||
tracks/3/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 1,
|
||||
"values": [1.0]
|
||||
}
|
||||
tracks/4/type = "value"
|
||||
tracks/4/imported = false
|
||||
tracks/4/enabled = true
|
||||
tracks/4/path = NodePath("ArtefactAnnounce:visible")
|
||||
tracks/4/interp = 1
|
||||
tracks/4/loop_wrap = true
|
||||
tracks/4/keys = {
|
||||
"times": PackedFloat32Array(0.03333333),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 1,
|
||||
"values": [false]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_b6hac"]
|
||||
resource_name = "appear"
|
||||
length = 0.8
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("ArtefactAnnounce/AnnounceContainer:theme_override_constants/separation")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0.23333333, 0.8),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [480, 4]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("ArtefactAnnounce/Particles:modulate")
|
||||
tracks/1/interp = 2
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"times": PackedFloat32Array(0.5, 0.8),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
|
||||
}
|
||||
tracks/2/type = "value"
|
||||
tracks/2/imported = false
|
||||
tracks/2/enabled = true
|
||||
tracks/2/path = NodePath("ArtefactAnnounce/AnnounceContainer:modulate")
|
||||
tracks/2/interp = 2
|
||||
tracks/2/loop_wrap = true
|
||||
tracks/2/keys = {
|
||||
"times": PackedFloat32Array(0.2, 0.8),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
|
||||
}
|
||||
tracks/3/type = "value"
|
||||
tracks/3/imported = false
|
||||
tracks/3/enabled = true
|
||||
tracks/3/path = NodePath("ArtefactAnnounce/MarginContainer/BackgroundRect:modulate:a")
|
||||
tracks/3/interp = 1
|
||||
tracks/3/loop_wrap = true
|
||||
tracks/3/keys = {
|
||||
"times": PackedFloat32Array(0.03333333, 0.8),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [0.0, 0.8]
|
||||
}
|
||||
tracks/4/type = "value"
|
||||
tracks/4/imported = false
|
||||
tracks/4/enabled = true
|
||||
tracks/4/path = NodePath("ArtefactAnnounce:visible")
|
||||
tracks/4/interp = 1
|
||||
tracks/4/loop_wrap = true
|
||||
tracks/4/keys = {
|
||||
"times": PackedFloat32Array(0, 0.16666667),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 1,
|
||||
"values": [false, true]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_1aa3a"]
|
||||
_data = {
|
||||
&"RESET": SubResource("Animation_aao0q"),
|
||||
&"appear": SubResource("Animation_b6hac")
|
||||
}
|
||||
|
||||
[node name="ArtefactAnnounce" type="CanvasLayer" unique_id=1447182082]
|
||||
visible = false
|
||||
script = ExtResource("1_2sroa")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="." unique_id=1853133518]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="BackgroundRect" type="ColorRect" parent="MarginContainer" unique_id=1594037653]
|
||||
layout_mode = 2
|
||||
color = Color(0.0352941, 0.0196078, 0.12549, 0.705882)
|
||||
|
||||
[node name="Particles" type="TextureRect" parent="." unique_id=1748571879]
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -500.0
|
||||
offset_top = -500.0
|
||||
offset_right = 500.0
|
||||
offset_bottom = 500.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
texture = SubResource("ViewportTexture_6hxtc")
|
||||
|
||||
[node name="SubViewport" type="SubViewport" parent="Particles" unique_id=1123249182]
|
||||
transparent_bg = true
|
||||
size = Vector2i(1000, 1000)
|
||||
|
||||
[node name="GPUParticles2D" type="CPUParticles2D" parent="Particles/SubViewport" unique_id=220592083]
|
||||
position = Vector2(500, 500)
|
||||
amount = 20
|
||||
texture = ExtResource("2_3vg7r")
|
||||
preprocess = 1.0
|
||||
spread = 180.0
|
||||
gravity = Vector2(0, 0)
|
||||
initial_velocity_min = 2.0
|
||||
initial_velocity_max = 2.0
|
||||
linear_accel_min = 5.0
|
||||
linear_accel_max = 5.0
|
||||
linear_accel_curve = SubResource("Curve_brrmr")
|
||||
color_ramp = SubResource("Gradient_0u75y")
|
||||
|
||||
[node name="AnnounceContainer" type="VBoxContainer" parent="." unique_id=645433045]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_top = -627.0
|
||||
offset_bottom = 627.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme_override_constants/separation = 4
|
||||
alignment = 1
|
||||
|
||||
[node name="AnnounceTitle" type="Label" parent="AnnounceContainer" unique_id=1768593559]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "NEW_ARTEFACT"
|
||||
label_settings = ExtResource("3_doutq")
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="AnnounceText" type="Label" parent="AnnounceContainer" unique_id=768724763]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "TALION_OVERLOADER"
|
||||
label_settings = SubResource("LabelSettings_u8fe7")
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="ObjectVisualiser" type="TextureRect" parent="AnnounceContainer" unique_id=1180983374]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
mouse_filter = 0
|
||||
texture = SubResource("ViewportTexture_smt8b")
|
||||
stretch_mode = 5
|
||||
script = ExtResource("5_5vr2f")
|
||||
info = SubResource("Resource_041ff")
|
||||
|
||||
[node name="SubViewport" type="SubViewport" parent="AnnounceContainer/ObjectVisualiser" unique_id=1795775056]
|
||||
own_world_3d = true
|
||||
transparent_bg = true
|
||||
size = Vector2i(300, 300)
|
||||
|
||||
[node name="AnnouceObject" type="Node3D" parent="AnnounceContainer/ObjectVisualiser/SubViewport" unique_id=1527573801]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(-0.47699222, 0, 0.878631, 0, 0.9995686, 0, -0.8787731, 0, -0.47690943, 0, 0, 0)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="AnnounceContainer/ObjectVisualiser/SubViewport" unique_id=173755338]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1)
|
||||
keep_aspect = 0
|
||||
current = true
|
||||
fov = 20.0
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="AnnounceContainer/ObjectVisualiser/SubViewport" unique_id=1135825303]
|
||||
environment = ExtResource("13_uyc6b")
|
||||
|
||||
[node name="OkButton" type="Button" parent="AnnounceContainer" unique_id=249785792]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
theme = ExtResource("14_kb1t6")
|
||||
text = "OK"
|
||||
icon = ExtResource("15_ijwr2")
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1913258839]
|
||||
unique_name_in_owner = true
|
||||
root_node = NodePath("../..")
|
||||
libraries/ = SubResource("AnimationLibrary_1aa3a")
|
||||
BIN
entities/interactable_3d/cristal/assets/cristal.blend
Normal file
68
entities/interactable_3d/cristal/assets/cristal.blend.import
Normal file
@@ -0,0 +1,68 @@
|
||||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://mwk845fx5ye2"
|
||||
path="res://.godot/imported/cristal.blend-5fdcaa76cec17f12715c1ff4a4caf324.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://entities/interactable_3d/cristal/assets/cristal.blend"
|
||||
dest_files=["res://.godot/imported/cristal.blend-5fdcaa76cec17f12715c1ff4a4caf324.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path=""
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={
|
||||
"materials": {
|
||||
"Cristal": {
|
||||
"use_external/enabled": true,
|
||||
"use_external/fallback_path": "res://common/assets/materials/cristal.tres",
|
||||
"use_external/path": "uid://di0m3uqgi3l08"
|
||||
}
|
||||
}
|
||||
}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
entities/interactable_3d/cristal/assets/cristal.blend1
Normal file
BIN
entities/interactable_3d/cristal/assets/cristal_crack.blend
Normal file
@@ -0,0 +1,68 @@
|
||||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://c7p114rvk26xw"
|
||||
path="res://.godot/imported/cristal_crack.blend-127c21c2b9bb4a6237729dd3a817aaf1.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://entities/interactable_3d/cristal/assets/cristal_crack.blend"
|
||||
dest_files=["res://.godot/imported/cristal_crack.blend-127c21c2b9bb4a6237729dd3a817aaf1.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path=""
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={
|
||||
"materials": {
|
||||
"Cristal": {
|
||||
"use_external/enabled": true,
|
||||
"use_external/fallback_path": "res://common/assets/materials/cristal.tres",
|
||||
"use_external/path": "uid://di0m3uqgi3l08"
|
||||
}
|
||||
}
|
||||
}
|
||||
blender/nodes/visible=0
|
||||
blender/nodes/active_collection_only=false
|
||||
blender/nodes/punctual_lights=true
|
||||
blender/nodes/cameras=true
|
||||
blender/nodes/custom_properties=true
|
||||
blender/nodes/modifiers=1
|
||||
blender/meshes/colors=false
|
||||
blender/meshes/uvs=true
|
||||
blender/meshes/normals=true
|
||||
blender/meshes/export_geometry_nodes_instances=false
|
||||
blender/meshes/gpu_instances=false
|
||||
blender/meshes/tangents=true
|
||||
blender/meshes/skins=2
|
||||
blender/meshes/export_bones_deforming_mesh_only=false
|
||||
blender/materials/unpack_enabled=true
|
||||
blender/materials/export_materials=1
|
||||
blender/animation/limit_playback=true
|
||||
blender/animation/always_sample=true
|
||||
blender/animation/group_tracks=true
|
||||
gltf/naming_version=2
|
||||
BIN
entities/interactable_3d/cristal/assets/cristal_crack_3.blend1
Normal file
BIN
entities/interactable_3d/cristal/cristal.blend1
Normal file
84
entities/interactable_3d/cristal/cristal.tscn
Normal file
@@ -0,0 +1,84 @@
|
||||
[gd_scene format=3 uid="uid://8rorj31s3irn"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dwn3g8c5sa0a2" path="res://entities/interactable_3d/cristal/scripts/cristal.gd" id="1_ci2hw"]
|
||||
[ext_resource type="AudioStream" uid="uid://3c4nxjasebyk" path="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_1_reverb.wav" id="2_3rrt0"]
|
||||
[ext_resource type="PackedScene" uid="uid://mwk845fx5ye2" path="res://entities/interactable_3d/cristal/assets/cristal.blend" id="2_ci2hw"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7p114rvk26xw" path="res://entities/interactable_3d/cristal/assets/cristal_crack.blend" id="2_vejte"]
|
||||
[ext_resource type="AudioStream" uid="uid://bs5ldhabymm5p" path="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_2_reverb.wav" id="3_247i2"]
|
||||
[ext_resource type="AudioStream" uid="uid://bu278eqn8krnb" path="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_3_reverb.wav" id="4_k7wsc"]
|
||||
[ext_resource type="PackedScene" uid="uid://bhbc1monbgumh" path="res://entities/interactable_3d/cristal/artefact_announce.tscn" id="8_3rrt0"]
|
||||
[ext_resource type="PackedScene" uid="uid://brp1fpvasaims" path="res://entities/interactable_3d/cristal/mutation_announce.tscn" id="9_247i2"]
|
||||
|
||||
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_ojmpp"]
|
||||
streams_count = 3
|
||||
stream_0/stream = ExtResource("2_3rrt0")
|
||||
stream_1/stream = ExtResource("3_247i2")
|
||||
stream_2/stream = ExtResource("4_k7wsc")
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ci2hw"]
|
||||
transparency = 1
|
||||
shading_mode = 0
|
||||
vertex_color_use_as_albedo = true
|
||||
|
||||
[sub_resource type="PrismMesh" id="PrismMesh_nvfy2"]
|
||||
lightmap_size_hint = Vector2i(14, 21)
|
||||
material = SubResource("StandardMaterial3D_ci2hw")
|
||||
size = Vector3(0.2, 0.2, 0.2)
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_ci2hw"]
|
||||
offsets = PackedFloat32Array(0, 0.80349344, 1)
|
||||
colors = PackedColorArray(1, 0.6509804, 0.09019608, 1, 1, 0.1764706, 0.3372549, 0.827451, 1, 0, 0.43137255, 0)
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_nvfy2"]
|
||||
size = Vector3(1, 2.0454712, 1)
|
||||
|
||||
[node name="Cristal" type="Area3D" unique_id=1403604311]
|
||||
script = ExtResource("1_ci2hw")
|
||||
metadata/_custom_type_script = "uid://bj4d1x8n8ina"
|
||||
|
||||
[node name="BreackAudioPlayer" type="AudioStreamPlayer3D" parent="." unique_id=1190729820]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0430325, 0)
|
||||
stream = SubResource("AudioStreamRandomizer_ojmpp")
|
||||
|
||||
[node name="BreakParticles" type="CPUParticles3D" parent="." unique_id=1968257379]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0430325, 0)
|
||||
emitting = false
|
||||
amount = 16
|
||||
lifetime = 0.5
|
||||
one_shot = true
|
||||
speed_scale = 1.5
|
||||
explosiveness = 1.0
|
||||
mesh = SubResource("PrismMesh_nvfy2")
|
||||
particle_flag_rotate_y = true
|
||||
direction = Vector3(0, 1, 0)
|
||||
initial_velocity_min = 1.0
|
||||
initial_velocity_max = 4.0
|
||||
angular_velocity_min = -90.0
|
||||
angular_velocity_max = -90.0
|
||||
angle_min = -180.0
|
||||
angle_max = 180.0
|
||||
scale_amount_min = 0.5
|
||||
color = Color(1, 0.6509804, 0.09019608, 1)
|
||||
color_ramp = SubResource("Gradient_ci2hw")
|
||||
|
||||
[node name="CristalModel" parent="." unique_id=886555966 instance=ExtResource("2_ci2hw")]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="CristalModelCrack" parent="." unique_id=26298259 instance=ExtResource("2_vejte")]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0051152706, 0.006559938, -0.011411905)
|
||||
visible = false
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1235599731]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9791151, 0)
|
||||
shape = SubResource("BoxShape3D_nvfy2")
|
||||
|
||||
[node name="MutationAnnounce" parent="." unique_id=1447182082 instance=ExtResource("9_247i2")]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="ArtefactAnnounce" parent="." unique_id=114641656 instance=ExtResource("8_3rrt0")]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[editable path="CristalModelCrack"]
|
||||
BIN
entities/interactable_3d/cristal/cristal_crack_1.blend1
Normal file
BIN
entities/interactable_3d/cristal/cristal_crack_2.blend1
Normal file
BIN
entities/interactable_3d/cristal/cristal_crack_3.blend1
Normal file
315
entities/interactable_3d/cristal/mutation_announce.tscn
Normal file
@@ -0,0 +1,315 @@
|
||||
[gd_scene format=3 uid="uid://brp1fpvasaims"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c0tyivmiouctw" path="res://entities/interactable_3d/cristal/scripts/mutation_announce.gd" id="1_02o74"]
|
||||
[ext_resource type="Texture2D" uid="uid://bi5jo6pf0acjb" path="res://common/icons/carambola.svg" id="2_vlom2"]
|
||||
[ext_resource type="LabelSettings" uid="uid://dqwayi8yjwau2" path="res://gui/ressources/title_label_settings.tres" id="3_5hs4t"]
|
||||
[ext_resource type="FontFile" uid="uid://qt80w6o01q5s" path="res://gui/ressources/fonts/TitanOne-Regular.ttf" id="4_yg5wk"]
|
||||
[ext_resource type="Script" uid="uid://bqisp5hjs06rj" path="res://gui/game/announce/scripts/announce_inspectable.gd" id="5_qu1xy"]
|
||||
[ext_resource type="Texture2D" uid="uid://0hbdgalf04e" path="res://common/icons/wood.svg" id="6_n403s"]
|
||||
[ext_resource type="Script" uid="uid://dj2pv1hiwjfv0" path="res://gui/game/card/scripts/card_info.gd" id="7_se4h4"]
|
||||
[ext_resource type="Script" uid="uid://dgbh38j13g5kn" path="res://gui/game/card/scripts/card_section_info.gd" id="8_0osya"]
|
||||
[ext_resource type="Texture2D" uid="uid://dth2mj0nh2q70" path="res://common/icons/align-right.svg" id="9_s5jxo"]
|
||||
[ext_resource type="Script" uid="uid://b4tkium34c831" path="res://gui/game/card/scripts/card_stat_info.gd" id="10_qidgp"]
|
||||
[ext_resource type="Texture2D" uid="uid://bsvxhafoxwmw0" path="res://common/icons/cube-3d-sphere.svg" id="11_uj15c"]
|
||||
[ext_resource type="PackedScene" uid="uid://mwk845fx5ye2" path="res://entities/interactable_3d/cristal/assets/cristal.blend" id="12_wy2oe"]
|
||||
[ext_resource type="Environment" uid="uid://bxyp24f85p0xf" path="res://gui/game/assets/gui_3d_environment.tres" id="13_kyl1n"]
|
||||
[ext_resource type="Theme" uid="uid://bgcmd213j6gk1" path="res://gui/ressources/hud.tres" id="14_d2gpy"]
|
||||
[ext_resource type="Texture2D" uid="uid://dcgnamu7sb3ov" path="res://common/icons/bolt.svg" id="15_hu5cq"]
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_6hxtc"]
|
||||
viewport_path = NodePath("Particles/SubViewport")
|
||||
|
||||
[sub_resource type="Curve" id="Curve_brrmr"]
|
||||
_limits = [-200.0, 200.0, 0.0, 1.0]
|
||||
_data = [Vector2(0, -200), 0.0, 560.0, 0, 0, Vector2(0.08235294, 92.384125), 1336.3082, 1336.3082, 0, 0, Vector2(0.34901965, 200), 0.0, 0.0, 0, 0, Vector2(0.854902, -200), 0.0, 0.0, 0, 0]
|
||||
point_count = 4
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_0u75y"]
|
||||
offsets = PackedFloat32Array(0, 0.8689956, 0.98253274)
|
||||
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_u8fe7"]
|
||||
font = ExtResource("4_yg5wk")
|
||||
font_size = 50
|
||||
font_color = Color(1, 0.6509804, 0.09019608, 1)
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_smt8b"]
|
||||
viewport_path = NodePath("AnnounceContainer/ObjectVisualiser/SubViewport")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_rjaqi"]
|
||||
script = ExtResource("8_0osya")
|
||||
title_text = "Description"
|
||||
title_icon = ExtResource("9_s5jxo")
|
||||
text = "Une fois mature, ajoute [b]1[/b][img=22x22]res://common/icons/growth.svg[/img] tous les [b]3[/b][img=22x22]res://common/icons/calendar-week.svg[/img]"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_kgj7d"]
|
||||
script = ExtResource("7_se4h4")
|
||||
title = "Ancien"
|
||||
subtitle = "Mutation"
|
||||
important_stat_icon = ExtResource("6_n403s")
|
||||
sections = Array[ExtResource("8_0osya")]([SubResource("Resource_rjaqi")])
|
||||
|
||||
[sub_resource type="Animation" id="Animation_aao0q"]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("MutationAnnounce/AnnounceContainer:theme_override_constants/separation")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 1,
|
||||
"values": [4]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("MutationAnnounce/Particles: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, 1)]
|
||||
}
|
||||
tracks/2/type = "value"
|
||||
tracks/2/imported = false
|
||||
tracks/2/enabled = true
|
||||
tracks/2/path = NodePath("MutationAnnounce/AnnounceContainer:modulate")
|
||||
tracks/2/interp = 1
|
||||
tracks/2/loop_wrap = true
|
||||
tracks/2/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Color(1, 1, 1, 1)]
|
||||
}
|
||||
tracks/3/type = "value"
|
||||
tracks/3/imported = false
|
||||
tracks/3/enabled = true
|
||||
tracks/3/path = NodePath("MutationAnnounce/MarginContainer/BackgroundRect:modulate:a")
|
||||
tracks/3/interp = 1
|
||||
tracks/3/loop_wrap = true
|
||||
tracks/3/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 1,
|
||||
"values": [1.0]
|
||||
}
|
||||
tracks/4/type = "value"
|
||||
tracks/4/imported = false
|
||||
tracks/4/enabled = true
|
||||
tracks/4/path = NodePath("MutationAnnounce:visible")
|
||||
tracks/4/interp = 1
|
||||
tracks/4/loop_wrap = true
|
||||
tracks/4/keys = {
|
||||
"times": PackedFloat32Array(0.03333333),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 1,
|
||||
"values": [false]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_b6hac"]
|
||||
resource_name = "appear"
|
||||
length = 0.8
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("MutationAnnounce/AnnounceContainer:theme_override_constants/separation")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0.23333333, 0.8),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [480, 4]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("MutationAnnounce/Particles:modulate")
|
||||
tracks/1/interp = 2
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"times": PackedFloat32Array(0.5, 0.8),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
|
||||
}
|
||||
tracks/2/type = "value"
|
||||
tracks/2/imported = false
|
||||
tracks/2/enabled = true
|
||||
tracks/2/path = NodePath("MutationAnnounce/AnnounceContainer:modulate")
|
||||
tracks/2/interp = 2
|
||||
tracks/2/loop_wrap = true
|
||||
tracks/2/keys = {
|
||||
"times": PackedFloat32Array(0.2, 0.8),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
|
||||
}
|
||||
tracks/3/type = "value"
|
||||
tracks/3/imported = false
|
||||
tracks/3/enabled = true
|
||||
tracks/3/path = NodePath("MutationAnnounce/MarginContainer/BackgroundRect:modulate:a")
|
||||
tracks/3/interp = 1
|
||||
tracks/3/loop_wrap = true
|
||||
tracks/3/keys = {
|
||||
"times": PackedFloat32Array(0.03333333, 0.8),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [0.0, 0.8]
|
||||
}
|
||||
tracks/4/type = "value"
|
||||
tracks/4/imported = false
|
||||
tracks/4/enabled = true
|
||||
tracks/4/path = NodePath("MutationAnnounce:visible")
|
||||
tracks/4/interp = 1
|
||||
tracks/4/loop_wrap = true
|
||||
tracks/4/keys = {
|
||||
"times": PackedFloat32Array(0, 0.16666667),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 1,
|
||||
"values": [false, true]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_1aa3a"]
|
||||
_data = {
|
||||
&"RESET": SubResource("Animation_aao0q"),
|
||||
&"appear": SubResource("Animation_b6hac")
|
||||
}
|
||||
|
||||
[node name="MutationAnnounce" type="CanvasLayer" unique_id=1447182082]
|
||||
visible = false
|
||||
script = ExtResource("1_02o74")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="." unique_id=1853133518]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="BackgroundRect" type="ColorRect" parent="MarginContainer" unique_id=1594037653]
|
||||
layout_mode = 2
|
||||
color = Color(0.0352941, 0.0196078, 0.12549, 0.705882)
|
||||
|
||||
[node name="Particles" type="TextureRect" parent="." unique_id=1748571879]
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -500.0
|
||||
offset_top = -500.0
|
||||
offset_right = 500.0
|
||||
offset_bottom = 500.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
texture = SubResource("ViewportTexture_6hxtc")
|
||||
|
||||
[node name="SubViewport" type="SubViewport" parent="Particles" unique_id=1123249182]
|
||||
transparent_bg = true
|
||||
size = Vector2i(1000, 1000)
|
||||
|
||||
[node name="GPUParticles2D" type="CPUParticles2D" parent="Particles/SubViewport" unique_id=220592083]
|
||||
position = Vector2(500, 500)
|
||||
amount = 20
|
||||
texture = ExtResource("2_vlom2")
|
||||
preprocess = 1.0
|
||||
spread = 180.0
|
||||
gravity = Vector2(0, 0)
|
||||
initial_velocity_min = 2.0
|
||||
initial_velocity_max = 2.0
|
||||
linear_accel_min = 5.0
|
||||
linear_accel_max = 5.0
|
||||
linear_accel_curve = SubResource("Curve_brrmr")
|
||||
color_ramp = SubResource("Gradient_0u75y")
|
||||
|
||||
[node name="AnnounceContainer" type="VBoxContainer" parent="." unique_id=645433045]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_top = -627.0
|
||||
offset_bottom = 627.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme_override_constants/separation = 4
|
||||
alignment = 1
|
||||
|
||||
[node name="AnnounceTitle" type="Label" parent="AnnounceContainer" unique_id=1768593559]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "NEW_MUTATION"
|
||||
label_settings = ExtResource("3_5hs4t")
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="AnnounceText" type="Label" parent="AnnounceContainer" unique_id=768724763]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Ancien"
|
||||
label_settings = SubResource("LabelSettings_u8fe7")
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="ObjectVisualiser" type="TextureRect" parent="AnnounceContainer" unique_id=1180983374]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
mouse_filter = 0
|
||||
texture = SubResource("ViewportTexture_smt8b")
|
||||
stretch_mode = 5
|
||||
script = ExtResource("5_qu1xy")
|
||||
info = SubResource("Resource_kgj7d")
|
||||
|
||||
[node name="MutationIconTextureRect" type="TextureRect" parent="AnnounceContainer/ObjectVisualiser" unique_id=312214951]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -20.0
|
||||
offset_top = -20.0
|
||||
offset_right = 20.0
|
||||
offset_bottom = 20.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
texture = ExtResource("6_n403s")
|
||||
|
||||
[node name="SubViewport" type="SubViewport" parent="AnnounceContainer/ObjectVisualiser" unique_id=1795775056]
|
||||
own_world_3d = true
|
||||
transparent_bg = true
|
||||
size = Vector2i(300, 300)
|
||||
|
||||
[node name="AnnouceObject" type="Node3D" parent="AnnounceContainer/ObjectVisualiser/SubViewport" unique_id=1527573801]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(0.9998366, 0, 0, 0, 0.9995686, 0, 0, 0, 0.9996744, 0, 0, 0)
|
||||
|
||||
[node name="cristal" parent="AnnounceContainer/ObjectVisualiser/SubViewport/AnnouceObject" unique_id=1362490576 instance=ExtResource("12_wy2oe")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="AnnounceContainer/ObjectVisualiser/SubViewport" unique_id=173755338]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10)
|
||||
keep_aspect = 0
|
||||
current = true
|
||||
fov = 20.0
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="AnnounceContainer/ObjectVisualiser/SubViewport" unique_id=1135825303]
|
||||
environment = ExtResource("13_kyl1n")
|
||||
|
||||
[node name="OkButton" type="Button" parent="AnnounceContainer" unique_id=249785792]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
theme = ExtResource("14_d2gpy")
|
||||
text = "OK"
|
||||
icon = ExtResource("15_hu5cq")
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1913258839]
|
||||
unique_name_in_owner = true
|
||||
root_node = NodePath("../..")
|
||||
libraries/ = SubResource("AnimationLibrary_1aa3a")
|
||||
@@ -0,0 +1,85 @@
|
||||
@tool
|
||||
extends CanvasLayer
|
||||
class_name ArtefactAnnounce
|
||||
|
||||
const DEFAULT_OBJECT_ACCELERATION = Vector2(3,0)
|
||||
|
||||
@export var announce_artefact : Artefact = null : set = set_announce_artefact
|
||||
|
||||
@export_tool_button("Update", "Callable") var update_action = set_announce_artefact
|
||||
|
||||
var object_acceleration := Vector2(0,0)
|
||||
|
||||
var rotating := false
|
||||
|
||||
var prev_mouse_pos : Vector2
|
||||
var next_mouse_pos : Vector2
|
||||
|
||||
const YELLOW_COLOR = Color("e29f32")
|
||||
const RED_COLOR = Color("f20058")
|
||||
|
||||
func _ready():
|
||||
set_announce_artefact()
|
||||
%OkButton.button_down.connect(_on_ok_button_down)
|
||||
hide()
|
||||
|
||||
func _process(delta):
|
||||
update_rotation(delta)
|
||||
|
||||
func update_rotation(delta):
|
||||
if visible:
|
||||
next_mouse_pos = get_viewport().get_mouse_position()
|
||||
if Input.is_action_just_pressed("action"):
|
||||
rotating = true
|
||||
prev_mouse_pos = get_viewport().get_mouse_position()
|
||||
if Input.is_action_just_released("action"):
|
||||
rotating = false
|
||||
object_acceleration = Vector2(
|
||||
float(next_mouse_pos.x - prev_mouse_pos.x),
|
||||
float(next_mouse_pos.y - prev_mouse_pos.y)
|
||||
)
|
||||
|
||||
var object_rotation = object_acceleration
|
||||
|
||||
if rotating:
|
||||
object_rotation = Vector2(
|
||||
float(next_mouse_pos.x - prev_mouse_pos.x),
|
||||
float(next_mouse_pos.y - prev_mouse_pos.y)
|
||||
)
|
||||
prev_mouse_pos = next_mouse_pos
|
||||
else :
|
||||
object_acceleration = object_acceleration.lerp(DEFAULT_OBJECT_ACCELERATION, 0.1)
|
||||
|
||||
%AnnouceObject.rotate(Vector3.UP, object_rotation.x * delta)
|
||||
%AnnouceObject.rotate(Vector3.RIGHT, object_rotation.y * delta)
|
||||
|
||||
|
||||
func set_announce_artefact(artefact := announce_artefact):
|
||||
|
||||
for c in %AnnouceObject.get_children():
|
||||
c.queue_free()
|
||||
|
||||
if is_node_ready() and artefact:
|
||||
|
||||
%AnnounceTitle.text = "NEW_ARTEFACT"
|
||||
%AnnounceText.text = artefact.get_artefact_name()
|
||||
%ObjectVisualiser.info = artefact.card_info()
|
||||
|
||||
%AnnouceObject.add_child(
|
||||
artefact.get_3d_scene().instantiate()
|
||||
)
|
||||
|
||||
if not visible:
|
||||
%AnimationPlayer.play("appear")
|
||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||
AudioManager.play_sfx("Reveal")
|
||||
elif artefact == null and visible:
|
||||
%AnimationPlayer.play_backwards("appear")
|
||||
|
||||
if not Engine.is_editor_hint():
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
|
||||
announce_artefact = artefact
|
||||
|
||||
func _on_ok_button_down():
|
||||
announce_artefact = null
|
||||
@@ -0,0 +1 @@
|
||||
uid://xamd5y6tig71
|
||||
54
entities/interactable_3d/cristal/scripts/cristal.gd
Normal file
@@ -0,0 +1,54 @@
|
||||
extends Interactable3D
|
||||
|
||||
const MAX_BREAK_LEVEL = 2
|
||||
|
||||
signal broken
|
||||
|
||||
@export var break_level = 0
|
||||
|
||||
func _ready():
|
||||
update_model()
|
||||
|
||||
func click():
|
||||
if interactable:
|
||||
clicked.emit()
|
||||
%BreackAudioPlayer.playing = true
|
||||
%BreakParticles.emitting = true
|
||||
|
||||
break_level += 1
|
||||
if break_level == MAX_BREAK_LEVEL:
|
||||
broken.emit()
|
||||
interactable = false
|
||||
unlock_mutation()
|
||||
|
||||
update_model()
|
||||
|
||||
|
||||
func update_model():
|
||||
if is_node_ready():
|
||||
%CristalModel.visible = break_level == 0
|
||||
%CristalModelCrack.visible = break_level > 0
|
||||
|
||||
if break_level > 1:
|
||||
%CristalModelCrack.find_children("AnimationPlayer")[0].play("Break")
|
||||
|
||||
func unlock_mutation():
|
||||
var progression = GameInfo.game_data.progression_data
|
||||
|
||||
if progression.mutations_unlocked < len(progression.get_all_mutations()):
|
||||
var new_mutation : PlantMutation = progression.get_all_mutations()[progression.mutations_unlocked]
|
||||
progression.mutations_unlocked += 1
|
||||
|
||||
get_tree().create_timer(1.).timeout.connect(
|
||||
func (): %MutationAnnounce.announce_mutation = new_mutation
|
||||
);
|
||||
else:
|
||||
var talion_relay = TalionRelayArtifact.new()
|
||||
|
||||
if GameInfo.game_data and GameInfo.game_data.current_region_data and GameInfo.game_data.current_run:
|
||||
GameInfo.game_data.current_run.add_artefacts(talion_relay)
|
||||
|
||||
get_tree().create_timer(1.).timeout.connect(
|
||||
func (): %ArtefactAnnounce.announce_artefact = talion_relay
|
||||
);
|
||||
|
||||
1
entities/interactable_3d/cristal/scripts/cristal.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dwn3g8c5sa0a2
|
||||
@@ -0,0 +1,80 @@
|
||||
@tool
|
||||
extends CanvasLayer
|
||||
class_name MutationAnnounce
|
||||
|
||||
const DEFAULT_OBJECT_ACCELERATION = Vector2(3,0)
|
||||
|
||||
@export var announce_mutation : PlantMutation = null : set = set_announce_mutation
|
||||
|
||||
@export_tool_button("Update", "Callable") var update_action = set_announce_mutation
|
||||
|
||||
var announce_objects : Array[AnnouceObject] = []
|
||||
|
||||
var object_acceleration := Vector2(0,0)
|
||||
|
||||
var rotating := false
|
||||
|
||||
var prev_mouse_pos : Vector2
|
||||
var next_mouse_pos : Vector2
|
||||
|
||||
const YELLOW_COLOR = Color("e29f32")
|
||||
const RED_COLOR = Color("f20058")
|
||||
|
||||
func _ready():
|
||||
set_announce_mutation()
|
||||
%OkButton.button_down.connect(_on_ok_button_down)
|
||||
hide()
|
||||
|
||||
func _process(delta):
|
||||
update_rotation(delta)
|
||||
|
||||
func update_rotation(delta):
|
||||
if visible:
|
||||
next_mouse_pos = get_viewport().get_mouse_position()
|
||||
if Input.is_action_just_pressed("action"):
|
||||
rotating = true
|
||||
prev_mouse_pos = get_viewport().get_mouse_position()
|
||||
if Input.is_action_just_released("action"):
|
||||
rotating = false
|
||||
object_acceleration = Vector2(
|
||||
float(next_mouse_pos.x - prev_mouse_pos.x),
|
||||
float(next_mouse_pos.y - prev_mouse_pos.y)
|
||||
)
|
||||
|
||||
var object_rotation = object_acceleration
|
||||
|
||||
if rotating:
|
||||
object_rotation = Vector2(
|
||||
float(next_mouse_pos.x - prev_mouse_pos.x),
|
||||
float(next_mouse_pos.y - prev_mouse_pos.y)
|
||||
)
|
||||
prev_mouse_pos = next_mouse_pos
|
||||
else :
|
||||
object_acceleration = object_acceleration.lerp(DEFAULT_OBJECT_ACCELERATION, 0.1)
|
||||
|
||||
%AnnouceObject.rotate(Vector3.UP, object_rotation.x * delta)
|
||||
%AnnouceObject.rotate(Vector3.RIGHT, object_rotation.y * delta)
|
||||
|
||||
|
||||
func set_announce_mutation(mutation := announce_mutation):
|
||||
|
||||
if is_node_ready() and mutation:
|
||||
|
||||
%AnnounceTitle.text = "NEW_MUTATION"
|
||||
%AnnounceText.text = mutation.get_mutation_name()
|
||||
%MutationIconTextureRect.texture = mutation.get_icon()
|
||||
%ObjectVisualiser.info = mutation.card_info()
|
||||
|
||||
if not visible:
|
||||
%AnimationPlayer.play("appear")
|
||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||
AudioManager.play_sfx("Reveal")
|
||||
elif mutation == null and visible:
|
||||
%AnimationPlayer.play_backwards("appear")
|
||||
|
||||
if not Engine.is_editor_hint():
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
announce_mutation = mutation
|
||||
|
||||
func _on_ok_button_down():
|
||||
announce_mutation = null
|
||||
@@ -0,0 +1 @@
|
||||
uid://c0tyivmiouctw
|
||||
@@ -14,6 +14,7 @@ func can_interact(_p : Player) -> bool:
|
||||
region != null
|
||||
and region.data
|
||||
and region.data.charges > 0
|
||||
and region.data.state == RegionData.State.IN_PROGRESS
|
||||
)
|
||||
|
||||
func interact(_p: Player) -> bool:
|
||||
|
||||
@@ -7,14 +7,18 @@
|
||||
[ext_resource type="Texture2D" uid="uid://bhi3mwl23flwp" path="res://entities/interactables/truck/recharge/STW_Props_Batterie_Glass_V2.png" id="5_2okh4"]
|
||||
[ext_resource type="Texture2D" uid="uid://c01f6ja6btsep" path="res://entities/interactables/truck/recharge/STW_Props_Batterie_TERRE.png" id="6_2okh4"]
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_bjhct"]
|
||||
radius = 38.45475
|
||||
height = 76.9095
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_1vpbi"]
|
||||
font = ExtResource("4_ot7vv")
|
||||
font_size = 30
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_ot7vv"]
|
||||
radius = 43.0
|
||||
height = 116.0
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_bjhct"]
|
||||
radius = 38.45475
|
||||
height = 76.9095
|
||||
|
||||
[node name="TruckRecharge" type="Area2D" unique_id=1099196706]
|
||||
script = ExtResource("1_ipgcv")
|
||||
default_interact_text = "RECHARGE"
|
||||
@@ -22,10 +26,6 @@ default_info_title = "RECHARGE_STATION"
|
||||
default_info_desc = "RECHARGE_STATION_DESC_TEXT"
|
||||
metadata/_custom_type_script = "uid://dyprcd68fjstf"
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=2014886648]
|
||||
position = Vector2(9, -53)
|
||||
shape = SubResource("CapsuleShape2D_bjhct")
|
||||
|
||||
[node name="RechargeStation" type="Sprite2D" parent="." unique_id=1801951226]
|
||||
scale = Vector2(0.5, 0.5)
|
||||
texture = ExtResource("2_ot7vv")
|
||||
@@ -67,6 +67,10 @@ scale = Vector2(0.5, 0.5)
|
||||
texture = ExtResource("6_2okh4")
|
||||
offset = Vector2(0, -120)
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=2014886648]
|
||||
position = Vector2(12, -54)
|
||||
shape = SubResource("CapsuleShape2D_ot7vv")
|
||||
|
||||
[node name="StaticBody2D" type="StaticBody2D" parent="." unique_id=1324035615]
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="StaticBody2D" unique_id=842130596]
|
||||
|
||||
|
After Width: | Height: | Size: 478 KiB |
@@ -0,0 +1,40 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dslagvhodlepi"
|
||||
path="res://.godot/imported/asset_cristals.png-fbcde6581d88986094aa97c2145c31c2.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://entities/interactables/win_cristal/assets/sprites/asset_cristals.png"
|
||||
dest_files=["res://.godot/imported/asset_cristals.png-fbcde6581d88986094aa97c2145c31c2.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
|
||||
31
entities/interactables/win_cristal/scripts/win_cristal.gd
Normal file
@@ -0,0 +1,31 @@
|
||||
@tool
|
||||
extends InspectableEntity
|
||||
class_name WinCristal
|
||||
|
||||
@export_tool_button("Update", "Callable") var update_action = update
|
||||
@export_tool_button("Spawn Anim", "Callable") var spawn_action = spawn_animation
|
||||
@export var data : WinCristalData = WinCristalData.random() :
|
||||
set(v):
|
||||
data = v
|
||||
update()
|
||||
|
||||
func _ready():
|
||||
update()
|
||||
|
||||
func update():
|
||||
if is_node_ready() and data:
|
||||
for i in range(len(%Sprites.get_children())):
|
||||
%Sprites.get_children()[i].visible = data.cristal_type == i
|
||||
%Sprites.get_children()[i].flip_h = data.cristal_flip
|
||||
|
||||
func spawn_animation():
|
||||
scale = Vector2.ZERO
|
||||
%CristalPlayer.play()
|
||||
get_tree().create_tween().tween_property(self, "scale", Vector2.ONE, 0.3).set_trans(Tween.TRANS_BOUNCE)
|
||||
|
||||
func get_card_up_padding() -> float:
|
||||
return Pointer.CARD_UP_PADDING * 2
|
||||
|
||||
func save() -> EntityData:
|
||||
data.position = global_position
|
||||
return data
|
||||
@@ -0,0 +1 @@
|
||||
uid://cismap3cn5e36
|
||||
@@ -0,0 +1,22 @@
|
||||
extends EntityData
|
||||
class_name WinCristalData
|
||||
|
||||
const WIN_CRISTAL_SCENE = preload("res://entities/interactables/win_cristal/win_cristal.tscn")
|
||||
|
||||
@export var cristal_type : int
|
||||
@export var cristal_flip : bool
|
||||
|
||||
func load_entity() -> Entity:
|
||||
var win_cristal := WIN_CRISTAL_SCENE.instantiate() as WinCristal
|
||||
|
||||
win_cristal.data = self
|
||||
|
||||
return win_cristal
|
||||
|
||||
static func random() -> WinCristalData:
|
||||
var data = WinCristalData.new()
|
||||
|
||||
data.cristal_type = randi_range(0,3)
|
||||
data.cristal_flip = randi() % 2 == 0
|
||||
|
||||
return data
|
||||
@@ -0,0 +1 @@
|
||||
uid://cos0ennmyfvc2
|
||||
82
entities/interactables/win_cristal/win_cristal.tscn
Normal file
@@ -0,0 +1,82 @@
|
||||
[gd_scene format=3 uid="uid://de5pt5vyu23fb"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cismap3cn5e36" path="res://entities/interactables/win_cristal/scripts/win_cristal.gd" id="1_yb2ta"]
|
||||
[ext_resource type="Script" uid="uid://cos0ennmyfvc2" path="res://entities/interactables/win_cristal/scripts/win_cristal_data.gd" id="2_vkbio"]
|
||||
[ext_resource type="Texture2D" uid="uid://dslagvhodlepi" path="res://entities/interactables/win_cristal/assets/sprites/asset_cristals.png" id="2_yb2ta"]
|
||||
[ext_resource type="AudioStream" uid="uid://dnqq2sy3dxrb2" path="res://common/audio_manager/assets/sfx/cristal/freesound_community-wine-glass-clink-36036.mp3" id="3_vkbio"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5lni1"]
|
||||
script = ExtResource("2_vkbio")
|
||||
cristal_type = 2
|
||||
cristal_flip = true
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_vkbio"]
|
||||
radius = 40.0
|
||||
height = 116.0
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_5lni1"]
|
||||
atlas = ExtResource("2_yb2ta")
|
||||
region = Rect2(52, 55, 305, 347)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_bcx38"]
|
||||
atlas = ExtResource("2_yb2ta")
|
||||
region = Rect2(378, 21, 199, 385)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_t34j2"]
|
||||
atlas = ExtResource("2_yb2ta")
|
||||
region = Rect2(75, 527, 316, 399)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_55qjo"]
|
||||
atlas = ExtResource("2_yb2ta")
|
||||
region = Rect2(462, 542, 286, 387)
|
||||
|
||||
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_tfnwb"]
|
||||
random_pitch = 1.4142135
|
||||
streams_count = 1
|
||||
stream_0/stream = ExtResource("3_vkbio")
|
||||
|
||||
[node name="WinCristal" type="Area2D" unique_id=247353676]
|
||||
script = ExtResource("1_yb2ta")
|
||||
data = SubResource("Resource_5lni1")
|
||||
default_info_title = "TALION_CRISTAL"
|
||||
default_info_desc = "TALION_CRISTAL_DESC_TEXT"
|
||||
metadata/_custom_type_script = "uid://d3bk52402ylvl"
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=187731103]
|
||||
position = Vector2(1, -42)
|
||||
shape = SubResource("CapsuleShape2D_vkbio")
|
||||
|
||||
[node name="Sprites" type="Node2D" parent="." unique_id=940993390]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="AssetCristals" type="Sprite2D" parent="Sprites" unique_id=2111863528]
|
||||
scale = Vector2(0.4, 0.4)
|
||||
texture = SubResource("AtlasTexture_5lni1")
|
||||
offset = Vector2(0, -139.255)
|
||||
flip_h = true
|
||||
|
||||
[node name="AssetCristals2" type="Sprite2D" parent="Sprites" unique_id=1380362341]
|
||||
visible = false
|
||||
scale = Vector2(0.3, 0.3)
|
||||
texture = SubResource("AtlasTexture_bcx38")
|
||||
offset = Vector2(0, -149)
|
||||
flip_h = true
|
||||
|
||||
[node name="AssetCristals3" type="Sprite2D" parent="Sprites" unique_id=2082980627]
|
||||
visible = false
|
||||
scale = Vector2(0.3, 0.3)
|
||||
texture = SubResource("AtlasTexture_t34j2")
|
||||
offset = Vector2(0, -150)
|
||||
flip_h = true
|
||||
|
||||
[node name="AssetCristals4" type="Sprite2D" parent="Sprites" unique_id=495215885]
|
||||
visible = false
|
||||
scale = Vector2(0.3, 0.3)
|
||||
texture = SubResource("AtlasTexture_55qjo")
|
||||
offset = Vector2(0, -150)
|
||||
flip_h = true
|
||||
|
||||
[node name="CristalPlayer" type="AudioStreamPlayer2D" parent="." unique_id=1879646229]
|
||||
unique_name_in_owner = true
|
||||
stream = SubResource("AudioStreamRandomizer_tfnwb")
|
||||
bus = &"Sfx"
|
||||
@@ -13,6 +13,7 @@ atlas = ExtResource("3_j6jm5")
|
||||
region = Rect2(76, 75, 124, 135)
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_rbgiq"]
|
||||
viewport_path = NodePath("LifeTimeSprite/SubViewport")
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_rbgiq"]
|
||||
interpolation_mode = 1
|
||||
@@ -185,8 +186,7 @@ texture = ExtResource("3_rbgiq")
|
||||
|
||||
[node name="LifeTimeSprite" type="Sprite2D" parent="." unique_id=799762981]
|
||||
unique_name_in_owner = true
|
||||
position = Vector2(-1, -9.999985)
|
||||
scale = Vector2(0.34, 0.34)
|
||||
scale = Vector2(0.26000002, 0.26000005)
|
||||
texture = SubResource("ViewportTexture_rbgiq")
|
||||
|
||||
[node name="SubViewport" type="SubViewport" parent="LifeTimeSprite" unique_id=1809354262]
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
extends InspectableEntity
|
||||
class_name Plant
|
||||
|
||||
const PLANT_AREA_RADIUS = 20
|
||||
const PLANT_AREA_RADIUS = 40
|
||||
const PLANT_GROWING_AREA_HEIGHT = 70
|
||||
const PLANT_MATURE_AREA_HEIGHT = 150
|
||||
const HARVESTED_SEED_DISPLACEMENT_FACTOR = 100
|
||||
|
||||
const RANDOM_MAX_GROW_INTERVAL = Region.MIN_PASS_DAY_ANIMATION_TIME/2. - 0.1
|
||||
@@ -22,6 +24,7 @@ const SPRITE_SCENE : PackedScene = preload("res://entities/plants/plant_sprite.t
|
||||
@onready var influence_zone : PlantInfluenceZone
|
||||
|
||||
var harvested = false
|
||||
var last_state : PlantData.State
|
||||
|
||||
func _init(
|
||||
_data : PlantData
|
||||
@@ -30,7 +33,7 @@ func _init(
|
||||
|
||||
func _ready():
|
||||
plant_sprite = generate_sprite()
|
||||
collision_shape = generate_collision_shape()
|
||||
generate_collision_shape()
|
||||
influence_zone = generate_influence_zone()
|
||||
|
||||
plant_sprite.setup_plant_sprite(data)
|
||||
@@ -53,9 +56,6 @@ func inspect(is_inspected : bool = true):
|
||||
plant_sprite.display_lifetime_sprite = is_inspected
|
||||
influence_zone.show_influence = is_inspected
|
||||
|
||||
func affect_preview(is_affected : bool = true):
|
||||
plant_sprite.sprite_modulate = MODULATE_AFFECTED_COLOR if is_affected else default_modulate
|
||||
|
||||
func generate_sprite() -> PlantSprite:
|
||||
var sprite_object : PlantSprite = SPRITE_SCENE.instantiate()
|
||||
|
||||
@@ -64,15 +64,28 @@ func generate_sprite() -> PlantSprite:
|
||||
|
||||
return sprite_object
|
||||
|
||||
func generate_collision_shape() -> CollisionShape2D:
|
||||
var collision = CollisionShape2D.new()
|
||||
var shape = CircleShape2D.new()
|
||||
func generate_collision_shape():
|
||||
if collision_shape:
|
||||
collision_shape.queue_free()
|
||||
|
||||
collision_shape = CollisionShape2D.new()
|
||||
var shape = CapsuleShape2D.new()
|
||||
shape.radius = PLANT_AREA_RADIUS
|
||||
|
||||
collision.shape = shape
|
||||
add_child(collision)
|
||||
var height = PLANT_AREA_RADIUS
|
||||
|
||||
return collision
|
||||
match data.get_state():
|
||||
PlantData.State.GROWING:
|
||||
height = PLANT_GROWING_AREA_HEIGHT
|
||||
PlantData.State.MATURE:
|
||||
height = PLANT_MATURE_AREA_HEIGHT
|
||||
|
||||
shape.height = height
|
||||
|
||||
collision_shape.shape = shape
|
||||
|
||||
collision_shape.position.y -= height / 5.
|
||||
add_child(collision_shape)
|
||||
|
||||
func generate_influence_zone() -> PlantInfluenceZone:
|
||||
var zone = PlantInfluenceZone.new(data.get_influence_radius())
|
||||
@@ -85,13 +98,14 @@ func generate_influence_zone() -> PlantInfluenceZone:
|
||||
func _pass_day():
|
||||
await get_tree().create_timer(randf_range(0., RANDOM_MAX_GROW_INTERVAL)).timeout
|
||||
|
||||
var last_state = data.get_state()
|
||||
last_state = data.get_state()
|
||||
|
||||
data.day += 1
|
||||
|
||||
for m in data.mutations:
|
||||
m._start_day_effect(self)
|
||||
|
||||
func _end_pass_day():
|
||||
match data.get_state():
|
||||
PlantData.State.MATURE:
|
||||
if last_state != PlantData.State.MATURE:
|
||||
@@ -99,7 +113,7 @@ func _pass_day():
|
||||
PlantData.State.DEAD:
|
||||
die()
|
||||
|
||||
|
||||
generate_collision_shape()
|
||||
plant_sprite.update_plant_sprite(data, last_state != data.get_state())
|
||||
|
||||
|
||||
@@ -109,8 +123,8 @@ func calculate_plant_score(
|
||||
return data.get_score(with_state)
|
||||
|
||||
func harvest():
|
||||
for i in range(data.get_random_seed_income()):
|
||||
produce_seed()
|
||||
for i in range(data.get_seed_number()):
|
||||
await produce_seed()
|
||||
|
||||
if data.get_state() == PlantData.State.MATURE:
|
||||
for m in data.mutations:
|
||||
@@ -128,6 +142,7 @@ func produce_seed():
|
||||
global_position,
|
||||
HARVESTED_SEED_DISPLACEMENT_FACTOR,
|
||||
)
|
||||
await plant_sprite.play_bump_animation()
|
||||
|
||||
func mature():
|
||||
for m in data.mutations:
|
||||
@@ -136,8 +151,9 @@ func mature():
|
||||
func die():
|
||||
for m in data.mutations:
|
||||
m._start_dead_effect(self)
|
||||
for i in range(data.get_random_seed_income()):
|
||||
produce_seed()
|
||||
for i in range(data.get_seed_number()):
|
||||
await produce_seed()
|
||||
AudioManager.play_sfx("Harvest")
|
||||
disappear()
|
||||
|
||||
func disappear():
|
||||
@@ -200,10 +216,7 @@ func card_info() -> CardInfo:
|
||||
LIFETIME_ICON
|
||||
),
|
||||
CardStatInfo.new(
|
||||
"%d-%d" % [
|
||||
data.get_seed_number(PlantData.State.MATURE) - data.get_seed_random_loose(),
|
||||
data.get_seed_number(PlantData.State.MATURE)
|
||||
],
|
||||
str(data.get_seed_number()),
|
||||
SEED_ICON
|
||||
),
|
||||
])
|
||||
|
||||
@@ -96,7 +96,7 @@ func is_mature() -> bool:
|
||||
return get_state() == State.MATURE
|
||||
|
||||
func get_seed_number(state = get_state()):
|
||||
var seed_number = get_plant_info().get_seed_number() if (state == State.MATURE or state == State.DEAD) else 0
|
||||
var seed_number = get_plant_info().get_seed_number() if (state == State.MATURE or state == State.DEAD) else 1
|
||||
|
||||
for m in mutations:
|
||||
seed_number = m.mutate_seed_number(self , seed_number)
|
||||
@@ -116,11 +116,11 @@ func get_seed_random_loose():
|
||||
func get_influence_radius():
|
||||
return get_plant_info().get_influence_radius()
|
||||
|
||||
func get_random_seed_income():
|
||||
return max(
|
||||
get_seed_number() - randi_range(0, get_seed_random_loose()),
|
||||
0
|
||||
)
|
||||
# func get_random_seed_income():
|
||||
# return max(
|
||||
# get_seed_number() - randi_range(0, get_seed_random_loose()),
|
||||
# 0
|
||||
# )
|
||||
|
||||
func get_lifetime_buff() -> int:
|
||||
var buff = 0
|
||||
|
||||
@@ -74,6 +74,23 @@ func get_level_for_rarity(rarity: int) -> int:
|
||||
func get_rarity() -> int:
|
||||
return get_base_rarity() + level - 1
|
||||
|
||||
func card_info() -> CardInfo:
|
||||
var info = CardInfo.new(
|
||||
get_mutation_name(),
|
||||
tr("MUTATION")
|
||||
)
|
||||
info.important_stat_icon = get_icon()
|
||||
|
||||
var desc_section := CardSectionInfo.new(
|
||||
tr("DESCRIPTION"),
|
||||
get_mutation_description(),
|
||||
)
|
||||
desc_section.title_icon = InspectableEntity.DESC_ICON
|
||||
|
||||
info.sections.append(desc_section)
|
||||
|
||||
return info
|
||||
|
||||
func card_section() -> CardSectionInfo:
|
||||
var section = CardSectionInfo.new(
|
||||
get_mutation_name() + (" %d" % level if level > 1 else ""),
|
||||
@@ -107,4 +124,4 @@ static func get_rarity_color(rarity: int) -> Color:
|
||||
Color("FFA617"),
|
||||
]
|
||||
|
||||
return rarity_colors[min(rarity, len(rarity_colors) - 1)%len(rarity_colors)]
|
||||
return rarity_colors[rarity%len(rarity_colors)]
|
||||
@@ -1,3 +1,4 @@
|
||||
@tool
|
||||
extends PlantMutation
|
||||
class_name AncientMutation
|
||||
|
||||
|
||||
@@ -23,4 +23,4 @@ func _start_maturation_effect(plant : Plant):
|
||||
|
||||
|
||||
func get_purification_radius() -> int:
|
||||
return level * 2
|
||||
return level
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
extends Node2D
|
||||
extends Area2D
|
||||
class_name PlantSprite
|
||||
|
||||
const PLANTED_SEED_CROP_WIDTH = 50
|
||||
@@ -64,6 +64,13 @@ func set_sprite_modulate(c := sprite_modulate):
|
||||
if is_node_ready():
|
||||
%Sprite.modulate = c
|
||||
|
||||
func affect_preview(is_affected : bool = true):
|
||||
sprite_modulate = InspectableEntity.MODULATE_AFFECTED_COLOR if is_affected else Color.WHITE
|
||||
|
||||
func _on_body_entered(body: Node2D) -> void:
|
||||
if body is Player && $AnimationPlayer.current_animation != "player_move":
|
||||
$AnimationPlayer.play("player_move");
|
||||
|
||||
func play_bump_animation():
|
||||
%AnimationPlayer.play("bump")
|
||||
await %AnimationPlayer.animation_finished
|
||||
@@ -17,7 +17,7 @@ func _init(size : int = 1):
|
||||
seeds_size = size
|
||||
|
||||
func current_is_tool() -> bool:
|
||||
return current_item_ind <= len(tools)
|
||||
return current_item_ind < len(tools)
|
||||
|
||||
func set_current_item(new_ind: int):
|
||||
if new_ind < 0:
|
||||
|
||||
@@ -44,7 +44,7 @@ func is_action_need_press_time() -> bool:
|
||||
func get_action_press_time() -> float:
|
||||
return DEFAULT_PRESS_TIME
|
||||
|
||||
func get_usage_object_affected(_i : InspectableEntity) -> bool:
|
||||
func get_usage_object_affected(_i : Area2D) -> bool:
|
||||
return false
|
||||
|
||||
func is_one_time_use():
|
||||
|
||||
@@ -21,7 +21,7 @@ func get_energy_used() -> int:
|
||||
func get_usage_zone_radius() -> int:
|
||||
return 10
|
||||
|
||||
func get_usage_object_affected(i : InspectableEntity) -> bool:
|
||||
func get_usage_object_affected(i : Area2D) -> bool:
|
||||
return i is Plant
|
||||
|
||||
func use_text() -> String:
|
||||
|
||||
@@ -41,7 +41,7 @@ static func generate_from_parent(plant_data : PlantData) -> Seed:
|
||||
static func generate_random(rarity := 0) -> Seed:
|
||||
var new_seed = Seed.new(
|
||||
Random.generate_random_word(),
|
||||
[generate_first_mutation(rarity)]
|
||||
generate_first_mutations(rarity),
|
||||
)
|
||||
|
||||
return new_seed
|
||||
@@ -63,10 +63,10 @@ func get_energy_used() -> int:
|
||||
return 1
|
||||
|
||||
func get_usage_zone_radius() -> int:
|
||||
return 35
|
||||
return 50
|
||||
|
||||
func get_usage_object_affected(i : InspectableEntity) -> bool:
|
||||
return i is Plant
|
||||
func get_usage_object_affected(i : Area2D) -> bool:
|
||||
return i is PlantSprite
|
||||
|
||||
func use_text() -> String:
|
||||
return tr("PLANT_%s") % plant_name
|
||||
@@ -82,10 +82,19 @@ func can_use(player : Player, zone : Player.ActionZone) -> bool:
|
||||
|
||||
var is_there_a_plant_here = false
|
||||
for area in zone.get_affected_areas():
|
||||
if area is Plant:
|
||||
if area is PlantSprite:
|
||||
is_there_a_plant_here = true
|
||||
|
||||
return not is_there_a_plant_here and player.region.is_coords_decontaminated(zone.get_tiles())
|
||||
var plant_tiles = Math.get_tiles_in_circle(
|
||||
zone.get_global_position(),
|
||||
20
|
||||
)
|
||||
|
||||
return (
|
||||
not is_there_a_plant_here
|
||||
and player.region.is_coords_decontaminated(plant_tiles)
|
||||
and not player.region.is_coords_rocky(plant_tiles)
|
||||
)
|
||||
|
||||
func use(player : Player, zone : Player.ActionZone) -> bool:
|
||||
if player.region == null:
|
||||
@@ -138,7 +147,10 @@ func get_particles() -> Array[EffectParticles.Parameters]:
|
||||
|
||||
return param
|
||||
|
||||
static func generate_first_mutation(rarity := 0) -> PlantMutation:
|
||||
static func generate_first_mutations(rarity := 0) -> Array[PlantMutation]:
|
||||
|
||||
if rarity < 0:
|
||||
return []
|
||||
|
||||
var possible_mutation : PlantMutation = GameInfo.game_data.progression_data.available_mutations.filter(
|
||||
func (m : PlantMutation): return m.get_base_rarity() <= rarity
|
||||
@@ -148,26 +160,20 @@ static func generate_first_mutation(rarity := 0) -> PlantMutation:
|
||||
|
||||
possible_mutation.level += level_to_add
|
||||
|
||||
return possible_mutation
|
||||
return [possible_mutation]
|
||||
|
||||
static func mutate_mutations(mutations : Array[PlantMutation]) -> Array[PlantMutation]:
|
||||
|
||||
var mutation_possibility : Array[MutationPossibility] = [
|
||||
AddMutation.new()
|
||||
]
|
||||
var mutation_possibility : Array[MutationPossibility] = []
|
||||
|
||||
if (
|
||||
len(mutations) >= GameInfo.game_data.current_run.plant_info.get_mutation_max_number()
|
||||
len(mutations) < GameInfo.game_data.current_run.plant_info.get_mutation_max_number()
|
||||
):
|
||||
mutation_possibility = [
|
||||
UpgradeMutation.new(),
|
||||
]
|
||||
elif len(mutations) > 0:
|
||||
mutation_possibility = [
|
||||
AddMutation.new(),
|
||||
UpgradeMutation.new(),
|
||||
]
|
||||
mutation_possibility.append(AddMutation.new())
|
||||
|
||||
if len(mutations) > 0:
|
||||
mutation_possibility.append(UpgradeMutation.new())
|
||||
|
||||
var chosen_mutation_possibility = mutation_possibility.pick_random()
|
||||
|
||||
return chosen_mutation_possibility.mutate(mutations)
|
||||
|
||||
@@ -17,7 +17,7 @@ func get_icon() -> Texture2D:
|
||||
func get_usage_zone_radius() -> int:
|
||||
return SHOVEL_ZONE_RADIUS
|
||||
|
||||
func get_usage_object_affected(i : InspectableEntity) -> bool:
|
||||
func get_usage_object_affected(i : Area2D) -> bool:
|
||||
return i is Plant
|
||||
|
||||
func use_text() -> String:
|
||||
|
||||
@@ -9,11 +9,23 @@
|
||||
[ext_resource type="AudioStream" uid="uid://cv5avkd3qekt7" path="res://common/audio_manager/assets/sfx/movement/movement.wav" id="7_qiwj3"]
|
||||
|
||||
[sub_resource type="CircleShape2D" id="CircleShape2D_sglur"]
|
||||
radius = 27.0
|
||||
radius = 13.0
|
||||
|
||||
[sub_resource type="CircleShape2D" id="CircleShape2D_abrql"]
|
||||
radius = 40.0
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_qiwj3"]
|
||||
offsets = PackedFloat32Array(0.37339056, 0.49785408)
|
||||
colors = PackedColorArray(0.043137256, 0.050980393, 0.15686275, 0, 0.043137256, 0.050980393, 0.15686275, 1)
|
||||
|
||||
[sub_resource type="GradientTexture2D" id="GradientTexture2D_26q78"]
|
||||
gradient = SubResource("Gradient_qiwj3")
|
||||
width = 600
|
||||
height = 600
|
||||
fill = 1
|
||||
fill_from = Vector2(0.5, 0.5)
|
||||
fill_to = Vector2(0.5, 0)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_fkugw"]
|
||||
atlas = ExtResource("4_bls4j")
|
||||
region = Rect2(3048, 0, 762, 1080)
|
||||
@@ -113,6 +125,9 @@ animations = [{
|
||||
"speed": 5.0
|
||||
}]
|
||||
|
||||
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_bectd"]
|
||||
blend_mode = 1
|
||||
|
||||
[sub_resource type="Curve" id="Curve_fkugw"]
|
||||
_data = [Vector2(0, 0.14473677), 0.0, 0.0, 0, 0, Vector2(0.972549, 0.2654798), 0.0, 0.0, 0, 0]
|
||||
point_count = 2
|
||||
@@ -253,6 +268,12 @@ position = Vector2(-2.3841858e-07, -7.999996)
|
||||
scale = Vector2(0.29154927, 0.29154924)
|
||||
texture = ExtResource("2_fkugw")
|
||||
|
||||
[node name="Fog" type="Sprite2D" parent="." unique_id=1590893330]
|
||||
z_index = 10
|
||||
position = Vector2(0.99999994, -17)
|
||||
scale = Vector2(8, 8)
|
||||
texture = SubResource("GradientTexture2D_26q78")
|
||||
|
||||
[node name="PlayerSprite" type="AnimatedSprite2D" parent="." unique_id=638545037]
|
||||
unique_name_in_owner = true
|
||||
position = Vector2(0.99999994, -17)
|
||||
@@ -267,6 +288,7 @@ wanted_orientation = 2
|
||||
[node name="Light" type="Sprite2D" parent="PlayerSprite" unique_id=1768327734]
|
||||
modulate = Color(0.70603025, 0.5959886, 0.33971557, 0.09019608)
|
||||
z_index = -1
|
||||
material = SubResource("CanvasItemMaterial_bectd")
|
||||
scale = Vector2(16.093441, 16.093441)
|
||||
texture = ExtResource("5_8fjmc")
|
||||
|
||||
@@ -290,3 +312,15 @@ bus = &"Sfx"
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=793749564]
|
||||
unique_name_in_owner = true
|
||||
libraries/ = SubResource("AnimationLibrary_qiwj3")
|
||||
|
||||
[node name="NavigationAgent2D" type="NavigationAgent2D" parent="." unique_id=1282043308]
|
||||
unique_name_in_owner = true
|
||||
simplify_path = true
|
||||
simplify_epsilon = 4.223
|
||||
path_search_max_polygons = 1000
|
||||
avoidance_enabled = true
|
||||
radius = 500.0
|
||||
debug_use_custom = true
|
||||
debug_path_custom_color = Color(0.5882353, 0.7019608, 0.85882354, 0.3019608)
|
||||
debug_path_custom_point_size = 0.0
|
||||
debug_path_custom_line_width = 1.0
|
||||
|
||||
@@ -5,6 +5,7 @@ const ACTION_AREA_UPDATE_TIME=0.05 # When creating an action_zone, we make sure
|
||||
const MAX_REACH = 100
|
||||
const HOLDING_ITEM_SPRITE_SIZE = 20.
|
||||
const TURN_ANIMATION_MINIMUM_THRESHOLD = 0.2
|
||||
const SPEED = 350
|
||||
|
||||
signal player_updated(player: Player)
|
||||
signal upgraded
|
||||
@@ -12,7 +13,6 @@ signal upgraded
|
||||
var terrain : Terrain
|
||||
var region : Region :
|
||||
get(): return terrain if terrain is Region else null
|
||||
@export var speed = 350
|
||||
|
||||
var data : PlayerData
|
||||
var last_action_area_movement_timer : float = 100.
|
||||
@@ -22,7 +22,13 @@ var controlling_player : bool = false :
|
||||
controlling_player = v
|
||||
velocity = Vector2.ZERO
|
||||
|
||||
var instruction : Instruction = null
|
||||
var instruction : Instruction = null :
|
||||
set(i):
|
||||
if instruction and is_node_ready():
|
||||
instruction.abort(self)
|
||||
instruction = i
|
||||
if instruction and is_node_ready():
|
||||
instruction.spawn_indicator(self)
|
||||
|
||||
@onready var preview_zone : ActionZone = await setup_action_zone(Vector2.ZERO, null)
|
||||
@onready var action_zone : ActionZone = await setup_action_zone(Vector2.ZERO, null)
|
||||
@@ -81,7 +87,7 @@ func _process(delta):
|
||||
instruction = null
|
||||
input_direction = calculate_direction_instruction_direction()
|
||||
|
||||
velocity = input_direction * speed
|
||||
velocity = input_direction * SPEED
|
||||
turn_animate(input_direction)
|
||||
|
||||
move_preview_zone(get_global_mouse_position())
|
||||
@@ -106,8 +112,11 @@ func calculate_direction_instruction_direction() -> Vector2:
|
||||
instruction.position.distance_to(global_position) > (MAX_REACH - 1.)
|
||||
or instruction is MoveInstruction
|
||||
)
|
||||
):
|
||||
return self.global_position.direction_to(instruction.position)
|
||||
):
|
||||
if %NavigationAgent2D.target_position != instruction.position:
|
||||
%NavigationAgent2D.target_position = instruction.position
|
||||
return to_local(%NavigationAgent2D.get_next_path_position()).normalized()
|
||||
# return self.global_position.direction_to(instruction.position)
|
||||
return Vector2.ZERO
|
||||
|
||||
func calculate_direction_input_direction() -> Vector2:
|
||||
@@ -147,8 +156,8 @@ func try_interact(interactable : Interactable):
|
||||
func try_move(move_to : Vector2):
|
||||
instruction = MoveInstruction.new(move_to)
|
||||
|
||||
func can_pick_item(item: Item):
|
||||
return item.type == Item.ItemType.TOOL_ITEM || !data.inventory.is_full() || !data.inventory.current_is_tool()
|
||||
func can_pick_item(_item: Item):
|
||||
return true
|
||||
|
||||
func pick_item(item : Item):
|
||||
if item.type != Item.ItemType.TOOL_ITEM && data.inventory.is_full():
|
||||
@@ -163,13 +172,23 @@ func pick_item(item : Item):
|
||||
|
||||
func drop_item():
|
||||
var ind_to_drop := data.inventory.current_item_ind
|
||||
while (
|
||||
(data.inventory.get_item(ind_to_drop) == null or ind_to_drop < len(data.inventory.tools))
|
||||
and ind_to_drop < len(data.inventory.get_all_items()) - 1
|
||||
|
||||
if (
|
||||
data.inventory.get_item(ind_to_drop) == null or ind_to_drop < len(data.inventory.tools)
|
||||
):
|
||||
ind_to_drop += 1
|
||||
var item_to_drop = data.inventory.pop_item(ind_to_drop)
|
||||
if item_to_drop:
|
||||
var possible_ind : Array = range(
|
||||
len(data.inventory.tools),
|
||||
len(data.inventory.tools) + data.inventory.seeds_size
|
||||
).filter(
|
||||
func (i): return data.inventory.get_item(i) != null
|
||||
)
|
||||
if len(possible_ind):
|
||||
ind_to_drop = possible_ind.pop_back()
|
||||
else:
|
||||
return
|
||||
|
||||
var item_to_drop : Item = data.inventory.pop_item(ind_to_drop)
|
||||
if item_to_drop and item_to_drop.type != Item.ItemType.TOOL_ITEM:
|
||||
terrain.drop_item(item_to_drop, global_position)
|
||||
AudioManager.play_sfx("Drop")
|
||||
region.save()
|
||||
@@ -239,11 +258,10 @@ func setup_preview_zone(item : Item):
|
||||
return preview_zone
|
||||
elif preview_zone:
|
||||
preview_zone.destroy()
|
||||
preview_zone = null
|
||||
|
||||
if item:
|
||||
preview_zone = await generate_action_zone(item)
|
||||
else:
|
||||
preview_zone = null
|
||||
|
||||
func setup_action_zone(zone_position : Vector2, item: Item) -> ActionZone:
|
||||
if action_zone:
|
||||
@@ -259,8 +277,11 @@ func move_preview_zone(zone_position : Vector2):
|
||||
|
||||
class Instruction:
|
||||
|
||||
const INDICATOR_COLOR := Color("#96B3DB")
|
||||
|
||||
var position : Vector2
|
||||
var need_movement : bool = true
|
||||
var indicator := Sprite2D.new()
|
||||
|
||||
func _init(_pos : Vector2):
|
||||
position = _pos
|
||||
@@ -270,8 +291,46 @@ class Instruction:
|
||||
|
||||
func do(_player : Player):
|
||||
pass
|
||||
|
||||
func indicator_texture():
|
||||
return preload("res://common/icons/map-pin.svg")
|
||||
|
||||
func indicator_size():
|
||||
return 40
|
||||
|
||||
func indicator_shift():
|
||||
return Vector2.ZERO
|
||||
|
||||
func spawn_indicator(player : Player):
|
||||
indicator.texture = indicator_texture()
|
||||
|
||||
indicator.texture = indicator_texture()
|
||||
indicator.scale = Vector2(
|
||||
1./(float(indicator_texture().get_width())/indicator_size()),
|
||||
1./(float(indicator_texture().get_height())/indicator_size())
|
||||
)
|
||||
|
||||
indicator.modulate = Color(
|
||||
INDICATOR_COLOR.r,
|
||||
INDICATOR_COLOR.g,
|
||||
INDICATOR_COLOR.b,
|
||||
0.
|
||||
)
|
||||
|
||||
player.get_parent().add_child(indicator)
|
||||
|
||||
indicator.global_position = position + indicator_shift()
|
||||
|
||||
player.get_tree().create_tween().tween_property(indicator, "modulate:a", 0.8, 0.2)
|
||||
|
||||
func abort(player : Player):
|
||||
indicator.queue_free()
|
||||
|
||||
class MoveInstruction extends Instruction:
|
||||
|
||||
func indicator_shift():
|
||||
return Vector2.UP * 50
|
||||
|
||||
func can_be_done(player : Player):
|
||||
return player.global_position.distance_to(position) < 10.
|
||||
|
||||
@@ -289,7 +348,10 @@ class ItemActionInstruction extends Instruction:
|
||||
not item.is_usage_need_proximity() or
|
||||
player.global_position.distance_to(position) < player.MAX_REACH
|
||||
)
|
||||
|
||||
|
||||
func indicator_texture():
|
||||
return item.icon
|
||||
|
||||
func do(player : Player):
|
||||
player.use_item(item)
|
||||
|
||||
@@ -303,13 +365,16 @@ class InteractableInstruction extends Instruction:
|
||||
func can_be_done(player : Player):
|
||||
return player.global_position.distance_to(position) < player.MAX_REACH
|
||||
|
||||
func indicator_texture():
|
||||
return preload("res://common/icons/hand-grab.svg")
|
||||
|
||||
func do(player : Player):
|
||||
interactable.interact(player)
|
||||
|
||||
class ActionZone:
|
||||
var item : Item = null
|
||||
var area : Area2D = Area2D.new()
|
||||
var affected_areas : Array[InspectableEntity]= []
|
||||
var affected_areas : Array[Area2D]= []
|
||||
|
||||
func _init(_i : Item):
|
||||
item = _i
|
||||
@@ -330,9 +395,9 @@ class ActionZone:
|
||||
func update_preview_on_affected_area():
|
||||
var detected_areas = get_affected_areas()
|
||||
clear_preview_on_affected_area()
|
||||
var new_affected_areas : Array[InspectableEntity] = []
|
||||
var new_affected_areas : Array[Area2D] = []
|
||||
for a in detected_areas:
|
||||
if a is InspectableEntity and item.get_usage_object_affected(a):
|
||||
if a is Area2D and item.get_usage_object_affected(a) and a.has_method("affect_preview"):
|
||||
a.affect_preview(true)
|
||||
new_affected_areas.append(a)
|
||||
affected_areas = new_affected_areas
|
||||
|
||||
@@ -64,7 +64,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.253273, 0)
|
||||
shape = SubResource("CapsuleShape3D_eodxe")
|
||||
|
||||
[node name="OmniLight3D" type="OmniLight3D" parent="." unique_id=1818490710]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.7901894e-08, -0.25222805, 0.6383209)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.0989037e-09, -0.25222805, 0.025139987)
|
||||
shadow_enabled = true
|
||||
|
||||
[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=1210282091]
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ extends CharacterBody3D
|
||||
class_name Player3D
|
||||
|
||||
const POINTER_TEXTURE = preload("res://common/icons/focus.svg")
|
||||
const POINTER_ACTION_TEXTURE = preload("res://common/icons/hand-stop.svg")
|
||||
const POINTER_ACTION_TEXTURE = preload("res://common/icons/hand-finger.svg")
|
||||
|
||||
@export var pointer_texture_rect : TextureRect
|
||||
|
||||
|
||||
@@ -4,9 +4,6 @@ class_name EntityData
|
||||
|
||||
@export var position : Vector2
|
||||
|
||||
func _init(e : Entity):
|
||||
position = e.global_position
|
||||
|
||||
func get_position() -> Vector2:
|
||||
return position
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
extends Entity
|
||||
class_name InspectableEntity
|
||||
|
||||
const MODULATE_INSPECTED_COLOR = Color.GRAY
|
||||
const MODULATE_AFFECTED_COLOR = Color.RED
|
||||
const MODULATE_INSPECTED_COLOR = Color("#96B3DB")
|
||||
const MODULATE_AFFECTED_COLOR = Color("#FF006E")
|
||||
const DESC_ICON = preload("res://common/icons/align-right.svg")
|
||||
|
||||
@export var default_info_title = ""
|
||||
@@ -11,6 +11,8 @@ const DESC_ICON = preload("res://common/icons/align-right.svg")
|
||||
@onready var default_modulate : Color = modulate
|
||||
@onready var inspectable_signals_setuped : bool = setup_inspectable_signals()
|
||||
|
||||
var mouse_over := false
|
||||
|
||||
func inspect(is_inspected : bool = true):
|
||||
modulate = MODULATE_INSPECTED_COLOR if is_inspected else default_modulate
|
||||
|
||||
@@ -23,9 +25,11 @@ func setup_inspectable_signals() -> bool:
|
||||
return true
|
||||
|
||||
func _on_mouse_entered():
|
||||
mouse_over = true
|
||||
Pointer.inspect(self)
|
||||
|
||||
func _on_mouse_excited():
|
||||
mouse_over = false
|
||||
Pointer.stop_inspect(self)
|
||||
|
||||
func pointer_text() -> String:
|
||||
@@ -54,3 +58,7 @@ func _notification(what):
|
||||
|
||||
func get_card_up_padding() -> float:
|
||||
return Pointer.CARD_UP_PADDING
|
||||
|
||||
|
||||
func _process(_delta):
|
||||
modulate.a = 0.3 if mouse_over and Pointer.inspected != self else 1.
|
||||
@@ -1,55 +1,5 @@
|
||||
[preset.0]
|
||||
|
||||
name="Web"
|
||||
platform="Web"
|
||||
runnable=true
|
||||
dedicated_server=false
|
||||
custom_features=""
|
||||
export_filter="all_resources"
|
||||
include_filter=""
|
||||
exclude_filter=""
|
||||
export_path=".export/web/index.html"
|
||||
patches=PackedStringArray()
|
||||
patch_delta_encoding=false
|
||||
patch_delta_compression_level_zstd=19
|
||||
patch_delta_min_reduction=0.1
|
||||
patch_delta_include_filters="*"
|
||||
patch_delta_exclude_filters=""
|
||||
encryption_include_filters=""
|
||||
encryption_exclude_filters=""
|
||||
seed=0
|
||||
encrypt_pck=false
|
||||
encrypt_directory=false
|
||||
script_export_mode=2
|
||||
|
||||
[preset.0.options]
|
||||
|
||||
custom_template/debug=""
|
||||
custom_template/release=""
|
||||
variant/extensions_support=false
|
||||
variant/thread_support=false
|
||||
vram_texture_compression/for_desktop=true
|
||||
vram_texture_compression/for_mobile=false
|
||||
html/export_icon=true
|
||||
html/custom_html_shell=""
|
||||
html/head_include=""
|
||||
html/canvas_resize_policy=2
|
||||
html/focus_canvas_on_start=true
|
||||
html/experimental_virtual_keyboard=false
|
||||
progressive_web_app/enabled=false
|
||||
progressive_web_app/ensure_cross_origin_isolation_headers=true
|
||||
progressive_web_app/offline_page=""
|
||||
progressive_web_app/display=1
|
||||
progressive_web_app/orientation=0
|
||||
progressive_web_app/icon_144x144=""
|
||||
progressive_web_app/icon_180x180=""
|
||||
progressive_web_app/icon_512x512=""
|
||||
progressive_web_app/background_color=Color(0, 0, 0, 1)
|
||||
threads/emscripten_pool_size=8
|
||||
threads/godot_pool_size=4
|
||||
|
||||
[preset.1]
|
||||
|
||||
name="Windows Desktop"
|
||||
platform="Windows Desktop"
|
||||
runnable=true
|
||||
@@ -72,7 +22,7 @@ encrypt_pck=false
|
||||
encrypt_directory=false
|
||||
script_export_mode=2
|
||||
|
||||
[preset.1.options]
|
||||
[preset.0.options]
|
||||
|
||||
custom_template/debug=""
|
||||
custom_template/release=""
|
||||
@@ -119,3 +69,50 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
|
||||
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
|
||||
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
|
||||
Remove-Item -Recurse -Force '{temp_dir}'"
|
||||
|
||||
[preset.1]
|
||||
|
||||
name="Linux"
|
||||
platform="Linux"
|
||||
runnable=true
|
||||
dedicated_server=false
|
||||
custom_features=""
|
||||
export_filter="all_resources"
|
||||
include_filter=""
|
||||
exclude_filter=""
|
||||
export_path=".export/steam/content_builder/content/linux/Seeding The Wasteland.x86_64"
|
||||
patches=PackedStringArray()
|
||||
patch_delta_encoding=false
|
||||
patch_delta_compression_level_zstd=19
|
||||
patch_delta_min_reduction=0.1
|
||||
patch_delta_include_filters="*"
|
||||
patch_delta_exclude_filters=""
|
||||
encryption_include_filters=""
|
||||
encryption_exclude_filters=""
|
||||
seed=0
|
||||
encrypt_pck=false
|
||||
encrypt_directory=false
|
||||
script_export_mode=2
|
||||
|
||||
[preset.1.options]
|
||||
|
||||
custom_template/debug=""
|
||||
custom_template/release=""
|
||||
debug/export_console_wrapper=1
|
||||
binary_format/embed_pck=false
|
||||
texture_format/s3tc_bptc=true
|
||||
texture_format/etc2_astc=false
|
||||
shader_baker/enabled=false
|
||||
binary_format/architecture="x86_64"
|
||||
ssh_remote_deploy/enabled=false
|
||||
ssh_remote_deploy/host="user@host_ip"
|
||||
ssh_remote_deploy/port="22"
|
||||
ssh_remote_deploy/extra_args_ssh=""
|
||||
ssh_remote_deploy/extra_args_scp=""
|
||||
ssh_remote_deploy/run_script="#!/usr/bin/env bash
|
||||
export DISPLAY=:0
|
||||
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
|
||||
\"{temp_dir}/{exe_name}\" {cmd_args}"
|
||||
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
|
||||
pkill -x -f \"{temp_dir}/{exe_name} {cmd_args}\"
|
||||
rm -rf \"{temp_dir}\""
|
||||
|
||||
@@ -2,12 +2,6 @@
|
||||
|
||||
[ext_resource type="Script" uid="uid://bqdylb4maacf0" path="res://addons/dialogic/Modules/DefaultLayoutParts/Layer_FullBackground/full_background_layer.gd" id="1_tu40u"]
|
||||
[ext_resource type="Script" uid="uid://oxcjhq2817c7" path="res://addons/dialogic/Modules/Background/node_background_holder.gd" id="2_ghan2"]
|
||||
[ext_resource type="Shader" uid="uid://cuni3ggtw2uuy" path="res://common/vfx/materials/shaders/blur.gdshader" id="2_v1ioh"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_v1ioh"]
|
||||
shader = ExtResource("2_v1ioh")
|
||||
shader_parameter/strength = 3.3
|
||||
shader_parameter/mix_percentage = 0.3
|
||||
|
||||
[node name="BackgroundLayer" type="Control" unique_id=421215061]
|
||||
layout_direction = 2
|
||||
@@ -20,7 +14,7 @@ grow_vertical = 2
|
||||
script = ExtResource("1_tu40u")
|
||||
|
||||
[node name="DialogicNode_BackgroundHolder_Blur" type="ColorRect" parent="." unique_id=726280929]
|
||||
material = SubResource("ShaderMaterial_v1ioh")
|
||||
modulate = Color(1, 1, 1, 0.8)
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
@@ -28,4 +22,5 @@ anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
color = Color(0.0627451, 0.05882353, 0.16862746, 1)
|
||||
script = ExtResource("2_ghan2")
|
||||
|
||||