diff --git a/source/assets/scripts/ts_bot_handlers/ts_bot_handlergd.gd b/source/assets/scripts/ts_bot_handlers/ts_bot_handlergd.gd
new file mode 100644
index 0000000..9169c42
--- /dev/null
+++ b/source/assets/scripts/ts_bot_handlers/ts_bot_handlergd.gd
@@ -0,0 +1,87 @@
+extends KinematicBody2D
+
+const GRAVITY = 5
+
+var liftSpeed = 0
+var accelerationSpeed = 2
+var deccelerationSpeed = 20
+var maxSpeed = 250
+
+var worldSpace2d = null
+var coreRay = {}
+
+var desiredLocation = Vector2(0,0)
+var movementVector = Vector2(0,0)
+var weightVector = Vector2(0,0)
+var interactionRays = []
+var degreeTracker
+
+var startVector = Vector2(0,5)
+var startPosition = Vector2(0,5)
+var maxRay = 65
+var interactionRay = null
+
+var degreeStep = 60
+var fireRate = 12
+var time = 0
+var rotationAmount = 0
+var rand_generate = RandomNumberGenerator.new()
+
+var timer = 15
+
+export(int, "Passive", "Friendly", "Agressive") var Mode
+
+func _ready():
+ desiredLocation = position
+ startVector += global_position
+ pass
+
+func _physics_process(delta):
+ time += delta
+ timer += delta
+ rand_generate.randomize()
+ get_interaction()
+ if interactionRays[0]["interacted"]:
+ if liftSpeed > 0: liftSpeed = move_toward(liftSpeed, 0, deccelerationSpeed)
+ elif position.y - desiredLocation.y > 1:
+ liftSpeed -= accelerationSpeed
+ elif position.y - desiredLocation.y < -1:
+ liftSpeed += GRAVITY
+ for ray in interactionRays:
+ if ray["interacted"]:
+ liftSpeed += -ray["end"].normalized().y * maxSpeed
+ liftSpeed = clamp(liftSpeed, -maxSpeed, maxSpeed)
+ move_and_slide(Vector2(0,liftSpeed))
+ if Mode == 0:
+ $ts_bot_sprite.play("passive_idle")
+ $TsBotSpriteWeaponOn.hide()
+ $TsBotSpriteWeaponOff.hide()
+ elif Mode == 1:
+ $ts_bot_sprite.play("friendly_idle")
+ $TsBotSpriteWeaponOn.hide()
+ $TsBotSpriteWeaponOff.show()
+ elif Mode == 2:
+ if fireRate < 20: fireRate = 5*fireRate
+ $ts_bot_sprite.play("agressive_idle")
+ $TsBotSpriteWeaponOn.show()
+ $TsBotSpriteWeaponOff.hide()
+ if time > 60 / fireRate and Mode >= 1:
+ rotationAmount = rand_generate.randi_range(1,36)
+ $TsBotSpriteWeaponOff.rotation = 360/rotationAmount
+ $TsBotSpriteWeaponOn.rotation = 360/rotationAmount
+ time = 0
+
+func get_interaction():
+ degreeTracker = 0
+ interactionRays = []
+ worldSpace2d = get_world_2d().direct_space_state
+ while degreeTracker < 360 + degreeStep:
+ interactionRay = worldSpace2d.intersect_ray(startVector, Vector2(0,maxRay).rotated(deg2rad(degreeTracker)) + global_position, [self])
+ var interacted = false
+ if "position" in interactionRay and interactionRay["collider"].is_in_group("Player"):
+ interacted = true
+ if timer > 15:
+ Mode += 1
+ timer = 0
+ interactionRays.append({"start": startVector, "end": Vector2(0,maxRay).rotated(deg2rad(degreeTracker)) + global_position, "degrees": degreeTracker,"ray": interactionRay, "interacted": interacted})
+ degreeTracker += degreeStep
diff --git a/source/assets/sprites/character/ts_bot/TS_bot_sprite_agressive.svg b/source/assets/sprites/character/ts_bot/TS_bot_sprite_agressive.svg
new file mode 100644
index 0000000..f2e700e
--- /dev/null
+++ b/source/assets/sprites/character/ts_bot/TS_bot_sprite_agressive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/assets/sprites/character/ts_bot/TS_bot_sprite_friendly.svg b/source/assets/sprites/character/ts_bot/TS_bot_sprite_friendly.svg
new file mode 100644
index 0000000..61521f2
--- /dev/null
+++ b/source/assets/sprites/character/ts_bot/TS_bot_sprite_friendly.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/assets/sprites/character/ts_bot/TS_bot_sprite_passive.svg b/source/assets/sprites/character/ts_bot/TS_bot_sprite_passive.svg
new file mode 100644
index 0000000..be522a9
--- /dev/null
+++ b/source/assets/sprites/character/ts_bot/TS_bot_sprite_passive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/assets/sprites/character/ts_bot/TS_bot_sprite_weapon_off.svg b/source/assets/sprites/character/ts_bot/TS_bot_sprite_weapon_off.svg
new file mode 100644
index 0000000..362016a
--- /dev/null
+++ b/source/assets/sprites/character/ts_bot/TS_bot_sprite_weapon_off.svg
@@ -0,0 +1,39 @@
+
diff --git a/source/assets/sprites/character/ts_bot/TS_bot_sprite_weapon_on.svg b/source/assets/sprites/character/ts_bot/TS_bot_sprite_weapon_on.svg
new file mode 100644
index 0000000..6c582df
--- /dev/null
+++ b/source/assets/sprites/character/ts_bot/TS_bot_sprite_weapon_on.svg
@@ -0,0 +1,39 @@
+
diff --git a/source/entities/grass/grass_node.tscn b/source/entities/grass/grass_node.tscn
index 3f34182..fb162e9 100644
--- a/source/entities/grass/grass_node.tscn
+++ b/source/entities/grass/grass_node.tscn
@@ -49,16 +49,16 @@ animations = [ {
"name": "idle",
"speed": 12.0
}, {
-"frames": [ ExtResource( 38 ), ExtResource( 35 ), ExtResource( 41 ), ExtResource( 37 ), ExtResource( 19 ), ExtResource( 18 ), ExtResource( 40 ) ],
-"loop": false,
-"name": "transition_up",
-"speed": 24.0
-}, {
"frames": [ ExtResource( 30 ), ExtResource( 42 ), ExtResource( 16 ), ExtResource( 29 ), ExtResource( 25 ), ExtResource( 31 ), ExtResource( 21 ), ExtResource( 32 ), ExtResource( 39 ), ExtResource( 20 ), ExtResource( 22 ), ExtResource( 23 ), ExtResource( 33 ) ],
"loop": true,
"name": "idle_down",
"speed": 12.0
}, {
+"frames": [ ExtResource( 38 ), ExtResource( 35 ), ExtResource( 41 ), ExtResource( 37 ), ExtResource( 19 ), ExtResource( 18 ), ExtResource( 40 ) ],
+"loop": false,
+"name": "transition_up",
+"speed": 24.0
+}, {
"frames": [ ExtResource( 17 ), ExtResource( 34 ), ExtResource( 28 ), ExtResource( 26 ), ExtResource( 24 ), ExtResource( 27 ), ExtResource( 36 ) ],
"loop": false,
"name": "transition_down",
@@ -76,7 +76,7 @@ position = Vector2( -3.36365, 0 )
scale = Vector2( 0.75, 0.75 )
frames = SubResource( 1 )
animation = "idle"
-frame = 7
+frame = 12
playing = true
[node name="trinity_site_level_layout-level_design_z-index_0_grass_type-2" type="Sprite" parent="."]
diff --git a/source/entities/player/player_node.tscn b/source/entities/player/player_node.tscn
index a5dd498..8f952e2 100644
--- a/source/entities/player/player_node.tscn
+++ b/source/entities/player/player_node.tscn
@@ -171,7 +171,7 @@
[sub_resource type="SpriteFrames" id=1]
animations = [ {
-"frames": [ ExtResource( 48 ), ExtResource( 4 ), ExtResource( 3 ), ExtResource( 46 ), ExtResource( 47 ), ExtResource( 32 ), ExtResource( 13 ), ExtResource( 40 ), ExtResource( 6 ), ExtResource( 15 ), ExtResource( 22 ), ExtResource( 14 ), ExtResource( 9 ), ExtResource( 37 ), ExtResource( 23 ), ExtResource( 39 ), ExtResource( 20 ), ExtResource( 18 ), ExtResource( 7 ), ExtResource( 34 ) ],
+"frames": [ ExtResource( 99 ), ExtResource( 83 ), ExtResource( 109 ), ExtResource( 111 ), ExtResource( 101 ), ExtResource( 96 ), ExtResource( 79 ), ExtResource( 132 ), ExtResource( 119 ), ExtResource( 80 ), ExtResource( 85 ), ExtResource( 86 ), ExtResource( 87 ), ExtResource( 106 ), ExtResource( 121 ), ExtResource( 129 ), ExtResource( 100 ), ExtResource( 108 ), ExtResource( 110 ), ExtResource( 120 ) ],
"loop": true,
"name": "move-speed-left-01",
"speed": 35.0
@@ -198,7 +198,7 @@ animations = [ {
}, {
"frames": [ ExtResource( 99 ), ExtResource( 83 ), ExtResource( 109 ), ExtResource( 111 ), ExtResource( 101 ), ExtResource( 96 ), ExtResource( 79 ), ExtResource( 132 ), ExtResource( 119 ), ExtResource( 80 ), ExtResource( 85 ), ExtResource( 86 ), ExtResource( 87 ), ExtResource( 106 ), ExtResource( 121 ), ExtResource( 129 ), ExtResource( 100 ), ExtResource( 108 ), ExtResource( 110 ), ExtResource( 120 ) ],
"loop": true,
-"name": "idle-speed-right-04",
+"name": "idle-speed-left-01",
"speed": 25.0
}, {
"frames": [ ExtResource( 99 ), ExtResource( 83 ), ExtResource( 109 ), ExtResource( 111 ), ExtResource( 101 ), ExtResource( 96 ), ExtResource( 79 ), ExtResource( 132 ), ExtResource( 119 ), ExtResource( 80 ), ExtResource( 85 ), ExtResource( 86 ), ExtResource( 87 ), ExtResource( 106 ), ExtResource( 121 ), ExtResource( 129 ), ExtResource( 100 ), ExtResource( 108 ), ExtResource( 110 ), ExtResource( 120 ) ],
@@ -250,6 +250,26 @@ animations = [ {
"loop": true,
"name": "move-speed-left-03",
"speed": 35.0
+}, {
+"frames": [ ExtResource( 48 ), ExtResource( 4 ), ExtResource( 3 ), ExtResource( 46 ), ExtResource( 47 ), ExtResource( 32 ), ExtResource( 13 ), ExtResource( 40 ), ExtResource( 6 ), ExtResource( 15 ), ExtResource( 22 ), ExtResource( 14 ), ExtResource( 9 ), ExtResource( 37 ), ExtResource( 23 ), ExtResource( 39 ), ExtResource( 20 ), ExtResource( 18 ), ExtResource( 7 ), ExtResource( 34 ) ],
+"loop": true,
+"name": "boost-speed-left-01",
+"speed": 50.0
+}, {
+"frames": [ ExtResource( 114 ), ExtResource( 128 ), ExtResource( 93 ), ExtResource( 107 ), ExtResource( 117 ), ExtResource( 102 ), ExtResource( 81 ), ExtResource( 118 ), ExtResource( 76 ), ExtResource( 115 ), ExtResource( 127 ), ExtResource( 123 ), ExtResource( 113 ), ExtResource( 77 ), ExtResource( 78 ), ExtResource( 124 ), ExtResource( 94 ), ExtResource( 112 ), ExtResource( 131 ), ExtResource( 95 ) ],
+"loop": true,
+"name": "move-speed-right-03",
+"speed": 35.0
+}, {
+"frames": [ ExtResource( 73 ), ExtResource( 57 ), ExtResource( 65 ), ExtResource( 64 ), ExtResource( 54 ), ExtResource( 71 ), ExtResource( 58 ), ExtResource( 66 ), ExtResource( 62 ), ExtResource( 59 ), ExtResource( 56 ), ExtResource( 60 ), ExtResource( 63 ), ExtResource( 50 ), ExtResource( 61 ), ExtResource( 67 ), ExtResource( 72 ), ExtResource( 51 ), ExtResource( 68 ), ExtResource( 69 ) ],
+"loop": true,
+"name": "move-speed-left-02",
+"speed": 35.0
+}, {
+"frames": [ ExtResource( 162 ), ExtResource( 135 ), ExtResource( 146 ), ExtResource( 141 ), ExtResource( 143 ), ExtResource( 163 ), ExtResource( 149 ), ExtResource( 136 ), ExtResource( 154 ), ExtResource( 137 ), ExtResource( 165 ), ExtResource( 142 ), ExtResource( 139 ), ExtResource( 159 ), ExtResource( 140 ), ExtResource( 155 ), ExtResource( 144 ), ExtResource( 151 ), ExtResource( 153 ), ExtResource( 166 ) ],
+"loop": true,
+"name": "boost-speed-left-04",
+"speed": 50.0
} ]
[sub_resource type="CircleShape2D" id=2]
@@ -301,12 +321,14 @@ animations = [ {
"loop": true,
"name": "02",
"speed": 5.0
+}, {
+"frames": [ ExtResource( 27 ) ],
+"loop": true,
+"name": "01",
+"speed": 5.0
} ]
-[node name="player" type="KinematicBody2D" groups=[
-"Net",
-"Player",
-]]
+[node name="player" type="KinematicBody2D" groups=["Net", "Player"]]
script = ExtResource( 11 )
[node name="trajectories" type="Node2D" parent="."]
diff --git a/source/entities/ts_bot/ts_bot.tscn b/source/entities/ts_bot/ts_bot.tscn
new file mode 100644
index 0000000..9218435
--- /dev/null
+++ b/source/entities/ts_bot/ts_bot.tscn
@@ -0,0 +1,60 @@
+[gd_scene load_steps=10 format=2]
+
+[ext_resource path="res://source/assets/sprites/character/ts_bot/TS_bot_sprite_agressive.svg" type="Texture" id=1]
+[ext_resource path="res://source/assets/scripts/ts_bot_handlers/ts_bot_handlergd.gd" type="Script" id=2]
+[ext_resource path="res://source/assets/sprites/character/ts_bot/TS_bot_sprite_passive.svg" type="Texture" id=3]
+[ext_resource path="res://source/assets/sprites/character/ts_bot/TS_bot_sprite_friendly.svg" type="Texture" id=4]
+[ext_resource path="res://source/assets/sprites/character/ts_bot/TS_bot_sprite_weapon_on.svg" type="Texture" id=5]
+[ext_resource path="res://source/assets/sprites/character/ts_bot/TS_bot_sprite_weapon_off.svg" type="Texture" id=6]
+
+[sub_resource type="CircleShape2D" id=1]
+radius = 30.0
+
+[sub_resource type="CapsuleShape2D" id=2]
+radius = 22.0
+height = 46.0
+
+[sub_resource type="SpriteFrames" id=3]
+animations = [ {
+"frames": [ ExtResource( 1 ) ],
+"loop": true,
+"name": "agressive_idle",
+"speed": 5.0
+}, {
+"frames": [ ExtResource( 4 ) ],
+"loop": true,
+"name": "friendly_idle",
+"speed": 5.0
+}, {
+"frames": [ ExtResource( 3 ) ],
+"loop": true,
+"name": "passive_idle",
+"speed": 5.0
+} ]
+
+[node name="ts_bot" type="KinematicBody2D"]
+script = ExtResource( 2 )
+
+[node name="main_bot_collider" type="CollisionShape2D" parent="."]
+position = Vector2( 0, -8 )
+shape = SubResource( 1 )
+
+[node name="outer_bot_collider" type="CollisionShape2D" parent="."]
+position = Vector2( 0, -8 )
+shape = SubResource( 2 )
+
+[node name="ts_bot_sprite" type="AnimatedSprite" parent="."]
+position = Vector2( 0, 5 )
+scale = Vector2( 0.6, 0.6 )
+frames = SubResource( 3 )
+animation = "passive_idle"
+
+[node name="TsBotSpriteWeaponOff" type="Sprite" parent="."]
+position = Vector2( 0, -8 )
+scale = Vector2( 0.6, 0.6 )
+texture = ExtResource( 6 )
+
+[node name="TsBotSpriteWeaponOn" type="Sprite" parent="."]
+position = Vector2( 0, -8 )
+scale = Vector2( 0.6, 0.6 )
+texture = ExtResource( 5 )
diff --git a/source/levels/trinity_site/trinity_site_level_playground.tscn b/source/levels/trinity_site/trinity_site_level_playground.tscn
index 2daf9ff..ef8e88c 100644
--- a/source/levels/trinity_site/trinity_site_level_playground.tscn
+++ b/source/levels/trinity_site/trinity_site_level_playground.tscn
@@ -3,6 +3,7 @@
[ext_resource path="res://source/assets/scripts/server_handlers/trinity_site_level_playground.gd" type="Script" id=1]
[ext_resource path="res://source/assets/scripts/ui_element_handlers/UI.gd" type="Script" id=2]
[ext_resource path="res://source/levels/trinity_site/images/trinity_site_level_layout_level_design_z_index_0.svg" type="Texture" id=3]
+[ext_resource path="res://source/entities/ts_bot/ts_bot.tscn" type="PackedScene" id=4]
[ext_resource path="res://source/levels/trinity_site/images/trinity_site_level_layout_level_design_z_index_4.svg" type="Texture" id=7]
[ext_resource path="res://source/levels/trinity_site/images/trinity_site_level_layout_level_design_z_index_3.svg" type="Texture" id=8]
[ext_resource path="res://source/entities/grass/grass_node.tscn" type="PackedScene" id=9]
diff --git a/source/scenes/GUI/main_menu.tscn b/source/scenes/GUI/main_menu.tscn
index 308c53f..c298a45 100644
--- a/source/scenes/GUI/main_menu.tscn
+++ b/source/scenes/GUI/main_menu.tscn
@@ -54,8 +54,8 @@ margin_left = -150.0
margin_top = -36.0
margin_right = 150.0
margin_bottom = 36.0
-custom_fonts/font = ExtResource( 5 )
custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_fonts/font = ExtResource( 5 )
text = "PLAY"
align = 1
valign = 1
@@ -79,8 +79,8 @@ margin_left = -98.8223
margin_top = -36.0
margin_right = 134.178
margin_bottom = 36.0
-custom_fonts/font = ExtResource( 5 )
custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_fonts/font = ExtResource( 5 )
text = "LAN Party"
align = 1
valign = 1
@@ -111,8 +111,8 @@ margin_left = -150.0
margin_top = -36.0
margin_right = 150.0
margin_bottom = 36.0
-custom_fonts/font = ExtResource( 5 )
custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_fonts/font = ExtResource( 5 )
text = "EXIT"
align = 1
valign = 1
diff --git a/source/scenes/GUI/network_setup.tscn b/source/scenes/GUI/network_setup.tscn
index e7cc22c..db3131b 100644
--- a/source/scenes/GUI/network_setup.tscn
+++ b/source/scenes/GUI/network_setup.tscn
@@ -21,16 +21,16 @@ use_mipmaps = true
use_filter = true
font_data = ExtResource( 2 )
-[sub_resource type="StyleBoxEmpty" id=2]
-
-[sub_resource type="StyleBoxEmpty" id=3]
-
[sub_resource type="DynamicFont" id=4]
size = 36
use_mipmaps = true
use_filter = true
font_data = ExtResource( 2 )
+[sub_resource type="StyleBoxEmpty" id=2]
+
+[sub_resource type="StyleBoxEmpty" id=3]
+
[sub_resource type="DynamicFont" id=5]
size = 36
use_mipmaps = true
@@ -94,8 +94,8 @@ margin_left = -150.0
margin_top = -36.0
margin_right = 150.0
margin_bottom = 36.0
-custom_fonts/font = ExtResource( 8 )
custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_fonts/font = ExtResource( 8 )
text = "CREATE SERVER"
align = 1
valign = 1
@@ -118,8 +118,8 @@ anchor_bottom = 0.5
margin_left = -233.0
margin_top = -36.0
margin_bottom = 36.0
-custom_fonts/font = ExtResource( 8 )
custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_fonts/font = ExtResource( 8 )
text = "JOIN SERVER"
align = 1
valign = 1
@@ -154,8 +154,8 @@ margin_left = -150.0
margin_top = -36.0
margin_right = 150.0
margin_bottom = 36.0
-custom_fonts/font = ExtResource( 8 )
custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_fonts/font = ExtResource( 8 )
text = "RETURN"
align = 1
valign = 1
@@ -186,8 +186,8 @@ margin_left = -225.0
margin_top = -25.0
margin_right = -225.0
margin_bottom = -25.0
-custom_fonts/font = SubResource( 1 )
custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_fonts/font = SubResource( 1 )
text = "Enter your username"
align = 1
valign = 1
@@ -218,10 +218,10 @@ margin_left = -175.0
margin_top = -28.0
margin_right = 175.0
margin_bottom = 28.0
+custom_colors/selection_color = Color( 0.8, 0.8, 0.8, 1 )
+custom_fonts/font = SubResource( 4 )
custom_styles/focus = SubResource( 2 )
custom_styles/normal = SubResource( 3 )
-custom_fonts/font = SubResource( 4 )
-custom_colors/selection_color = Color( 0.8, 0.8, 0.8, 1 )
align = 1
placeholder_text = "username"
__meta__ = {
@@ -242,8 +242,8 @@ margin_bottom = 97.0
[node name="Label" type="Label" parent="multiplayer_configure/popup_screen/panel/confirm"]
anchor_right = 1.0
anchor_bottom = 1.0
-custom_fonts/font = SubResource( 5 )
custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_fonts/font = SubResource( 5 )
text = "CONFIRM"
align = 1
valign = 1
@@ -304,8 +304,8 @@ margin_left = -74.5
margin_top = -32.0
margin_right = 74.5
margin_bottom = 32.0
-custom_fonts/font = ExtResource( 10 )
custom_colors/font_color = Color( 0, 0, 0, 1 )
+custom_fonts/font = ExtResource( 10 )
text = "START"
align = 1
valign = 1
@@ -324,8 +324,8 @@ margin_left = 621.0
margin_top = 464.0
margin_right = 1259.0
margin_bottom = 576.0
-custom_fonts/font = SubResource( 6 )
custom_colors/font_color = Color( 0.439216, 0.666667, 1, 0.27451 )
+custom_fonts/font = SubResource( 6 )
align = 1
valign = 1
__meta__ = {
@@ -343,8 +343,8 @@ margin_left = 823.5
margin_top = 580.0
margin_right = 1056.5
margin_bottom = 609.0
-custom_fonts/font = SubResource( 7 )
custom_colors/font_color = Color( 0.439216, 0.666667, 1, 0.27451 )
+custom_fonts/font = SubResource( 7 )
text = "WAITING FOR PLAYERS"
align = 1
valign = 1