-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGingerbreadMan.gd
102 lines (79 loc) · 3.28 KB
/
GingerbreadMan.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
extends KinematicBody
export(float) var jumpFreq = 5.0
export(float) var jumpVel = 5.0
var lastThrowTime = 0.0
var throwCount = 0
var player
var rng = RandomNumberGenerator.new()
var randomWalkDir = Vector3()
var lastWalkDirChangeTime = 0.0
var newDirTime = rng.randf_range(0.5, 2.0)
var velocity = Vector3()
var attacked = false
var attackCooldown = 0.0
const CollapsedGingerbreadMan = preload("res://CollapsedGingerbreadMan.tscn")
func _ready():
rng.randomize()
lastThrowTime = rng.randf_range(-1, 0)
func _physics_process(delta):
lastThrowTime += delta
lastWalkDirChangeTime += delta
var gravityDir = PhysicsServer.area_get_param(get_world().get_space(), PhysicsServer.AREA_PARAM_GRAVITY_VECTOR)
var gravityStrength = PhysicsServer.area_get_param(get_world().get_space(), PhysicsServer.AREA_PARAM_GRAVITY)
var up = -gravityDir.normalized()
var velUp = velocity.dot(up) * up
var velPlane = velocity - velUp
var playerInRange = false
if player != null:
var d2 = (player.global_transform.origin - global_transform.origin).length_squared()
playerInRange = d2 < 8 * 8
if lastWalkDirChangeTime >= newDirTime:
if rng.randi_range(0, 5) == 0: # walk in random direction
var angle = rng.randf_range(0, 2 * PI)
randomWalkDir = Vector3(cos(angle), 0, sin(angle)) * rng.randf_range(0.5, 2) * 5
elif player != null and playerInRange:
var playerDir = player.global_transform.origin - global_transform.origin
randomWalkDir = playerDir - playerDir.y * Vector3(0, 1, 0)
if randomWalkDir.length_squared() > 1:
randomWalkDir = randomWalkDir.normalized()
randomWalkDir *= rng.randf_range(5, 9)
else:
randomWalkDir = Vector3(0, 0, 0)
lastWalkDirChangeTime = 0.0
newDirTime = rng.randf_range(0.5, 2.0)
# Assume randomWalkDir is parallel to gravity
velUp += gravityDir * gravityStrength * delta
velPlane += randomWalkDir * delta - 2 * velPlane * delta
if not attacked:
for index in get_slide_count():
var collision = get_slide_collision(index)
if collision.collider.get_name() == "Player":
collision.collider.do_damage(self, 1)
attacked = true
attackCooldown = 1.0
velUp = up * jumpVel
lastWalkDirChangeTime = 0.0
velPlane = collision.normal * 5
collision.collider.knockback(-collision.normal * 20)
else:
attackCooldown -= delta
if attackCooldown <= 0:
attacked = false
attackCooldown = 0.0
velocity = velUp + velPlane
velocity = move_and_slide(velocity, up)
func hit_by_paintball(paintball):
var collapsed = CollapsedGingerbreadMan.instance()
collapsed.transform.origin = transform.origin
get_parent().add_child(collapsed)
var randDir1 = Vector3(rng.randf_range(-1, 1), rng.randf_range(-0.5, 0.5), rng.randf_range(-1, 1)) * 3.0
var randDir2 = Vector3(rng.randf_range(-1, 1), rng.randf_range(-0.5, 0.5), rng.randf_range(-1, 1)) * 3.0
var randDir3 = Vector3(rng.randf_range(-1, 1), rng.randf_range(-0.5, 0.5), rng.randf_range(-1, 1)) * 3.0
var randDir4 = Vector3(rng.randf_range(-1, 1), rng.randf_range(-0.5, 0.5), rng.randf_range(-1, 1)) * 3.0
collapsed.get_node("Part").apply_central_impulse(randDir1)
collapsed.get_node("Part2").apply_central_impulse(randDir2)
collapsed.get_node("Part3").apply_central_impulse(randDir3)
collapsed.get_node("Part4").apply_central_impulse(randDir4)
queue_free()
func set_player(p):
player = p