mirror of
https://github.com/git-learning-game/oh-my-git.git
synced 2024-12-22 20:32:38 +01:00
167 lines
4.6 KiB
GDScript
167 lines
4.6 KiB
GDScript
extends Node2D
|
|
|
|
var hovered = false
|
|
var dragged = false
|
|
var drag_offset
|
|
|
|
export var id = "" setget set_id
|
|
export var command = "" setget set_command
|
|
export var description = "" setget set_description
|
|
export var energy = 0 setget set_energy
|
|
|
|
var _first_argument = null
|
|
var _home_position = null
|
|
var _home_rotation = null
|
|
|
|
onready var energy_label = $Sprite/Energy
|
|
|
|
func _ready():
|
|
set_process_unhandled_input(true)
|
|
set_energy(energy)
|
|
|
|
func _process(delta):
|
|
if game.energy >= energy:
|
|
energy_label.modulate = Color(0.5, 1, 0.5)
|
|
else:
|
|
energy_label.modulate = Color(1, 1, 1)
|
|
modulate = Color(1, 0.5, 0.5)
|
|
|
|
if dragged:
|
|
var mousepos = get_viewport().get_mouse_position()
|
|
global_position = mousepos - drag_offset
|
|
|
|
var target_scale = 1
|
|
|
|
if hovered and not dragged:
|
|
target_scale = 1.5
|
|
|
|
scale = lerp(scale, Vector2(target_scale, target_scale), 10*delta)
|
|
|
|
func _unhandled_input(event):
|
|
if event is InputEventMouseButton:
|
|
if event.button_index == BUTTON_LEFT and event.pressed and hovered:
|
|
dragged = true
|
|
game.dragged_object = self
|
|
_turn_on_highlights()
|
|
$PickupSound.play()
|
|
drag_offset = get_viewport().get_mouse_position() - global_position
|
|
get_tree().set_input_as_handled()
|
|
modulate.a = 0.5
|
|
elif event.button_index == BUTTON_LEFT and !event.pressed and dragged:
|
|
dragged = false
|
|
game.dragged_object = null
|
|
_turn_off_highlights()
|
|
modulate.a = 1
|
|
|
|
if "[string]" in command:
|
|
var dialog = preload("res://scenes/input_dialog.tscn").instance()
|
|
add_child(dialog)
|
|
dialog.popup_centered()
|
|
dialog.connect("entered", self, "entered_string")
|
|
dialog.connect("popup_hide", self, "move_back")
|
|
hide()
|
|
elif "[" in command:
|
|
move_back()
|
|
else:
|
|
try_play(command)
|
|
|
|
func _turn_on_highlights():
|
|
var arg_regex = RegEx.new()
|
|
arg_regex.compile("\\[(.*)\\]")
|
|
var m = arg_regex.search(command)
|
|
if m:
|
|
var types = Array(m.get_string(1).split(","))
|
|
for type in types:
|
|
for area in get_tree().get_nodes_in_group("drop_areas"):
|
|
area.highlight(type.strip_edges())
|
|
|
|
func _turn_off_highlights():
|
|
for area in get_tree().get_nodes_in_group("drop_areas"):
|
|
area.highlighted = false
|
|
|
|
func _mouse_entered():
|
|
hovered = true
|
|
z_index = 1
|
|
|
|
func _mouse_exited():
|
|
hovered = false
|
|
z_index = 0
|
|
|
|
func set_command(new_command):
|
|
command = new_command
|
|
var commands = new_command.split("[", true, 1)
|
|
var args = ''
|
|
if commands.size() > 1:
|
|
args = commands[1].replace("]", "")
|
|
args = args.replace(", ", "/")
|
|
args = args.replace("ref", " [img=20]images/ref.svg[/img] ")
|
|
args = args.replace("commit", " [img=20]images/commit.svg[/img] ")
|
|
args = args.replace("string", " [img=20]images/string.svg[/img] ")
|
|
args = args.replace("head", " [img=20]images/head.svg[/img] ")
|
|
args = args.replace("file", " [img=20]images/file.svg[/img] ")
|
|
args = args.replace("remote", " [img=20]images/remote.svg[/img] ")
|
|
$Label.bbcode_text = commands[0] + args
|
|
#$Label.text = command
|
|
|
|
func set_description(new_description):
|
|
description = new_description
|
|
$Description.text = description
|
|
|
|
func set_energy(new_energy):
|
|
energy = new_energy
|
|
if energy_label:
|
|
energy_label.text = str(energy)
|
|
|
|
func set_id(new_id):
|
|
id = new_id
|
|
var art_path = "res://cards/%s.svg" % new_id
|
|
var file = File.new()
|
|
#if file.file_exists(art_path):
|
|
var texture = load(art_path)
|
|
if texture:
|
|
$Image.texture = texture
|
|
$Panel/Glow.visible = not id in game.state["played_cards"]
|
|
|
|
func move_back():
|
|
position = _home_position
|
|
rotation_degrees = _home_rotation
|
|
$ReturnSound.play()
|
|
show()
|
|
|
|
func dropped_on(other):
|
|
if "[" in command:
|
|
var argument
|
|
if other.type == "file" or other.type == "remote":
|
|
argument = other.label
|
|
else:
|
|
argument = other.id
|
|
|
|
if (command.begins_with("git checkout") or command.begins_with("git rebase") or command.begins_with("git branch -D")) and argument.begins_with("refs/heads"):
|
|
argument = Array(argument.split("/")).pop_back()
|
|
|
|
var arg_regex = RegEx.new()
|
|
arg_regex.compile("\\[(.*)\\]")
|
|
var full_command = arg_regex.sub(command, argument)
|
|
try_play(full_command)
|
|
|
|
func try_play(full_command):
|
|
if game.energy >= energy:
|
|
var terminal = $"../../../..".terminal
|
|
terminal.send_command(full_command)
|
|
#yield(terminal, "command_done")
|
|
game.used_cards = true
|
|
$PlaySound.play()
|
|
var particles = preload("res://scenes/card_particles.tscn").instance()
|
|
particles.position = position
|
|
get_parent().add_child(particles)
|
|
move_back()
|
|
game.energy -= energy
|
|
if not id in game.state["played_cards"]:
|
|
game.state["played_cards"].push_back(id)
|
|
game.save_state()
|
|
$Panel/Glow.hide()
|
|
else:
|
|
move_back()
|
|
|
|
func entered_string(string):
|
|
try_play(command.replace("[string]", "'"+string+"'"))
|