Я работаю над симулятором Magic The Gathering. Я не нашел никаких бесплатных систем, которые позволят вам создавать свои собственные колоды, которые также управляют игрой (жизнь/ударная вязкость, счетчики, срабатывающие события и т. Д.).Динамические обратные вызовы из динамических ресурсов
Моя проблема заключается в том, что мне нужно найти эффективный способ запуска событий для карт, которые находятся в игре. Я представляя списки карт хранятся в формате XML и содержащие идентификаторы для действий, которые они принимают, как следует:
<card>
<name>Bloodghast</name>
<cost>BB</cost>
<type>Creature</type>
<subtypes>Vampire,Spirit</subtypes>
<stats>2,1</stats>
<color>B</color>
<attributes>
<attribute>
<id>C41</id>
<description>Bloodghast can't block.</description>
</attribute>
<attribute>
<id>C42</id>
<description>Bloodghast has haste as long as an opponent has 10 or less life/</description>
</attribute>
<attribute>
<id>LF5</id>
<description>Landfall - Whenever a land enters the battlefield under your control, you may return Bloodghast from your graveyard to the battlefield.</description>
</attribute>
</attributes>
Извините за что многословным (и, вероятно, не понятно для тех, кто на самом деле не играть в Magic). Поэтому я прочитал бы это дерево для каждой карты, загруженной для колоды. Мне нужен способ привязать атрибуты карты к «игровому движку», так что, например, когда общая продолжительность жизни игрока падает ниже 10 Bloodghast, то ускоряется, или когда играется в землю, двигатель позволит мне схватить его из моего кладбища. Для тех, кто не играл в Magic, другими примерами было бы то, что некоторые карты запускают действие, когда игрок отбрасывает карту или играет заклинание определенного цвета.
Я думал, что, вероятно, должен был иметь обработчик событий в двигателе для каждого обстоятельства, которое могло бы вызвать событие (игрок играет заклинание, общие изменения в жизни игрока) и что каждая карта должна каким-то образом добавить элемент в некоторый список позволяет привязать себя к этому событию, но я даже не мог придумать, как это сделать.
Любая помощь была бы принята с благодарностью. Я довольно приличный программист, но я предпочел бы не начинать этот проект 5 раз и переписывать всю вещь.
Я рассмотрел использование SQL, но я думаю, что затраты на запрос для этого типа базы данных были бы огромны по сравнению с временем поиска/чтения XML-документа. Мое рассуждение состоит в том, что мне нужно загружать только 40-70 карт на одного игрока, а не всю библиотеку. Тем не менее, я не сделал математики, чтобы поддержать заявку на исполнение. И да, мне придется в основном пересоздать движок, но я думаю, что есть эффективный способ сделать это. – Boerema
Базы данных, как правило, быстрее, чем синтаксический анализ XML. Вам нужно только выполнить запросы один раз, так как вы по существу превратите все карты в объекты на C#, чтобы их можно было подключить к движку правил. Вы не должны читать данные более одного раза в такой ситуации. – Soviut
Чтобы придумать механизм правил, вам в основном нужно записать каждое стандартное правило в игре (когда нажать, когда рисовать, когда эффекты могут быть запущены и т. Д.) Записать их вниз, а затем начать добавлять все возможные правила эффекта к списку. После того, как вы получите полный список, организуйте их на основе характеристик. Эти характеристики составляют строительные блоки для ваших правил. Затем вы объединяете правила для каждой из своих карт. – Soviut