Пример #1
0
def end_game(game_name, run_id):
    # global game
    game = manager.get_game(game_name)
    if game is None or game.curr_run_id != run_id or game.done:
        return
    print(f"\n--\nEnding run {game.curr_run_id+1}\n--\n")
    with app.test_request_context('/'):
        # 1: get current place
        (city_name, hint), (lon, lat) = game.current.place
        answer = dict(name=city_name, lon=lon, lat=lat)

        # 2: end game
        records = game.current.records
        results, done = game.end()
        socketio.emit("run-end",
                      dict(results=records, answer=answer, leaderboard=game.get_current_leaderboard(), done=done),
                        json=True, broadcast=True, room=game_name
                      )

        # 3: continue?
        if done:
            #
            timers[game_name] = wait_and_run(game.wait_time, terminate_game, game_name)
            # timers[game_name] = threading.Timer(game.wait_time, terminate_game, [game_name])  # run_launcher(game_name))
            # timers[game_name].start()
        else:
            timers[game_name] = wait_and_run(game.wait_time, launch_run, game_name, game.curr_run_id)
Пример #2
0
def launch_game():
    game_name = session["game"]
    game = manager.get_game(game_name)
    game.launch() # GameRun(players)
    emit("game-launched", dict(game=game.map_name, runs=game.n_run, diff=game.difficulty), json=True, broadcast=True, room=game_name)

    wait_and_run(3, launch_run, game_name, game.curr_run_id)
Пример #3
0
def init_game(data):
    game_name = session["game"]
    player = session.get("player", "unknown")
    print(f"Receive <event:connection[to={game_name}> from <player:{player}>")
    if not manager.exists(game_name):
        print(f"Game <game:{game_name}> doesnt exist")
        del session["game"]
        emit("redirect", dict(url=url_for("serve_main")), json=True)
        # return redirect(url_for("serve_main"))

    join_room(game_name)
    game = manager.get_game(game_name)
    if "pseudo" in data and data["pseudo"]:
        pseudo = data["pseudo"]
    else:
        pseudo = None
    if "player" in session:
        player = session["player"]
        print(f"Receive <event:connection> from existing player <player:{player}>")
        if player not in game.players:
            game.add_player(player, pseudo)
    else:
        player, pseudo = game.add_player(pseudo=pseudo)
        session["player"] = player

    print(f"Player <{player}> connected to game <{game_name}> with pseudo <{pseudo}>")
    emit("init", dict(player=player, launched=game.launched, pseudo=pseudo,
            game=game.map_name, runs=game.n_run, diff=game.difficulty,
                      pseudos=game.pseudos))
    emit("new-player", dict(
            player=player,
            pseudo=pseudo,
            leaderboard=game.get_current_leaderboard(),
            pseudos=game.pseudos),
         broadcast=True, room=game_name)
Пример #4
0
def update_pseudo(data):
    game_name = session["game"]
    player = session.get("player")
    if player is None:
        return
    game = manager.get_game(game_name)
    pseudo = data["name"]
    if is_valid_pseudo(pseudo):
        game.add_pseudo(player, pseudo)
    emit("new-name", dict(change=dict(player=player, pseudo=pseudo), pseudos=game.pseudos),
         room=game_name, broadcast=True, json=True)
Пример #5
0
def terminate_game(game_name):
    game = manager.get_game(game_name)
    if game is None or not game.done:
        return
    socketio.emit("game-end",
                  dict(
                      leaderboard=game.get_current_leaderboard(),
                      full=game.get_final_results(),
                  ), json=True, broadcast=True,
                  room=game_name)

    # game = Game(players=set(game.players), n_run=N_RUNS, map=game.map_name)
    manager.relaunch_game(game_name)
Пример #6
0
def serve_game(name):
    if not manager.exists(name):
        return redirect(url_for("serve_main"))
    else:
        session["game"] = name
        game_name = session["game"]
        game = manager.get_game(game_name)
        params = dict(
            map=game.map_name,
            wait_time=game.wait_time,
            bbox=game.bbox,
            allow_zoom=game.allow_zoom,
            duration=game.duration)
        return render_template("main.html", game_name=name, params=params, debug=DEBUG or is_local)
Пример #7
0
def launch_run(game_name, run_id):
    # global duration_thread
    game = manager.get_game(game_name)
    if game is None or game.curr_run_id != run_id:
        return
    print(f"--\nLaunching run {game.curr_run_id+1} for game <{game_name}>\n--")
    with app.test_request_context('/'):
        hint = game.current.launch()

        print(f"Hint is '{hint}'")
        socketio.emit("run-start",
                      dict(hint=hint, current=game.curr_run_id, total=game.n_run),
                      json=True,
                      room=game_name,
                      broadcast=True)

        timers[game_name] = wait_and_run(game.current.duration, end_game, game_name, game.curr_run_id)
Пример #8
0
def remove_from_game():
    if "player" not in session:
        return
    player = session["player"]
    game_name = session["game"]
    game = manager.get_game(game_name)
    game.remove_player(player)
    leave_room(game_name)
    emit("player-left", dict(player=player, leaderboard=game.get_current_leaderboard()), broadcast=True, room=game_name)

    print(f"<{player}> disconnected!")

    if not game.players:
        manager.remove_game(game_name)
        close_room(game_name)
        safe_cancel(timers[game_name])
        del timers[game_name]
        print(f"Game <{game_name}> was removed!")
Пример #9
0
def process_guess(data):
    # global duration_thread
    game_name = session["game"]
    game = manager.get_game(game_name)

    player = data["player"]
    print("Receiving guess from", player)
    lon, lat = data["lon"], data["lat"]
    res, done = game.current.process_answer((lon, lat), player)
    res["total_score"] = game.scores[player] + res["score"] # We need to add res["score"] between game.scores isn't updated yet
    emit("log", f"Player <{player}> has scored {res['score']} points", broadcast=True, room=game_name)
    emit("new-guess", dict(player=player, dist=res["dist"], delta=res["delta"], score=res["score"]),
         broadcast=True, room=game_name)
    emit("score", res, json=True)
    if done:
        try:
            print(f"--\nInterrupting run {game.curr_run_id+1}\n--")
            safe_cancel(timers[game_name])
        except AttributeError:
            pass

        end_game(game_name, game.curr_run_id)