mirror of
https://github.com/tonytins/citylimits
synced 2025-06-25 09:24:44 -04:00
SC3k-style Ordinances
This wound up being a bigger commit than I had initially planned. - New SC3k-style policies based on the advisor code. - Added license file to Font Awesome folder. - Refactored the advisor code so it can handle multiple files. - Updated icons. Should be more consistent now. - Replaced Sims with Animals in ticker text. - Moved dialogs to windows directory.
This commit is contained in:
parent
346ceaacb9
commit
72e2c96542
76 changed files with 2489 additions and 458 deletions
|
@ -15,31 +15,64 @@ onready var rank_label = $Container/Advisor/RankLbl
|
|||
onready var name_label = $Container/Advisor/NameLbl
|
||||
onready var description_label = $Container/DescriptionLbl
|
||||
|
||||
func _start_dialogue(advisor, message):
|
||||
if advisor == SimData.Advisors.CITY_PLANNER:
|
||||
dialogue_file = "res://dialog/advisors/cityplanner.json"
|
||||
_load_dialogue()
|
||||
avatar_texture.texture = preload("res://sprites/avatars/cindy.png")
|
||||
name_label.text = "Cindy Diamond"
|
||||
rank_label.text = "City Planner"
|
||||
elif advisor == SimData.Advisors.FINANCIAL:
|
||||
dialogue_file = "res://dialog/advisors/finacial.json"
|
||||
_load_dialogue()
|
||||
avatar_texture.texture = preload("res://sprites/avatars/kit.png")
|
||||
name_label.text = "Kit Welsh"
|
||||
rank_label.text = "Financial Advisor"
|
||||
elif advisor == SimData.Advisors.FINANCIAL:
|
||||
dialogue_file = "res://dialog/advisors/transport.json"
|
||||
_load_dialogue()
|
||||
avatar_texture.texture = preload("res://sprites/avatars/zc.png")
|
||||
name_label.text = "Zack Casey"
|
||||
rank_label.text = "Transportation Advisor"
|
||||
enum JsonFile {
|
||||
ANNOUNCEMENTS,
|
||||
ANALYSIS
|
||||
}
|
||||
|
||||
func _ready():
|
||||
SimEvents.connect("advisor_message", self, "_advisor_dialogue")
|
||||
SimEvents.connect("policy_analysis", self, "_analysis_dialouge")
|
||||
|
||||
func _init_advisor(file, advisor):
|
||||
match advisor:
|
||||
SimData.Advisors.CITY_PLANNER:
|
||||
match file:
|
||||
JsonFile.ANNOUNCEMENTS:
|
||||
dialogue_file = "res://dialog/advisors/cityplanner.json"
|
||||
JsonFile.ANALYSIS:
|
||||
dialogue_file = "res://dialog/policies/cityplanner_analysis.json"
|
||||
|
||||
avatar_texture.texture = preload("res://sprites/avatars/cindy.png")
|
||||
name_label.text = "Cindy Diamond"
|
||||
rank_label.text = "City Planner"
|
||||
|
||||
SimData.Advisors.FINANCIAL:
|
||||
match file:
|
||||
JsonFile.ANNOUNCEMENTS:
|
||||
dialogue_file = "res://dialog/advisors/finacial.json"
|
||||
JsonFile.ANALYSIS:
|
||||
dialogue_file = "res://dialog/policies/finacial_analysis.json"
|
||||
|
||||
avatar_texture.texture = preload("res://sprites/avatars/kit.png")
|
||||
name_label.text = "Kit Welsh"
|
||||
rank_label.text = "Financial Advisor"
|
||||
|
||||
SimData.Advisors.TRANSPORT:
|
||||
match file:
|
||||
JsonFile.ANNOUNCEMENTS:
|
||||
dialogue_file = "res://dialog/advisors/transport.json"
|
||||
JsonFile.ANALYSIS:
|
||||
dialogue_file = "res://dialog/policies/transport_analysis.json"
|
||||
|
||||
avatar_texture.texture = preload("res://sprites/avatars/zc.png")
|
||||
name_label.text = "Zack Casey"
|
||||
rank_label.text = "Transportation Advisor"
|
||||
|
||||
func _launch_advisor_window(key):
|
||||
_index_dialogue()
|
||||
description_label.text = dialogue_keys[message].text
|
||||
window_title = dialogue_keys[message].name
|
||||
description_label.text = dialogue_keys[key].text
|
||||
window_title = dialogue_keys[key].name
|
||||
show()
|
||||
|
||||
func _advisor_dialogue(advisor, message):
|
||||
_init_advisor(JsonFile.ANNOUNCEMENTS, advisor)
|
||||
_launch_advisor_window(message)
|
||||
|
||||
func _analysis_dialouge(advisor, policy):
|
||||
_init_advisor(JsonFile.ANALYSIS, advisor)
|
||||
_launch_advisor_window(policy)
|
||||
|
||||
func _index_dialogue():
|
||||
var dialogue = _load_dialogue()
|
||||
dialogue_keys.clear()
|
||||
|
@ -52,6 +85,3 @@ func _load_dialogue():
|
|||
file.open(dialogue_file, file.READ)
|
||||
var dialogue = parse_json(file.get_as_text())
|
||||
return dialogue
|
||||
|
||||
func _ready():
|
||||
SimEvents.connect("advisor_message", self, "_start_dialogue")
|
||||
|
|
|
@ -1,17 +1,22 @@
|
|||
extends Node
|
||||
|
||||
const CURRENCY: String = "§"
|
||||
|
||||
var city_name: String = "Furtropolis" # Hard-coded, for now
|
||||
var mayor_name: String = "Defecto"
|
||||
var year: int = 1980
|
||||
var prev_quarter: int
|
||||
var quarter: int = 1
|
||||
var population: int = 0
|
||||
var budget: int = 20000
|
||||
var expenses: int
|
||||
var is_alert: bool = false
|
||||
var on_alert: bool = false
|
||||
var has_ctower: bool = false # Central Tower
|
||||
|
||||
const currency: String = "§"
|
||||
var year: int = 2000
|
||||
var prev_year: int
|
||||
var month: int = 1
|
||||
var prev_month: int
|
||||
var day: int = 1
|
||||
var prev_day: int
|
||||
var total_days: int = 1
|
||||
|
||||
var power_grid: int # Number of power stations in the area. Helps provide redundancies.
|
||||
var power_capacity: int
|
||||
|
@ -37,18 +42,50 @@ enum GameSpeed {
|
|||
FAST
|
||||
}
|
||||
|
||||
enum Advisors {
|
||||
CITY_PLANNER,
|
||||
FINANCIAL
|
||||
enum Level {
|
||||
EASY,
|
||||
MEDIUM,
|
||||
HARD
|
||||
}
|
||||
|
||||
func starting_budget(lev: int):
|
||||
|
||||
if lev == 1 or lev == 0:
|
||||
budget = 20000
|
||||
elif lev == 2:
|
||||
budget = 10000
|
||||
elif lev == 3:
|
||||
budget = 5000
|
||||
else:
|
||||
budget = NAN
|
||||
enum Advisors {
|
||||
CITY_PLANNER,
|
||||
FINANCIAL,
|
||||
TRANSPORT
|
||||
}
|
||||
|
||||
enum Ordinances {
|
||||
# Education
|
||||
CPR_TRAINING,
|
||||
PRO_READING,
|
||||
NHOOD_WATCH,
|
||||
# Financial
|
||||
PARKING_FINES,
|
||||
GAMBLING,
|
||||
SALES_TAX,
|
||||
# Promo
|
||||
ANNUAL_CARNIVAL,
|
||||
BUSINESS_ADS,
|
||||
CITY_BEAUTY,
|
||||
TOURIST_ADS
|
||||
# Health & Safety
|
||||
FREE_CLINICS,
|
||||
JUNIOR_SPORTS,
|
||||
SMOKING_BAN,
|
||||
VOLUNTEER_FIRE,
|
||||
SMOKE_DETECTOR,
|
||||
# Environment
|
||||
ENERGY_CONSERVATION,
|
||||
HOMELESS_SHELTERS,
|
||||
CLEAN_AIR_ACT,
|
||||
TIRE_RECYCLE
|
||||
}
|
||||
|
||||
func starting_budget(lev = Level.EASY):
|
||||
match lev:
|
||||
Level.EASY:
|
||||
budget = 20000
|
||||
Level.MEDIUM:
|
||||
budget = 10000
|
||||
Level.HARD:
|
||||
budget = 5000
|
||||
|
|
|
@ -3,8 +3,15 @@ extends Node
|
|||
signal has_power
|
||||
signal budget
|
||||
signal game_speed
|
||||
|
||||
signal policy_message(policy)
|
||||
signal policy_analysis(advisor, policy)
|
||||
signal advisor_message(advisor, message)
|
||||
|
||||
# News
|
||||
signal send_alert(message)
|
||||
signal resume_news
|
||||
|
||||
# Policies
|
||||
signal clean_air_act
|
||||
signal energy_saving
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
extends HBoxContainer
|
||||
|
||||
onready var city_name = $CityNameLbl
|
||||
onready var budget = $BudgetLbl
|
||||
onready var year = $YearCtr/YearLbl
|
||||
onready var budget = $BudgetCtr/BudgetLbl
|
||||
onready var calendar = $YearCtr/CalendarLbl
|
||||
|
||||
func _process(delta):
|
||||
city_name.text = SimData.city_name
|
||||
budget.text = SimData.currency + str(SimData.budget)
|
||||
year.text = str(SimData.year)
|
||||
budget.text = str(SimData.budget)
|
||||
calendar.text = str(SimData.day) + "/" + str(SimData.month) + "/" + str(SimData.year)
|
||||
|
|
|
@ -10,9 +10,13 @@ enum {
|
|||
const valid_commands = [
|
||||
["money", [ARG_STRING] ],
|
||||
["whereyoufrom", [ARG_STRING] ],
|
||||
["whatyearisit", [ARG_STRING] ]
|
||||
["whatyearisit", [ARG_STRING] ],
|
||||
["show_policy", [ARG_INT]]
|
||||
]
|
||||
|
||||
func show_policy(policy):
|
||||
SimEvents.emit_signal("policy_message", policy)
|
||||
|
||||
func _budget_print(value: int):
|
||||
return "Budget increased to " + str(value)
|
||||
|
||||
|
|
|
@ -1,20 +1,45 @@
|
|||
extends Node2D
|
||||
|
||||
onready var rotate_news = $RotateNews
|
||||
onready var quarters = $Quarters
|
||||
onready var day_cycle = $DayCycle
|
||||
onready var turtle_btn = $Controls/Status/SpeedCtr/TurtleBtn
|
||||
onready var cheeta_btn = $Controls/Status/SpeedCtr/CheetaBtn
|
||||
|
||||
func _ready():
|
||||
SimEvents.connect("resume_news", self, "_resume_rotation")
|
||||
SimEvents.connect("send_alert", self, "_stop_news")
|
||||
|
||||
func _on_Quarters_timeout():
|
||||
SimData.year += 1
|
||||
SimData.prev_quarter = SimData.quarter
|
||||
|
||||
SimEvents.emit_signal("budget")
|
||||
|
||||
func _stop_news():
|
||||
rotate_news.stop()
|
||||
|
||||
func _resume_rotation():
|
||||
rotate_news.start()
|
||||
|
||||
func _on_DayCycle_timeout():
|
||||
|
||||
if SimData.prev_day < 30:
|
||||
SimData.day += 1
|
||||
|
||||
if SimData.prev_day == 30:
|
||||
SimData.month =+ 1
|
||||
SimData.prev_month = SimData.month
|
||||
SimData.day = 1
|
||||
SimEvents.emit_signal("budget")
|
||||
|
||||
if SimData.prev_month == 12:
|
||||
SimData.prev_year = SimData.year
|
||||
SimData.total_days = 1
|
||||
SimData.month = 1
|
||||
SimData.year += 1
|
||||
|
||||
SimData.prev_day = SimData.day
|
||||
|
||||
func _on_TurtleBtn_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
day_cycle.wait_time = 12
|
||||
cheeta_btn.pressed = false
|
||||
|
||||
func _on_CheetaBtn_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
day_cycle.wait_time = 2
|
||||
turtle_btn.pressed = false
|
||||
|
|
69
scripts/policy_window.gd
Normal file
69
scripts/policy_window.gd
Normal file
|
@ -0,0 +1,69 @@
|
|||
extends WindowDialog
|
||||
|
||||
var dialogue_file = "res://dialog/policies/policies.json"
|
||||
|
||||
var dialogue_keys = []
|
||||
var dialogue_name = ""
|
||||
var dialogue_text = ""
|
||||
var policy: int
|
||||
|
||||
onready var ordinance_label = $OrdinanceLbl
|
||||
onready var description_label = $DescPanel/DescriptionLbl
|
||||
|
||||
func _start_dialogue(ordinance):
|
||||
|
||||
_index_dialogue()
|
||||
|
||||
match ordinance:
|
||||
1:
|
||||
policy = 1
|
||||
2:
|
||||
policy = 2
|
||||
3:
|
||||
policy = 3
|
||||
|
||||
var proposel: String = dialogue_keys[policy].text
|
||||
|
||||
if "[name]" in proposel:
|
||||
proposel = proposel.replace("[name]", SimData.mayor_name)
|
||||
|
||||
if "[city]" in proposel:
|
||||
proposel = proposel.replace("[city]", SimData.city_name)
|
||||
|
||||
description_label.text = proposel
|
||||
ordinance_label.text = dialogue_keys[policy].name
|
||||
|
||||
show()
|
||||
|
||||
func _index_dialogue():
|
||||
var dialogue = _load_dialogue()
|
||||
dialogue_keys.clear()
|
||||
for key in dialogue:
|
||||
dialogue_keys.append(dialogue[key])
|
||||
|
||||
func _load_dialogue():
|
||||
var file = File.new()
|
||||
if file.file_exists(dialogue_file):
|
||||
file.open(dialogue_file, file.READ)
|
||||
var dialogue = parse_json(file.get_as_text())
|
||||
return dialogue
|
||||
|
||||
func _ready():
|
||||
SimEvents.connect("policy_message", self, "_start_dialogue")
|
||||
|
||||
func _on_IgnoreBtn_pressed():
|
||||
policy = 0
|
||||
description_label.text = ""
|
||||
ordinance_label.text = ""
|
||||
hide()
|
||||
|
||||
func _on_EnectBtn_pressed():
|
||||
match policy:
|
||||
1: SimEvents.emit_signal("energy_saving")
|
||||
2: SimEvents.emit_signal("clean_air_act")
|
||||
|
||||
func _on_AnalysisBtn_pressed():
|
||||
match policy:
|
||||
1: SimEvents.emit_signal("policy_analysis", SimData.Advisors.CITY_PLANNER, policy)
|
||||
2: SimEvents.emit_signal("policy_analysis", SimData.Advisors.CITY_PLANNER, policy)
|
||||
3: SimEvents.emit_signal("policy_analysis", SimData.Advisors.CITY_PLANNER, policy)
|
|
@ -5,6 +5,11 @@ onready var ticker_text = $TickerTxt
|
|||
var news_file = ""
|
||||
var rng = RandomNumberGenerator.new()
|
||||
var news_keys = []
|
||||
var speices = [
|
||||
"Cat",
|
||||
"Fennec",
|
||||
"Fox"
|
||||
]
|
||||
|
||||
func _index_news():
|
||||
var news = _load_news()
|
||||
|
@ -30,12 +35,8 @@ func _ready():
|
|||
SimEvents.connect("resume_news", self, "_resume_ticker")
|
||||
_random_news("res://dialog/ticker/ticker.json")
|
||||
|
||||
func _process(delta):
|
||||
if get_tree().paused:
|
||||
ticker_text.text = "Simulation Paused"
|
||||
|
||||
func _start_alert(message):
|
||||
SimData.is_alert = true
|
||||
SimData.on_alert = true
|
||||
news_file = "res://dialog/ticker/ticker_alerts.json"
|
||||
ticker_text.text = news_keys[message].text
|
||||
|
||||
|
@ -56,6 +57,11 @@ func _random_news(file):
|
|||
elif "[outlet]" in news:
|
||||
news = news.replace("[outlet]", "Pawprint Press")
|
||||
|
||||
if "[species]" in news:
|
||||
randomize()
|
||||
speices.shuffle()
|
||||
news = news.replace("[species]", speices[rng.randi()%speices.size()])
|
||||
|
||||
if "[city]" in news:
|
||||
news = news.replace("[city]", SimData.city_name)
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@ onready var debug_console = $Console
|
|||
onready var tax_window = $TaxWindow
|
||||
onready var advsior_meet_window = $AdvisorMeet
|
||||
onready var tools_window = $ToolsWindow
|
||||
# onready var news_ticker = $
|
||||
|
||||
func _ready():
|
||||
SimEvents.emit_signal("advisor_message", SimData.Advisors.CITY_PLANNER, 0)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue