Ball implemented, started work on game AI
This commit is contained in:
92
proto2/ai/ball_game_ai3d.gd
Normal file
92
proto2/ai/ball_game_ai3d.gd
Normal file
@@ -0,0 +1,92 @@
|
||||
extends Node
|
||||
class_name BallGameAI3D
|
||||
|
||||
var _cheers = {}
|
||||
var _game_area: AABB
|
||||
var _teams = {}
|
||||
var _main
|
||||
var _state = STATE_INIT
|
||||
var _ball_instance
|
||||
var _cheer_locations = {}
|
||||
var _team_start = {}
|
||||
var _ball_carrier = null
|
||||
var _ball_team = -1
|
||||
var ch2team: Dictionary = {}
|
||||
var gate2team = {}
|
||||
var _gates = {}
|
||||
var _scores = {}
|
||||
|
||||
enum {STATE_INIT, STATE_START, STATE_RUNNING, STATE_FINISH}
|
||||
func _ready():
|
||||
_game_area = AABB()
|
||||
|
||||
func set_ball(ball: Node):
|
||||
_ball_instance = ball
|
||||
|
||||
func add_player(team: int, pl: Dictionary):
|
||||
if !_teams.has(team):
|
||||
_teams[team] = [pl]
|
||||
else:
|
||||
_teams[team].push_back(pl)
|
||||
assert pl != null
|
||||
ch2team[pl.scene] = team
|
||||
func add_cheer(team: int, ch: Dictionary):
|
||||
if !_cheers.has(team):
|
||||
_cheers[team] = [ch]
|
||||
else:
|
||||
_cheers[team].push_back(ch)
|
||||
assert ch != null
|
||||
ch2team[ch.scene] = team
|
||||
func add_cheer_game_location(team: int, loc: Vector3):
|
||||
if !_cheer_locations.has(team):
|
||||
_cheer_locations[team] = [loc]
|
||||
else:
|
||||
_cheer_locations[team].push_back(loc)
|
||||
_game_area = _game_area.expand(loc)
|
||||
func set_team_start(team: int, v: Vector3):
|
||||
_team_start[team] = v
|
||||
_game_area = _game_area.expand(v)
|
||||
func set_team_gate(team: int, gate: Area):
|
||||
_gates[team] = gate
|
||||
gate2team[gate] = team
|
||||
gate.connect("body_entered", self, "check_goal", [gate])
|
||||
var o : = gate.global_transform.origin
|
||||
_game_area = _game_area.expand(o)
|
||||
func set_main(n):
|
||||
_main = n
|
||||
func start_game():
|
||||
var ball = _ball_instance
|
||||
ball.add_to_group("ball")
|
||||
_state = STATE_START
|
||||
for t in _teams.keys():
|
||||
for ch in _teams[t]:
|
||||
assert ch != null
|
||||
print(ch)
|
||||
assert ch.scene != null
|
||||
print("start: ", _team_start[t])
|
||||
ch.scene.walkto(_team_start[t])
|
||||
var loc = 0
|
||||
for t in _cheers.keys():
|
||||
for ch in _cheers[t]:
|
||||
assert ch != null
|
||||
print(ch)
|
||||
assert ch.scene != null
|
||||
ch.scene.walkto(_cheer_locations[t][loc % _cheer_locations[t].size()])
|
||||
loc += 1
|
||||
for t in _teams.keys():
|
||||
_scores[t] = 0
|
||||
func stop_game():
|
||||
# for k in get_tree().get_nodes_in_group("ball"):
|
||||
# k.queue_free()
|
||||
_state = STATE_INIT
|
||||
var max_score = -1
|
||||
var winner_team = -1
|
||||
for k in _scores.keys():
|
||||
if _scores[k] > max_score:
|
||||
max_score = _scores[k]
|
||||
winner_team = k
|
||||
if winner_team >= 0:
|
||||
for e in _teams[winner_team]:
|
||||
world.increase_xp(e, min(e.xp * 2, min(100 * e.level, 1000)))
|
||||
for e in _cheers[winner_team]:
|
||||
world.increase_xp(e, min(e.xp * 2, min(200 * e.level, 2000)))
|
||||
Reference in New Issue
Block a user