Navigation for enemies

This commit is contained in:
Marco 2025-01-31 15:05:45 +01:00
commit 076cff208d
7 changed files with 547 additions and 297 deletions

View file

@ -18,11 +18,12 @@ radius = 4.0
[sub_resource type="CircleShape2D" id="CircleShape2D_v711r"]
radius = 85.0529
[node name="Enemy" type="Area2D" node_paths=PackedStringArray("EquippedWeapon") groups=["Destroyable"]]
[node name="Enemy" type="CharacterBody2D" node_paths=PackedStringArray("EquippedWeapon") groups=["Destroyable"]]
collision_layer = 16
collision_mask = 9
script = ExtResource("1_lpwdj")
EquippedWeapon = NodePath("Weapon")
NavigationEnabled = true
metadata/_edit_group_ = true
[node name="Sprite2D" type="Sprite2D" parent="."]
@ -57,7 +58,12 @@ BulletCapacity = 4
BulletSpeed = 50.0
[node name="NavigationAgent2D" type="NavigationAgent2D" parent="."]
target_desired_distance = 64.0
path_max_distance = 800.0
path_postprocessing = 1
debug_enabled = true
debug_path_custom_color = Color(1, 0, 0, 1)
[connection signal="area_entered" from="." to="." method="_on_area_entered"]
[connection signal="area_entered" from="PlayerDetection" to="." method="_on_player_detection_area_entered"]
[connection signal="area_exited" from="PlayerDetection" to="." method="_on_player_detection_area_exited"]
[connection signal="velocity_computed" from="NavigationAgent2D" to="." method="_on_navigation_agent_2d_velocity_computed"]

View file

@ -0,0 +1,75 @@
[gd_scene load_steps=10 format=4 uid="uid://c4yvclwjr2g3s"]
[ext_resource type="TileSet" uid="uid://6k28roiljylj" path="res://Tilesets/factory_tileset.tres" id="1_0ej5m"]
[ext_resource type="Script" path="res://Scripts/TilemapAvoidance.cs" id="2_8fanf"]
[ext_resource type="Texture2D" uid="uid://b4ynnb14mb4uq" path="res://Sprites/Reisen.png" id="2_jwyql"]
[ext_resource type="Script" path="res://Scripts/Actors/NavigationTestEnemy.cs" id="2_ow6o3"]
[sub_resource type="CircleShape2D" id="CircleShape2D_uexe4"]
radius = 6.0
[sub_resource type="AtlasTexture" id="AtlasTexture_dbu6i"]
atlas = ExtResource("2_jwyql")
region = Rect2(0, 0, 8, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_gx747"]
atlas = ExtResource("2_jwyql")
region = Rect2(8, 0, 8, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_yqxl3"]
atlas = ExtResource("2_jwyql")
region = Rect2(16, 0, 8, 16)
[sub_resource type="SpriteFrames" id="SpriteFrames_s36lq"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_dbu6i")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_gx747")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_yqxl3")
}],
"loop": true,
"name": &"default",
"speed": 5.0
}]
[node name="Node2D" type="Node2D"]
[node name="Floor" type="TileMapLayer" parent="." node_paths=PackedStringArray("_solidLayer")]
tile_map_data = PackedByteArray("AAAHAAIAAAAAAAEAAAAHAAMAAAAAAAEAAAAIAAMAAAAAAAEAAAAIAAQAAAAAAAEAAAAIAAUAAAAAAAEAAAAHAAUAAAAAAAEAAAAGAAUAAAAAAAEAAAAFAAQAAAAAAAEAAAAGAAIAAAAAAAEAAAAIAAIAAAACAAMAAAAJAAMAAAAAAAEAAAAJAAQAAAAAAAEAAAAJAAUAAAAGAAEAAAAHAAQAAAAAAAEAAAAKAAMAAAAAAAEAAAAKAAQAAAAAAAEAAAAIAAYAAAAGAAEAAAAHAAYAAAAAAAEAAAAGAAYAAAAAAAEAAAALAAQAAAAAAAEAAAAKAAUAAAAGAAEAAAAGAAQAAAAAAAEAAAAGAAcAAAAAAAMAAAAHAAcAAAAAAAMAAAAIAAcAAAAGAAEAAAAJAAcAAAAGAAEAAAAKAAcAAAAGAAEAAAALAAcAAAAGAAEAAAAMAAcAAAAAAAMAAAALAAUAAAAAAAMAAAAMAAUAAAAAAAMAAAAMAAQAAAAAAAMAAAAMAAMAAAACAAMAAAANAAYAAAAAAAMAAAANAAUAAAAAAAMAAAANAAQAAAAAAAMAAAANAAMAAAAAAAMAAAANAAIAAAAAAAMAAAANAAcAAAAAAAMAAAANAAgAAAACAAMAAAAMAAgAAAACAAMAAAALAAgAAAACAAMAAAAKAAgAAAAGAAEAAAAJAAgAAAAGAAEAAAAIAAgAAAACAAMAAAAHAAgAAAACAAMAAAAGAAgAAAACAAMAAAAGAAkAAAACAAMAAAAHAAkAAAACAAMAAAAHAAoAAAACAAMAAAAIAAoAAAACAAMAAAAIAAkAAAACAAMAAAAJAAkAAAACAAMAAAAKAAkAAAACAAMAAAALAAkAAAACAAMAAAAMAAkAAAACAAMAAAANAAkAAAACAAMAAAAMAAoAAAACAAMAAAALAAoAAAACAAMAAAAKAAoAAAACAAMAAAAJAAoAAAACAAMAAAAGAAoAAAACAAMAAAAJAAsAAAACAAMAAAAKAAsAAAACAAMAAAALAAsAAAACAAMAAAAMAAsAAAACAAMAAAANAAoAAAACAAMAAAADAAgAAAAAAAMAAAAFAAoAAAACAAMAAAAEAAoAAAACAAMAAAADAAoAAAACAAMAAAACAAoAAAAAAAMAAAACAAsAAAACAAMAAAACAAwAAAACAAMAAAACAA0AAAACAAMAAAABAA0AAAACAAMAAAABAA4AAAACAAMAAAAFAAYAAAAAAAMAAAAFAAcAAAAAAAMAAAAFAAgAAAAAAAMAAAAEAAgAAAAAAAMAAAAEAAcAAAAAAAMAAAAEAAYAAAAAAAMAAAAFAAUAAAAAAAMAAAAEAAUAAAAAAAMAAAAEAAQAAAAAAAMAAAAEAAMAAAACAAMAAAAEAAkAAAAAAAMAAAADAAkAAAAAAAMAAAAFAAkAAAAAAAMAAAACAAMAAAAAAAMAAAACAAQAAAAAAAMAAAACAAUAAAAAAAMAAAACAAYAAAAAAAMAAAACAAcAAAAAAAMAAAACAAgAAAAAAAMAAAACAAkAAAAAAAMAAAAEAAsAAAACAAMAAAADAAsAAAACAAMAAAAFAAsAAAACAAMAAAAGAAsAAAACAAMAAAAHAAsAAAACAAMAAAAIAAsAAAACAAMAAAAIAAwAAAACAAMAAAAHAAwAAAACAAMAAAAGAAwAAAACAAMAAAAFAAwAAAACAAMAAAAEAAwAAAACAAMAAAADAAwAAAACAAMAAAAJAAwAAAACAAMAAAAKAAwAAAACAAMAAAALAAwAAAACAAMAAAAMAAwAAAACAAMAAAANAAwAAAACAAMAAAANAA0AAAACAAMAAAAMAA0AAAACAAMAAAALAA4AAAACAAMAAAAKAA4AAAACAAMAAAAJAA4AAAACAAMAAAAIAA4AAAACAAMAAAAHAA4AAAACAAMAAAAGAA4AAAACAAMAAAAFAA4AAAACAAMAAAAEAA4AAAACAAMAAAADAA4AAAACAAMAAAACAA4AAAACAAMAAAADAA0AAAACAAMAAAAEAA0AAAACAAMAAAAFAA0AAAACAAMAAAAGAA0AAAACAAMAAAAHAA0AAAACAAMAAAAIAA0AAAACAAMAAAAJAA0AAAACAAMAAAAKAA0AAAACAAMAAAALAA0AAAACAAMAAAANAAsAAAACAAMAAAAMAAYAAAACAAMAAAALAAYAAAACAAMAAAAKAAYAAAACAAMAAAAJAAYAAAACAAMAAAALAAMAAAACAAMAAAALAAIAAAACAAMAAAAMAAIAAAACAAMAAAAKAAIAAAACAAMAAAAJAAIAAAACAAMAAAAGAAMAAAACAAMAAAAFAAMAAAACAAMAAAAEAAIAAAACAAMAAAAFAAIAAAACAAMAAAADAAIAAAACAAMAAAADAAMAAAACAAMAAAADAAQAAAACAAMAAAADAAUAAAACAAMAAAADAAYAAAACAAMAAAADAAcAAAACAAMAAAABAAcAAAACAAMAAAABAAYAAAACAAMAAAABAAUAAAACAAMAAAAAAAUAAAACAAMAAAAAAAQAAAACAAMAAAAAAAMAAAACAAMAAAAAAAYAAAACAAMAAAABAAQAAAACAAMAAAABAAMAAAACAAMAAAABAAIAAAACAAMAAAABAAEAAAACAAMAAAAAAAAAAAACAAMAAAABAAAAAAACAAMAAAACAAAAAAACAAMAAAADAAAAAAACAAMAAAAEAAAAAAACAAMAAAAFAAAAAAACAAMAAAAGAAAAAAACAAMAAAAHAAAAAAACAAMAAAAIAAAAAAACAAMAAAAJAAAAAAACAAMAAAAKAAAAAAACAAMAAAAJAAEAAAACAAMAAAAIAAEAAAACAAMAAAAHAAEAAAACAAMAAAAGAAEAAAACAAMAAAAFAAEAAAACAAMAAAAEAAEAAAACAAMAAAADAAEAAAACAAMAAAACAAEAAAACAAMAAAACAAIAAAACAAMAAAALAAAAAAACAAMAAAAMAAAAAAACAAMAAAAMAAEAAAACAAMAAAALAAEAAAACAAMAAAAKAAEAAAACAAMAAAANAAEAAAACAAMAAAANAAAAAAACAAMAAAAOAAEAAAACAAMAAAAOAAIAAAACAAMAAAAOAAMAAAACAAMAAAAOAAQAAAACAAMAAAAOAAUAAAACAAMAAAAOAAYAAAACAAMAAAAOAAcAAAACAAMAAAAOAAgAAAACAAMAAAAOAAkAAAACAAMAAAAOAAoAAAACAAMAAAAOAAsAAAACAAMAAAAOAAwAAAACAAMAAAAOAA0AAAACAAMAAAAOAA4AAAACAAMAAAANAA4AAAACAAMAAAAMAA4AAAACAAMAAAAAAA0AAAACAAMAAAAAAAwAAAACAAMAAAAAAAsAAAACAAMAAAAAAAoAAAACAAMAAAABAAwAAAACAAMAAAAAAA4AAAACAAMAAAABAAsAAAACAAMAAAABAAgAAAACAAMAAAAAAAcAAAACAAMAAAAAAAgAAAACAAMAAAAAAAkAAAACAAMAAAABAAoAAAACAAMAAAABAAkAAAACAAMAAAAAAAIAAAACAAMAAAAAAAEAAAACAAMAAAAOAAAAAAACAAMAAAA=")
tile_set = ExtResource("1_0ej5m")
script = ExtResource("2_8fanf")
_solidLayer = NodePath("../Walls")
[node name="Walls" type="TileMapLayer" parent="."]
tile_map_data = PackedByteArray("AAADAAYAAAABAAEAAAADAAcAAAABAAEAAAADAAUAAAABAAEAAAADAAQAAAABAAEAAAADAAMAAAABAAEAAAADAAIAAAABAAEAAAAGAAMAAAABAAEAAAAFAAMAAAABAAEAAAAFAAIAAAABAAEAAAAEAAIAAAABAAEAAAAKAAIAAAABAAEAAAAJAAIAAAABAAEAAAALAAIAAAABAAEAAAAMAAIAAAABAAEAAAALAAMAAAABAAEAAAAJAAYAAAABAAEAAAAKAAYAAAABAAEAAAALAAYAAAABAAEAAAAMAAYAAAABAAEAAAAPAAEAAAABAAEAAAAPAAIAAAABAAEAAAAPAAMAAAABAAEAAAAPAAQAAAABAAEAAAAPAAUAAAABAAEAAAAPAAYAAAABAAEAAAAPAAcAAAABAAEAAAAPAAgAAAABAAEAAAAPAAkAAAABAAEAAAAPAAoAAAABAAEAAAAPAAsAAAABAAEAAAAPAAwAAAABAAEAAAAPAA0AAAABAAEAAAAPAA4AAAABAAEAAAAPAA8AAAABAAEAAAAOAA8AAAABAAEAAAANAA8AAAABAAEAAAAMAA8AAAABAAEAAAALAA8AAAABAAEAAAAKAA8AAAABAAEAAAAJAA8AAAABAAEAAAAIAA8AAAABAAEAAAAHAA8AAAABAAEAAAAGAA8AAAABAAEAAAAFAA8AAAABAAEAAAAEAA8AAAABAAEAAAADAA8AAAABAAEAAAACAA8AAAABAAEAAAABAA8AAAABAAEAAAAAAA8AAAABAAEAAAD//w8AAAABAAEAAAD//w4AAAABAAEAAAD//w0AAAABAAEAAAD//wwAAAABAAEAAAD//wsAAAABAAEAAAD//woAAAABAAEAAAD//wkAAAABAAEAAAD//wgAAAABAAEAAAD//wcAAAABAAEAAAD//wYAAAABAAEAAAD//wUAAAABAAEAAAD+/wUAAAABAAEAAAD+/wQAAAABAAEAAAD+/wMAAAABAAEAAAD+/wIAAAABAAEAAAD//wIAAAABAAEAAAD//wEAAAABAAEAAAD+/wEAAAABAAEAAAD+/wAAAAABAAEAAAAFAP//AAABAAEAAAAGAP//AAABAAEAAAAHAP//AAABAAEAAAAIAP//AAABAAEAAAAJAP//AAABAAEAAAAKAP//AAABAAEAAAALAP//AAABAAEAAAAMAP//AAABAAEAAAANAP//AAABAAEAAAAOAP//AAABAAEAAAAOAAAAAAABAAEAAAAPAAAAAAABAAEAAAD9//7/AAABAAEAAAD+//3/AAABAAEAAAD///3/AAABAAEAAAD///z/AAABAAEAAAAAAPz/AAABAAEAAAABAPz/AAABAAEAAAACAPz/AAABAAEAAAADAPz/AAABAAEAAAAEAPz/AAABAAEAAAAFAPz/AAABAAEAAAAGAPz/AAABAAEAAAAGAP3/AAABAAEAAAAHAP3/AAABAAEAAAAIAP3/AAABAAEAAAAIAP7/AAABAAEAAAAJAP7/AAABAAEAAAD8////AAABAAEAAAD9////AAABAAEAAAD9/wAAAAABAAEAAAAGAAwAAAABAAEAAAAHAAwAAAABAAEAAAAIAAwAAAABAAEAAAAJAAoAAAAEAAUAAAAKAAoAAAAEAAUAAAALAAoAAAAEAAUAAAALAAsAAAAEAAUAAAAMAAsAAAAEAAUAAAAMAAwAAAAEAAUAAAAMAA0AAAAEAAUAAAADAAoAAAAEAAUAAAACAAoAAAAEAAUAAAABAAoAAAAEAAUAAAABAAkAAAAEAAUAAAAAAAkAAAAEAAUAAAAAAAgAAAAEAAUAAAAGAAkAAAAEAAUAAAAHAAkAAAAEAAUAAAAHAAoAAAAEAAUAAAAGAAoAAAAEAAUAAAAGAAUAAAAEAAUAAAAFAAUAAAAEAAUAAAABAP//AAAEAAUAAAACAP//AAAEAAUAAAA=")
tile_set = ExtResource("1_0ej5m")
[node name="Enemy" type="CharacterBody2D" parent="."]
position = Vector2(88, 129)
collision_layer = 16
script = ExtResource("2_ow6o3")
_movementSpeed = 50.0
metadata/_edit_group_ = true
[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Enemy"]
target_desired_distance = 64.0
path_max_distance = 200.0
path_postprocessing = 1
debug_enabled = true
debug_use_custom = true
debug_path_custom_color = Color(1, 0.0235294, 0.0156863, 1)
[node name="CollisionShape2D" type="CollisionShape2D" parent="Enemy"]
shape = SubResource("CircleShape2D_uexe4")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Enemy"]
sprite_frames = SubResource("SpriteFrames_s36lq")
frame = 2
frame_progress = 0.620075
[connection signal="velocity_computed" from="Enemy/NavigationAgent2D" to="Enemy" method="_on_navigation_agent_2d_velocity_computed"]

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,87 @@
using Godot;
using System;
public partial class NavigationTestEnemy : CharacterBody2D
{
[Export]
private float _movementSpeed = 300.0f;
public const float JumpVelocity = -400.0f;
private NavigationAgent2D _navigationAgent;
public override void _Ready()
{
_navigationAgent = GetNode<NavigationAgent2D>("NavigationAgent2D");
}
public override void _PhysicsProcess(double delta)
{
var mousePosition = GetGlobalMousePosition();
_navigationAgent.TargetPosition = mousePosition;
var currentAgentPosition = GlobalPosition;
var nexPathPosition = _navigationAgent.GetNextPathPosition();
var newVelocity = currentAgentPosition.DirectionTo(nexPathPosition) * (_movementSpeed);
// Navigation is over, can do other things
if (_navigationAgent.IsNavigationFinished())
{
return;
}
if (_navigationAgent.AvoidanceEnabled)
{
_navigationAgent.SetVelocity(newVelocity);
}
else
{
_on_navigation_agent_2d_velocity_computed(newVelocity);
}
MoveAndSlide();
}
public void _on_navigation_agent_2d_velocity_computed(Vector2 safeVelocity)
{
this.Velocity = safeVelocity;
}
// public override void _PhysicsProcess(double delta)
// {
// Vector2 velocity = Velocity;
//
// // Add the gravity.
// if (!IsOnFloor())
// {
// velocity += GetGravity() * (float)delta;
// }
//
// // Handle Jump.
// if (Input.IsActionJustPressed("ui_accept") && IsOnFloor())
// {
// velocity.Y = JumpVelocity;
// }
//
// // Get the input direction and handle the movement/deceleration.
// // As good practice, you should replace UI actions with custom gameplay actions.
// Vector2 direction = Input.GetVector("ui_left", "ui_right", "ui_up", "ui_down");
// if (direction != Vector2.Zero)
// {
// velocity.X = direction.X * Speed;
// }
// else
// {
// velocity.X = Mathf.MoveToward(Velocity.X, 0, Speed);
// }
//
// Velocity = velocity;
// MoveAndSlide();
// }
}

View file

@ -3,7 +3,7 @@ using Godot;
using System;
using System.Diagnostics;
public partial class Enemy : Area2D, IDestructible
public partial class Enemy : CharacterBody2D, IDestructible
{
private InteractionController _cachedPlayer;
private EnemyState _currentState = EnemyState.Idle;
@ -61,18 +61,47 @@ public partial class Enemy : Area2D, IDestructible
public override void _PhysicsProcess(double delta)
{
HandlePlayerDetection();
if (NavigationEnabled)
{
var moveLocation = _navigationAgent.GetNextPathPosition();
// Only do these actions if the enemy has been alerted
if (_currentState is EnemyState.Primed)
{
this.Position = moveLocation;
_navigationAgent.SetTargetPosition(_cachedPlayer.GlobalPosition);
var currentAgentPosition = GlobalPosition;
var nextPathPosition = _navigationAgent.GetNextPathPosition();
var newVelocity = currentAgentPosition.DirectionTo(nextPathPosition) * (float)(WalkSpeed * delta);
// Navigation is over, can do other things like shooting
if (_navigationAgent.IsNavigationFinished())
{
// Shoot player
HandlePlayerDetection();
return;
}
if (_navigationAgent.AvoidanceEnabled)
{
_navigationAgent.SetVelocity(newVelocity);
}
else
{
_on_navigation_agent_2d_velocity_computed(newVelocity);
}
MoveAndSlide();
}
}
}
public void _on_navigation_agent_2d_velocity_computed(Vector2 safeVelocity)
{
this.Velocity = safeVelocity;
}
@ -86,10 +115,10 @@ public partial class Enemy : Area2D, IDestructible
if (IsPlayerInSight())
{
// Update player position only if player is in sight
if (NavigationEnabled)
{
_navigationAgent.SetTargetPosition(_cachedPlayer.GlobalPosition);
}
// if (NavigationEnabled)
// {
// _navigationAgent.SetTargetPosition(_cachedPlayer.GlobalPosition);
// }
Shoot();
@ -167,7 +196,7 @@ public partial class Enemy : Area2D, IDestructible
{
}
private void Explode()
{
Debug.WriteLine("Ded");

View file

@ -0,0 +1,34 @@
using Godot;
using System;
public partial class TilemapAvoidance : TileMapLayer
{
[Export] private TileMapLayer _solidLayer;
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
}
public override bool _UseTileDataRuntimeUpdate(Vector2I coords)
{
if (_solidLayer.GetUsedCellsById(0).Contains(coords))
{
return true;
}
return false;
}
public override void _TileDataRuntimeUpdate(Vector2I coords, TileData tileData)
{
tileData.SetNavigationPolygon(0, null);
}
}

View file

@ -0,0 +1,293 @@
[gd_resource type="TileSet" load_steps=24 format=3 uid="uid://6k28roiljylj"]
[ext_resource type="Texture2D" uid="uid://tphqodqyere1" path="res://Tilesets/factory.png" id="1_70kxh"]
[ext_resource type="PackedScene" uid="uid://bj28qiai2x2ar" path="res://Scenes/Props/Barrel.tscn" id="2_cxg4b"]
[ext_resource type="PackedScene" uid="uid://bgk7fgwiis425" path="res://Scenes/Props/Box_Red.tscn" id="3_hrh63"]
[ext_resource type="PackedScene" uid="uid://crph24e6e0v0q" path="res://Scenes/Interactable/Control_Pad.tscn" id="4_brv02"]
[ext_resource type="PackedScene" uid="uid://bqq3q37hugdlj" path="res://Scenes/Door.tscn" id="5_1xipm"]
[ext_resource type="PackedScene" uid="uid://uaf5r6cd71hu" path="res://Scenes/Props/LargeTank.tscn" id="6_p8eu6"]
[ext_resource type="PackedScene" uid="uid://7cpk3c3d8cl7" path="res://Scenes/Props/MediumLiquidTank.tscn" id="7_k6a3n"]
[ext_resource type="PackedScene" uid="uid://crmwuwhltmdq7" path="res://Scenes/Props/MediumTank.tscn" id="8_vuaww"]
[ext_resource type="PackedScene" uid="uid://bnhck5eh0tqxf" path="res://Scenes/Props/MediumTerminal.tscn" id="9_wc4jy"]
[ext_resource type="PackedScene" uid="uid://e80xujqyjoh" path="res://Scenes/Props/Box_Vertical.tscn" id="10_hg2bp"]
[sub_resource type="NavigationPolygon" id="NavigationPolygon_l8pdw"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_lnwgu"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_ml1qs"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_h4p0b"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_t0ujl"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_uanwu"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_6t4b1"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_ajuv4"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_3ass8"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_2t186"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="NavigationPolygon" id="NavigationPolygon_63d1d"]
vertices = PackedVector2Array(8, 8, -8, 8, -8, -8, 8, -8)
polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
outlines = Array[PackedVector2Array]([PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)])
agent_radius = 0.0
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_jwf4b"]
resource_name = "Factory"
texture = ExtResource("1_70kxh")
0:0/0 = 0
1:0/0 = 0
2:0/0 = 0
3:0/0 = 0
3:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
4:0/0 = 0
5:0/0 = 0
6:0/0 = 0
7:0/0 = 0
8:0/0 = 0
9:0/0 = 0
0:1/0 = 0
0:1/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_l8pdw")
1:1/0 = 0
1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:1/0 = 0
3:1/0 = 0
3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
4:1/0 = 0
4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
5:1/0 = 0
5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:1/0 = 0
6:1/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_uanwu")
7:1/0 = 0
8:1/0 = 0
9:1/0 = 0
0:2/0 = 0
1:2/0 = 0
2:2/0 = 0
3:2/0 = 0
4:2/0 = 0
5:2/0 = 0
6:2/0 = 0
6:2/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_6t4b1")
7:2/0 = 0
8:2/0 = 0
9:2/0 = 0
0:3/0 = 0
0:3/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_lnwgu")
1:3/0 = 0
1:3/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_ml1qs")
2:3/0 = 0
2:3/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_h4p0b")
3:3/0 = 0
3:3/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_t0ujl")
4:3/animation_columns = 2
4:3/0 = 0
5:3/0 = 0
7:3/0 = 0
8:3/0 = 0
9:3/0 = 0
0:4/0 = 0
0:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:4/0 = 0
1:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:4/0 = 0
2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:4/0 = 0
3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
4:4/0 = 0
5:4/0 = 0
6:4/0 = 0
7:4/0 = 0
8:4/0 = 0
9:4/0 = 0
0:5/0 = 0
0:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:5/0 = 0
1:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:5/0 = 0
2:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:5/0 = 0
3:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
4:5/0 = 0
4:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
5:5/0 = 0
5:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:5/0 = 0
6:5/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_ajuv4")
7:5/0 = 0
7:5/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_ajuv4")
8:5/0 = 0
8:5/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_ajuv4")
9:5/0 = 0
0:6/0 = 0
0:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:6/0 = 0
1:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:6/0 = 0
2:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:6/0 = 0
3:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
5:6/0 = 0
5:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:6/0 = 0
6:6/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_3ass8")
7:6/0 = 0
8:6/0 = 0
8:6/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_63d1d")
9:6/0 = 0
0:7/0 = 0
0:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:7/0 = 0
1:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:7/0 = 0
2:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:7/0 = 0
3:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
5:7/0 = 0
5:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:7/0 = 0
6:7/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_2t186")
7:7/0 = 0
7:7/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_2t186")
8:7/0 = 0
8:7/0/navigation_layer_0/polygon = SubResource("NavigationPolygon_63d1d")
9:7/0 = 0
0:8/0 = 0
1:8/0 = 0
2:8/0 = 0
3:8/0 = 0
4:8/0 = 0
5:8/0 = 0
6:8/0 = 0
7:8/0 = 0
8:8/0 = 0
9:8/0 = 0
0:9/0 = 0
1:9/0 = 0
2:9/0 = 0
3:9/0 = 0
4:9/0 = 0
5:9/0 = 0
6:9/0 = 0
7:9/0 = 0
8:9/0 = 0
9:9/0 = 0
0:10/0 = 0
1:10/0 = 0
2:10/0 = 0
3:10/0 = 0
4:10/0 = 0
5:10/0 = 0
6:10/0 = 0
7:10/0 = 0
8:10/0 = 0
9:10/0 = 0
0:11/0 = 0
1:11/0 = 0
2:11/0 = 0
3:11/0 = 0
4:11/0 = 0
5:11/0 = 0
6:11/0 = 0
7:11/0 = 0
8:11/0 = 0
9:11/0 = 0
0:12/0 = 0
1:12/0 = 0
2:12/0 = 0
3:12/0 = 0
4:12/0 = 0
5:12/0 = 0
6:12/0 = 0
7:12/0 = 0
8:12/0 = 0
9:12/0 = 0
0:13/0 = 0
1:13/0 = 0
2:13/0 = 0
3:13/0 = 0
4:13/0 = 0
5:13/0 = 0
6:13/0 = 0
7:13/0 = 0
8:13/0 = 0
9:13/0 = 0
0:14/0 = 0
1:14/0 = 0
2:14/0 = 0
3:14/0 = 0
4:14/0 = 0
5:14/0 = 0
6:14/0 = 0
7:14/0 = 0
8:14/0 = 0
9:14/0 = 0
6:3/0 = 0
6:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-4, -6, -4, 0, 4, 0, 4, -6)
[sub_resource type="TileSetScenesCollectionSource" id="TileSetScenesCollectionSource_qg3vu"]
resource_name = "Props"
scenes/1/scene = ExtResource("2_cxg4b")
scenes/2/scene = ExtResource("3_hrh63")
scenes/3/scene = ExtResource("4_brv02")
scenes/4/scene = ExtResource("5_1xipm")
scenes/5/scene = ExtResource("6_p8eu6")
scenes/6/scene = ExtResource("7_k6a3n")
scenes/7/scene = ExtResource("8_vuaww")
scenes/8/scene = ExtResource("9_wc4jy")
scenes/9/scene = ExtResource("10_hg2bp")
[resource]
physics_layer_0/collision_layer = 1
physics_layer_0/collision_mask = 30
physics_layer_1/collision_layer = 32
physics_layer_1/collision_mask = 18
navigation_layer_0/layers = 1
sources/0 = SubResource("TileSetAtlasSource_jwf4b")
sources/1 = SubResource("TileSetScenesCollectionSource_qg3vu")