Changes for build time visual

pull/18/head
jc-stemuli 2025-04-23 10:48:29 +07:00
parent ac096592bf
commit 20d631de6f
35 changed files with 312 additions and 87 deletions

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://bom5bu47dy5kp"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_pfd6v"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_pfd6v"]
[ext_resource type="Resource" uid="uid://dv14kkhb6umkv" path="res://structures/road-straight.tres" id="2_ktjdq"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_w1cq1"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=4 format=3 uid="uid://csrqvfwp63ygr"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_a8iy6"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_a8iy6"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="2_5q4dp"]
[sub_resource type="Resource" id="Resource_m1jev"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://qwiwim2pg88f"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_lsd8i"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_lsd8i"]
[ext_resource type="Resource" uid="uid://mxrnqinnsqnt" path="res://structures/road-straight-lightposts.tres" id="2_v2q1j"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_gtu3s"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://cfgw8dblm55c5"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_fvshb"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_fvshb"]
[ext_resource type="Resource" uid="uid://dv14kkhb6umkv" path="res://structures/road-straight.tres" id="2_evy85"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_mtrpd"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://ba3ndftq7dht7"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_miqck"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_miqck"]
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="2_r3vpw"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_mdu3m"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://dgimr2v12rjqu"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_8rvyb"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_8rvyb"]
[ext_resource type="Resource" uid="uid://c4qbn3d85prxx" path="res://structures/power-plant.tres" id="2_0kbkj"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_8cjg3"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=7 format=3 uid="uid://dm2o4dq2oml53"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_x4c68"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_x4c68"]
[ext_resource type="Resource" uid="uid://tm532uesguhk" path="res://structures/grass.tres" id="2_ckbw6"]
[ext_resource type="Resource" uid="uid://y6jafhfnhbrp" path="res://structures/grass-trees-tall.tres" id="3_i0070"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_mjpfs"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://btwrfq37q8vey"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_ajvs5"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_ajvs5"]
[ext_resource type="Resource" uid="uid://d2jplegnkl6u2" path="res://structures/road-corner.tres" id="2_exdai"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_kexcf"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://cf7gpb4j7gq1g"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_8k2sf"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_8k2sf"]
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="2_4a8uo"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_aihyv"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://ddmxjjyxgxyxo"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_1hl01"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_1hl01"]
[ext_resource type="Resource" uid="uid://dv14kkhb6umkv" path="res://structures/road-straight.tres" id="2_i3hgc"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_6fq1p"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://doxd30r8qbgdq"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_kdkdo"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_kdkdo"]
[ext_resource type="Resource" uid="uid://mxrnqinnsqnt" path="res://structures/road-straight-lightposts.tres" id="2_0dtbf"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_uodr7"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=4 format=3 uid="uid://duaxn13myfx22"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_40kcw"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_40kcw"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="2_x8j3r"]
[sub_resource type="Resource" id="Resource_qlixo"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://fuxb3pfbbwjm"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_75i2t"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_75i2t"]
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="2_lh8y5"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="4_30pdy"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://bsic030rpgh08"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_75i2t"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_75i2t"]
[ext_resource type="Resource" uid="uid://dtal0tl2ee336" path="res://structures/store.tres" id="2_3t66o"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_30pdy"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://byd5jxiutxpky"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_3s3sm"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_3s3sm"]
[ext_resource type="Resource" uid="uid://c4qbn3d85prxx" path="res://structures/power-plant.tres" id="2_5l1dw"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_w8jc7"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://daug1o7kppqit"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_oa16m"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_oa16m"]
[ext_resource type="Resource" uid="uid://y6jafhfnhbrp" path="res://structures/grass-trees-tall.tres" id="2_x4xh6"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_3tpnw"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://cp7tcpktwlrkt"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_fywct"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_fywct"]
[ext_resource type="Resource" uid="uid://dtal0tl2ee336" path="res://structures/store.tres" id="2_a71iq"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_38y5t"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://c3q1afcvwi4rk"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_0s0wv"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_0s0wv"]
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="2_6f04c"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_7jlc0"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://ct1k7n2oopwdu"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_40klq"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_40klq"]
[ext_resource type="Resource" uid="uid://mxrnqinnsqnt" path="res://structures/road-straight-lightposts.tres" id="2_u46hd"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_j3mtn"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=7 format=3 uid="uid://d1fykuxfmh2q1"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_wnlf0"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_wnlf0"]
[ext_resource type="Resource" uid="uid://dqqe3iofnleup" path="res://structures/pavement-fountain.tres" id="2_bmmdj"]
[ext_resource type="Resource" uid="uid://y6jafhfnhbrp" path="res://structures/grass-trees-tall.tres" id="3_fegi2"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="4_8gmvv"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=4 format=3 uid="uid://detwnqsq87r30"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_cjqfg"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_cjqfg"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="2_pv8r1"]
[sub_resource type="Resource" id="Resource_e2jx7"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=7 format=3 uid="uid://bj7tjuknfaeyg"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_t87pd"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_t87pd"]
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="2_ys3mw"]
[ext_resource type="Resource" uid="uid://bh65eqgid4kxy" path="res://structures/building-small-c.tres" id="3_jl18p"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="4_2h1ol"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://ctyrlnq5cxuiu"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_r0j2r"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_r0j2r"]
[ext_resource type="Resource" uid="uid://dtal0tl2ee336" path="res://structures/store.tres" id="2_oqy42"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_r78ev"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://bwrkqv42wk8f"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_1k37f"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_1k37f"]
[ext_resource type="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="2_qlnvj"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_4udbq"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://d0nblitd4ixir"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_vdhxy"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_vdhxy"]
[ext_resource type="Resource" uid="uid://dtal0tl2ee336" path="res://structures/store.tres" id="2_hh0xb"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_k5ivn"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://cxh8dgf54oimx"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_c76o5"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_c76o5"]
[ext_resource type="Resource" uid="uid://dv14kkhb6umkv" path="res://structures/road-straight.tres" id="2_4rkoa"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_iqaae"]

@ -1,6 +1,6 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://cpfr2xnjtpcog"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_4b0uw"]
[ext_resource type="Script" uid="uid://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="1_4b0uw"]
[ext_resource type="Resource" uid="uid://ccb475jeg7ym5" path="res://structures/grass-trees.tres" id="2_y8alv"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="3_p34yh"]

@ -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,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

@ -1,4 +1,4 @@
[gd_scene load_steps=34 format=3 uid="uid://b6eb1v02n61vv"]
[gd_scene load_steps=72 format=3 uid="uid://b6eb1v02n61vv"]
[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"]
@ -7,16 +7,21 @@
[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"]
[ext_resource type="Resource" uid="uid://ccb475jeg7ym5" path="res://structures/grass-trees.tres" id="6_fwsy4"]
[ext_resource type="Resource" uid="uid://y6jafhfnhbrp" path="res://structures/grass-trees-tall.tres" id="7_t5ykj"]
[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="Resource" uid="uid://tm532uesguhk" path="res://structures/grass.tres" id="9_e755i"]
[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://ch8vtcpine1lc" path="res://structures/pavement.tres" id="11_ro3en"]
[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="Resource" uid="uid://bh65eqgid4kxy" path="res://structures/building-small-c.tres" id="13_kf5aa"]
[ext_resource type="Script" uid="uid://ctqqmg4ydlbse" path="res://scripts/mission/mission_ui.gd" id="13_xvw5w"]
[ext_resource type="Script" uid="uid://n26k1k7243dd" 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="Resource" uid="uid://dqqe3iofnleup" path="res://structures/pavement-fountain.tres" id="14_t5ykj"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="14_vcrh8"]
[ext_resource type="Resource" uid="uid://dveu4dnue0d54" path="res://structures/road-intersection.tres" id="15_e755i"]
[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"]
@ -26,26 +31,50 @@
[ext_resource type="PackedScene" uid="uid://bqjnp7uypupog" path="res://scenes/controls_panel.tscn" id="19_controls"]
[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="22_generic_text"]
[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="PackedScene" uid="uid://btfwonjc8uj0w" path="res://scenes/mission_select_menu.tscn" id="24_ro3en"]
[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://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://b8b67y260mq6g" path="res://scripts/mission/mission_objective.gd" id="51_kf5aa"]
[ext_resource type="Resource" uid="uid://bsic030rpgh08" path="res://mission/unit_1.06/sustainable_dev_2b.tres" id="57_e755i"]
[sub_resource type="Resource" id="Resource_1gdbm"]
script = ExtResource("14_76jlq")
panel_type = 0
title = "Welcome to Stem City "
body_text = "Hi League Community,
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.
Each mission introduces important Math concepts used in urban planning and city management. You'll apply mathematics while watching your city grow.
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.
You are the very first group of students who get to test this. So keep in mind there will be bugs, but do note them.
We are aware of the following bugs:
- Population count may be off by 1
- Lighting Baking in Web Builds are too bright
- We don't restrict building off of roads which will cause workers not to reach buildings
- Building overlap
- No builders for Power Plant
Ready to start planning your city? Click Close to see the controls and begin your first mission!
@ -68,6 +97,49 @@ body_text = "Congratulations, City Planner!
"
button_text = "Close"
[sub_resource type="Resource" id="Resource_f1uf2"]
script = ExtResource("51_kf5aa")
type = 2
target_count = 1000
current_count = 0
description = "Maintain a minimum of 1000 money"
completed = false
[sub_resource type="Resource" id="Resource_t5ykj"]
script = ExtResource("14_vcrh8")
id = "27"
title = "Economic Forecasting"
description = "Financial reserves are critical for economic stability. Use your forecasting model to ensure your city maintains a healthy treasury."
objectives = Array[ExtResource("51_kf5aa")]([SubResource("Resource_f1uf2")])
rewards = {
"cash": 500
}
next_mission_id = "28"
graph_path = ""
full_screen_path = ""
intro_text = "Let's forecast financial stability! Maintain a minimum treasury of 1000 money to ensure your city's economic health."
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": "happy",
"duration": 6000,
"text": ["Well done maintaining a healthy treasury! Your financial forecasting model shows strong fiscal health."]
},
"mission_started": {
"animation": "excited",
"duration": 6000,
"text": ["Time to focus on fiscal forecasting! A strong treasury indicates good economic management."]
}
}
unlocked_items = Array[String]([])
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mission"]
bg_color = Color(0.145098, 0.172549, 0.231373, 0.941176)
border_width_left = 2
@ -127,7 +199,7 @@ outro_text_resource = SubResource("Resource_ja86h")
[node name="Builder" type="Node3D" parent="." node_paths=PackedStringArray("selector", "selector_container", "view_camera", "gridmap", "cash_display")]
script = ExtResource("1_jybm7")
structures = Array[ExtResource("2_54v6r")]([ExtResource("2_bwyku"), ExtResource("5_v5o2m"), ExtResource("6_fwsy4"), ExtResource("9_2t3p4"), ExtResource("10_ii8xx"), ExtResource("11_20frt"), ExtResource("12_xtc7p")])
structures = Array[ExtResource("2_54v6r")]([ExtResource("13_kf5aa"), ExtResource("5_v5o2m"), ExtResource("7_t5ykj"), ExtResource("6_fwsy4"), ExtResource("9_e755i"), ExtResource("14_t5ykj"), ExtResource("11_ro3en"), ExtResource("12_xtc7p"), ExtResource("15_e755i"), ExtResource("21_y11qv"), ExtResource("2_bwyku"), ExtResource("11_20frt")])
selector = NodePath("Selector")
selector_container = NodePath("Selector/Container")
view_camera = NodePath("../View/Camera")
@ -158,7 +230,10 @@ cell_center_y = false
cell_center_z = false
[node name="Sun" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.422618, -0.694272, 0.582563, 0, 0.642788, 0.766044, -0.906308, 0.323744, -0.271654, 0, 0, 0)
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
@ -168,15 +243,18 @@ shadow_opacity = 0.75
[node name="ControlsPanel" parent="CanvasLayer" instance=ExtResource("19_controls")]
[node name="SoundPanel" parent="CanvasLayer" instance=ExtResource("22_generic_text")]
[node name="SoundPanel" parent="CanvasLayer" instance=ExtResource("21_sound_panel")]
anchors_preset = 8
[node name="GenericTextPanel" parent="CanvasLayer" instance=ExtResource("22_generic_text")]
anchors_preset = 8
[node name="GenericTextPanel" parent="CanvasLayer" instance=ExtResource("13_7i6dj")]
resource_data = ExtResource("14_76jlq")
[node name="MissionSelectMenu" parent="CanvasLayer" instance=ExtResource("24_ro3en")]
visible = false
[node name="MissionManager" type="Node" parent="." node_paths=PackedStringArray("mission_ui", "builder")]
script = ExtResource("10_oe3re")
missions = Array[ExtResource("14_vcrh8")]([ExtResource("15_obmwc"), ExtResource("16_rl54y"), ExtResource("17_rrdy6"), ExtResource("20_ngu16")])
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"), SubResource("Resource_t5ykj"), ExtResource("47_6w4y8"), ExtResource("48_ck35a"), ExtResource("49_cvgxw"), ExtResource("50_6ke0d"), ExtResource("57_e755i")])
mission_ui = NodePath("MissionPanel")
builder = NodePath("../Builder")
character_scene = ExtResource("18_8lrh8")
@ -214,6 +292,7 @@ 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
@ -362,5 +441,9 @@ text = "Complete"
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"]

@ -92,7 +92,8 @@ func _setup_mission_select_menu():
var canvas_layer = get_node_or_null("/root/Main/CanvasLayer")
if canvas_layer:
canvas_layer.add_child(mission_select_menu)
#mission_select_menu.hide() # Initially hidden
# Make sure it's initially hidden
mission_select_menu.hide()
# Update mission select visibility based on export variable
func _update_mission_select_visibility():
@ -102,15 +103,18 @@ func _update_mission_select_visibility():
# Handle mission select button press
func _on_mission_select_button_pressed():
print("Mission select button pressed")
# Make sure the menu exists
if not mission_select_menu:
_setup_mission_select_menu()
if mission_select_menu:
print("Toggling mission select menu visibility")
mission_select_menu.toggle_visibility()
else:
# Try to set up the menu if it doesn't exist yet
_setup_mission_select_menu()
if mission_select_menu:
mission_select_menu.show()
push_error("Mission select menu not found after setup attempt")
func _process(delta):
# Update the population label if it changes
if population_label and Globals.population != total_population:

@ -164,14 +164,32 @@ func _process(delta):
# Skip completed sites
if site["completed"]:
continue
# Get the structure's build time
var build_time = CONSTRUCTION_TIME # Default fallback
if site["structure_index"] >= 0 and site["structure_index"] < builder.structures.size():
var structure = builder.structures[site["structure_index"]]
if "build_time" in structure:
build_time = structure.build_time
# Update timer for active sites
if site["worker"] != null and site["worker"].is_construction_active:
site["timer"] += delta
# Check if construction is complete
if site["timer"] >= CONSTRUCTION_TIME:
sites_to_complete.append(pos)
# Update timer for all active sites, regardless of worker status
site["timer"] += delta
# Update the construction preview shader progress
if site["plot"] != null:
var progress = site["timer"] / build_time
# Find all mesh instances and update their materials
var mesh_instances = []
_find_all_mesh_instances(site["plot"], mesh_instances)
for mesh_instance in mesh_instances:
for i in range(mesh_instance.get_surface_override_material_count()):
var material = mesh_instance.get_surface_override_material(i)
if material:
material.set_shader_parameter("progress", progress)
# Check if construction is complete
if site["timer"] >= build_time:
sites_to_complete.append(pos)
# Complete construction for sites that are done
for pos in sites_to_complete:
@ -424,42 +442,29 @@ func _place_final_building(position: Vector3, structure_index: int):
# Make a model semi-transparent with outline effect
func _make_model_transparent(model: Node3D, alpha: float):
# Load the construction preview shader material
var preview_material = load("res://models/Materials/construction_preview.tres")
if not preview_material:
push_error("Failed to load construction preview material")
return
# Find all mesh instances
var mesh_instances = []
_find_all_mesh_instances(model, mesh_instances)
# Adjust the materials for each mesh instance
# Apply the preview material to each mesh instance
for mesh_instance in mesh_instances:
var materials_count = mesh_instance.get_surface_override_material_count()
for i in range(materials_count):
var material = mesh_instance.get_surface_override_material(i)
if not material:
# If no override material, try to get the mesh material
if mesh_instance.mesh and i < mesh_instance.mesh.get_surface_count():
material = mesh_instance.mesh.surface_get_material(i)
# Clone the preview material to avoid affecting other instances
var new_material = preview_material.duplicate()
if material:
# Clone the material to avoid affecting other instances
var new_material = material.duplicate()
# Set up transparency
new_material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
new_material.albedo_color.a = alpha
# Make it look more like an outline/hologram
new_material.emission_enabled = true
new_material.emission = Color(0.2, 0.5, 0.8, 1.0) # Light blue emission
new_material.emission_energy = 0.5
# Optional: add a subtle outline effect
if new_material is StandardMaterial3D:
new_material.outline_enabled = true
new_material.outline_width = 3.0
new_material.outline_color = Color(0.0, 0.6, 1.0)
# Apply modified material
mesh_instance.set_surface_override_material(i, new_material)
# Set the alpha value from the parameter
new_material.set_shader_parameter("alpha", alpha)
# Apply the material
mesh_instance.set_surface_override_material(i, new_material)
# Spawn a resident from a newly constructed building
func _spawn_resident_from_building(position: Vector3):

@ -0,0 +1,45 @@
shader_type spatial;
// Parameters
uniform float progress : hint_range(0.0, 1.0) = 0.0; // Construction progress
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_thickness : hint_range(0.0, 0.1) = 0.02;
void vertex() {
// No vertex modifications needed
}
void fragment() {
// Calculate fill effect based on vertical position
float height = (VERTEX.y + 1.0) * 0.5; // Convert from [-1,1] to [0,1] range
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_thickness) {
// 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 = 0.1;
ALBEDO = fill_color.rgb;
}
}
// Add edge highlighting
vec3 normal = normalize(NORMAL);
float fresnel = pow(1.0 - dot(normal, VIEW), 3.0);
EMISSION += outline_color.rgb * fresnel * 0.5;
}