1
0
Fork 0

Added basic unit combat

This commit is contained in:
Michaël Lemaire 2020-02-10 00:28:05 +01:00
parent 175e0e9292
commit ee2b9d4dac
7 changed files with 144 additions and 5 deletions

View file

@ -5,7 +5,7 @@ class_name Anchor
export var selectable = false
export var selected = false
export(String, "normal", "attack_start", "defend_start") var anchor_type = "normal"
var content
export(NodePath) var content
func _process(delta):
if selected:
@ -32,7 +32,15 @@ func set_content(val):
old_parent.set_content(null)
old_parent.remove_child(val)
self.add_child(val)
content = val
content = val.get_path()
else:
content = null
func get_content():
if content:
return get_node_or_null(content)
else:
return null
func is_empty() -> bool:
return not content
return not get_content()

View file

@ -26,3 +26,20 @@ static func spawn_unit(name: String, anchor: Anchor) -> Node:
var node = scene.instance()
anchor.set_content(node)
return node
static func get_state(tree: SceneTree):
""" Build the simple state associated with current battle scene
"""
var nodes = []
var routes = []
for anchor in tree.get_nodes_in_group("anchors"):
pass
for route in tree.get_nodes_in_group("routes"):
pass
return {
"nodes": nodes,
"routes": routes
}

View file

@ -14,14 +14,26 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://arenas/anchor.gd"
}, {
"base": "Panel",
"class": "BaseUnit",
"language": "GDScript",
"path": "res://units/base_unit.gd"
}, {
"base": "Line2D",
"class": "Route",
"language": "GDScript",
"path": "res://arenas/route.gd"
}, {
"base": "Control",
"class": "UnitPoints",
"language": "GDScript",
"path": "res://units/points.gd"
} ]
_global_script_class_icons={
"Anchor": "",
"Route": ""
"BaseUnit": "",
"Route": "",
"UnitPoints": ""
}
[application]

View file

@ -17,6 +17,8 @@ func _ready():
fill_hand($hand_attack, deck_attack_cards, hero_attack)
fill_hand($hand_defend, deck_defend_cards, hero_defend)
print(BattleHelper.get_state(get_tree()))
func find_free_anchor(anchor_type: String):
for anchor in get_tree().get_nodes_in_group("anchors"):
if anchor.anchor_type == anchor_type and anchor.is_empty():

37
tests/unit_combat.tscn Normal file
View file

@ -0,0 +1,37 @@
[gd_scene load_steps=6 format=2]
[ext_resource path="res://arenas/route.tscn" type="PackedScene" id=1]
[ext_resource path="res://arenas/anchor.tscn" type="PackedScene" id=2]
[ext_resource path="res://units/trapper.tscn" type="PackedScene" id=3]
[ext_resource path="res://units/flea.tscn" type="PackedScene" id=4]
[ext_resource path="res://units/avenger.tscn" type="PackedScene" id=5]
[node name="Node2D" type="Node2D"]
[node name="route" parent="." instance=ExtResource( 1 )]
points = PoolVector2Array( 400, 800, 700, 800 )
start = NodePath("../anchor")
end = NodePath("../anchor2")
[node name="route2" parent="." instance=ExtResource( 1 )]
points = PoolVector2Array( 400, 800, 550, 1100 )
start = NodePath("../anchor")
end = NodePath("../anchor3")
[node name="anchor" parent="." instance=ExtResource( 2 )]
position = Vector2( 400, 800 )
content = NodePath("flea")
[node name="flea" parent="anchor" instance=ExtResource( 4 )]
[node name="anchor2" parent="." instance=ExtResource( 2 )]
position = Vector2( 700, 800 )
content = NodePath("trapper")
[node name="trapper" parent="anchor2" instance=ExtResource( 3 )]
[node name="anchor3" parent="." instance=ExtResource( 2 )]
position = Vector2( 550, 1100 )
content = NodePath("avenger")
[node name="avenger" parent="anchor3" instance=ExtResource( 5 )]

View file

@ -1,6 +1,8 @@
tool
extends Panel
class_name BaseUnit
const AnimHelper = preload("res://helpers/anims.gd")
const BattleHelper = preload("res://helpers/battle.gd")
@ -23,6 +25,12 @@ func _ready():
set_base_hull_points(base_hull_points)
set_base_shield_points(base_shield_points)
func destroy():
if get_parent() is Anchor:
(get_parent() as Anchor).set_content(null)
queue_free()
func set_sprite(val):
sprite = val
if has_node("sprite"):
@ -47,17 +55,70 @@ func set_base_damage_points(val):
base_damage_points = val
if has_node("points"):
$points.damage = val
func can_target(other):
if other == self:
return false
else:
return true
func can_be_used_on_anchor(anchor):
return anchor is Anchor and anchor.is_empty() and anchor.is_connected_to(get_parent())
return anchor is Anchor and anchor.is_connected_to(get_parent()) and (anchor.is_empty() or can_target(anchor.get_content()))
func update_anchors():
var position = rect_global_position + rect_size / 2 if dragged else null
selected_anchor = BattleHelper.update_anchors(get_tree(), position, funcref(self, "can_be_used_on_anchor"))
func play(anchor):
if anchor.is_empty():
move_to(anchor)
else:
var other = anchor.get_content()
if other.has_method("get_points"):
var won = attack(other)
if won:
move_to(anchor)
else:
return_to_base()
else:
return_to_base()
func move_to(anchor):
anchor.set_content(self)
rect_position = base_position
func get_points() -> UnitPoints:
if $points is UnitPoints:
return $points as UnitPoints
else:
return null
func attack(other) -> bool:
var selfpoints = get_points()
var otherpoints = other.get_points()
while selfpoints.damage:
selfpoints.damage -= 1
if otherpoints.shield:
otherpoints.shield -= 1
elif otherpoints.hull:
otherpoints.hull -= 1
while otherpoints.damage:
otherpoints.damage -= 1
if selfpoints.shield:
selfpoints.shield -= 1
elif selfpoints.hull:
selfpoints.hull -= 1
if selfpoints.hull <= 0:
destroy()
if otherpoints.hull <= 0:
other.destroy()
return selfpoints.hull > 0 && otherpoints.hull == 0
func return_to_base():
AnimHelper.linear_goto(self, base_position, 0.3)

View file

@ -1,6 +1,8 @@
tool
extends Control
class_name UnitPoints
export var move = 0 setget set_move
export var hull = 0 setget set_hull
export var shield = 0 setget set_shield