FuncIt/source/assets/scripts/ts_bot_handlers/ts_bot_handlergd.gd
2021-11-18 19:38:14 +02:00

114 lines
3.3 KiB
GDScript

extends KinematicBody2D
const GRAVITY = 5
var liftSpeed = 0
var accelerationSpeed = 2
var deccelerationSpeed = 20
var maxSpeed = 250
var worldSpace2d = null
var coreRay = {}
var bullet = preload("res://source/entities/ts_bot/Bot_Bullet.tscn")
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
var hp = 50
var activeHitBoost = Vector2(0,0)
export(int, "Passive", "Friendly", "Agressive") var Mode
func _ready():
desiredLocation = position
startVector += global_position
pass
func _physics_process(delta):
Global.set('bot_weapon', self)
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)
# warning-ignore:return_value_discarded
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
shoot_bot()
move_and_slide(activeHitBoost)
activeHitBoost = Vector2(move_toward(activeHitBoost.x, 0, 2), move_toward(activeHitBoost.y, 0, 2))
func get_interaction():
degreeTracker = 0
interactionRays = []
worldSpace2d = get_world_2d().direct_space_state
if time > 5 and Mode == 0: Mode = 1
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
func shoot_bot():
var b = bullet.instance()
get_parent().add_child(b)
b.global_position = self.global_position
b.global_rotation = 360/rotationAmount - 180
func hit_by_damager(damage, b_rotation, b_velocity):
hp -= damage
$HUD/health_bar.value = hp
activeHitBoost = b_velocity.rotated(b_rotation)*250
Mode = 2
if hp <= 0:
queue_free()
get_tree().call_group("bot_listener", "bot_died")