GAME_01
GAME_01 is a multi services scalable MMORPG server
GAME_01 is an UDP client/server with its own ACK protocol. Client writes user action and send them to API while receiving world data from sync. Core establish world rules and events order.
client <-> api -> core -> redis-lru
redis-lru -> sync -> client
Authentication and char creation/connect is handled by auth and associate a session token at each signin.
Revoker regularly revokes unused tokens.
GAME_01 also comes with a Tool API to create world data like entities/abilities/sectors.
Code architecture
_bin #executables
|
|_cmd_ #executables code
| |_api #UDP API for game events + ACK client
| |_auth #HTTPS JSON API for signin/connect
| |_client #client/server to communicate with API and JSON serialize
| |_core #order and apply game events
| |_revoker #revoke unused tokens
| |_sync #send entity data to clients
| |_tool #HTTPS JSON API for world data. Must be private.
|
|_configs #config files
|
|_docker #docker files
|
|_pkg_ #common code
| |_ability #domain
| |_account #domain
| |_dto #external format input/output
| |_entity #domain
| |_event #domain
| |_geometry #domain
| |_infra #domain
| |_mocks #domain mocks
| |_sector #domain
| |_storage #domain mapper implementations
| |_ulid #domain
| |_usecase #domain aggregations
|
|_templates #example template files for tool
|
|_vendor #vendoring packages (dep)
Installation
OS X & Linux & Windows:
go get -u github.com/elojah/game_01
Development setup
# Start services
docker-compose -d
make dep
make sync && bin/game_sync configs/config_sync.json
make core && bin/game_core configs/config_core.json
make api && bin/game_api configs/config_api.json
make auth && bin/game_auth configs/config_auth.json
make tool && bin/game_tool configs/config_tool.json
Usage example
# Fill static data
curl -k -X POST https://127.0.0.1:8081/entity/template -d @templates/entity_templates.json
curl -k -X POST https://127.0.0.1:8081/sector -d @templates/sector.json
curl -k -X POST https://127.0.0.1:8081/sector/starter -d @templates/sector_starter.json
# Obtain access token
curl -k -X POST https://127.0.0.1:8080/subscribe -d '{"username": "test", "password": "test"}'
curl -k -X POST https://127.0.0.1:8080/signin -d '{"username": "test", "password": "testtest"}'
{"ID":"01CJ1R3RNSM30M5JSSZ0PCY2T3"}
curl -k -X POST https://127.0.0.1:8080/pc/create -d '{"token":"01CJ1R3RNSM30M5JSSZ0PCY2T3","type":"01CE3J5ASXJSVC405QTES4M221", "name": "roger_lemour"}'
# Token is token obtained at signin and type is an entity ID described in templates/entity_templates.json.
curl -k -X POST https://127.0.0.1:8080/pc/list -d '{"token":"01CJ1R3RNSM30M5JSSZ0PCY2T3"}'
[{"id":"01CHX275W59NGGJ072YFY7RT29","type":"00000000000000000000000000","name":"mesmerist","hp":150,"mp":250,"position":{"Coord":{"x":39.19956060954395,"y":37.77876652333657,"z":36.315239570760646},"SectorID":"01CF001HTBA3CDR1ERJ6RF183A"}}]
curl -k -X POST https://127.0.0.1:8080/pc/connect -d '{"token":"01CJ1R3RNSM30M5JSSZ0PCY2T3","target":"01CHX275W59NGGJ072YFY7RT29"}'
{"ID":"01CHX2RB2DHJYJ2XAWBYVBMGB9"}
# Target is a PC ID in /list results
# Paste token in config_client.json: {... "app": {"token": 01CJ1R3RNSM30M5JSSZ0PCY2T3,...}}
make client && bin/game_client configs/config_client.json
{"type":"move","action":{"source":"01CHX2RB2DHJYJ2XAWBYVBMGB9","target":"01CHX2RB2DHJYJ2XAWBYVBMGB9","position":{"X":94.0164,"Y":80.5287,"Z":70.7539}}}
...
# Disconnect PC only (may reconnect with same token)
curl -k -X POST https://127.0.0.1:8080/pc/disconnect -d '{"token": "01CJ1R3RNSM30M5JSSZ0PCY2T3"}'
# Signout
curl -k -X POST https://127.0.0.1:8080/signout -d '{"username": "test", "token": "01CJ1R3RNSM30M5JSSZ0PCY2T3"}'
For more examples and usage, please refer to the Wiki.
Release History
Elojah – swingcastor@gmail.com
Distributed under the GNU AFFERO GENERAL PUBLIC license. See LICENSE
for more information.
https://github.com/elojah/
Contributing
- Fork it (https://github.com/yourname/yourproject/fork)
- Create your feature branch (
git checkout -b feature/fooBar
)
- Commit your changes (
git commit -am 'Add some fooBar'
)
- Push to the branch (
git push origin feature/fooBar
)
- Create a new Pull Request
TODO
- Remove NATS streaming
- Change log to zap (uber faster log)
- Add context + use it with sync.errgroup
- Use TCP + rename UDP to mux
- Set new https service to create new token
- Set new bin to read events
- Add NATS mqueue to cancel replay mechanism (in context usage ?)
- Fix NATS slow consumer, mouais
- Add
sequencer_test.go
, 100% plz (ok)
- Add state/entity service impl + interactions
- Handle token permissions/entity actions (linked to above)
- Refacto skill mechanic to be like class definition (json template + tool)
- Cast/Skill can have multiple effects on multiple targets
- AbilityFeedback service get/set
- Add core app handler skill
- Implement SkillFeedback mechanism
- Response server to update all clients with delta compression named
sync
- Think about entity interactions limit to "what's around" to scale efficiently (
tile38
Entity Service) ?
- recurrer test 100%
- ack service
- Edit
client
to make it sensitive to sync
calls and save in a local rocksdb ? + first graphic client
- Split auth (with set/list/connect PC) and remove all pc stuff elsewhere.
- Add token revoker after X incativity
- Change EntitySubset key string into ID ID
- Add redis services for core and syncs ids apps
- Add redis service for initial positions.
- Move all Start into Dial (for clean/up down)
- Add up/down mechanic
- Save pool ID in token.
- Save PC + Delete all token-associated data.
- Add use cases for entity (create/delete) and token(create/delete)
- Switch nats to redis pub/sub
- Add Pool for listeners + ListenerMapper Set/Get
- Del for everything (not yet but token/entity ok)
- Put everything as usecase and use (almost) only them in controllers (not yet but entity/token ok)
- Prevent multiple /signin -> retrieve multiple tokens
- Add server ack sending to client <-done and client resend
- Add Name at create PC
- Add account disconnect /account/disconnect -d {"username"} (disconnect token + delete token + reset account.Token)
- Integration test binary with correct set
- Add minimal graphic interface to client (minimal calls and print entity states)
- Implement tool to generate/check/visualize sectors and entity movements
- Add context everywhere
TO DEBATE
- Add sequencer cancelling mechanism (CancelEvent(id)->id(don't do me)->event...)
- Add cast time mechanic
RANDOM
-
Trickster
entity can switch position with his own entities and switch them
-
Mesmerist
entity can take control of enemy entities
-
Inquisitor
entity can merge entities (allies/enemies)
-
Totemist
entity can clone his own entities
-
Scavenger
entity can sacrify his own entities