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. #
  43. ##setting tickrate, to reduce executions per second
  44. ## tick += 1
  45. ## if fmod(tick,tickrate) == 0:
  46. # if true:
  47. #
  48. ##dict of aprox positions of players
  49. # var blockmap = {}
  50. # if get_node('../players').get_child_count() == 0: return
  51. # for z in get_node('../players').get_children():
  52. # var x = int(z.global_position.x/20)
  53. # var y = int(z.global_position.y/20)
  54. # blockmap[Vector2(x,y)] = z
  55. #
  56. ##yes this abomination controls the enemies, ECS code looks ugly as fuck in this engine
  57. # for i in dict.arraytarget.size():
  58. #
  59. ## death checking
  60. # if dict.arrayvida[i] > 0 and dict.enabled[i]:
  61. #
  62. ##picking new targets if the last one is invalid
  63. # if dict.arraytarget[i] == null:
  64. # if get_node('../players').get_child_count() == 0: return
  65. # var array = get_node('../players').get_children()
  66. # if array.size() > 0:
  67. # dict.arraytarget[i] = array[randi()%array.size()]
  68. #
  69. ##exclusive movmenet code
  70. # if fmod(tick, dict.arraydirtime[i]) == 0:
  71. # if is_instance_valid(dict.arraytarget[i]):
  72. # dict.arraymotion[i] = (dict.arraytarget[i].global_position - dict.arraypos[i]).normalized() * speed
  73. # dict.arraypos[i] += dict.arraymotion[i]
  74. #
  75. ## enemy attak on players
  76. # var x = int(dict.arraypos[i].x/20)
  77. # var y = int(dict.arraypos[i].y/20)
  78. # if blockmap.has(Vector2(x,y)):
  79. # blockmap[Vector2(x,y)].damage( -enemydmg, '')
  80. ##recycling enemies
  81. # elif dict.enabled[i]:
  82. # var rot = rand_range(-PI,PI)
  83. # dict.arraypos[i] = (Vector2(sin(rot), cos(rot)) * rand_range(400,800)) + Vector2(320,180)
  84. # dict.arrayvida[i] = 100
  85. # dict.arraytarget[i] = null
  86. # death_count(dict.attacker[i])
  87. #
  88. func damage_detection(arg,dmg, attacker):
  89. blockmapenemy = {}
  90. for i in dict.arraypos.size():
  91. var x2 = int( (dict.arraypos[i].x -16)/32)
  92. var y2 = int( (dict.arraypos[i].y -16)/32)
  93. if blockmapenemy.has(Vector2(x2,y2)):
  94. blockmapenemy[Vector2(x2,y2)].append(i)
  95. else:
  96. blockmapenemy[Vector2(x2,y2)] = [i]
  97. var x = int((arg.x -16)/32)
  98. var y = int((arg.y -16)/32)
  99. for x2 in range(-2,2):
  100. for y2 in range(-2,2):
  101. if blockmapenemy.has(Vector2(x+x2,y+y2)):
  102. for i in blockmapenemy[Vector2(x+x2,y+y2)]:
  103. dict.arrayvida[i] -= dmg
  104. if dict.arrayvida[i] <= 0:
  105. dict.attacker[i] = attacker
  106. #unrelated code that takes care of level up, kill counts, xp and etc
  107. var counter = 0
  108. var score = {}
  109. var xp = {}
  110. var nxt = {}
  111. var lv = {}
  112. var maxhp = {}
  113. export var hpgain = 5
  114. export var dmggain = 5
  115. export var xpggain = 10
  116. export var xpnext = 1.2
  117. export var enemydmg = 3.0
  118. func death_count(id):
  119. if not nxt.has(id):
  120. nxt[id] = 100
  121. if not maxhp.has(id):
  122. maxhp[id] = 100
  123. if not lv.has(id):
  124. lv[id] = 0
  125. if score.has(id):
  126. score[id] += 1
  127. else:
  128. score[id] = 1
  129. if xp.has(id):
  130. xp[id] += xpggain
  131. if xp[id] > nxt[id]:
  132. lv[id] += 1
  133. var gain = hpgain * lv[id]
  134. maxhp[id] += gain
  135. get_parent().level_up(lv[id] , maxhp[id], gain, dmggain, id)
  136. xp[id] = 0
  137. nxt[id] *= xpnext
  138. else:
  139. xp[id] = xpggain
  140. get_parent().kill_update(score[id], xp[id], lv[id], nxt[id], id)