commit
567fb6ed77
@ -0,0 +1,3 @@
|
||||
{
|
||||
"godotTools.editorPath.godot4": "c:\\Users\\jason\\Downloads\\Godot_v4.4.1-stable_mono_win64\\Godot_v4.4.1-stable_mono_win64\\Godot_v4.4.1-stable_mono_win64.exe"
|
||||
}
|
||||
@ -0,0 +1,69 @@
|
||||
/**************************************************************************/
|
||||
/* godot.audio.position.worklet.js */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
const POST_THRESHOLD_S = 0.1;
|
||||
|
||||
class GodotPositionReportingProcessor extends AudioWorkletProcessor {
|
||||
constructor(...args) {
|
||||
super(...args);
|
||||
this.lastPostTime = currentTime;
|
||||
this.position = 0;
|
||||
this.ended = false;
|
||||
|
||||
this.port.onmessage = (event) => {
|
||||
if (event?.data?.type === 'ended') {
|
||||
this.ended = true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
process(inputs, _outputs, _parameters) {
|
||||
if (this.ended) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (inputs.length > 0) {
|
||||
const input = inputs[0];
|
||||
if (input.length > 0) {
|
||||
this.position += input[0].length;
|
||||
}
|
||||
}
|
||||
|
||||
// Posting messages is expensive. Let's limit the number of posts.
|
||||
if (currentTime - this.lastPostTime > POST_THRESHOLD_S) {
|
||||
this.lastPostTime = currentTime;
|
||||
this.port.postMessage({ type: 'position', data: this.position });
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
registerProcessor('godot-position-reporting-processor', GodotPositionReportingProcessor);
|
||||
@ -0,0 +1,3 @@
|
||||
[gd_resource type="Resource" format=3 uid="uid://bkkc6ej2nx3r6"]
|
||||
|
||||
[resource]
|
||||
Binary file not shown.
@ -0,0 +1,86 @@
|
||||
[gd_resource type="Resource" script_class="MissionData" load_steps=9 format=3 uid="uid://bh148683scgge"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_objective"]
|
||||
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="2_mission"]
|
||||
[ext_resource type="Resource" uid="uid://dykbopx8n3c3v" path="res://resources/patterns/road_square.tres" id="3_pattern"]
|
||||
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="4_building_a"]
|
||||
[ext_resource type="Resource" uid="uid://bh65eqgid4kxy" path="res://structures/building-small-c.tres" id="5_building_c"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_objective1"]
|
||||
script = ExtResource("1_objective")
|
||||
type = 3
|
||||
target_count = 1
|
||||
current_count = 0
|
||||
description = "Build a 2x2 road square using corner and straight roads"
|
||||
completed = false
|
||||
pattern_rules = ExtResource("3_pattern")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_objective2"]
|
||||
script = ExtResource("1_objective")
|
||||
type = 0
|
||||
target_count = 2
|
||||
current_count = 0
|
||||
description = "Build 2 Type A houses inside the road square"
|
||||
completed = false
|
||||
structure = ExtResource("4_building_a")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_objective3"]
|
||||
script = ExtResource("1_objective")
|
||||
type = 0
|
||||
target_count = 2
|
||||
current_count = 0
|
||||
description = "Build 2 Type C houses outside the road square"
|
||||
completed = false
|
||||
structure = ExtResource("5_building_c")
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_mission")
|
||||
id = "99"
|
||||
title = "Square Neighborhood"
|
||||
description = "Create a well-organized neighborhood by building a square road pattern and placing different types of houses strategically. Complete this mission to unlock all building types!"
|
||||
objectives = Array[ExtResource("1_objective")]([SubResource("Resource_objective1"), SubResource("Resource_objective2"), SubResource("Resource_objective3")])
|
||||
rewards = {
|
||||
"cash": 500,
|
||||
"experience": 100
|
||||
}
|
||||
next_mission_id = ""
|
||||
graph_path = ""
|
||||
full_screen_path = ""
|
||||
intro_text = "Let's create an organized neighborhood! First, we'll build a square road pattern using corner and straight roads. Then, we'll place Type A houses inside the square and Type C houses outside to create a diverse residential area. Complete this mission to unlock all building types!"
|
||||
question_text = ""
|
||||
correct_answer = ""
|
||||
feedback_text = ""
|
||||
incorrect_feedback = ""
|
||||
company_data = ""
|
||||
power_math_content = ""
|
||||
num_of_user_inputs = 1
|
||||
input_labels = Array[String]([])
|
||||
companion_dialog = {
|
||||
"mission_completed": {
|
||||
"animation": "excited",
|
||||
"duration": 6000,
|
||||
"text": "Excellent work! You've created a well-organized neighborhood with a good mix of house types. You've unlocked all building types!"
|
||||
},
|
||||
"mission_started": {
|
||||
"animation": "excited",
|
||||
"duration": 6000,
|
||||
"text": ["Time to build a well-organized neighborhood!", "Let's start by creating a square road pattern."]
|
||||
},
|
||||
"objective_completed_1": {
|
||||
"animation": "happy",
|
||||
"duration": 5000,
|
||||
"text": ["Perfect square! The roads are perfectly aligned.", "Now we can start placing houses inside."]
|
||||
},
|
||||
"objective_completed_2": {
|
||||
"animation": "happy",
|
||||
"duration": 5000,
|
||||
"text": ["The Type A houses fit perfectly inside the road square!", "Now let's add some Type C houses outside."]
|
||||
},
|
||||
"objective_completed_3": {
|
||||
"animation": "happy",
|
||||
"duration": 5000,
|
||||
"text": ["Great placement of the Type C houses outside the square!", "This creates a nice variety in our neighborhood."]
|
||||
}
|
||||
}
|
||||
unlocked_items = Array[String](["res://structures/building-small-a.tres", "res://structures/building-small-b.tres", "res://structures/building-small-c.tres", "res://structures/building-garage.tres"])
|
||||
starting_structures = Array[String]([])
|
||||
@ -0,0 +1,63 @@
|
||||
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://cua0khnbyusip"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_objective"]
|
||||
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="2_mission"]
|
||||
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="3_building_a"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_objective1"]
|
||||
script = ExtResource("1_objective")
|
||||
type = 1
|
||||
target_count = 3
|
||||
current_count = 0
|
||||
description = "Build 3 Type A houses to unlock all building types"
|
||||
completed = false
|
||||
structure = ExtResource("3_building_a")
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_mission")
|
||||
id = "unlock_buildings"
|
||||
title = "Building Variety"
|
||||
description = "Demonstrate your basic building skills to unlock access to all residential building types!"
|
||||
objectives = Array[ExtResource("1_objective")]([SubResource("Resource_objective1")])
|
||||
rewards = {
|
||||
"cash": 300,
|
||||
"experience": 50
|
||||
}
|
||||
next_mission_id = "99"
|
||||
graph_path = ""
|
||||
full_screen_path = ""
|
||||
intro_text = "The city council is impressed with your development plans! Show them you can handle basic construction by building a few houses, and they'll grant you access to build all residential building types."
|
||||
question_text = ""
|
||||
correct_answer = ""
|
||||
feedback_text = ""
|
||||
incorrect_feedback = ""
|
||||
company_data = ""
|
||||
power_math_content = ""
|
||||
num_of_user_inputs = 0
|
||||
input_labels = Array[String]([])
|
||||
companion_dialog = {
|
||||
"mission_completed": {
|
||||
"animation": "excited",
|
||||
"duration": 6000,
|
||||
"text": "Great job! You now have access to all residential building types!"
|
||||
},
|
||||
"mission_started": {
|
||||
"animation": "excited",
|
||||
"duration": 6000,
|
||||
"text": ["Let's start building some houses!", "Show the city council what you can do!"]
|
||||
},
|
||||
"objective_completed_1": {
|
||||
"animation": "happy",
|
||||
"duration": 5000,
|
||||
"text": ["Nice work with those houses!", "The city council is impressed with your building skills!"]
|
||||
}
|
||||
}
|
||||
unlocked_items = Array[String](["res://structures/building-small-a.tres", "res://structures/building-small-b.tres", "res://structures/building-small-c.tres", "res://structures/building-garage.tres", "res://structures/road-straight.tres"])
|
||||
starting_structures = Array[String](["res://structures/building-small-a.tres", "res://structures/building-small-b.tres"])
|
||||
open_react_graph = false
|
||||
open_react_table = false
|
||||
react_data = {}
|
||||
react_table_data = {
|
||||
"headers": [],
|
||||
"rows": []
|
||||
}
|
||||
@ -0,0 +1,72 @@
|
||||
shader_type spatial;
|
||||
|
||||
// Parameters for customization
|
||||
uniform float alpha : hint_range(0.0, 1.0) = 0.3;
|
||||
uniform float progress : hint_range(0.0, 1.0) = 0.0; // Construction progress from 0 to 1
|
||||
uniform vec4 fill_color : source_color = vec4(0.2, 0.5, 0.8, 0.3); // Light blue, semi-transparent
|
||||
uniform vec4 outline_color : source_color = vec4(0.0, 0.6, 1.0, 1.0); // Bright blue
|
||||
uniform float outline_width : hint_range(0.0, 0.1) = 0.02;
|
||||
uniform float grid_scale : hint_range(1.0, 50.0) = 20.0;
|
||||
uniform float grid_width : hint_range(0.0, 0.1) = 0.02;
|
||||
|
||||
varying vec3 vertex_pos;
|
||||
varying vec3 normal;
|
||||
|
||||
void vertex() {
|
||||
vertex_pos = VERTEX;
|
||||
normal = NORMAL;
|
||||
}
|
||||
|
||||
float grid(vec2 uv) {
|
||||
vec2 grid = fract(uv * grid_scale);
|
||||
float lines = step(grid_width, grid.x) * step(grid_width, grid.y);
|
||||
return 1.0 - lines;
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
// Calculate fill effect based on vertical position
|
||||
// Map vertex Y position to [0,1] range, ensuring we cover the full model height
|
||||
float height = (vertex_pos.y + 1.0) * 0.5; // First map from [-1,1] to [0,1]
|
||||
height = clamp(height, 0.0, 1.0); // Ensure we stay within [0,1]
|
||||
float fill_threshold = progress;
|
||||
|
||||
// Create the fill effect
|
||||
if (height < fill_threshold) {
|
||||
// Below the fill line - show the fill color
|
||||
ALBEDO = fill_color.rgb;
|
||||
ALPHA = fill_color.a;
|
||||
|
||||
// Add some emission for a glowing effect
|
||||
EMISSION = fill_color.rgb * 0.5;
|
||||
} else {
|
||||
// Above the fill line - show outline only
|
||||
float edge_distance = abs(height - fill_threshold);
|
||||
if (edge_distance < outline_width) {
|
||||
// Draw the outline at the fill level
|
||||
ALBEDO = outline_color.rgb;
|
||||
ALPHA = outline_color.a;
|
||||
EMISSION = outline_color.rgb;
|
||||
} else {
|
||||
// Make the unfilled part transparent
|
||||
ALPHA = alpha * 0.3; // More transparent above the fill line
|
||||
ALBEDO = fill_color.rgb;
|
||||
}
|
||||
}
|
||||
|
||||
// Add grid pattern
|
||||
vec2 uv = vec2(
|
||||
dot(normalize(vertex_pos), vec3(1.0, 0.0, 0.0)),
|
||||
dot(normalize(vertex_pos), vec3(0.0, 1.0, 0.0))
|
||||
);
|
||||
float grid_pattern = grid(uv);
|
||||
EMISSION += fill_color.rgb * grid_pattern * 0.2;
|
||||
|
||||
// Add edge highlighting
|
||||
float fresnel = pow(1.0 - dot(normalize(normal), normalize(VIEW)), 5.0);
|
||||
float outline = step(1.0 - outline_width, fresnel);
|
||||
EMISSION += outline_color.rgb * outline * 2.0;
|
||||
|
||||
// Metallic/Roughness settings for a holographic look
|
||||
METALLIC = 0.8;
|
||||
ROUGHNESS = 0.2;
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
uid://c0il2tgqy8bds
|
||||
@ -0,0 +1,14 @@
|
||||
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://construction_preview_material"]
|
||||
|
||||
[ext_resource type="Shader" path="res://models/Materials/construction_preview.gdshader" id="1_preview"]
|
||||
|
||||
[resource]
|
||||
render_priority = 1
|
||||
shader = ExtResource("1_preview")
|
||||
shader_parameter/alpha = 0.3
|
||||
shader_parameter/progress = 0.0
|
||||
shader_parameter/fill_color = Color(0.2, 0.5, 0.8, 0.3)
|
||||
shader_parameter/outline_color = Color(0.0, 0.6, 1.0, 1.0)
|
||||
shader_parameter/outline_width = 0.02
|
||||
shader_parameter/grid_scale = 20.0
|
||||
shader_parameter/grid_width = 0.02
|
||||
@ -0,0 +1,36 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://crbry5s73b6rw"
|
||||
path.s3tc="res://.godot/imported/colormap.png-212e5588ca846efe35817fd63dff6086.s3tc.ctex"
|
||||
path.etc2="res://.godot/imported/colormap.png-212e5588ca846efe35817fd63dff6086.etc2.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc", "etc2_astc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://people/Textures/colormap.png"
|
||||
dest_files=["res://.godot/imported/colormap.png-212e5588ca846efe35817fd63dff6086.s3tc.ctex", "res://.godot/imported/colormap.png-212e5588ca846efe35817fd63dff6086.etc2.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
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/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,131 @@
|
||||
; Engine configuration file.
|
||||
; It's best edited using the editor UI and not directly,
|
||||
; since the parameters that go here are not all obvious.
|
||||
;
|
||||
; Format:
|
||||
; [section] ; section goes between []
|
||||
; param=value ; assign values to parameters
|
||||
|
||||
config_version=5
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Starter Kit City Builder"
|
||||
config/tags=PackedStringArray("starterkit")
|
||||
run/main_scene="res://scenes/main.tscn"
|
||||
config/features=PackedStringArray("4.4", "Forward Plus")
|
||||
boot_splash/bg_color=Color(0.92549, 0.92549, 0.960784, 1)
|
||||
boot_splash/image="res://splash-screen.png"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[audio]
|
||||
|
||||
general/default_playback_type.web=0
|
||||
|
||||
[autoload]
|
||||
|
||||
SoundManager="*res://scripts/sound_manager.gd"
|
||||
<<<<<<< Updated upstream
|
||||
EventBus="*res://global/event_bus.gd"
|
||||
Globals="*res://global/globals.gd"
|
||||
=======
|
||||
WebSaveManager="*res://scripts/web_save_manager.gd"
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
[display]
|
||||
|
||||
window/size/viewport_width=1920
|
||||
window/size/viewport_height=1080
|
||||
|
||||
[dotnet]
|
||||
|
||||
project/assembly_name="Starter Kit City Builder"
|
||||
|
||||
[editor]
|
||||
|
||||
movie_writer/movie_file="D:/Godot/recording.avi"
|
||||
|
||||
[editor_plugins]
|
||||
|
||||
enabled=PackedStringArray()
|
||||
|
||||
[global_classes]
|
||||
|
||||
LearningPanel="*res://scripts/mission/learning_panel.gd"
|
||||
|
||||
[input]
|
||||
|
||||
build={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(91, 24),"global_position":Vector2(95, 67),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_left={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_right={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_forward={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_back={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
rotate={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(213, 17),"global_position":Vector2(217, 60),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null)
|
||||
]
|
||||
}
|
||||
demolish={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194308,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_rotate={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":4,"position":Vector2(107, 17),"global_position":Vector2(111, 60),"factor":1.0,"button_index":3,"canceled":false,"pressed":true,"double_click":false,"script":null)
|
||||
]
|
||||
}
|
||||
structure_next={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
structure_previous={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
save={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194332,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
load={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194333,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_center={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[rendering]
|
||||
|
||||
textures/vram_compression/import_etc2_astc=true
|
||||
anti_aliasing/quality/msaa_3d=2
|
||||
debug/shapes/navigation/enable_edge_lines=false
|
||||
debug/shapes/navigation/enable_edge_lines.web=false
|
||||
debug/shapes/navigation/enable_geometry_face_random_color=false
|
||||
debug/shapes/navigation/enable_edge_connections=false
|
||||
@ -0,0 +1,131 @@
|
||||
; Engine configuration file.
|
||||
; It's best edited using the editor UI and not directly,
|
||||
; since the parameters that go here are not all obvious.
|
||||
;
|
||||
; Format:
|
||||
; [section] ; section goes between []
|
||||
; param=value ; assign values to parameters
|
||||
|
||||
config_version=5
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Starter Kit City Builder"
|
||||
config/tags=PackedStringArray("starterkit")
|
||||
run/main_scene="res://scenes/main.tscn"
|
||||
config/features=PackedStringArray("4.4", "Forward Plus")
|
||||
boot_splash/bg_color=Color(0.92549, 0.92549, 0.960784, 1)
|
||||
boot_splash/image="res://splash-screen.png"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[audio]
|
||||
|
||||
general/default_playback_type.web=0
|
||||
|
||||
[autoload]
|
||||
|
||||
SoundManager="*res://scripts/sound_manager.gd"
|
||||
<<<<<<< Updated upstream
|
||||
EventBus="*res://global/event_bus.gd"
|
||||
Globals="*res://global/globals.gd"
|
||||
=======
|
||||
WebSaveManager="*res://scripts/web_save_manager.gd"
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
[display]
|
||||
|
||||
window/size/viewport_width=1920
|
||||
window/size/viewport_height=1080
|
||||
|
||||
[dotnet]
|
||||
|
||||
project/assembly_name="Starter Kit City Builder"
|
||||
|
||||
[editor]
|
||||
|
||||
movie_writer/movie_file="D:/Godot/recording.avi"
|
||||
|
||||
[editor_plugins]
|
||||
|
||||
enabled=PackedStringArray()
|
||||
|
||||
[global_classes]
|
||||
|
||||
LearningPanel="*res://scripts/mission/learning_panel.gd"
|
||||
|
||||
[input]
|
||||
|
||||
build={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(91, 24),"global_position":Vector2(95, 67),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_left={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_right={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_forward={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_back={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
rotate={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(213, 17),"global_position":Vector2(217, 60),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null)
|
||||
]
|
||||
}
|
||||
demolish={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194308,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_rotate={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":4,"position":Vector2(107, 17),"global_position":Vector2(111, 60),"factor":1.0,"button_index":3,"canceled":false,"pressed":true,"double_click":false,"script":null)
|
||||
]
|
||||
}
|
||||
structure_next={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
structure_previous={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
save={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194332,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
load={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194333,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
camera_center={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[rendering]
|
||||
|
||||
textures/vram_compression/import_etc2_astc=true
|
||||
anti_aliasing/quality/msaa_3d=2
|
||||
debug/shapes/navigation/enable_edge_lines=false
|
||||
debug/shapes/navigation/enable_edge_lines.web=false
|
||||
debug/shapes/navigation/enable_geometry_face_random_color=false
|
||||
debug/shapes/navigation/enable_edge_connections=false
|
||||
@ -0,0 +1,10 @@
|
||||
[gd_resource type="Resource" script_class="GenericText" load_steps=2 format=3 uid="uid://bljpugjou1cxo"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bt3emc1vt40gq" path="res://resources/generic_text_panel.resource.gd" id="1_resource"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_resource")
|
||||
panel_type = 0
|
||||
title = "Building Selector"
|
||||
body_text = "Select structures to build in your city."
|
||||
button_text = "Close"
|
||||
@ -0,0 +1,39 @@
|
||||
[gd_resource type="Resource" script_class="PatternRules" load_steps=9 format=3 uid="uid://dykbopx8n3c3v"]
|
||||
|
||||
[ext_resource type="Script" path="res://scripts/mission/pattern_rules.gd" id="1_rules"]
|
||||
[ext_resource type="Script" path="res://scripts/mission/pattern_rule.gd" id="2_rule"]
|
||||
[ext_resource type="Resource" uid="uid://d2jplegnkl6u2" path="res://structures/road-corner.tres" id="3_corner"]
|
||||
[ext_resource type="Resource" uid="uid://dv14kkhb6umkv" path="res://structures/road-straight.tres" id="4_straight"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_corner1"]
|
||||
script = ExtResource("2_rule")
|
||||
type = 0
|
||||
offset = Vector2i(0, 0)
|
||||
structure = ExtResource("3_corner")
|
||||
rotation = 0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_straight1"]
|
||||
script = ExtResource("2_rule")
|
||||
type = 0
|
||||
offset = Vector2i(1, 0)
|
||||
structure = ExtResource("4_straight")
|
||||
rotation = 0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_straight2"]
|
||||
script = ExtResource("2_rule")
|
||||
type = 0
|
||||
offset = Vector2i(0, 1)
|
||||
structure = ExtResource("4_straight")
|
||||
rotation = 90
|
||||
|
||||
[sub_resource type="Resource" id="Resource_corner2"]
|
||||
script = ExtResource("2_rule")
|
||||
type = 0
|
||||
offset = Vector2i(1, 1)
|
||||
structure = ExtResource("3_corner")
|
||||
rotation = 180
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_rules")
|
||||
pattern_size = Vector2i(2, 2)
|
||||
rules = Array[ExtResource("2_rule")]([SubResource("Resource_corner1"), SubResource("Resource_straight1"), SubResource("Resource_straight2"), SubResource("Resource_corner2")])
|
||||
@ -0,0 +1,223 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://b4k3xfm8pd8qw"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bsjmj0qu3xfrr" path="res://scripts/building_selector.gd" id="1_jybm7"]
|
||||
[ext_resource type="Resource" uid="uid://bljpugjou1cxo" path="res://resources/building_selector.tres" id="2_resource"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_panel"]
|
||||
bg_color = Color(0.145098, 0.172549, 0.231373, 0.941176)
|
||||
border_width_left = 2
|
||||
border_width_top = 2
|
||||
border_width_right = 2
|
||||
border_width_bottom = 2
|
||||
border_color = Color(0.356863, 0.670588, 0.768627, 1)
|
||||
corner_radius_top_left = 8
|
||||
corner_radius_top_right = 8
|
||||
corner_radius_bottom_right = 8
|
||||
corner_radius_bottom_left = 8
|
||||
|
||||
[node name="BuildingSelector" type="PanelContainer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
mouse_filter = 2
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_panel")
|
||||
script = ExtResource("1_jybm7")
|
||||
resource_data = ExtResource("2_resource")
|
||||
|
||||
[node name="ClickBlocker" type="ColorRect" parent="."]
|
||||
visible = false
|
||||
z_index = 1000
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
color = Color(0, 0, 0, 0.01)
|
||||
|
||||
[node name="MainButton" type="Button" parent="."]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 8
|
||||
size_flags_vertical = 4
|
||||
mouse_filter = 2
|
||||
text = "▶"
|
||||
flat = true
|
||||
|
||||
[node name="SelectionPanel" type="Panel" parent="."]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_panel")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="SelectionPanel"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/margin_left = 10
|
||||
theme_override_constants/margin_top = 10
|
||||
theme_override_constants/margin_right = 10
|
||||
theme_override_constants/margin_bottom = 10
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="SelectionPanel/MarginContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/separation = 10
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="SelectionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="TitleLabel" type="Label" parent="SelectionPanel/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_font_sizes/font_size = 18
|
||||
text = "Building Selector"
|
||||
|
||||
[node name="CloseButton" type="Button" parent="SelectionPanel/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
text = "✕"
|
||||
flat = true
|
||||
|
||||
[node name="SearchBar" type="LineEdit" parent="SelectionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
placeholder_text = "Search structures..."
|
||||
|
||||
[node name="FilterButtons" type="HBoxContainer" parent="SelectionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/separation = 5
|
||||
|
||||
[node name="AllButton" type="Button" parent="SelectionPanel/MarginContainer/VBoxContainer/FilterButtons"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
mouse_filter = 2
|
||||
toggle_mode = true
|
||||
button_pressed = true
|
||||
text = "All"
|
||||
flat = true
|
||||
|
||||
[node name="GroundButton" type="Button" parent="SelectionPanel/MarginContainer/VBoxContainer/FilterButtons"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
mouse_filter = 2
|
||||
toggle_mode = true
|
||||
text = "Ground"
|
||||
flat = true
|
||||
|
||||
[node name="BuildingButton" type="Button" parent="SelectionPanel/MarginContainer/VBoxContainer/FilterButtons"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
mouse_filter = 2
|
||||
toggle_mode = true
|
||||
text = "Buildings"
|
||||
flat = true
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="SelectionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="GroundSection" type="VBoxContainer" parent="SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="Label" type="Label" parent="SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/GroundSection"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 16
|
||||
text = "Ground Structures"
|
||||
|
||||
[node name="GroundOptions" type="GridContainer" parent="SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/GroundSection"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/h_separation = 10
|
||||
theme_override_constants/v_separation = 10
|
||||
columns = 4
|
||||
|
||||
[node name="BuildingSection" type="VBoxContainer" parent="SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="Label" type="Label" parent="SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/BuildingSection"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 16
|
||||
text = "Building Structures"
|
||||
|
||||
[node name="BuildingOptions" type="GridContainer" parent="SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/BuildingSection"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/h_separation = 10
|
||||
theme_override_constants/v_separation = 10
|
||||
columns = 4
|
||||
|
||||
[node name="DescriptionPanel" type="Panel" parent="SelectionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_panel")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/margin_left = 10
|
||||
theme_override_constants/margin_top = 10
|
||||
theme_override_constants/margin_right = 10
|
||||
theme_override_constants/margin_bottom = 10
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/separation = 10
|
||||
|
||||
[node name="TitleLabel" type="Label" parent="SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 18
|
||||
text = "Structure Name"
|
||||
|
||||
[node name="DescriptionLabel" type="Label" parent="SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 14
|
||||
text = "Structure description goes here..."
|
||||
autowrap_mode = 2
|
||||
|
||||
[node name="StatsContainer" type="HBoxContainer" parent="SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
mouse_filter = 2
|
||||
theme_override_constants/separation = 20
|
||||
|
||||
[node name="PriceLabel" type="Label" parent="SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer/StatsContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 14
|
||||
text = "Price: $0"
|
||||
|
||||
[node name="PopulationLabel" type="Label" parent="SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer/StatsContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 14
|
||||
text = "Population: 0"
|
||||
|
||||
[node name="PowerLabel" type="Label" parent="SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer/StatsContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 14
|
||||
text = "Power: 0"
|
||||
|
||||
[connection signal="pressed" from="MainButton" to="." method="_on_main_button_pressed"]
|
||||
[connection signal="pressed" from="SelectionPanel/MarginContainer/VBoxContainer/HBoxContainer/CloseButton" to="." method="hide_panel"]
|
||||
[connection signal="text_changed" from="SelectionPanel/MarginContainer/VBoxContainer/SearchBar" to="." method="_on_search_text_changed"]
|
||||
[connection signal="pressed" from="SelectionPanel/MarginContainer/VBoxContainer/FilterButtons/AllButton" to="." method="_on_filter_button_pressed" binds= ["All"]]
|
||||
[connection signal="pressed" from="SelectionPanel/MarginContainer/VBoxContainer/FilterButtons/GroundButton" to="." method="_on_filter_button_pressed" binds= ["Ground"]]
|
||||
[connection signal="pressed" from="SelectionPanel/MarginContainer/VBoxContainer/FilterButtons/BuildingButton" to="." method="_on_filter_button_pressed" binds= ["Buildings"]]
|
||||
@ -0,0 +1,9 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://c03crmaif3bss"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bat3h7fhpdh7" path="res://scripts/economy_manager.gd" id="1_abcde"]
|
||||
|
||||
[node name="EconomyManager" type="Node"]
|
||||
script = ExtResource("1_abcde")
|
||||
|
||||
[node name="EconomyTimer" type="Timer" parent="."]
|
||||
autostart = true
|
||||
@ -0,0 +1,438 @@
|
||||
[gd_scene load_steps=64 format=3 uid="uid://vgwrcfy1qawf"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c37h6na3e4twn" path="res://scripts/builder.gd" id="1_jybm7"]
|
||||
[ext_resource type="Environment" uid="uid://jbptgqvstei3" path="res://scenes/main-environment.tres" id="1_yndf3"]
|
||||
[ext_resource type="Script" uid="uid://uxn26t1x4ehr" path="res://scripts/structure.gd" id="2_54v6r"]
|
||||
[ext_resource type="Resource" uid="uid://dv14kkhb6umkv" path="res://structures/road-straight.tres" id="2_bwyku"]
|
||||
[ext_resource type="Texture2D" uid="uid://cbk07cxgshg26" path="res://sprites/selector.png" id="4_wr1wv"]
|
||||
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="5_v5o2m"]
|
||||
<<<<<<< Updated upstream
|
||||
[ext_resource type="Resource" uid="uid://ccb475jeg7ym5" path="res://structures/grass-trees.tres" id="6_fwsy4"]
|
||||
[ext_resource type="Script" uid="uid://d3n8yylhejdoh" path="res://scripts/view.gd" id="8_yovpv"]
|
||||
[ext_resource type="Resource" uid="uid://tm532uesguhk" path="res://structures/grass.tres" id="9_2t3p4"]
|
||||
[ext_resource type="Resource" uid="uid://d2jplegnkl6u2" path="res://structures/road-corner.tres" id="10_ii8xx"]
|
||||
[ext_resource type="Script" uid="uid://otnxt4e77gmc" path="res://scripts/mission/mission_manager.gd" id="10_oe3re"]
|
||||
[ext_resource type="Resource" uid="uid://mxrnqinnsqnt" path="res://structures/road-straight-lightposts.tres" id="11_20frt"]
|
||||
[ext_resource type="Resource" uid="uid://c4qbn3d85prxx" path="res://structures/power-plant.tres" id="12_xtc7p"]
|
||||
[ext_resource type="PackedScene" uid="uid://dmsy06s02tcw4" path="res://scenes/generic_text_panel.tscn" id="13_7i6dj"]
|
||||
[ext_resource type="Script" uid="uid://ctqqmg4ydlbse" path="res://scripts/mission/mission_ui.gd" id="13_xvw5w"]
|
||||
[ext_resource type="Script" uid="uid://bt3emc1vt40gq" path="res://resources/generic_text_panel.resource.gd" id="14_76jlq"]
|
||||
[ext_resource type="Script" uid="uid://dnquivpg0ead" path="res://scripts/mission/learning_panel.gd" id="14_q2ymb"]
|
||||
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="14_vcrh8"]
|
||||
[ext_resource type="Resource" uid="uid://x5h4xutbldq3" path="res://mission/unit_1.02/census_planning_1.tres" id="15_obmwc"]
|
||||
[ext_resource type="Resource" uid="uid://cjr36hqnmyn0x" path="res://mission/unit_1.02/census_planning_2.tres" id="16_rl54y"]
|
||||
[ext_resource type="Resource" uid="uid://dykbopx8n3c3v" path="res://mission/unit_1.02/census_planning_3.tres" id="17_rrdy6"]
|
||||
=======
|
||||
[ext_resource type="Resource" uid="uid://d2jplegnkl6u2" path="res://structures/road-corner.tres" id="7_2wyq8"]
|
||||
[ext_resource type="Script" uid="uid://cu76h00erned0" path="res://scripts/view.gd" id="8_yovpv"]
|
||||
[ext_resource type="Script" uid="uid://bnpqjt5n1s20m" path="res://scripts/mission/mission_manager.gd" id="10_oe3re"]
|
||||
[ext_resource type="PackedScene" uid="uid://c03crmaif3bss" path="res://scenes/economy_manager.tscn" id="11_2f3dj"]
|
||||
[ext_resource type="PackedScene" uid="uid://dmsy06s02tcw4" path="res://scenes/generic_text_panel.tscn" id="13_7i6dj"]
|
||||
[ext_resource type="Script" uid="uid://bxuxhmlcqp64g" path="res://scripts/mission/mission_ui.gd" id="13_xvw5w"]
|
||||
[ext_resource type="Script" uid="uid://d1rme8o0ewiet" path="res://resources/generic_text_panel.resource.gd" id="14_76jlq"]
|
||||
[ext_resource type="Script" uid="uid://52tdmmosdbpa" path="res://scripts/mission/learning_panel.gd" id="14_q2ymb"]
|
||||
[ext_resource type="Script" uid="uid://c6f12a8vs3hp6" path="res://scripts/mission/mission_data.gd" id="14_vcrh8"]
|
||||
[ext_resource type="Resource" uid="uid://x5h4xutbldq3" path="res://mission/first_mission.tres" id="15_obmwc"]
|
||||
[ext_resource type="Resource" uid="uid://cjr36hqnmyn0x" path="res://mission/second_mission.tres" id="16_rl54y"]
|
||||
>>>>>>> Stashed changes
|
||||
[ext_resource type="FontFile" uid="uid://d0cxd77jybrcn" path="res://fonts/lilita_one_regular.ttf" id="17_vlub6"]
|
||||
[ext_resource type="PackedScene" uid="uid://b4gkfwf4i3ydl" path="res://scenes/character.tscn" id="18_8lrh8"]
|
||||
[ext_resource type="PackedScene" uid="uid://cgk66f6rg03mj" path="res://scenes/hud.tscn" id="18_hud"]
|
||||
[ext_resource type="PackedScene" uid="uid://bqjnp7uypupog" path="res://scenes/controls_panel.tscn" id="19_controls"]
|
||||
<<<<<<< Updated upstream
|
||||
[ext_resource type="Script" uid="uid://b5nubrdeseay4" path="res://scripts/game_manager.gd" id="20_game_manager"]
|
||||
[ext_resource type="Resource" uid="uid://442cwthak2pa" path="res://mission/unit_1.02/market_research_1.tres" id="20_ngu16"]
|
||||
[ext_resource type="PackedScene" uid="uid://b4s46k58ddpyc" path="res://scenes/sound_panel.tscn" id="21_sound_panel"]
|
||||
[ext_resource type="Resource" uid="uid://dtal0tl2ee336" path="res://structures/store.tres" id="21_y11qv"]
|
||||
[ext_resource type="Resource" uid="uid://bom5bu47dy5kp" path="res://mission/unit_1.02/market_research_2.tres" id="24_xud6a"]
|
||||
[ext_resource type="Resource" uid="uid://csrqvfwp63ygr" path="res://mission/unit_1.02/market_research_3.tres" id="25_6hx7u"]
|
||||
[ext_resource type="Resource" uid="uid://qwiwim2pg88f" path="res://mission/unit_1.02/market_research_4.tres" id="26_lvk23"]
|
||||
[ext_resource type="PackedScene" uid="uid://cb2rylpbex3ep" path="res://models/building-arcology.glb" id="27_m8wco"]
|
||||
[ext_resource type="Resource" uid="uid://cfgw8dblm55c5" path="res://mission/unit_1.03_1.05/grid_growth_1.tres" id="27_s0e58"]
|
||||
[ext_resource type="Resource" uid="uid://ba3ndftq7dht7" path="res://mission/unit_1.03_1.05/grid_growth_2.tres" id="28_hurxs"]
|
||||
[ext_resource type="Resource" uid="uid://dgimr2v12rjqu" path="res://mission/unit_1.03_1.05/grid_growth_3.tres" id="29_rhn1n"]
|
||||
[ext_resource type="Resource" uid="uid://dm2o4dq2oml53" path="res://mission/unit_1.03_1.05/grid_growth_4.tres" id="30_4rwkv"]
|
||||
[ext_resource type="Resource" uid="uid://btwrfq37q8vey" path="res://mission/unit_1.03_1.05/traffic_flow_1.tres" id="31_j2idb"]
|
||||
[ext_resource type="Resource" uid="uid://cf7gpb4j7gq1g" path="res://mission/unit_1.03_1.05/traffic_flow_2.tres" id="32_ipu0c"]
|
||||
[ext_resource type="Resource" uid="uid://ddmxjjyxgxyxo" path="res://mission/unit_1.03_1.05/traffic_flow_3.tres" id="33_c0l5e"]
|
||||
[ext_resource type="Resource" uid="uid://doxd30r8qbgdq" path="res://mission/unit_1.03_1.05/traffic_flow_4.tres" id="34_21t20"]
|
||||
[ext_resource type="Resource" uid="uid://duaxn13myfx22" path="res://mission/unit_1.06/sustainable_dev_1.tres" id="35_o0bjh"]
|
||||
[ext_resource type="Resource" uid="uid://fuxb3pfbbwjm" path="res://mission/unit_1.06/sustainable_dev_2.tres" id="36_2wodh"]
|
||||
[ext_resource type="Resource" uid="uid://byd5jxiutxpky" path="res://mission/unit_1.06/sustainable_dev_3.tres" id="37_psgx1"]
|
||||
[ext_resource type="Resource" uid="uid://daug1o7kppqit" path="res://mission/unit_1.06/sustainable_dev_4.tres" id="38_hw762"]
|
||||
[ext_resource type="Resource" uid="uid://cp7tcpktwlrkt" path="res://mission/unit_1.06/urban_planning_1.tres" id="39_ymw5p"]
|
||||
[ext_resource type="Resource" uid="uid://c3q1afcvwi4rk" path="res://mission/unit_1.06/urban_planning_2.tres" id="40_uggp1"]
|
||||
[ext_resource type="Resource" uid="uid://ct1k7n2oopwdu" path="res://mission/unit_1.06/urban_planning_3.tres" id="41_f0dxf"]
|
||||
[ext_resource type="Resource" uid="uid://d1fykuxfmh2q1" path="res://mission/unit_1.06/urban_planning_4.tres" id="42_fv8gl"]
|
||||
[ext_resource type="Resource" uid="uid://detwnqsq87r30" path="res://mission/unit_1.07/economic_forecast_1.tres" id="43_qvne6"]
|
||||
[ext_resource type="Resource" uid="uid://bj7tjuknfaeyg" path="res://mission/unit_1.07/economic_forecast_2.tres" id="44_haub2"]
|
||||
[ext_resource type="Resource" uid="uid://ctyrlnq5cxuiu" path="res://mission/unit_1.07/economic_forecast_3.tres" id="45_xs8xk"]
|
||||
[ext_resource type="Resource" uid="uid://ct45gjmw5b7pa" path="res://mission/unit_1.07/economic_forecast_4.tres" id="46_pob6d"]
|
||||
[ext_resource type="Resource" uid="uid://bwrkqv42wk8f" path="res://mission/unit_1.07/resource_alloc_1.tres" id="47_6w4y8"]
|
||||
[ext_resource type="Resource" uid="uid://d0nblitd4ixir" path="res://mission/unit_1.07/resource_alloc_2.tres" id="48_ck35a"]
|
||||
[ext_resource type="Resource" uid="uid://cxh8dgf54oimx" path="res://mission/unit_1.07/resource_alloc_3.tres" id="49_cvgxw"]
|
||||
[ext_resource type="Resource" uid="uid://cpfr2xnjtpcog" path="res://mission/unit_1.07/resource_alloc_4.tres" id="50_6ke0d"]
|
||||
=======
|
||||
[ext_resource type="Script" uid="uid://dlqco4kmwr3er" path="res://scripts/game_manager.gd" id="20_game_manager"]
|
||||
[ext_resource type="Resource" uid="uid://bv4r7ebpjdce4" path="res://mission/sixth_mission.tres" id="20_r0ysx"]
|
||||
[ext_resource type="PackedScene" uid="uid://b4s46k58ddpyc" path="res://scenes/sound_panel.tscn" id="21_sound_panel"]
|
||||
[ext_resource type="PackedScene" uid="uid://b4k3xfm8pd8qw" path="res://scenes/building_selector.tscn" id="22_building_selector"]
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
[sub_resource type="Resource" id="Resource_1gdbm"]
|
||||
script = ExtResource("14_76jlq")
|
||||
panel_type = 0
|
||||
title = "Welcome to Stem City "
|
||||
body_text = "Welcome to Stem City!
|
||||
|
||||
Your goal is to build a thriving community from the ground up. As you complete missions, you'll unlock new structures to expand and improve your city.
|
||||
|
||||
As the new city planner, you need to establish a baseline understanding of your growing community. The mayor has requested a comprehensive census to guide future development.
|
||||
|
||||
|
||||
|
||||
|
||||
Ready to start planning your city? Click Close to see the controls and begin your first mission!
|
||||
|
||||
|
||||
"
|
||||
button_text = "Close"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ja86h"]
|
||||
script = ExtResource("14_76jlq")
|
||||
panel_type = 1
|
||||
title = "Welcome to Stem City"
|
||||
body_text = "Congratulations, City Planner!
|
||||
|
||||
You've completed all the guided missions and unlocked the full potential of Stem City. Your understanding of urban planning and STEM concepts has helped create a thriving community.
|
||||
|
||||
But the journey doesn't end here! Continue expanding your city using all the structures you've unlocked. Experiment with different layouts, create new neighborhoods, and see how large you can grow your population.
|
||||
|
||||
The future of Stem City is now in your hands - keep building and exploring!
|
||||
"
|
||||
button_text = "Close"
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mission"]
|
||||
bg_color = Color(0.145098, 0.172549, 0.231373, 0.941176)
|
||||
border_width_left = 2
|
||||
border_width_top = 2
|
||||
border_width_right = 2
|
||||
border_width_bottom = 2
|
||||
border_color = Color(0.356863, 0.670588, 0.768627, 1)
|
||||
corner_radius_top_left = 8
|
||||
corner_radius_top_right = 8
|
||||
corner_radius_bottom_right = 8
|
||||
corner_radius_bottom_left = 8
|
||||
shadow_size = 5
|
||||
shadow_offset = Vector2(2, 2)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lsmd5"]
|
||||
bg_color = Color(0.196078, 0.196078, 0.196078, 0.960784)
|
||||
border_width_left = 2
|
||||
border_width_top = 2
|
||||
border_width_right = 2
|
||||
border_width_bottom = 2
|
||||
border_color = Color(0.294118, 0.478431, 0.729412, 1)
|
||||
corner_radius_top_left = 8
|
||||
corner_radius_top_right = 8
|
||||
corner_radius_bottom_right = 8
|
||||
corner_radius_bottom_left = 8
|
||||
shadow_size = 5
|
||||
shadow_offset = Vector2(3, 3)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_description"]
|
||||
bg_color = Color(0.145098, 0.145098, 0.164706, 0.768627)
|
||||
border_width_left = 1
|
||||
border_width_top = 1
|
||||
border_width_right = 1
|
||||
border_width_bottom = 1
|
||||
border_color = Color(0.294118, 0.478431, 0.729412, 0.301961)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_graph"]
|
||||
bg_color = Color(0.117647, 0.137255, 0.160784, 0.768627)
|
||||
border_width_left = 1
|
||||
border_width_top = 1
|
||||
border_width_right = 1
|
||||
border_width_bottom = 1
|
||||
border_color = Color(0.294118, 0.478431, 0.729412, 0.301961)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[node name="Main" type="Node3D"]
|
||||
script = ExtResource("20_game_manager")
|
||||
intro_text_resource = SubResource("Resource_1gdbm")
|
||||
outro_text_resource = SubResource("Resource_ja86h")
|
||||
|
||||
[node name="Builder" type="Node3D" parent="." node_paths=PackedStringArray("selector", "selector_container", "view_camera", "gridmap")]
|
||||
script = ExtResource("1_jybm7")
|
||||
<<<<<<< Updated upstream
|
||||
structures = Array[ExtResource("2_54v6r")]([ExtResource("2_bwyku"), ExtResource("5_v5o2m"), ExtResource("6_fwsy4"), ExtResource("21_y11qv"), ExtResource("9_2t3p4"), ExtResource("10_ii8xx"), ExtResource("11_20frt"), ExtResource("12_xtc7p")])
|
||||
=======
|
||||
structures = Array[ExtResource("2_54v6r")]([ExtResource("2_bwyku"), ExtResource("5_v5o2m"), ExtResource("7_2wyq8")])
|
||||
>>>>>>> Stashed changes
|
||||
selector = NodePath("Selector")
|
||||
selector_container = NodePath("Selector/Container")
|
||||
view_camera = NodePath("../View/Camera")
|
||||
gridmap = NodePath("../GridMap")
|
||||
|
||||
[node name="Selector" type="Node3D" parent="Builder"]
|
||||
|
||||
[node name="Sprite" type="Sprite3D" parent="Builder/Selector"]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.06, 0)
|
||||
texture = ExtResource("4_wr1wv")
|
||||
|
||||
[node name="Container" type="Node3D" parent="Builder/Selector"]
|
||||
|
||||
[node name="View" type="Node3D" parent="."]
|
||||
transform = Transform3D(0.707107, -0.40558, 0.579228, 0, 0.819152, 0.573576, -0.707107, -0.40558, 0.579228, 0, 0, 0)
|
||||
script = ExtResource("8_yovpv")
|
||||
|
||||
[node name="Camera" type="Camera3D" parent="View"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 7.15256e-07, 0, 0, 1, 0, 27.98, 49.5918)
|
||||
environment = ExtResource("1_yndf3")
|
||||
fov = 20.0
|
||||
|
||||
[node name="EconomyManager" parent="." instance=ExtResource("11_2f3dj")]
|
||||
|
||||
[node name="GridMap" type="GridMap" parent="."]
|
||||
cell_size = Vector3(1, 1, 1)
|
||||
cell_center_x = false
|
||||
cell_center_y = false
|
||||
cell_center_z = false
|
||||
|
||||
[node name="Sun" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766045, 0.642787, 0, 0, 0)
|
||||
light_energy = 2.0
|
||||
light_indirect_energy = 3.0
|
||||
light_volumetric_fog_energy = 3.07
|
||||
shadow_enabled = true
|
||||
shadow_opacity = 0.75
|
||||
|
||||
[node name="CanvasLayer" type="CanvasLayer" parent="."]
|
||||
|
||||
[node name="HUD" parent="CanvasLayer" instance=ExtResource("18_hud")]
|
||||
|
||||
[node name="BuildingSelector" parent="CanvasLayer" instance=ExtResource("22_building_selector")]
|
||||
anchors_preset = 0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
offset_left = 20.0
|
||||
offset_top = 100.0
|
||||
offset_right = 220.0
|
||||
offset_bottom = 200.0
|
||||
grow_horizontal = 1
|
||||
grow_vertical = 1
|
||||
|
||||
[node name="ControlsPanel" parent="CanvasLayer" instance=ExtResource("19_controls")]
|
||||
|
||||
[node name="SoundPanel" parent="CanvasLayer" instance=ExtResource("21_sound_panel")]
|
||||
anchors_preset = 8
|
||||
|
||||
[node name="GenericTextPanel" parent="CanvasLayer" instance=ExtResource("13_7i6dj")]
|
||||
resource_data = ExtResource("14_76jlq")
|
||||
|
||||
[node name="MissionManager" type="Node" parent="." node_paths=PackedStringArray("mission_ui", "builder")]
|
||||
script = ExtResource("10_oe3re")
|
||||
<<<<<<< Updated upstream
|
||||
missions = Array[ExtResource("14_vcrh8")]([ExtResource("15_obmwc"), ExtResource("16_rl54y"), ExtResource("17_rrdy6"), ExtResource("20_ngu16"), ExtResource("24_xud6a"), ExtResource("25_6hx7u"), ExtResource("26_lvk23"), ExtResource("27_s0e58"), ExtResource("28_hurxs"), ExtResource("29_rhn1n"), ExtResource("30_4rwkv"), ExtResource("31_j2idb"), ExtResource("32_ipu0c"), ExtResource("33_c0l5e"), ExtResource("34_21t20"), ExtResource("35_o0bjh"), ExtResource("36_2wodh"), ExtResource("37_psgx1"), ExtResource("38_hw762"), ExtResource("39_ymw5p"), ExtResource("40_uggp1"), ExtResource("41_f0dxf"), ExtResource("42_fv8gl"), ExtResource("43_qvne6"), ExtResource("44_haub2"), ExtResource("45_xs8xk"), ExtResource("46_pob6d"), ExtResource("47_6w4y8"), ExtResource("48_ck35a"), ExtResource("49_cvgxw"), ExtResource("50_6ke0d")])
|
||||
=======
|
||||
missions = Array[ExtResource("14_vcrh8")]([ExtResource("15_obmwc"), ExtResource("16_rl54y"), ExtResource("18_h4fpv"), ExtResource("20_r0ysx")])
|
||||
>>>>>>> Stashed changes
|
||||
mission_ui = NodePath("MissionPanel")
|
||||
builder = NodePath("../Builder")
|
||||
character_scene = ExtResource("18_8lrh8")
|
||||
|
||||
[node name="MissionPanel" type="PanelContainer" parent="MissionManager" node_paths=PackedStringArray("mission_title_label", "mission_description_label", "objectives_container")]
|
||||
anchors_preset = 1
|
||||
anchor_left = 1.0
|
||||
anchor_right = 1.0
|
||||
offset_left = -450.0
|
||||
offset_top = 20.0
|
||||
offset_right = -20.0
|
||||
grow_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_mission")
|
||||
script = ExtResource("13_xvw5w")
|
||||
mission_title_label = NodePath("MarginContainer/VBoxContainer/MissionTitleLabel")
|
||||
mission_description_label = NodePath("MarginContainer/VBoxContainer/MissionDescriptionLabel")
|
||||
objectives_container = NodePath("MarginContainer/VBoxContainer/ObjectivesContainer")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MissionManager/MissionPanel"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 20
|
||||
theme_override_constants/margin_top = 20
|
||||
theme_override_constants/margin_right = 20
|
||||
theme_override_constants/margin_bottom = 20
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MissionManager/MissionPanel/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
theme_override_constants/separation = 15
|
||||
|
||||
[node name="MissionTitleLabel" type="Label" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_fonts/font = ExtResource("17_vlub6")
|
||||
theme_override_font_sizes/font_size = 24
|
||||
text = "Mission Title"
|
||||
horizontal_alignment = 1
|
||||
autowrap_mode = 2
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="MissionDescriptionLabel" type="Label" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 1
|
||||
theme_override_font_sizes/font_size = 16
|
||||
text = "Mission description goes here..."
|
||||
autowrap_mode = 2
|
||||
text_overrun_behavior = 4
|
||||
|
||||
[node name="HSeparator2" type="HSeparator" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ObjectivesLabel" type="Label" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0.678431, 0.847059, 1, 1)
|
||||
theme_override_font_sizes/font_size = 18
|
||||
text = "Objectives:"
|
||||
|
||||
[node name="ObjectivesContainer" type="VBoxContainer" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
theme_override_constants/separation = 10
|
||||
|
||||
[node name="LearningPanel" type="PanelContainer" parent="MissionManager"]
|
||||
visible = false
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = 50.0
|
||||
offset_top = 50.0
|
||||
offset_right = -50.0
|
||||
offset_bottom = -50.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_lsmd5")
|
||||
script = ExtResource("14_q2ymb")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MissionManager/LearningPanel"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 30
|
||||
theme_override_constants/margin_top = 30
|
||||
theme_override_constants/margin_right = 30
|
||||
theme_override_constants/margin_bottom = 30
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MissionManager/LearningPanel/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
theme_override_constants/separation = 20
|
||||
|
||||
[node name="TitleLabel" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_fonts/font = ExtResource("17_vlub6")
|
||||
theme_override_font_sizes/font_size = 32
|
||||
text = "Learning Module"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="DescriptionPanel" type="PanelContainer" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
size_flags_stretch_ratio = 0.5
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_description")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/DescriptionPanel"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 15
|
||||
theme_override_constants/margin_top = 15
|
||||
theme_override_constants/margin_right = 15
|
||||
theme_override_constants/margin_bottom = 15
|
||||
|
||||
[node name="DescriptionLabel" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_font_sizes/font_size = 20
|
||||
text = "Description goes here..."
|
||||
autowrap_mode = 2
|
||||
|
||||
[node name="GraphTitle" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 24
|
||||
text = "Graph:"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="GraphContainer" type="Panel" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
custom_minimum_size = Vector2(0, 300)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
size_flags_stretch_ratio = 2.0
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_graph")
|
||||
|
||||
[node name="AnswerContainer" type="VBoxContainer" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/separation = 10
|
||||
|
||||
[node name="QuestionLabel" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/AnswerContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 18
|
||||
text = "How many workers do we need to build 10 houses in a week?"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="AnswerField" type="LineEdit" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/AnswerContainer"]
|
||||
custom_minimum_size = Vector2(150, 40)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
theme_override_font_sizes/font_size = 18
|
||||
placeholder_text = "Enter answer"
|
||||
alignment = 1
|
||||
max_length = 5
|
||||
|
||||
[node name="CheckButton" type="Button" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/AnswerContainer"]
|
||||
custom_minimum_size = Vector2(150, 40)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
theme_override_font_sizes/font_size = 16
|
||||
text = "Check Answer"
|
||||
|
||||
[node name="FeedbackLabel" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/AnswerContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_font_sizes/font_size = 18
|
||||
horizontal_alignment = 1
|
||||
autowrap_mode = 2
|
||||
text_overrun_behavior = 3
|
||||
max_lines_visible = 6
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="CompleteButton" type="Button" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
custom_minimum_size = Vector2(200, 50)
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 18
|
||||
disabled = true
|
||||
text = "Complete"
|
||||
|
||||
[node name="ObjectiveLabel" type="Label" parent="MissionManager"]
|
||||
offset_right = 40.0
|
||||
offset_bottom = 23.0
|
||||
|
||||
[node name="building-arcology2" parent="." instance=ExtResource("27_m8wco")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -16, -14)
|
||||
|
||||
[connection signal="all_missions_completed" from="MissionManager" to="." method="_on_mission_manager_all_missions_completed"]
|
||||
[connection signal="mission_started" from="MissionManager" to="." method="_on_mission_manager_mission_started"]
|
||||
[connection signal="pressed" from="MissionManager/LearningPanel/MarginContainer/VBoxContainer/HBoxContainer/CompleteButton" to="MissionManager/LearningPanel" method="_on_complete_button_pressed"]
|
||||
@ -0,0 +1,438 @@
|
||||
[gd_scene load_steps=64 format=3 uid="uid://vgwrcfy1qawf"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c37h6na3e4twn" path="res://scripts/builder.gd" id="1_jybm7"]
|
||||
[ext_resource type="Environment" uid="uid://jbptgqvstei3" path="res://scenes/main-environment.tres" id="1_yndf3"]
|
||||
[ext_resource type="Script" uid="uid://uxn26t1x4ehr" path="res://scripts/structure.gd" id="2_54v6r"]
|
||||
[ext_resource type="Resource" uid="uid://dv14kkhb6umkv" path="res://structures/road-straight.tres" id="2_bwyku"]
|
||||
[ext_resource type="Texture2D" uid="uid://cbk07cxgshg26" path="res://sprites/selector.png" id="4_wr1wv"]
|
||||
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="5_v5o2m"]
|
||||
<<<<<<< Updated upstream
|
||||
[ext_resource type="Resource" uid="uid://ccb475jeg7ym5" path="res://structures/grass-trees.tres" id="6_fwsy4"]
|
||||
[ext_resource type="Script" uid="uid://d3n8yylhejdoh" path="res://scripts/view.gd" id="8_yovpv"]
|
||||
[ext_resource type="Resource" uid="uid://tm532uesguhk" path="res://structures/grass.tres" id="9_2t3p4"]
|
||||
[ext_resource type="Resource" uid="uid://d2jplegnkl6u2" path="res://structures/road-corner.tres" id="10_ii8xx"]
|
||||
[ext_resource type="Script" uid="uid://otnxt4e77gmc" path="res://scripts/mission/mission_manager.gd" id="10_oe3re"]
|
||||
[ext_resource type="Resource" uid="uid://mxrnqinnsqnt" path="res://structures/road-straight-lightposts.tres" id="11_20frt"]
|
||||
[ext_resource type="Resource" uid="uid://c4qbn3d85prxx" path="res://structures/power-plant.tres" id="12_xtc7p"]
|
||||
[ext_resource type="PackedScene" uid="uid://dmsy06s02tcw4" path="res://scenes/generic_text_panel.tscn" id="13_7i6dj"]
|
||||
[ext_resource type="Script" uid="uid://ctqqmg4ydlbse" path="res://scripts/mission/mission_ui.gd" id="13_xvw5w"]
|
||||
[ext_resource type="Script" uid="uid://bt3emc1vt40gq" path="res://resources/generic_text_panel.resource.gd" id="14_76jlq"]
|
||||
[ext_resource type="Script" uid="uid://dnquivpg0ead" path="res://scripts/mission/learning_panel.gd" id="14_q2ymb"]
|
||||
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="14_vcrh8"]
|
||||
[ext_resource type="Resource" uid="uid://x5h4xutbldq3" path="res://mission/unit_1.02/census_planning_1.tres" id="15_obmwc"]
|
||||
[ext_resource type="Resource" uid="uid://cjr36hqnmyn0x" path="res://mission/unit_1.02/census_planning_2.tres" id="16_rl54y"]
|
||||
[ext_resource type="Resource" uid="uid://dykbopx8n3c3v" path="res://mission/unit_1.02/census_planning_3.tres" id="17_rrdy6"]
|
||||
=======
|
||||
[ext_resource type="Resource" uid="uid://d2jplegnkl6u2" path="res://structures/road-corner.tres" id="7_2wyq8"]
|
||||
[ext_resource type="Script" uid="uid://cu76h00erned0" path="res://scripts/view.gd" id="8_yovpv"]
|
||||
[ext_resource type="Script" uid="uid://bnpqjt5n1s20m" path="res://scripts/mission/mission_manager.gd" id="10_oe3re"]
|
||||
[ext_resource type="PackedScene" uid="uid://c03crmaif3bss" path="res://scenes/economy_manager.tscn" id="11_2f3dj"]
|
||||
[ext_resource type="PackedScene" uid="uid://dmsy06s02tcw4" path="res://scenes/generic_text_panel.tscn" id="13_7i6dj"]
|
||||
[ext_resource type="Script" uid="uid://bxuxhmlcqp64g" path="res://scripts/mission/mission_ui.gd" id="13_xvw5w"]
|
||||
[ext_resource type="Script" uid="uid://d1rme8o0ewiet" path="res://resources/generic_text_panel.resource.gd" id="14_76jlq"]
|
||||
[ext_resource type="Script" uid="uid://52tdmmosdbpa" path="res://scripts/mission/learning_panel.gd" id="14_q2ymb"]
|
||||
[ext_resource type="Script" uid="uid://c6f12a8vs3hp6" path="res://scripts/mission/mission_data.gd" id="14_vcrh8"]
|
||||
[ext_resource type="Resource" uid="uid://x5h4xutbldq3" path="res://mission/first_mission.tres" id="15_obmwc"]
|
||||
[ext_resource type="Resource" uid="uid://cjr36hqnmyn0x" path="res://mission/second_mission.tres" id="16_rl54y"]
|
||||
>>>>>>> Stashed changes
|
||||
[ext_resource type="FontFile" uid="uid://d0cxd77jybrcn" path="res://fonts/lilita_one_regular.ttf" id="17_vlub6"]
|
||||
[ext_resource type="PackedScene" uid="uid://b4gkfwf4i3ydl" path="res://scenes/character.tscn" id="18_8lrh8"]
|
||||
[ext_resource type="PackedScene" uid="uid://cgk66f6rg03mj" path="res://scenes/hud.tscn" id="18_hud"]
|
||||
[ext_resource type="PackedScene" uid="uid://bqjnp7uypupog" path="res://scenes/controls_panel.tscn" id="19_controls"]
|
||||
<<<<<<< Updated upstream
|
||||
[ext_resource type="Script" uid="uid://b5nubrdeseay4" path="res://scripts/game_manager.gd" id="20_game_manager"]
|
||||
[ext_resource type="Resource" uid="uid://442cwthak2pa" path="res://mission/unit_1.02/market_research_1.tres" id="20_ngu16"]
|
||||
[ext_resource type="PackedScene" uid="uid://b4s46k58ddpyc" path="res://scenes/sound_panel.tscn" id="21_sound_panel"]
|
||||
[ext_resource type="Resource" uid="uid://dtal0tl2ee336" path="res://structures/store.tres" id="21_y11qv"]
|
||||
[ext_resource type="Resource" uid="uid://bom5bu47dy5kp" path="res://mission/unit_1.02/market_research_2.tres" id="24_xud6a"]
|
||||
[ext_resource type="Resource" uid="uid://csrqvfwp63ygr" path="res://mission/unit_1.02/market_research_3.tres" id="25_6hx7u"]
|
||||
[ext_resource type="Resource" uid="uid://qwiwim2pg88f" path="res://mission/unit_1.02/market_research_4.tres" id="26_lvk23"]
|
||||
[ext_resource type="PackedScene" uid="uid://cb2rylpbex3ep" path="res://models/building-arcology.glb" id="27_m8wco"]
|
||||
[ext_resource type="Resource" uid="uid://cfgw8dblm55c5" path="res://mission/unit_1.03_1.05/grid_growth_1.tres" id="27_s0e58"]
|
||||
[ext_resource type="Resource" uid="uid://ba3ndftq7dht7" path="res://mission/unit_1.03_1.05/grid_growth_2.tres" id="28_hurxs"]
|
||||
[ext_resource type="Resource" uid="uid://dgimr2v12rjqu" path="res://mission/unit_1.03_1.05/grid_growth_3.tres" id="29_rhn1n"]
|
||||
[ext_resource type="Resource" uid="uid://dm2o4dq2oml53" path="res://mission/unit_1.03_1.05/grid_growth_4.tres" id="30_4rwkv"]
|
||||
[ext_resource type="Resource" uid="uid://btwrfq37q8vey" path="res://mission/unit_1.03_1.05/traffic_flow_1.tres" id="31_j2idb"]
|
||||
[ext_resource type="Resource" uid="uid://cf7gpb4j7gq1g" path="res://mission/unit_1.03_1.05/traffic_flow_2.tres" id="32_ipu0c"]
|
||||
[ext_resource type="Resource" uid="uid://ddmxjjyxgxyxo" path="res://mission/unit_1.03_1.05/traffic_flow_3.tres" id="33_c0l5e"]
|
||||
[ext_resource type="Resource" uid="uid://doxd30r8qbgdq" path="res://mission/unit_1.03_1.05/traffic_flow_4.tres" id="34_21t20"]
|
||||
[ext_resource type="Resource" uid="uid://duaxn13myfx22" path="res://mission/unit_1.06/sustainable_dev_1.tres" id="35_o0bjh"]
|
||||
[ext_resource type="Resource" uid="uid://fuxb3pfbbwjm" path="res://mission/unit_1.06/sustainable_dev_2.tres" id="36_2wodh"]
|
||||
[ext_resource type="Resource" uid="uid://byd5jxiutxpky" path="res://mission/unit_1.06/sustainable_dev_3.tres" id="37_psgx1"]
|
||||
[ext_resource type="Resource" uid="uid://daug1o7kppqit" path="res://mission/unit_1.06/sustainable_dev_4.tres" id="38_hw762"]
|
||||
[ext_resource type="Resource" uid="uid://cp7tcpktwlrkt" path="res://mission/unit_1.06/urban_planning_1.tres" id="39_ymw5p"]
|
||||
[ext_resource type="Resource" uid="uid://c3q1afcvwi4rk" path="res://mission/unit_1.06/urban_planning_2.tres" id="40_uggp1"]
|
||||
[ext_resource type="Resource" uid="uid://ct1k7n2oopwdu" path="res://mission/unit_1.06/urban_planning_3.tres" id="41_f0dxf"]
|
||||
[ext_resource type="Resource" uid="uid://d1fykuxfmh2q1" path="res://mission/unit_1.06/urban_planning_4.tres" id="42_fv8gl"]
|
||||
[ext_resource type="Resource" uid="uid://detwnqsq87r30" path="res://mission/unit_1.07/economic_forecast_1.tres" id="43_qvne6"]
|
||||
[ext_resource type="Resource" uid="uid://bj7tjuknfaeyg" path="res://mission/unit_1.07/economic_forecast_2.tres" id="44_haub2"]
|
||||
[ext_resource type="Resource" uid="uid://ctyrlnq5cxuiu" path="res://mission/unit_1.07/economic_forecast_3.tres" id="45_xs8xk"]
|
||||
[ext_resource type="Resource" uid="uid://ct45gjmw5b7pa" path="res://mission/unit_1.07/economic_forecast_4.tres" id="46_pob6d"]
|
||||
[ext_resource type="Resource" uid="uid://bwrkqv42wk8f" path="res://mission/unit_1.07/resource_alloc_1.tres" id="47_6w4y8"]
|
||||
[ext_resource type="Resource" uid="uid://d0nblitd4ixir" path="res://mission/unit_1.07/resource_alloc_2.tres" id="48_ck35a"]
|
||||
[ext_resource type="Resource" uid="uid://cxh8dgf54oimx" path="res://mission/unit_1.07/resource_alloc_3.tres" id="49_cvgxw"]
|
||||
[ext_resource type="Resource" uid="uid://cpfr2xnjtpcog" path="res://mission/unit_1.07/resource_alloc_4.tres" id="50_6ke0d"]
|
||||
=======
|
||||
[ext_resource type="Script" uid="uid://dlqco4kmwr3er" path="res://scripts/game_manager.gd" id="20_game_manager"]
|
||||
[ext_resource type="Resource" uid="uid://bv4r7ebpjdce4" path="res://mission/sixth_mission.tres" id="20_r0ysx"]
|
||||
[ext_resource type="PackedScene" uid="uid://b4s46k58ddpyc" path="res://scenes/sound_panel.tscn" id="21_sound_panel"]
|
||||
[ext_resource type="PackedScene" uid="uid://b4k3xfm8pd8qw" path="res://scenes/building_selector.tscn" id="22_building_selector"]
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
[sub_resource type="Resource" id="Resource_1gdbm"]
|
||||
script = ExtResource("14_76jlq")
|
||||
panel_type = 0
|
||||
title = "Welcome to Stem City "
|
||||
body_text = "Welcome to Stem City!
|
||||
|
||||
Your goal is to build a thriving community from the ground up. As you complete missions, you'll unlock new structures to expand and improve your city.
|
||||
|
||||
As the new city planner, you need to establish a baseline understanding of your growing community. The mayor has requested a comprehensive census to guide future development.
|
||||
|
||||
|
||||
|
||||
|
||||
Ready to start planning your city? Click Close to see the controls and begin your first mission!
|
||||
|
||||
|
||||
"
|
||||
button_text = "Close"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ja86h"]
|
||||
script = ExtResource("14_76jlq")
|
||||
panel_type = 1
|
||||
title = "Welcome to Stem City"
|
||||
body_text = "Congratulations, City Planner!
|
||||
|
||||
You've completed all the guided missions and unlocked the full potential of Stem City. Your understanding of urban planning and STEM concepts has helped create a thriving community.
|
||||
|
||||
But the journey doesn't end here! Continue expanding your city using all the structures you've unlocked. Experiment with different layouts, create new neighborhoods, and see how large you can grow your population.
|
||||
|
||||
The future of Stem City is now in your hands - keep building and exploring!
|
||||
"
|
||||
button_text = "Close"
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mission"]
|
||||
bg_color = Color(0.145098, 0.172549, 0.231373, 0.941176)
|
||||
border_width_left = 2
|
||||
border_width_top = 2
|
||||
border_width_right = 2
|
||||
border_width_bottom = 2
|
||||
border_color = Color(0.356863, 0.670588, 0.768627, 1)
|
||||
corner_radius_top_left = 8
|
||||
corner_radius_top_right = 8
|
||||
corner_radius_bottom_right = 8
|
||||
corner_radius_bottom_left = 8
|
||||
shadow_size = 5
|
||||
shadow_offset = Vector2(2, 2)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lsmd5"]
|
||||
bg_color = Color(0.196078, 0.196078, 0.196078, 0.960784)
|
||||
border_width_left = 2
|
||||
border_width_top = 2
|
||||
border_width_right = 2
|
||||
border_width_bottom = 2
|
||||
border_color = Color(0.294118, 0.478431, 0.729412, 1)
|
||||
corner_radius_top_left = 8
|
||||
corner_radius_top_right = 8
|
||||
corner_radius_bottom_right = 8
|
||||
corner_radius_bottom_left = 8
|
||||
shadow_size = 5
|
||||
shadow_offset = Vector2(3, 3)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_description"]
|
||||
bg_color = Color(0.145098, 0.145098, 0.164706, 0.768627)
|
||||
border_width_left = 1
|
||||
border_width_top = 1
|
||||
border_width_right = 1
|
||||
border_width_bottom = 1
|
||||
border_color = Color(0.294118, 0.478431, 0.729412, 0.301961)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_graph"]
|
||||
bg_color = Color(0.117647, 0.137255, 0.160784, 0.768627)
|
||||
border_width_left = 1
|
||||
border_width_top = 1
|
||||
border_width_right = 1
|
||||
border_width_bottom = 1
|
||||
border_color = Color(0.294118, 0.478431, 0.729412, 0.301961)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[node name="Main" type="Node3D"]
|
||||
script = ExtResource("20_game_manager")
|
||||
intro_text_resource = SubResource("Resource_1gdbm")
|
||||
outro_text_resource = SubResource("Resource_ja86h")
|
||||
|
||||
[node name="Builder" type="Node3D" parent="." node_paths=PackedStringArray("selector", "selector_container", "view_camera", "gridmap")]
|
||||
script = ExtResource("1_jybm7")
|
||||
<<<<<<< Updated upstream
|
||||
structures = Array[ExtResource("2_54v6r")]([ExtResource("2_bwyku"), ExtResource("5_v5o2m"), ExtResource("6_fwsy4"), ExtResource("21_y11qv"), ExtResource("9_2t3p4"), ExtResource("10_ii8xx"), ExtResource("11_20frt"), ExtResource("12_xtc7p")])
|
||||
=======
|
||||
structures = Array[ExtResource("2_54v6r")]([ExtResource("2_bwyku"), ExtResource("5_v5o2m"), ExtResource("7_2wyq8")])
|
||||
>>>>>>> Stashed changes
|
||||
selector = NodePath("Selector")
|
||||
selector_container = NodePath("Selector/Container")
|
||||
view_camera = NodePath("../View/Camera")
|
||||
gridmap = NodePath("../GridMap")
|
||||
|
||||
[node name="Selector" type="Node3D" parent="Builder"]
|
||||
|
||||
[node name="Sprite" type="Sprite3D" parent="Builder/Selector"]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.06, 0)
|
||||
texture = ExtResource("4_wr1wv")
|
||||
|
||||
[node name="Container" type="Node3D" parent="Builder/Selector"]
|
||||
|
||||
[node name="View" type="Node3D" parent="."]
|
||||
transform = Transform3D(0.707107, -0.40558, 0.579228, 0, 0.819152, 0.573576, -0.707107, -0.40558, 0.579228, 0, 0, 0)
|
||||
script = ExtResource("8_yovpv")
|
||||
|
||||
[node name="Camera" type="Camera3D" parent="View"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 7.15256e-07, 0, 0, 1, 0, 27.98, 49.5918)
|
||||
environment = ExtResource("1_yndf3")
|
||||
fov = 20.0
|
||||
|
||||
[node name="EconomyManager" parent="." instance=ExtResource("11_2f3dj")]
|
||||
|
||||
[node name="GridMap" type="GridMap" parent="."]
|
||||
cell_size = Vector3(1, 1, 1)
|
||||
cell_center_x = false
|
||||
cell_center_y = false
|
||||
cell_center_z = false
|
||||
|
||||
[node name="Sun" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766045, 0.642787, 0, 0, 0)
|
||||
light_energy = 2.0
|
||||
light_indirect_energy = 3.0
|
||||
light_volumetric_fog_energy = 3.07
|
||||
shadow_enabled = true
|
||||
shadow_opacity = 0.75
|
||||
|
||||
[node name="CanvasLayer" type="CanvasLayer" parent="."]
|
||||
|
||||
[node name="HUD" parent="CanvasLayer" instance=ExtResource("18_hud")]
|
||||
|
||||
[node name="BuildingSelector" parent="CanvasLayer" instance=ExtResource("22_building_selector")]
|
||||
anchors_preset = 0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
offset_left = 20.0
|
||||
offset_top = 100.0
|
||||
offset_right = 220.0
|
||||
offset_bottom = 200.0
|
||||
grow_horizontal = 1
|
||||
grow_vertical = 1
|
||||
|
||||
[node name="ControlsPanel" parent="CanvasLayer" instance=ExtResource("19_controls")]
|
||||
|
||||
[node name="SoundPanel" parent="CanvasLayer" instance=ExtResource("21_sound_panel")]
|
||||
anchors_preset = 8
|
||||
|
||||
[node name="GenericTextPanel" parent="CanvasLayer" instance=ExtResource("13_7i6dj")]
|
||||
resource_data = ExtResource("14_76jlq")
|
||||
|
||||
[node name="MissionManager" type="Node" parent="." node_paths=PackedStringArray("mission_ui", "builder")]
|
||||
script = ExtResource("10_oe3re")
|
||||
<<<<<<< Updated upstream
|
||||
missions = Array[ExtResource("14_vcrh8")]([ExtResource("15_obmwc"), ExtResource("16_rl54y"), ExtResource("17_rrdy6"), ExtResource("20_ngu16"), ExtResource("24_xud6a"), ExtResource("25_6hx7u"), ExtResource("26_lvk23"), ExtResource("27_s0e58"), ExtResource("28_hurxs"), ExtResource("29_rhn1n"), ExtResource("30_4rwkv"), ExtResource("31_j2idb"), ExtResource("32_ipu0c"), ExtResource("33_c0l5e"), ExtResource("34_21t20"), ExtResource("35_o0bjh"), ExtResource("36_2wodh"), ExtResource("37_psgx1"), ExtResource("38_hw762"), ExtResource("39_ymw5p"), ExtResource("40_uggp1"), ExtResource("41_f0dxf"), ExtResource("42_fv8gl"), ExtResource("43_qvne6"), ExtResource("44_haub2"), ExtResource("45_xs8xk"), ExtResource("46_pob6d"), ExtResource("47_6w4y8"), ExtResource("48_ck35a"), ExtResource("49_cvgxw"), ExtResource("50_6ke0d")])
|
||||
=======
|
||||
missions = Array[ExtResource("14_vcrh8")]([ExtResource("15_obmwc"), ExtResource("16_rl54y"), ExtResource("18_h4fpv"), ExtResource("20_r0ysx")])
|
||||
>>>>>>> Stashed changes
|
||||
mission_ui = NodePath("MissionPanel")
|
||||
builder = NodePath("../Builder")
|
||||
character_scene = ExtResource("18_8lrh8")
|
||||
|
||||
[node name="MissionPanel" type="PanelContainer" parent="MissionManager" node_paths=PackedStringArray("mission_title_label", "mission_description_label", "objectives_container")]
|
||||
anchors_preset = 1
|
||||
anchor_left = 1.0
|
||||
anchor_right = 1.0
|
||||
offset_left = -450.0
|
||||
offset_top = 20.0
|
||||
offset_right = -20.0
|
||||
grow_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_mission")
|
||||
script = ExtResource("13_xvw5w")
|
||||
mission_title_label = NodePath("MarginContainer/VBoxContainer/MissionTitleLabel")
|
||||
mission_description_label = NodePath("MarginContainer/VBoxContainer/MissionDescriptionLabel")
|
||||
objectives_container = NodePath("MarginContainer/VBoxContainer/ObjectivesContainer")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MissionManager/MissionPanel"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 20
|
||||
theme_override_constants/margin_top = 20
|
||||
theme_override_constants/margin_right = 20
|
||||
theme_override_constants/margin_bottom = 20
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MissionManager/MissionPanel/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
theme_override_constants/separation = 15
|
||||
|
||||
[node name="MissionTitleLabel" type="Label" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_fonts/font = ExtResource("17_vlub6")
|
||||
theme_override_font_sizes/font_size = 24
|
||||
text = "Mission Title"
|
||||
horizontal_alignment = 1
|
||||
autowrap_mode = 2
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="MissionDescriptionLabel" type="Label" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 1
|
||||
theme_override_font_sizes/font_size = 16
|
||||
text = "Mission description goes here..."
|
||||
autowrap_mode = 2
|
||||
text_overrun_behavior = 4
|
||||
|
||||
[node name="HSeparator2" type="HSeparator" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ObjectivesLabel" type="Label" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0.678431, 0.847059, 1, 1)
|
||||
theme_override_font_sizes/font_size = 18
|
||||
text = "Objectives:"
|
||||
|
||||
[node name="ObjectivesContainer" type="VBoxContainer" parent="MissionManager/MissionPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
theme_override_constants/separation = 10
|
||||
|
||||
[node name="LearningPanel" type="PanelContainer" parent="MissionManager"]
|
||||
visible = false
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = 50.0
|
||||
offset_top = 50.0
|
||||
offset_right = -50.0
|
||||
offset_bottom = -50.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_lsmd5")
|
||||
script = ExtResource("14_q2ymb")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MissionManager/LearningPanel"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 30
|
||||
theme_override_constants/margin_top = 30
|
||||
theme_override_constants/margin_right = 30
|
||||
theme_override_constants/margin_bottom = 30
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MissionManager/LearningPanel/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
theme_override_constants/separation = 20
|
||||
|
||||
[node name="TitleLabel" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_fonts/font = ExtResource("17_vlub6")
|
||||
theme_override_font_sizes/font_size = 32
|
||||
text = "Learning Module"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="DescriptionPanel" type="PanelContainer" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
size_flags_stretch_ratio = 0.5
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_description")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/DescriptionPanel"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 15
|
||||
theme_override_constants/margin_top = 15
|
||||
theme_override_constants/margin_right = 15
|
||||
theme_override_constants/margin_bottom = 15
|
||||
|
||||
[node name="DescriptionLabel" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_font_sizes/font_size = 20
|
||||
text = "Description goes here..."
|
||||
autowrap_mode = 2
|
||||
|
||||
[node name="GraphTitle" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 24
|
||||
text = "Graph:"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="GraphContainer" type="Panel" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
custom_minimum_size = Vector2(0, 300)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
size_flags_stretch_ratio = 2.0
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_graph")
|
||||
|
||||
[node name="AnswerContainer" type="VBoxContainer" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/separation = 10
|
||||
|
||||
[node name="QuestionLabel" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/AnswerContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 18
|
||||
text = "How many workers do we need to build 10 houses in a week?"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="AnswerField" type="LineEdit" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/AnswerContainer"]
|
||||
custom_minimum_size = Vector2(150, 40)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
theme_override_font_sizes/font_size = 18
|
||||
placeholder_text = "Enter answer"
|
||||
alignment = 1
|
||||
max_length = 5
|
||||
|
||||
[node name="CheckButton" type="Button" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/AnswerContainer"]
|
||||
custom_minimum_size = Vector2(150, 40)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
theme_override_font_sizes/font_size = 16
|
||||
text = "Check Answer"
|
||||
|
||||
[node name="FeedbackLabel" type="Label" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/AnswerContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_font_sizes/font_size = 18
|
||||
horizontal_alignment = 1
|
||||
autowrap_mode = 2
|
||||
text_overrun_behavior = 3
|
||||
max_lines_visible = 6
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="CompleteButton" type="Button" parent="MissionManager/LearningPanel/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
custom_minimum_size = Vector2(200, 50)
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 18
|
||||
disabled = true
|
||||
text = "Complete"
|
||||
|
||||
[node name="ObjectiveLabel" type="Label" parent="MissionManager"]
|
||||
offset_right = 40.0
|
||||
offset_bottom = 23.0
|
||||
|
||||
[node name="building-arcology2" parent="." instance=ExtResource("27_m8wco")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -16, -14)
|
||||
|
||||
[connection signal="all_missions_completed" from="MissionManager" to="." method="_on_mission_manager_all_missions_completed"]
|
||||
[connection signal="mission_started" from="MissionManager" to="." method="_on_mission_manager_mission_started"]
|
||||
[connection signal="pressed" from="MissionManager/LearningPanel/MarginContainer/VBoxContainer/HBoxContainer/CompleteButton" to="MissionManager/LearningPanel" method="_on_complete_button_pressed"]
|
||||
@ -0,0 +1,44 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://blfrsgh3cct2l"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cprx4wmn43sgk" path="res://scripts/structure_menu.gd" id="1_structure_menu"]
|
||||
|
||||
[node name="StructureMenu" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 0
|
||||
offset_right = 300.0
|
||||
offset_bottom = 600.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_structure_menu")
|
||||
|
||||
[node name="MenuPanel" type="Panel" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="MenuPanel"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
horizontal_scroll_mode = 0
|
||||
|
||||
[node name="ItemsContainer" type="HBoxContainer" parent="MenuPanel/ScrollContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_constants/separation = 10
|
||||
|
||||
[node name="ToggleButton" type="Button" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 1
|
||||
anchor_left = 1.0
|
||||
anchor_right = 1.0
|
||||
offset_right = 40.0
|
||||
offset_bottom = 40.0
|
||||
grow_horizontal = 0
|
||||
text = ">"
|
||||
@ -0,0 +1,56 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://b6x8v0j6y5n3q"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dnquivpg0ead" path="res://scripts/mission/learning_panel.gd" id="1_2k4m3"]
|
||||
|
||||
[node name="LearningPanel" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_2k4m3")
|
||||
|
||||
[node name="PanelContainer" type="PanelContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 20
|
||||
theme_override_constants/margin_top = 20
|
||||
theme_override_constants/margin_right = 20
|
||||
theme_override_constants/margin_bottom = 20
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer/ScrollContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_constants/separation = 20
|
||||
|
||||
[node name="TitleLabel" type="Label" parent="PanelContainer/MarginContainer/ScrollContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 24
|
||||
text = "Learning Panel"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="ContentLabel" type="Label" parent="PanelContainer/MarginContainer/ScrollContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Welcome to the learning panel!"
|
||||
autowrap_mode = 3
|
||||
|
||||
[node name="SubmitButtonContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/ScrollContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="SubmitButton" type="Button" parent="PanelContainer/MarginContainer/ScrollContainer/VBoxContainer/SubmitButtonContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
text = "Submit"
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,483 @@
|
||||
extends PanelContainer
|
||||
|
||||
const GenericText = preload("res://resources/generic_text_panel.resource.gd")
|
||||
|
||||
signal closed
|
||||
|
||||
@export var resource_data: GenericText
|
||||
|
||||
@onready var main_button: Button = $MainButton
|
||||
@onready var selection_panel: Panel = $SelectionPanel
|
||||
@onready var ground_options = $SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/GroundSection/GroundOptions
|
||||
@onready var building_options = $SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/BuildingSection/BuildingOptions
|
||||
@onready var search_bar: LineEdit = $SelectionPanel/MarginContainer/VBoxContainer/SearchBar
|
||||
@onready var filter_buttons: HBoxContainer = $SelectionPanel/MarginContainer/VBoxContainer/FilterButtons
|
||||
@onready var description_panel: Panel = $SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel
|
||||
@onready var title_label: Label = $SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer/TitleLabel
|
||||
@onready var description_label: Label = $SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer/DescriptionLabel
|
||||
@onready var price_label: Label = $SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer/StatsContainer/PriceLabel
|
||||
@onready var population_label: Label = $SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer/StatsContainer/PopulationLabel
|
||||
@onready var power_label: Label = $SelectionPanel/MarginContainer/VBoxContainer/DescriptionPanel/MarginContainer/VBoxContainer/StatsContainer/PowerLabel
|
||||
@onready var click_blocker: ColorRect = $ClickBlocker
|
||||
|
||||
var builder: Node
|
||||
var current_selection: int = 0
|
||||
var is_panel_visible: bool = false
|
||||
var current_filter: String = "All"
|
||||
var search_text: String = ""
|
||||
var slide_tween: Tween
|
||||
var tween: Tween
|
||||
|
||||
func _ready() -> void:
|
||||
# Hide the panel initially
|
||||
visible = false
|
||||
|
||||
# Make sure this control blocks mouse input from passing through
|
||||
mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
|
||||
# Initialize the panel state
|
||||
if selection_panel:
|
||||
selection_panel.visible = false
|
||||
selection_panel.position = Vector2(0, 0) # Reset position
|
||||
selection_panel.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
selection_panel.size = Vector2(300, get_viewport_rect().size.y) # Set a fixed width
|
||||
|
||||
# Set up click blocker
|
||||
if click_blocker:
|
||||
click_blocker.visible = false
|
||||
click_blocker.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
click_blocker.size = get_viewport_rect().size
|
||||
click_blocker.position = Vector2.ZERO
|
||||
click_blocker.z_index = 1000 # Ensure it's above everything else
|
||||
|
||||
# Create background panel for the main button
|
||||
var button_bg = ColorRect.new()
|
||||
button_bg.color = Color(0, 0, 0, 0.7) # Semi-transparent black
|
||||
button_bg.size = Vector2(40, 40) # Slightly larger than the button
|
||||
button_bg.position = Vector2(-5, -5) # Offset to center the button
|
||||
button_bg.mouse_filter = Control.MOUSE_FILTER_STOP # Block clicks on background
|
||||
add_child(button_bg)
|
||||
button_bg.z_index = -1 # Place behind the button
|
||||
|
||||
if main_button:
|
||||
main_button.text = "▶"
|
||||
main_button.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
# Set initial position to stick to the right side
|
||||
main_button.position.x = 0
|
||||
# Center the button vertically
|
||||
main_button.position.y = get_viewport_rect().size.y / 2 - 20
|
||||
# Style the button
|
||||
main_button.add_theme_color_override("font_color", Color(1, 1, 1)) # White text
|
||||
main_button.add_theme_font_size_override("font_size", 24) # Larger font
|
||||
|
||||
# Connect signals
|
||||
if main_button and not main_button.pressed.is_connected(_on_main_button_pressed):
|
||||
main_button.pressed.connect(_on_main_button_pressed)
|
||||
if search_bar and not search_bar.text_changed.is_connected(_on_search_text_changed):
|
||||
search_bar.text_changed.connect(_on_search_text_changed)
|
||||
|
||||
for button in filter_buttons.get_children():
|
||||
if button is Button and not button.pressed.is_connected(_on_filter_button_pressed.bind(button.text)):
|
||||
button.pressed.connect(_on_filter_button_pressed.bind(button.text))
|
||||
|
||||
# Set mouse filters for containers
|
||||
if ground_options:
|
||||
ground_options.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
if building_options:
|
||||
building_options.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
|
||||
# Create initial buttons if builder is set
|
||||
if builder:
|
||||
_create_filter_buttons()
|
||||
_create_option_buttons()
|
||||
|
||||
# Apply resource data if available
|
||||
if resource_data:
|
||||
apply_resource_data(resource_data)
|
||||
|
||||
func show_panel() -> void:
|
||||
visible = true
|
||||
is_panel_visible = true
|
||||
selection_panel.visible = true
|
||||
click_blocker.visible = true
|
||||
main_button.text = "◀"
|
||||
|
||||
# Create tween for smooth animation
|
||||
if tween:
|
||||
tween.kill()
|
||||
tween = create_tween()
|
||||
|
||||
# Panel is opening
|
||||
selection_panel.position.x = -selection_panel.size.x
|
||||
tween.tween_property(selection_panel, "position:x", 0, 0.2)
|
||||
tween.parallel().tween_property(main_button, "position:x", selection_panel.size.x, 0.2)
|
||||
|
||||
# Pause the game when the panel is open
|
||||
get_tree().paused = true
|
||||
|
||||
func hide_panel() -> void:
|
||||
is_panel_visible = false
|
||||
|
||||
# Create tween for smooth animation
|
||||
if tween:
|
||||
tween.kill()
|
||||
tween = create_tween()
|
||||
|
||||
# Panel is closing
|
||||
tween.tween_property(selection_panel, "position:x", -selection_panel.size.x, 0.2)
|
||||
tween.parallel().tween_property(main_button, "position:x", 0, 0.2)
|
||||
tween.tween_callback(func():
|
||||
selection_panel.visible = false
|
||||
click_blocker.visible = false
|
||||
main_button.text = "▶"
|
||||
visible = false
|
||||
# Resume the game when the panel is closed
|
||||
get_tree().paused = false
|
||||
# Emit signal that panel was closed
|
||||
closed.emit()
|
||||
)
|
||||
|
||||
func _on_main_button_pressed() -> void:
|
||||
if !selection_panel or !main_button or !click_blocker:
|
||||
return
|
||||
|
||||
if !is_panel_visible:
|
||||
show_panel()
|
||||
else:
|
||||
hide_panel()
|
||||
|
||||
func _create_filter_buttons():
|
||||
if not filter_buttons or not builder:
|
||||
return
|
||||
|
||||
# Clear existing buttons
|
||||
for child in filter_buttons.get_children():
|
||||
child.queue_free()
|
||||
|
||||
# Create "All" button
|
||||
var all_button = Button.new()
|
||||
all_button.text = "All"
|
||||
all_button.toggle_mode = true
|
||||
all_button.button_pressed = true
|
||||
all_button.flat = true
|
||||
all_button.pressed.connect(_on_filter_button_pressed.bind("All"))
|
||||
filter_buttons.add_child(all_button)
|
||||
|
||||
# Get unique structure types
|
||||
var structure_types = {}
|
||||
for structure in builder.get_structures():
|
||||
if structure.type == Structure.StructureType.TERRAIN:
|
||||
structure_types["Ground"] = true
|
||||
else:
|
||||
structure_types["Buildings"] = true
|
||||
|
||||
# Create buttons for each structure type
|
||||
for type_name in structure_types.keys():
|
||||
var button = Button.new()
|
||||
button.text = type_name
|
||||
button.toggle_mode = true
|
||||
button.flat = true
|
||||
button.pressed.connect(_on_filter_button_pressed.bind(type_name))
|
||||
filter_buttons.add_child(button)
|
||||
|
||||
func _create_option_buttons():
|
||||
# Clear existing buttons
|
||||
if ground_options:
|
||||
for child in ground_options.get_children():
|
||||
child.queue_free()
|
||||
if building_options:
|
||||
for child in building_options.get_children():
|
||||
child.queue_free()
|
||||
|
||||
# Get structures from builder
|
||||
if not builder:
|
||||
print("ERROR: No builder reference in building selector")
|
||||
return
|
||||
|
||||
var structures = builder.get_structures()
|
||||
if not structures or structures.size() == 0:
|
||||
print("WARNING: No structures available in builder")
|
||||
return
|
||||
|
||||
# Create ground options (grass, pavement, etc.)
|
||||
var ground_structures = []
|
||||
var building_structures = []
|
||||
|
||||
# Sort structures by type and apply filters
|
||||
for structure in structures:
|
||||
if not structure:
|
||||
continue
|
||||
|
||||
# Apply search filter
|
||||
if search_text != "" and not structure.title.to_lower().contains(search_text.to_lower()):
|
||||
continue
|
||||
|
||||
# Apply type filter
|
||||
if current_filter != "All":
|
||||
match current_filter:
|
||||
"Ground":
|
||||
if structure.type != Structure.StructureType.TERRAIN:
|
||||
continue
|
||||
"Buildings":
|
||||
if structure.type == Structure.StructureType.TERRAIN:
|
||||
continue
|
||||
|
||||
# Add to appropriate list
|
||||
if structure.type == Structure.StructureType.TERRAIN:
|
||||
ground_structures.append(structure)
|
||||
else:
|
||||
building_structures.append(structure)
|
||||
|
||||
# Set up grid layout for ground options
|
||||
if ground_options:
|
||||
ground_options.columns = 4
|
||||
ground_options.add_theme_constant_override("h_separation", 10)
|
||||
ground_options.add_theme_constant_override("v_separation", 10)
|
||||
|
||||
# Create buttons for ground structures
|
||||
for i in range(ground_structures.size()):
|
||||
var button = _create_option_button(ground_structures[i], i)
|
||||
if ground_options:
|
||||
ground_options.add_child(button)
|
||||
|
||||
# Set up grid layout for building options
|
||||
if building_options:
|
||||
building_options.columns = 4
|
||||
building_options.add_theme_constant_override("h_separation", 10)
|
||||
building_options.add_theme_constant_override("v_separation", 10)
|
||||
|
||||
# Create buttons for building structures
|
||||
for i in range(building_structures.size()):
|
||||
var button = _create_option_button(building_structures[i], i + ground_structures.size())
|
||||
if building_options:
|
||||
building_options.add_child(button)
|
||||
|
||||
# Hide sections if they have no options
|
||||
var ground_section = $SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/GroundSection
|
||||
var building_section = $SelectionPanel/MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/BuildingSection
|
||||
|
||||
if ground_section:
|
||||
ground_section.visible = ground_structures.size() > 0
|
||||
if building_section:
|
||||
building_section.visible = building_structures.size() > 0
|
||||
|
||||
# Force update the layout
|
||||
if ground_options:
|
||||
ground_options.queue_redraw()
|
||||
if building_options:
|
||||
building_options.queue_redraw()
|
||||
|
||||
func _create_option_button(structure: Structure, index: int) -> Button:
|
||||
var button = Button.new()
|
||||
button.custom_minimum_size = Vector2(70, 70) # Reduced from 80x80
|
||||
button.toggle_mode = true
|
||||
button.button_group = ButtonGroup.new()
|
||||
button.tooltip_text = structure.description
|
||||
|
||||
# Create container for button contents
|
||||
var container = VBoxContainer.new()
|
||||
container.alignment = BoxContainer.AlignmentMode.ALIGNMENT_CENTER
|
||||
container.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
container.add_theme_constant_override("separation", 2) # Reduce spacing between elements
|
||||
button.add_child(container)
|
||||
|
||||
# Create preview container
|
||||
var preview_container = Control.new()
|
||||
preview_container.custom_minimum_size = Vector2(50, 50) # Reduced from 64x64
|
||||
container.add_child(preview_container)
|
||||
|
||||
# Add preview image or model
|
||||
if structure.thumbnail and structure.thumbnail != "Thumbnail" and ResourceLoader.exists(structure.thumbnail):
|
||||
var preview = TextureRect.new()
|
||||
var texture = load(structure.thumbnail)
|
||||
preview.texture = texture
|
||||
preview.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
preview.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||||
preview.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_COVERED
|
||||
preview.custom_minimum_size = Vector2(50, 50) # Force minimum size
|
||||
preview.expand_mode = TextureRect.EXPAND_FIT_WIDTH_PROPORTIONAL # Maintain aspect ratio while fitting width
|
||||
preview_container.add_child(preview)
|
||||
else:
|
||||
var viewport = SubViewport.new()
|
||||
viewport.size = Vector2i(50, 50) # Reduced from 64x64
|
||||
viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
|
||||
viewport.transparent_bg = true
|
||||
preview_container.add_child(viewport)
|
||||
|
||||
var camera = Camera3D.new()
|
||||
camera.position = Vector3(0, 0, 2)
|
||||
camera.look_at(Vector3.ZERO)
|
||||
viewport.add_child(camera)
|
||||
|
||||
if structure.model:
|
||||
var model = structure.model.instantiate()
|
||||
viewport.add_child(model)
|
||||
|
||||
# Add structure name
|
||||
var name_label = Label.new()
|
||||
name_label.text = structure.title
|
||||
name_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
name_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
||||
name_label.autowrap_mode = TextServer.AUTOWRAP_WORD
|
||||
name_label.max_lines_visible = 2
|
||||
name_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
name_label.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
||||
container.add_child(name_label)
|
||||
|
||||
# Add price label
|
||||
var price_label = Label.new()
|
||||
price_label.text = "$" + str(structure.price)
|
||||
price_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
price_label.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
||||
container.add_child(price_label)
|
||||
|
||||
# Add lock overlay if structure is locked
|
||||
if not structure.unlocked:
|
||||
var lock_overlay = ColorRect.new()
|
||||
lock_overlay.color = Color(0, 0, 0, 0.5)
|
||||
lock_overlay.size = preview_container.size
|
||||
preview_container.add_child(lock_overlay)
|
||||
|
||||
var lock_icon = TextureRect.new()
|
||||
lock_icon.texture = load("res://textures/lock.png")
|
||||
lock_icon.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
lock_icon.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||||
lock_icon.stretch_mode = TextureRect.StretchMode.STRETCH_KEEP_ASPECT_CENTERED
|
||||
lock_icon.size = Vector2(30, 30) # Reduced from 40x40
|
||||
lock_icon.position = Vector2(10, 10) # Adjusted position
|
||||
preview_container.add_child(lock_icon)
|
||||
|
||||
# Disable button if structure is locked
|
||||
button.disabled = true
|
||||
|
||||
button.pressed.connect(_on_option_selected.bind(index))
|
||||
return button
|
||||
|
||||
func _on_search_text_changed(new_text: String) -> void:
|
||||
search_text = new_text
|
||||
_create_option_buttons()
|
||||
|
||||
func _on_filter_button_pressed(filter: String) -> void:
|
||||
current_filter = filter
|
||||
_create_option_buttons()
|
||||
|
||||
func _on_option_selected(index: int):
|
||||
if not builder:
|
||||
print("ERROR: No builder reference in building selector")
|
||||
return
|
||||
|
||||
var structures = builder.get_structures()
|
||||
if not structures or index < 0 or index >= structures.size():
|
||||
print("ERROR: Invalid structure index: ", index)
|
||||
return
|
||||
|
||||
current_selection = index
|
||||
_update_button_states()
|
||||
|
||||
# Update the builder's current selection
|
||||
builder.index = index
|
||||
builder.update_structure()
|
||||
|
||||
# Update the main button text
|
||||
main_button.text = "Selected: " + _get_structure_name(index)
|
||||
|
||||
# Update description panel
|
||||
_update_description_panel(index)
|
||||
|
||||
func _update_button_states():
|
||||
# Update all buttons to show which one is selected
|
||||
if not ground_options or not building_options:
|
||||
return
|
||||
|
||||
var all_buttons = []
|
||||
|
||||
# Add ground options buttons if they exist
|
||||
for child in ground_options.get_children():
|
||||
if child is Button:
|
||||
all_buttons.append(child)
|
||||
|
||||
# Add building options buttons if they exist
|
||||
for child in building_options.get_children():
|
||||
if child is Button:
|
||||
all_buttons.append(child)
|
||||
|
||||
# Update button states
|
||||
for i in range(all_buttons.size()):
|
||||
if all_buttons[i] is Button:
|
||||
all_buttons[i].button_pressed = (i == current_selection)
|
||||
|
||||
func _get_structure_name(index: int) -> String:
|
||||
var structures = builder.get_structures()
|
||||
if structures and index >= 0 and index < structures.size():
|
||||
var structure = structures[index]
|
||||
return structure.title
|
||||
return "Unknown"
|
||||
|
||||
func _update_description_panel(index: int):
|
||||
var structures = builder.get_structures()
|
||||
if not structures or index < 0 or index >= structures.size():
|
||||
title_label.text = "No Building Selected"
|
||||
description_label.text = "Select a building to view its details"
|
||||
price_label.text = "Price: $0"
|
||||
population_label.text = "Population: 0"
|
||||
power_label.text = "Power: 0 kW"
|
||||
return
|
||||
|
||||
var structure = structures[index]
|
||||
title_label.text = structure.title
|
||||
description_label.text = structure.description
|
||||
price_label.text = "Price: $" + str(structure.price)
|
||||
population_label.text = "Population: " + str(structure.population_count)
|
||||
|
||||
var power_text = "Power: "
|
||||
if structure.kW_production > 0:
|
||||
power_text += "+" + str(structure.kW_production) + " kW"
|
||||
elif structure.kW_usage > 0:
|
||||
power_text += "-" + str(structure.kW_usage) + " kW"
|
||||
else:
|
||||
power_text += "0 kW"
|
||||
power_label.text = power_text
|
||||
|
||||
func apply_resource_data(data: GenericText) -> void:
|
||||
if data:
|
||||
if title_label:
|
||||
title_label.text = data.title
|
||||
if description_label:
|
||||
description_label.text = data.body_text
|
||||
|
||||
# Override _gui_input to ensure we're handling all input
|
||||
func _gui_input(event: InputEvent) -> void:
|
||||
if is_panel_visible:
|
||||
# When panel is visible, accept all input to prevent it from reaching the game
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
# Override _input to catch all input events
|
||||
func _input(event: InputEvent) -> void:
|
||||
if is_panel_visible and (event is InputEventMouseButton or event is InputEventMouseMotion):
|
||||
# When panel is visible, accept all mouse input to prevent it from reaching the game
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
# If it's a mouse button press, mark it as handled
|
||||
if event is InputEventMouseButton:
|
||||
event.pressed = false
|
||||
|
||||
# Override _unhandled_input to catch any remaining input events
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if is_panel_visible:
|
||||
get_viewport().set_input_as_handled()
|
||||
if event is InputEventMouseButton:
|
||||
event.pressed = false
|
||||
|
||||
# Override _get_global_rect to ensure the builder's UI check detects us
|
||||
func _get_global_rect() -> Rect2:
|
||||
if is_panel_visible:
|
||||
return Rect2(Vector2.ZERO, get_viewport_rect().size)
|
||||
return Rect2(Vector2.ZERO, Vector2.ZERO)
|
||||
|
||||
# Add a method to check if the mouse is over our panel
|
||||
func is_mouse_over_building_selector() -> bool:
|
||||
if is_panel_visible:
|
||||
var mouse_pos = get_viewport().get_mouse_position()
|
||||
var rect = get_global_rect()
|
||||
return rect.has_point(mouse_pos)
|
||||
return false
|
||||
@ -0,0 +1 @@
|
||||
uid://bsjmj0qu3xfrr
|
||||
@ -0,0 +1,93 @@
|
||||
extends Node
|
||||
|
||||
# Resource parameters
|
||||
var money: float = 1000.0
|
||||
var population: int = 0
|
||||
var energy_consumption: float = 0.0
|
||||
var energy_production: float = 0.0
|
||||
|
||||
# Economic parameters
|
||||
var money_per_population: float = 1.0 # Money earned per population per second
|
||||
var base_energy_cost: float = 0.1 # Base energy cost per population
|
||||
var tax_rate: float = 0.1 # Tax rate on population income
|
||||
|
||||
# Building costs
|
||||
var building_costs := {
|
||||
"small_house": 100,
|
||||
"medium_house": 250,
|
||||
"large_house": 500,
|
||||
"power_plant": 1000,
|
||||
"road": 50
|
||||
}
|
||||
|
||||
# Building effects
|
||||
var building_population := {
|
||||
"small_house": 10,
|
||||
"medium_house": 25,
|
||||
"large_house": 50
|
||||
}
|
||||
|
||||
var building_energy := {
|
||||
"power_plant": 100.0, # Energy produced per second
|
||||
"small_house": 5.0, # Energy consumed per second
|
||||
"medium_house": 12.0,
|
||||
"large_house": 25.0
|
||||
}
|
||||
|
||||
# Signals
|
||||
signal money_changed(new_amount: float)
|
||||
signal population_changed(new_population: int)
|
||||
signal energy_balance_changed(production: float, consumption: float)
|
||||
|
||||
func _ready():
|
||||
# Start the economy tick
|
||||
$EconomyTimer.start()
|
||||
|
||||
func _process(_delta):
|
||||
# Update energy balance
|
||||
energy_consumption = calculate_total_energy_consumption()
|
||||
emit_signal("energy_balance_changed", energy_production, energy_consumption)
|
||||
|
||||
func calculate_total_energy_consumption() -> float:
|
||||
var total := 0.0
|
||||
for building_type in building_energy:
|
||||
if building_type != "power_plant": # Skip power plants as they produce energy
|
||||
total += building_energy[building_type] * get_building_count(building_type)
|
||||
return total
|
||||
|
||||
func get_building_count(building_type: String) -> int:
|
||||
var builder = get_node_or_null("/root/Main/Builder")
|
||||
if not builder:
|
||||
return 0
|
||||
|
||||
var count = 0
|
||||
for structure in builder.structures:
|
||||
if structure.model and structure.model.resource_path.contains(building_type):
|
||||
count += 1
|
||||
return count
|
||||
|
||||
func can_afford_building(building_type: String) -> bool:
|
||||
return money >= building_costs.get(building_type, 0)
|
||||
|
||||
func purchase_building(building_type: String) -> bool:
|
||||
if can_afford_building(building_type):
|
||||
money -= building_costs[building_type]
|
||||
emit_signal("money_changed", money)
|
||||
|
||||
# Update population if it's a house
|
||||
if building_type in building_population:
|
||||
population += building_population[building_type]
|
||||
emit_signal("population_changed", population)
|
||||
|
||||
# Update energy if it's a power plant
|
||||
if building_type == "power_plant":
|
||||
energy_production += building_energy["power_plant"]
|
||||
|
||||
return true
|
||||
return false
|
||||
|
||||
func _on_economy_timer_timeout():
|
||||
# Calculate income from population
|
||||
var income = population * money_per_population * tax_rate
|
||||
money += income
|
||||
emit_signal("money_changed", money)
|
||||
@ -0,0 +1 @@
|
||||
uid://bat3h7fhpdh7
|
||||
@ -0,0 +1,244 @@
|
||||
extends Node
|
||||
|
||||
# Signals
|
||||
|
||||
signal electricity_updated(usage, production)
|
||||
# Variables
|
||||
var total_population: int = 0
|
||||
var total_kW_usage: float = 0.0
|
||||
var total_kW_production: float = 0.0
|
||||
var current_money: float = 0.0
|
||||
|
||||
# References
|
||||
var buildeJuj
|
||||
var building_construction_manager
|
||||
var population_label: Label
|
||||
var electricity_label: Label
|
||||
var electricity_indicator: ColorRect
|
||||
var population_tooltip: Control
|
||||
var electricity_tooltip: Control
|
||||
var controls_panel: PanelContainer
|
||||
var sound_panel: PanelContainer
|
||||
<<<<<<< Updated upstream
|
||||
var builder:Node
|
||||
=======
|
||||
var cash_label: Label
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
func _ready():
|
||||
# Connect to signals from the builder
|
||||
builder = get_node_or_null("/root/Main/Builder")
|
||||
if builder:
|
||||
builder.structure_placed.connect(_on_structure_placed)
|
||||
builder.structure_removed.connect(_on_structure_removed)
|
||||
|
||||
|
||||
# EventBus.population_update.connect(set_population_count)
|
||||
|
||||
# Initialize UI elements
|
||||
population_label = $HBoxContainer/PopulationItem/PopulationLabel
|
||||
if not population_label:
|
||||
push_error("Population label not found in HUD!")
|
||||
return
|
||||
|
||||
electricity_label = $HBoxContainer/ElectricityItem/ElectricityContainer/ElectricityValues/ElectricityLabel
|
||||
if not electricity_label:
|
||||
push_error("Electricity label not found in HUD!")
|
||||
return
|
||||
|
||||
electricity_indicator = $HBoxContainer/ElectricityItem/ElectricityContainer/ElectricityValues/ElectricityIndicator
|
||||
if not electricity_indicator:
|
||||
push_error("Electricity indicator not found in HUD!")
|
||||
return
|
||||
|
||||
population_tooltip = $PopulationTooltip
|
||||
if not population_tooltip:
|
||||
push_error("Population tooltip not found in HUD!")
|
||||
return
|
||||
|
||||
electricity_tooltip = $ElectricityTooltip
|
||||
<<<<<<< Updated upstream
|
||||
|
||||
|
||||
=======
|
||||
if not electricity_tooltip:
|
||||
push_error("Electricity tooltip not found in HUD!")
|
||||
return
|
||||
|
||||
cash_label = $HBoxContainer/CashItem/CashLabel
|
||||
if not cash_label:
|
||||
push_error("Cash label not found in HUD!")
|
||||
return
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
# Ensure electricity indicator starts with red color
|
||||
electricity_indicator.color = Color(1, 0, 0) # Start with red
|
||||
|
||||
# Hide the electricity label for now (keeping implementation for later)
|
||||
electricity_label.visible = false
|
||||
|
||||
# Set tooltips
|
||||
population_tooltip.visible = false
|
||||
electricity_tooltip.visible = false
|
||||
|
||||
# Update HUD
|
||||
update_hud()
|
||||
|
||||
|
||||
func _process(delta):
|
||||
# Update the population label if it changes
|
||||
if population_label and Globals.population != total_population:
|
||||
total_population = Globals.population
|
||||
population_label.text = str(total_population)
|
||||
|
||||
|
||||
# Called when a structure is placed
|
||||
func _on_structure_placed(structure_index, position):
|
||||
if !builder or structure_index < 0 or structure_index >= builder.structures.size():
|
||||
return
|
||||
|
||||
var structure = builder.structures[structure_index]
|
||||
|
||||
# Only update population for non-residential buildings or if we're NOT in the construction mission
|
||||
var is_residential = structure.type == Structure.StructureType.RESIDENTIAL_BUILDING
|
||||
var mission_manager = get_node_or_null("/root/Main/MissionManager")
|
||||
var using_construction = false
|
||||
if mission_manager and mission_manager.current_mission:
|
||||
var mission_id = mission_manager.current_mission.id
|
||||
using_construction = (mission_id == "3" or mission_id == "1")
|
||||
|
||||
# Always update electricity usage/production
|
||||
total_kW_usage += structure.kW_usage
|
||||
total_kW_production += structure.kW_production
|
||||
|
||||
# Update HUD
|
||||
update_hud()
|
||||
|
||||
# Emit signals
|
||||
electricity_updated.emit(total_kW_usage, total_kW_production)
|
||||
|
||||
# Called when a structure is removed
|
||||
func _on_structure_removed(structure_index, position):
|
||||
if !builder or structure_index < 0 or structure_index >= builder.structures.size():
|
||||
return
|
||||
|
||||
var structure = builder.structures[structure_index]
|
||||
|
||||
# Update population (but only for non-residential buildings in mission 3)
|
||||
# For residential buildings in mission 3, we handle population separately in builder._remove_resident_for_building
|
||||
var skip_population_update = false
|
||||
var mission_manager = get_node_or_null("/root/Main/MissionManager")
|
||||
|
||||
if mission_manager and mission_manager.current_mission:
|
||||
if mission_manager.current_mission.id == "3" and structure.type == Structure.StructureType.RESIDENTIAL_BUILDING:
|
||||
# Only update population for one resident, since we're removing them one by one
|
||||
# We don't do total reset based on structure.population_count
|
||||
skip_population_update = true
|
||||
# We decrement by 1 in builder._remove_resident_for_building instead
|
||||
|
||||
if !skip_population_update:
|
||||
total_population = max(0, total_population - structure.population_count)
|
||||
|
||||
# Update electricity
|
||||
total_kW_usage = max(0, total_kW_usage - structure.kW_usage)
|
||||
total_kW_production = max(0, total_kW_production - structure.kW_production)
|
||||
|
||||
# Update HUD
|
||||
update_hud()
|
||||
|
||||
# Emit signals
|
||||
electricity_updated.emit(total_kW_usage, total_kW_production)
|
||||
|
||||
|
||||
# Update Population
|
||||
func set_population_count(count: int):
|
||||
total_population += count
|
||||
population_label.text = str(total_population)
|
||||
|
||||
# # Emit signal
|
||||
# increased_population.emit(added_population)
|
||||
|
||||
# Updates the HUD elements
|
||||
func update_hud():
|
||||
# Update population label
|
||||
if population_label:
|
||||
population_label.text = str(total_population)
|
||||
|
||||
# Update electricity label and indicator
|
||||
if electricity_label:
|
||||
# Default to red for the electricity indicator
|
||||
var indicator_color = Color(1, 0, 0) # Red
|
||||
|
||||
if total_kW_usage > 0:
|
||||
# If we have usage, check if production meets or exceeds it
|
||||
|
||||
# Only set to green if we meet or exceed demand
|
||||
if total_kW_production >= total_kW_usage:
|
||||
indicator_color = Color(0, 1, 0) # Green
|
||||
else:
|
||||
# Not enough power - keep it red
|
||||
indicator_color = Color(1, 0, 0) # Red
|
||||
|
||||
# Update electricity label text (hidden for now but kept for future use)
|
||||
electricity_label.text = str(total_kW_usage) + "/" + str(total_kW_production) + " kW"
|
||||
else:
|
||||
# If no usage but we have production, show green
|
||||
if total_kW_production > 0:
|
||||
indicator_color = Color(0, 1, 0) # Green
|
||||
electricity_label.text = "0/" + str(total_kW_production) + " kW"
|
||||
else:
|
||||
# No usage and no production - show neutral color (gray)
|
||||
indicator_color = Color(0.7, 0.7, 0.7) # Gray
|
||||
electricity_label.text = "0/0 kW"
|
||||
|
||||
# Hide the text label for now, but keep implementation for later
|
||||
electricity_label.visible = false
|
||||
|
||||
# Update the color of the indicator rectangle
|
||||
if electricity_indicator:
|
||||
electricity_indicator.color = indicator_color
|
||||
|
||||
# Tooltip handling
|
||||
func _on_population_icon_mouse_entered():
|
||||
if population_tooltip:
|
||||
population_tooltip.visible = true
|
||||
|
||||
func _on_population_icon_mouse_exited():
|
||||
if population_tooltip:
|
||||
population_tooltip.visible = false
|
||||
|
||||
func _on_electricity_icon_mouse_entered():
|
||||
if electricity_tooltip:
|
||||
electricity_tooltip.visible = true
|
||||
|
||||
func _on_electricity_icon_mouse_exited():
|
||||
if electricity_tooltip:
|
||||
electricity_tooltip.visible = false
|
||||
|
||||
# Called when the sound button is pressed
|
||||
func _on_sound_button_pressed():
|
||||
# Consume the event to prevent click-through to the world
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
if sound_panel:
|
||||
sound_panel.show_panel()
|
||||
|
||||
# Called when the help button is pressed
|
||||
func _on_help_button_pressed():
|
||||
# Consume the event to prevent click-through to the world
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
if controls_panel:
|
||||
controls_panel.show_panel()
|
||||
|
||||
# Update money display
|
||||
func update_money(amount: float):
|
||||
current_money = amount
|
||||
if cash_label:
|
||||
cash_label.text = "$" + str(int(amount))
|
||||
|
||||
# Update energy balance display
|
||||
func update_energy_balance(production: float, consumption: float):
|
||||
total_kW_production = production
|
||||
total_kW_usage = consumption
|
||||
update_hud()
|
||||
@ -0,0 +1,244 @@
|
||||
extends Node
|
||||
|
||||
# Signals
|
||||
|
||||
signal electricity_updated(usage, production)
|
||||
# Variables
|
||||
var total_population: int = 0
|
||||
var total_kW_usage: float = 0.0
|
||||
var total_kW_production: float = 0.0
|
||||
var current_money: float = 0.0
|
||||
|
||||
# References
|
||||
var buildeJuj
|
||||
var building_construction_manager
|
||||
var population_label: Label
|
||||
var electricity_label: Label
|
||||
var electricity_indicator: ColorRect
|
||||
var population_tooltip: Control
|
||||
var electricity_tooltip: Control
|
||||
var controls_panel: PanelContainer
|
||||
var sound_panel: PanelContainer
|
||||
<<<<<<< Updated upstream
|
||||
var builder:Node
|
||||
=======
|
||||
var cash_label: Label
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
func _ready():
|
||||
# Connect to signals from the builder
|
||||
builder = get_node_or_null("/root/Main/Builder")
|
||||
if builder:
|
||||
builder.structure_placed.connect(_on_structure_placed)
|
||||
builder.structure_removed.connect(_on_structure_removed)
|
||||
|
||||
|
||||
# EventBus.population_update.connect(set_population_count)
|
||||
|
||||
# Initialize UI elements
|
||||
population_label = $HBoxContainer/PopulationItem/PopulationLabel
|
||||
if not population_label:
|
||||
push_error("Population label not found in HUD!")
|
||||
return
|
||||
|
||||
electricity_label = $HBoxContainer/ElectricityItem/ElectricityContainer/ElectricityValues/ElectricityLabel
|
||||
if not electricity_label:
|
||||
push_error("Electricity label not found in HUD!")
|
||||
return
|
||||
|
||||
electricity_indicator = $HBoxContainer/ElectricityItem/ElectricityContainer/ElectricityValues/ElectricityIndicator
|
||||
if not electricity_indicator:
|
||||
push_error("Electricity indicator not found in HUD!")
|
||||
return
|
||||
|
||||
population_tooltip = $PopulationTooltip
|
||||
if not population_tooltip:
|
||||
push_error("Population tooltip not found in HUD!")
|
||||
return
|
||||
|
||||
electricity_tooltip = $ElectricityTooltip
|
||||
<<<<<<< Updated upstream
|
||||
|
||||
|
||||
=======
|
||||
if not electricity_tooltip:
|
||||
push_error("Electricity tooltip not found in HUD!")
|
||||
return
|
||||
|
||||
cash_label = $HBoxContainer/CashItem/CashLabel
|
||||
if not cash_label:
|
||||
push_error("Cash label not found in HUD!")
|
||||
return
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
# Ensure electricity indicator starts with red color
|
||||
electricity_indicator.color = Color(1, 0, 0) # Start with red
|
||||
|
||||
# Hide the electricity label for now (keeping implementation for later)
|
||||
electricity_label.visible = false
|
||||
|
||||
# Set tooltips
|
||||
population_tooltip.visible = false
|
||||
electricity_tooltip.visible = false
|
||||
|
||||
# Update HUD
|
||||
update_hud()
|
||||
|
||||
|
||||
func _process(delta):
|
||||
# Update the population label if it changes
|
||||
if population_label and Globals.population != total_population:
|
||||
total_population = Globals.population
|
||||
population_label.text = str(total_population)
|
||||
|
||||
|
||||
# Called when a structure is placed
|
||||
func _on_structure_placed(structure_index, position):
|
||||
if !builder or structure_index < 0 or structure_index >= builder.structures.size():
|
||||
return
|
||||
|
||||
var structure = builder.structures[structure_index]
|
||||
|
||||
# Only update population for non-residential buildings or if we're NOT in the construction mission
|
||||
var is_residential = structure.type == Structure.StructureType.RESIDENTIAL_BUILDING
|
||||
var mission_manager = get_node_or_null("/root/Main/MissionManager")
|
||||
var using_construction = false
|
||||
if mission_manager and mission_manager.current_mission:
|
||||
var mission_id = mission_manager.current_mission.id
|
||||
using_construction = (mission_id == "3" or mission_id == "1")
|
||||
|
||||
# Always update electricity usage/production
|
||||
total_kW_usage += structure.kW_usage
|
||||
total_kW_production += structure.kW_production
|
||||
|
||||
# Update HUD
|
||||
update_hud()
|
||||
|
||||
# Emit signals
|
||||
electricity_updated.emit(total_kW_usage, total_kW_production)
|
||||
|
||||
# Called when a structure is removed
|
||||
func _on_structure_removed(structure_index, position):
|
||||
if !builder or structure_index < 0 or structure_index >= builder.structures.size():
|
||||
return
|
||||
|
||||
var structure = builder.structures[structure_index]
|
||||
|
||||
# Update population (but only for non-residential buildings in mission 3)
|
||||
# For residential buildings in mission 3, we handle population separately in builder._remove_resident_for_building
|
||||
var skip_population_update = false
|
||||
var mission_manager = get_node_or_null("/root/Main/MissionManager")
|
||||
|
||||
if mission_manager and mission_manager.current_mission:
|
||||
if mission_manager.current_mission.id == "3" and structure.type == Structure.StructureType.RESIDENTIAL_BUILDING:
|
||||
# Only update population for one resident, since we're removing them one by one
|
||||
# We don't do total reset based on structure.population_count
|
||||
skip_population_update = true
|
||||
# We decrement by 1 in builder._remove_resident_for_building instead
|
||||
|
||||
if !skip_population_update:
|
||||
total_population = max(0, total_population - structure.population_count)
|
||||
|
||||
# Update electricity
|
||||
total_kW_usage = max(0, total_kW_usage - structure.kW_usage)
|
||||
total_kW_production = max(0, total_kW_production - structure.kW_production)
|
||||
|
||||
# Update HUD
|
||||
update_hud()
|
||||
|
||||
# Emit signals
|
||||
electricity_updated.emit(total_kW_usage, total_kW_production)
|
||||
|
||||
|
||||
# Update Population
|
||||
func set_population_count(count: int):
|
||||
total_population += count
|
||||
population_label.text = str(total_population)
|
||||
|
||||
# # Emit signal
|
||||
# increased_population.emit(added_population)
|
||||
|
||||
# Updates the HUD elements
|
||||
func update_hud():
|
||||
# Update population label
|
||||
if population_label:
|
||||
population_label.text = str(total_population)
|
||||
|
||||
# Update electricity label and indicator
|
||||
if electricity_label:
|
||||
# Default to red for the electricity indicator
|
||||
var indicator_color = Color(1, 0, 0) # Red
|
||||
|
||||
if total_kW_usage > 0:
|
||||
# If we have usage, check if production meets or exceeds it
|
||||
|
||||
# Only set to green if we meet or exceed demand
|
||||
if total_kW_production >= total_kW_usage:
|
||||
indicator_color = Color(0, 1, 0) # Green
|
||||
else:
|
||||
# Not enough power - keep it red
|
||||
indicator_color = Color(1, 0, 0) # Red
|
||||
|
||||
# Update electricity label text (hidden for now but kept for future use)
|
||||
electricity_label.text = str(total_kW_usage) + "/" + str(total_kW_production) + " kW"
|
||||
else:
|
||||
# If no usage but we have production, show green
|
||||
if total_kW_production > 0:
|
||||
indicator_color = Color(0, 1, 0) # Green
|
||||
electricity_label.text = "0/" + str(total_kW_production) + " kW"
|
||||
else:
|
||||
# No usage and no production - show neutral color (gray)
|
||||
indicator_color = Color(0.7, 0.7, 0.7) # Gray
|
||||
electricity_label.text = "0/0 kW"
|
||||
|
||||
# Hide the text label for now, but keep implementation for later
|
||||
electricity_label.visible = false
|
||||
|
||||
# Update the color of the indicator rectangle
|
||||
if electricity_indicator:
|
||||
electricity_indicator.color = indicator_color
|
||||
|
||||
# Tooltip handling
|
||||
func _on_population_icon_mouse_entered():
|
||||
if population_tooltip:
|
||||
population_tooltip.visible = true
|
||||
|
||||
func _on_population_icon_mouse_exited():
|
||||
if population_tooltip:
|
||||
population_tooltip.visible = false
|
||||
|
||||
func _on_electricity_icon_mouse_entered():
|
||||
if electricity_tooltip:
|
||||
electricity_tooltip.visible = true
|
||||
|
||||
func _on_electricity_icon_mouse_exited():
|
||||
if electricity_tooltip:
|
||||
electricity_tooltip.visible = false
|
||||
|
||||
# Called when the sound button is pressed
|
||||
func _on_sound_button_pressed():
|
||||
# Consume the event to prevent click-through to the world
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
if sound_panel:
|
||||
sound_panel.show_panel()
|
||||
|
||||
# Called when the help button is pressed
|
||||
func _on_help_button_pressed():
|
||||
# Consume the event to prevent click-through to the world
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
if controls_panel:
|
||||
controls_panel.show_panel()
|
||||
|
||||
# Update money display
|
||||
func update_money(amount: float):
|
||||
current_money = amount
|
||||
if cash_label:
|
||||
cash_label.text = "$" + str(int(amount))
|
||||
|
||||
# Update energy balance display
|
||||
func update_energy_balance(production: float, consumption: float):
|
||||
total_kW_production = production
|
||||
total_kW_usage = consumption
|
||||
update_hud()
|
||||
@ -0,0 +1,93 @@
|
||||
extends Node
|
||||
|
||||
# JavaScript global class for handling JavaScript functionality
|
||||
class_name JavaScript
|
||||
|
||||
# Check if JavaScript is available
|
||||
static func has_interface() -> bool:
|
||||
# Check if running in a web environment
|
||||
if OS.has_feature("web"):
|
||||
print("Running in web environment, JavaScript should be available")
|
||||
|
||||
# Double-check by evaluating a simple script
|
||||
if Engine.has_singleton("JavaScriptBridge"):
|
||||
var js = Engine.get_singleton("JavaScriptBridge")
|
||||
var test_result = js.eval("!!window && typeof window !== 'undefined'")
|
||||
print("JavaScript test result: " + str(test_result))
|
||||
return test_result != null
|
||||
else:
|
||||
print("JavaScriptBridge singleton not available, running in editor or non-web platform")
|
||||
else:
|
||||
print("Not running in web environment")
|
||||
|
||||
return false
|
||||
|
||||
# Get the JavaScript interface
|
||||
static func get_interface():
|
||||
if has_interface():
|
||||
return JavaScriptGlobal
|
||||
return null
|
||||
|
||||
# JavaScriptGlobal is a mock class that provides fallback implementations
|
||||
# for platforms that don't support JavaScript
|
||||
class JavaScriptGlobal:
|
||||
# Check if a JavaScript function exists
|
||||
static func has_function(function_name: String) -> bool:
|
||||
if not OS.has_feature("web"):
|
||||
return false
|
||||
|
||||
print("Checking if function exists: " + function_name)
|
||||
var script = "typeof %s === 'function'" % function_name
|
||||
|
||||
# Use Engine.get_singleton for consistency with sound_manager.gd
|
||||
if Engine.has_singleton("JavaScriptBridge"):
|
||||
var js = Engine.get_singleton("JavaScriptBridge")
|
||||
var result = js.eval(script)
|
||||
|
||||
# If result is null, the JavaScript eval failed
|
||||
if result == null:
|
||||
print("JavaScript eval failed when checking for function: " + function_name)
|
||||
return false
|
||||
|
||||
print("Function check result for " + function_name + ": " + str(result))
|
||||
return result
|
||||
else:
|
||||
print("JavaScriptBridge singleton not available")
|
||||
return false
|
||||
|
||||
# Evaluate JavaScript code
|
||||
static func eval(script: String):
|
||||
if not OS.has_feature("web"):
|
||||
return null
|
||||
|
||||
# Use Engine.get_singleton for consistency with sound_manager.gd
|
||||
if Engine.has_singleton("JavaScriptBridge"):
|
||||
var js = Engine.get_singleton("JavaScriptBridge")
|
||||
return js.eval(script)
|
||||
else:
|
||||
print("JavaScriptBridge singleton not available")
|
||||
return null
|
||||
|
||||
# Call a JavaScript function with arguments
|
||||
static func call_js_function(function_name: String, args = []):
|
||||
if not OS.has_feature("web"):
|
||||
return null
|
||||
|
||||
var formatted_args = []
|
||||
for arg in args:
|
||||
if arg is String:
|
||||
formatted_args.append("\"%s\"" % arg.replace("\"", "\\\""))
|
||||
elif arg is Dictionary or arg is Array:
|
||||
formatted_args.append(JSON.stringify(arg))
|
||||
else:
|
||||
formatted_args.append(str(arg))
|
||||
|
||||
var script = "%s(%s)" % [function_name, ",".join(formatted_args)]
|
||||
|
||||
# Use Engine.get_singleton for consistency with sound_manager.gd
|
||||
if Engine.has_singleton("JavaScriptBridge"):
|
||||
var js = Engine.get_singleton("JavaScriptBridge")
|
||||
return js.eval(script)
|
||||
else:
|
||||
print("JavaScriptBridge singleton not available")
|
||||
return null
|
||||
@ -0,0 +1 @@
|
||||
uid://boq8j7e7veaup
|
||||
@ -0,0 +1 @@
|
||||
uid://djghkkucobwfl
|
||||
@ -0,0 +1 @@
|
||||
uid://s05virx2cxsi
|
||||
@ -0,0 +1 @@
|
||||
uid://d1ndmeoogiuf4
|
||||
@ -0,0 +1 @@
|
||||
uid://nujnbtcf5kkf
|
||||
@ -0,0 +1 @@
|
||||
uid://cuuydsps7ubth
|
||||
@ -0,0 +1,179 @@
|
||||
extends Node
|
||||
class_name MissionLoader
|
||||
|
||||
const MissionData = preload("res://scripts/mission/mission_data.gd")
|
||||
const MissionObjective = preload("res://scripts/mission/mission_objective.gd")
|
||||
|
||||
var mission_manager: MissionManager
|
||||
var builder: Node3D
|
||||
|
||||
func _init(manager: MissionManager, builder_ref: Node3D):
|
||||
mission_manager = manager
|
||||
builder = builder_ref
|
||||
|
||||
# Load mission data from JavaScript
|
||||
func load_from_js(mission_data: Dictionary) -> void:
|
||||
print("\n=== Loading Mission Data from JavaScript ===")
|
||||
print("Received mission data:", mission_data)
|
||||
|
||||
if not mission_data:
|
||||
print("WARNING: No mission data received from JavaScript")
|
||||
return
|
||||
|
||||
print("Converting mission data to Godot objects...")
|
||||
if "missions" in mission_data:
|
||||
var missions = _convert_missions(mission_data.missions)
|
||||
print("Converted missions:", missions)
|
||||
print("Number of missions converted: ", missions.size())
|
||||
|
||||
if missions.is_empty():
|
||||
print("WARNING: No missions were converted from the data")
|
||||
return
|
||||
|
||||
print("Setting up missions...")
|
||||
mission_manager.missions = missions
|
||||
print("Missions set in manager. Current missions array size: ", mission_manager.missions.size())
|
||||
if mission_manager.missions.size() > 0:
|
||||
print("First mission details:")
|
||||
print(" Title: ", mission_manager.missions[0].title)
|
||||
print(" Description: ", mission_manager.missions[0].description)
|
||||
print(" Number of objectives: ", mission_manager.missions[0].objectives.size())
|
||||
print("=== Mission Data Loading Complete ===\n")
|
||||
else:
|
||||
print("WARNING: No 'missions' key found in mission data")
|
||||
|
||||
# Unlock the starting structures
|
||||
func _unlock_starting_structures(structure_paths: Array) -> void:
|
||||
print("\n=== Unlocking Starting Structures ===")
|
||||
print("Paths to unlock: ", structure_paths)
|
||||
|
||||
if not builder:
|
||||
push_error("Builder not available")
|
||||
return
|
||||
|
||||
# Get current structures
|
||||
var structures = builder.get_structures()
|
||||
if not structures:
|
||||
push_error("No structures available")
|
||||
return
|
||||
|
||||
# Process each path
|
||||
for path in structure_paths:
|
||||
print("\nProcessing path: ", path)
|
||||
|
||||
# Handle both structures/ and models/ paths
|
||||
var possible_paths = []
|
||||
|
||||
# Add the original path
|
||||
possible_paths.append(path)
|
||||
|
||||
# Handle .tres to .glb conversion
|
||||
if path.ends_with(".tres"):
|
||||
# Convert structures/ path to models/ path
|
||||
if "structures/" in path:
|
||||
possible_paths.append(path.replace("structures/", "models/").replace(".tres", ".glb"))
|
||||
|
||||
# Handle .glb to .tres conversion
|
||||
if path.ends_with(".glb"):
|
||||
# Convert models/ path to structures/ path
|
||||
if "models/" in path:
|
||||
possible_paths.append(path.replace("models/", "structures/").replace(".glb", ".tres"))
|
||||
|
||||
print("Trying possible paths: ", possible_paths)
|
||||
|
||||
var found_match = false
|
||||
for structure in structures:
|
||||
if not structure.model:
|
||||
continue
|
||||
|
||||
var structure_path = structure.model.resource_path
|
||||
|
||||
# Only try exact path matches
|
||||
for possible_path in possible_paths:
|
||||
if structure_path == possible_path:
|
||||
structure.unlocked = true
|
||||
found_match = true
|
||||
break
|
||||
|
||||
if found_match:
|
||||
break
|
||||
|
||||
if not found_match:
|
||||
print("WARNING: No match found for path: ", path)
|
||||
|
||||
# Convert mission dictionaries to MissionData objects
|
||||
func _convert_missions(mission_dicts: Array) -> Array[MissionData]:
|
||||
print("Converting mission configurations...")
|
||||
var converted: Array[MissionData] = []
|
||||
|
||||
for mission_dict in mission_dicts:
|
||||
var mission_data = MissionData.new()
|
||||
|
||||
# Set basic properties
|
||||
mission_data.id = mission_dict.get("id", "")
|
||||
mission_data.title = mission_dict.get("title", "")
|
||||
mission_data.description = mission_dict.get("description", "")
|
||||
mission_data.open_react_graph = mission_dict.get("open_react_graph", false)
|
||||
mission_data.open_react_table = mission_dict.get("open_react_table", false)
|
||||
mission_data.react_data = mission_dict.get("react_data", {})
|
||||
mission_data.react_table_data = mission_dict.get("react_table_data", {
|
||||
"headers": [], # Array of header text strings
|
||||
"rows": [] # 2D array of cell values: [[row1cell1, row1cell2...], [row2cell1, row2cell2...], ...]
|
||||
})
|
||||
# Convert objectives
|
||||
var objectives: Array[MissionObjective] = []
|
||||
for obj in mission_dict.get("objectives", []):
|
||||
var objective = MissionObjective.new()
|
||||
objective.type = obj.get("type", 0)
|
||||
objective.target_count = obj.get("target_count", 0)
|
||||
objective.description = obj.get("description", "")
|
||||
|
||||
# Load structure resource if specified
|
||||
var structure_path = obj.get("structure_path", "")
|
||||
if structure_path:
|
||||
objective.structure = load(structure_path)
|
||||
|
||||
objectives.append(objective)
|
||||
|
||||
mission_data.objectives = objectives
|
||||
|
||||
# Set rewards
|
||||
mission_data.rewards = mission_dict.get("rewards", {})
|
||||
|
||||
# Set unlocked items
|
||||
var unlocked_items_array: Array[String] = []
|
||||
for item in mission_dict.get("unlocked_items", []):
|
||||
unlocked_items_array.append(str(item))
|
||||
mission_data.unlocked_items = unlocked_items_array
|
||||
|
||||
# Set starting structures
|
||||
var starting_structures_array: Array[String] = []
|
||||
for item in mission_dict.get("starting_structures", []):
|
||||
starting_structures_array.append(str(item))
|
||||
mission_data.starting_structures = starting_structures_array
|
||||
|
||||
# Set additional properties
|
||||
mission_data.next_mission_id = mission_dict.get("next_mission_id", "")
|
||||
mission_data.graph_path = mission_dict.get("graph_path", "")
|
||||
mission_data.full_screen_path = mission_dict.get("full_screen_path", "")
|
||||
mission_data.intro_text = mission_dict.get("intro_text", "")
|
||||
mission_data.question_text = mission_dict.get("question_text", "")
|
||||
mission_data.correct_answer = mission_dict.get("correct_answer", "")
|
||||
mission_data.feedback_text = mission_dict.get("feedback_text", "")
|
||||
mission_data.incorrect_feedback = mission_dict.get("incorrect_feedback", "")
|
||||
mission_data.company_data = mission_dict.get("company_data", "")
|
||||
mission_data.power_math_content = mission_dict.get("power_math_content", "")
|
||||
mission_data.num_of_user_inputs = mission_dict.get("num_of_user_inputs", 1)
|
||||
|
||||
# Convert input labels to Array[String]
|
||||
var input_labels_array: Array[String] = []
|
||||
for label in mission_dict.get("input_labels", []):
|
||||
input_labels_array.append(str(label))
|
||||
mission_data.input_labels = input_labels_array
|
||||
|
||||
# Set companion dialog
|
||||
mission_data.companion_dialog = mission_dict.get("companion_dialog", {})
|
||||
|
||||
converted.append(mission_data)
|
||||
|
||||
return converted
|
||||
@ -0,0 +1 @@
|
||||
uid://c7x6l804lvsdk
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,13 @@
|
||||
extends Resource
|
||||
class_name PatternRule
|
||||
|
||||
enum RuleType {
|
||||
STRUCTURE, # Check for specific structure
|
||||
EMPTY, # Check for empty space
|
||||
ROTATION # Check structure rotation
|
||||
}
|
||||
|
||||
@export var type: RuleType = RuleType.STRUCTURE
|
||||
@export var offset: Vector2i
|
||||
@export var structure: Structure # Structure to check for if type is STRUCTURE
|
||||
@export var rotation: int # Rotation to check for if type is ROTATION
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue