184 lines
6.3 KiB
GDScript3
184 lines
6.3 KiB
GDScript3
extends Spatial
|
|
|
|
# Declare member variables here. Examples:
|
|
# var a = 2
|
|
# var b = "text"
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
var frame_tf: Transform = Transform()
|
|
var ball_game : BallGameAI3D
|
|
var master
|
|
|
|
func master_control(pos):
|
|
print("walkto: ", pos)
|
|
var n = lerp(world.master_node.get_walk_speed(), 3.8, 0.1)
|
|
world.master_node.set_walk_speed(n)
|
|
master.walkto(pos)
|
|
|
|
func update_quests():
|
|
$info/task/task.text = "No active tasks"
|
|
for q in world.quests:
|
|
if q.is_active():
|
|
$info/task/task.text = q.get_cur_task_text()
|
|
break
|
|
for q in world.quests:
|
|
if q.is_active():
|
|
q.update()
|
|
func start_quest(quest: Quest):
|
|
notifications.quest_notfication(quest.get_title(), quest.get_description())
|
|
func complete_quest(quest: Quest):
|
|
notifications.quest_complete_notfication(quest.get_title(), quest.get_description())
|
|
|
|
func start_interaction(obj):
|
|
print("started interaction")
|
|
if obj.is_in_group("characters"):
|
|
$interaction.start_interaction(obj)
|
|
else:
|
|
obj.activate()
|
|
|
|
func start_training(ball):
|
|
print("start training")
|
|
ball_game = BallGameAI3D.new()
|
|
var t0 = $team0
|
|
var t1 = $team1
|
|
for k in t0.get_children():
|
|
if k.name.begins_with("cheer"):
|
|
ball_game.add_cheer_game_location(0, k.global_transform.origin)
|
|
elif k.name == "start":
|
|
ball_game.set_team_start(0, k.global_transform.origin)
|
|
elif k.name == "gate":
|
|
ball_game.set_team_gate(0, k)
|
|
for k in t1.get_children():
|
|
if k.name.begins_with("cheer"):
|
|
ball_game.add_cheer_game_location(1, k.global_transform.origin)
|
|
elif k.name == "start":
|
|
ball_game.set_team_start(1, k.global_transform.origin)
|
|
elif k.name == "gate":
|
|
ball_game.set_team_gate(1, k)
|
|
var t_start = randi() % 2
|
|
for ch in world.cheer_team.keys():
|
|
assert(world.cheer_team[ch] != null)
|
|
ball_game.add_cheer(t_start, world.cheer_team[ch])
|
|
t_start ^= 1
|
|
for ch in world.team.keys():
|
|
assert(world.team[ch] != null)
|
|
ball_game.add_player(t_start, world.team[ch])
|
|
t_start ^= 1
|
|
ball_game.set_ball(ball)
|
|
ball_game.set_main(self)
|
|
add_child(ball_game)
|
|
ball_game.connect("stopped_game", self, "stop_training")
|
|
ball_game.connect("started_game", self, "init_training")
|
|
ball_game.connect("update_score", self, "update_training")
|
|
ball_game.start_game()
|
|
func stop_training(score):
|
|
print("score:", score)
|
|
ball_game.queue_free()
|
|
world.team_train_count += 1
|
|
$score.hide()
|
|
func init_training(score):
|
|
$score.show()
|
|
$score.release_focus()
|
|
update_training(score)
|
|
func update_training(score):
|
|
var v:String = ""
|
|
var sdata = []
|
|
for k in score.keys():
|
|
sdata.push_back("%02d" % (score[k]))
|
|
print("score update = ", score)
|
|
v = PoolStringArray(sdata).join(":")
|
|
$score/v/l.text = v
|
|
$score/v/footer.text = "%.1f seconds left" % (ball_game.max_training_time - ball_game.training_time)
|
|
|
|
func spawn_character(cd, xform, k):
|
|
var char_sc = characters.spawn_character(cd.gender, xform)
|
|
cd.scene = char_sc
|
|
if !cd.has("look"):
|
|
cd.look = {}
|
|
for k in characters.get_modifier_list(char_sc):
|
|
cd.look[k] = (randf() - 0.5) * 1.7
|
|
for k in cd.look:
|
|
characters.set_modifier_value(char_sc, k, cd.look[k])
|
|
cd.id = k
|
|
char_sc.set_meta("data", cd)
|
|
return char_sc
|
|
func characters_done():
|
|
characters.update()
|
|
characters.update()
|
|
|
|
func _ready():
|
|
notifications.set_main(self)
|
|
var tstart = $nav/navmesh/level_level
|
|
world.arrow = $Camera/arrow
|
|
var queue = [tstart]
|
|
while queue.size() > 0:
|
|
var item = queue[0]
|
|
queue.pop_front()
|
|
if item is StaticBody:
|
|
item.collision_layer = 512
|
|
item.collision_mask = 1 | 512
|
|
for c in item.get_children():
|
|
queue.push_back(c)
|
|
var master_xform = $master.global_transform
|
|
$master.queue_free()
|
|
master = characters.spawn_character(0, master_xform)
|
|
master.add_to_group("master")
|
|
for e in world.master_stats.look.keys():
|
|
characters.set_modifier_value(master,
|
|
e, world.master_stats.look[e])
|
|
controls.master_node = master
|
|
world.master_node = master
|
|
# $master.add_to_group("master")
|
|
# controls.master_node = $master
|
|
# world.master_node = $master
|
|
world.init_data()
|
|
world.nav = $nav
|
|
controls.camera = $Camera
|
|
controls.connect("user_click", self, "master_control")
|
|
for k in world.line.keys():
|
|
var cd = world.line[k]
|
|
var char_xform = Transform()
|
|
var nav: Navigation = get_node("nav")
|
|
var p = nav.get_closest_point(get_node("line_spawn").global_transform.origin + Vector3(randf() * 20.0 - 10.0, 0.0, randf() * 20 - 10.0))
|
|
char_xform.origin = p
|
|
call_deferred("spawn_character", cd, char_xform, k)
|
|
call_deferred("characters_done")
|
|
var tut_quest = Quest.new("Tutorial", "This quest shortly introduces to a game")
|
|
tut_quest.connect("started", self, "start_quest")
|
|
tut_quest.connect("complete", self, "complete_quest")
|
|
world.quests.push_back(tut_quest)
|
|
var tut1_quest = WalkQuest.new("Walk to closet room", "Walk to closet room designated location", get_node("quest_dst_closet"))
|
|
tut1_quest.connect("started", self, "start_quest")
|
|
tut1_quest.connect("complete", self, "complete_quest")
|
|
var tut2_quest = StatsQuest.new("Hire 6 team members", "Hire six team members to start with your team", {"player_count": 6})
|
|
tut2_quest.connect("started", self, "start_quest")
|
|
tut2_quest.connect("complete", self, "complete_quest")
|
|
var tut3_quest = WalkQuest.new("Walk to gym", "Walk to gym designated location", get_node("quest_dst_gym"))
|
|
tut3_quest.connect("started", self, "start_quest")
|
|
tut3_quest.connect("complete", self, "complete_quest")
|
|
var tut4_quest = StatsQuest.new("Train your team once", "Complete your team training once", {"team_train_count": 1})
|
|
tut4_quest.connect("started", self, "start_quest")
|
|
tut4_quest.connect("complete", self, "complete_quest")
|
|
tut1_quest.set_next_quest(tut2_quest)
|
|
tut2_quest.set_next_quest(tut3_quest)
|
|
tut3_quest.set_next_quest(tut4_quest)
|
|
tut_quest.add_child(tut1_quest)
|
|
tut_quest.start()
|
|
update_quests()
|
|
var quest_timer : = Timer.new()
|
|
quest_timer.wait_time = 2.0
|
|
add_child(quest_timer)
|
|
quest_timer.connect("timeout", self, "update_quests")
|
|
quest_timer.start()
|
|
controls.connect("action1", self, "start_interaction")
|
|
world.connect("start_training", self, "start_training")
|
|
$info/task/show_journal.connect("pressed", $quest_journal, "show")
|
|
$score.hide()
|
|
|
|
func _process(delta):
|
|
var pos = master.global_transform.origin
|
|
pos.y = $Camera.global_transform.origin.y
|
|
$Camera.global_transform.origin = $Camera.global_transform.origin.linear_interpolate(pos, 0.8 * delta)
|
|
if $score.visible && ball_game != null:
|
|
update_training(ball_game._scores)
|