spawner.gd 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. extends Node
  2. var enemy = preload('res://Enemy.tscn')
  3. export var wave_num = 1
  4. export var spawn_speed = 10
  5. export var limit = 32
  6. export var maxlimit = 1024
  7. export var mod = 1.5
  8. export var mod2 = 1.2
  9. var dict = {
  10. "arraypos":[],
  11. "arrayvida":[],
  12. "arraytype":[],
  13. "arraytarget":[],
  14. "arraymotion":[],
  15. "arraydirtime":[],
  16. 'attacker':[],
  17. 'enabled':[],
  18. 'type':[],
  19. }
  20. var collisions = []
  21. var areas = preload('res://Enemy2.tscn')
  22. func _ready():
  23. yield(get_tree().create_timer(1.0),"timeout")
  24. for x in maxlimit:
  25. var rot = rand_range(-PI,PI)
  26. var pos = (Vector2(sin(rot), cos(rot)) * rand_range(400,800)) + Vector2(320,180)
  27. dict.arraytarget.append(null)
  28. dict.arraypos.append(pos)
  29. dict.arrayvida.append(100)
  30. dict.arraytype.append('goblin')
  31. dict.attacker.append('')
  32. dict.arraymotion.append(Vector2.ZERO)
  33. dict.arraydirtime.append(int(rand_range(60,120)))
  34. dict.enabled.append(true)
  35. dict.type.append(randi()%4)
  36. var motion = Vector2()
  37. export var speed = 2.3
  38. var tick = 0
  39. export var tickrate = 4
  40. var blockmapenemy = {}
  41. func _physics_process(delta):
  42. #setting tickrate, to reduce executions per second
  43. # tick += 1
  44. # if fmod(tick,tickrate) == 0:
  45. if true:
  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.arraytarget.size():
  55. # death checking
  56. if dict.arrayvida[i] > 0 and dict.enabled[i]:
  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. if array.size() > 0:
  62. dict.arraytarget[i] = array[randi()%array.size()]
  63. #exclusive movmenet code
  64. if fmod(tick, dict.arraydirtime[i]) == 0:
  65. if is_instance_valid(dict.arraytarget[i]):
  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( -enemydmg, '')
  73. #recycling enemies
  74. elif dict.enabled[i]:
  75. var rot = rand_range(-PI,PI)
  76. dict.arraypos[i] = (Vector2(sin(rot), cos(rot)) * rand_range(400,800)) + Vector2(320,180)
  77. dict.arrayvida[i] = 100
  78. dict.arraytarget[i] = null
  79. death_count(dict.attacker[i])
  80. func damage_detection(arg,dmg, attacker):
  81. blockmapenemy = {}
  82. for i in dict.arraypos.size():
  83. var x2 = int( (dict.arraypos[i].x -16)/32)
  84. var y2 = int( (dict.arraypos[i].y -16)/32)
  85. if blockmapenemy.has(Vector2(x2,y2)):
  86. blockmapenemy[Vector2(x2,y2)].append(i)
  87. else:
  88. blockmapenemy[Vector2(x2,y2)] = [i]
  89. var x = int((arg.x -16)/32)
  90. var y = int((arg.y -16)/32)
  91. for x2 in range(-2,2):
  92. for y2 in range(-2,2):
  93. if blockmapenemy.has(Vector2(x+x2,y+y2)):
  94. for i in blockmapenemy[Vector2(x+x2,y+y2)]:
  95. dict.arrayvida[i] -= dmg
  96. if dict.arrayvida[i] <= 0:
  97. dict.attacker[i] = attacker
  98. #unrelated code that takes care of level up, kill counts, xp and etc
  99. var counter = 0
  100. var score = {}
  101. var xp = {}
  102. var nxt = {}
  103. var lv = {}
  104. var maxhp = {}
  105. export var hpgain = 5
  106. export var dmggain = 5
  107. export var xpggain = 10
  108. export var xpnext = 1.2
  109. export var enemydmg = 3.0
  110. func death_count(id):
  111. if not nxt.has(id):
  112. nxt[id] = 100
  113. if not maxhp.has(id):
  114. maxhp[id] = 100
  115. if not lv.has(id):
  116. lv[id] = 0
  117. if score.has(id):
  118. score[id] += 1
  119. else:
  120. score[id] = 1
  121. if xp.has(id):
  122. xp[id] += xpggain
  123. if xp[id] > nxt[id]:
  124. lv[id] += 1
  125. var gain = hpgain * lv[id]
  126. maxhp[id] += gain
  127. get_parent().level_up(lv[id] , maxhp[id], gain, dmggain, id)
  128. xp[id] = 0
  129. nxt[id] *= xpnext
  130. else:
  131. xp[id] = xpggain
  132. get_parent().kill_update(score[id], xp[id], lv[id], nxt[id], id)