Files
tux-typing-plus/scenes/game/comet_zap.gd

186 lines
4.8 KiB
GDScript3
Raw Normal View History

2026-02-10 13:58:50 -05:00
extends Node2D
# word stuff
var word_set
var word_set_file_path
var word_set_file
var word_set_content
var word_set_array
# init random
var alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N",
"O","P","Q","R","S","T","U","V","W","X","Y","Z"]
var comets = []
2026-02-10 22:11:47 -05:00
var active
# display
var viewport_size
var scale_factor_x
var scale_factor_y
2026-02-10 13:58:50 -05:00
2026-02-14 15:35:27 -05:00
# difficulty
2026-02-11 15:16:25 -05:00
var max_delay = 2
2026-02-14 15:35:27 -05:00
var min_delay = .5
2026-02-11 15:16:25 -05:00
var delay = max_delay
2026-02-14 15:35:27 -05:00
var comet_speed = 250
# numbers
2026-02-10 13:58:50 -05:00
var spawn_timer = 0
2026-02-10 22:11:47 -05:00
var max_character_count = 0
2026-02-10 13:58:50 -05:00
2026-02-11 15:16:25 -05:00
# stats
var health = 100
2026-02-14 15:35:27 -05:00
var hit_count = 0.0
2026-02-11 15:16:25 -05:00
var miss_count = 0.0
2026-02-14 15:35:27 -05:00
var comets_processed = 0.0
2026-02-11 15:16:25 -05:00
var total_comets = 0.0
# ui init
2026-02-16 14:37:13 -05:00
var on_top
2026-02-11 15:16:25 -05:00
var hp_label
var acc_label
var miss_label
2026-02-16 14:37:13 -05:00
var damage_overlay
2026-02-11 15:16:25 -05:00
2026-02-10 13:58:50 -05:00
# objects
var comet_source = preload("res://scenes/objects/game/comet.tscn")
2026-02-10 22:11:47 -05:00
var fade
var pause_menu
2026-02-10 13:58:50 -05:00
# Runs on start
func _ready() -> void:
2026-02-11 15:16:25 -05:00
# ready ui
2026-02-10 22:11:47 -05:00
viewport_size = get_viewport_rect().size
2026-02-16 14:37:13 -05:00
on_top = self.get_node("OnTop")
hp_label = on_top.get_node("HUD").get_node("Stack").get_node("Health")
acc_label = on_top.get_node("HUD").get_node("Stack").get_node("Accuracy")
miss_label = on_top.get_node("HUD").get_node("Stack").get_node("MissCount")
damage_overlay = on_top.get_node("Damage")
2026-02-10 22:11:47 -05:00
active = true
2026-02-16 14:37:13 -05:00
pause_menu = on_top.get_node("Pause")
fade = on_top.get_node("Fade")
2026-02-10 22:11:47 -05:00
fade.visible = true
var tween := create_tween()
tween.parallel().tween_property(fade, "modulate:a", 0, 1).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
2026-02-10 13:58:50 -05:00
# Load Corresponding Text File
word_set_file_path = "res://gameplay/word_sets/" + word_set + ".txt"
word_set_file = FileAccess.open(word_set_file_path, FileAccess.READ)
# Gets file contents as text
word_set_content = word_set_file.get_as_text()
# Splits text file contents by line and removes the first entry (its just the name)
word_set_array = word_set_content.split("\n", true)
word_set_array.remove_at(0)
if word_set_array[len(word_set_array)-1] == "":
word_set_array.remove_at(len(word_set_array)-1)
2026-02-10 22:11:47 -05:00
for word in word_set_array:
if len(word) > max_character_count:
print("new longest word: " + str(word) + " " + str(len(word)))
max_character_count = len(word)
2026-02-10 13:58:50 -05:00
#print(word_set_array)
# Runs every frame
func _process(delta: float) -> void:
2026-02-10 22:11:47 -05:00
if active:
2026-02-14 15:35:27 -05:00
if health <= 0:
game_over()
2026-02-10 22:11:47 -05:00
spawn_timer += delta
2026-02-11 15:16:25 -05:00
hp_label.text = "HP: " + str(health)
miss_label.text = "X: " + str(miss_count)
2026-02-10 22:11:47 -05:00
if spawn_timer >= delay:
spawn_timer = 0
spawn_word()
2026-02-10 13:58:50 -05:00
2026-02-14 15:35:27 -05:00
func calculate_accuracy():
var accper = (hit_count)/(comets_processed)*100
acc_label.text = "ACC: " + str(snapped(accper, .02)) + "%"
2026-02-10 13:58:50 -05:00
func spawn_word():
2026-02-10 22:11:47 -05:00
var scan_commet = comet_source.instantiate()
var comet_width = scan_commet.get_node("Sprite").sprite_frames.get_frame_texture("comet",0).get_width()
2026-02-10 13:58:50 -05:00
var new_word = word_set_array[randi_range(0,len(word_set_array)-1)]
2026-02-10 22:11:47 -05:00
var dist = (viewport_size.x - (2*comet_width))/(max_character_count-1)
var offset = comet_width
scan_commet.queue_free()
2026-02-10 13:58:50 -05:00
2026-02-14 15:35:27 -05:00
for chara in new_word:
if chara != " ":
2026-02-10 13:58:50 -05:00
var new_commet = comet_source.instantiate()
2026-02-11 15:16:25 -05:00
total_comets += 1
2026-02-10 22:11:47 -05:00
new_commet.position = Vector2(offset,-128)
2026-02-14 15:35:27 -05:00
new_commet.get_node("Sprite").get_node("Label").text = chara
2026-02-10 13:58:50 -05:00
new_commet.speed = comet_speed
add_child(new_commet)
comets.append(new_commet)
2026-02-10 22:11:47 -05:00
offset += dist
2026-02-11 13:12:16 -05:00
2026-02-14 15:35:27 -05:00
delay = randf_range(min_delay,max_delay)
2026-02-11 15:16:25 -05:00
2026-02-14 15:35:27 -05:00
func miss(comet):
$Miss.play()
health -= comet.damage
comets_processed += 1
miss_count += 1.0
calculate_accuracy()
comets.erase(comet)
comet.queue_free()
2026-02-16 14:37:13 -05:00
var tween1 := create_tween()
tween1.parallel().tween_property(damage_overlay, "modulate:a", .5, .125).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
await tween1.finished
var tween2 := create_tween()
tween2.parallel().tween_property(damage_overlay, "modulate:a", 0, .125).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
2026-02-11 15:16:25 -05:00
func game_over():
2026-02-14 15:35:27 -05:00
active = false
$BackgroundMusic.stop()
2026-02-16 14:37:13 -05:00
on_top.get_node("GameOver").visible = true
2026-02-14 15:35:27 -05:00
$Lose.play()
await $Lose.finished
$Sad.play()
2026-02-10 13:58:50 -05:00
func _input(event):
if event is InputEventKey and event.pressed:
if event.as_text() in alphabet:
2026-02-10 22:11:47 -05:00
if active:
if len(comets) > 0:
var comet = comets[0]
if event.as_text() == comet.get_node("Sprite").get_node("Label").text:
2026-02-16 14:37:13 -05:00
comets.erase(comet)
2026-02-14 15:35:27 -05:00
comets_processed += 1
hit_count += 1
calculate_accuracy()
2026-02-11 15:16:25 -05:00
comet.self_active = false
2026-02-10 22:11:47 -05:00
var laser = Line2D.new()
laser.default_color = Color.RED
laser.points = PackedVector2Array([$Tux.position,comet.position])
add_child(laser)
comet.get_node("Sprite").play("cometbreak")
$CometBreakSound.play()
await comet.get_node("Sprite").animation_finished
laser.queue_free()
comet.queue_free()
elif event.keycode == KEY_ESCAPE:
if pause_menu.visible:
pause_menu.resume()
$BackgroundMusic.play()
else:
$Back.play()
active = false
pause_menu.visible = true
$BackgroundMusic.stop()