A generic matchmaking server, that you can use for your game.
- Set up the DB
- Configure game parameters in
application.conf
- Start the server
- Tell the matchmaker about your players
- Ask to create a new match
Currently only 1vs1 game mode is supported
In the configuration you specify the desired maximum time limit, tolerance and maximum skill. Let's discuss how these parameters are used to provide the most suitable matchmaking behavior.
The tolerance should be between 0 and 1 and controls your preference on speed and accuracy of matchmaking.
Values closer to 1 favour the speed, so matchmaking will be fast but difference in skill can be huge.
Values closer to 0 let the matchmaking wait a little bit more and select the match with minimum skill difference.
The time limit param specifies the time by which we should definitely find a match. So the closer to time limit the more tolerant matchmaking will become to huge skill differences.
The maximum possible value of skill in your game. Used to properly calculate ratios of differences in skill.
Configuration should be put in application.conf
in resources
folder.
matchmaking = {
tolerance = 0.5,
time-limit-sec = 10,
max-skill = 100
}
db = {
username = "postgres",
password = "docker"
}
Here is an example DB setup with docker containers. Pay attention that db name should be raiders
.
And also the database engine should be Postgres.
docker pull postgres
mkdir -p $HOME/docker/volumes/postgres
docker run --rm --name pg-docker -e POSTGRES_PASSWORD=docker -d -p 5432:5432 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres
createdb -h localhost -U postgres raiders
You can find a helpful article on DB setup with docker here: https://hackernoon.com/dont-install-postgres-docker-pull-postgres-bee20e200198
curl -d '{"skill":99}' http://localhost:8080/player/add
# Output: {"id":1}
curl -d '{"skill":98}' http://localhost:8080/player/add
# Output: {"id":2}
curl http://localhost:8080/player/1/search/match/1vs1
# Output: Started searching
curl http://localhost:8080/player/2/search/match/1vs1
# Output: Started searching
curl http://localhost:8080/player/1/search/status
# Output: {"matchId":1,"status":"FOUND"}
curl http://localhost:8080/match/1/players
# Output: {"players":[1,2]}
curl http://localhost:8080/match/1/accept
# Output: Match 1 have been accepted, the data about this match will be deleted.
Sadly it's impossible to generate OpenAPI documentation from raw http4s endpoints.
But hopefully the http4s endpoints themselves should be rather descriptive, so you can find them in Main.scala
.
And also example is provided on top with the basic service usage.
Here is a not very formal spec of endpoints:
- POST /player/add ACCEPTS BODY {"skill": int} RETURNS OK({"id": int})
- GET /player/{id}/remove RETURNS OK(Player removed) or NotFound(message)
- GET /player/{id}/set/skill/{newSkillValue} RETURNS OK(Skill set) or NotFound(message)
- GET /player/{id}/search/match/1vs1 RETURNS OK(Search started)
- GET /player/{id}/search/status RETURNS OK({"status": "SEARCHING"} | {"status: "FOUND", "matchId": int} | {"status": "SEARCH NOT STARTED"})
- GET /match/{id}/players RETURNS OK({"players": [playerId: int]})
- GET /match/{id}/accept RETURNS OK(Match accepted, data will be deleted.)
Support custom matchmaking params and formulas. Support other game modes.