spawner.gd 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. extends Node
  2. var enemy = preload('res://Enemy.tscn')
  3. export var wave_num = 10
  4. export var spawn_speed = 10
  5. export var limit = 1024
  6. var dict = {
  7. "arraypos":[],
  8. "arrayvida":[],
  9. "arraytype":[],
  10. "arraytarget":[],
  11. "arraymotion":[],
  12. "arraydirtime":[],
  13. 'attacker':[],
  14. }
  15. var collisions = []
  16. var areas = preload('res://Enemy2.tscn')
  17. func _ready():
  18. yield(get_tree().create_timer(1.0),"timeout")
  19. while true:
  20. if dict.arraypos.size() < limit:
  21. for x in clamp(limit-dict.arraypos.size(),0,wave_num):
  22. var rot = rand_range(-PI,PI)
  23. var pos = (Vector2(sin(rot), cos(rot)) * 400) + Vector2(320,180)
  24. var vida = 100
  25. var array = get_node('../players').get_children()
  26. array.shuffle()
  27. if array.size() > 0:
  28. dict.arraytarget.append(array[0])
  29. dict.arraypos.append(pos)
  30. dict.arrayvida.append(vida)
  31. dict.arraytype.append('goblin')
  32. dict.attacker.append('')
  33. dict.arraymotion.append(Vector2.ZERO)
  34. dict.arraydirtime.append(int(rand_range(60,120)))
  35. print('there is a total of: ' + str(dict.arraypos.size()) +' enemmies')
  36. yield(get_tree().create_timer(spawn_speed),"timeout")
  37. var motion = Vector2()
  38. var speed = 2.3
  39. var tick = 0
  40. export var tickrate = 4
  41. var blockmapenemy = {}
  42. func _physics_process(delta):
  43. #setting tickrate, to reduce executions per second
  44. tick += 1
  45. if fmod(tick,tickrate) == 0:
  46. #dict of aprox positions of players
  47. var blockmap = {}
  48. if get_node('../players').get_child_count() == 0: return
  49. for z in get_node('../players').get_children():
  50. var x = int(z.global_position.x/20)
  51. var y = int(z.global_position.y/20)
  52. blockmap[Vector2(x,y)] = z
  53. #yes this abomination controls the enemies, ECS code looks ugly as fuck in this engine
  54. for i in dict.arraypos.size():
  55. # death checking
  56. if dict.arrayvida[i] > 0:
  57. #picking new targets if the last one is invalid
  58. if dict.arraytarget[i] == null:
  59. if get_node('../players').get_child_count() == 0: return
  60. var array = get_node('../players').get_children()
  61. array.shuffle()
  62. if array.size() > 0:
  63. dict.arraytarget[i] = array[0]
  64. #exclusive movmenet code
  65. if fmod(tick, dict.arraydirtime[i]) == 0:
  66. dict.arraymotion[i] = (dict.arraytarget[i].global_position - dict.arraypos[i]).normalized() * speed
  67. dict.arraypos[i] += dict.arraymotion[i]
  68. # enemy attak on players
  69. var x = int(dict.arraypos[i].x/20)
  70. var y = int(dict.arraypos[i].y/20)
  71. if blockmap.has(Vector2(x,y)):
  72. blockmap[Vector2(x,y)].damage( -0.5, '')
  73. #hitboxes
  74. var x2 = int( (dict.arraypos[i].x-50) /100)
  75. var y2 = int( (dict.arraypos[i].y-50) /100)
  76. if blockmapenemy.has(Vector2(x2,y2)):
  77. blockmapenemy[Vector2(x2,y2)].append(i)
  78. else:
  79. blockmapenemy[Vector2(x2,y2)] = [i]
  80. #died
  81. else:
  82. var rot = rand_range(-PI,PI)
  83. dict.arraypos[i] = (Vector2(sin(rot), cos(rot)) * 400) + Vector2(320,180)
  84. dict.arrayvida[i] = 100
  85. death_count(dict.attacker[i])
  86. func damage_detection(arg,dmg, attacker):
  87. var x = int((arg.x-50)/100)
  88. var y = int((arg.y-50)/100)
  89. if blockmapenemy.has(Vector2(x,y)):
  90. for i in blockmapenemy[Vector2(x,y)]:
  91. dict.arrayvida[i] -= dmg
  92. if dict.arrayvida[i] <= 0:
  93. dict.attacker[i] = attacker
  94. var counter = 0
  95. var score = {}
  96. func death_count(id):
  97. if score.has(id):
  98. score[id] += 1
  99. else:
  100. score[id] = 1
  101. get_parent().kill_update(score[id],id)