[gd_scene load_steps=3 format=3 uid="uid://fe1lihrecu3u"] | [gd_scene load_steps=3 format=3 uid="uid://fe1lihrecu3u"] | ||||
[ext_resource type="Script" path="res://scripts/Analyzers/analyzers.gd" id="1_u0rar"] | [ext_resource type="Script" path="res://scripts/Analyzers/analyzers.gd" id="1_u0rar"] | ||||
[ext_resource type="Script" path="res://scripts/Analyzers/level_1.gd" id="2_masw0"] | |||||
[ext_resource type="Script" path="res://scripts/Analyzers/analyzer_level_1.gd" id="2_besvw"] | |||||
[node name="Analyzers" type="Node"] | [node name="Analyzers" type="Node"] | ||||
script = ExtResource("1_u0rar") | script = ExtResource("1_u0rar") | ||||
[node name="Level 1" type="Node" parent="."] | [node name="Level 1" type="Node" parent="."] | ||||
script = ExtResource("2_masw0") | |||||
script = ExtResource("2_besvw") | |||||
[node name="Timer" type="Timer" parent="Level 1"] | |||||
[node name="AnalyzerTimer" type="Timer" parent="."] | |||||
[connection signal="timeout" from="Level 1/Timer" to="Level 1" method="_on_timer_timeout"] | |||||
[connection signal="timeout" from="AnalyzerTimer" to="Level 1" method="_on_timer_timeout"] |
[node name="Buy L1 Analyzer" type="Button" parent="."] | [node name="Buy L1 Analyzer" type="Button" parent="."] | ||||
visible = false | visible = false | ||||
offset_right = 8.0 | |||||
offset_bottom = 8.0 | |||||
offset_left = 538.0 | |||||
offset_top = 348.0 | |||||
offset_right = 546.0 | |||||
offset_bottom = 356.0 | |||||
script = ExtResource("4_fpmpw") | script = ExtResource("4_fpmpw") |
[node name="Messages" parent="." instance=ExtResource("2_d66gc")] | [node name="Messages" parent="." instance=ExtResource("2_d66gc")] | ||||
[node name="Narration" parent="Messages" index="0"] | |||||
offset_top = 169.0 | |||||
[node name="Score" parent="Messages" index="1"] | |||||
offset_left = 330.0 | |||||
offset_top = 130.0 | |||||
offset_right = 525.0 | |||||
offset_bottom = 156.0 | |||||
[node name="Generators" parent="." instance=ExtResource("3_qm46o")] | [node name="Generators" parent="." instance=ExtResource("3_qm46o")] | ||||
[node name="Level 1" parent="Generators" index="0"] | |||||
click_value = 1 | |||||
[node name="Analyzers" parent="." instance=ExtResource("4_kptdw")] | [node name="Analyzers" parent="." instance=ExtResource("4_kptdw")] | ||||
[node name="Main Interface" type="CanvasLayer" parent="."] | [node name="Main Interface" type="CanvasLayer" parent="."] | ||||
[node name="Flag Keeper" type="Node" parent="Main Interface"] | [node name="Flag Keeper" type="Node" parent="Main Interface"] | ||||
script = ExtResource("6_1or7f") | script = ExtResource("6_1or7f") | ||||
[connection signal="narration_end_introduction" from="Messages" to="Main Interface" method="_on_messages_narration_end_introduction"] | |||||
[connection signal="end_introduction" from="Messages/Narration" to="Main Interface" method="_on_narration_end_introduction"] | |||||
[connection signal="section_ended" from="Messages/Narration" to="Main Interface" method="_on_narration_section_ended"] | |||||
[connection signal="gl1_click" from="Generators/Level 1" to="Messages/Score" method="_on_level_1_gl_1_click"] | [connection signal="gl1_click" from="Generators/Level 1" to="Messages/Score" method="_on_level_1_gl_1_click"] | ||||
[connection signal="al1_analyze" from="Analyzers/Level 1" to="Messages/Score" method="_on_level_1_al_1_analyze"] | |||||
[connection signal="al1_analyze" from="Analyzers/Level 1" to="Main Interface" method="_on_level_1_al_1_analyze"] | |||||
[connection signal="interface_ready" from="Main Interface" to="Messages/Narration" method="_on_interface_ready"] | [connection signal="interface_ready" from="Main Interface" to="Messages/Narration" method="_on_interface_ready"] | ||||
[connection signal="interface_ready" from="Main Interface" to="Messages/Score" method="_on_interface_ready"] | [connection signal="interface_ready" from="Main Interface" to="Messages/Score" method="_on_interface_ready"] | ||||
[connection signal="interface_ready" from="Main Interface" to="Generators" method="_on_interface_ready"] | [connection signal="interface_ready" from="Main Interface" to="Generators" method="_on_interface_ready"] |
script = ExtResource("3_tungw") | script = ExtResource("3_tungw") | ||||
[node name="Score Per Second" type="RichTextLabel" parent="."] | [node name="Score Per Second" type="RichTextLabel" parent="."] | ||||
visible = false | |||||
offset_left = 339.0 | |||||
offset_top = 186.0 | |||||
offset_right = 531.0 | |||||
offset_bottom = 216.0 | |||||
offset_left = 262.0 | |||||
offset_top = 65.0 | |||||
offset_right = 454.0 | |||||
offset_bottom = 95.0 | |||||
metadata/_edit_use_anchors_ = true | metadata/_edit_use_anchors_ = true | ||||
[node name="SPS Timer" type="Timer" parent="Score Per Second"] | |||||
[node name="SPSTimer" type="Timer" parent="Score Per Second"] | |||||
autostart = true | autostart = true | ||||
[connection signal="end_introduction" from="Narration" to="." method="_on_narration_end_introduction"] | |||||
[node name="Usage Per Second" type="RichTextLabel" parent="."] | |||||
offset_right = 40.0 | |||||
offset_bottom = 40.0 | |||||
[node name="UPSTimer" type="Timer" parent="Usage Per Second"] | |||||
[connection signal="timeout" from="Score Per Second/SPSTimer" to="Score" method="_on_sps_timer_timeout"] |
extends Node | |||||
@export var num_analyzers = 1 | |||||
@export var analysis_value = 10 | |||||
@export var active = false | |||||
@onready var analyzer_timer = $"../AnalyzerTimer" | |||||
signal al1_analyze(value) | |||||
# Called when the node enters the scene tree for the first time. | |||||
func _ready(): | |||||
pass # Replace with function body. | |||||
# Called every frame. 'delta' is the elapsed time since the previous frame. | |||||
func _process(delta): | |||||
pass | |||||
func add_analyzer(): | |||||
num_analyzers += 1 | |||||
if not active: | |||||
start_analyzing() | |||||
func start_analyzing(): | |||||
if not active: | |||||
active = true | |||||
analyzer_timer.start() | |||||
func _on_analyzer_timer_timeout(): | |||||
if active: | |||||
print("Emitted analysis.") | |||||
al1_analyze.emit(analysis_value * num_analyzers) | |||||
analyzer_timer.start() |
extends Node | extends Node | ||||
@onready var l1 = $"Level 1" | @onready var l1 = $"Level 1" | ||||
@onready var timer = $"Level 1/Timer" | |||||
@onready var analyzer_timer = $"AnalyzerTimer" | |||||
# Called when the node enters the scene tree for the first time. | # Called when the node enters the scene tree for the first time. |
extends Node | |||||
@onready var timer = $Timer | |||||
# Called when the node enters the scene tree for the first time. | |||||
func _ready(): | |||||
pass # Replace with function body. | |||||
# Called every frame. 'delta' is the elapsed time since the previous frame. | |||||
func _process(delta): | |||||
pass | |||||
func _on_timer_timeout(): | |||||
pass # Replace with function body. |
# Called every frame. 'delta' is the elapsed time since the previous frame. | # Called every frame. 'delta' is the elapsed time since the previous frame. | ||||
func _process(delta): | func _process(delta): | ||||
text = "Add L1 Analyzer (costs " + str(main_interface.l1_generator_purchase_cost) + ")" | |||||
text = "Add L1 Analyzer (costs " + str(main_interface.l1_analyzer_purchase_cost) + ")" | |||||
extends Node | extends Node | ||||
@onready var energy_creator = $"Energy Creator" | @onready var energy_creator = $"Energy Creator" | ||||
@onready var buy_l1 = $"Buy L1 Generator" | |||||
@onready var buy_l1_generator = $"Buy L1 Generator" | |||||
@onready var buy_l1_analyzer = $"Buy L1 Analyzer" | |||||
# Called when the node enters the scene tree for the first time. | # Called when the node enters the scene tree for the first time. | ||||
func _ready(): | func _ready(): |
@export var cost = 10 | @export var cost = 10 | ||||
@export var click_value = 1 | @export var click_value = 1 | ||||
@export var num_generators = 0 | |||||
@export var active = false | @export var active = false | ||||
@onready var generator_timer = $"../GeneratorTimer" | @onready var generator_timer = $"../GeneratorTimer" | ||||
@onready var l1_display = $"L1 Display" | @onready var l1_display = $"L1 Display" | ||||
@onready var l1_text | @onready var l1_text | ||||
@onready var my_timer | @onready var my_timer | ||||
@onready var text1 = "Clicking " | |||||
@onready var text2 = " per second!" | |||||
@onready var text1 = " generator" | |||||
@onready var text2 = " clicking " | |||||
@onready var text3 = " per second!" | |||||
signal gl1_click(value) | signal gl1_click(value) | ||||
func _process(delta): | func _process(delta): | ||||
pass | pass | ||||
func add_generator(): | |||||
print("Adding 1 level 1 generator. num_generators was " + str(num_generators) + "...") | |||||
num_generators = num_generators + 1 | |||||
print("Now " + str(num_generators)) | |||||
if not active: | |||||
start_clicking() | |||||
func start_clicking(): | func start_clicking(): | ||||
active = true | active = true | ||||
generator_timer.start() | generator_timer.start() | ||||
func _on_generator_timer_timeout(): | func _on_generator_timer_timeout(): | ||||
if active: | if active: | ||||
print("Emitted click.") | |||||
gl1_click.emit(click_value) | |||||
print("click_value is " + str(click_value) + ", num_generators is " + str(num_generators) + ", Level 1 generator emitted click for " + str(click_value * num_generators)) | |||||
gl1_click.emit(click_value * num_generators) | |||||
generator_timer.start() | generator_timer.start() | ||||
func _on_interface_ready(): | func _on_interface_ready(): |
@onready var analyzers = $"../Analyzers" | @onready var analyzers = $"../Analyzers" | ||||
# Global variables | # Global variables | ||||
@onready var line_thresholds = [1, 5, 10, 25, 75, 300] | |||||
#@onready var line_thresholds = [1, 5, 10, 25, 75, 300] | |||||
@onready var next_threshold: int | @onready var next_threshold: int | ||||
@onready var autoclicker_cost: int = 10 | @onready var autoclicker_cost: int = 10 | ||||
@onready var current_per_second_score: float = 0.0 | @onready var current_per_second_score: float = 0.0 | ||||
func _ready(): | func _ready(): | ||||
# SETUP | # SETUP | ||||
# This is set in inspector options, but just in case. | # This is set in inspector options, but just in case. | ||||
click_target.buy_l1_generator.visible = false | |||||
messages.narration.json_content = get_json_file_content(messages.narration.lines_file_path) | messages.narration.json_content = get_json_file_content(messages.narration.lines_file_path) | ||||
click_target.buy_l1.visible = false | |||||
print("Emitting interface_ready signal.") | print("Emitting interface_ready signal.") | ||||
interface_ready.emit() | interface_ready.emit() | ||||
func update_score(new_score): | func update_score(new_score): | ||||
score_update.emit(new_score) | score_update.emit(new_score) | ||||
if messages.score.total_score == 1: | |||||
pass | |||||
elif messages.score.total_score == 10: | |||||
pass | |||||
for seq in messages.narration.sequences: | |||||
if seq["type"] == "score": | |||||
if messages.score.total_score >= seq["value"] and seq["seen"] == false: | |||||
messages.narration.display_message_section(seq["name"]) | |||||
seq["seen"] = true | |||||
func _on_message_timer_timeout(): | func _on_message_timer_timeout(): | ||||
pass # Replace with function body. | pass # Replace with function body. | ||||
func update_second_score(new_score): | func update_second_score(new_score): | ||||
pass | pass | ||||
func _on_narration_end_introduction(): | |||||
click_target.energy_creator.visible = true | |||||
func _on_energy_creator_pressed(): | func _on_energy_creator_pressed(): | ||||
messages.sps.visible = true | messages.sps.visible = true | ||||
update_score(energy_creator_click_value) | update_score(energy_creator_click_value) | ||||
func _on_buy_l_1_generator_pressed(): | func _on_buy_l_1_generator_pressed(): | ||||
if messages.score.current_score < l1_generator_purchase_cost: | |||||
pass | |||||
update_score(l1_generator_purchase_cost) | update_score(l1_generator_purchase_cost) | ||||
l1_generator_purchase_cost *= l1_generator_mult | l1_generator_purchase_cost *= l1_generator_mult | ||||
l1_generator_purchase_cost = floor(l1_generator_purchase_cost) | |||||
generators.l1.add_generator() | |||||
func _on_buy_l_1_analyzer_pressed(): | func _on_buy_l_1_analyzer_pressed(): | ||||
if messages.score.current_score < l1_analyzer_purchase_cost: | |||||
pass | |||||
update_score(l1_analyzer_purchase_cost) | update_score(l1_analyzer_purchase_cost) | ||||
l1_analyzer_purchase_cost *= l1_analyzer_mult | l1_analyzer_purchase_cost *= l1_analyzer_mult | ||||
l1_analyzer_purchase_cost = floor(l1_analyzer_purchase_cost) | |||||
analyzers.l1.add_analyzer() | |||||
# UTILITY FUNCTIONS | # UTILITY FUNCTIONS | ||||
func get_text_file_content(file_path): | func get_text_file_content(file_path): | ||||
var content = file.get_as_text() | var content = file.get_as_text() | ||||
var json_content = JSON.parse_string(content) | var json_content = JSON.parse_string(content) | ||||
return json_content | return json_content | ||||
func _on_narration_section_ended(section_name): | |||||
if section_name == "introduction": | |||||
click_target.energy_creator.visible = true | |||||
elif section_name == "explain_mechanism": | |||||
click_target.buy_l1_generator.visible = true | |||||
elif section_name == "afford_analyzer": | |||||
click_target.buy_l1_analyzer.visible = true |
@onready var narration_timer = $Narration/MessageTimer | @onready var narration_timer = $Narration/MessageTimer | ||||
@onready var score = $Score | @onready var score = $Score | ||||
@onready var sps = $"Score Per Second" | @onready var sps = $"Score Per Second" | ||||
@onready var sps_timer = $"Score Per Second/SPS Timer" | |||||
signal narration_end_introduction | |||||
@onready var sps_timer = $"Score Per Second/SPSTimer" | |||||
# Called when the node enters the scene tree for the first time. | # Called when the node enters the scene tree for the first time. | ||||
func _ready(): | func _ready(): | ||||
func _process(delta): | func _process(delta): | ||||
pass | pass | ||||
func _on_narration_end_introduction(): | |||||
narration_end_introduction.emit() |
@onready var lines_file_path = "res://text/message_lines.json" | @onready var lines_file_path = "res://text/message_lines.json" | ||||
@export var lines_displayed = [] | @export var lines_displayed = [] | ||||
@export var sequences = [ | |||||
{"value": 0, "type": "score", "name": "introduction", "seen": true, "done": false}, | |||||
{"value": 1, "type": "score", "name": "get_to_10", "seen": false, "done": false}, | |||||
{"value": 10, "type": "score", "name": "explain_mechanism", "seen": false, "done": false}, | |||||
{"value": 25, "type": "score", "name": "bought_generator", "seen": false, "done": false}, | |||||
{"value": 100, "type": "scorepersecond", "name": "afford_analyzer", "seen": false, "done": false} | |||||
] | |||||
signal end_introduction | |||||
signal section_ended(section_name) | |||||
# Called when the node enters the scene tree for the first time. | # Called when the node enters the scene tree for the first time. | ||||
func _ready(): | func _ready(): | ||||
func _centered_message(msg): | func _centered_message(msg): | ||||
return "[center]" + msg + "[/center]" | return "[center]" + msg + "[/center]" | ||||
func display_introduction(): | |||||
print("Displaying introduction.") | |||||
show_message_by_id("introduction", 0) | |||||
await get_tree().create_timer(1.0).timeout | |||||
show_message_by_id("introduction", 1) | |||||
await get_tree().create_timer(0.5).timeout | |||||
end_introduction.emit() | |||||
func display_message_section(section_name): | |||||
print("Displaying " + section_name + ".") | |||||
var num_messages = message_lines[section_name].size() | |||||
for i in num_messages: | |||||
show_message_by_id(section_name, i) | |||||
await get_tree().create_timer(1.0).timeout | |||||
section_ended.emit(section_name) | |||||
func _on_interface_ready(): | func _on_interface_ready(): | ||||
print("Narration received interface_ready signal.") | print("Narration received interface_ready signal.") | ||||
var main_sequence_messages = json_content["main_sequence_messages"] | var main_sequence_messages = json_content["main_sequence_messages"] | ||||
# These dialogue sets are now lists of lists | |||||
print("Got JSON content keys " + ", ".join(main_sequence_messages.keys())) | |||||
for section in main_sequence_messages.keys(): | |||||
message_lines[section] = [] | |||||
var section_lines = main_sequence_messages[section] | |||||
section_lines.sort_custom(func(a,b): return a["id"] < b["id"]) | |||||
for line in section_lines: | |||||
message_lines[section].append(line["text"]) | |||||
display_introduction() | |||||
print("Got " + str(main_sequence_messages.size()) + " message sections from JSON") | |||||
for i in sequences.size(): | |||||
var section_name = sequences[i]["name"] | |||||
message_lines[section_name] = main_sequence_messages[i] | |||||
display_message_section("introduction") |
@export var current_score = 0 | @export var current_score = 0 | ||||
@export var current_second_score = 0 | @export var current_second_score = 0 | ||||
@export var current_score_per_second: float = 0 | |||||
@export var current_second_usage = 0 | |||||
@export var current_usage_per_second: float = 0 | |||||
@export var total_score = 0 | @export var total_score = 0 | ||||
@export var prev_second_scores: Array | @export var prev_second_scores: Array | ||||
@export var prev_second_usages: Array | |||||
@onready var score_per_second = $"../Score Per Second" | @onready var score_per_second = $"../Score Per Second" | ||||
@onready var sps_timer = $"../Score Per Second/SPSTimer" | |||||
@onready var narration = $"../Narration" | @onready var narration = $"../Narration" | ||||
# Called when the node enters the scene tree for the first time. | # Called when the node enters the scene tree for the first time. | ||||
# Called every frame. 'delta' is the elapsed time since the previous frame. | # Called every frame. 'delta' is the elapsed time since the previous frame. | ||||
func _process(delta): | |||||
func _process(_delta): | |||||
pass | pass | ||||
func update(score): | func update(score): | ||||
if score >= 0: | |||||
if score == 0: | |||||
sps_timer.start() | |||||
score_per_second.visible = true | |||||
elif score >= 0: | |||||
# only count positive scores in SPS | |||||
current_second_score += score | current_second_score += score | ||||
total_score += score | |||||
current_score += score | current_score += score | ||||
total_score += score | |||||
update_text(current_score) | update_text(current_score) | ||||
func update_text(score_num): | |||||
func update_text(_score_num): | |||||
text = "Energy: " + str(current_score) | text = "Energy: " + str(current_score) | ||||
score_per_second.text = "Energy per second: " + str(current_score_per_second) | |||||
func _on_interface_ready(): | func _on_interface_ready(): | ||||
pass # Replace with function body. | pass # Replace with function body. | ||||
func _on_score_update(click_value): | func _on_score_update(click_value): | ||||
update(click_value) | update(click_value) | ||||
func _on_level_1_gl_1_click(value): | |||||
#print("Received value " + str(value) + " from level 1 generators") | |||||
update(value) | |||||
func _on_level_1_al_1_analyze(value): | |||||
#print("Received value " + str(value) + " from level 1 analyzers") | |||||
update(0-value) | |||||
func _on_sps_timer_timeout(): | |||||
var loc_current_second = current_second_score | |||||
current_second_score = 0 | |||||
if len(prev_second_scores) >= 5: | |||||
prev_second_scores = prev_second_scores.slice(1,5) | |||||
prev_second_scores.append(loc_current_second) | |||||
var total_second_score = 0 | |||||
var num_scores = 0 | |||||
for s in prev_second_scores: | |||||
total_second_score += s | |||||
num_scores += 1 | |||||
if num_scores <= 0: | |||||
current_score_per_second = 0 | |||||
else: | |||||
var real_current_second_score: float = float(total_second_score) / num_scores | |||||
print("Total second score: " + str(total_second_score) + ", number of scores: " + str(num_scores) + ", real score: " + str(real_current_second_score)) | |||||
current_score_per_second = (floor(real_current_second_score * 100)/100) | |||||
sps_timer.start() |