Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends RigidBody2D
- class_name Critter
- @export var stats:Dictionary ={
- "energy":Stat.new(100,100),
- "speed":Stat.new(5,100),
- "vision":Stat.new(5,100),
- "width":Stat.new(5,100),
- "height":Stat.new(5,100),
- "weight":Stat.new(5,100),
- "reproductionChance":Stat.new(0.5,100),
- "mutateChance":Stat.new(0.1,100),
- "color":Stat.new(Color.RED)
- }
- var collider: CollisionShape2D
- var destination:Vector2
- #inherit stats
- func inheritStats(statDict:Dictionary):
- stats = statDict.duplicate(true)
- func mutate():
- var mutations:float = stats["mutateChance"].value
- var numbOfstats =stats.size()
- var index = randi_range(0,numbOfstats-1)
- for i in range(numbOfstats):
- var stat:Stat = stats.values()[i].duplicate(true)
- if mutations>randf():
- mutations-=1
- if stat.value is float or stat.value is int:
- stat.value += randi_range(-1,1)
- elif stat.value is Color:
- var newColor:Color = stat.value
- newColor.r += randi_range(-10,10)
- newColor.g += randi_range(-10,10)
- newColor.b += randi_range(-10,10)
- stat.value=newColor
- index+=1
- if index >= numbOfstats:
- index=0
- func setup():
- collider = $CollisionShape2D
- contact_monitor =1
- max_contacts_reported+=16
- connect("body_entered", Callable(self, "_on_body_entered"))
- connect("body_exited", Callable(self, "_on_body_exited"))
- collider.modulate =stats["color"].value
- collider.scale.x=stats["width"].value
- collider.scale.y=stats["height"].value
- mass = stats["weight"].value
- for child in get_children():
- if child has_method("activate")==true:
- child.activate(self)
- func _process(delta: float) -> void:
- move(delta)
- func _physics_process(_delta: float) -> void:
- physiscs_move()
- #region movement
- var travelTime:float =0
- func move(delta):
- #timer
- travelTime +=delta
- if travelTime>=5:
- travelTime-=5
- #pick new destination
- destination = position + Vector2(randf_range(-stats["vision"].value,stats["vision"].value),(randf_range(-stats["vision"].value,stats["vision"].value)))
- func physiscs_move():
- #move
- var antiGrav = -Vector2.UP*980
- var dir =(destination-position).normalized()
- var moveForce = dir*mass*stats["speed"].value
- apply_force(moveForce*antiGrav)
- #endregion
- #region reproduction
- var partners: Array[Array]
- #func _on_body_entered(body: Node) -> void:
- #if body is Critter:
- #partners.append(body.stats.duplicate(true))
- func _on_body_exited(body: Node) -> void:
- if partners.size()==0:return
- if body is not Critter:return
- #partners.append(stats)
- var children:int = int(stats["reproductionChance"].value)
- if randf()> stats["reproductionChance"].value - children:
- children+=1
- stats["reproductionChance"].value-=1
- #for c in range(children):
- #var baby_data:CritterData = CritterData.new()
- #baby_data.inherit(parents)
- #baby_data.mutate()
- #data. partners.clear()
- #endregion
Advertisement
Add Comment
Please, Sign In to add comment