RapidGameFramework
Reusable Godot managers for data-driven small games
Loading...
Searching...
No Matches
match_manager.gd
Go to the documentation of this file.
1extends RefCounted
2
3
6
7var players := []
8var scores := {}
9var target_score := 5
10var round := 1
11var elapsed := 0.0
12var active := false
13var winner := ""
14
15
16
17func configure(player_ids:Array = ["left", "right"], score_to_win:int = 5) -> void:
18 players = []
19 scores.clear()
20 for id in player_ids:
21 var player_id = str(id)
22 players.append(player_id)
23 scores[player_id] = 0
24 target_score = max(1, score_to_win)
25 round = 1
26 elapsed = 0.0
27 active = false
28 winner = ""
29
30
31
32func start() -> void:
33 if players.is_empty():
34 configure()
35 active = true
36 winner = ""
37
38
39
40func pause() -> void:
41 active = false
42
43
44
45func tick(delta:float) -> void:
46 if active:
47 elapsed += max(0.0, delta)
48
49
50
51func add_score(player_id:String, amount:int = 1) -> bool:
52 if not scores.has(player_id):
53 scores[player_id] = 0
54 scores[player_id] = int(scores[player_id]) + amount
55 if int(scores[player_id]) >= target_score:
56 winner = player_id
57 active = false
58 return true
59 return false
60
61
62
63func next_round() -> void:
64 round += 1
65 active = true
66
67
68
69func get_score(player_id:String) -> int:
70 return int(scores.get(player_id, 0))
71
72
73
74func get_state() -> Dictionary:
75 return {
76 "players": players.duplicate(true),
77 "scores": scores.duplicate(true),
78 "target_score": target_score,
79 "round": round,
80 "elapsed": elapsed,
81 "active": active,
82 "winner": winner
83 }
84
85
86
87func apply_state(state:Dictionary) -> void:
88 players = state.get("players", []).duplicate(true)
89 scores = state.get("scores", {}).duplicate(true)
90 target_score = int(state.get("target_score", 5))
91 round = int(state.get("round", 1))
92 elapsed = float(state.get("elapsed", 0.0))
93 active = bool(state.get("active", false))
94 winner = str(state.get("winner", ""))
int
Award points and return true if the match is now complete.