@@ -0,0 +1,3 @@ | |||||
source_md5="76b99b929153960dd998ce494f45624c" | |||||
dest_md5="88cc37307aa3b05eef3a6b76f3580d82" | |||||
@@ -0,0 +1,3 @@ | |||||
source_md5="c61d0c6a7cdcb4cfe5bd424b476c9323" | |||||
dest_md5="7e8e7bd22121ab1b5a0809dd00e91900" | |||||
@@ -0,0 +1,3 @@ | |||||
source_md5="9da48ae0e2c8858122bdf1a8b8dd698e" | |||||
dest_md5="348cbedcb0148126d176d7cbcee8e36c" | |||||
@@ -0,0 +1,3 @@ | |||||
source_md5="c61d0c6a7cdcb4cfe5bd424b476c9323" | |||||
dest_md5="7e8e7bd22121ab1b5a0809dd00e91900" | |||||
@@ -1,12 +1,16 @@ | |||||
extends Node | |||||
extends Object | |||||
var YarnScript = preload("yarn_script.gd") | |||||
class_name YarnRunner | |||||
export (Resource) var yarnScript | |||||
var yarnScript : YarnScript | |||||
var say_func : FuncRef = null | var say_func : FuncRef = null | ||||
var choices_func : FuncRef = null | var choices_func : FuncRef = null | ||||
var commands := {} | |||||
signal resume_workaround | |||||
func run_all(): | func run_all(): | ||||
var next_node = yarnScript.nodes["Start"] | var next_node = yarnScript.nodes["Start"] | ||||
while next_node != null: | while next_node != null: | ||||
@@ -18,9 +22,12 @@ func run_all(): | |||||
next_node = null | next_node = null | ||||
func run_body(body): | func run_body(body): | ||||
yield(Controller.get_tree(), "idle_frame") # workaround before await | |||||
for element in body: | for element in body: | ||||
if element["type"] == "jump": | if element["type"] == "jump": | ||||
return element["node"] | return element["node"] | ||||
elif element["type"] == "command": | |||||
yield(run_command(element["command"], element["args"]), "completed") | |||||
elif element["type"] == "choice_blocks": | elif element["type"] == "choice_blocks": | ||||
var block = yield(decide_choice_block(element["blocks"]), "completed") | var block = yield(decide_choice_block(element["blocks"]), "completed") | ||||
print(block) | print(block) | ||||
@@ -32,14 +39,22 @@ func run_body(body): | |||||
return next_node_key | return next_node_key | ||||
else: | else: | ||||
if say_func == null or !say_func.is_valid(): | if say_func == null or !say_func.is_valid(): | ||||
print(element) | |||||
printerr("no say_func provided") | |||||
else: | else: | ||||
yield(say_func.call_func(element), "completed") | yield(say_func.call_func(element), "completed") | ||||
return "" | return "" | ||||
func add_command(command_key, function): | |||||
commands[command_key] = function | |||||
func run_command(command_key, args): | |||||
if (commands.has(command_key)): | |||||
var command : FuncRef = commands[command_key] | |||||
yield(command.call_func(args), "completed") | |||||
func decide_choice_block(blocks): | func decide_choice_block(blocks): | ||||
if choices_func == null or !choices_func.is_valid(): | if choices_func == null or !choices_func.is_valid(): | ||||
return blocks[0] | |||||
printerr("no choices_func provided") | |||||
else: | else: | ||||
return yield(choices_func.call_func(blocks), "completed") | return yield(choices_func.call_func(blocks), "completed") | ||||
@@ -0,0 +1,24 @@ | |||||
extends Node | |||||
class_name YarnRunnerNode | |||||
var yarnRunner := YarnRunner.new() | |||||
export var yarnScript : Resource | |||||
func start_script(): | |||||
yarnRunner.say_func = funcref(self, "on_new_line") | |||||
yarnRunner.choices_func = funcref(self, "on_choices") | |||||
yarnRunner.yarnScript = self.yarnScript | |||||
yield(yarnRunner.run_all(), "completed") | |||||
func on_new_line(line): | |||||
print(line) | |||||
yield(get_tree(),"idle_frame") | |||||
func on_choices(blocks): | |||||
print(blocks) | |||||
yield(get_tree(),"idle_frame") | |||||
print("Default choice taken : " + str(blocks[0])) | |||||
return blocks[0] |
@@ -1,3 +1,5 @@ | |||||
extends Resource | extends Resource | ||||
class_name YarnScript | |||||
export var nodes = {} | export var nodes = {} |
@@ -91,6 +91,8 @@ func parse_condition_blocks(file, parsed_line): | |||||
var current_block = {"condition":parsed_line["expression"], "body":[]} | var current_block = {"condition":parsed_line["expression"], "body":[]} | ||||
# print("[" + parsed_line["type"] + "]\n\t" + str(parsed_line)) | |||||
while not file.eof_reached(): | while not file.eof_reached(): | ||||
parsed_line = parse_line_body(file.get_line()) | parsed_line = parse_line_body(file.get_line()) | ||||
var type = parsed_line["type"] | var type = parsed_line["type"] | ||||
@@ -159,6 +161,10 @@ func parse_line_body(raw_line : String): | |||||
parsed_line["type"] = CONDITION_IF | parsed_line["type"] = CONDITION_IF | ||||
var expr := "" | var expr := "" | ||||
for token in Array(split).slice(1, split.size() -1): | for token in Array(split).slice(1, split.size() -1): | ||||
if token == "False": | |||||
token = "false" | |||||
elif token == "True": | |||||
token = "true" | |||||
expr += token + " " | expr += token + " " | ||||
parsed_line["expression"] = expr | parsed_line["expression"] = expr | ||||
elif split[0] == "elseif": | elif split[0] == "elseif": | ||||
@@ -6,11 +6,11 @@ var yarn_spinner_importer | |||||
func _enter_tree(): | func _enter_tree(): | ||||
yarn_spinner_importer = preload("yarn_spinner_importer.gd").new() | yarn_spinner_importer = preload("yarn_spinner_importer.gd").new() | ||||
add_custom_type("YarnScript", "Resource", preload("yarn_script.gd"), preload("icon.png")) | add_custom_type("YarnScript", "Resource", preload("yarn_script.gd"), preload("icon.png")) | ||||
add_custom_type("YarnRunner", "Node", preload("yarn_runner.gd"), preload("icon.png")) | |||||
add_custom_type("YarnRunnerNode", "Node", preload("yarn_runner_node.gd"), preload("icon.png")) | |||||
add_import_plugin(yarn_spinner_importer) | add_import_plugin(yarn_spinner_importer) | ||||
func _exit_tree(): | func _exit_tree(): | ||||
remove_custom_type("YarnScript") | remove_custom_type("YarnScript") | ||||
remove_custom_type("YarnRunner") | |||||
remove_custom_type("YarnRunnerNode") | |||||
remove_import_plugin(yarn_spinner_importer) | remove_import_plugin(yarn_spinner_importer) | ||||
yarn_spinner_importer = null | yarn_spinner_importer = null |
@@ -3,5 +3,5 @@ | |||||
[ext_resource path="res://jrpg/fonts/Puritan-Regular.otf" type="DynamicFontData" id=1] | [ext_resource path="res://jrpg/fonts/Puritan-Regular.otf" type="DynamicFontData" id=1] | ||||
[resource] | [resource] | ||||
size = 30 | |||||
size = 20 | |||||
font_data = ExtResource( 1 ) | font_data = ExtResource( 1 ) |
@@ -0,0 +1,18 @@ | |||||
[gd_scene load_steps=2 format=2] | |||||
[ext_resource path="res://jrpg/fonts/puritan.tres" type="DynamicFont" id=1] | |||||
[node name="TestGameOver" type="Control"] | |||||
anchor_right = 1.0 | |||||
anchor_bottom = 1.0 | |||||
__meta__ = { | |||||
"_edit_use_anchors_": false | |||||
} | |||||
[node name="Label" type="Label" parent="."] | |||||
anchor_right = 1.0 | |||||
anchor_bottom = 1.0 | |||||
custom_fonts/font = ExtResource( 1 ) | |||||
text = "Game Over" | |||||
align = 1 | |||||
valign = 1 |
@@ -0,0 +1,20 @@ | |||||
[gd_scene load_steps=6 format=2] | |||||
[ext_resource path="res://addons/yarn_spinner/yarn_runner_node.gd" type="Script" id=1] | |||||
[ext_resource path="res://jrpg/scripts/misc/test_main.gd" type="Script" id=2] | |||||
[ext_resource path="res://jrpg/yarn_scripts/main_debug.yarn" type="Resource" id=3] | |||||
[ext_resource path="res://jrpg/scenes/TestLVL.tscn" type="PackedScene" id=4] | |||||
[ext_resource path="res://jrpg/scenes/TestGameOver.tscn" type="PackedScene" id=5] | |||||
[node name="TestMain" type="Node"] | |||||
script = ExtResource( 2 ) | |||||
scenes = { | |||||
"TestGameOver": ExtResource( 5 ), | |||||
"TestLVL": ExtResource( 4 ) | |||||
} | |||||
[node name="YarnRunnerNode" type="Node" parent="."] | |||||
script = ExtResource( 1 ) | |||||
yarnScript = ExtResource( 3 ) | |||||
[node name="SceneContainer" type="Node" parent="."] |
@@ -1,7 +1,7 @@ | |||||
[gd_scene load_steps=4 format=2] | [gd_scene load_steps=4 format=2] | ||||
[ext_resource path="res://jrpg/models/chars/Zombie_Male.glb" type="PackedScene" id=1] | [ext_resource path="res://jrpg/models/chars/Zombie_Male.glb" type="PackedScene" id=1] | ||||
[ext_resource path="res://jrpg/scripts/enemy.gd" type="Script" id=2] | |||||
[ext_resource path="res://jrpg/scripts/entities/enemy.gd" type="Script" id=2] | |||||
[sub_resource type="CapsuleShape" id=1] | [sub_resource type="CapsuleShape" id=1] | ||||
radius = 0.5 | radius = 0.5 |
@@ -1,7 +1,7 @@ | |||||
[gd_scene load_steps=6 format=2] | [gd_scene load_steps=6 format=2] | ||||
[ext_resource path="res://jrpg/models/coinGold.glb" type="PackedScene" id=1] | [ext_resource path="res://jrpg/models/coinGold.glb" type="PackedScene" id=1] | ||||
[ext_resource path="res://jrpg/scripts/pickup.gd" type="Script" id=2] | |||||
[ext_resource path="res://jrpg/scripts/entities/pickup.gd" type="Script" id=2] | |||||
[ext_resource path="res://jrpg/models/gold.material" type="Material" id=3] | [ext_resource path="res://jrpg/models/gold.material" type="Material" id=3] | ||||
[ext_resource path="res://jrpg/models/wood.material" type="Material" id=4] | [ext_resource path="res://jrpg/models/wood.material" type="Material" id=4] | ||||
@@ -1,8 +1,8 @@ | |||||
[gd_scene load_steps=5 format=2] | [gd_scene load_steps=5 format=2] | ||||
[ext_resource path="res://jrpg/models/chars/Casual2_Female.glb" type="PackedScene" id=1] | [ext_resource path="res://jrpg/models/chars/Casual2_Female.glb" type="PackedScene" id=1] | ||||
[ext_resource path="res://jrpg/scripts/camera/camera_orbit.gd" type="Script" id=3] | |||||
[ext_resource path="res://jrpg/scripts/player.gd" type="Script" id=4] | |||||
[ext_resource path="res://jrpg/scripts/entities/camera/camera_orbit.gd" type="Script" id=3] | |||||
[ext_resource path="res://jrpg/scripts/entities/player.gd" type="Script" id=4] | |||||
[sub_resource type="CapsuleShape" id=1] | [sub_resource type="CapsuleShape" id=1] | ||||
radius = 0.5 | radius = 0.5 | ||||
@@ -25,9 +25,9 @@ script = ExtResource( 3 ) | |||||
transform = Transform( -1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, -1, 1, -5 ) | transform = Transform( -1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, -1, 1, -5 ) | ||||
current = true | current = true | ||||
[node name="AttackRayCast" type="RayCast" parent="."] | |||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.3, 1, 0.6 ) | |||||
[node name="InteractRayCast" type="RayCast" parent="."] | |||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.3, 1, 0.2 ) | |||||
enabled = true | enabled = true | ||||
cast_to = Vector3( 0, 0, 1.5 ) | |||||
cast_to = Vector3( 0, 0, 1.7 ) | |||||
[editable path="Casual2_Female"] | [editable path="Casual2_Female"] |
@@ -1,10 +1,12 @@ | |||||
[gd_scene load_steps=2 format=2] | |||||
[gd_scene load_steps=3 format=2] | |||||
[ext_resource path="res://main/scripts/LogPanel.gd" type="Script" id=1] | |||||
[ext_resource path="res://jrpg/scripts/ui/speech_text.gd" type="Script" id=1] | |||||
[ext_resource path="res://jrpg/fonts/puritan.tres" type="DynamicFont" id=2] | |||||
[node name="LogPanel" type="Control"] | |||||
[node name="BubblePanel" type="Control"] | |||||
anchor_right = 1.0 | anchor_right = 1.0 | ||||
anchor_bottom = 1.0 | |||||
margin_right = -232.0 | |||||
margin_bottom = 212.0 | |||||
script = ExtResource( 1 ) | script = ExtResource( 1 ) | ||||
__meta__ = { | __meta__ = { | ||||
"_edit_use_anchors_": false | "_edit_use_anchors_": false | ||||
@@ -19,6 +21,7 @@ anchor_left = 0.02 | |||||
anchor_top = 0.05 | anchor_top = 0.05 | ||||
anchor_right = 0.98 | anchor_right = 0.98 | ||||
anchor_bottom = 0.95 | anchor_bottom = 0.95 | ||||
custom_fonts/normal_font = ExtResource( 2 ) | |||||
__meta__ = { | __meta__ = { | ||||
"_edit_use_anchors_": false | "_edit_use_anchors_": false | ||||
} | } |
@@ -0,0 +1,11 @@ | |||||
[gd_scene load_steps=2 format=2] | |||||
[ext_resource path="res://jrpg/fonts/puritan.tres" type="DynamicFont" id=1] | |||||
[node name="ChoiceButton" type="Button"] | |||||
anchor_right = 1.0 | |||||
anchor_bottom = 1.0 | |||||
custom_fonts/font = ExtResource( 1 ) | |||||
__meta__ = { | |||||
"_edit_use_anchors_": false | |||||
} |
@@ -0,0 +1,15 @@ | |||||
[gd_scene load_steps=3 format=2] | |||||
[ext_resource path="res://jrpg/scripts/ui/choices_box.gd" type="Script" id=1] | |||||
[ext_resource path="res://jrpg/scenes/ui/ChoiceButton.tscn" type="PackedScene" id=2] | |||||
[node name="ChoicesBox" type="VBoxContainer"] | |||||
anchor_left = 0.3 | |||||
anchor_top = 0.1 | |||||
anchor_right = 0.7 | |||||
anchor_bottom = 0.45 | |||||
script = ExtResource( 1 ) | |||||
__meta__ = { | |||||
"_edit_use_anchors_": false | |||||
} | |||||
button_template = ExtResource( 2 ) |
@@ -2,25 +2,26 @@ | |||||
[ext_resource path="res://jrpg/fonts/puritan.tres" type="DynamicFont" id=1] | [ext_resource path="res://jrpg/fonts/puritan.tres" type="DynamicFont" id=1] | ||||
[ext_resource path="res://jrpg/textures/white_square.png" type="Texture" id=2] | [ext_resource path="res://jrpg/textures/white_square.png" type="Texture" id=2] | ||||
[ext_resource path="res://jrpg/scripts/test_ui.gd" type="Script" id=3] | |||||
[ext_resource path="res://jrpg/scripts/ui/test_hud.gd" type="Script" id=3] | |||||
[node name="UI" type="Control"] | |||||
[node name="HUD" type="Control"] | |||||
anchor_right = 1.0 | anchor_right = 1.0 | ||||
anchor_bottom = 1.0 | anchor_bottom = 1.0 | ||||
script = ExtResource( 3 ) | script = ExtResource( 3 ) | ||||
__meta__ = { | __meta__ = { | ||||
"_edit_use_anchors_": false | "_edit_use_anchors_": false | ||||
} | } | ||||
healthBar_path = NodePath("HealthBar") | |||||
goldText_path = NodePath("GoldText") | |||||
healthBar_path = NodePath("../HUD/HealthBar") | |||||
goldText_path = NodePath("../HUD/GoldText") | |||||
[node name="GoldText" type="Label" parent="."] | [node name="GoldText" type="Label" parent="."] | ||||
anchor_top = 1.0 | anchor_top = 1.0 | ||||
anchor_bottom = 1.0 | anchor_bottom = 1.0 | ||||
margin_left = 36.0 | |||||
margin_top = -133.0 | |||||
margin_right = 293.0 | |||||
margin_bottom = -94.0 | |||||
margin_left = 35.4703 | |||||
margin_top = -158.427 | |||||
margin_right = 292.47 | |||||
margin_bottom = -91.4271 | |||||
custom_fonts/font = ExtResource( 1 ) | custom_fonts/font = ExtResource( 1 ) | ||||
text = "Gold : 500" | text = "Gold : 500" | ||||
valign = 1 | valign = 1 |
@@ -0,0 +1,16 @@ | |||||
[gd_scene load_steps=3 format=2] | |||||
[ext_resource path="res://jrpg/scripts/ui/speech_text.gd" type="Script" id=1] | |||||
[ext_resource path="res://jrpg/fonts/puritan.tres" type="DynamicFont" id=2] | |||||
[node name="SpeechText" type="Label"] | |||||
anchor_right = 1.0 | |||||
margin_right = -232.0 | |||||
margin_bottom = 212.0 | |||||
custom_fonts/font = ExtResource( 2 ) | |||||
align = 1 | |||||
valign = 1 | |||||
script = ExtResource( 1 ) | |||||
__meta__ = { | |||||
"_edit_use_anchors_": false | |||||
} |
@@ -1,41 +0,0 @@ | |||||
extends Spatial | |||||
# look stats | |||||
var lookSensitivity : float = 15.0 | |||||
var minLookAngle : float = -20.0 | |||||
var maxLookAngle : float = 75.0 | |||||
# vectors | |||||
var mouseDelta = Vector2() | |||||
# components | |||||
onready var player = get_parent() | |||||
# called when an input is detected | |||||
func _input (event): | |||||
# set "mouseDelta" when we move our mouse | |||||
if event is InputEventMouseMotion: | |||||
mouseDelta = event.relative | |||||
# called every frame | |||||
func _process (delta): | |||||
# get the rotation to apply to the camera and player | |||||
var rot = Vector3(mouseDelta.y, mouseDelta.x, 0) * lookSensitivity * delta | |||||
# camera vertical rotation | |||||
rotation_degrees.x += rot.x | |||||
rotation_degrees.x = clamp(rotation_degrees.x, minLookAngle, maxLookAngle) | |||||
# player horizontal rotation | |||||
player.rotation_degrees.y -= rot.y | |||||
# clear the mouse movement vector | |||||
mouseDelta = Vector2() | |||||
# called when the node is initialized | |||||
func _ready (): | |||||
# hide the mouse cursor | |||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) |
@@ -0,0 +1,47 @@ | |||||
extends Spatial | |||||
# look stats | |||||
var lookSensitivity : float = 15.0 | |||||
var minLookAngle : float = -20.0 | |||||
var maxLookAngle : float = 75.0 | |||||
# vectors | |||||
var mouseDelta = Vector2() | |||||
# components | |||||
onready var player = get_parent() | |||||
# called when the node is initialized | |||||
func _ready (): | |||||
on_player_input_change(Controller.player_input_enabled) | |||||
Controller.connect("player_input_change", self, "on_player_input_change") | |||||
# called when an input is detected | |||||
func _input (event): | |||||
# set "mouseDelta" when we move our mouse | |||||
if Controller.player_input_enabled and event is InputEventMouseMotion: | |||||
mouseDelta = event.relative | |||||
# called every frame | |||||
func _process (delta): | |||||
if Controller.player_input_enabled: | |||||
# get the rotation to apply to the camera and player | |||||
var rot = Vector3(mouseDelta.y, mouseDelta.x, 0) * lookSensitivity * delta | |||||
# camera vertical rotation | |||||
rotation_degrees.x += rot.x | |||||
rotation_degrees.x = clamp(rotation_degrees.x, minLookAngle, maxLookAngle) | |||||
# player horizontal rotation | |||||
player.rotation_degrees.y -= rot.y | |||||
# clear the mouse movement vector | |||||
mouseDelta = Vector2() | |||||
func on_player_input_change(value): | |||||
print(value) | |||||
if value: | |||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) | |||||
else: | |||||
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) |
@@ -0,0 +1,16 @@ | |||||
extends Node | |||||
class_name BasisInteraction | |||||
export var auto_connect_on_ready := true | |||||
func _ready(): | |||||
init() | |||||
if auto_connect_on_ready: | |||||
get_parent().connect("on_interact", self, "on_interact") | |||||
func init(): | |||||
pass | |||||
func on_interact(): | |||||
print("interact") |
@@ -0,0 +1,26 @@ | |||||
extends BasisInteraction | |||||
var is_talking = false | |||||
export var yarnScript : Resource | |||||
export var speechPanel_path : NodePath | |||||
onready var speechPanel := get_node(speechPanel_path) | |||||
var yarnRunner := YarnRunner.new() | |||||
func on_interact(): | |||||
if not is_talking: | |||||
yarnRunner.say_func = funcref(speechPanel.text, "on_new_line") | |||||
yarnRunner.choices_func = funcref(speechPanel.choices, "on_choices") | |||||
yarnRunner.yarnScript = self.yarnScript | |||||
is_talking = true | |||||
speechPanel.show() | |||||
Controller.player_input_enabled = false | |||||
yield(yarnRunner.run_all(), "completed") | |||||
Controller.player_input_enabled = true | |||||
speechPanel.hide() | |||||
is_talking = false |
@@ -32,6 +32,7 @@ func _on_Timer_timeout (): | |||||
# if we're within the attack distance - attack the player | # if we're within the attack distance - attack the player | ||||
if translation.distance_to(player.translation) <= attackDist: | if translation.distance_to(player.translation) <= attackDist: | ||||
anim.play("Punch") | |||||
player.take_damage(damage) | player.take_damage(damage) | ||||
# called 60 times a second | # called 60 times a second | ||||
@@ -50,8 +51,24 @@ func _physics_process (delta): | |||||
# gravity | # gravity | ||||
vel.y -= gravity * delta | vel.y -= gravity * delta | ||||
# TODO better | |||||
look_at(player.translation, Vector3.UP) | |||||
rotation_degrees.x = 0 | |||||
rotation_degrees.y = rotation_degrees.y + 180 | |||||
rotation_degrees.z = 0 | |||||
# move towards the player | # move towards the player | ||||
vel = move_and_slide(vel, Vector3.UP) | vel = move_and_slide(vel, Vector3.UP) | ||||
if is_on_floor(): | |||||
if anim.current_animation != "Punch" and anim.current_animation != "RecieveHit": | |||||
if vel.length_squared() > 0: | |||||
anim.play("Walk") | |||||
else: | |||||
anim.play("Idle") | |||||
else: | |||||
anim.play("RecieveHit") | |||||
# called when the player deals damage to us | # called when the player deals damage to us | ||||
func take_damage (damageToTake): | func take_damage (damageToTake): |
@@ -0,0 +1,4 @@ | |||||
extends Node | |||||
signal on_interact | |||||
signal on_attack |
@@ -0,0 +1,152 @@ | |||||
extends KinematicBody | |||||
# stats | |||||
var curHp : int = 10 | |||||
var maxHp : int = 10 | |||||
var damage : int = 1 | |||||
var gold : int = 0 | |||||
var attackRate : float = 0.3 | |||||
var lastAttackTime : int = 0 | |||||
# physics | |||||
var airborneSpeed : float = 3.0 | |||||
var walkSpeed : float = 5.0 | |||||
var runSpeed : float = 10.0 | |||||
var jumpForce : float = 10.0 | |||||
var gravity : float = 15.0 | |||||
var vel := Vector3() | |||||
# components | |||||
onready var camera = get_node("CameraOrbit") | |||||
onready var interactCast = get_node("InteractRayCast") | |||||
onready var anim = get_node("Casual2_Female/AnimationPlayer") | |||||
export var ui_path : NodePath | |||||
onready var ui = get_node(ui_path) | |||||
# called when the node is initialized | |||||
func _ready (): | |||||
# initialize the UI | |||||
ui.update_health_bar(curHp, maxHp) | |||||
ui.update_gold_text(gold) | |||||
func _process(delta): | |||||
# attack input | |||||
if Controller.player_input_enabled and is_on_floor() and Input.is_action_just_pressed("interact"): | |||||
try_interact() | |||||
# called every physics step (60 times a second) | |||||
func _physics_process (delta): | |||||
var input := Vector3() | |||||
# gravity | |||||
vel.y -= gravity * delta | |||||
if Controller.player_input_enabled : | |||||
# movement inputs | |||||
if Input.is_action_pressed("move_forward"): | |||||
input.z += 1 | |||||
if Input.is_action_pressed("move_backward"): | |||||
input.z -= 1 | |||||
if Input.is_action_pressed("move_left"): | |||||
input.x += 1 | |||||
if Input.is_action_pressed("move_right"): | |||||
input.x -= 1 | |||||
input = input.normalized() | |||||
# get the relative direction | |||||
var dir := (transform.basis.z * input.z + transform.basis.x * input.x) | |||||
# apply the direction to our velocity | |||||
if not is_on_floor(): | |||||
vel.x = lerp(vel.x, dir.x * airborneSpeed, .5 * delta) | |||||
vel.z = lerp(vel.z, dir.z * airborneSpeed, .5 * delta) | |||||
elif Input.is_action_pressed("run"): | |||||
vel.x = dir.x * runSpeed | |||||
vel.z = dir.z * runSpeed | |||||
else: | |||||
vel.x = dir.x * walkSpeed | |||||
vel.z = dir.z * walkSpeed | |||||
# jump input | |||||
if Input.is_action_pressed("jump") and is_on_floor(): | |||||
vel.y = jumpForce | |||||
else: | |||||
vel.x = 0 | |||||
vel.z = 0 | |||||
if is_on_floor(): | |||||
if anim.current_animation != "Punch": | |||||
if input.x != 0 || input.z != 0: | |||||
if Controller.player_input_enabled and Input.is_action_pressed("run"): | |||||
anim.play("Run") | |||||
else: | |||||
anim.play("Walk") | |||||
else: | |||||
anim.play("Idle") | |||||
else: | |||||
anim.play("RecieveHit") | |||||
# move along the current velocity | |||||
var previous_vel = vel | |||||
vel = move_and_slide(vel, Vector3.UP, true, 4, deg2rad(30)) | |||||
if is_on_wall(): | |||||
vel.y = min(previous_vel.y, vel.y) | |||||
# called when we collect a coin | |||||
func give_gold (amount): | |||||
gold += amount | |||||
# update the UI | |||||
ui.update_gold_text(gold) | |||||
# called when an enemy deals damage to us | |||||
func take_damage (damageToTake): | |||||
curHp -= damageToTake | |||||
# update the UI | |||||
ui.update_health_bar(curHp, maxHp) | |||||
# if our health is 0, die | |||||
if curHp <= 0: | |||||
die() | |||||
# called when our health reaches 0 | |||||
func die (): | |||||
# reload the scene | |||||
get_tree().reload_current_scene() | |||||
## called when we press the attack button | |||||
#func try_attack(): | |||||
# # if we're not ready to attack, return | |||||
# if OS.get_ticks_msec() - lastAttackTime < attackRate * 1000: | |||||
# return | |||||
# | |||||
# # set the last attack time to now | |||||
# lastAttackTime = OS.get_ticks_msec() | |||||
# | |||||
# # play the animation | |||||
# anim.stop() | |||||
# anim.play("Punch") | |||||
# | |||||
# # is the ray cast colliding with an enemy? | |||||
# if attackCast.is_colliding(): | |||||
# if attackCast.get_collider().has_method("take_damage"): | |||||
# attackCast.get_collider().take_damage(damage) | |||||
# if attackCast.get_collider().has_signal("on_interact"): | |||||
# attackCast.get_collider().emit_signal("on_interact") | |||||
# called when we press the interact button | |||||
func try_interact(): | |||||
# is the ray cast colliding with an enemy? | |||||
if interactCast.is_colliding(): | |||||
# play the animation | |||||
anim.stop() | |||||
anim.play("Idle") | |||||
if interactCast.get_collider().has_signal("on_interact"): | |||||
interactCast.get_collider().emit_signal("on_interact") |
@@ -0,0 +1,8 @@ | |||||
extends Node | |||||
var player_input_enabled := true setget player_input_enabled_set | |||||
signal player_input_change | |||||
func player_input_enabled_set(value): | |||||
player_input_enabled = value | |||||
emit_signal("player_input_change", value) |
@@ -0,0 +1,8 @@ | |||||
extends Node | |||||
func _enter_tree(): | |||||
Controller.player_input_enabled = true | |||||
func _exit_tree(): | |||||
Controller.player_input_enabled = false | |||||
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) |
@@ -0,0 +1,27 @@ | |||||
extends Node | |||||
export var scenes : Dictionary | |||||
signal end | |||||
func _ready(): | |||||
$YarnRunnerNode.yarnRunner.add_command("Scene", funcref(self, "load_scene")) | |||||
$YarnRunnerNode.yarnRunner.add_command("WaitSignal", funcref(self, "wait_signal")) | |||||
yield($YarnRunnerNode.start_script(), "completed") | |||||
func load_scene(args): | |||||
yield(get_tree(),"idle_frame") | |||||
if args.size() > 0: | |||||
var scene_key = args[0] | |||||
if scenes.has(scene_key): | |||||
for child in $SceneContainer.get_children(): | |||||
child.queue_free() | |||||
var scene = scenes[scene_key].instance() | |||||
$SceneContainer.add_child(scene) | |||||
func wait_signal(args): | |||||
yield(self, "end") | |||||
func _input(event): | |||||
if event.is_action_pressed("ui_cancel"): | |||||
emit_signal("end") |
@@ -1,129 +0,0 @@ | |||||
extends KinematicBody | |||||
# stats | |||||
var curHp : int = 10 | |||||
var maxHp : int = 10 | |||||
var damage : int = 1 | |||||
var gold : int = 0 | |||||
var attackRate : float = 0.3 | |||||
var lastAttackTime : int = 0 | |||||
# physics | |||||
var walkSpeed : float = 5.0 | |||||
var runSpeed : float = 10.0 | |||||
var jumpForce : float = 10.0 | |||||
var gravity : float = 15.0 | |||||
var vel := Vector3() | |||||
# components | |||||
onready var camera = get_node("CameraOrbit") | |||||
onready var attackCast = get_node("AttackRayCast") | |||||
onready var anim = get_node("Casual2_Female/AnimationPlayer") | |||||
export var ui_path : NodePath | |||||
onready var ui = get_node(ui_path) | |||||
# called when the node is initialized | |||||
func _ready (): | |||||
# initialize the UI | |||||
ui.update_health_bar(curHp, maxHp) | |||||
ui.update_gold_text(gold) | |||||
func _process(delta): | |||||
# attack input | |||||
if is_on_floor() and Input.is_action_just_pressed("attack"): | |||||
try_attack() | |||||
# called every physics step (60 times a second) | |||||
func _physics_process (delta): | |||||
vel.x = 0 | |||||
vel.z = 0 | |||||
var input := Vector3() | |||||
# movement inputs | |||||
if Input.is_action_pressed("move_forward"): | |||||
input.z += 1 | |||||
if Input.is_action_pressed("move_backward"): | |||||
input.z -= 1 | |||||
if Input.is_action_pressed("move_left"): | |||||
input.x += 1 | |||||
if Input.is_action_pressed("move_right"): | |||||
input.x -= 1 | |||||
input = input.normalized() | |||||
# get the relative direction | |||||
var dir := (transform.basis.z * input.z + transform.basis.x * input.x) | |||||
# apply the direction to our velocity | |||||
if Input.is_action_pressed("run"): | |||||
vel.x = dir.x * runSpeed | |||||
vel.z = dir.z * runSpeed | |||||
else: | |||||
vel.x = dir.x * walkSpeed | |||||
vel.z = dir.z * walkSpeed | |||||
# gravity | |||||
vel.y -= gravity * delta | |||||
# jump input | |||||
if Input.is_action_pressed("jump") and is_on_floor(): | |||||
vel.y = jumpForce | |||||
if is_on_floor(): | |||||
if anim.current_animation != "Punch": | |||||
if input.x != 0 || input.z != 0: | |||||
if Input.is_action_pressed("run"): | |||||
anim.play("Run") | |||||
else: | |||||
anim.play("Walk") | |||||
else: | |||||
anim.play("Idle") | |||||
else: | |||||
anim.play("RecieveHit") | |||||
# move along the current velocity | |||||
vel = move_and_slide(vel, Vector3.UP, true, 4, deg2rad(89)) | |||||
# called when we collect a coin | |||||
func give_gold (amount): | |||||
gold += amount | |||||
# update the UI | |||||
ui.update_gold_text(gold) | |||||
# called when an enemy deals damage to us | |||||
func take_damage (damageToTake): | |||||
curHp -= damageToTake | |||||
# update the UI | |||||
ui.update_health_bar(curHp, maxHp) | |||||
# if our health is 0, die | |||||
if curHp <= 0: | |||||
die() | |||||
# called when our health reaches 0 | |||||
func die (): | |||||
# reload the scene | |||||
get_tree().reload_current_scene() | |||||
# called when we press the attack button | |||||
func try_attack(): | |||||
# if we're not ready to attack, return | |||||
if OS.get_ticks_msec() - lastAttackTime < attackRate * 1000: | |||||
return | |||||
# set the last attack time to now | |||||
lastAttackTime = OS.get_ticks_msec() | |||||
# play the animation | |||||
anim.stop() | |||||
anim.play("Punch") | |||||
# is the ray cast colliding with an enemy? | |||||
if attackCast.is_colliding(): | |||||
if attackCast.get_collider().has_method("take_damage"): | |||||
attackCast.get_collider().take_damage(damage) |
@@ -3,13 +3,15 @@ class_name ChoicesBox | |||||
signal choice_made | signal choice_made | ||||
export var button_template : PackedScene | |||||
func on_choice_made(marker): | func on_choice_made(marker): | ||||
emit_signal("choice_made", marker) | emit_signal("choice_made", marker) | ||||
func on_choices(choices_list): | func on_choices(choices_list): | ||||
show() | show() | ||||
for choice in choices_list: | for choice in choices_list: | ||||
var choiceButton := Button.new() | |||||
var choiceButton = button_template.instance() | |||||
choiceButton.text = choice["text"] | choiceButton.text = choice["text"] | ||||
choiceButton.connect("pressed", self, "on_choice_made", [choice]) | choiceButton.connect("pressed", self, "on_choice_made", [choice]) | ||||
add_child(choiceButton) | add_child(choiceButton) |
@@ -0,0 +1,10 @@ | |||||
extends Control | |||||
export var text_path : NodePath | |||||
onready var text := get_node(text_path) | |||||
export var choices_path : NodePath | |||||
onready var choices := get_node(choices_path) | |||||
func _ready(): | |||||
hide() |
@@ -0,0 +1,29 @@ | |||||
extends Label | |||||
class_name SpeechText | |||||
signal click_down | |||||
signal click_up | |||||
var wait_input := false | |||||
func _ready(): | |||||
text = "" | |||||
func _input(event): | |||||
if wait_input and event is InputEventMouseButton: | |||||
if event.is_pressed(): # Mouse button down. | |||||
emit_signal("click_down") | |||||
else: | |||||
emit_signal("click_up") | |||||
func on_new_line(line): | |||||
show() | |||||
text = line.text | |||||
wait_input = true | |||||
yield(self, "click_down") | |||||
yield(self, "click_up") | |||||
wait_input = false | |||||
func clear(): | |||||
text = '' |
@@ -0,0 +1,40 @@ | |||||
title: Start | |||||
tags: | |||||
colorID: 0 | |||||
position: 571,308 | |||||
--- | |||||
Starting | |||||
[[TestLVL]] | |||||
=== | |||||
title: TestLVL | |||||
tags: | |||||
colorID: 0 | |||||
position: 571,668 | |||||
--- | |||||
<<Scene TestLVL>> | |||||
Scene loaded | |||||
[[TestLVLLoop]] | |||||
=== | |||||
title: GameOver | |||||
tags: | |||||
colorID: 0 | |||||
position: 1096,808 | |||||
--- | |||||
<<Scene TestGameOver>> | |||||
Game Over | |||||
<<WaitSignal>> | |||||
Restarting | |||||
[[TestLVL]] | |||||
=== | |||||
title: TestLVLLoop | |||||
tags: | |||||
colorID: 0 | |||||
position: 579,916 | |||||
--- | |||||
<<WaitSignal>> | |||||
<<if False>> | |||||
[[TestLVLLoop]] | |||||
<<else>> | |||||
[[GameOver]] | |||||
<<endif>> | |||||
=== |
@@ -0,0 +1,13 @@ | |||||
[remap] | |||||
importer="yarn.script" | |||||
type="Resource" | |||||
path="res://.import/main_debug.yarn-25c0e0fa3f4971fbbd75a2edb09403f4.res" | |||||
[deps] | |||||
source_file="res://jrpg/yarn_scripts/main_debug.yarn" | |||||
dest_files=[ "res://.import/main_debug.yarn-25c0e0fa3f4971fbbd75a2edb09403f4.res" ] | |||||
[params] | |||||
@@ -0,0 +1,26 @@ | |||||
title: Start | |||||
tags: | |||||
position: 701,320 | |||||
--- | |||||
Bonjour je suis un npc de debug ! | |||||
[[Bonjour|bonjour]] | |||||
[[Euh... Nique ta mère!|ntm]] | |||||
=== | |||||
title: bonjour | |||||
tags: | |||||
position: 1032.2125854492188,730.3896484375 | |||||
--- | |||||
Est-ce que tu aimes la France ? | |||||
Est-ce que tu es prêt à donner ta vie pour la France ?? | |||||
A MOURIIIR POUR TA PATRIE ?? | |||||
=== | |||||
title: ntm | |||||
tags: | |||||
position: 693.5343566489377,684.1047771502635 | |||||
--- | |||||
Vous n'avez pas honte ?? | |||||
=== | |||||
@@ -0,0 +1,13 @@ | |||||
[remap] | |||||
importer="yarn.script" | |||||
type="Resource" | |||||
path="res://.import/npc_debug.yarn-0be9617748c4c825e4ae2abea83bc72f.res" | |||||
[deps] | |||||
source_file="res://jrpg/yarn_scripts/npc_debug.yarn" | |||||
dest_files=[ "res://.import/npc_debug.yarn-0be9617748c4c825e4ae2abea83bc72f.res" ] | |||||
[params] | |||||
@@ -1,34 +0,0 @@ | |||||
title: Start | |||||
tags: | |||||
position: 701,320 | |||||
--- | |||||
Empty Text | |||||
Haha | |||||
[[lul]] | |||||
je devrais pas apparaître | |||||
=== | |||||
title: lul | |||||
tags: | |||||
position: 1032.2125854492188,730.3896484375 | |||||
--- | |||||
Huhuhu | |||||
<<if 1 > 2 >> | |||||
OK !! | |||||
[[zboub]] | |||||
<<else>> | |||||
Pas ok. | |||||
<<endif>> | |||||
[[zboub|zboub]] | |||||
[[start|Start]] | |||||
Moi non plus | |||||
=== | |||||
title: zboub | |||||
tags: | |||||
position: 693.5343566489377,684.1047771502635 | |||||
--- | |||||
Prout poruoruoruo | |||||
=== | |||||
@@ -1,14 +0,0 @@ | |||||
[remap] | |||||
importer="yarn.script" | |||||
type="Resource" | |||||
path="res://.import/test.yarn-642d0590cee80e9b0bd554c3bdc33727.res" | |||||
[deps] | |||||
source_file="res://main/dialogues/test.yarn" | |||||
dest_files=[ "res://.import/test.yarn-642d0590cee80e9b0bd554c3bdc33727.res" ] | |||||
[params] | |||||
use_red_anyway=false |
@@ -1,13 +0,0 @@ | |||||
[gd_scene load_steps=2 format=2] | |||||
[ext_resource path="res://main/scripts/ChoicesBox.gd" type="Script" id=1] | |||||
[node name="ChoicesBox" type="VBoxContainer"] | |||||
anchor_left = 0.3 | |||||
anchor_top = 0.1 | |||||
anchor_right = 0.7 | |||||
anchor_bottom = 0.45 | |||||
script = ExtResource( 1 ) | |||||
__meta__ = { | |||||
"_edit_use_anchors_": false | |||||
} |
@@ -1,27 +0,0 @@ | |||||
[gd_scene load_steps=3 format=2] | |||||
[ext_resource path="res://main/scripts/dialogue_test.gd" type="Script" id=1] | |||||
[ext_resource path="res://yarn/scenes/YarnSpinner.tscn" type="PackedScene" id=2] | |||||
[node name="DialogueTest" type="Control"] | |||||
anchor_right = 1.0 | |||||
anchor_bottom = 1.0 | |||||
script = ExtResource( 1 ) | |||||
__meta__ = { | |||||
"_edit_use_anchors_": false | |||||
} | |||||
[node name="YarnSpinner" parent="." instance=ExtResource( 2 )] | |||||
yarn_file = "main/dialogues/test.yarn" | |||||
[node name="StartButton" type="Button" parent="."] | |||||
anchor_left = 0.45 | |||||
anchor_top = 0.45 | |||||
anchor_right = 0.55 | |||||
anchor_bottom = 0.55 | |||||
margin_left = -6.0 | |||||
margin_top = -10.0 | |||||
margin_right = 6.0 | |||||
margin_bottom = 10.0 | |||||
text = "Start !" | |||||
[connection signal="pressed" from="StartButton" to="." method="_on_start_pressed"] |
@@ -1,34 +0,0 @@ | |||||
[gd_scene load_steps=3 format=2] | |||||
[sub_resource type="BoxShape" id=2] | |||||
extents = Vector3( 4.51412, 0.146837, 4.39716 ) | |||||
[sub_resource type="SphereShape" id=1] | |||||
[node name="Spatial" type="Spatial"] | |||||
[node name="DirectionalLight" type="DirectionalLight" parent="."] | |||||
[node name="StaticBody" type="StaticBody" parent="."] | |||||
transform = Transform( 0.997775, 0.0666744, 0, -0.0666744, 0.997775, 0, 0, 0, 1, 0, 0, 0 ) | |||||
[node name="CSGBox" type="CSGBox" parent="StaticBody"] | |||||
transform = Transform( 4.58515, 0, 0, 0, 1, 0, 0, 0, 4.58515, 0, 0, 0 ) | |||||
height = 0.3043 | |||||
[node name="CollisionShape" type="CollisionShape" parent="StaticBody"] | |||||
shape = SubResource( 2 ) | |||||
[node name="VehicleBody" type="RigidBody" parent="."] | |||||
[node name="CSGSphere" type="CSGSphere" parent="VehicleBody"] | |||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.01212, 0 ) | |||||
radial_segments = 36 | |||||
rings = 16 | |||||
[node name="CollisionShape" type="CollisionShape" parent="VehicleBody"] | |||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.01212, 0 ) | |||||
shape = SubResource( 1 ) | |||||
[node name="Camera" type="Camera" parent="VehicleBody"] | |||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.59567, 6.78563 ) |
@@ -1,27 +0,0 @@ | |||||
[gd_scene load_steps=6 format=2] | |||||
[ext_resource path="res://main/scripts/test_viteuf.gd" type="Script" id=1] | |||||
[ext_resource path="res://main/dialogues/test.yarn" type="Resource" id=2] | |||||
[ext_resource path="res://addons/yarn_spinner/yarn_runner.gd" type="Script" id=3] | |||||
[ext_resource path="res://main/scenes/LogPanel.tscn" type="PackedScene" id=4] | |||||
[ext_resource path="res://main/scenes/ChoicesBox.tscn" type="PackedScene" id=5] | |||||
[node name="Node" type="Control"] | |||||
anchor_right = 1.0 | |||||
anchor_bottom = 1.0 | |||||
script = ExtResource( 1 ) | |||||
__meta__ = { | |||||
"_edit_use_anchors_": false | |||||
} | |||||
[node name="YarnRunner" type="Node" parent="."] | |||||
script = ExtResource( 3 ) | |||||
yarnScript = ExtResource( 2 ) | |||||
[node name="LogPanel" parent="." instance=ExtResource( 4 )] | |||||
anchor_bottom = 0.6 | |||||
[node name="ChoicesBox" parent="." instance=ExtResource( 5 )] | |||||
anchor_top = 0.6 | |||||
anchor_bottom = 1.0 | |||||
alignment = 1 |
@@ -1,13 +0,0 @@ | |||||
extends Control | |||||
class_name LogPanel | |||||
func _ready(): | |||||
$RichTextLabel.text = "" | |||||
func on_new_line(text): | |||||
show() | |||||
$RichTextLabel.text += text + '\n' | |||||
yield($TextButton, "pressed") | |||||
func clear(): | |||||
$RichTextLabel.text = '' |
@@ -1,9 +0,0 @@ | |||||
extends Control | |||||
func start(): | |||||
$StartButton.hide() | |||||
yield($YarnSpinner.spin_yarn($YarnSpinner.yarn_file), "completed") | |||||
$StartButton.show() | |||||
func _on_start_pressed(): | |||||
start() |
@@ -1,28 +0,0 @@ | |||||
extends Control | |||||
func _ready(): | |||||
# $ChoicesBox.hide() | |||||
# $LogPanel.hide() | |||||
on_dialogue_start() | |||||
$YarnRunner.say_func = funcref(self, "on_new_line") | |||||
$YarnRunner.choices_func = funcref(self, "on_choices") | |||||
yield($YarnRunner.run_all(), "completed") | |||||
on_dialogue_end() | |||||
func on_dialogue_start(): | |||||
$LogPanel.show() | |||||
$ChoicesBox.show() | |||||
$LogPanel.clear() | |||||
$ChoicesBox.clear() | |||||
func on_new_line(line): | |||||
yield($LogPanel.on_new_line(line["text"]), "completed") | |||||
func on_choices(choices_list): | |||||
print(choices_list) | |||||
return yield($ChoicesBox.on_choices(choices_list), "completed") | |||||
func on_dialogue_end(): | |||||
pass | |||||
# $ChoicesBox.hide() | |||||
# $LogPanel.hide() |
@@ -9,25 +9,49 @@ | |||||
config_version=4 | config_version=4 | ||||
_global_script_classes=[ { | _global_script_classes=[ { | ||||
"base": "Node", | |||||
"class": "BasisInteraction", | |||||
"language": "GDScript", | |||||
"path": "res://jrpg/scripts/entities/components/interactions/basis_interaction.gd" | |||||
}, { | |||||
"base": "VBoxContainer", | "base": "VBoxContainer", | ||||
"class": "ChoicesBox", | "class": "ChoicesBox", | ||||
"language": "GDScript", | "language": "GDScript", | ||||
"path": "res://main/scripts/ChoicesBox.gd" | |||||
"path": "res://jrpg/scripts/ui/choices_box.gd" | |||||
}, { | }, { | ||||
"base": "Control", | |||||
"class": "LogPanel", | |||||
"base": "Label", | |||||
"class": "SpeechText", | |||||
"language": "GDScript", | "language": "GDScript", | ||||
"path": "res://main/scripts/LogPanel.gd" | |||||
"path": "res://jrpg/scripts/ui/speech_text.gd" | |||||
}, { | }, { | ||||
"base": "Node", | "base": "Node", | ||||
"class": "YarnImporter", | "class": "YarnImporter", | ||||
"language": "GDScript", | "language": "GDScript", | ||||
"path": "res://yarn/scripts/yarn-importer.gd" | "path": "res://yarn/scripts/yarn-importer.gd" | ||||
}, { | |||||
"base": "Object", | |||||
"class": "YarnRunner", | |||||
"language": "GDScript", | |||||
"path": "res://addons/yarn_spinner/yarn_runner.gd" | |||||
}, { | |||||
"base": "Node", | |||||
"class": "YarnRunnerNode", | |||||
"language": "GDScript", | |||||
"path": "res://addons/yarn_spinner/yarn_runner_node.gd" | |||||
}, { | |||||
"base": "Resource", | |||||
"class": "YarnScript", | |||||
"language": "GDScript", | |||||
"path": "res://addons/yarn_spinner/yarn_script.gd" | |||||
} ] | } ] | ||||
_global_script_class_icons={ | _global_script_class_icons={ | ||||
"BasisInteraction": "", | |||||
"ChoicesBox": "", | "ChoicesBox": "", | ||||
"LogPanel": "", | |||||
"YarnImporter": "" | |||||
"SpeechText": "", | |||||
"YarnImporter": "", | |||||
"YarnRunner": "", | |||||
"YarnRunnerNode": "", | |||||
"YarnScript": "" | |||||
} | } | ||||
[application] | [application] | ||||
@@ -35,6 +59,10 @@ _global_script_class_icons={ | |||||
config/name="Chepa" | config/name="Chepa" | ||||
config/icon="res://icon.png" | config/icon="res://icon.png" | ||||
[autoload] | |||||
Controller="*res://jrpg/scripts/misc/controller.gd" | |||||
[editor_plugins] | [editor_plugins] | ||||
enabled=PoolStringArray( "yarn_spinner" ) | enabled=PoolStringArray( "yarn_spinner" ) | ||||
@@ -72,7 +100,7 @@ jump={ | |||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) | ||||
] | ] | ||||
} | } | ||||
attack={ | |||||
interact={ | |||||
"deadzone": 0.5, | "deadzone": 0.5, | ||||
"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) | "events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) | ||||
] | ] | ||||
@@ -1,9 +1,11 @@ | |||||
[gd_scene load_steps=4 format=2] | [gd_scene load_steps=4 format=2] | ||||
[ext_resource path="res://main/scenes/ChoicesBox.tscn" type="PackedScene" id=1] | |||||
[ext_resource path="res://jrpg/scenes/ui/ChoicesBox.tscn" type="PackedScene" id=1] | |||||
[ext_resource path="res://main/scenes/LogPanel.tscn" type="PackedScene" id=2] | [ext_resource path="res://main/scenes/LogPanel.tscn" type="PackedScene" id=2] | ||||
[ext_resource path="res://yarn/scripts/YarnSpinner.gd" type="Script" id=3] | [ext_resource path="res://yarn/scripts/YarnSpinner.gd" type="Script" id=3] | ||||
[node name="YarnSpinner" type="Control"] | [node name="YarnSpinner" type="Control"] | ||||
anchor_right = 1.0 | anchor_right = 1.0 | ||||
anchor_bottom = 1.0 | anchor_bottom = 1.0 | ||||