cashCoPlay is a city of humans.
Not to judge them.
But to understand, heal, and grow with them.
CashCoPlay is about becoming Human, and growing into a Leader
extends Node
var growth_points: int = 0
var current_region: String = "School Zone"
var current_scenario_id: int = 1
func add_growth(points: int) -> void:
growth_points += points
growth_points = clamp(growth_points, 0, 200)
print("Growth Points:", growth_points)
extends Node
var bg_player: AudioStreamPlayer
var sfx_player: AudioStreamPlayer
func _ready() -> void:
bg_player = AudioStreamPlayer.new()
sfx_player = AudioStreamPlayer.new()
add_child(bg_player)
add_child(sfx_player)
# Optional background music (put file in this path)
var music_path := "res://assets/sounds/bg_music.mp3"
if ResourceLoader.exists(music_path):
bg_player.stream = load(music_path)
bg_player.volume_db = -10
bg_player.play()
func play_sfx(path: String) -> void:
if path == "":
return
if not ResourceLoader.exists(path):
print("SFX not found:", path)
return
sfx_player.stream = load(path)
sfx_player.play()
extends Node
# Each scenario:
# - dialogues: array of {speaker, text, sfx(optional)}
# - choices: array of {text, outcome_text, points, sfx(optional)}
var scenarios := {
1: {
"name": "School Zone – Comparison & Mocking",
"dialogues": [
{"speaker":"Friend", "text":"Hey, what did you get in math? I got 20!", "sfx":""},
{"speaker":"You", "text":"I got 15…", "sfx":""},
{"speaker":"Friend", "text":"Wow… weak again!", "sfx":"res://assets/sounds/mock.wav"},
{"speaker":"Narrator", "text":"You feel bad. What do you do now?", "sfx":""}
],
"choices": [
{"text":"Get angry and fight", "outcome_text":"Uncontrolled anger → trouble at school", "points":-10, "sfx":"res://assets/sounds/anger.wav"},
{"text":"Blame yourself and shut down", "outcome_text":"Self-blame → lower confidence", "points":-5, "sfx":"res://assets/sounds/sad.wav"},
{"text":"Say congrats and study more", "outcome_text":"Growth → confidence increases", "points":+15, "sfx":"res://assets/sounds/success.wav"}
]
}
}
extends Node2D
@onready var camera: Camera2D = $Camera2D
var dragging := false
var drag_start := Vector2.ZERO
@export var map_min_x: float = 0.0
@export var map_max_x: float = 3000.0
@export var drag_speed: float = 1.0
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT:
dragging = event.pressed
drag_start = event.position
elif event is InputEventScreenTouch:
dragging = event.pressed
drag_start = event.position
if dragging and (event is InputEventMouseMotion or event is InputEventScreenDrag):
var delta := event.position - drag_start
camera.position.x -= delta.x * drag_speed
camera.position.x = clamp(camera.position.x, map_min_x, map_max_x)
drag_start = event.position
extends TextureButton
@export var region_name: String = "School Zone"
@export var scenario_id: int = 1
func _ready() -> void:
pressed.connect(_on_pressed)
func _on_pressed() -> void:
Global.current_region = region_name
Global.current_scenario_id = scenario_id
get_tree().change_scene_to_file("res://DialogueScene.tscn")
extends Control
@onready var speaker_label: Label = $SpeakerLabel
@onready var text_label: Label = $TextLabel
@onready var choices_container: VBoxContainer = $ChoicesContainer
var scenario: Dictionary
var dialogue_index: int = 0
func _ready() -> void:
# Load scenario database
var data := preload("res://DialogueData.gd").new()
if not data.scenarios.has(Global.current_scenario_id):
text_label.text = "Scenario not found."
return
scenario = data.scenarios[Global.current_scenario_id]
_clear_choices()
_show_next()
func _input(event: InputEvent) -> void:
# Click anywhere to advance dialogue (until choices appear)
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
if choices_container.get_child_count() == 0:
_show_next()
func _show_next() -> void:
var dialogues: Array = scenario["dialogues"]
if dialogue_index < dialogues.size():
var dlg: Dictionary = dialogues[dialogue_index]
speaker_label.text = str(dlg.get("speaker", ""))
text_label.text = str(dlg.get("text", ""))
var sfx := str(dlg.get("sfx", ""))
if sfx != "":
AudioManager.play_sfx(sfx)
dialogue_index += 1
else:
_show_choices()
func _show_choices() -> void:
_clear_choices()
for c in scenario["choices"]:
var btn := Button.new()
btn.text = str(c["text"])
btn.pressed.connect(_on_choice_selected.bind(c))
choices_container.add_child(btn)
func _on_choice_selected(choice: Dictionary) -> void:
_clear_choices()
var outcome_text := str(choice.get("outcome_text", ""))
var points := int(choice.get("points", 0))
var sfx := str(choice.get("sfx", ""))
if sfx != "":
AudioManager.play_sfx(sfx)
Global.add_growth(points)
speaker_label.text = "Outcome"
text_label.text = outcome_text + "\n\nNow go to the Psychology Center to practice a better response."
await get_tree().create_timer(1.5).timeout
get_tree().change_scene_to_file("res://ConsultationCenter.tscn")
func _clear_choices() -> void:
for child in choices_container.get_children():
child.queue_free()
extends Control
@onready var label: Label = $Label
func _ready() -> void:
label.text = "Psychology Center\n\nCoach: Great job reflecting.\nPractice: breathe, name the feeling, choose the next best action.\n\n+20 Growth Points"
AudioManager.play_sfx("res://assets/sounds/success.wav")
Global.add_growth(20)
var back_btn := Button.new()
back_btn.text = "Back to City Map"
back_btn.pressed.connect(_back_to_map)
add_child(back_btn)
func _back_to_map() -> void:
get_tree().change_scene_to_file("res://main.tscn")
