Advertisement
Guest User

Untitled

a guest
Nov 7th, 2022
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
GDScript 11.87 KB | Help | 0 0
  1. extends KinematicBody2D
  2.  
  3. const PlayerHurtSound = preload("res://PlayerHurtSound.tscn")
  4. const CompositeSprites = preload("res://scenes/CompositeSprites.gd")
  5. const PlayerDetection = preload("res://Enemies/PlayerDetection.tscn")
  6.  
  7. export var ACCELERATION = 500
  8. export var MAX_SPEED = 40
  9. export var BLOCK_SPEED = -50
  10. export var FRICTION = 500
  11.  
  12. enum {
  13.     MOVE,
  14.     ATTACK1,
  15.     ATTACK2,
  16.     ATTACK3,
  17.     BLOCK,
  18.     REST,
  19. }
  20.  
  21. var state = MOVE
  22. var velocity = Vector2.ZERO
  23. var block_vector = Vector2.DOWN
  24. onready var stats = $PlayerStats
  25. var avoid_force: int = 70
  26. var max_steering: float = 0.9
  27. var reached_destination: bool
  28.  
  29. var path: Array = []
  30. var levelNav: Navigation2D = null
  31. var enemy = null
  32. var sp1 : bool
  33. var sp2 : bool
  34. var sp3 : bool
  35. var sp4 : bool
  36. var sp5 : bool
  37.  
  38.  
  39.  
  40. onready var animationPlayer = $AnimationPlayer
  41. onready var animationTree = $AnimationTree
  42. onready var animationState = animationTree.get("parameters/playback")
  43. onready var armoranimationPlayer = $CompositeSprites.armoranimationPlayer
  44. onready var nobleanimationPlayer = $CompositeSprites.nobleanimationPlayer
  45. onready var elvenanimationPlayer = $CompositeSprites.elvenanimationPlayer
  46. onready var flowinganimationPlayer = $CompositeSprites.flowinganimationPlayer
  47. onready var eyeanimationPlayer = $CompositeSprites.eyeanimationPlayer
  48. onready var armoranimationState = $CompositeSprites.armoranimationState
  49. onready var nobleanimationState = $CompositeSprites.nobleanimationState
  50. onready var elvenanimationState = $CompositeSprites.elvenanimationState
  51. onready var flowinganimationState = $CompositeSprites.flowinganimationState
  52. onready var eyeanimationState = $CompositeSprites.eyeanimationState
  53. onready var hurtbox = $Hurtbox
  54. onready var raycasts: Node2D = get_node("Raycasts")
  55.  
  56. var timer = null
  57. var Attacktimer = null
  58. var timer_delay = 2
  59. var Attacktimer_delay = 1
  60. var refPos
  61. var aggroing = null
  62.  
  63. func _physics_process(delta):
  64.     print(stats.health)
  65.     if state == REST && stats.health == stats.max_health :
  66.         state = MOVE
  67.         Attacktimer.start()
  68.         find_enemy()
  69.         generate_path()
  70.         navigate()
  71.     if not is_instance_valid(enemy):
  72.          find_enemy()
  73.     if is_instance_valid(enemy) and levelNav && not reached_destination:
  74.         generate_path()
  75.         velocity += navigate()
  76.     elif not is_instance_valid(Attacktimer):
  77.         Attacktimer = Timer.new()
  78.         Attacktimer.set_one_shot(false)
  79.         Attacktimer.set_wait_time(Attacktimer_delay)
  80.         Attacktimer.connect("timeout", self, "attacker")
  81.         add_child(Attacktimer)
  82.         Attacktimer.start()
  83.        
  84.     var steering: Vector2 = Vector2.ZERO
  85.     velocity += avoid_obstacles()
  86.     steering = steering.clamped(max_steering)
  87.  
  88.     velocity += steering
  89.     velocity = velocity.clamped(MAX_SPEED)
  90.    
  91.     velocity = move_and_slide(velocity)
  92.        
  93.     match state:
  94.         MOVE:
  95.             move_state(delta)
  96.         ATTACK1:
  97.             Attack1()
  98.         ATTACK2:
  99.             Attack2()
  100.         ATTACK3:
  101.             Attack3()
  102.         BLOCK:
  103.             block_state()
  104.         REST:
  105.             rest_state()
  106.            
  107.     rest_controller()
  108. func _ready():
  109.     add_to_group("Player")
  110.     var tree = get_tree()
  111.     if tree.has_group("LevelNav"):
  112.         levelNav = tree.get_nodes_in_group("LevelNav")[0]
  113.     randomize()
  114.     stats.connect("no_health", self, "rest_state")
  115.     animationTree.active = true
  116.     timer = Timer.new()
  117.     timer.set_one_shot(false)
  118.     timer.set_wait_time(timer_delay)
  119.     timer.connect("timeout", self, "on_timeout_complete")
  120.     add_child(timer)
  121.     timer.start()
  122.    
  123. func on_timeout_complete():
  124.     if state == REST:
  125.          stats.health += 1
  126.        
  127. func navigate() -> Vector2:
  128.     if path.size() > 0:
  129.         while path.size() > 0 and global_position.is_equal_approx(path[0]):
  130.             path.pop_front()
  131.             if path.size() <= 0:
  132.                 reached_destination = true
  133.                 print(reached_destination)
  134.                 return Vector2.ZERO
  135.         return global_position.direction_to(path[0]) * MAX_SPEED
  136.     return Vector2.ZERO
  137.    
  138. func generate_path():
  139.     if levelNav != null && is_instance_valid(enemy) != null:
  140.         path = levelNav.get_simple_path(global_position, enemy.global_position, true)
  141.        
  142. func avoid_obstacles() -> Vector2:
  143.     var avoid_vel = Vector2.ZERO
  144.     raycasts.rotation = navigate().angle()
  145.    
  146.     for raycast in raycasts.get_children():
  147.         if raycast.is_colliding():
  148.             var obstacle_dir = (global_position - raycast.get_collision_point()).normalized()
  149.             var obstacle_interest = navigate().normalized().dot((raycast.get_collision_point() - global_position).normalized())
  150.             if obstacle_interest >= 0.5 && raycast.name == "RayCast2D":
  151.                 avoid_vel += obstacle_dir.rotated(deg2rad(90))
  152.             elif obstacle_interest >= 0.5 && raycast.name == "RayCast2D2":
  153.                 avoid_vel += -velocity
  154.             elif obstacle_interest >= 0.5 && raycast.name == "RayCast2D3":
  155.                 avoid_vel += obstacle_dir.rotated(deg2rad(-90))
  156.             elif obstacle_interest >= 0:
  157.                 avoid_vel += obstacle_dir
  158.     return avoid_vel.normalized() * avoid_force
  159.    
  160. func find_enemy():
  161.     enemy = null
  162.     for e in get_tree().get_nodes_in_group("enemies"):
  163.             if not e.is_queued_for_deletion() && e.aggroed == null:
  164.                 enemy = e
  165.                 enemy.aggroed = self
  166.                 reached_destination = false
  167.                 return
  168.                
  169. func attacker():
  170.     var rng = RandomNumberGenerator.new()
  171.     rng.randomize()
  172.     var random_num = rng.randi_range(1, 3)
  173.     if reached_destination && random_num == 1:
  174.         state = ATTACK1
  175.         random_num = rng.randi_range(2, 3)
  176.     elif reached_destination && random_num == 2:
  177.         state = ATTACK2
  178.         random_num = rng.randi_range(1, 3)
  179.     elif reached_destination:
  180.         state = ATTACK3
  181.         random_num = rng.randi_range(1, 2)
  182.        
  183.        
  184. func move_state(delta):
  185.     var input_vector = Vector2.ZERO
  186.     var idle_velocity = 1
  187.     if velocity.length() > idle_velocity:
  188.         input_vector = velocity.normalized()
  189.  
  190.     if input_vector != Vector2.ZERO:
  191.         block_vector = input_vector
  192.         animationTree.set("parameters/Idle/blend_position", input_vector)
  193.         $CompositeSprites.armoranimationTree.set("parameters/Idle/blend_position", input_vector)
  194.         $CompositeSprites.nobleanimationTree.set("parameters/Idle/blend_position", input_vector)
  195.         $CompositeSprites.elvenanimationTree.set("parameters/Idle/blend_position", input_vector)
  196.         $CompositeSprites.flowinganimationTree.set("parameters/Idle/blend_position", input_vector)
  197.         $CompositeSprites.eyeanimationTree.set("parameters/Idle/blend_position", input_vector)
  198.         animationTree.set("parameters/Walk/blend_position", input_vector)
  199.         $CompositeSprites.armoranimationTree.set("parameters/Walk/blend_position", input_vector)
  200.         $CompositeSprites.nobleanimationTree.set("parameters/Walk/blend_position", input_vector)
  201.         $CompositeSprites.elvenanimationTree.set("parameters/Walk/blend_position", input_vector)
  202.         $CompositeSprites.flowinganimationTree.set("parameters/Walk/blend_position", input_vector)
  203.         $CompositeSprites.eyeanimationTree.set("parameters/Walk/blend_position", input_vector)
  204.         animationTree.set("parameters/Attack1/blend_position", input_vector)
  205.         $CompositeSprites.armoranimationTree.set("parameters/Attack1/blend_position", input_vector)
  206.         $CompositeSprites.nobleanimationTree.set("parameters/Attack1/blend_position", input_vector)
  207.         $CompositeSprites.elvenanimationTree.set("parameters/Attack1/blend_position", input_vector)
  208.         $CompositeSprites.flowinganimationTree.set("parameters/Attack1/blend_position", input_vector)
  209.         $CompositeSprites.eyeanimationTree.set("parameters/Attack1/blend_position", input_vector)
  210.         animationTree.set("parameters/Attack2/blend_position", input_vector)
  211.         $CompositeSprites.armoranimationTree.set("parameters/Attack2/blend_position", input_vector)
  212.         $CompositeSprites.nobleanimationTree.set("parameters/Attack2/blend_position", input_vector)
  213.         $CompositeSprites.elvenanimationTree.set("parameters/Attack2/blend_position", input_vector)
  214.         $CompositeSprites.flowinganimationTree.set("parameters/Attack2/blend_position", input_vector)
  215.         $CompositeSprites.eyeanimationTree.set("parameters/Attack2/blend_position", input_vector)
  216.         animationTree.set("parameters/Attack3/blend_position", input_vector)
  217.         $CompositeSprites.armoranimationTree.set("parameters/Attack3/blend_position", input_vector)
  218.         $CompositeSprites.nobleanimationTree.set("parameters/Attack3/blend_position", input_vector)
  219.         $CompositeSprites.elvenanimationTree.set("parameters/Attack3/blend_position", input_vector)
  220.         $CompositeSprites.flowinganimationTree.set("parameters/Attack3/blend_position", input_vector)
  221.         $CompositeSprites.eyeanimationTree.set("parameters/Attack3/blend_position", input_vector)
  222.         animationTree.set("parameters/Block/blend_position", input_vector)
  223.         $CompositeSprites.armoranimationTree.set("parameters/Block/blend_position", input_vector)
  224.         $CompositeSprites.nobleanimationTree.set("parameters/Block/blend_position", input_vector)
  225.         $CompositeSprites.elvenanimationTree.set("parameters/Block/blend_position", input_vector)
  226.         $CompositeSprites.flowinganimationTree.set("parameters/Block/blend_position", input_vector)
  227.         $CompositeSprites.eyeanimationTree.set("parameters/Block/blend_position", input_vector)
  228.         animationTree.set("parameters/Rest/blend_position", input_vector)
  229.         $CompositeSprites.armoranimationTree.set("parameters/Rest/blend_position", input_vector)
  230.         $CompositeSprites.nobleanimationTree.set("parameters/Rest/blend_position", input_vector)
  231.         $CompositeSprites.elvenanimationTree.set("parameters/Rest/blend_position", input_vector)
  232.         $CompositeSprites.flowinganimationTree.set("parameters/Rest/blend_position", input_vector)
  233.        
  234.         animationState.travel("Walk")
  235.         armoranimationState.travel("Walk")
  236.         nobleanimationState.travel("Walk")
  237.         elvenanimationState.travel("Walk")
  238.         flowinganimationState.travel("Walk")
  239.         eyeanimationState.travel("Walk")
  240.         velocity = velocity.move_toward(input_vector * MAX_SPEED, ACCELERATION * delta)
  241.     else:
  242.          animationState.travel("Idle")
  243.          armoranimationState.travel("Idle")
  244.          nobleanimationState.travel("Idle")
  245.          elvenanimationState.travel("Idle")
  246.          flowinganimationState.travel("Idle")
  247.          eyeanimationState.travel("Idle")
  248.          velocity = velocity.move_toward(Vector2.ZERO, FRICTION * delta)
  249.    
  250.     move()
  251.    
  252. func rest_controller():
  253.     if stats.health <= 0:
  254.         velocity = Vector2.ZERO
  255.         state = REST
  256.         Attacktimer.stop()
  257.     elif state == REST:
  258.         Attacktimer.stop()
  259.     elif get_tree().get_nodes_in_group("enemies").size() == get_tree().get_nodes_in_group("dead_enemies").size():
  260.         state = REST
  261.         Attacktimer.stop()
  262.        
  263.  
  264. func block_state():
  265.     velocity = block_vector * BLOCK_SPEED
  266.     animationState.travel("Block")
  267.     armoranimationState.travel("Block")
  268.     nobleanimationState.travel("Block")
  269.     elvenanimationState.travel("Block")
  270.     flowinganimationState.travel("Block")
  271.     eyeanimationState.travel("Block")
  272.     move()
  273.  
  274. func Attack1():
  275.     velocity = Vector2.ZERO
  276.     animationState.travel("Attack1")
  277.     armoranimationState.travel("Attack1")
  278.     nobleanimationState.travel("Attack1")
  279.     elvenanimationState.travel("Attack1")
  280.     flowinganimationState.travel("Attack1")
  281.     eyeanimationState.travel("Attack1")
  282. func Attack2():
  283.     velocity = Vector2.ZERO
  284.     animationState.travel("Attack2")
  285.     armoranimationState.travel("Attack2")
  286.     nobleanimationState.travel("Attack2")
  287.     elvenanimationState.travel("Attack2")
  288.     flowinganimationState.travel("Attack2")
  289.     eyeanimationState.travel("Attack2")
  290. func Attack3():
  291.     velocity = Vector2.ZERO
  292.     animationState.travel("Attack3")
  293.     armoranimationState.travel("Attack3")
  294.     nobleanimationState.travel("Attack3")
  295.     elvenanimationState.travel("Attack3")
  296.     flowinganimationState.travel("Attack3")
  297.     eyeanimationState.travel("Attack3")
  298.    
  299. func rest_state():
  300.     velocity = Vector2.ZERO
  301.     animationState.travel("Rest")
  302.     armoranimationState.travel("Rest")
  303.     nobleanimationState.travel("Rest")
  304.     elvenanimationState.travel("Rest")
  305.     flowinganimationState.travel("Rest")
  306.     $CompositeSprites/Eye.hide()
  307.     hurtbox.collisionShape.set_deferred("disabled", true)
  308.    
  309. func move():
  310.     velocity = move_and_slide(velocity)
  311.    
  312. func block_animation_finished():
  313.     state = MOVE
  314.  
  315. func attack_animation_finished():
  316.     state = MOVE
  317.  
  318. func _on_Hurtbox_area_entered(area):
  319.     stats.health -= area.damage
  320.     hurtbox.start_invincibility(0.6)
  321.     hurtbox.create_hit_effect()
  322.     var playerHurtSound = PlayerHurtSound.instance()
  323.     get_tree().current_scene.add_child(playerHurtSound)
  324.    
  325.  
Tags: Gdscript
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement