extends KinematicBody2D var Pheromone = preload("res://pheromone.tscn") var tileSet = preload("res://main_tileset.tres") var pheromoneSet = preload("res://pheromones_tileset.tres") onready var PheromoneMap := .get_parent().get_node("Pheromones") onready var PheromoneMeta := .get_parent().get_node("PheromoneMeta") onready var tilemap := .get_parent().get_node("TileMap") var pheromoneSensivity = 1 var lastDrop = 0 var dropIntervall = 0.5 # Declare member variables here. Examples: var maxSpeed := 1 var speed := 0.0 var accel := 0.1 var move := true var vel := Vector2.UP var targetVel := Vector2.UP var closeToHome := 0.0 var maxDepth := 10 var depth := 0 var oldTilePos : Vector2 var oldPherTilePos : Vector2 var mode = "search" # goHome var pheromoneMode = "search" # food var escapingWall := false # Called when the node enters the scene tree for the first time. func _ready(): .set_meta('kind',"ant") rotation = Vector2.UP.angle_to(vel) lastDrop = OS.get_unix_time() oldTilePos = PheromoneMap.world_to_map(position) .get_node("target").add_point(Vector2()) .get_node("target").add_point(targetVel) .get_node("vel").add_point(Vector2()) .get_node("vel").add_point(vel) func _process(delta): get_node("sensivity").value=pheromoneSensivity*100 get_node("close2home").value=closeToHome*100 get_node("mode").text=mode if not escapingWall: _regenererateSensivity() var tilepos = tilemap.world_to_map(position) if oldTilePos != tilepos: _examine_new_tile(tilepos) oldTilePos = tilepos var pherTilePos = PheromoneMap.world_to_map(position) if oldPherTilePos != pherTilePos: if escapingWall: pass else: dropPheromone(oldPherTilePos) #_apply_pheromone(pherTilePos) oldPherTilePos = pherTilePos _draw_lines() closeToHome = closeToHome * 0.999 if mode != "goHome" and closeToHome < 0.1: mode = "goHome" if speed < maxSpeed: speed += accel rotation = Vector2.UP.angle_to(vel) func _apply_pheromone(pherTilePos): if PheromoneMap.get_cellv(pherTilePos) == pheromoneSet.find_tile_by_name("search"): var dir = PheromoneMeta.getDir(pherTilePos) targetVel = targetVel.rotated(targetVel.angle_to(dir)) * PheromoneMeta.get_intensity(pherTilePos) * pheromoneSensivity * 0.5 targetVel=targetVel.normalized() pheromoneSensivity -= 0.1 func _draw_lines(): .get_node("target").set_point_position(1, targetVel*100) .get_node("vel").set_point_position(1, vel*100) func _examine_new_tile(tilepos): var cell = tilemap.get_cellv(tilepos) var CellName = tileSet.tile_get_name(cell) escapingWall = false if CellName == "": return elif CellName == "wall": if not escapingWall: _on_wall() escapingWall = true elif CellName == "hill": _on_home() elif CellName == "food": _on_food() print(CellName) func _on_wall(): targetVel = -vel pheromoneSensivity = 0.0 speed = 0.1 func _on_food(): mode = "goHome" pheromoneMode = "food" func _on_home(): closeToHome=1 mode = "search" pheromoneMode = "search" func dropPheromone(tilepos): var cell = PheromoneMap.set_cellv(tilepos, pheromoneSet.find_tile_by_name(mode)) var newpher = Pheromone.instance() newpher.tilePos = oldPherTilePos newpher.dir = vel.normalized() newpher.type = pheromoneMode newpher.closeToHome = closeToHome .get_parent().get_node("PheromoneMeta").addPheromone(newpher) #var ph = Pheromone.instance() #ph.set_meta("creator", name) #ph.set_meta('type',pheromoneMode) #if pheromoneMode == "search": # ph.closeToHome = closeToHome #ph.position = position #ph.rotation = rotation #get_parent().add_child(ph) #lastDrop = OS.get_unix_time() func _regenererateSensivity(): if pheromoneSensivity < 1: pheromoneSensivity += pheromoneSensivity*0.01 func _apply_targetVel(): targetVel = targetVel.rotated(deg2rad(randi()%4 -1.5)) var targetAngle = Vector2.UP.angle_to(targetVel) var velAngle = Vector2.UP.angle_to(vel) vel = vel.rotated((targetAngle - velAngle)*0.1) func _physics_process(delta): if move: _apply_targetVel() position = position + vel*speed #var collision = move_and_collide(vel*speed, true, true, true) #if collision: # #_handle_Collition(collision) # _apply_targetVel() # position = position + vel*speed #else: # _apply_targetVel() # move_and_collide(vel*speed) func _handle_Collition(collision): depth += 1 if depth >= maxDepth: return false if not collision.local_shape.name == "CollisionShapeFront": collision = move_and_collide(collision.remainder) if collision: _handle_Collition(collision) var colliderName = collision.collider.name if collision.collider.name == "TileMap": var cell = tilemap.get_cellv(tilemap.world_to_map(collision.position)) colliderName = collision.collider.tile_set.tile_get_name(cell) if colliderName == "wall": speed = 0.1 #print("before", vel, targetVel) #var angle = collision.get_normal().angle_to(-vel) #print(rad2deg(angle)) targetVel = Vector2()#vel.bounce(collision.get_normal()) vel = Vector2() #print("after", vel, targetVel) #elif collision.collider.get_meta('kind') == "pheromone" and not collision.collider.get_meta("creator") == name and pheromoneSensivity > 0.5: # if mode == "search": # if collision.collider.get_meta('type') == "search": # targetRot += (collision.collider.rotation-targetRot) * collision.collider.intensity * pheromoneSensivity * 0.5 # pheromoneSensivity -= 0.1 # elif collision.collider.get_meta('type') == "food": # targetRot += (collision.collider.rotation-targetRot) # rotate(180) # elif mode == "goHome" and collision.collider.closeToHome > closeToHome: # if collision.collider.get_meta('type') == "search": # setRotation(collision.collider.rotation) # if collision.collider.get_meta('type') == "search": # rotate(180) # closeToHome = collision.collider.closeToHome # if collision.collider.get_meta('type') == "food": # pass #targetRot += (collision.collider.rotation-targetRot) #rotateRad( (rotation - collision.collider.rotation) * collision.collider.intensity ) #rotation = collision.collider.rotation #vel = Vector2.UP.rotated(rotation) #self.position = self.position + collision.get_remainder() elif colliderName == "hill": _on_home() elif colliderName == "food": _on_food() #elif collision.collider.get_meta('kind') == "ant": # return #rotate(randi()%4 -1.5)