the signals
This commit is contained in:
parent
e40dd9305f
commit
17a4804f1a
@ -4,10 +4,13 @@ var texts = PoolStringArray()
|
|||||||
|
|
||||||
func print(text):
|
func print(text):
|
||||||
texts.append(text)
|
texts.append(text)
|
||||||
if texts.size() > 2:
|
if texts.size() > 5:
|
||||||
texts.remove(0)
|
texts.remove(0)
|
||||||
$Label.text = texts.join("\n")
|
$Label.text = texts.join("\n")
|
||||||
$AnimationPlayer.play("Flash")
|
$AnimationPlayer.play("Flash")
|
||||||
|
|
||||||
func _on_AnimationPlayer_animation_finished(anim_name):
|
func _on_AnimationPlayer_animation_finished(anim_name):
|
||||||
texts.resize(0)
|
texts.resize(0)
|
||||||
|
|
||||||
|
func _on_Stats_flash_text(text):
|
||||||
|
self.print(text)
|
||||||
|
76
Main.gd
76
Main.gd
@ -19,18 +19,6 @@ const movements = {
|
|||||||
"soft_drop": Vector3(0, -1, 0)
|
"soft_drop": Vector3(0, -1, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
const SCORES = [
|
|
||||||
[0, 4, 1],
|
|
||||||
[1, 8, 2],
|
|
||||||
[3, 12],
|
|
||||||
[5, 16],
|
|
||||||
[8]
|
|
||||||
]
|
|
||||||
const LINES_CLEARED_NAMES = ["", "SINGLE", "DOUBLE", "TRIPLE", "TETRIS"]
|
|
||||||
const T_SPIN_NAMES = ["", "T-SPIN", "MINI T-SPIN"]
|
|
||||||
|
|
||||||
const LINE_CLEAR_MIDI_CHANNELS = [2, 6]
|
|
||||||
|
|
||||||
var random_bag = []
|
var random_bag = []
|
||||||
|
|
||||||
var next_piece = random_piece()
|
var next_piece = random_piece()
|
||||||
@ -42,6 +30,9 @@ var autoshift_action = ""
|
|||||||
|
|
||||||
var playing = true
|
var playing = true
|
||||||
|
|
||||||
|
signal piece_dropped(score)
|
||||||
|
signal piece_locked(lines, t_spin)
|
||||||
|
|
||||||
func random_piece():
|
func random_piece():
|
||||||
if not random_bag:
|
if not random_bag:
|
||||||
random_bag = [
|
random_bag = [
|
||||||
@ -62,14 +53,7 @@ func new_game():
|
|||||||
$Stats.new_game()
|
$Stats.new_game()
|
||||||
new_piece()
|
new_piece()
|
||||||
resume()
|
resume()
|
||||||
new_level()
|
|
||||||
|
|
||||||
func new_level():
|
|
||||||
$Stats.new_level()
|
$Stats.new_level()
|
||||||
$FlashText.print("Level\n%d"%$Stats.level)
|
|
||||||
$DropTimer.wait_time = pow(0.8 - (($Stats.level - 1) * 0.007), $Stats.level - 1)
|
|
||||||
if $Stats.level > 15:
|
|
||||||
$LockDelay.wait_time = 0.5 * pow(0.9, $Stats.level-15)
|
|
||||||
|
|
||||||
func new_piece():
|
func new_piece():
|
||||||
current_piece = next_piece
|
current_piece = next_piece
|
||||||
@ -125,15 +109,13 @@ func _on_AutoShiftTimer_timeout():
|
|||||||
func process_autoshift_action():
|
func process_autoshift_action():
|
||||||
if move(movements[autoshift_action]):
|
if move(movements[autoshift_action]):
|
||||||
if autoshift_action == "soft_drop":
|
if autoshift_action == "soft_drop":
|
||||||
$Stats.score += 1
|
emit_signal("piece_dropped", 1)
|
||||||
$Stats/HBC/VBC1/Score.text = str($Stats.score)
|
|
||||||
|
|
||||||
func hard_drop():
|
func hard_drop():
|
||||||
var score = 0
|
var score = 0
|
||||||
while move(movements["soft_drop"]):
|
while move(movements["soft_drop"]):
|
||||||
score += 2
|
score += 2
|
||||||
$Stats.score += score
|
emit_signal("piece_dropped", score)
|
||||||
$Stats/HBC/VBC1/Score.text = str($Stats.score)
|
|
||||||
lock()
|
lock()
|
||||||
|
|
||||||
func move(movement):
|
func move(movement):
|
||||||
@ -158,50 +140,11 @@ func _on_LockDelay_timeout():
|
|||||||
lock()
|
lock()
|
||||||
|
|
||||||
func lock():
|
func lock():
|
||||||
var score
|
|
||||||
$GridMap.lock(current_piece)
|
$GridMap.lock(current_piece)
|
||||||
remove_child(current_piece)
|
remove_child(current_piece)
|
||||||
var lines_cleared = $GridMap.clear_lines()
|
emit_signal("piece_locked", $GridMap.clear_lines(), current_piece.t_spin)
|
||||||
if lines_cleared or current_piece.t_spin:
|
|
||||||
score = SCORES[lines_cleared][current_piece.t_spin]
|
|
||||||
$Stats.update_score(score)
|
|
||||||
if current_piece.t_spin:
|
|
||||||
$FlashText.print(T_SPIN_NAMES[current_piece.t_spin])
|
|
||||||
if lines_cleared:
|
|
||||||
$FlashText.print(LINES_CLEARED_NAMES[lines_cleared])
|
|
||||||
$FlashText.print(str(100*score))
|
|
||||||
|
|
||||||
# Combos
|
|
||||||
if lines_cleared:
|
|
||||||
$Stats.combos += 1
|
|
||||||
if $Stats.combos > 0:
|
|
||||||
$Stats.score += (20 if lines_cleared==1 else 50) * $Stats.combos * $Stats.level
|
|
||||||
$Stats/HBC/VBC1/Score.text = str($Stats.score)
|
|
||||||
if $Stats.combos == 1:
|
|
||||||
$FlashText.print("COMBO")
|
|
||||||
else:
|
|
||||||
$FlashText.print("COMBO x%d"%$Stats.combos)
|
|
||||||
|
|
||||||
# SFX
|
|
||||||
if lines_cleared == Tetromino.NB_MINOES:
|
|
||||||
for channel in LINE_CLEAR_MIDI_CHANNELS:
|
|
||||||
$MidiPlayer.channel_status[channel].vomume = 127
|
|
||||||
$LineCLearTimer.wait_time = 0.86
|
|
||||||
else:
|
|
||||||
for channel in LINE_CLEAR_MIDI_CHANNELS:
|
|
||||||
$MidiPlayer.channel_status[channel].vomume = 100
|
|
||||||
$LineCLearTimer.wait_time = 0.43
|
|
||||||
$MidiPlayer.unmute_channels(LINE_CLEAR_MIDI_CHANNELS)
|
|
||||||
$LineCLearTimer.start()
|
|
||||||
else:
|
|
||||||
$Stats.combos = -1
|
|
||||||
if $Stats.goal <= 0:
|
|
||||||
new_level()
|
|
||||||
new_piece()
|
new_piece()
|
||||||
|
|
||||||
func _on_LineCLearTimer_timeout():
|
|
||||||
$MidiPlayer.mute_channels(LINE_CLEAR_MIDI_CHANNELS)
|
|
||||||
|
|
||||||
func hold():
|
func hold():
|
||||||
if not current_piece_held:
|
if not current_piece_held:
|
||||||
current_piece_held = true
|
current_piece_held = true
|
||||||
@ -223,8 +166,8 @@ func resume():
|
|||||||
$LockDelay.start()
|
$LockDelay.start()
|
||||||
$Stats.time = OS.get_system_time_secs() - $Stats.time
|
$Stats.time = OS.get_system_time_secs() - $Stats.time
|
||||||
$Stats/Clock.start()
|
$Stats/Clock.start()
|
||||||
|
$MidiPlayer.mute_channels($MidiPlayer.LINE_CLEAR_MIDI_CHANNELS)
|
||||||
$MidiPlayer.resume()
|
$MidiPlayer.resume()
|
||||||
$MidiPlayer.mute_channels(LINE_CLEAR_MIDI_CHANNELS)
|
|
||||||
$GridMap.visible = true
|
$GridMap.visible = true
|
||||||
next_piece.visible = true
|
next_piece.visible = true
|
||||||
current_piece.visible = true
|
current_piece.visible = true
|
||||||
@ -253,3 +196,8 @@ func game_over():
|
|||||||
func _notification(what):
|
func _notification(what):
|
||||||
if what == MainLoop.NOTIFICATION_WM_FOCUS_OUT:
|
if what == MainLoop.NOTIFICATION_WM_FOCUS_OUT:
|
||||||
pause()
|
pause()
|
||||||
|
|
||||||
|
func _on_Stats_level_up():
|
||||||
|
$DropTimer.wait_time = pow(0.8 - (($Stats.level - 1) * 0.007), $Stats.level - 1)
|
||||||
|
if $Stats.level > 15:
|
||||||
|
$LockDelay.wait_time = 0.5 * pow(0.9, $Stats.level-15)
|
||||||
|
44
Main.tscn
44
Main.tscn
@ -1,13 +1,14 @@
|
|||||||
[gd_scene load_steps=16 format=2]
|
[gd_scene load_steps=17 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://starmap_g8k.jpg" type="Texture" id=1]
|
[ext_resource path="res://starmap_g8k.jpg" type="Texture" id=1]
|
||||||
[ext_resource path="res://Main.gd" type="Script" id=2]
|
[ext_resource path="res://Main.gd" type="Script" id=2]
|
||||||
[ext_resource path="res://Tetrominos/Mino/MinoLibrary.tres" type="MeshLibrary" id=3]
|
[ext_resource path="res://Tetrominos/Mino/MinoLibrary.tres" type="MeshLibrary" id=3]
|
||||||
[ext_resource path="res://GridMap.gd" type="Script" id=4]
|
[ext_resource path="res://GridMap.gd" type="Script" id=4]
|
||||||
[ext_resource path="res://midi/MidiPlayer.tscn" type="PackedScene" id=5]
|
[ext_resource path="res://midi/MidiPlayer.tscn" type="PackedScene" id=5]
|
||||||
[ext_resource path="res://Stats.tscn" type="PackedScene" id=6]
|
[ext_resource path="res://MidiPlayer.gd" type="Script" id=6]
|
||||||
[ext_resource path="res://FlashText.gd" type="Script" id=7]
|
[ext_resource path="res://Stats.tscn" type="PackedScene" id=7]
|
||||||
[ext_resource path="res://fonts/525-ROUN.TTF" type="DynamicFontData" id=8]
|
[ext_resource path="res://FlashText.gd" type="Script" id=8]
|
||||||
|
[ext_resource path="res://fonts/525-ROUN.TTF" type="DynamicFontData" id=9]
|
||||||
|
|
||||||
[sub_resource type="PanoramaSky" id=1]
|
[sub_resource type="PanoramaSky" id=1]
|
||||||
|
|
||||||
@ -171,7 +172,7 @@ subdivide_depth = 0
|
|||||||
size = 50
|
size = 50
|
||||||
use_mipmaps = true
|
use_mipmaps = true
|
||||||
use_filter = false
|
use_filter = false
|
||||||
font_data = ExtResource( 8 )
|
font_data = ExtResource( 9 )
|
||||||
_sections_unfolded = [ "Font", "Settings" ]
|
_sections_unfolded = [ "Font", "Settings" ]
|
||||||
|
|
||||||
[sub_resource type="Animation" id=7]
|
[sub_resource type="Animation" id=7]
|
||||||
@ -369,26 +370,23 @@ wait_time = 0.03
|
|||||||
one_shot = false
|
one_shot = false
|
||||||
autostart = false
|
autostart = false
|
||||||
|
|
||||||
[node name="LineCLearTimer" type="Timer" parent="." index="10"]
|
[node name="MidiPlayer" parent="." index="10" instance=ExtResource( 5 )]
|
||||||
|
|
||||||
|
script = ExtResource( 6 )
|
||||||
|
loop_start = 1.81
|
||||||
|
|
||||||
|
[node name="LineCLearTimer" type="Timer" parent="MidiPlayer" index="1"]
|
||||||
|
|
||||||
process_mode = 1
|
process_mode = 1
|
||||||
wait_time = 1.41
|
wait_time = 1.41
|
||||||
one_shot = true
|
one_shot = true
|
||||||
autostart = false
|
autostart = false
|
||||||
|
|
||||||
[node name="MidiPlayer" parent="." index="11" instance=ExtResource( 5 )]
|
[node name="Stats" parent="." index="11" instance=ExtResource( 7 )]
|
||||||
|
|
||||||
file = "res://midi/Tetris - Song A.mid"
|
|
||||||
volume_db = -24
|
|
||||||
loop = true
|
|
||||||
loop_start = 1.71
|
|
||||||
soundfont = "res://midi/TimGM6mb.sf2"
|
|
||||||
|
|
||||||
[node name="Stats" parent="." index="12" instance=ExtResource( 6 )]
|
|
||||||
|
|
||||||
visible = false
|
visible = false
|
||||||
|
|
||||||
[node name="FlashText" type="Control" parent="." index="13"]
|
[node name="FlashText" type="Control" parent="." index="12"]
|
||||||
|
|
||||||
anchor_left = 0.0
|
anchor_left = 0.0
|
||||||
anchor_top = 0.0
|
anchor_top = 0.0
|
||||||
@ -402,7 +400,7 @@ mouse_filter = 0
|
|||||||
mouse_default_cursor_shape = 0
|
mouse_default_cursor_shape = 0
|
||||||
size_flags_horizontal = 1
|
size_flags_horizontal = 1
|
||||||
size_flags_vertical = 1
|
size_flags_vertical = 1
|
||||||
script = ExtResource( 7 )
|
script = ExtResource( 8 )
|
||||||
|
|
||||||
[node name="Label" type="Label" parent="FlashText" index="0"]
|
[node name="Label" type="Label" parent="FlashText" index="0"]
|
||||||
|
|
||||||
@ -440,6 +438,12 @@ anims/Flash = SubResource( 7 )
|
|||||||
blend_times = [ ]
|
blend_times = [ ]
|
||||||
_sections_unfolded = [ "Playback Options" ]
|
_sections_unfolded = [ "Playback Options" ]
|
||||||
|
|
||||||
|
[connection signal="piece_dropped" from="." to="Stats" method="_on_Main_piece_dropped"]
|
||||||
|
|
||||||
|
[connection signal="piece_locked" from="." to="Stats" method="_on_Main_piece_locked"]
|
||||||
|
|
||||||
|
[connection signal="piece_locked" from="." to="MidiPlayer" method="_on_Main_piece_locked"]
|
||||||
|
|
||||||
[connection signal="timeout" from="DropTimer" to="." method="_on_DropTimer_timeout"]
|
[connection signal="timeout" from="DropTimer" to="." method="_on_DropTimer_timeout"]
|
||||||
|
|
||||||
[connection signal="timeout" from="LockDelay" to="." method="_on_LockDelay_timeout"]
|
[connection signal="timeout" from="LockDelay" to="." method="_on_LockDelay_timeout"]
|
||||||
@ -448,7 +452,11 @@ _sections_unfolded = [ "Playback Options" ]
|
|||||||
|
|
||||||
[connection signal="timeout" from="AutoShiftTimer" to="." method="_on_AutoShiftTimer_timeout"]
|
[connection signal="timeout" from="AutoShiftTimer" to="." method="_on_AutoShiftTimer_timeout"]
|
||||||
|
|
||||||
[connection signal="timeout" from="LineCLearTimer" to="." method="_on_LineCLearTimer_timeout"]
|
[connection signal="timeout" from="MidiPlayer/LineCLearTimer" to="MidiPlayer" method="_on_LineCLearTimer_timeout"]
|
||||||
|
|
||||||
|
[connection signal="flash_text" from="Stats" to="FlashText" method="_on_Stats_flash_text"]
|
||||||
|
|
||||||
|
[connection signal="level_up" from="Stats" to="." method="_on_Stats_level_up"]
|
||||||
|
|
||||||
[connection signal="animation_finished" from="FlashText/AnimationPlayer" to="FlashText" method="_on_AnimationPlayer_animation_finished"]
|
[connection signal="animation_finished" from="FlashText/AnimationPlayer" to="FlashText" method="_on_AnimationPlayer_animation_finished"]
|
||||||
|
|
||||||
|
19
MidiPlayer.gd
Normal file
19
MidiPlayer.gd
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
extends "midi/MidiPlayer.gd"
|
||||||
|
|
||||||
|
const LINE_CLEAR_MIDI_CHANNELS = [2, 6]
|
||||||
|
|
||||||
|
func _on_Main_piece_locked(lines, t_spin):
|
||||||
|
if lines or t_spin:
|
||||||
|
if lines == Tetromino.NB_MINOES:
|
||||||
|
for channel in LINE_CLEAR_MIDI_CHANNELS:
|
||||||
|
channel_status[channel].vomume = 127
|
||||||
|
$LineCLearTimer.wait_time = 0.86
|
||||||
|
else:
|
||||||
|
for channel in LINE_CLEAR_MIDI_CHANNELS:
|
||||||
|
channel_status[channel].vomume = 100
|
||||||
|
$LineCLearTimer.wait_time = 0.43
|
||||||
|
unmute_channels(LINE_CLEAR_MIDI_CHANNELS)
|
||||||
|
$LineCLearTimer.start()
|
||||||
|
|
||||||
|
func _on_LineCLearTimer_timeout():
|
||||||
|
mute_channels(LINE_CLEAR_MIDI_CHANNELS
|
63
Stats.gd
63
Stats.gd
@ -1,6 +1,16 @@
|
|||||||
extends MarginContainer
|
extends MarginContainer
|
||||||
|
|
||||||
const password= "TETRIS 3000"
|
const password = "TETRIS 3000"
|
||||||
|
|
||||||
|
const SCORES = [
|
||||||
|
[0, 4, 1],
|
||||||
|
[1, 8, 2],
|
||||||
|
[3, 12],
|
||||||
|
[5, 16],
|
||||||
|
[8]
|
||||||
|
]
|
||||||
|
const LINES_CLEARED_NAMES = ["", "SINGLE", "DOUBLE", "TRIPLE", "TETRIS"]
|
||||||
|
const T_SPIN_NAMES = ["", "T-SPIN", "MINI T-SPIN"]
|
||||||
|
|
||||||
var level
|
var level
|
||||||
var goal
|
var goal
|
||||||
@ -9,6 +19,9 @@ var high_score
|
|||||||
var time
|
var time
|
||||||
var combos
|
var combos
|
||||||
|
|
||||||
|
signal flash_text(text)
|
||||||
|
signal level_up
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
var save_game = File.new()
|
var save_game = File.new()
|
||||||
if not save_game.file_exists("user://high_score.save"):
|
if not save_game.file_exists("user://high_score.save"):
|
||||||
@ -31,15 +44,8 @@ func new_level():
|
|||||||
goal += 5 * level
|
goal += 5 * level
|
||||||
$HBC/VBC1/Level.text = str(level)
|
$HBC/VBC1/Level.text = str(level)
|
||||||
$HBC/VBC1/Goal.text = str(goal)
|
$HBC/VBC1/Goal.text = str(goal)
|
||||||
|
emit_signal("flash_text", "Level\n%d"%$level)
|
||||||
func update_score(new_score):
|
emit_signal("level_up")
|
||||||
score += 100 * new_score
|
|
||||||
$HBC/VBC1/Score.text = str(score)
|
|
||||||
goal -= new_score
|
|
||||||
$HBC/VBC1/Goal.text = str(goal)
|
|
||||||
if score > high_score:
|
|
||||||
high_score = score
|
|
||||||
$HBC/VBC1/HighScore.text = str(high_score)
|
|
||||||
|
|
||||||
func _on_Clock_timeout():
|
func _on_Clock_timeout():
|
||||||
var time_elapsed = OS.get_system_time_secs() - time
|
var time_elapsed = OS.get_system_time_secs() - time
|
||||||
@ -55,4 +61,39 @@ func _notification(what):
|
|||||||
save_game.open_encrypted_with_pass("user://high_score.save", File.WRITE, password)
|
save_game.open_encrypted_with_pass("user://high_score.save", File.WRITE, password)
|
||||||
save_game.store_line(str(high_score))
|
save_game.store_line(str(high_score))
|
||||||
save_game.close()
|
save_game.close()
|
||||||
get_tree().quit()
|
get_tree().quit()
|
||||||
|
|
||||||
|
func _on_Main_piece_dropped(score):
|
||||||
|
score += lines
|
||||||
|
$HBC/VBC1/Score.text = str(score)
|
||||||
|
|
||||||
|
func _on_Main_piece_locked(lines, t_spin):
|
||||||
|
if lines or t_spin:
|
||||||
|
if t_spin:
|
||||||
|
$FlashText.print(T_SPIN_NAMES[current_piece.t_spin])
|
||||||
|
if lines:
|
||||||
|
$FlashText.print(LINES_CLEARED_NAMES[lines_cleared])
|
||||||
|
var ds = SCORES[lines_cleared][current_piece.t_spin]
|
||||||
|
goal -= ds
|
||||||
|
$HBC/VBC1/Goal.text = str(goal)
|
||||||
|
ds *= 100
|
||||||
|
emit_signal("flash_text", str(ds))
|
||||||
|
score += ds
|
||||||
|
$HBC/VBC1/Score.text = str(score)
|
||||||
|
if score > high_score:
|
||||||
|
high_score = score
|
||||||
|
$HBC/VBC1/HighScore.text = str(high_score)
|
||||||
|
# Combos
|
||||||
|
if lines:
|
||||||
|
combos += 1
|
||||||
|
if combos > 0:
|
||||||
|
score += (20 if lines==1 else 50) * combos * level
|
||||||
|
$HBC/VBC1/Score.text = str(score)
|
||||||
|
if $Stats.combos == 1:
|
||||||
|
emit_signal("flash_text", "COMBO")
|
||||||
|
else:
|
||||||
|
emit_signal("flash_text", "COMBO x%d"%$Stats.combos)
|
||||||
|
else:
|
||||||
|
$Stats.combos = -1
|
||||||
|
if $Stats.goal <= 0:
|
||||||
|
new_level()
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
|
const Tetromino = preload("res://Tetrominos/Tetromino.gd")
|
||||||
|
|
||||||
const max_track = 16
|
const max_track = 16
|
||||||
const max_channel = 16
|
const max_channel = 16
|
||||||
const max_note_number = 128
|
const max_note_number = 128
|
||||||
@ -419,4 +421,4 @@ func unmute_channels(channels):
|
|||||||
for channel_id in channels:
|
for channel_id in channels:
|
||||||
channel_mute[channel_id] = false
|
channel_mute[channel_id] = false
|
||||||
for note in muted_events[channel_id]:
|
for note in muted_events[channel_id]:
|
||||||
_process_track_event_note_on(channel_status[channel_id], muted_events[channel_id][note])
|
_process_track_event_note_on(channel_status[channel_id], muted_events[channel_id][note]))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user