-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGame.gd
More file actions
280 lines (227 loc) · 8.08 KB
/
Game.gd
File metadata and controls
280 lines (227 loc) · 8.08 KB
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
extends Control
class_name Game
# Signals for playing the damage sfx
signal on_gained_hp
signal on_die
signal on_lost_hp
var events_dict = {}
var testing_events = false
var counter = 50
var music_player
var train_max_hp = 4
var train_hp = 4
var dead = false
var train_speed = 200.0
var ingredients_dict = {
"Honey": false,
"Water": false,
"Crystal": false
}
var upgrade_dict = {
Choice.Upgrade.blank: true,
Choice.Upgrade.snailRepellant: false,
Choice.Upgrade.waterproofCoating: false,
Choice.Upgrade.kingsSigil: false,
Choice.Upgrade.railLayingMachine: false,
Choice.Upgrade.medicalCar: false,
Choice.Upgrade.highMorale: false
}
var upgrade_names = {
Choice.Upgrade.blank: "N/A",
Choice.Upgrade.snailRepellant: "Snail Repellant",
Choice.Upgrade.waterproofCoating: "Waterproof Coating",
Choice.Upgrade.kingsSigil: "King's Sigil",
Choice.Upgrade.railLayingMachine: "Rail Laying Machine",
Choice.Upgrade.medicalCar: "Medical Car",
Choice.Upgrade.highMorale: "High Morale"
}
# Called when the node enters the scene tree for the first time.
func _ready():
load_events("res://resources/events", events_dict)
#print(upgrade_dict)
var scene = load("res://tracks/tracks.tscn")
var instance = scene.instantiate()
self.add_child(instance)
var music_player_template = load("res://music_player.tscn")
music_player = music_player_template.instantiate()
self.add_child(music_player)
var train = get_tree().get_nodes_in_group("train")[0]
train.trigger_random_event.connect(_on_trigger_random_event)
train.trigger_major_event.connect(_on_trigger_major_event)
display_choice(events_dict[0])
func load_events(path: String, dict: Dictionary):
var dir = DirAccess.open(path)
if dir:
dir.list_dir_begin()
var file_name = dir.get_next()
while file_name != "":
if not dir.current_is_dir():
var event = load(path + "/" + file_name)
if not dict.has(event.id):
dict[event.id] = event
else:
printerr("Error, duplicate id detected: " + str(event.id))
file_name = dir.get_next()
dir.list_dir_end()
else:
printerr("An error occurred when trying to access the path.")
func display_choice(event: Event):
get_tree().call_group("entities", "pause")
var scene = load("res://choice.tscn")
var instance = scene.instantiate()
var train = get_tree().get_nodes_in_group("train")[0]
self.add_child(instance)
var pos = train.get_global_position() - (Vector2.ONE * 250)
instance.set_global_position(pos)
var music_change = MusicChange.new()
var goodness = 0.5
if event.bad:
goodness -= randf_range(0.1, 0.5)
if event.good:
goodness += randf_range(0.1, 0.5)
music_player.receive_music_change(music_change)
var choices = instance.init(event, upgrade_dict)
choices.item_activated.connect(_on_choices_item_activated.bind(event))
func display_event_result(result_text: Array):
var scene = load("res://choice.tscn")
var instance = scene.instantiate()
var train = get_tree().get_nodes_in_group("train")[0]
self.add_child(instance)
var pos = train.get_global_position() - (Vector2.ONE * 250)
instance.set_global_position(pos)
var event = events_dict[999]
event.description = ""
for text in result_text:
event.description += text
var choices = instance.init(event, upgrade_dict)
choices.item_activated.connect(_on_choices_item_activated.bind(event))
func apply_effect(effect: GlobalDataSingle.Effect, upgrade: Choice.Upgrade):
var keys = []
var remove = effect == GlobalDataSingle.Effect.removeRandomUpgrade
for key in upgrade_dict.keys():
if upgrade_dict[key] == remove:
keys.append(key)
match effect:
GlobalDataSingle.Effect.triggerHunter:
#TODO: if we don't have time to implement the snail, just apply slow
return apply_effect(GlobalDataSingle.Effect.slowTrain, upgrade)
GlobalDataSingle.Effect.speedTrain:
#TODO: Implement train slowing and speeding effects
return "[color=green]The train's speed increases![/color]"
GlobalDataSingle.Effect.slowTrain:
return "[color=red]The train's speed decreases...[/color]"
GlobalDataSingle.Effect.damageTrain:
change_train_hp(-1)
return "[color=red]The train was damaged![/color]"
GlobalDataSingle.Effect.repairTrain:
if train_hp < train_max_hp:
change_train_hp(1)
return "[color=green]The train was repaired![/color]"
else:
return "The train could not benefit from more repairs."
GlobalDataSingle.Effect.collectFirstIngredient:
ingredients_dict[ingredients_dict.keys()[0]] = true
return "[color=green]" + ingredients_dict.keys()[0] + " found![/color]"
GlobalDataSingle.Effect.collectSecondIngredient:
ingredients_dict[ingredients_dict.keys()[1]] = true
return "[color=green]" + ingredients_dict.keys()[1] + " found![/color]"
GlobalDataSingle.Effect.collectThirdIngredient:
ingredients_dict[ingredients_dict.keys()[2]] = true
return "[color=green]" + ingredients_dict.keys()[2] + " found![/color]"
GlobalDataSingle.Effect.collectRandomIngredient:
var pick_array = []
for key in ingredients_dict.keys():
if not ingredients_dict[key]:
pick_array.append(key)
if pick_array.size() > 0:
ingredients_dict[pick_array.pick_random()] = true
return "[color=green]" + pick_array.pick_random() + " found![/color]"
GlobalDataSingle.Effect.applyUpgrade:
if not upgrade_dict[upgrade]:
upgrade_dict[upgrade] = true
return "[color=green]" + upgrade_names[upgrade] + " upgrade applied![/color]"
else:
return apply_effect(GlobalDataSingle.Effect.repairTrain, upgrade)
GlobalDataSingle.Effect.removeUpgrade:
if not upgrade == Choice.Upgrade.blank:
upgrade_dict[upgrade] = false
return "[color=red]" + upgrade_names[upgrade] + " upgrade removed...[/color]"
else:
return apply_effect(GlobalDataSingle.Effect.damageTrain, upgrade)
GlobalDataSingle.Effect.applyRandomUpgrade:
if keys.size() > 0:
return apply_effect(GlobalDataSingle.Effect.applyUpgrade, keys.pick_random())
else:
return apply_effect(GlobalDataSingle.Effect.repairTrain, upgrade)
GlobalDataSingle.Effect.removeRandomUpgrade:
if keys.size() > 0:
return apply_effect(GlobalDataSingle.Effect.removeUpgrade, keys.pick_random())
GlobalDataSingle.Effect.endGame:
get_tree().quit()
_:
printerr("Effect not recognized: " + str(effect))
func _on_choices_item_activated(index: int, event: Event):
get_tree().call_group("event", "queue_free")
var choice = event.choice_list[index]
var effect_list = choice.effect_list
var next_event_id = choice.next_event_id
var result_text = [choice.result_text]
for effect in effect_list:
result_text.append("\n")
result_text.append(apply_effect(effect, choice.upgrade))
#print(result_text)
if result_text[0] != "":
display_event_result(result_text)
elif next_event_id > -1:
display_choice(events_dict[next_event_id])
elif testing_events:
counter += 1
display_choice(events_dict[counter])
elif not dead:
get_tree().call_group("entities", "unpause")
else:
on_die.emit()
display_choice(events_dict[600])
func _on_trigger_major_event(type: String):
match type:
"Honey":
display_choice(events_dict[500])
"Water":
display_choice(events_dict[501])
"Crystal":
display_choice(events_dict[502])
"Castle":
var elixir = true
for key in ingredients_dict.keys():
if not ingredients_dict[key]:
elixir = false
break
if elixir:
display_choice(events_dict[700])
func _on_trigger_random_event():
var possible_events = []
for key in events_dict.keys():
var event = events_dict[key]
if event.random_event and not event.event_seen:
possible_events.append(key)
var chosen_event = events_dict[possible_events.pick_random()]
#events_dict[chosen_event.id].event_seen = true
display_choice(chosen_event)
func change_train_hp(change: int):
train_hp += change
var hp_bar = get_tree().get_nodes_in_group("hp_bar")[0]
hp_bar.set_value(train_hp)
if train_hp <= 0:
dead = true
# Change music because dead
var music_change = MusicChange.new()
music_change.energy = 0.0
music_change.goodness = 0.0
music_change.is_additive = false
MusicPlayer.instance.receive_music_change(music_change)
on_die.emit()
# Emit the right sfx signal
if change > 0:
on_gained_hp.emit()
elif change < 0:
on_lost_hp.emit()