ant.gd 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. extends KinematicBody2D
  2. var Pheromone = preload("res://pheromone.tscn")
  3. var tileSet = preload("res://main_tileset.tres")
  4. var pheromoneSet = preload("res://pheromones_tileset.tres")
  5. onready var PheromoneMap := .get_parent().get_node("Pheromones")
  6. onready var PheromoneMeta := .get_parent().get_node("PheromoneMeta")
  7. onready var tilemap := .get_parent().get_node("TileMap")
  8. var pheromoneSensivity = 1
  9. var lastDrop = 0
  10. var dropIntervall = 0.5
  11. # Declare member variables here. Examples:
  12. var maxSpeed := 1
  13. var speed := 0.0
  14. var accel := 0.1
  15. var move := true
  16. var vel := Vector2.UP
  17. var targetVel := Vector2.UP
  18. var closeToHome := 0.0
  19. var maxDepth := 10
  20. var depth := 0
  21. var oldTilePos : Vector2
  22. var oldPherTilePos : Vector2
  23. var mode = "search" # goHome
  24. var pheromoneMode = "search" # food
  25. var escapingWall := false
  26. # Called when the node enters the scene tree for the first time.
  27. func _ready():
  28. .set_meta('kind',"ant")
  29. rotation = Vector2.UP.angle_to(vel)
  30. lastDrop = OS.get_unix_time()
  31. oldTilePos = PheromoneMap.world_to_map(position)
  32. .get_node("target").add_point(Vector2())
  33. .get_node("target").add_point(targetVel)
  34. .get_node("vel").add_point(Vector2())
  35. .get_node("vel").add_point(vel)
  36. func _process(delta):
  37. get_node("sensivity").value=pheromoneSensivity*100
  38. get_node("close2home").value=closeToHome*100
  39. get_node("mode").text=mode
  40. if not escapingWall:
  41. _regenererateSensivity()
  42. var tilepos = tilemap.world_to_map(position)
  43. if oldTilePos != tilepos:
  44. _examine_new_tile(tilepos)
  45. oldTilePos = tilepos
  46. var pherTilePos = PheromoneMap.world_to_map(position)
  47. if oldPherTilePos != pherTilePos:
  48. if escapingWall:
  49. pass
  50. else:
  51. dropPheromone(oldPherTilePos)
  52. #_apply_pheromone(pherTilePos)
  53. oldPherTilePos = pherTilePos
  54. _draw_lines()
  55. closeToHome = closeToHome * 0.999
  56. if mode != "goHome" and closeToHome < 0.1:
  57. mode = "goHome"
  58. if speed < maxSpeed:
  59. speed += accel
  60. rotation = Vector2.UP.angle_to(vel)
  61. func _apply_pheromone(pherTilePos):
  62. if PheromoneMap.get_cellv(pherTilePos) == pheromoneSet.find_tile_by_name("search"):
  63. var dir = PheromoneMeta.getDir(pherTilePos)
  64. targetVel = targetVel.rotated(targetVel.angle_to(dir)) * PheromoneMeta.get_intensity(pherTilePos) * pheromoneSensivity * 0.5
  65. targetVel=targetVel.normalized()
  66. pheromoneSensivity -= 0.1
  67. func _draw_lines():
  68. .get_node("target").set_point_position(1, targetVel*100)
  69. .get_node("vel").set_point_position(1, vel*100)
  70. func _examine_new_tile(tilepos):
  71. var cell = tilemap.get_cellv(tilepos)
  72. var CellName = tileSet.tile_get_name(cell)
  73. escapingWall = false
  74. if CellName == "":
  75. return
  76. elif CellName == "wall":
  77. if not escapingWall:
  78. _on_wall()
  79. escapingWall = true
  80. elif CellName == "hill":
  81. _on_home()
  82. elif CellName == "food":
  83. _on_food()
  84. print(CellName)
  85. func _on_wall():
  86. targetVel = -vel
  87. pheromoneSensivity = 0.0
  88. speed = 0.1
  89. func _on_food():
  90. mode = "goHome"
  91. pheromoneMode = "food"
  92. func _on_home():
  93. closeToHome=1
  94. mode = "search"
  95. pheromoneMode = "search"
  96. func dropPheromone(tilepos):
  97. var cell = PheromoneMap.set_cellv(tilepos, pheromoneSet.find_tile_by_name(mode))
  98. var newpher = Pheromone.instance()
  99. newpher.tilePos = oldPherTilePos
  100. newpher.dir = vel.normalized()
  101. newpher.type = pheromoneMode
  102. newpher.closeToHome = closeToHome
  103. .get_parent().get_node("PheromoneMeta").addPheromone(newpher)
  104. #var ph = Pheromone.instance()
  105. #ph.set_meta("creator", name)
  106. #ph.set_meta('type',pheromoneMode)
  107. #if pheromoneMode == "search":
  108. # ph.closeToHome = closeToHome
  109. #ph.position = position
  110. #ph.rotation = rotation
  111. #get_parent().add_child(ph)
  112. #lastDrop = OS.get_unix_time()
  113. func _regenererateSensivity():
  114. if pheromoneSensivity < 1:
  115. pheromoneSensivity += pheromoneSensivity*0.01
  116. func _apply_targetVel():
  117. targetVel = targetVel.rotated(deg2rad(randi()%4 -1.5))
  118. var targetAngle = Vector2.UP.angle_to(targetVel)
  119. var velAngle = Vector2.UP.angle_to(vel)
  120. vel = vel.rotated((targetAngle - velAngle)*0.1)
  121. func _physics_process(delta):
  122. if move:
  123. _apply_targetVel()
  124. position = position + vel*speed
  125. #var collision = move_and_collide(vel*speed, true, true, true)
  126. #if collision:
  127. # #_handle_Collition(collision)
  128. # _apply_targetVel()
  129. # position = position + vel*speed
  130. #else:
  131. # _apply_targetVel()
  132. # move_and_collide(vel*speed)
  133. func _handle_Collition(collision):
  134. depth += 1
  135. if depth >= maxDepth:
  136. return false
  137. if not collision.local_shape.name == "CollisionShapeFront":
  138. collision = move_and_collide(collision.remainder)
  139. if collision:
  140. _handle_Collition(collision)
  141. var colliderName = collision.collider.name
  142. if collision.collider.name == "TileMap":
  143. var cell = tilemap.get_cellv(tilemap.world_to_map(collision.position))
  144. colliderName = collision.collider.tile_set.tile_get_name(cell)
  145. if colliderName == "wall":
  146. speed = 0.1
  147. #print("before", vel, targetVel)
  148. #var angle = collision.get_normal().angle_to(-vel)
  149. #print(rad2deg(angle))
  150. targetVel = Vector2()#vel.bounce(collision.get_normal())
  151. vel = Vector2()
  152. #print("after", vel, targetVel)
  153. #elif collision.collider.get_meta('kind') == "pheromone" and not collision.collider.get_meta("creator") == name and pheromoneSensivity > 0.5:
  154. # if mode == "search":
  155. # if collision.collider.get_meta('type') == "search":
  156. # targetRot += (collision.collider.rotation-targetRot) * collision.collider.intensity * pheromoneSensivity * 0.5
  157. # pheromoneSensivity -= 0.1
  158. # elif collision.collider.get_meta('type') == "food":
  159. # targetRot += (collision.collider.rotation-targetRot)
  160. # rotate(180)
  161. # elif mode == "goHome" and collision.collider.closeToHome > closeToHome:
  162. # if collision.collider.get_meta('type') == "search":
  163. # setRotation(collision.collider.rotation)
  164. # if collision.collider.get_meta('type') == "search":
  165. # rotate(180)
  166. # closeToHome = collision.collider.closeToHome
  167. # if collision.collider.get_meta('type') == "food":
  168. # pass
  169. #targetRot += (collision.collider.rotation-targetRot)
  170. #rotateRad( (rotation - collision.collider.rotation) * collision.collider.intensity )
  171. #rotation = collision.collider.rotation
  172. #vel = Vector2.UP.rotated(rotation)
  173. #self.position = self.position + collision.get_remainder()
  174. elif colliderName == "hill":
  175. _on_home()
  176. elif colliderName == "food":
  177. _on_food()
  178. #elif collision.collider.get_meta('kind') == "ant":
  179. # return
  180. #rotate(randi()%4 -1.5)