2009-11-02 3 views
0

Я работаю над симулятором 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 раз и переписывать всю вещь.

ответ

1

Я бы предложил использовать подходящую базу данных, такую ​​как SQLite или SQLExpress, чтобы вы могли настроить отношения и нормализовать свои данные (например, без списков с разделителями-запятыми).

Придумывание движка правил будет сложным для Магии; Эффекты могут делать всевозможные сумасшедшие вещи, и ваш движок правил должен будет разместить все их. По сути, вы будете воссоздавать механизм правил из игр Magic: The Gathering для того, чтобы знать, что произойдет и когда.

+0

Я рассмотрел использование SQL, но я думаю, что затраты на запрос для этого типа базы данных были бы огромны по сравнению с временем поиска/чтения XML-документа. Мое рассуждение состоит в том, что мне нужно загружать только 40-70 карт на одного игрока, а не всю библиотеку. Тем не менее, я не сделал математики, чтобы поддержать заявку на исполнение. И да, мне придется в основном пересоздать движок, но я думаю, что есть эффективный способ сделать это. – Boerema

+0

Базы данных, как правило, быстрее, чем синтаксический анализ XML. Вам нужно только выполнить запросы один раз, так как вы по существу превратите все карты в объекты на C#, чтобы их можно было подключить к движку правил. Вы не должны читать данные более одного раза в такой ситуации. – Soviut

+0

Чтобы придумать механизм правил, вам в основном нужно записать каждое стандартное правило в игре (когда нажать, когда рисовать, когда эффекты могут быть запущены и т. Д.) Записать их вниз, а затем начать добавлять все возможные правила эффекта к списку. После того, как вы получите полный список, организуйте их на основе характеристик. Эти характеристики составляют строительные блоки для ваших правил. Затем вы объединяете правила для каждой из своих карт. – Soviut

Смежные вопросы