You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.5 KiB
51 lines
1.5 KiB
2 years ago
|
import json
|
||
|
import hra.config as config
|
||
|
import hra.db as db
|
||
|
|
||
|
class DuplicitMakeStep(Exception):
|
||
|
pass
|
||
|
|
||
|
def game_step(game_id: int):
|
||
|
ses = db.get_session()
|
||
|
|
||
|
ses.expire_all()
|
||
|
game = ses.query(db.Game).filter_by(game_id=game_id).with_for_update().one_or_none()
|
||
|
assert game is not None
|
||
|
if game.working_on_next_state:
|
||
|
ses.commit()
|
||
|
raise DuplicitMakeStep()
|
||
|
game.working_on_next_state = True
|
||
|
ses.commit()
|
||
|
|
||
|
old_round_id = game.current_round
|
||
|
new_round_id = old_round_id + 1
|
||
|
old_state = ses.query(db.State).filter_by(game_id=game.game_id, round=old_round_id).one_or_none()
|
||
|
|
||
|
moves = [None for _ in range(game.teams_count)]
|
||
|
for i in ses.query(db.Move).filter_by(game_id=game.game_id, round=old_round_id).all():
|
||
|
moves[i.team_id] = i.move
|
||
|
|
||
|
ses.commit()
|
||
|
|
||
|
x, points = game.get_logic().step(old_state.state, moves, old_round_id)
|
||
|
|
||
|
new_state = db.State(game_id=game.game_id, round=new_round_id, state=x)
|
||
|
ses.add(new_state)
|
||
|
|
||
|
ses.expire_all()
|
||
|
game = ses.query(db.Game).filter_by(game_id=game_id).with_for_update().one_or_none()
|
||
|
assert game is not None
|
||
|
assert game.working_on_next_state
|
||
|
game.current_round = new_round_id
|
||
|
game.working_on_next_state = False
|
||
|
ses.commit()
|
||
|
|
||
|
def game_restore_broken(game_id: int) -> None:
|
||
|
ses = db.get_session()
|
||
|
ses.expire_all()
|
||
|
game = ses.query(db.Game).filter_by(game_id=game_id).with_for_update().one_or_none()
|
||
|
game.working_on_next_state = False
|
||
|
ses.commit()
|
||
|
|
||
|
|