extends KinematicBody2D class_name Prey const DIGESTIONGRAD:Gradient = preload("res://other/digestion.tres") var velocity = Vector2(0,0) export var draggable = false var healthmax:int = 1000 var health:int var SPEED = 320 const JUMPF = -600 const GRAVITY = 30 var TINYWHEN:Vector2 = Vector2(0.3,0.3)# how small to get when shrunk var collectsize:Vector2 = Vector2(0.3,0.3)# how small to get before can be collected var squeeze:float = 0.7# how small to get before can be collected # this walk var will deturmine where the rabbit wants to move. # if 0, rabbit doesnt move # if posative number, rabbit moves right and subtract one # if negative number, rabbit moves left and subtract one var walk = 0 var mysizeratio = 0 #this will be stored in the prey when eaten var grabbed = false onready var tween = $Tween var inacid = false onready var grab:Area2D = $grab var launched = false #when true they dont move until they hit the ground var preytype = "" #the type of prey from the preydata global dictionary. var data:Dictionary var spawn:Vector2 var dead:bool = false # Called when the node enters the scene tree for the first time. func _ready(): health = healthmax spawn = position add_to_group("prey") if preytype.empty():#if no type is specified upon creation, pick random one #get choices var choices = Global.preydata.keys() if choices.empty(): #if prey list is empty then just delete itself queue_free() return #pick one preytype = choices[rand_range(0,choices.size())] #load data from prey data dictionary data = Global.preydata.get(preytype,{}) #set the values using get() with defaults: _load_data() func _load_data(): # set the attributes from the data var health = data.get("health",healthmax) healthmax = data.get("health",healthmax) $Collision.shape = data.get("shape",$Collision.shape) $Collision.rotation_degrees = data.get("shaperot",0) scale = data.get("size",scale) TINYWHEN = data.get("shrunksize",TINYWHEN) squeeze = data.get("squeeze",squeeze) collectsize = data.get("collectsize",collectsize) $flip/body.texture = data.get("SpriteMain",$flip/body.texture) func _physics_process(delta): #move when told to if walk > 0 and not grabbed and not launched and not dead: velocity.x = SPEED*scale.x $AnimatedSprite.flip_h = false $flip.scale.x = 1 walk -= 1 elif walk < 0 and not grabbed and not launched and not dead: velocity.x = -SPEED*scale.x $AnimatedSprite.flip_h = true $flip.scale.x = -1 else: pass #$Sprite.play("idle") #move it move it velocity = move_and_slide(velocity,Vector2.UP) if not launched: velocity.x = 0 #velocity.x = lerp(velocity.x,0,0.2) if is_on_wall(): # walk = 0 walk = -walk #random moving if int(rand_range(0,200)) == 0: walk = int(rand_range(-100,200)) velocity.y += GRAVITY*scale.x #random jumping if int(rand_range(0,150)) == 0 and is_on_floor() and not grabbed and not dead: velocity.y = JUMPF * scale.x if position.y > 20000: position = spawn velocity.y = 0 if grabbed: var new_pos:Vector2 = get_global_mouse_position() # if not test_move(Transform2D(rotation,new_pos),Vector2.ZERO): # if not move_and_collide(new_pos-position,true,true,false): # position = new_pos velocity = move_and_slide((new_pos-position)*30,Vector2.ZERO,false,4,0.7,true) var squeezing:float = clamp(1 - position.distance_to(new_pos) / 1000,squeeze,1) $Collision.scale = Vector2(squeezing,squeezing) if inacid: health -= 1 modulate = DIGESTIONGRAD.interpolate(1-float(health) / float(healthmax)) #modulate.g = float(health) / float(healthmax) #modulate.b = float(health) / float(healthmax) #modulate.r += 0.001 if health == 0: if get_parent() is PreyGroup: get_parent().emit_signal("a_prey_digested") queue_free() dead = (health < healthmax / 2) if launched and is_on_floor(): launched = false rotation_degrees = 0 #debegvb #print_debug("to ",position) #visible = true func shrink(): tween.interpolate_property(self,"scale",scale,TINYWHEN,0.6,Tween.TRANS_LINEAR,Tween.EASE_OUT) tween.start() func _input_event(viewport, event, shape_idx): #grab prey if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.pressed: grabbed = true func _input(event): #ungrab prey if grabbed and event is InputEventMouseButton and event.button_index == BUTTON_LEFT and not event.pressed: ungrab() elif grabbed and event.is_action_pressed("rotate_CW"): rotation_degrees += 15 elif grabbed and event.is_action_pressed("rotate_CCW"): rotation_degrees -= 15 func ungrab(): grabbed = false walk = 0 launched = true $Collision.scale = Vector2.ONE func set_simple(image): #this function is unused now but keep the auto size code for later. print($CollisionShape2D.shape.height) #set the prey to a simple image and auto make the collision pill if image is ImageTexture or true: $flip/body.texture = image print(image) if image.get_height() > image.get_width(): $CollisionShape2D.rotation = 0 $CollisionShape2D.shape.radius = image.get_width() / 2 $CollisionShape2D.shape.height = image.get_height() - $CollisionShape2D.shape.radius*2 else: $CollisionShape2D.shape.radius = image.get_height() / 2 $CollisionShape2D.shape.height = image.get_width() - $CollisionShape2D.shape.radius*2 func _on_grab_input_event(viewport, event, shape_idx): _input_event(viewport, event, shape_idx)