Ostatnio na naszym forum
  • Za co je lubicie
    Autor: Bubeusz, napisano 19 listopada 2023 Przejdź
  • Wybór zamku w H1
    Autor: Kasdeya75, napisano 25 października 2023 Przejdź
  • Fheroes 2 - nowy engine do starej gry
    Autor: Hellburn, napisano 11 października 2023 Przejdź
Ostatnio dodane mapy
  • Resurectra
    Autor: Huntka, dodano Zobacz
  • Wizard Pact
    Autor: Robert Lakatos, dodano Zobacz
  • Troll Trails
    Autor: Andy Gels, dodano Zobacz

Losowanie zaklęć w gildiach

Niniejszy artykuł ma w zamiarze w możliwie prosty i zrozumiały sposób opisać techniczną stronę generowania zaklęć w gildiach magów. Przy jego pisaniu posiłkowano się zdekompilowanym kodem gry, który popełnił Darmani (osoba związana z modyfikacją Project Ironfist). Tekst powstał z nadzieją, że poszerzy on wiedzę tych, którzy dążą do poznania szczegółowych informacji na temat Heroes II.

Kliknij tu by pokazać/ukryć fragmenty zdekompilowanego kodu źródłowego. Pokaż szczegóły

Zaklęcia "gwarantowane"

Podobnie jak w innych częściach, zaklęcia są generowane na starcie mapy. Na początku przydzielane są zaklęcia gwarantowane. Pierwsze gwarantowane zaklęcie dotyczy tylko graczy komputerowych grających Nekromantą, przypisując im jeden z dwóch czarów: Drgawki śmierci lub Falę śmierci.

Pierwszą czynnością, którą gra wykonuje jest sprawdzenie czy miasto należy do gracza komputerowego, oraz czy jest to miasto Nekromanty. Jeśli tak, to losuje liczbę od 0 do 100. Jeśli wylosowana wartość jest większa lub równa 50, komputerowy Nekromanta na trzecim poziomie gildii magów otrzyma czar Fala śmierci. W przeciwnym wypadku otrzyma czar Drgawki śmierci po wybudowaniu poziomu drugiego. To znaczy, że szansa wynosi 50.5% (51/101) dla Fali śmierci, a 49.5% (50/101) dla Drgawek śmierci dla gracza komputerowego grającego Nekromantą.

Fragment zdekompilowanego kodu z komentarzem:

// Jeżeli to miasto Nekromanty i należy do gracza komputerowego
if (
    castle->factionID == FACTION_NECROMANCER
    && castle->ownerIdx != -1
    && !gbHumanPlayer[castle->ownerIdx]
) {
      // Wylosuj liczbę od 0 do 100 i sprawdź, czy jest większa lub równa 50
      if (Random(0, 100) >= 50) // Jeżeli tak, zagwarantuj zaklęcie Fala śmierci
           spellIdx = SPELL_DEATH_WAVE;
      else // W przeciwnym wypadku zagwarantuj zaklęcie Drgawki śmierci
           spellIdx = SPELL_DEATH_RIPPLE;

     levelIdx = gsSpellInfo[spellIdx].level - 1;
     castle->mageGuildSpells[levelIdx][numSpellsOfLevel[levelIdx]++] = spellIdx;
}

Drugie i trzecie gwarantowane zaklęcie dotyczy już wszystkich graczy - zarówno ludzkich, jak i komputerowych, a także jest niezależne od tego, jaką grają frakcją.

Drugim gwarantowanym zaklęciem jest jeden czar wybierany spośród czwórki zaklęć lecząco-antymagicznych: Rozproszenia magii (24.75%), Uleczenia (25.74%), Antymagii (24.75%) i Masowego Rozproszenia (24.75%).

Kod gry ponownie losuje liczbę od 0 do 100. Jeśli liczba jest mniejsza niż 25, Gidlia magów otrzyma Rozproszenie magii. W przeciwnym wypadku, jeśli liczba jest mniejsza niż 50, w Gildii znajdzie się Masowe Rozproszenie. W przeciwnym wypadku, jeśli liczba jest mniejsza niż 75, czarem gwarantowanym będzie Antymagia, a jeśli wylosowany numer jest większy lub równy 75: Uzdrowienie.

Fragment zdekompilowanego kodu:

randNum = Random(0, 100);
if (randNum >= 25) {
    if (randNum >= 50) {
           if (randNum >= 75)
               spellIdx = SPELL_CURE;
           else
               spellIdx = SPELL_ANTI_MAGIC;
    } else {
           spellIdx = SPELL_MASS_DISPEL;
    }
} else {
    spellIdx = SPELL_DISPEL_MAGIC;
}

Trzecie i ostatnie gwarantowane zaklęcie to czar ofensywny wybrany spośród czwórki zaklęć: Magicznej Strzały (19.8%), Promienia Zimna (19.8%), Pierścienia Zimna (20.8%) oraz Kuli Ognia (19.8%).

Mechanizm generowania trzeciego gwarantowanego zaklęcia jest identyczny z drugim, a jedyną różnicą są procentowe wartości.

Fragmentu zdekompilowanego kodu:

randNum = Random(0, 100);
if ( randNum >= 20 ) {
    if ( randNum >= 40 ) {
           if ( randNum >= 60 ) {
               if ( randNum >= 80 )
                    spellIdx = SPELL_COLD_RING;
               else
                    spellIdx = SPELL_COLD_RAY;
           } else {
               spellIdx = SPELL_FIREBALL;
           }
     } else {
           spellIdx = SPELL_LIGHTNING_BOLT;
     }
} else {
     spellIdx = SPELL_MAGIC_ARROW;
}

Losowanie reszty zaklęć

W tym momencie kończy się etap przypisywania zaklęć gwarantowanych, a zaczyna losowanie pozostałych w gildiach czarów. Najważniejsze, co należy wiedzieć w przypadku rozpoczynającego się teraz etapu, to że szansa na otrzymanie danego zaklęcia różni się w przypadku graczy ludzkich oraz komputerowych, nekromantów oraz innych frakcji, a także, że na każdym poziomie gildii magów możemy mieć maksymalnie tylko jedno zaklęcie podróżne.

Dla każdego poziomu gildii magów gra losuje liczbę od 0 do 64 (liczba zaklęć w grze) i sprawdza, czy poziom zaklęcia odpowiada poziomowi gildii, dla którego właśnie trwa losowanie. Jeśli nie odpowiada, numer zaklęcia zostaje wylosowany jeszcze raz i proces powtarza się aż do skutku.

Gdy już udało się wylosować zaklęcie odpowiadające generowanemu właśnie poziomowi gildii, następuje przypisanie wagi zaklęcia, która służy do tego, by zwiększyć szansę na otrzymanie niektórych zaklęć dla gracza komputerowego...
Tak, tak, komputer w Heroes II oszukuje :). Waga ta wynosi zawsze 1500 dla graczy ludzkich i zaklęcia Wrota wymiarów. W przypadku graczy komputerowych najpierw pobierana jest wartość ze struktury z informacjami dla wszystkich zaklęć. Struktura zawiera także wartości, na podstawie których kalkulowana jest szansa na pojawienie się zaklęcia dla poszczególnych frakcji (zarówno sterowanych przez komputer, jak i gracza), a także dodatkowe informacje. Oto tabela, z której wycięto zbędne dla kalkulacji informacje takie jak koszt zaklęcia, nazwy dźwięków i grafik, itp:

Nazwa zaklęcia Szansa dla komputera Szansa dla frakcji
w kolejności:
Rycerz Barbarzyńca Czarodziejka Czarnoksiężnik Czarodziej Nekromanta
Atrybuty zaklęcia
Kula ognia 500 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Uderzenie ognia 750 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Błyskawica 450 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Seria błyskawic 650 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Teleport 30 10  -  10  -  10  -  10  -  10  -  10
Uzdrowienie 250 10  -  10  -  10  -  10  -  10  -  10
Grupowe uzdrowienie 700 10  -  10  -  10  -  10  -  10  -  10
Wskrzeszenie 400 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Prawdziwe wskrzeszenie 550 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Przyspieszenie 300 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Grupowe przyspieszenie 950 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Spowolnienie 350 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Grupowe spowolnienie 1000 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Oślepienie 500 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Błogosławieństwo 200 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Grupowe błogosławieństwo 650 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Kamienna skóra 300 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Stalowa skóra 575 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Klątwa 200 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Grupowa klątwa 500 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Święte słowo 300 10  -  10  -  10  -  10  -  10  -  0 Powszechne zaklęcie
Święte zawołanie 450 10  -  10  -  10  -  10  -  10  -  0 Powszechne zaklęcie
Antymagia 100 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Rozproszenie 275 10  -  10  -  10  -  10  -  10  -  10
Grupowe rozproszenie 450 10  -  10  -  10  -  10  -  10  -  10
Magiczna strzała 200 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Szał bitewny 1000 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Armagedon 2000 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Burza żywiołów 1300 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Deszcz meteorów 1000 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Paraliż 700 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Hipnoza 1300 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Promień zimna 375 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Krąg zimna 500 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Promień osłabienia 500 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Drgawki śmierci 300 0  -  0  -  0  -  0  -  0  -  10 Powszechne zaklęcie
Fala śmierci 450 0  -  0  -  0  -  0  -  0  -  10 Powszechne zaklęcie
Zabójca smoków 100 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Żądza krwi 300 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Ożywienie 400 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Lustrzane odbicie 800 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Tarcza 150 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Grupowa tarcza 375 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Przywołanie Żywiołaka ziemi 1000 0  -  0  -  0  -  0  -  0  -  0 Powszechne zaklęcie
Przywołanie Żywiołaka powietrza 1000 0  -  0  -  0  -  0  -  0  -  0 Powszechne zaklęcie
Przywołanie Żywiołaka ognia 1000 0  -  0  -  0  -  0  -  0  -  0 Powszechne zaklęcie
Przywołanie Żywiołaka wody 1000 0  -  0  -  0  -  0  -  0  -  0 Powszechne zaklęcie
Trzęsienie ziemi 300 10  -  10  -  10  -  10  -  10  -  10 Powszechne zaklęcie
Pokaż kopalnie 30 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Pokaż zasoby 30 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Pokaż artefakty 30 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Pokaż miasta 30 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Pokaż bohaterów 30 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Pokaż wszystko 30 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Identyfikacja bohatera 30 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Przywołanie łodzi 30 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Brama między wymiarami 1500 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Brama do miasta 30 10  -  10  -  10  -  10  -  10  -  10 Zaklęcie podróżne
Miejski portal 30 0  -  0  -  0  -  0  -  0  -  0 Zaklęcie podróżne
Wizje 30 0  -  0  -  0  -  0  -  0  -  0 Zaklęcie podróżne
Nawiedzenie 30 0  -  0  -  0  -  0  -  0  -  0 Zaklęcie podróżne
Ustaw strażnika ziemi 700 0  -  0  -  0  -  0  -  0  -  0 Zaklęcie podróżne
Ustaw strażnika powietrza 700 0  -  0  -  0  -  0  -  0  -  0 Zaklęcie podróżne
Ustaw strażnika ognia 700 0  -  0  -  0  -  0  -  0  -  0 Zaklęcie podróżne
Ustaw strażnika wody 700 0  -  0  -  0  -  0  -  0  -  0 Zaklęcie podróżne

Wartość dla zaklęć oznaczonych atrybutem "Powszechne zaklęcie" kalkulowana jest ze wzoru:

waga = szansa_dla_komputera * 4 + 50

A dla zaklęć bez atrybutu:

waga = szansa_dla_komputera * 1 + 50


Następnie sprawdzane jest czy na aktualnym poziomie gildii zostało wylosowane już wcześniej zaklęcie podróżne - jeśli tak, to czy aktualnie losowane zaklęcie również jest oznaczone atrybutem "Zaklęcie podróżne". Jeśli drugi raz na danym poziomie wylosowaliśmy zaklęcie podróżne, to zaklęcie jest losowane jeszcze raz i cały proces zaczyna się od nowa.

W kolejnym kroku pobierana jest przypisana zaklęciu wartość "Szansa dla frakcji" dla typu, do którego należy miasto. Wartość ta może wynosić 0 lub 10 (albo zero, albo dziesięć!). Na jej podstawie kalkulowana jest szansa na otrzymanie danego zaklęcia dla poszczególnych frakcji. Wygląda to tak, że gra losuje liczbę od 0 do 10. Jeśli "Szansa dla frakcji" jest większa lub równa od wylosowanej liczby, możemy przejść do ostatniego etapu losowania. Jeśli nie jest, to zaklęcie jest losowane jeszcze raz i cały proces zaczyna się od nowa.

szansa_dla_frakcji >= wyloswana liczba (od 0 do 10)


Ponieważ "Szansa dla frakcji" to zawsze 0 lub 10, oznacza to, że miasta, dla których Szansa dla frakcji dla poszczególnego zaklęcia wynosi wartość 10, mają sto procent szansy na przejście do ostatniego etapu losowania, ponieważ 10 będzie zawsze większe lub równe wylosowanej liczbie.

W ostatnim etapie najpierw zostaje sprawdzone czy dane zaklęcie nie znajduje się już w gildii magów (tak, dopiero teraz!) i jeśli go nie ma, to gracze ludzcy otrzymają zaklęcie, a w przypadku graczy komputerowych zostanie wykorzystana wykalkulowana przez nas wcześniej waga, która dopiero o tym zdecyduje.

Gra w tym momencie losuje liczbę od 1 do 1500 i jeśli wylosowana liczba jest mniejsza lub równa wykalkulowanej wadze, to gildia otrzyma zaklęcie (a jeśli nie, to losujemy je jeszcze raz i wracamy do początkowego etapu):

losowa liczba od 1 do 1500 <= waga


Ponieważ dla graczy ludzkich waga każdego z zaklęć to 1500, to warunek ten jest zawsze prawdziwy, więc zawsze otrzyma on wylosowane zaklęcie. Ale żeby udowodnić, że komputer oszukuje oraz wyjaśnić, po co ta "waga" jest, porównane zostanie jak w jego wypadku wygląda wylosowanie słabego zaklęcia pierwszego poziomu Pokaż kopalnie oraz silnego Spowolnienia.


"Szansa dla komputera" dla Pokaż kopalnie to 30 oraz zaklęcie nie ma atrybutu "Powszechne zaklęcie", więc waga to:        30 * 1 + 50 = 80

Więc zaklęcie otrzyma on tylko w wypadku, jeśli losując liczbę od 1 do 1500 trafi na liczbę mniejszą lub równą 80 (prawie nigdy)!

Weźmy spowolnienie z "Szansą dla komputera" o wartości 350 i atrybutem "Powszechne zaklęcie":        350 * 4 + 50 = 1450

Czyli zaklęcie otrzyma on w wypadku, jeśli losując liczbę od 1 do 1500 trafi na liczbę mniejszą lub równą 1450 (prawie zawsze)!

Poniżej zamieszczono zdekompilowany przez Darmaniego kod:

strcpy(castle->name, pTown->name)
memset(spellPresent, 0, 65u);

for (levelIdx = 0; levelIdx < 5; ++levelIdx) {
    numSpellsOfLevel[levelIdx] = 0;
    for (spellIdx = 0; spellIdx < 4; ++spellIdx) {         castle->mageGuildSpells[levelIdx][spellIdx] = -1; } } if ( castle->factionID == FACTION_NECROMANCER && castle->ownerIdx != -1 && !gbHumanPlayer[castle->ownerIdx] ) { if (Random(0, 100) >= 50) spellIdx = SPELL_DEATH_WAVE;     else     spellIdx = SPELL_DEATH_RIPPLE;     levelIdx = gsSpellInfo[spellIdx].level - 1;     castle->mageGuildSpells[levelIdx][numSpellsOfLevel[levelIdx]++] = spellIdx; } randNum = Random(0, 100); if (randNum >= 25) { if (randNum >= 50) {      if (randNum >= 75)         spellIdx = SPELL_CURE;        else            spellIdx = SPELL_ANTI_MAGIC;     } else {     spellIdx = SPELL_MASS_DISPEL;     } } else { spellIdx = SPELL_DISPEL_MAGIC; } levelIdx = gsSpellInfo[spellIdx].level - 1; castle->mageGuildSpells[levelIdx][numSpellsOfLevel[levelIdx]++] = spellIdx; randNum = Random(0, 100); if (randNum >= 20) { if (randNum >= 40) {     if (randNum >= 60 ) {             if (randNum >= 80)               spellIdx = SPELL_COLD_RING;             else               spellIdx = SPELL_COLD_RAY;         } else { spellIdx = SPELL_FIREBALL;         }     } else { spellIdx = SPELL_LIGHTNING_BOLT; } } else { spellIdx = SPELL_MAGIC_ARROW; } levelIdx = gsSpellInfo[spellIdx].level - 1; castle->mageGuildSpells[levelIdx][numSpellsOfLevel[levelIdx]++] = spellIdx; for (levelIdx = 0; levelIdx < 5; ++levelIdx ) { hasAdventureSpellAtLevel = 0;     for (spellIdx = 0; spellIdx < 4; ++spellIdx ) {      if (castle->mageGuildSpells[levelIdx][spellIdx] == -1) { tries = 0;             while (1) {                for (spell = Random(0, 64); gsSpellInfo[spell].level - 1 != levelIdx; spell = Random(0, 64));                if ( castle->ownerIdx == -1 || gbHumanPlayer[castle->ownerIdx] ) {                 relatedToSpellAppearingChance = 1500; } else {                  relatedToSpellAppearingChance = gsSpellInfo[spell].appearingChance * ((unsigned __int8)(gsSpellInfo[spell].attributes & ATTR_COMMON_SPELL) < 1u ? 1 : 4)                        + 50; }                if (spell == SPELL_DIMENSION_DOOR)                 relatedToSpellAppearingChance = 1500;               if ( hasAdventureSpellAtLevel != 1 || !(gsSpellInfo[spell].attributes & ATTR_ADVENTURE_SPELL) ) { if ( gsSpellInfo[spell].nonMagicFactionAppearanceChance[castle->factionID] >= Random(0, 10) ) {                  ++tries;                    if (tries <= 500) {                      if ( !spellPresent[spell] && Random(1, 1500) <= relatedToSpellAppearingChance ) {                       break; }                   }                 }               }             }             if (gsSpellInfo[spell].attributes & ATTR_ADVENTURE_SPELL)                ++hasAdventureSpellAtLevel;             castle->mageGuildSpells[levelIdx][spellIdx] = spell;             spellPresent[spell] = 1;         } else {         spellPresent[castle->mageGuildSpells[levelIdx][spellIdx]] = 1;         }     } }

A także oryginalną Strukturę zaklęć:

struct SSpellInfo
{
  char soundName[9];
  char level;
  char spriteIdx;
  char creatureEffectAnimationIdx;
  __int16 appearingChance;
  char cost;
  char nonMagicFactionAppearanceChance[6];
  unsigned __int8 attributes;
};

SSpellInfo gsSpellInfo[48] =
{
  {
    { 'f', 'i', 'r', 'e', 'b', 'a', 'l', 'l', '\0' },
    '\x03',
    '\b',
    '\0',
    500,
    '\t',
    "\n\n\n\n\n\n",
    3u
  },
  { "fireball", '\x04', '\t', '\0', 750, '\x0F', "\n\n\n\n\n\n", 3u },
  { "lightblt", '\x02', '\x04', '\x0F', 450, '\a', "\n\n\n\n\n\n", 3u },
  { "chainlte", '\x04', '\x05', '\x0F', 650, '\x0F', "\n\n\n\n\n\n", 3u },
  { "telptout", '\x03', '\n', '\0', 30, '\t', "\n\n\n\n\n\n", 2u },
  { "cure", '\x01', '\x06', '\x01', 250, '\x06', "\n\n\n\n\n\n", 2u },
  { "masscure", '\x04', '\x06', '\x01', 700, '\x0F', "\n\n\n\n\n\n", 2u },
  { "resurect", '\x04', '\r', '\x01', 400, '\f', "\n\n\n\n\n\n", 3u },
  { "resurtru", '\x05', '\f', '\x01', 550, '\x0F', "\n\n\n\n\n\n", 3u },
  { "haste", '\x01', '\x0E', '\x18', 300, '\x03', "\n\n\n\n\n\n", 11u },
  { "masshast", '\x03', '\x0E', '\x18', 950, '\n', "\n\n\n\n\n\n", 11u },
  { "slow", '\x01', '\x01', '\x02', 350, '\x03', "\n\n\n\n\n\n", 11u },
  { "massslow", '\x04', '\x01', '\x02', 1000, '\x0F', "\n\n\n\n\n\n", 11u },
  { "blind", '\x02', '\x15', '\x1C', 500, '\x06', "\n\n\n\n\n\n", 11u },
  { "bless", '\x01', '\a', '\x15', 200, '\x03', "\n\n\n\n\n\n", 11u },
  { "massbles", '\x03', '\a', '\x15', 650, '\f', "\n\n\n\n\n\n", 11u },
  { "stonskin", '\x01', '\x1F', '\x1E', 300, '\x03', "\n\n\n\n\n\n", 11u },
  { "stelskin", '\x02', '\x1E', '\x1F', 575, '\x06', "\n\n\n\n\n\n", 11u },
  { "curse", '\x01', '\x03', '\x1D', 200, '\x03', "\n\n\n\n\n\n", 11u },
  { "masscurs", '\x03', '\x03', '\x1D', 500, '\f', "\n\n\n\n\n\n", 11u },
  { "masscurs", '\x03', '\x16', '\b', 300, '\t', "\n\n\n\n\n", 3u },
  { "masscurs", '\x04', '\x17', '\b', 450, '\f', "\n\n\n\n\n", 3u },
  { "antimagk", '\x03', '\x11', '\x06', 100, '\a', "\n\n\n\n\n\n", 11u },
  { "dipmagk", '\x01', '\x12', '\a', 275, '\x05', "\n\n\n\n\n\n", 2u },
  { "dipmagk", '\x03', '\x12', '\a', 450, '\f', "\n\n\n\n\n\n", 2u },]
  { "magcarow", '\x01', '&', '\0', 200, '\x03', "\n\n\n\n\n\n", 3u },
  { "berzerk", '\x04', '\x13', '\x16', 1000, '\f', "\n\n\n\n\n\n", 11u },
  { "armgedn", '\x05', '\x10', '\0', 2000, '\x14', "\n\n\n\n\n\n", 3u },
  { "storm", '\x04', '\v', '\0', 1300, '\x0F', "\n\n\n\n\n\n", 3u },
  { "meteor~1", '\x04', '\x18', '\0', 1000, '\x0F', "\n\n\n\n\n\n", 3u },
  { "paralize", '\x03', '\x14', '\x19', 700, '\t', "\n\n\n\n\n\n", 11u },
  { "hypnotiz", '\x05', '%', '\x1A', 1300, '\x0F', "\n\n\n\n\n\n", 11u },
  { "coldray", '\x02', '$', '\x13', 375, '\x06', "\n\n\n\n\n\n", 3u },
  { "coldring", '\x03', '#', '\0', 500, '\t', "\n\n\n\n\n\n", 3u },
  { "disruptr", '\x02', '\"', '\0', 500, '\a', "\n\n\n\n\n\n", 3u },
  { "mnrdeath", '\x02', '\x1D', '\r', 300, '\x06', "\n", 3u },
  { "mnrdeath", '\x03', '\x1C', '\r', 450, '\n', "\n", 3u },
  { "drgnslay", '\x02', ' ', '\x1B', 100, '\x06', "\n\n\n\n\n\n", 11u },
  { "bloodlus", '\x01', '\x1B', '\0', 300, '\x03', "\n\n\n\n\n\n", 11u },
  { "resurect", '\x03', '\x19', '\x06', 400, '\n', "\n\n\n\n\n\n", 3u },
  { "mirrorim", '\x05', '\x1A', '\0', 800, '\x19', "\n\n\n\n\n\n", 11u },
  { "shield", '\x01', '\x0F', '\x17', 150, '\x03', "\n\n\n\n\n\n", 11u },
  { "shield", '\x04', '\x0F', '\x17', 375, '\a', "\n\n\n\n\n\n", 11u },
  { "sumnelm", '\x05', '8', '\0', 1000, '\x1E', "", 3u },
  { "sumnelm", '\x05', '9', '\0', 1000, '\x1E', "", 3u },
  { "sumnelm", '\x05', ':', '\0', 1000, '\x1E', "", 3u },
  { "sumnelm", '\x05', ';', '\0', 1000, '\x1E', "", 3u },
  { "erthquak", '\x03', '!', '\0', 300, '\x0F', "\n\n\n\n\n\n", 3u }
};
Powrót do góry