Как организовать синхронизацию игрового мира между клиентом и сервером?
Очень широкая тема. Про это книги пишут. Вот пара общих советовДелайте клиента в браузере, меньше хлопот, шире аудитория. Такой выбор ограничивает транспорт до websocket и формат данных до JSON(ну еще msgpack).Синхронизируя распределенное состояние сверяйте не весь массив, а только его пошаговые изменения как делают git и rsync (по возможности используйте не shared state , а message passing) Весь массив можно иногда проверять на консистентность его hash суммой.Накапливайте состояние на сервере, как последовательность изменений адресованное hash суммой, как и делает git.(тут гуглить content addressable store)При поиске консенсуса используйте не 'кто первый', а 'он знает, что я знаю'. (тут гуглить protocol consensus)Определитесь, какая степень дублирования данных на сервере и клиентах достаточна для консистентности игры и приемлема по цене ресурсов. (тут гуглить sharding replication)
Нахрена их синхронизировать?
TCP для квест принял-квест отдал и для юнит трям побежал сям.
UDP если захотите устраивать бомбардировку пакетами.
Кеширование для "горячих" вещей, бд для "тёплых" и более-менее статических. Вам же не карту рендерить на сервере. Почитайте про толстый-тонкий клиент.