Mud Designer

Posted: Июль 31, 2011 in .NET

About

Речь пойдет об исходниках одного итересного Mud-движка http://muddesigner.codeplex.com Не то чтобы он сильно классный, но что-то меня в нем зацепило.

Logger

Простейший логер. Конечно есть NLog, log4j, хороший логер у Enterprise Library… Но всегда так хочется создать свой простейший логер.

Client-Server

Клиент и сервер на сокетах. Сервер содержит серверный поток, который создает клиентские потоки, список BaseCharacter и соответствующий список клиентских потоков, которые слушают, что им посылают BaseCharacter (_players[sub].Receive(_players[sub].ReadInput())). Здесь инфраструктурная логика смешивается с игровой: у BaseCharacter есть свой Socket, через который он может подключаться, отключаться и посылать команды.

Script Engine

Очередной этюд на тему плагинов. Просто берет все исходники из определенной папки, и компилируют в библиотеку. Конечно, проще было бы использовать какой-нибудь Ioc-контейнер, но ведь это не так интересно, как свой велосипед. Кстати, этот скриптовый движок выделен в отдельный проект http://rscript.codeplex.com/

MUD Engine — игровой мир.

GameManagement

Есть Game, который отвечает за инфраструктуру (Start, Save, Shutdown, IsMultiplayer). Есть GameWorld — это собственно сам игровой мир: локации, монстры… SecurityRoles — роли. Интересная сущность — GameTime: нигде не используется, но полезно иметь такую абстракцию. Также в игре есть система команд. Каждая команда реализует IGameCommand.

Characters

BaseCharacter — класс персонажа. Других классов в движке замечено не было. Понятно, что этот класс сделан из расчета на расширение. Среди основных статов присутствуют Strength, Dexterity, Constitution, Intelligence, Wisdom, Charisma. Также у него есть чувства! Персонаж умеет себя сохранять (опять инфраструктурные вещи). У персонажа есть Inventory, где хранятся BaseItem. BaseCharacter является AggregateRoot, то есть содержит в себе Inventory. Очевидно, что Inventory должен быть идентифицирован, при этом он никому не интересен без персонажа.

Environment

Включает в себя Realm, которые содержат Zone, которые содержат Room, в которых есть Door. Также есть StartingLocation и TravelDirections. Realm, Zone и Room наследуют от BaseObject, соответственно также умеют себя сохранять. BaseObject является Entity-классом. Door — это простой Value-класс, даже не Entity.

FileSystem

Здесь находятся инфраструктурные классы по сохранению/восстановлению игры. По сути FileManager выполняет роль репозитория.

Conclusion

В общем движок получился замечательным. Несмотря не некоторые огрехи, код читается легко. Даже вплетение функционала от разных сервисов в одном классе не кажется просчетом автора, а, наоборот, избавляет он целой плеяды абстракций-сервисов.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s