🎉 a terrible game.

main
bog 2024-04-13 16:20:07 +02:00
parent 331255d183
commit 838de303e4
27 changed files with 930 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*.import
*~*
*\#*

2
src/.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf

2
src/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# Godot 4+ specific ignores
.godot/

17
src/Data/action.gd Normal file
View File

@ -0,0 +1,17 @@
extends Node
class_name Action
var action_name: String
var damages: int
var rune = null
func _init(rune, action_name, damages):
self.rune = rune
self.action_name = action_name
self.damages = damages
func _ready():
pass
func _process(delta):
pass

87
src/Data/actor.gd Normal file
View File

@ -0,0 +1,87 @@
extends Node
class_name Actor
var runes: Array = []
var actor_name: String
func _init(actor_name: String):
self.actor_name = actor_name
self.give_rune('hp')
self.give_rune('ap')
self.give_rune('atk')
self.give_rune('def')
self.give_rune('ini')
func hurt(damages):
var target_rune = null
for rune in self.runes:
if rune.state.hp > 0 and (target_rune == null or rune.state.hp < target_rune.state.hp):
target_rune = rune
if target_rune:
target_rune.state.hp -= damages
func give_rune(rune_name: String):
var lib = RuneLib.new()
var rune = lib.find(rune_name)
rune.actor = self
runes.push_back(rune)
func get_rune(slot_id: int):
if slot_id < self.runes.size():
return self.runes[slot_id]
return null
func get_rune_by_name(rune_name: String):
for rune in self.runes:
if rune.rune_name == rune_name:
return rune
return null
func get_rune_by_slot(slot: int):
for rune in self.runes:
if rune.slot == slot:
return rune
return null
func get_actor_name() -> String:
return self.actor_name
func get_hp() -> int:
var res = 0
for rune in self.runes:
if rune.has_slot():
res += rune.state.hp
return res
func get_ap() -> int:
var res = 0
for rune in self.runes:
if rune.has_slot():
res = max(res, rune.state.ap)
return res
func get_atk() -> int:
var res = 0
for rune in self.runes:
if rune.has_slot():
res += rune.state.atk
return res
func get_def() -> int:
var res = 0
for rune in self.runes:
if rune.has_slot():
res += rune.state.def
return res
func get_ini() -> int:
var res = 0
for rune in self.runes:
if rune.has_slot():
res = max(res, rune.state.ini)
return res
func is_dead():
return self.get_hp() <= 0

30
src/Data/rune.gd Normal file
View File

@ -0,0 +1,30 @@
extends Node
class_name Rune
var rune_name: String
var state: State
var slot: int
const NO_SLOT = -1
var actions: Array = []
var actor: Actor
func _init(actor, rune_name, state: State):
self.actor = actor
self.rune_name = rune_name
self.state = state
self.slot = NO_SLOT
func set_slot(slot: int):
self.slot = slot
func has_slot() -> bool:
return self.slot != NO_SLOT
func add_action(action):
self.actions.push_back(action)
func has_action(action):
for a in self.actions:
if a == action:
return true
return false

23
src/Data/runelib.gd Normal file
View File

@ -0,0 +1,23 @@
extends Node
class_name RuneLib
var all_runes: Dictionary = {}
func _init():
var hp = add_rune('hp', State.new(100, 0, 0, 0, 0))
hp.add_action(Action.new(hp, 'Frappe I', 4))
hp.add_action(Action.new(hp, 'Frappe II', 40))
hp.add_action(Action.new(hp, 'Frappe III', 75))
add_rune('ap', State.new(0, 1, 0, 0, 0))
add_rune('atk', State.new(0, 0, 2, 0, 0))
add_rune('def', State.new(0, 0, 0, 1, 0))
add_rune('ini', State.new(0, 0, 0, 0, 1))
func add_rune(rune_name: String, state: State):
self.all_runes[rune_name] = Rune.new(null, rune_name, state)
return self.all_runes[rune_name]
func find(rune_name: String) -> Rune:
assert(rune_name in self.all_runes.keys())
return self.all_runes[rune_name]

4
src/Data/slots.gd Normal file
View File

@ -0,0 +1,4 @@
extends Node
class_name Slots
var runes: Array = []

15
src/Data/state.gd Normal file
View File

@ -0,0 +1,15 @@
extends Node
class_name State
var hp: int
var ap: int
var atk: int
var def: int
var ini: int
func _init(_hp, _ap, _atk, _def, _ini):
self.hp = _hp
self.ap = _ap
self.atk = _atk
self.def = _def
self.ini = _ini

16
src/EnemyUI/enemy_ui.gd Normal file
View File

@ -0,0 +1,16 @@
extends Control
var actor: Actor
func _ready():
self.actor = Gactor.current_enemy
get_node('%RuneSlots').actor = self.actor
Gai.rune_slots = get_node('%RuneSlots')
func _process(delta):
get_node('%ActorName').text = str(self.actor.get_actor_name())
get_node('%HP').text = str(self.actor.get_hp())
get_node('%AP').text = str(self.actor.get_ap())
get_node('%ATK').text = str(self.actor.get_atk())
get_node('%DEF').text = str(self.actor.get_def())
get_node('%INI').text = str(self.actor.get_ini())

80
src/EnemyUI/enemy_ui.tscn Normal file
View File

@ -0,0 +1,80 @@
[gd_scene load_steps=3 format=3 uid="uid://bmug7u0mpwj7a"]
[ext_resource type="Script" path="res://EnemyUI/enemy_ui.gd" id="1_1sdxq"]
[ext_resource type="PackedScene" uid="uid://crngpd2jeu4sx" path="res://RuneSlots/rune_slots.tscn" id="2_le6ii"]
[node name="EnemyUI" type="Control"]
layout_mode = 3
anchor_left = 0.5
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_1sdxq")
[node name="Panel" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="VBoxContainer" type="VBoxContainer" parent="Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="ActorName" type="Label" parent="Panel/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
[node name="HUD" type="HBoxContainer" parent="Panel/VBoxContainer"]
layout_mode = 2
[node name="HP_LABEL" type="Label" parent="Panel/VBoxContainer/HUD"]
layout_mode = 2
text = "HP:"
[node name="HP" type="Label" parent="Panel/VBoxContainer/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="AP_LABEL" type="Label" parent="Panel/VBoxContainer/HUD"]
layout_mode = 2
text = "AP:"
[node name="AP" type="Label" parent="Panel/VBoxContainer/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="ATK_LABEL" type="Label" parent="Panel/VBoxContainer/HUD"]
layout_mode = 2
text = "ATK:"
[node name="ATK" type="Label" parent="Panel/VBoxContainer/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="DEF_LABEL" type="Label" parent="Panel/VBoxContainer/HUD"]
layout_mode = 2
text = "DEF:"
[node name="DEF" type="Label" parent="Panel/VBoxContainer/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="INI_LABEL" type="Label" parent="Panel/VBoxContainer/HUD"]
layout_mode = 2
text = "INI:"
[node name="INI" type="Label" parent="Panel/VBoxContainer/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="RuneSlots" parent="Panel/VBoxContainer" instance=ExtResource("2_le6ii")]
unique_name_in_owner = true
layout_mode = 2

16
src/Global/gactor.gd Normal file
View File

@ -0,0 +1,16 @@
extends Node
var player: Actor
var current_enemy: Actor
func _ready():
self.player = Actor.new('Player')
self.current_enemy = Actor.new('Jason')
func _process(delta):
pass
func opponent(actor):
if actor == self.player:
return self.current_enemy
return self.player

38
src/Global/gai.gd Normal file
View File

@ -0,0 +1,38 @@
extends Node
var actor: Actor
var rune_slots
func _process(delta):
if Gturn.current_turn == Gturn.TURN.AI:
if Gturn.current_phase == Gturn.PHASE.RUNES:
self.place_runes()
Gturn.next_phase()
elif Gturn.current_phase == Gturn.PHASE.ACTIONS:
self.select_actions()
Gturn.next_phase()
func can_place_rune_in_slot(slot):
for rune in self.actor.runes:
if rune.slot == slot:
return false
return true
func place_runes():
randomize()
for rune in self.actor.runes:
if not rune.has_slot():
while true:
var i = floor(randf_range(0, 5))
if can_place_rune_in_slot(i):
self.rune_slots.select_rune(rune, i)
return
func select_actions():
for rune in self.actor.runes:
if rune.has_slot() and rune.actions.size() > 0:
var action = rune.actions[0]
Gturn.add_action(action)
return

63
src/Global/gturn.gd Normal file
View File

@ -0,0 +1,63 @@
extends Node
enum TURN {
PLAYER,
AI
}
enum PHASE {
RUNES,
ACTIONS,
RESOLUTION
}
var PHASE_NAMES = ['READY', 'ATTACK', 'RESOLUTION']
var current_turn = TURN.PLAYER
var current_phase = PHASE.RUNES
var current_actions = []
var phases = [PHASE.RUNES, PHASE.ACTIONS, PHASE.RESOLUTION]
var phase_idx = 0
func _ready():
pass
func _process(delta):
pass
func next_phase():
if self.current_phase == PHASE.RUNES and self.current_turn == TURN.PLAYER:
self.current_turn = TURN.AI
elif self.current_phase == PHASE.RUNES and self.current_turn == TURN.AI:
self.current_turn = TURN.PLAYER
self.current_phase = PHASE.ACTIONS
elif self.current_phase == PHASE.ACTIONS and self.current_turn == TURN.PLAYER:
self.current_turn = TURN.AI
elif self.current_phase == PHASE.ACTIONS and self.current_turn == TURN.AI:
self.current_turn = TURN.PLAYER
self.current_phase = PHASE.RUNES
self.resolve()
func add_action(action):
self.current_actions.push_back(action)
func rune_already_played(rune):
for action in self.current_actions:
if rune.has_action(action):
return true
return false
func compare_per_ini(lhs, rhs):
return lhs.rune.actor.get_ini() > rhs.rune.actor.get_ini()
func resolve():
self.current_actions.sort_custom(self.compare_per_ini)
for action in self.current_actions:
Gactor.opponent(action.rune.actor).hurt(action.damages)
self.current_actions = []
if Gactor.player.is_dead():
print('OPPONENT WON')
elif Gactor.current_enemy.is_dead():
print('PLAYER WON')

21
src/PlayerUI/player_ui.gd Normal file
View File

@ -0,0 +1,21 @@
extends Control
var actor: Actor
func _ready():
self.actor = Gactor.player
get_node('%RuneSlots').actor = self.actor
func _process(delta):
get_node('%ActorName').text = str(self.actor.get_actor_name())
get_node('%HP').text = str(self.actor.get_hp())
get_node('%AP').text = str(self.actor.get_ap())
get_node('%ATK').text = str(self.actor.get_atk())
get_node('%DEF').text = str(self.actor.get_def())
get_node('%INI').text = str(self.actor.get_ini())
get_node('%NextButton').visible = Gturn.current_phase != Gturn.PHASE.RESOLUTION \
and Gturn.current_turn == Gturn.TURN.PLAYER
get_node('%NextButton').text = Gturn.PHASE_NAMES[Gturn.current_phase]
func _on_next_button_pressed():
Gturn.next_phase()

View File

@ -0,0 +1,91 @@
[gd_scene load_steps=3 format=3 uid="uid://cscojpnoqu33p"]
[ext_resource type="Script" path="res://PlayerUI/player_ui.gd" id="1_dik5c"]
[ext_resource type="PackedScene" uid="uid://crngpd2jeu4sx" path="res://RuneSlots/rune_slots.tscn" id="2_6t500"]
[node name="PlayerUI" type="Control"]
layout_mode = 3
anchor_right = 0.5
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_dik5c")
[node name="ActorPanel" type="Panel" parent="."]
unique_name_in_owner = true
clip_contents = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="ActorLayout" type="VBoxContainer" parent="ActorPanel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 2
alignment = 1
[node name="ActorName" type="Label" parent="ActorPanel/ActorLayout"]
unique_name_in_owner = true
layout_mode = 2
[node name="HUD" type="HBoxContainer" parent="ActorPanel/ActorLayout"]
layout_mode = 2
size_flags_vertical = 0
[node name="HP_LABEL" type="Label" parent="ActorPanel/ActorLayout/HUD"]
layout_mode = 2
text = "HP:"
[node name="HP" type="Label" parent="ActorPanel/ActorLayout/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="AP_LABEL" type="Label" parent="ActorPanel/ActorLayout/HUD"]
layout_mode = 2
text = "AP:"
[node name="AP" type="Label" parent="ActorPanel/ActorLayout/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="ATK_LABEL" type="Label" parent="ActorPanel/ActorLayout/HUD"]
layout_mode = 2
text = "ATK:"
[node name="ATK" type="Label" parent="ActorPanel/ActorLayout/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="DEF_LABEL" type="Label" parent="ActorPanel/ActorLayout/HUD"]
layout_mode = 2
text = "DEF:"
[node name="DEF" type="Label" parent="ActorPanel/ActorLayout/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="INI_LABEL" type="Label" parent="ActorPanel/ActorLayout/HUD"]
layout_mode = 2
text = "INI:"
[node name="INI" type="Label" parent="ActorPanel/ActorLayout/HUD"]
unique_name_in_owner = true
layout_mode = 2
[node name="RuneSlots" parent="ActorPanel/ActorLayout" instance=ExtResource("2_6t500")]
unique_name_in_owner = true
layout_mode = 2
[node name="NextButton" type="Button" parent="ActorPanel/ActorLayout"]
unique_name_in_owner = true
layout_mode = 2
text = "NEXT"
[connection signal="pressed" from="ActorPanel/ActorLayout/NextButton" to="." method="_on_next_button_pressed"]

View File

@ -0,0 +1,25 @@
extends Control
var rune = null
# Called when the node enters the scene tree for the first time.
func _ready():
var items = get_node('%Items')
for action in self.rune.actions:
items.add_item(action.action_name)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func _on_button_pressed():
var items = get_node('%Items')
for item in items.get_selected_items():
var action_name = items.get_item_text(item)
for action in self.rune.actions:
if action.action_name == action_name:
Gturn.add_action(action)
get_tree().paused = false
queue_free()

View File

@ -0,0 +1,44 @@
[gd_scene load_steps=2 format=3 uid="uid://y7flxg84p7e7"]
[ext_resource type="Script" path="res://RuneActions/rune_actions.gd" id="1_6vnp1"]
[node name="RuneActions" type="Control"]
process_mode = 2
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_6vnp1")
[node name="Panel" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="VBoxContainer" type="VBoxContainer" parent="Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Label" type="Label" parent="Panel/VBoxContainer"]
layout_mode = 2
text = "ACTIONS"
[node name="Items" type="ItemList" parent="Panel/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 3
[node name="Button" type="Button" parent="Panel/VBoxContainer"]
layout_mode = 2
text = "SELECT"
[connection signal="pressed" from="Panel/VBoxContainer/Button" to="." method="_on_button_pressed"]

26
src/RuneList/rune_list.gd Normal file
View File

@ -0,0 +1,26 @@
extends Control
var actor: Actor = null
signal rune_selected
func _ready():
var items = get_node('%Items')
var runes = Gactor.player.runes
for rune in runes:
if not rune.has_slot():
items.add_item(rune.rune_name)
func _process(delta):
pass
func _on_button_pressed():
var items : ItemList = get_node('%Items')
var selected = items.get_selected_items()
for s in selected:
var item_name = items.get_item_text(s)
assert(self.actor)
var rune = self.actor.get_rune_by_name(item_name)
emit_signal("rune_selected", rune)
get_tree().paused = false
queue_free()

View File

@ -0,0 +1,52 @@
[gd_scene load_steps=2 format=3 uid="uid://bn0q76fi3711l"]
[ext_resource type="Script" path="res://RuneList/rune_list.gd" id="1_klufn"]
[node name="RuneList" type="Control"]
process_mode = 2
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_klufn")
[node name="Panel" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -176.0
offset_top = -195.0
offset_right = 176.0
offset_bottom = 195.0
grow_horizontal = 2
grow_vertical = 2
[node name="VBoxContainer" type="VBoxContainer" parent="Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Label" type="Label" parent="Panel/VBoxContainer"]
layout_mode = 2
text = "RUNES"
horizontal_alignment = 1
[node name="Items" type="ItemList" parent="Panel/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 3
auto_height = true
[node name="Button" type="Button" parent="Panel/VBoxContainer"]
layout_mode = 2
text = "TAKE"
[connection signal="pressed" from="Panel/VBoxContainer/Button" to="." method="_on_button_pressed"]

View File

@ -0,0 +1,54 @@
extends Panel
var A: Vector2
var B: Vector2
var C: Vector2
var D: Vector2
var E: Vector2
var rad: int
var center: Vector2
func _ready():
pass
func _process(delta):
var view = get_rect()
self.center = Vector2(view.size / 2)
self.rad = view.size.x/6
var v_offset = PI/5
var h_offset = PI/16
self.A = get_point(-PI/2 + v_offset)
self.B = get_point(h_offset)
self.C = get_point(PI/2)
self.D = get_point(PI - h_offset)
self.E = get_point(-PI/2 - v_offset)
queue_redraw()
func get_point(angle):
return self.center + Vector2(cos(angle), sin(angle)) * self.rad
func _draw():
draw_circle(self.center, self.rad, Color.RED)
var slot_rad = rad/8
var slot_color = Color.RED
draw_circle(self.A, slot_rad, slot_color)
draw_circle(self.B, slot_rad, slot_color)
draw_circle(self.C, slot_rad, slot_color)
draw_circle(self.D, slot_rad, slot_color)
draw_circle(self.E, slot_rad, slot_color)
var color = Color.BLACK
var width = 8
draw_line(self.A, self.C, color, width)
draw_line(self.A, self.D, color, width)
draw_line(self.B, self.E, color, width)
draw_line(self.B, self.D, color, width)
draw_line(self.C, self.E, color, width)
draw_line(self.C, self.A, color, width)
draw_line(self.D, self.A, color, width)
draw_line(self.D, self.B, color, width)

137
src/RuneSlots/rune_slots.gd Normal file
View File

@ -0,0 +1,137 @@
extends Control
var A: Vector2
var B: Vector2
var C: Vector2
var D: Vector2
var E: Vector2
var rad: int
var slot_rad: int
var center: Vector2
var rune_list: PackedScene
var mouse: Vector2
var current_point: Vector2
var points: Array
var actor: Actor
func _ready():
self.rune_list = preload("res://RuneList/rune_list.tscn")
func _process(delta):
# positions
# =========
var view = get_rect()
self.center = Vector2(view.size / 2)
self.rad = view.size.x/3
self.slot_rad = rad/6
var v_offset = PI/5
var h_offset = PI/16
self.A = get_point(-PI/2 + v_offset)
self.B = get_point(h_offset)
self.C = get_point(PI/2)
self.D = get_point(PI - h_offset)
self.E = get_point(-PI/2 - v_offset)
self.points = [self.A, self.B, self.C, self.D, self.E]
queue_redraw()
# events
# ======
self.mouse = get_local_mouse_position()
# phase runes
# ===========
if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) \
and Gturn.current_phase == Gturn.PHASE.RUNES \
and Gturn.current_turn == Gturn.TURN.PLAYER \
and self.actor == Gactor.player:
var point = self.get_current_point()
var rune = self.point_to_rune(point)
if point and not rune:
var lst = self.rune_list.instantiate()
lst.actor = self.actor
lst.rune_selected.connect(self._on_rune_selected.bind(point))
add_child(lst)
get_tree().paused = true
if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT) \
and Gturn.current_phase == Gturn.PHASE.RUNES \
and Gturn.current_turn == Gturn.TURN.PLAYER \
and self.actor == Gactor.player:
var point = self.get_current_point()
if point:
var rune = self.point_to_rune(point)
if rune:
rune.set_slot(rune.NO_SLOT)
# phase actions
if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) \
and Gturn.current_phase == Gturn.PHASE.ACTIONS \
and Gturn.current_turn == Gturn.TURN.PLAYER \
and self.actor == Gactor.player:
var actions = preload("res://RuneActions/rune_actions.tscn").instantiate()
var point = get_current_point()
var rune = point_to_rune(point)
if rune and not Gturn.rune_already_played(rune) \
and rune.actions.size() > 0:
actions.rune = rune
add_child(actions)
get_tree().paused = true
func _on_rune_selected(rune, point):
self.select_rune(rune, self.point_to_slot(point))
Gturn.next_phase()
func select_rune(rune, slot):
var res = rune.has_slot()
if res:
return false
rune.set_slot(slot)
return true
func get_point(angle):
return self.center + Vector2(cos(angle), sin(angle)) * self.rad
func get_current_point():
for point in self.points:
var dist = self.mouse.distance_squared_to(point) <= slot_rad * slot_rad
if dist:
return point
return null
func point_to_slot(point: Vector2):
var slot = self.points.find(point)
return slot
func point_to_rune(point):
if point == null:
return null
var slot = self.point_to_slot(point)
return self.actor.get_rune_by_slot(slot)
func _draw():
draw_circle(self.center, self.rad, Color.DARK_RED)
for point in self.points:
var slot_color = Color.DARK_RED
var slot = self.point_to_slot(point)
if self.actor.get_rune_by_slot(slot) != null:
slot_color = Color.BLACK
elif self.get_current_point() == point \
and self.actor == Gactor.player:
slot_color = Color.RED
draw_circle(point, slot_rad, slot_color)
var color = Color.RED
var width = 1
draw_line(self.A, self.C, color, width)
draw_line(self.A, self.D, color, width)
draw_line(self.B, self.E, color, width)
draw_line(self.B, self.D, color, width)
draw_line(self.C, self.E, color, width)
draw_line(self.C, self.A, color, width)
draw_line(self.D, self.A, color, width)
draw_line(self.D, self.B, color, width)

View File

@ -0,0 +1,14 @@
[gd_scene load_steps=2 format=3 uid="uid://crngpd2jeu4sx"]
[ext_resource type="Script" path="res://RuneSlots/rune_slots.gd" id="1_qeglk"]
[node name="RuneSlots" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("1_qeglk")

7
src/Sandbox/sandbox.gd Normal file
View File

@ -0,0 +1,7 @@
extends Control
func _ready():
Gai.actor = get_node('%EnemyUI').actor
func _process(delta):
pass

35
src/Sandbox/sandbox.tscn Normal file
View File

@ -0,0 +1,35 @@
[gd_scene load_steps=4 format=3 uid="uid://bk8owxoblg1aq"]
[ext_resource type="Script" path="res://Sandbox/sandbox.gd" id="1_e7uy8"]
[ext_resource type="PackedScene" uid="uid://cscojpnoqu33p" path="res://PlayerUI/player_ui.tscn" id="1_eowhn"]
[ext_resource type="PackedScene" uid="uid://bmug7u0mpwj7a" path="res://EnemyUI/enemy_ui.tscn" id="3_0501f"]
[node name="Sandbox" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("1_e7uy8")
metadata/_edit_use_anchors_ = true
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="PlayerUI" parent="HBoxContainer" instance=ExtResource("1_eowhn")]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
[node name="EnemyUI" parent="HBoxContainer" instance=ExtResource("3_0501f")]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3

1
src/icon.svg Normal file
View File

@ -0,0 +1 @@
<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="2" width="124" height="124" rx="14" fill="#363d52" stroke="#212532" stroke-width="4"/><g transform="scale(.101) translate(122 122)"><g fill="#fff"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 813 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H447l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c3 34 55 34 58 0v-86c-3-34-55-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></g></svg>

After

Width:  |  Height:  |  Size: 950 B

27
src/project.godot Normal file
View File

@ -0,0 +1,27 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=5
[application]
config/name="Ludum Dare 55"
run/main_scene="res://Sandbox/sandbox.tscn"
config/features=PackedStringArray("4.2", "GL Compatibility")
config/icon="res://icon.svg"
[autoload]
Gactor="*res://Global/gactor.gd"
Gturn="*res://Global/gturn.gd"
Gai="*res://Global/gai.gd"
[rendering]
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"