| @@ -1,18 +1,22 @@ | |||
| [gd_scene load_steps=2 format=2] | |||
| [gd_scene load_steps=3 format=2] | |||
| [ext_resource path="res://jrpg/fonts/puritan.tres" type="DynamicFont" id=1] | |||
| [ext_resource path="res://jrpg/scripts/levels/game_over_scene.gd" type="Script" id=2] | |||
| [node name="TestGameOver" type="Control"] | |||
| anchor_right = 1.0 | |||
| anchor_bottom = 1.0 | |||
| script = ExtResource( 2 ) | |||
| __meta__ = { | |||
| "_edit_use_anchors_": false | |||
| } | |||
| [node name="Label" type="Label" parent="."] | |||
| [node name="Button" type="Button" parent="."] | |||
| anchor_right = 1.0 | |||
| anchor_bottom = 1.0 | |||
| custom_fonts/font = ExtResource( 1 ) | |||
| text = "Game Over" | |||
| align = 1 | |||
| valign = 1 | |||
| __meta__ = { | |||
| "_edit_use_anchors_": false | |||
| } | |||
| [connection signal="pressed" from="Button" to="." method="_on_Button_pressed"] | |||
| @@ -1,7 +1,7 @@ | |||
| [gd_scene load_steps=29 format=2] | |||
| [gd_scene load_steps=30 format=2] | |||
| [ext_resource path="res://jrpg/scripts/levels/spawner.gd" type="Script" id=1] | |||
| [ext_resource path="res://addons/yarn_spinner/yarn_runner_node.gd" type="Script" id=2] | |||
| [ext_resource path="res://jrpg/yarn_scripts/test_start.yarn" type="Resource" id=2] | |||
| [ext_resource path="res://jrpg/scenes/entities/Pickup.tscn" type="PackedScene" id=3] | |||
| [ext_resource path="res://jrpg/yarn_scripts/event1.yarn" type="Resource" id=4] | |||
| [ext_resource path="res://jrpg/scripts/levels/test_coins.gd" type="Script" id=5] | |||
| @@ -12,6 +12,7 @@ | |||
| [ext_resource path="res://jrpg/models/nature/_defaultMat.material" type="Material" id=10] | |||
| [ext_resource path="res://jrpg/scripts/levels/script_trigger.gd" type="Script" id=11] | |||
| [ext_resource path="res://jrpg/characters/basic_enemy.tres" type="Resource" id=12] | |||
| [ext_resource path="res://jrpg/yarn_scripts/all_coins_picked_up_script.yarn" type="Resource" id=13] | |||
| [ext_resource path="res://jrpg/scripts/misc/test_level.gd" type="Script" id=15] | |||
| [sub_resource type="ArrayMesh" id=1] | |||
| @@ -241,6 +242,7 @@ radius = 5.11979 | |||
| [node name="TestLVL" type="Spatial"] | |||
| script = ExtResource( 15 ) | |||
| init_yarn_script = ExtResource( 2 ) | |||
| [node name="WorldEnvironment" type="WorldEnvironment" parent="."] | |||
| environment = ExtResource( 7 ) | |||
| @@ -372,48 +374,47 @@ material/1 = null | |||
| [node name="CollisionShape" type="CollisionShape" parent="ground_grass/Rocks/rock_largeC/tmpParent/rock_largeC/StaticBody"] | |||
| shape = SubResource( 14 ) | |||
| [node name="Coins" type="Spatial" parent="."] | |||
| [node name="Spawners" type="Spatial" parent="."] | |||
| [node name="Coins" type="Spatial" parent="Spawners"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.43111, 0 ) | |||
| script = ExtResource( 5 ) | |||
| coin_scene = ExtResource( 3 ) | |||
| all_coins_picked_up_script = ExtResource( 13 ) | |||
| [node name="CoinSpawn1" type="Spatial" parent="Coins"] | |||
| [node name="CoinSpawn1" type="Spatial" parent="Spawners/Coins"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 14.3334, 0, 0 ) | |||
| [node name="CoinSpawn2" type="Spatial" parent="Coins"] | |||
| [node name="CoinSpawn2" type="Spatial" parent="Spawners/Coins"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -14.165, 0, 0 ) | |||
| [node name="CoinSpawn3" type="Spatial" parent="Coins"] | |||
| [node name="CoinSpawn3" type="Spatial" parent="Spawners/Coins"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -4.81607, 0, 9.68945 ) | |||
| [node name="CoinSpawn4" type="Spatial" parent="Coins"] | |||
| [node name="CoinSpawn4" type="Spatial" parent="Spawners/Coins"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 19.3149, 0, 6.87337 ) | |||
| [node name="CoinSpawn5" type="Spatial" parent="Coins"] | |||
| [node name="CoinSpawn5" type="Spatial" parent="Spawners/Coins"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.330003, 4.60946, -9.86923 ) | |||
| [node name="CoinSpawn6" type="Spatial" parent="Coins"] | |||
| [node name="CoinSpawn6" type="Spatial" parent="Spawners/Coins"] | |||
| [node name="Enemy Spawner" type="Spatial" parent="."] | |||
| [node name="Kiley" type="Spatial" parent="Spawners"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 3.42834, 0, 8.41565 ) | |||
| script = ExtResource( 1 ) | |||
| character_data = ExtResource( 12 ) | |||
| [node name="Player Spawner" type="Spatial" parent="."] | |||
| [node name="Player" type="Spatial" parent="Spawners"] | |||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.218717, 0, -1.84536 ) | |||
| script = ExtResource( 1 ) | |||
| character_data = ExtResource( 6 ) | |||
| spawn_on_ready = true | |||
| [node name="TriggerArea" type="Area" parent="."] | |||
| [node name="Triggers" type="Spatial" parent="."] | |||
| [node name="Event1" type="Area" parent="Triggers"] | |||
| transform = Transform( 0.575895, 0, 0, 0, 0.575895, 0, 0, 0, 0.575895, 10.1852, 5.06822, 17.449 ) | |||
| script = ExtResource( 11 ) | |||
| yarnScript = ExtResource( 4 ) | |||
| [node name="CollisionShape" type="CollisionShape" parent="TriggerArea"] | |||
| [node name="CollisionShape" type="CollisionShape" parent="Triggers/Event1"] | |||
| shape = SubResource( 15 ) | |||
| [node name="YarnRunnerNode" type="Node" parent="TriggerArea"] | |||
| script = ExtResource( 2 ) | |||
| yarnScript = ExtResource( 4 ) | |||
| [connection signal="all_coins_picked_up" from="Coins" to="." method="_on_Coins_all_coins_picked_up"] | |||
| [connection signal="body_entered" from="TriggerArea" to="TriggerArea" method="_on_TriggerArea_body_entered"] | |||
| @@ -1,8 +1,6 @@ | |||
| [gd_scene load_steps=8 format=2] | |||
| [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] | |||
| [ext_resource path="res://jrpg/scenes/ui/SpeechPanel.tscn" type="PackedScene" id=6] | |||
| @@ -15,10 +13,6 @@ scenes = { | |||
| "TestLVL": ExtResource( 4 ) | |||
| } | |||
| [node name="YarnRunnerNode" type="Node" parent="."] | |||
| script = ExtResource( 1 ) | |||
| yarnScript = ExtResource( 3 ) | |||
| [node name="SceneContainer" type="Node" parent="."] | |||
| [node name="CanvasLayer" type="CanvasLayer" parent="."] | |||
| @@ -2,27 +2,9 @@ extends BasisInteraction | |||
| class_name TalkInteraction | |||
| var is_talking = false | |||
| signal trigger_script | |||
| export var yarnScript : Resource | |||
| var yarnRunner := YarnRunner.new() | |||
| func _ready(): | |||
| yarnRunner.add_command("SpawnCoins", funcref($"../../../Coins", "spawn_coins")) | |||
| var yarn_script : Resource | |||
| func on_interact(): | |||
| if not is_talking: | |||
| yarnRunner.say_func = funcref(Controller.speech_panel.text, "on_new_line") | |||
| yarnRunner.choices_func = funcref(Controller.speech_panel.choices, "on_choices") | |||
| yarnRunner.yarnScript = self.yarnScript | |||
| is_talking = true | |||
| Controller.speech_panel.show() | |||
| Controller.player_input_enabled = false | |||
| yield(yarnRunner.run_all(), "completed") | |||
| Controller.player_input_enabled = true | |||
| Controller.speech_panel.hide() | |||
| is_talking = false | |||
| emit_signal("trigger_script", yarn_script) | |||
| @@ -2,7 +2,9 @@ extends Node | |||
| class_name BaseLevel | |||
| signal end | |||
| signal request_new_scene | |||
| onready var yarnRunner := YarnRunner.new() | |||
| func _enter_tree(): | |||
| Controller.player_input_enabled = true | |||
| @@ -0,0 +1,11 @@ | |||
| extends BaseLevel | |||
| func _input(event): | |||
| if event.is_action_pressed("ui_accept") or event.is_action_pressed("ui_cancel"): | |||
| on_interaction() | |||
| func _on_Button_pressed(): | |||
| on_interaction() | |||
| func on_interaction(): | |||
| emit_signal("request_new_scene", "TestLVL") | |||
| @@ -1,15 +1,12 @@ | |||
| extends Node | |||
| extends Area | |||
| var prout := false | |||
| signal trigger_script | |||
| func _ready(): | |||
| $YarnRunnerNode.yarnRunner.add_command("Spawn", funcref(self, "spawn")) | |||
| func _on_TriggerArea_body_entered(body): | |||
| if not prout: | |||
| $YarnRunnerNode.start_script() | |||
| prout = true | |||
| export var yarnScript : Resource | |||
| func enable(): | |||
| self.connect("body_entered", self, "_on_TriggerArea_body_entered") | |||
| func spawn(entity): | |||
| yield(get_tree(), "idle_frame") | |||
| $"../Enemy Spawner".spawn($"../Enemy Spawner".character_data) | |||
| func _on_TriggerArea_body_entered(body): | |||
| print("triggered") | |||
| emit_signal("trigger_script", yarnScript) | |||
| @@ -1,18 +1,16 @@ | |||
| extends Node | |||
| export var character_data : Resource | |||
| export var spawn_on_ready := false | |||
| func _ready(): | |||
| if spawn_on_ready: | |||
| spawn(character_data) | |||
| var interaction_component : BasisInteraction | |||
| func spawn(entity): | |||
| func spawn(level): | |||
| var inst = character_data.scene.instance() | |||
| inst.name = character_data.name | |||
| if character_data.yarn != null: | |||
| var yarn_runner := TalkInteraction.new() | |||
| yarn_runner.name = character_data.yarn.resource_name | |||
| yarn_runner.yarnScript = character_data.yarn | |||
| inst.add_child(yarn_runner) | |||
| interaction_component = TalkInteraction.new() | |||
| interaction_component.name = character_data.yarn.resource_name | |||
| interaction_component.yarn_script = character_data.yarn | |||
| interaction_component.connect("trigger_script", level, "trigger_script") | |||
| inst.add_child(interaction_component) | |||
| add_child(inst) | |||
| @@ -4,28 +4,21 @@ signal all_coins_picked_up | |||
| export var coin_scene : PackedScene | |||
| var prout := false | |||
| export var spawn_on_ready := false | |||
| export var all_coins_picked_up_script : Resource | |||
| var coins := -1 | |||
| func _ready(): | |||
| if spawn_on_ready: | |||
| spawn_coins(null) | |||
| func spawn_coins(args): | |||
| yield(get_tree(), "idle_frame") | |||
| if not prout: | |||
| func spawn(level): | |||
| if coins < 0: # not spawned yet | |||
| coins = 0 | |||
| for spawn in get_children(): | |||
| var coin = coin_scene.instance() | |||
| coin.connect("picked_up", self, "on_coin_picked_up") | |||
| coins += 1 | |||
| spawn.add_child(coin) | |||
| prout = true | |||
| connect("all_coins_picked_up", level, "trigger_script") | |||
| func on_coin_picked_up(): | |||
| coins -= 1 | |||
| if coins == 0: | |||
| emit_signal("all_coins_picked_up") | |||
| emit_signal("all_coins_picked_up", all_coins_picked_up_script) | |||
| @@ -1,6 +1,6 @@ | |||
| extends Node | |||
| var speech_panel | |||
| var speech_panel : SpeechPanel | |||
| var player_infos := PlayerInfos.new() | |||
| @@ -2,5 +2,66 @@ extends BaseLevel | |||
| class_name TestLevel | |||
| func _on_Coins_all_coins_picked_up(): | |||
| emit_signal("end") | |||
| export var init_yarn_script : Resource | |||
| func _ready(): | |||
| yarnRunner.add_command("Spawn", funcref(self, "spawn")) | |||
| yarnRunner.add_command("EnableTrigger", funcref(self, "enable_trigger")) | |||
| yarnRunner.add_command("Scene", funcref(self, "scene")) | |||
| for trigger in $Triggers.get_children(): | |||
| trigger.connect("trigger_script", self, "trigger_script") | |||
| trigger_script(init_yarn_script) | |||
| func spawn(args): | |||
| yield(get_tree(), "idle_frame") | |||
| if args.size() < 1: | |||
| printerr("Spawn command take at least one parameter for target") | |||
| return | |||
| var spawner = get_node("Spawners/" + args[0]) | |||
| if spawner != null and spawner.has_method("spawn"): | |||
| spawner.spawn(self) | |||
| else: | |||
| print("spawner " + args[0] + " not found or not compatible") | |||
| func enable_trigger(args): | |||
| yield(get_tree(), "idle_frame") | |||
| if args.size() < 1: | |||
| printerr("EnableTrigger command take at least one parameter for target") | |||
| return | |||
| var trigger = get_node("Triggers/" + args[0]) | |||
| if trigger != null and trigger.has_method("enable"): | |||
| trigger.enable() | |||
| print("trigger " + args[0] + " enabled") | |||
| else: | |||
| print("trigger " + args[0] + " not found or not compatible") | |||
| func trigger_script(yarn_script): | |||
| print("script triggered") | |||
| yarnRunner.say_func = funcref(Controller.speech_panel.text, "on_new_line") | |||
| yarnRunner.choices_func = funcref(Controller.speech_panel.choices, "on_choices") | |||
| Controller.speech_panel.show() | |||
| Controller.player_input_enabled = false | |||
| yarnRunner.yarnScript = yarn_script | |||
| yield(yarnRunner.run_all(), "completed") | |||
| Controller.speech_panel.hide() | |||
| Controller.player_input_enabled = true | |||
| func scene(args): | |||
| yield(get_tree(), "idle_frame") | |||
| if args.size() < 1: | |||
| printerr("Scene command take at least one parameter for target") | |||
| return | |||
| print("Request new scene : " + args[0]) | |||
| emit_signal("request_new_scene", args[0]) | |||
| @@ -5,31 +5,25 @@ 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") | |||
| load_scene("TestLVL") | |||
| func load_scene(args): | |||
| func load_scene(scene_key): | |||
| 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() | |||
| scene.connect("end", self, "on_scene_end") | |||
| $SceneContainer.add_child(scene) | |||
| if scene_key == "TestGameOver": | |||
| $CanvasLayer/UI.hide() | |||
| else: | |||
| $CanvasLayer/UI.show() | |||
| print(scene_key) | |||
| if scenes.has(scene_key): | |||
| for child in $SceneContainer.get_children(): | |||
| child.queue_free() | |||
| var scene = scenes[scene_key].instance() | |||
| scene.connect("request_new_scene", self, "load_scene") | |||
| $SceneContainer.add_child(scene) | |||
| if scene_key == "TestGameOver": | |||
| $CanvasLayer/UI.hide() | |||
| else: | |||
| $CanvasLayer/UI.show() | |||
| func wait_signal(args): | |||
| yield(self, "end") | |||
| func on_scene_end(): | |||
| emit_signal("end") | |||
| func _input(event): | |||
| if event.is_action_pressed("ui_cancel"): | |||
| emit_signal("end") | |||
| @@ -1,11 +1,20 @@ | |||
| extends Control | |||
| class_name SpeechPanel | |||
| export var text_path : NodePath | |||
| onready var text := get_node(text_path) | |||
| var text : SpeechText | |||
| export var choices_path : NodePath | |||
| onready var choices := get_node(choices_path) | |||
| var choices : ChoicesBox | |||
| func _enter_tree(): | |||
| Controller.speech_panel = self | |||
| text = get_node(text_path) | |||
| choices = get_node(choices_path) | |||
| func _ready(): | |||
| Controller.speech_panel = self | |||
| text = get_node(text_path) | |||
| choices = get_node(choices_path) | |||
| hide() | |||
| @@ -0,0 +1,8 @@ | |||
| title: Start | |||
| tags: | |||
| colorID: 0 | |||
| position: 693,546 | |||
| --- | |||
| All coins picked up!! | |||
| <<Scene TestGameOver>> | |||
| === | |||
| @@ -4,6 +4,6 @@ colorID: 0 | |||
| position: 693,546 | |||
| --- | |||
| Un personnage apparaît ! | |||
| <<Spawn enemy_base>> | |||
| <<Spawn Kiley>> | |||
| Un personnage est apparu ! | |||
| === | |||
| @@ -1,40 +0,0 @@ | |||
| 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>> | |||
| === | |||
| @@ -15,7 +15,7 @@ position: 1032,730 | |||
| 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 ?? | |||
| <<SpawnCoins>> | |||
| <<Spawn Coins>> | |||
| Alors ramasse les piépièces ! | |||
| === | |||
| title: ntm | |||
| @@ -0,0 +1,9 @@ | |||
| title: Start | |||
| tags: | |||
| colorID: 0 | |||
| position: 693,546 | |||
| --- | |||
| <<Spawn Player>> | |||
| Let's Start ! | |||
| <<EnableTrigger Event1>> | |||
| === | |||
| @@ -39,6 +39,11 @@ _global_script_classes=[ { | |||
| "language": "GDScript", | |||
| "path": "res://jrpg/scripts/entities/model/player_infos.gd" | |||
| }, { | |||
| "base": "Control", | |||
| "class": "SpeechPanel", | |||
| "language": "GDScript", | |||
| "path": "res://jrpg/scripts/ui/speech_panel.gd" | |||
| }, { | |||
| "base": "Label", | |||
| "class": "SpeechText", | |||
| "language": "GDScript", | |||
| @@ -81,6 +86,7 @@ _global_script_class_icons={ | |||
| "ChoicesBox": "", | |||
| "Player": "", | |||
| "PlayerInfos": "", | |||
| "SpeechPanel": "", | |||
| "SpeechText": "", | |||
| "TalkInteraction": "", | |||
| "TestLevel": "", | |||