Add mission select menu and added construction workers for stores.

pull/18/head
Wade 2025-04-21 18:46:36 +07:00
parent d54883dce5
commit f3d6b08e68
124 changed files with 1567 additions and 161 deletions

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

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

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

@ -46,4 +46,4 @@ companion_dialog = {
"text": ["Let's light up the commercial district! Well-lit streets attract more shoppers in the evening."]
}
}
unlocked_items = Array[String]([])
unlocked_items = Array[String](["res://models/road-intersection.glb"])

@ -46,4 +46,4 @@ companion_dialog = {
"text": ["Let's ensure our grid has enough power! Every growing city needs reliable electricity."]
}
}
unlocked_items = Array[String]([])
unlocked_items = Array[String](["res://models/grass-trees-tall.glb", "res://models/grass.glb"])

@ -1,24 +1,35 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=5 format=3 uid="uid://dm2o4dq2oml53"]
[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="Resource" uid="uid://ccb475jeg7ym5" path="res://structures/grass-trees.tres" id="2_hcf87"]
[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"]
[sub_resource type="Resource" id="Resource_mldwf"]
script = ExtResource("1_x4c68")
type = 0
target_count = 4
target_count = 5
current_count = 0
description = "Add 4 grass tiles with trees"
description = "Create 5 grass tiles"
completed = false
structure = ExtResource("2_hcf87")
structure = ExtResource("2_ckbw6")
[sub_resource type="Resource" id="Resource_ckbw6"]
script = ExtResource("1_x4c68")
type = 0
target_count = 5
current_count = 0
description = "Create 5 tree tiles"
completed = false
structure = ExtResource("3_i0070")
metadata/_custom_type_script = "uid://be2nkvjhpebhi"
[resource]
script = ExtResource("3_mjpfs")
id = "11"
title = "Grid Growth"
description = "Complete your grid pattern with green spaces! Add trees and grass to create a more balanced and livable city pattern."
objectives = Array[ExtResource("1_x4c68")]([SubResource("Resource_mldwf")])
objectives = Array[ExtResource("1_x4c68")]([SubResource("Resource_mldwf"), SubResource("Resource_ckbw6")])
rewards = {
"cash": 300
}

@ -1,8 +1,7 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=7 format=3 uid="uid://fuxb3pfbbwjm"]
[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="Resource" uid="uid://cntgl86ianngh" path="res://structures/building-small-a.tres" id="2_lh8y5"]
[ext_resource type="Resource" uid="uid://dtal0tl2ee336" path="res://structures/store.tres" id="3_3t66o"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="4_30pdy"]
[sub_resource type="Resource" id="Resource_qb5w1"]
@ -14,28 +13,19 @@ description = "Have 6 residential buildings"
completed = false
structure = ExtResource("2_lh8y5")
[sub_resource type="Resource" id="Resource_vcbou"]
script = ExtResource("1_75i2t")
type = 0
target_count = 3
current_count = 0
description = "Have 3 store buildings"
completed = false
structure = ExtResource("3_3t66o")
[resource]
script = ExtResource("4_30pdy")
id = "17"
title = "Sustainable Development"
description = "A balanced mix of residential and commercial zones is key to sustainable development. Model the ideal ratio for your city."
objectives = Array[ExtResource("1_75i2t")]([SubResource("Resource_qb5w1"), SubResource("Resource_vcbou")])
title = "Residential Development"
description = "Build a residential zone to accommodate growth in your city's population. Adequate housing is the foundation of city planning."
objectives = Array[ExtResource("1_75i2t")]([SubResource("Resource_qb5w1")])
rewards = {
"cash": 600
"cash": 300
}
next_mission_id = "18"
next_mission_id = "17b"
graph_path = ""
full_screen_path = ""
intro_text = "Let's model the perfect balance between homes and businesses! You need 6 residential buildings and 3 store buildings."
intro_text = "Let's focus on developing the residential area first! You need to build 6 residential buildings to accommodate your growing population."
question_text = ""
correct_answer = ""
feedback_text = ""
@ -48,12 +38,12 @@ companion_dialog = {
"mission_completed": {
"animation": "happy",
"duration": 6000,
"text": ["Perfect balance! This ratio of homes to businesses creates a sustainable economic model."]
"text": ["Great job creating housing for your citizens! Now we can think about commercial needs."]
},
"mission_started": {
"animation": "excited",
"duration": 6000,
"text": ["Time to model the perfect ratio! A sustainable city needs the right balance of homes and businesses."]
"text": ["Every city needs housing first! Let's build our residential zone to support our growing population."]
}
}
unlocked_items = Array[String]([])

@ -0,0 +1,49 @@
[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="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"]
[sub_resource type="Resource" id="Resource_vcbou"]
script = ExtResource("1_75i2t")
type = 0
target_count = 3
current_count = 0
description = "Have 3 store buildings"
completed = false
structure = ExtResource("2_3t66o")
[resource]
script = ExtResource("3_30pdy")
id = "17b"
title = "Commercial Development"
description = "Every community needs stores and businesses. Add commercial zones to create a balanced urban environment."
objectives = Array[ExtResource("1_75i2t")]([SubResource("Resource_vcbou")])
rewards = {
"cash": 300
}
next_mission_id = "18"
graph_path = ""
full_screen_path = ""
intro_text = "Now that we have housing, our residents need places to shop and work! Build 3 store buildings to support your community's commercial needs."
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": ["Perfect balance! This ratio of homes to businesses creates a sustainable economic model."]
},
"mission_started": {
"animation": "excited",
"duration": 6000,
"text": ["Let's add some shops! A thriving city needs commercial zones to serve residents and create jobs."]
}
}
unlocked_items = Array[String](["res://structures/store.tres"])

@ -1,7 +1,7 @@
[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="Resource" uid="uid://ccb475jeg7ym5" path="res://structures/grass-trees.tres" id="2_wudjj"]
[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"]
[sub_resource type="Resource" id="Resource_8dxyl"]
@ -11,7 +11,7 @@ target_count = 5
current_count = 0
description = "Add 5 grass tiles with trees"
completed = false
structure = ExtResource("2_wudjj")
structure = ExtResource("2_x4xh6")
[resource]
script = ExtResource("3_3tpnw")

@ -46,4 +46,4 @@ companion_dialog = {
"text": ["Time to plan street lighting! Good urban planning includes well-lit public spaces."]
}
}
unlocked_items = Array[String]([])
unlocked_items = Array[String](["res://models/pavement-fountain.glb"])

@ -2,7 +2,7 @@
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" 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://ccb475jeg7ym5" path="res://structures/grass-trees.tres" id="3_ycm66"]
[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"]
[sub_resource type="Resource" id="Resource_1ht3m"]
@ -10,7 +10,7 @@ script = ExtResource("1_wnlf0")
type = 0
target_count = 1
current_count = 0
description = "Create 1 fountain"
description = "Add 1 fountain"
completed = false
structure = ExtResource("2_bmmdj")
@ -19,9 +19,9 @@ script = ExtResource("1_wnlf0")
type = 0
target_count = 4
current_count = 0
description = "Add 4 grass tiles with trees surrounding the fountain"
description = "Add 4 grass tiles with trees for your fountain"
completed = false
structure = ExtResource("3_ycm66")
structure = ExtResource("3_fegi2")
[resource]
script = ExtResource("4_8gmvv")

@ -44,4 +44,4 @@ companion_dialog = {
"text": ["Time to forecast economic growth! Population trends are key indicators for economic planning."]
}
}
unlocked_items = Array[String]([])
unlocked_items = Array[String](["res://models/building-small-c.glb"])

@ -1,47 +0,0 @@
[gd_resource type="Resource" script_class="MissionData" load_steps=4 format=3 uid="uid://ct45gjmw5b7pa"]
[ext_resource type="Script" uid="uid://be2nkvjhpebhi" path="res://scripts/mission/mission_objective.gd" id="1_6j12t"]
[ext_resource type="Script" uid="uid://cjaik5ku37xqx" path="res://scripts/mission/mission_data.gd" id="2_t4o2b"]
[sub_resource type="Resource" id="Resource_f1uf2"]
script = ExtResource("1_6j12t")
type = 2
target_count = 1000
current_count = 0
description = "Maintain a minimum of 1000 money"
completed = false
[resource]
script = ExtResource("2_t4o2b")
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("1_6j12t")]([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]([])

@ -15,14 +15,14 @@ structure = ExtResource("2_qlnvj")
[resource]
script = ExtResource("3_4udbq")
id = "28"
id = "27"
title = "Resource Allocation"
description = "Efficient resource allocation starts with housing. Create a residential expansion plan that maximizes land use efficiency."
objectives = Array[ExtResource("1_1k37f")]([SubResource("Resource_0fxto")])
rewards = {
"cash": 600
}
next_mission_id = "29"
next_mission_id = "28"
graph_path = ""
full_screen_path = ""
intro_text = "Let's practice residential resource allocation! Build 5 residential buildings while optimizing land use patterns."

@ -15,14 +15,14 @@ structure = ExtResource("2_hh0xb")
[resource]
script = ExtResource("3_k5ivn")
id = "29"
id = "28"
title = "Resource Allocation"
description = "Commercial resource allocation requires strategic planning. Develop a commercial sector that balances land use with economic benefits."
objectives = Array[ExtResource("1_vdhxy")]([SubResource("Resource_21csl")])
rewards = {
"cash": 650
}
next_mission_id = "30"
next_mission_id = "29"
graph_path = ""
full_screen_path = ""
intro_text = "Let's practice commercial resource allocation! Build 4 store buildings in locations that maximize their effectiveness."

@ -15,14 +15,14 @@ structure = ExtResource("2_4rkoa")
[resource]
script = ExtResource("3_iqaae")
id = "30"
id = "29"
title = "Resource Allocation"
description = "Transportation infrastructure requires careful resource allocation. Develop an efficient road network that connects all parts of your city."
objectives = Array[ExtResource("1_c76o5")]([SubResource("Resource_r01e3")])
rewards = {
"cash": 700
}
next_mission_id = "31"
next_mission_id = "30"
graph_path = ""
full_screen_path = ""
intro_text = "Let's optimize transportation resource allocation! Build 8 road segments to create an efficient transit network."

@ -15,14 +15,14 @@ structure = ExtResource("2_y8alv")
[resource]
script = ExtResource("3_p34yh")
id = "31"
id = "30"
title = "Resource Allocation"
description = "Green space allocation improves quality of life. Create a strategic plan for natural areas throughout your city."
objectives = Array[ExtResource("1_4b0uw")]([SubResource("Resource_grdmr")])
rewards = {
"cash": 600
}
next_mission_id = "32"
next_mission_id = "31"
graph_path = ""
full_screen_path = ""
intro_text = "Let's allocate resources for green spaces! Add 6 grass tiles with trees to create natural areas in your city."

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dbgcy0sa3hq4v"
path.s3tc="res://.godot/imported/building-arcology_colormap.png-e2782f9aa8500ff8a35c6b2a1cb6af84.s3tc.ctex"
path.etc2="res://.godot/imported/building-arcology_colormap.png-e2782f9aa8500ff8a35c6b2a1cb6af84.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/building-arcology_colormap.png"
dest_files=["res://.godot/imported/building-arcology_colormap.png-e2782f9aa8500ff8a35c6b2a1cb6af84.s3tc.ctex", "res://.godot/imported/building-arcology_colormap.png-e2782f9aa8500ff8a35c6b2a1cb6af84.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://lusq3mbpymj"
path.s3tc="res://.godot/imported/building-small-a_colormap.png-5c3df3cd6e4a6c3a9b3ecf5882af7d0c.s3tc.ctex"
path.etc2="res://.godot/imported/building-small-a_colormap.png-5c3df3cd6e4a6c3a9b3ecf5882af7d0c.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/building-small-a_colormap.png"
dest_files=["res://.godot/imported/building-small-a_colormap.png-5c3df3cd6e4a6c3a9b3ecf5882af7d0c.s3tc.ctex", "res://.godot/imported/building-small-a_colormap.png-5c3df3cd6e4a6c3a9b3ecf5882af7d0c.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://kwcq4oagouj3"
path.s3tc="res://.godot/imported/building-small-b_colormap.png-88fece0a14f60320dabbfa87ba219d29.s3tc.ctex"
path.etc2="res://.godot/imported/building-small-b_colormap.png-88fece0a14f60320dabbfa87ba219d29.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/building-small-b_colormap.png"
dest_files=["res://.godot/imported/building-small-b_colormap.png-88fece0a14f60320dabbfa87ba219d29.s3tc.ctex", "res://.godot/imported/building-small-b_colormap.png-88fece0a14f60320dabbfa87ba219d29.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bu37xeerjb4rg"
path.s3tc="res://.godot/imported/building-small-c_colormap.png-c006c810bfe7f2b5ff9ffddb2a614e72.s3tc.ctex"
path.etc2="res://.godot/imported/building-small-c_colormap.png-c006c810bfe7f2b5ff9ffddb2a614e72.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/building-small-c_colormap.png"
dest_files=["res://.godot/imported/building-small-c_colormap.png-c006c810bfe7f2b5ff9ffddb2a614e72.s3tc.ctex", "res://.godot/imported/building-small-c_colormap.png-c006c810bfe7f2b5ff9ffddb2a614e72.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://nr4il1mslsty"
path.s3tc="res://.godot/imported/grass-trees-tall_colormap.png-039581d4038a95a52ec1edb7e14a14ad.s3tc.ctex"
path.etc2="res://.godot/imported/grass-trees-tall_colormap.png-039581d4038a95a52ec1edb7e14a14ad.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/grass-trees-tall_colormap.png"
dest_files=["res://.godot/imported/grass-trees-tall_colormap.png-039581d4038a95a52ec1edb7e14a14ad.s3tc.ctex", "res://.godot/imported/grass-trees-tall_colormap.png-039581d4038a95a52ec1edb7e14a14ad.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bpcjjboqqpva0"
path.s3tc="res://.godot/imported/grass-trees_colormap.png-dfa57c874305a3beb22f3746cd6c2447.s3tc.ctex"
path.etc2="res://.godot/imported/grass-trees_colormap.png-dfa57c874305a3beb22f3746cd6c2447.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/grass-trees_colormap.png"
dest_files=["res://.godot/imported/grass-trees_colormap.png-dfa57c874305a3beb22f3746cd6c2447.s3tc.ctex", "res://.godot/imported/grass-trees_colormap.png-dfa57c874305a3beb22f3746cd6c2447.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://rgjlbnpscmcx"
path.s3tc="res://.godot/imported/grass_colormap.png-65dd6ce9d27477b7e7324a3ab6dee258.s3tc.ctex"
path.etc2="res://.godot/imported/grass_colormap.png-65dd6ce9d27477b7e7324a3ab6dee258.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/grass_colormap.png"
dest_files=["res://.godot/imported/grass_colormap.png-65dd6ce9d27477b7e7324a3ab6dee258.s3tc.ctex", "res://.godot/imported/grass_colormap.png-65dd6ce9d27477b7e7324a3ab6dee258.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://btnuo8yvjhy72"
path.s3tc="res://.godot/imported/orb_RainbowColors.png-2d51321055a3a12d1e6bcc85d1ce04af.s3tc.ctex"
path.etc2="res://.godot/imported/orb_RainbowColors.png-2d51321055a3a12d1e6bcc85d1ce04af.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "5cb645f3a6895ac3a963ac6f29d24d20"
}
[deps]
source_file="res://models/orb_RainbowColors.png"
dest_files=["res://.godot/imported/orb_RainbowColors.png-2d51321055a3a12d1e6bcc85d1ce04af.s3tc.ctex", "res://.godot/imported/orb_RainbowColors.png-2d51321055a3a12d1e6bcc85d1ce04af.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c27x4wfj6uifw"
path.s3tc="res://.godot/imported/orb_colormap.png-ced5b4e7d6e64fa19ecb895f59467c27.s3tc.ctex"
path.etc2="res://.godot/imported/orb_colormap.png-ced5b4e7d6e64fa19ecb895f59467c27.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/orb_colormap.png"
dest_files=["res://.godot/imported/orb_colormap.png-ced5b4e7d6e64fa19ecb895f59467c27.s3tc.ctex", "res://.godot/imported/orb_colormap.png-ced5b4e7d6e64fa19ecb895f59467c27.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://oo7o4pp68xgr"
path.s3tc="res://.godot/imported/pavement-fountain_colormap.png-d827cc6b1a4dc607aa80cf851d86b35e.s3tc.ctex"
path.etc2="res://.godot/imported/pavement-fountain_colormap.png-d827cc6b1a4dc607aa80cf851d86b35e.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/pavement-fountain_colormap.png"
dest_files=["res://.godot/imported/pavement-fountain_colormap.png-d827cc6b1a4dc607aa80cf851d86b35e.s3tc.ctex", "res://.godot/imported/pavement-fountain_colormap.png-d827cc6b1a4dc607aa80cf851d86b35e.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bxv7gyds50dps"
path.s3tc="res://.godot/imported/pavement_colormap.png-49f7e71226550d61a313322246614540.s3tc.ctex"
path.etc2="res://.godot/imported/pavement_colormap.png-49f7e71226550d61a313322246614540.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/pavement_colormap.png"
dest_files=["res://.godot/imported/pavement_colormap.png-49f7e71226550d61a313322246614540.s3tc.ctex", "res://.godot/imported/pavement_colormap.png-49f7e71226550d61a313322246614540.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://rmdd8v6vmym5"
path.s3tc="res://.godot/imported/road-intersection_colormap.png-c61e4b104cdf6bfa6866d3f91af681fd.s3tc.ctex"
path.etc2="res://.godot/imported/road-intersection_colormap.png-c61e4b104cdf6bfa6866d3f91af681fd.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/road-intersection_colormap.png"
dest_files=["res://.godot/imported/road-intersection_colormap.png-c61e4b104cdf6bfa6866d3f91af681fd.s3tc.ctex", "res://.godot/imported/road-intersection_colormap.png-c61e4b104cdf6bfa6866d3f91af681fd.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dcamohwwb5prk"
path="res://.godot/imported/road-split_colormap.png-d20fd957a58f362b47c3e36589efd30c.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/road-split_colormap.png"
dest_files=["res://.godot/imported/road-split_colormap.png-d20fd957a58f362b47c3e36589efd30c.ctex"]
[params]
compress/mode=0
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=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,39 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cckpaetm6elpf"
path.s3tc="res://.godot/imported/road-straight-lightposts_colormap.png-c8d1253418f218a084df50c53c513432.s3tc.ctex"
path.etc2="res://.godot/imported/road-straight-lightposts_colormap.png-c8d1253418f218a084df50c53c513432.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/road-straight-lightposts_colormap.png"
dest_files=["res://.godot/imported/road-straight-lightposts_colormap.png-c8d1253418f218a084df50c53c513432.s3tc.ctex", "res://.godot/imported/road-straight-lightposts_colormap.png-c8d1253418f218a084df50c53c513432.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ddl8lrcoeovpw"
path="res://.godot/imported/road-straight_colormap.png-b6a117d52548e61c263bb6e65713a481.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "007d2d2af08d0a09042bcd8910fe8d8f"
}
[deps]
source_file="res://models/road-straight_colormap.png"
dest_files=["res://.godot/imported/road-straight_colormap.png-b6a117d52548e61c263bb6e65713a481.ctex"]
[params]
compress/mode=0
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=1

Binary file not shown.

@ -0,0 +1,37 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://h0vrvst3cumo"
path="res://.godot/imported/store.glb-eb219227761a994cd73630b580ffec3c.scn"
[deps]
source_file="res://models/store.glb"
dest_files=["res://.godot/imported/store.glb-eb219227761a994cd73630b580ffec3c.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=0
gltf/embedded_image_handling=1

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

@ -33,6 +33,7 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_6vdxc")
show_mission_select = true
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 1
@ -151,6 +152,22 @@ texture_normal = ExtResource("6_i1y88")
ignore_texture_size = true
stretch_mode = 5
[node name="Separator5" type="VSeparator" parent="HBoxContainer"]
layout_mode = 2
theme_override_constants/separation = 10
[node name="MissionSelectItem" type="HBoxContainer" parent="HBoxContainer"]
layout_mode = 2
mouse_filter = 0
theme_override_constants/separation = 8
[node name="MissionSelectButton" type="Button" parent="HBoxContainer/MissionSelectItem"]
custom_minimum_size = Vector2(120, 40)
layout_mode = 2
size_flags_vertical = 4
mouse_default_cursor_shape = 2
text = "Missions"
[node name="PopulationTooltip" type="Control" parent="."]
visible = false
layout_mode = 1
@ -207,3 +224,4 @@ autowrap_mode = 3
[connection signal="mouse_exited" from="HBoxContainer/ElectricityItem/ElectricityIcon" to="." method="_on_electricity_icon_mouse_exited"]
[connection signal="pressed" from="HBoxContainer/SoundItem/SoundButton" to="." method="_on_sound_button_pressed"]
[connection signal="pressed" from="HBoxContainer/HelpItem/HelpButton" to="." method="_on_help_button_pressed"]
[connection signal="pressed" from="HBoxContainer/MissionSelectItem/MissionSelectButton" to="." method="_on_mission_select_button_pressed"]

@ -1,4 +1,4 @@
[gd_scene load_steps=64 format=3 uid="uid://vgwrcfy1qawf"]
[gd_scene load_steps=72 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"]
@ -7,17 +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://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="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"]
@ -29,6 +33,7 @@
[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="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"]
@ -52,11 +57,12 @@
[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://be2nkvjhpebhi" 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")
@ -91,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
@ -150,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("21_y11qv"), 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")
@ -200,9 +249,12 @@ 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"), 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("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")

@ -0,0 +1,80 @@
[gd_scene load_steps=3 format=3 uid="uid://btfwonjc8uj0w"]
[ext_resource type="Script" uid="uid://cm44v0080tvuo" path="res://scripts/mission_select_menu.gd" id="1_h1yuf"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bprw3"]
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="MissionSelectMenu" 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_h1yuf")
[node name="Panel" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -200.0
offset_top = 40.0
offset_right = 200.0
offset_bottom = 560.0
grow_horizontal = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_bprw3")
[node name="Label" type="Label" parent="Panel"]
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -150.0
offset_top = 10.0
offset_right = 150.0
offset_bottom = 50.0
grow_horizontal = 2
theme_override_font_sizes/font_size = 24
text = "Mission Select (Debug)"
horizontal_alignment = 1
[node name="ScrollContainer" type="ScrollContainer" parent="."]
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -180.0
offset_top = 80.0
offset_right = 180.0
offset_bottom = 540.0
grow_horizontal = 2
[node name="MissionContainer" type="VBoxContainer" parent="ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 10
[node name="CloseButton" type="Button" parent="."]
layout_mode = 1
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -620.0
offset_top = 40.0
offset_right = -580.0
offset_bottom = 80.0
grow_horizontal = 0
text = "X"
[connection signal="pressed" from="CloseButton" to="." method="hide"]

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

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

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

@ -232,7 +232,7 @@ func action_build(gridmap_position):
var is_terrain = structures[index].type == Structure.StructureType.TERRAIN
# Check if we're in mission 3 (when we should use construction workers)
var use_worker_construction = true
var use_worker_construction = structures[index].spawn_builder
var mission_manager = get_node_or_null("/root/Main/MissionManager")
# Sound effects are handled via game_manager.gd through the structure_placed signal
@ -264,7 +264,7 @@ func action_build(gridmap_position):
# We still set the cell item for collision detection
gridmap.set_cell_item(gridmap_position, index, gridmap.get_orthogonal_index_from_basis(selector.basis))
elif is_residential and use_worker_construction:
elif is_residential or use_worker_construction:
# For residential buildings in mission 3, use construction workers
# Pass the current selector basis to preserve rotation
var selector_basis = selector.basis
@ -812,26 +812,27 @@ func _add_terrain(position: Vector3, structure_index: int):
# Callback for when construction is completed
func _on_construction_completed(position: Vector3):
# We need to find a residential structure index to add to gridmap
var residential_index = -1
for i in range(structures.size()):
if structures[i].type == Structure.StructureType.RESIDENTIAL_BUILDING:
residential_index = i
break
# Get the original structure index that was selected for construction
var structure_index = -1
var rotation_index = 0
if construction_manager and construction_manager.construction_sites.has(position):
var site = construction_manager.construction_sites[position]
if site.has("structure_index"):
structure_index = site["structure_index"]
if site.has("rotation_index"):
rotation_index = site["rotation_index"]
# If we couldn't get the original structure index, fall back to finding any residential building
if structure_index < 0 or structure_index >= structures.size():
for i in range(structures.size()):
if structures[i].type == Structure.StructureType.RESIDENTIAL_BUILDING:
structure_index = i
break
if residential_index >= 0:
# Get the rotation index from the construction manager if available
var rotation_index = 0
# Try to get the rotation index from the construction manager
if construction_manager and construction_manager.construction_sites.has(position):
var site = construction_manager.construction_sites[position]
if site.has("rotation_index"):
rotation_index = site["rotation_index"]
# Add the completed residential building to the gridmap with the correct rotation
gridmap.set_cell_item(position, residential_index, rotation_index)
if structure_index >= 0:
# Add the completed building to the gridmap with the correct rotation and structure index
gridmap.set_cell_item(position, structure_index, rotation_index)
# Check if we need to spawn a character for mission 1
var mission_manager = get_node_or_null("/root/Main/MissionManager")

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

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

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

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

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

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

@ -1,15 +1,21 @@
extends Node
# Signals
signal electricity_updated(usage, production)
signal population_updated(count)
# Variables
var total_population: int = 0
var total_kW_usage: float = 0.0
var total_kW_production: float = 0.0
@export var show_mission_select: bool = false:
set(value):
show_mission_select = value
_update_mission_select_visibility()
# References
var buildeJuj
var mission_select_menu: Control
var mission_select_button: Button
var building_construction_manager
var population_label: Label
var electricity_label: Label
@ -18,7 +24,7 @@ var population_tooltip: Control
var electricity_tooltip: Control
var controls_panel: PanelContainer
var sound_panel: PanelContainer
var builder:Node
var builder: Node
func _ready():
# Connect to signals from the builder
@ -27,17 +33,27 @@ func _ready():
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
electricity_label = $HBoxContainer/ElectricityItem/ElectricityValues/ElectricityLabel
electricity_label = $HBoxContainer/ElectricityItem/ElectricityValues/ElectricityLabel
electricity_indicator = $HBoxContainer/ElectricityItem/ElectricityValues/ElectricityIndicator
population_tooltip = $PopulationTooltip
electricity_tooltip = $ElectricityTooltip
mission_select_button = $HBoxContainer/MissionSelectItem/MissionSelectButton
# Get references to panels
controls_panel = get_node_or_null("/root/Main/CanvasLayer/ControlsPanel")
sound_panel = get_node_or_null("/root/Main/CanvasLayer/SoundPanel")
# Setup mission select button
if mission_select_button:
mission_select_button.connect("pressed", _on_mission_select_button_pressed)
# Setup mission select menu
_setup_mission_select_menu()
# Update mission select visibility based on export variable
_update_mission_select_visibility()
# Ensure electricity indicator starts with red color
if electricity_indicator:
@ -62,7 +78,38 @@ func _ready():
electricity_tooltip.visible = false
# Update HUD
update_hud()
update_hud()
# Set up the mission select menu
func _setup_mission_select_menu():
# Check if the mission select menu already exists
mission_select_menu = get_node_or_null("/root/Main/CanvasLayer/MissionSelectMenu")
# If not, instantiate and add it
if not mission_select_menu:
var mission_select_scene = load("res://scenes/mission_select_menu.tscn")
if mission_select_scene:
mission_select_menu = mission_select_scene.instantiate()
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
# Update mission select visibility based on export variable
func _update_mission_select_visibility():
var mission_select_item = $HBoxContainer/MissionSelectItem
if mission_select_item:
mission_select_item.visible = show_mission_select
# Handle mission select button press
func _on_mission_select_button_pressed():
if mission_select_menu:
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()
func _process(delta):

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

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

@ -81,7 +81,16 @@ func start_construction(position: Vector3, structure_index: int, rotation_basis
}
# Place plot marker (outline/transparent version of the building)
var plot = building_plot_scene.instantiate()
var plot
# Use the actual structure model for the transparent preview if available
if structure_index >= 0 and structure_index < builder.structures.size():
var structure = builder.structures[structure_index]
plot = structure.model.instantiate()
else:
# Fallback to default building model
plot = building_plot_scene.instantiate()
plot.name = "Plot_" + str(int(position.x)) + "_" + str(int(position.z))
# Make it a transparent outline by applying transparency to all materials
@ -100,8 +109,26 @@ func start_construction(position: Vector3, structure_index: int, rotation_basis
# Store reference
construction_sites[position]["plot"] = plot
# Find a road position to spawn the worker
_spawn_worker_for_construction(position)
# Check if we should spawn a worker based on structure type
var should_spawn_worker = false
if structure_index >= 0 and structure_index < builder.structures.size():
var structure = builder.structures[structure_index]
# Check if this structure type should spawn a builder
if structure.spawn_builder:
should_spawn_worker = true
else:
# Default to true if we can't determine the structure type
should_spawn_worker = true
# Find a road position to spawn the worker if needed
if should_spawn_worker:
_spawn_worker_for_construction(position)
else:
# For structures without workers, start a timer to complete construction automatically
var timer = get_tree().create_timer(CONSTRUCTION_TIME)
timer.timeout.connect(func(): _complete_construction(position))
# Send building_selected dialog to learning companion if available in the current mission
var mission_manager = builder.get_node_or_null("/root/Main/MissionManager")
@ -305,26 +332,23 @@ func _complete_construction(position: Vector3):
# Update mission objective now that construction is complete
# _update_mission_objective_on_completion(site["structure_index"])
# Check if we should spawn a resident
# Check if we should spawn a resident (only for residential buildings)
var mission_manager = builder.get_node_or_null("/root/Main/MissionManager")
var should_spawn_resident = true
var should_spawn_resident = false
# Only spawn residents for residential buildings
# Don't spawn a resident for the first building in mission 1
# (let the mission manager handle that case to avoid double spawning)
if mission_manager and mission_manager.current_mission and mission_manager.current_mission.id == "1" and !mission_manager.character_spawned:
should_spawn_resident = false
var structure = builder.structures[site["structure_index"]]
if structure.type == Structure.StructureType.RESIDENTIAL_BUILDING:
should_spawn_resident = true
# Spawn a resident from the new building (except for first building in mission 1)
# Spawn a resident from the new residential building if appropriate
if should_spawn_resident:
_spawn_resident_from_building(position)
var structure = builder.structures[site["structure_index"]]
if structure.type == Structure.StructureType.RESIDENTIAL_BUILDING and structure.population_count > 0:
update_population(structure.population_count)
# hud.total_population += structure.population_count
# hud.update_hud()
# hud.population_updated.emit(hud.total_population)
#
# Emit completion signal
construction_completed.emit(position)
@ -351,8 +375,14 @@ func handle_demolition(position: Vector3):
# Place the final building at the construction site
func _place_final_building(position: Vector3, structure_index: int):
# Create the final building
var building = final_building_scene.instantiate()
# Create the final building using the actual selected structure model
var building
if structure_index >= 0 and structure_index < builder.structures.size():
building = builder.structures[structure_index].model.instantiate()
else:
# Fallback to our default model if structure index is invalid
building = final_building_scene.instantiate()
building.name = "Building_" + str(int(position.x)) + "_" + str(int(position.z))
# Add to scene at the correct position and scale

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

@ -337,6 +337,22 @@ func is_structure_of_current_mission(structure:Structure):
return true
else:
return false
if not current_mission:
print("ERROR: No current mission to check structure against")
return false
# Handle BUILD_STRUCTURE objective type with COMMERCIAL_BUILDING type
if current_objective.type == ObjectiveType.BUILD_STRUCTURE and current_objective.structure.type == Structure.StructureType.COMMERCIAL_BUILDING:
# For commercial buildings, check if the placed structure is also a commercial building
if structure.type == Structure.StructureType.COMMERCIAL_BUILDING:
print("Commercial building match for store objective")
return true
# Exact match check (original behavior)
if current_objective.structure == structure:
return true
else:
return false
func check_objective_completion(mission_id, objective_type):

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

@ -0,0 +1,171 @@
extends Control
# Signal when a mission is selected
signal mission_selected(mission_id: String)
# Reference to the mission manager
var mission_manager: MissionManager
var builder: Node3D
# Dictionary to store unlockable items for each mission
var mission_unlocks: Dictionary = {}
func _ready():
# Find mission manager
mission_manager = get_node_or_null("/root/Main/MissionManager")
builder = get_node_or_null("/root/Main/Builder")
if not mission_manager:
push_error("Mission select menu: MissionManager not found")
hide()
return
if not builder:
push_error("Mission select menu: Builder not found")
hide()
return
# Set up the mission button container
var container = $ScrollContainer/MissionContainer
# Clear any existing children
for child in container.get_children():
child.queue_free()
# Build the dictionary of unlockable items per mission
_build_mission_unlocks_dictionary()
# Add mission buttons
for mission in mission_manager.missions:
var button = Button.new()
button.text = mission.id + ": " + mission.title
button.custom_minimum_size = Vector2(300, 40)
button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
# Connect button press to handler
button.connect("pressed", _on_mission_button_pressed.bind(mission.id))
container.add_child(button)
# Function to build the dictionary of unlockable items per mission
func _build_mission_unlocks_dictionary():
mission_unlocks.clear()
# Add empty arrays for each mission
for mission in mission_manager.missions:
mission_unlocks[mission.id] = []
# Fill in the unlockable items for each mission
for mission in mission_manager.missions:
if "unlocked_items" in mission and mission.unlocked_items.size() > 0:
mission_unlocks[mission.id] = mission.unlocked_items
# Called when a mission button is pressed
func _on_mission_button_pressed(mission_id: String):
print("Mission selected: " + mission_id)
# Unlock all structures from previous missions
_unlock_structures_up_to_mission(mission_id)
# Find the mission by ID
var selected_mission = null
for mission in mission_manager.missions:
if mission.id == mission_id:
selected_mission = mission
break
if selected_mission:
# First cancel any active missions
for id in mission_manager.active_missions.keys():
mission_manager.active_missions.erase(id)
# Start the selected mission
mission_manager.start_mission(selected_mission)
# Emit signal
mission_selected.emit(mission_id)
# Hide the menu
hide()
# Function to unlock all structures up to and including the selected mission
func _unlock_structures_up_to_mission(mission_id: String):
print("Unlocking structures up to mission: " + mission_id)
var found_mission = false
var structures_to_unlock = []
# Collect all unlockable structures up to the selected mission
for mission in mission_manager.missions:
# Add this mission's unlockables to the list
if "unlocked_items" in mission and mission.unlocked_items.size() > 0:
for item_path in mission.unlocked_items:
structures_to_unlock.append(item_path)
# If we've reached our target mission, stop
if mission.id == mission_id:
found_mission = true
break
if not found_mission:
push_error("Mission ID not found: " + mission_id)
return
# Unlock the collected structures
for item_path in structures_to_unlock:
_unlock_structure(item_path)
# Make sure the builder updates to reflect the unlocked structures
_update_builder_structures()
# Function to unlock a specific structure by path
func _unlock_structure(item_path: String):
print("Unlocking structure: " + item_path)
# Find the structure in builder's structures
for structure in builder.structures:
if structure.model:
# Check for exact match
if structure.model.resource_path == item_path:
if "unlocked" in structure:
structure.unlocked = true
print("SUCCESS: Unlocked structure: " + structure.model.resource_path)
# Check for filename match
elif structure.model.resource_path.get_file() == item_path.get_file():
if "unlocked" in structure:
structure.unlocked = true
print("SUCCESS: Unlocked structure by filename: " + structure.model.resource_path)
# Check for contains match
elif item_path.get_file() in structure.model.resource_path:
if "unlocked" in structure:
structure.unlocked = true
print("SUCCESS: Unlocked structure by partial match: " + structure.model.resource_path)
# Function to update the builder after unlocking structures
func _update_builder_structures():
if builder:
# Find a valid unlocked structure to set as current
var found_unlocked = false
for i in range(builder.structures.size()):
if "unlocked" in builder.structures[i] and builder.structures[i].unlocked:
builder.index = i
builder.update_structure()
found_unlocked = true
break
if not found_unlocked and builder.structures.size() > 0:
# Force unlock the first structure as fallback
if "unlocked" in builder.structures[0]:
builder.structures[0].unlocked = true
builder.index = 0
builder.update_structure()
# Function to toggle the menu visibility
func toggle_visibility():
visible = !visible
# If becoming visible, refresh mission list
if visible:
_ready()

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

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

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

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

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

@ -36,6 +36,9 @@ enum StructureType {
@export_subgroup("Game Progression")
@export var unlocked:bool = false # Whether this structure is available to the player
@export_subgroup("Construction")
@export var spawn_builder:bool = false # Whether to spawn construction workers for this structure
@export_subgroup("Game Progression")
@export var description: String = "Description" # Whether this structure is available to the player

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

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dvyf637gqxg7u"
path="res://.godot/imported/building-small-c.png-3564ced5333fa9695eacb0f19b88ab72.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/residential/building-small-c.png"
dest_files=["res://.godot/imported/building-small-c.png-3564ced5333fa9695eacb0f19b88ab72.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bpwaedmcigbey"
path="res://.godot/imported/intersection.png-ba6576db20ec47d482d247c776afb746.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/roads/intersection.png"
dest_files=["res://.godot/imported/intersection.png-ba6576db20ec47d482d247c776afb746.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Some files were not shown because too many files have changed in this diff Show More