Support for units with multiple health

This commit is contained in:
Kienan Stewart 2022-04-03 15:28:24 -04:00
parent 5ccbc5ca9e
commit b87a26cc33
4 changed files with 137 additions and 37 deletions

View File

@ -1,16 +1,17 @@
1. Power ups 1. 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 units are stronger
* support for pieces with multiple hit points
2. Visual polish 2. Visual polish
* 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.)
* visual indications when damage is done but a unit isn't killed
* visual indication when a unit is stronger (eg. a little skull or star or something)
3. Sound effects 3. Sound effects
* on hit * on hit, especially when the unit isn't killed
* if possible, a small bit of background music * if possible, a small bit of background music
4. New units 4. New units
5. Further visual polish 5. Further visual polish
* animate the piece making the attack, and returning to it's spot
Bugs of note: Bugs of note:

View File

@ -35,6 +35,7 @@ var ai_piece = null
var reinforcements = null var reinforcements = null
var reinforcements_size = 0 var reinforcements_size = 0
var reinforcements_coords = [] var reinforcements_coords = []
var reinforcement_buff = null
const on_ai_lose_piece = { const on_ai_lose_piece = {
50: "/root/Game/Huh", 50: "/root/Game/Huh",
@ -259,8 +260,14 @@ func _ready():
get_node("/root/Game/EndMenu/VBoxContainer/Quit").connect("pressed", self, "_on_quit_game_pressed") get_node("/root/Game/EndMenu/VBoxContainer/Quit").connect("pressed", self, "_on_quit_game_pressed")
get_node("/root/Game/EndMenu/VBoxContainer/Fail Game").connect("pressed", self, "_on_fail_game") get_node("/root/Game/EndMenu/VBoxContainer/Fail Game").connect("pressed", self, "_on_fail_game")
get_node("/root/Game/EndMenu/VBoxContainer/Win Game").connect("pressed", self, "_on_win_game") get_node("/root/Game/EndMenu/VBoxContainer/Win Game").connect("pressed", self, "_on_win_game")
get_node("/root/Game/PanelRight/VBox/PieceInfo").connect("stat_change_requested", self, "_on_piece_stat_change_requested")
reset_game_state() reset_game_state()
func _on_piece_stat_change_requested(piece, attribute, value):
if piece.get(attribute) != null:
piece.set(attribute, value)
get_node("/root/Game/PanelRight/VBox/PieceInfo").set_piece_info(piece)
func _input(ev): func _input(ev):
if Input.is_action_just_pressed("ui_cancel"): if Input.is_action_just_pressed("ui_cancel"):
print(ev) print(ev)
@ -409,6 +416,13 @@ func _on_new_turn():
var square = self.board_squares[coord] var square = self.board_squares[coord]
if square['piece'] == null: if square['piece'] == null:
new_piece(square['reinforcement'], "opponent", coord) new_piece(square['reinforcement'], "opponent", coord)
square = self.board_squares[coord]
if self.reinforcement_buff != null:
square['piece'].speed += self.reinforcement_buff
square['piece'].damage += self.reinforcement_buff
square['piece'].health += self.reinforcement_buff
if self.reinforcement_buff >= 5:
square['piece'].health = true
else: else:
print("Reinforcement arrival at ", coord, " blocked by piece!") print("Reinforcement arrival at ", coord, " blocked by piece!")
get_node("BottomBar/Help").set_text("Reinforcement at " + str(coord) + " telefragged.") get_node("BottomBar/Help").set_text("Reinforcement at " + str(coord) + " telefragged.")
@ -429,6 +443,10 @@ func _on_new_turn():
get_node("BottomBar/Help").set_text("Multiple opponent reinforcements detected inbound") get_node("BottomBar/Help").set_text("Multiple opponent reinforcements detected inbound")
get_node("/root/Game/ThinkYouCan").play() get_node("/root/Game/ThinkYouCan").play()
self.flash_help = 3 self.flash_help = 3
if self.reinforcement_buff != null:
self.reinforcement_buff += 1
if self.reinforcement_buff == null:
self.reinforcement_buff = 0
if self.reinforcements == null and not just_spawned: if self.reinforcements == null and not just_spawned:
var chance = lerp(0, 50, 1 - float(opponent_pieces.size())/16.0) var chance = lerp(0, 50, 1 - float(opponent_pieces.size())/16.0)
var i = self.rng.randi() % 100 var i = self.rng.randi() % 100
@ -495,7 +513,7 @@ func _process(delta):
# End movement # End movement
var square = square_of_piece(self.ai_piece) var square = square_of_piece(self.ai_piece)
if target_square['piece'] != null: if target_square['piece'] != null:
# @TODO If the target doesn't die, we need to bounce back if square['piece'].damage >= target_square['piece'].health:
target_square['piece'].queue_free() target_square['piece'].queue_free()
square['piece'].kills += 1 square['piece'].kills += 1
get_node("PanelRight/VBox/PieceInfo").set_piece_info(square['piece']) get_node("PanelRight/VBox/PieceInfo").set_piece_info(square['piece'])
@ -508,6 +526,13 @@ func _process(delta):
if index_to_play != null: if index_to_play != null:
print("ai loss Chance to play: ", c, " got index ", index_to_play) print("ai loss Chance to play: ", c, " got index ", index_to_play)
get_node(self.on_player_lose_piece[index_to_play]).play() get_node(self.on_player_lose_piece[index_to_play]).play()
else:
# Deal damage
target_square['piece'].health -= square['piece'].damage
# @TODO Sound effect
# @TODO Visual indication of damage dealt
# Bounce piece back
target_square = square
square['piece'] = null square['piece'] = null
target_square['piece'] = self.ai_piece target_square['piece'] = self.ai_piece
self.ai_piece.set_position(Vector2(target_square['x']*128, target_square['y']*128)) self.ai_piece.set_position(Vector2(target_square['x']*128, target_square['y']*128))
@ -579,6 +604,7 @@ func _physics_process(delta):
var dest_square = self.board_squares[dest] var dest_square = self.board_squares[dest]
if dest_square['piece'] != null: if dest_square['piece'] != null:
# @TODO If the target doesn't die, we need to bounce back # @TODO If the target doesn't die, we need to bounce back
if square['piece'].damage >= dest_square['piece'].health:
dest_square['piece'].queue_free() dest_square['piece'].queue_free()
square['piece'].kills += 1 square['piece'].kills += 1
get_node("PanelRight/VBox/PieceInfo").set_piece_info(square['piece']) get_node("PanelRight/VBox/PieceInfo").set_piece_info(square['piece'])
@ -591,6 +617,11 @@ func _physics_process(delta):
if index_to_play != null: if index_to_play != null:
print("ai loss Chance to play: ", c, " got index ", index_to_play) print("ai loss Chance to play: ", c, " got index ", index_to_play)
get_node(self.on_ai_lose_piece[index_to_play]).play() get_node(self.on_ai_lose_piece[index_to_play]).play()
else:
# @TODO Play a sound effect
# @TODO Visual indication of damage dealt
dest_square['piece'].health -= square['piece'].damage
dest_square = square
square['piece'] = null square['piece'] = null
dest_square['piece'] = piece dest_square['piece'] = piece
piece.set_position(Vector2(dest_square['x']*128, dest_square['y']*128)) piece.set_position(Vector2(dest_square['x']*128, dest_square['y']*128))

View File

@ -5,16 +5,41 @@ extends Control
# var a = 2 # var a = 2
# var b = "text" # var b = "text"
signal stat_change_requested
var last_piece = null
# 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():
pass # Replace with function body. pass # Replace with function body.
func set_piece_info(piece): func set_piece_info(piece):
self.last_piece = piece
get_node("Vbox/Damage/Label").set_text(str(piece.damage)) get_node("Vbox/Damage/Label").set_text(str(piece.damage))
get_node("Vbox/Movement/Label").set_text(str(piece.speed)) get_node("Vbox/Movement/Label").set_text(str(piece.speed))
get_node("Vbox/Health/Label").set_text(str(piece.health)) get_node("Vbox/Health/Label").set_text(str(piece.health))
get_node("Vbox/Kills/Label").set_text(str(piece.kills)) get_node("Vbox/Kills/Label").set_text(str(piece.kills))
if piece.jump:
get_node("Vbox/Jump").set_text("Can jump")
get_node("Vbox/CheckButton").set_pressed(true)
else:
get_node("Vbox/Jump").set_text("Cannot jump")
get_node("Vbox/CheckButton").set_pressed(false)
# 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 _on_UpMovement_pressed():
emit_signal("stat_change_requested", self.last_piece, "speed", self.last_piece.speed + 1)
func _on_UpHealth_pressed():
emit_signal("stat_change_requested", self.last_piece, "health", self.last_piece.health + 1)
func _on_UpDamage_pressed():
emit_signal("stat_change_requested", self.last_piece, "damage", self.last_piece.damage + 1)
func _on_CheckButton_toggled(button_pressed):
emit_signal("stat_change_requested", self.last_piece, "jump", button_pressed)

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=8 format=2] [gd_scene load_steps=10 format=2]
[ext_resource path="res://src/font_32.tres" type="DynamicFont" id=1] [ext_resource path="res://src/font_32.tres" type="DynamicFont" id=1]
[ext_resource path="res://assets/export/health.png" type="Texture" id=2] [ext_resource path="res://assets/export/health.png" type="Texture" id=2]
@ -7,6 +7,11 @@
[ext_resource path="res://assets/export/attack.png" type="Texture" id=5] [ext_resource path="res://assets/export/attack.png" type="Texture" id=5]
[ext_resource path="res://assets/export/kills.png" type="Texture" id=6] [ext_resource path="res://assets/export/kills.png" type="Texture" id=6]
[ext_resource path="res://src/PieceDetails.gd" type="Script" id=7] [ext_resource path="res://src/PieceDetails.gd" type="Script" id=7]
[ext_resource path="res://assets/source/Bitstream Vera Sans Mono Bold Nerd Font Complete.ttf" type="DynamicFontData" id=8]
[sub_resource type="DynamicFont" id=1]
size = 20
font_data = ExtResource( 8 )
[node name="Control" type="Control"] [node name="Control" type="Control"]
anchor_right = 1.0 anchor_right = 1.0
@ -19,6 +24,9 @@ __meta__ = {
[node name="Vbox" type="VBoxContainer" parent="."] [node name="Vbox" type="VBoxContainer" parent="."]
margin_right = 40.0 margin_right = 40.0
margin_bottom = 40.0 margin_bottom = 40.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="Vbox"] [node name="Label" type="Label" parent="Vbox"]
margin_right = 190.0 margin_right = 190.0
@ -50,10 +58,16 @@ __meta__ = {
"_editor_description_": "" "_editor_description_": ""
} }
[node name="Health" type="HBoxContainer" parent="Vbox"] [node name="UpMovement" type="Button" parent="Vbox"]
margin_top = 151.0 margin_top = 151.0
margin_right = 190.0 margin_right = 190.0
margin_bottom = 215.0 margin_bottom = 171.0
text = "Increase Movement"
[node name="Health" type="HBoxContainer" parent="Vbox"]
margin_top = 175.0
margin_right = 190.0
margin_bottom = 239.0
[node name="TextureRect" type="TextureRect" parent="Vbox/Health"] [node name="TextureRect" type="TextureRect" parent="Vbox/Health"]
material = ExtResource( 3 ) material = ExtResource( 3 )
@ -69,10 +83,16 @@ margin_bottom = 51.0
custom_fonts/font = ExtResource( 1 ) custom_fonts/font = ExtResource( 1 )
text = "1 " text = "1 "
[node name="Damage" type="HBoxContainer" parent="Vbox"] [node name="UpHealth" type="Button" parent="Vbox"]
margin_top = 219.0 margin_top = 243.0
margin_right = 190.0 margin_right = 190.0
margin_bottom = 283.0 margin_bottom = 263.0
text = "Increase health"
[node name="Damage" type="HBoxContainer" parent="Vbox"]
margin_top = 267.0
margin_right = 190.0
margin_bottom = 331.0
[node name="TextureRect" type="TextureRect" parent="Vbox/Damage"] [node name="TextureRect" type="TextureRect" parent="Vbox/Damage"]
material = ExtResource( 3 ) material = ExtResource( 3 )
@ -88,10 +108,16 @@ margin_bottom = 51.0
custom_fonts/font = ExtResource( 1 ) custom_fonts/font = ExtResource( 1 )
text = "1" text = "1"
[node name="Kills" type="HBoxContainer" parent="Vbox"] [node name="UpDamage" type="Button" parent="Vbox"]
margin_top = 287.0 margin_top = 335.0
margin_right = 190.0 margin_right = 190.0
margin_bottom = 351.0 margin_bottom = 355.0
text = "Increase damage"
[node name="Kills" type="HBoxContainer" parent="Vbox"]
margin_top = 359.0
margin_right = 190.0
margin_bottom = 423.0
[node name="TextureRect" type="TextureRect" parent="Vbox/Kills"] [node name="TextureRect" type="TextureRect" parent="Vbox/Kills"]
material = ExtResource( 3 ) material = ExtResource( 3 )
@ -106,3 +132,20 @@ margin_right = 87.0
margin_bottom = 51.0 margin_bottom = 51.0
custom_fonts/font = ExtResource( 1 ) custom_fonts/font = ExtResource( 1 )
text = "1" text = "1"
[node name="Jump" type="Label" parent="Vbox"]
margin_top = 427.0
margin_right = 190.0
margin_bottom = 451.0
custom_fonts/font = SubResource( 1 )
text = "Cannot jump"
[node name="CheckButton" type="CheckButton" parent="Vbox"]
margin_top = 455.0
margin_right = 190.0
margin_bottom = 495.0
text = "Jump"
[connection signal="pressed" from="Vbox/UpMovement" to="." method="_on_UpMovement_pressed"]
[connection signal="pressed" from="Vbox/UpHealth" to="." method="_on_UpHealth_pressed"]
[connection signal="pressed" from="Vbox/UpDamage" to="." method="_on_UpDamage_pressed"]
[connection signal="toggled" from="Vbox/CheckButton" to="." method="_on_CheckButton_toggled"]