/
Friend.gd
116 lines (96 loc) · 3.1 KB
/
Friend.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
extends Node2D
# class member variables go here, for example:
# var a = 2
# var b = "textvar"
var prior_object
var player_control = false
var RandomWalker = preload("res://RandomWalker.tscn")
var Controller = preload("res://Controller.tscn")
var gene = {}
var display_name
var entity_type = "Friend"
func _ready():
# Called when the node is added to the scene for the first time.
# Initialization here
# Add Random walker
var random_walker = RandomWalker.instance()
add_child(random_walker)
# Init template properties
$BulletShooter/BulletShooterTimer.wait_time = 1
$RandomWalker.speed = 80
$FriendBody/BodyFeature.hp = 5
# Init name
display_name = get_node("../NameGenerator").generate_name()
$NameLabelContainer/NameLabel.text = display_name
func get_gene_attr(attr_name, scale_min, scale_max):
# Generate numeric attributes
# If attribute in gene, return that
# Else, WRITE that into the gene, and return the random value generated
if attr_name in gene.keys():
return gene[attr_name]
else:
# Generate the val
var val = rand_range(scale_min, scale_max)
# Mutate
if randf() < 0.01:
if randf() < 0.5:
val *= 2
else:
val /= 2
gene[attr_name] = val
return val
func set_surname():
if "surname" in gene.keys():
display_name[0] = gene["surname"]
else:
gene["surname"] = display_name[0]
# Name is displayed again after surname is set
$NameLabelContainer/NameLabel.text = display_name
func set_scale(scale_val):
scale *= sqrt(scale_val)
$FriendBody/BodyFeature.hp *= scale_val
func set_attrs():
# Combat
$BulletShooter/BulletShooterTimer.wait_time /= get_gene_attr("bullet_rate", 0.8, 1.2)
$Sensor.scale *= get_gene_attr("sensor_range", 0.8, 1.2)
# HP
$FriendBody/BodyFeature.hp *= get_gene_attr("hp", 0.8, 1.2)
# Speed
$RandomWalker.speed *= get_gene_attr("speed", 0.75, 1.0) # Set slower to get mating easier
# Reproduction rate
$FriendBody/MateFeature/MateTimer.wait_time /= get_gene_attr("mate_time", 0.8, 1.2)
# Scale
set_scale(get_gene_attr("scale", 0.9, 1.1))
# Name
set_surname()
# Behaviour disposition
$RandomWalker.toward_mob *= get_gene_attr("toward_mob", 1.0, 1.1)
$RandomWalker.toward_friend *= get_gene_attr("toward_friend", 1.0, 1.1)
func switch_controller():
# Change controller between player and random
# Make sure they are symmetrical
if player_control:
get_node("Controller").replace_by(RandomWalker.instance())
get_node("Sensor").sort_objects = false
#get_node("FriendBody/PlayerHealTimer").stop()
player_control = false
else:
get_node("RandomWalker").replace_by(Controller.instance())
get_node("Sensor").sort_objects = true
#get_node("FriendBody/PlayerHealTimer").start()
rotation = 0
player_control = true
func get_prior_object():
if $Sensor.mobs_sensed.size() > 0:
prior_object = $Sensor.mobs_sensed[0]
elif $Sensor.friends_sensed.size() > 0:
prior_object = $Sensor.friends_sensed[0]
else:
prior_object = null
func _process(delta):
# Called every frame. Delta is time since last frame.
# Update game logic herr
get_prior_object()
if prior_object and player_control:
#print("Prior Object:", prior_object.name)
pass