Add game end condition and restart/quit menu
This commit is contained in:
parent
5c7839d84c
commit
911bceb750
14
TODO.md
14
TODO.md
|
@ -2,23 +2,21 @@
|
||||||
* every now and again, the opponents has new units that spawn
|
* every now and again, the opponents has new units that spawn
|
||||||
* indicator to show respawn is nearing
|
* indicator to show respawn is nearing
|
||||||
* is it all the missing units, or a chance for each?
|
* is it all the missing units, or a chance for each?
|
||||||
2. game end
|
2. Power ups
|
||||||
* when a side is out of pieces
|
|
||||||
3. Power ups
|
|
||||||
* a chance of having power ups spawn on an random unoccupied square when a unit dies
|
* a chance of having power ups spawn on an random unoccupied square when a unit dies
|
||||||
* +health, +attack, +speed, +jump, (pawn only) remove "attack_only", spawn a new (random?) piece, change movement type
|
* +health, +attack, +speed, +jump, (pawn only) remove "attack_only", spawn a new (random?) piece, change movement type
|
||||||
* then the enemy respawns units, their new untis are stronger
|
* then the enemy respawns units, their new units are stronger
|
||||||
* support for pieces with multiple hit points
|
* support for pieces with multiple hit points
|
||||||
* unit info panel
|
* unit info panel
|
||||||
4. Visual polish
|
3. Visual polish
|
||||||
* clean up tile borders
|
* clean up tile borders
|
||||||
* multiple square tiles to add variation
|
* multiple square tiles to add variation
|
||||||
* make the help text indicate (flash, etc.)
|
* make the help text indicate (flash, etc.)
|
||||||
5. Sound effects
|
4. Sound effects
|
||||||
* on hit
|
* on hit
|
||||||
* on piece lost
|
* on piece lost
|
||||||
* on piece kill
|
* on piece kill
|
||||||
* on opponent victory
|
* on opponent victory
|
||||||
* if possible, a small bit of background music
|
* if possible, a small bit of background music
|
||||||
6. Further visual polish
|
5. Further visual polish
|
||||||
7. New units
|
6. New units
|
||||||
|
|
|
@ -43,6 +43,13 @@ window/size/height=1024
|
||||||
window/stretch/mode="2d"
|
window/stretch/mode="2d"
|
||||||
window/stretch/aspect="keep"
|
window/stretch/aspect="keep"
|
||||||
|
|
||||||
|
[input]
|
||||||
|
|
||||||
|
cancel={
|
||||||
|
"deadzone": 0.5,
|
||||||
|
"events": [ ]
|
||||||
|
}
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
environment/default_environment="res://default_env.tres"
|
environment/default_environment="res://default_env.tres"
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://assets/source/Bitstream Vera Sans Mono Bold Nerd Font Complete.ttf" type="DynamicFontData" id=1]
|
||||||
|
|
||||||
|
[sub_resource type="DynamicFont" id=1]
|
||||||
|
size = 32
|
||||||
|
font_data = ExtResource( 1 )
|
||||||
|
|
||||||
|
[sub_resource type="DynamicFont" id=2]
|
||||||
|
size = 24
|
||||||
|
font_data = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="Control" type="WindowDialog"]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
margin_left = 256.0
|
||||||
|
margin_top = 256.0
|
||||||
|
margin_right = -256.0
|
||||||
|
margin_bottom = -512.0
|
||||||
|
popup_exclusive = true
|
||||||
|
|
||||||
|
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
margin_left = 40.0
|
||||||
|
margin_top = 40.0
|
||||||
|
margin_right = -40.0
|
||||||
|
margin_bottom = -40.0
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="VBoxContainer"]
|
||||||
|
margin_right = 688.0
|
||||||
|
margin_bottom = 38.0
|
||||||
|
custom_fonts/font = SubResource( 1 )
|
||||||
|
text = "Game over!"
|
||||||
|
align = 1
|
||||||
|
valign = 1
|
||||||
|
|
||||||
|
[node name="New" type="Button" parent="VBoxContainer"]
|
||||||
|
margin_top = 42.0
|
||||||
|
margin_right = 688.0
|
||||||
|
margin_bottom = 77.0
|
||||||
|
custom_fonts/font = SubResource( 2 )
|
||||||
|
text = "New Game"
|
||||||
|
|
||||||
|
[node name="Quit" type="Button" parent="VBoxContainer"]
|
||||||
|
margin_top = 81.0
|
||||||
|
margin_right = 688.0
|
||||||
|
margin_bottom = 116.0
|
||||||
|
custom_fonts/font = SubResource( 2 )
|
||||||
|
text = "Quit"
|
48
src/Game.gd
48
src/Game.gd
|
@ -238,8 +238,31 @@ func _ready():
|
||||||
self.pf_scale = scale
|
self.pf_scale = scale
|
||||||
self.rng = RandomNumberGenerator.new()
|
self.rng = RandomNumberGenerator.new()
|
||||||
self.rng.randomize()
|
self.rng.randomize()
|
||||||
reset_game_state()
|
|
||||||
|
|
||||||
|
get_node("/root/Game/EndMenu/VBoxContainer/New").connect("pressed", self, "_on_new_game_pressed")
|
||||||
|
get_node("/root/Game/EndMenu/VBoxContainer/Quit").connect("pressed", self, "_on_quit_game_pressed")
|
||||||
|
reset_game_state()
|
||||||
|
|
||||||
|
func _input(ev):
|
||||||
|
if Input.is_action_just_pressed("ui_cancel"):
|
||||||
|
print(ev)
|
||||||
|
self._on_escape()
|
||||||
|
|
||||||
|
func _on_escape(force_visible = false):
|
||||||
|
var n = get_node("/root/Game/EndMenu")
|
||||||
|
if n.is_visible() and not force_visible:
|
||||||
|
n.set_visible(false)
|
||||||
|
else:
|
||||||
|
n.popup_centered()
|
||||||
|
|
||||||
|
func _on_new_game_pressed():
|
||||||
|
get_node("/root/Game/EndMenu").set_visible(false)
|
||||||
|
self.reset_game_state()
|
||||||
|
|
||||||
|
func _on_quit_game_pressed():
|
||||||
|
get_node("/root/Game/EndMenu").set_visible(false)
|
||||||
|
get_tree().quit()
|
||||||
|
|
||||||
func reset_game_state():
|
func reset_game_state():
|
||||||
self.is_player_turn = true
|
self.is_player_turn = true
|
||||||
self.turn = 0
|
self.turn = 0
|
||||||
|
@ -318,6 +341,19 @@ func _process(delta):
|
||||||
else:
|
else:
|
||||||
self._reset_help()
|
self._reset_help()
|
||||||
self.flash_help = null
|
self.flash_help = null
|
||||||
|
if get_tree().get_nodes_in_group("opponent").empty() or get_tree().get_nodes_in_group("player").empty():
|
||||||
|
# The game is over
|
||||||
|
self.current_state = 99
|
||||||
|
var player_victory = false
|
||||||
|
if get_tree().get_nodes_in_group("opponent").empty():
|
||||||
|
player_victory = true
|
||||||
|
get_node("/root/Game/TopBar/Bottom/Instruction").set_text("Game over")
|
||||||
|
if not player_victory:
|
||||||
|
get_node("/root/Game/BottomBar/Help").set_text("Unsurprisingly, the result was known before-hand.")
|
||||||
|
else:
|
||||||
|
get_node("/root/Game/BottomBar/Help").set_text("Well, I'll be damned. I didn't think this would happen!")
|
||||||
|
# Show a popup for new one, or quit
|
||||||
|
self._on_escape(true)
|
||||||
if self.current_state == 1:
|
if self.current_state == 1:
|
||||||
if self.ai_target != null:
|
if self.ai_target != null:
|
||||||
var target_square = self.board_squares[self.ai_target]
|
var target_square = self.board_squares[self.ai_target]
|
||||||
|
@ -358,13 +394,19 @@ func _process(delta):
|
||||||
var i = self.rng.randi() % (priority_moves.size())
|
var i = self.rng.randi() % (priority_moves.size())
|
||||||
self.ai_target = priority_moves[i]['pos']
|
self.ai_target = priority_moves[i]['pos']
|
||||||
self.ai_piece = priority_moves[i]['source']
|
self.ai_piece = priority_moves[i]['source']
|
||||||
else:
|
print("Opponent moving ", self.ai_piece, " to ", self.ai_target, " from ", square_of_piece(self.ai_piece))
|
||||||
|
elif not moves.empty():
|
||||||
# @TODO Sort our moves to try and get the furthest forward
|
# @TODO Sort our moves to try and get the furthest forward
|
||||||
# possible
|
# possible
|
||||||
var i = self.rng.randi() % (moves.size())
|
var i = self.rng.randi() % (moves.size())
|
||||||
self.ai_target = moves[i]['pos']
|
self.ai_target = moves[i]['pos']
|
||||||
self.ai_piece = moves[i]['source']
|
self.ai_piece = moves[i]['source']
|
||||||
print("Opponent moving ", self.ai_piece, " to ", self.ai_target, " from ", square_of_piece(self.ai_piece))
|
print("Opponent moving ", self.ai_piece, " to ", self.ai_target, " from ", square_of_piece(self.ai_piece))
|
||||||
|
else:
|
||||||
|
# @TODO Would be a good time to spawn a new piece for the opponent
|
||||||
|
self._on_phase_end()
|
||||||
|
print("No possible moves")
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta):
|
func _physics_process(delta):
|
||||||
if self.landing_piece != null:
|
if self.landing_piece != null:
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
[gd_scene load_steps=6 format=2]
|
[gd_scene load_steps=7 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://src/Game.gd" type="Script" id=1]
|
[ext_resource path="res://src/Game.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://src/Playfield.tscn" type="PackedScene" id=2]
|
[ext_resource path="res://src/Playfield.tscn" type="PackedScene" id=2]
|
||||||
[ext_resource path="res://src/large font.tres" type="DynamicFont" id=3]
|
[ext_resource path="res://src/large font.tres" type="DynamicFont" id=3]
|
||||||
[ext_resource path="res://assets/source/Bitstream Vera Sans Mono Bold Nerd Font Complete.ttf" type="DynamicFontData" id=4]
|
[ext_resource path="res://assets/source/Bitstream Vera Sans Mono Bold Nerd Font Complete.ttf" type="DynamicFontData" id=4]
|
||||||
|
[ext_resource path="res://src/EndMenu.tscn" type="PackedScene" id=5]
|
||||||
|
|
||||||
[sub_resource type="DynamicFont" id=1]
|
[sub_resource type="DynamicFont" id=1]
|
||||||
size = 24
|
size = 24
|
||||||
|
@ -94,3 +95,6 @@ rect_min_size = Vector2( 0, 64 )
|
||||||
custom_fonts/font = SubResource( 1 )
|
custom_fonts/font = SubResource( 1 )
|
||||||
text = "Do a thing"
|
text = "Do a thing"
|
||||||
valign = 1
|
valign = 1
|
||||||
|
|
||||||
|
[node name="EndMenu" parent="." instance=ExtResource( 5 )]
|
||||||
|
visible = true
|
||||||
|
|
Loading…
Reference in New Issue