-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcity.gd
104 lines (81 loc) · 3.62 KB
/
city.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
extends KinematicBody2D
signal hit_ground
signal city_move(height_meters, velocity_ms, accleration_ms2, mass_kg)
export(Vector2) var velocity = Vector2(0, 0)
var gravity_magnitude : int = ProjectSettings.get_setting("physics/2d/default_gravity")
func _ready():
pass # Replace with function body.
func _process(_bdelta):
var position = self.global_position.y
if (position > 0):
emit_signal("hit_ground")
emit_signal("city_move", position, velocity.y, _get_accel(), _get_mass())
func _physics_process(delta):
velocity.y += _get_accel() * delta;
var _result = move_and_slide(velocity)
func _get_mass():
var total_platform_mass = 0
for plat in _get_platforms():
total_platform_mass += plat.get_mass()
return total_platform_mass
func _get_platforms():
return get_tree().get_nodes_in_group("platforms")
func _get_balloons():
return get_tree().get_nodes_in_group("balloons")
func _get_build_platforms():
return get_tree().get_nodes_in_group("build_platforms")
func _get_accel():
var balloon_total_lift = 0
for balloon in _get_balloons():
balloon_total_lift += balloon.get_lift_newtons()
var acceleration_from_lift = balloon_total_lift / _get_mass()
var acceleration_delta = float((gravity_magnitude - acceleration_from_lift)) / 10.0
return acceleration_delta
func _on_build_platform_built_platform(offset_x, offset_y):
var build_platforms = _get_build_platforms()
for b_plat in build_platforms:
if (b_plat.offset_x == offset_x && b_plat.offset_y == offset_y):
# replace build platform with a legit platform
_handle_build_platform(b_plat)
break;
func _handle_build_platform(build_platform):
var platform_scene = load("res://units/platform/platform.tscn")
var platform_instance = platform_scene.instance()
platform_instance.set_name("platform" + str(build_platform.offset_x) + "_" + str(build_platform.offset_y))
platform_instance.position.x = build_platform.offset_x * (64 + 30)
platform_instance.position.y = build_platform.offset_y * (64 + 30)
platform_instance.offset_x = build_platform.offset_x
platform_instance.offset_y = build_platform.offset_y
var section_scene = load("res://units/section/section.tscn")
var section_instance1 = section_scene.instance()
section_instance1.position.x = -24
section_instance1.position.y = -32
platform_instance.add_child(section_instance1)
var section_instance2 = section_scene.instance()
section_instance2.position.x = 24
section_instance2.position.y = -32
platform_instance.add_child(section_instance2)
add_child(platform_instance)
remove_child(build_platform)
var should_build_left = build_platform.offset_x > -3 # cannot build more to the left
var should_build_right = build_platform.offset_x < 3 # cannot build more to the right
var platforms = _get_platforms()
for plat in platforms:
should_build_left = should_build_left && plat.offset_x != (build_platform.offset_x - 1)
should_build_right = should_build_right && plat.offset_x != (build_platform.offset_x + 1)
if should_build_left:
var left = _generate_platform_ui(build_platform.offset_x - 1, build_platform.offset_y)
add_child(left)
if should_build_right:
var right = _generate_platform_ui(build_platform.offset_x + 1, build_platform.offset_y)
add_child(right)
func _generate_platform_ui(offset_x, offset_y):
var build_plat_scene = load("res://units/build_platform/build_platform.tscn")
var instance = build_plat_scene.instance()
instance.set_name("platform")
instance.connect("built_platform", self, "_on_build_platform_built_platform")
instance.position.x = offset_x * (64 + 30)
instance.position.y = offset_y * (64 + 30)
instance.offset_x = offset_x
instance.offset_y = offset_y
return instance