From 9ce06e5785e27989b3f1cc68fcee1a03f824ef69 Mon Sep 17 00:00:00 2001 From: Habu Date: Mon, 1 Jul 2024 00:28:28 +0900 Subject: [PATCH 01/16] =?UTF-8?q?[Feature]=20PlayerRealm:=20=E8=81=B7?= =?UTF-8?q?=E6=A5=AD=E3=82=92=E6=8C=87=E5=AE=9A=E3=81=97=E3=81=A6=E9=AD=94?= =?UTF-8?q?=E6=B3=95=E6=83=85=E5=A0=B1=E3=82=92=E5=8F=96=E5=BE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PlayerRealmクラスの静的メンバ関数 get_spell_info に、指定した職業の テーブルから魔法情報を取得できるようにする引数を追加する。 引数を省略した場合はこれまで通り現在のプレイヤーの職業のテーブル (グローバル変数mp_ptrが指している)から魔法情報を取得する。 --- src/player/player-realm.cpp | 5 ++++- src/player/player-realm.h | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/player/player-realm.cpp b/src/player/player-realm.cpp index 94b11be6ea..18c02e0486 100644 --- a/src/player/player-realm.cpp +++ b/src/player/player-realm.cpp @@ -89,7 +89,7 @@ const LocalizedString &PlayerRealm::get_name(int realm) return it->second; } -const magic_type &PlayerRealm::get_spell_info(int realm, int spell_idx) +const magic_type &PlayerRealm::get_spell_info(int realm, int spell_idx, std::optional pclass) { if (spell_idx < 0 || 32 <= spell_idx) { THROW_EXCEPTION(std::invalid_argument, format("Invalid spell idx: %d", spell_idx)); @@ -98,6 +98,9 @@ const magic_type &PlayerRealm::get_spell_info(int realm, int spell_idx) const auto realm_enum = i2enum(realm); if (MAGIC_REALM_RANGE.contains(realm_enum)) { + if (pclass) { + return class_magics_info.at(enum2i(*pclass)).info[realm - 1][spell_idx]; + } return mp_ptr->info[realm - 1][spell_idx]; } if (TECHNIC_REALM_RANGE.contains(realm_enum)) { diff --git a/src/player/player-realm.h b/src/player/player-realm.h index 89e84e101f..bf59e1d5a8 100644 --- a/src/player/player-realm.h +++ b/src/player/player-realm.h @@ -4,6 +4,7 @@ #include "system/angband.h" #include "util/flag-group.h" #include +#include #include using RealmChoices = FlagGroup; @@ -18,7 +19,7 @@ class PlayerRealm { PlayerRealm(PlayerType *player_ptr); static const LocalizedString &get_name(int realm); - static const magic_type &get_spell_info(int realm, int num); + static const magic_type &get_spell_info(int realm, int num, std::optional pclass = std::nullopt); static ItemKindType get_book(int realm); static RealmChoices get_realm1_choices(PlayerClassType pclass); static RealmChoices get_realm2_choices(PlayerClassType pclass); From f71db03ceac2939b2639e2b857cda228d8166778 Mon Sep 17 00:00:00 2001 From: dis Date: Mon, 1 Jul 2024 16:13:27 +0900 Subject: [PATCH 02/16] =?UTF-8?q?[Feature]=20SpellDefinitions.jsonc?= =?UTF-8?q?=E3=81=AB=E6=AD=8C/=E6=AD=A6=E8=8A=B8/=E5=91=AA=E8=A1=93?= =?UTF-8?q?=E3=82=92=E5=90=AB=E3=82=81=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 呪文定義ファイルを拡張して魔術領域以外の職業専門領域も扱うよう変更する。 合わせて読込部分を修正。 --- lib/edit/SpellDefinitions.jsonc | 1265 ++++++++++++++++++++++++++- schema/SpellDefinitions.schema.json | 5 +- src/system/spell-info-list.cpp | 2 +- src/system/spell-info-list.h | 3 + 4 files changed, 1272 insertions(+), 3 deletions(-) diff --git a/lib/edit/SpellDefinitions.jsonc b/lib/edit/SpellDefinitions.jsonc index c361a38611..284b2c8654 100644 --- a/lib/edit/SpellDefinitions.jsonc +++ b/lib/edit/SpellDefinitions.jsonc @@ -4210,6 +4210,1269 @@ ] } ] + }, + { + "name": "MUSIC", + "books": [ + { + "name": { + "ja": "[見習い教本]", + "en": "[Apprentice Handbook]" + }, + "spells": [ + { + "spell_id": 0, + "spell_tag": "Song_of_Holding", + "name": { + "ja": "遅鈍の歌", + "en": "Song of Holding" + }, + "description": { + "ja": "視界内の全てのモンスターを減速させる。抵抗されると無効。", + "en": "Attempts to slow all monsters in sight." + } + }, + { + "spell_id": 1, + "spell_tag": "Song_of_Blessing", + "name": { + "ja": "祝福の歌", + "en": "Song of Blessing" + }, + "description": { + "ja": "命中率とACのボーナスを得る。", + "en": "Gives a bonus to hit and AC for a few turns." + } + }, + { + "spell_id": 2, + "spell_tag": "Wrecking_Note", + "name": { + "ja": "崩壊の音色", + "en": "Wrecking Note" + }, + "description": { + "ja": "轟音のボルトを放つ。", + "en": "Fires a bolt of sound." + } + }, + { + "spell_id": 3, + "spell_tag": "Stun_Pattern", + "name": { + "ja": "朦朧の旋律", + "en": "Stun Pattern" + }, + "description": { + "ja": "視界内の全てのモンスターを朦朧させる。抵抗されると無効。", + "en": "Attempts to stun all monsters in sight." + } + }, + { + "spell_id": 4, + "spell_tag": "Flow_of_Life", + "name": { + "ja": "生命の流れ", + "en": "Flow of Life" + }, + "description": { + "ja": "体力を少し回復させる。", + "en": "Heals HP a little." + } + }, + { + "spell_id": 5, + "spell_tag": "Song_of_the_Sun", + "name": { + "ja": "太陽の歌", + "en": "Song of the Sun" + }, + "description": { + "ja": "光源が照らしている範囲か部屋全体を永久に明るくする。", + "en": "Lights up nearby area and the inside of a room permanently." + } + }, + { + "spell_id": 6, + "spell_tag": "Song_of_Fear", + "name": { + "ja": "恐怖の歌", + "en": "Song of Fear" + }, + "description": { + "ja": "視界内の全てのモンスターを恐怖させる。抵抗されると無効。", + "en": "Attempts to scare all monsters in sight." + } + }, + { + "spell_id": 7, + "spell_tag": "Heroic_Ballad", + "name": { + "ja": "戦いの歌", + "en": "Heroic Ballad" + }, + "description": { + "ja": "ヒーロー気分になる。", + "en": "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP." + } + } + ] + }, + { + "name": { + "ja": "[詩人楽曲集]", + "en": "[Minstrel's Music]" + }, + "spells": [ + { + "spell_id": 8, + "spell_tag": "Clairaudience", + "name": { + "ja": "霊的知覚", + "en": "Clairaudience" + }, + "description": { + "ja": "近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。", + "en": "Detects traps, doors and stairs in your vicinity. And detects all monsters at level 15, treasures and items at level 20. Maps nearby area at level 25. Lights and know the whole level at level 40. These effects accumulate as the song continues." + } + }, + { + "spell_id": 9, + "spell_tag": "Soul Shriek", + "name": { + "ja": "魂の歌", + "en": "Soul Shriek" + }, + "description": { + "ja": "視界内の全てのモンスターに対して精神攻撃を行う。", + "en": "Damages all monsters in sight with PSI damages." + } + }, + { + "spell_id": 10, + "spell_tag": "Song_of_Lore", + "name": { + "ja": "知識の歌", + "en": "Song of Lore" + }, + "description": { + "ja": "自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", + "en": "Identifies all items which are in the adjacent squares." + } + }, + { + "spell_id": 11, + "spell_tag": "Hiding_Tune", + "name": { + "ja": "隠遁の歌", + "en": "Hiding Tune" + }, + "description": { + "ja": "隠密行動能力を上昇させる。", + "en": "Gives improved stealth." + } + }, + { + "spell_id": 12, + "spell_tag": "Illusion_Pattern", + "name": { + "ja": "幻影の旋律", + "en": "Illusion Pattern" + }, + "description": { + "ja": "視界内の全てのモンスターを混乱させる。抵抗されると無効。", + "en": "Attempts to confuse all monsters in sight." + } + }, + { + "spell_id": 13, + "spell_tag": "Doomcall", + "name": { + "ja": "破滅の叫び", + "en": "Doomcall" + }, + "description": { + "ja": "視界内の全てのモンスターに対して轟音攻撃を行う。", + "en": "Damages all monsters in sight with booming sound." + } + }, + { + "spell_id": 14, + "spell_tag": "Firiels_Song", + "name": { + "ja": "フィリエルの歌", + "en": "Firiel's Song" + }, + "description": { + "ja": "周囲の死体や骨を生き返す。", + "en": "Resurrects nearby corpses and skeletons. And makes them your pets." + } + }, + { + "spell_id": 15, + "spell_tag": "Fellowship_Chant", + "name": { + "ja": "旅の仲間", + "en": "Fellowship Chant" + }, + "description": { + "ja": "視界内の全てのモンスターを魅了する。抵抗されると無効。", + "en": "Attempts to charm all monsters in sight." + } + } + ] + }, + { + "name": { + "ja": "[リヴェンデルの竪琴]", + "en": "[Harps of Rivendell]" + }, + "spells": [ + { + "spell_id": 16, + "spell_tag": "Hrus_March", + "name": { + "ja": "フルゥの行進曲", + "en": "Hru's March" + }, + "description": { + "ja": "壁を掘り進む。自分の足元のアイテムは蒸発する。", + "en": "Makes you be able to burrow into walls. Objects under your feet evaporate." + } + }, + { + "spell_id": 17, + "spell_tag": "Finrods_Resistance", + "name": { + "ja": "フィンロドの護り", + "en": "Finrod's Resistance" + }, + "description": { + "ja": "酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", + "en": "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to those from equipment for more powerful resistances." + } + }, + { + "spell_id": 18, + "spell_tag": "Hobbit_Melodies", + "name": { + "ja": "ホビットのメロディ", + "en": "Hobbit Melodies" + }, + "description": { + "ja": "加速する。", + "en": "Hastes you." + } + }, + { + "spell_id": 19, + "spell_tag": "World_Contortion", + "name": { + "ja": "歪んだ世界", + "en": "World Contortion" + }, + "description": { + "ja": "近くのモンスターをテレポートさせる。抵抗されると無効。", + "en": "Teleports all nearby monsters away unless resisted." + } + }, + { + "spell_id": 20, + "spell_tag": "Dispelling_Chant", + "name": { + "ja": "退散の歌", + "en": "Dispelling Chant" + }, + "description": { + "ja": "視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。", + "en": "Damages all monsters in sight. Hurts evil monsters greatly." + } + }, + { + "spell_id": 21, + "spell_tag": "The_Voice_of_Saruman", + "name": { + "ja": "サルマンの甘言", + "en": "The Voice of Saruman" + }, + "description": { + "ja": "視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", + "en": "Attempts to slow and put to sleep all monsters in sight." + } + }, + { + "spell_id": 22, + "spell_tag": "Song_of_the_Tempest", + "name": { + "ja": "嵐の音色", + "en": "Song of the Tempest" + }, + "description": { + "ja": "轟音のビームを放つ。", + "en": "Fires a beam of sound." + } + }, + { + "spell_id": 23, + "spell_tag": "Ambarkanta", + "name": { + "ja": "もう一つの世界", + "en": "Ambarkanta" + }, + "description": { + "ja": "現在の階を再構成する。", + "en": "Recreates current dungeon level." + } + } + ] + }, + { + "name": { + "ja": "[ベレリアンドの詩]", + "en": "[Lays of Beleriand]" + }, + "spells": [ + { + "spell_id": 24, + "spell_tag": "Wrecking_Pattern", + "name": { + "ja": "破壊の旋律", + "en": "Wrecking Pattern" + }, + "description": { + "ja": "周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", + "en": "Shakes dungeon structure, and results in random swapping of floors and walls." + } + }, + { + "spell_id": 25, + "spell_tag": "Stationary_Shriek", + "name": { + "ja": "停滞の歌", + "en": "Stationary Shriek" + }, + "description": { + "ja": "視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", + "en": "Attempts to freeze all monsters in sight." + } + }, + { + "spell_id": 26, + "spell_tag": "Elbereths_Chant", + "name": { + "ja": "エルベレスの聖歌", + "en": "Elbereth's Chant" + }, + "description": { + "ja": "自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", + "en": "Sets a rune on the floor beneath you. If you are on a rune, monsters cannot attack you but can try to break the rune." + } + }, + { + "spell_id": 27, + "spell_tag": "The_Heros_Poem", + "name": { + "ja": "英雄の詩", + "en": "The Hero's Poem" + }, + "description": { + "ja": "加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。", + "en": "Hastes you. Gives heroism. Damages all monsters in sight." + } + }, + { + "spell_id": 28, + "spell_tag": "Relief_of_Yavanna", + "name": { + "ja": "ヤヴァンナの助け", + "en": "Relief of Yavanna" + }, + "description": { + "ja": "強力な回復の歌で、負傷と朦朧状態も全快する。", + "en": "Powerful healing song. Also completely heals cuts and being stunned." + } + }, + { + "spell_id": 29, + "spell_tag": "Goddess_rebirth", + "name": { + "ja": "再生の歌", + "en": "Goddess's rebirth" + }, + "description": { + "ja": "すべてのステータスと経験値を回復する。", + "en": "Restores all stats and experience." + } + }, + { + "spell_id": 30, + "spell_tag": "Wizardry_of_Sauron", + "name": { + "ja": "サウロンの魔術", + "en": "Wizardry of Sauron" + }, + "description": { + "ja": "非常に強力でごく小さい轟音の球を放つ。", + "en": "Fires an extremely powerful tiny ball of sound." + } + }, + { + "spell_id": 31, + "spell_tag": "Fingolfins_Challenge", + "name": { + "ja": "フィンゴルフィンの挑戦", + "en": "Fingolfin's Challenge" + }, + "description": { + "ja": "ダメージを受けなくなるバリアを張る。", + "en": "Generates a barrier which completely protects you from almost all damage." + } + } + ] + } + ] + }, + { + "name": "HISSATSU", + "books": [ + { + "name": { + "ja": "[武芸諸譜]", + "en": "[Bugei Shofu]" + }, + "spells": [ + { + "spell_id": 0, + "spell_tag": "Tobi-Izuna", + "name": { + "ja": "飛飯綱", + "en": "Tobi-Izuna" + }, + "description": { + "ja": "2マス離れたところにいるモンスターを攻撃する。", + "en": "Attacks a monster two squares away." + } + }, + { + "spell_id": 1, + "spell_tag": "3-Way_Attack", + "name": { + "ja": "五月雨斬り", + "en": "3-Way Attack" + }, + "description": { + "ja": "3方向に対して攻撃する。", + "en": "Attacks in 3 directions at one time." + } + }, + { + "spell_id": 2, + "spell_tag": "Boomerang", + "name": { + "ja": "ブーメラン", + "en": "Boomerang" + }, + "description": { + "ja": "武器を手元に戻ってくるように投げる。戻ってこないこともある。", + "en": "Throws current weapon. It'll return to your hand unless the action failed." + } + }, + { + "spell_id": 3, + "spell_tag": "Burning_Strike", + "name": { + "ja": "焔霊", + "en": "Burning Strike" + }, + "description": { + "ja": "火炎耐性のないモンスターに大ダメージを与える。", + "en": "Attacks a monster with more damage unless it has resistance to fire." + } + }, + { + "spell_id": 4, + "spell_tag": "Detect_Ferocity", + "name": { + "ja": "殺気感知", + "en": "Detect Ferocity" + }, + "description": { + "ja": "近くの思考することができるモンスターを感知する。", + "en": "Detects all monsters except the mindless in your vicinity." + } + }, + { + "spell_id": 5, + "spell_tag": "Strike_to_Stun", + "name": { + "ja": "みね打ち", + "en": "Strike to Stun" + }, + "description": { + "ja": "相手にダメージを与えないが、朦朧とさせる。", + "en": "Attempts to stun a monster next to you." + } + }, + { + "spell_id": 6, + "spell_tag": "Counter", + "name": { + "ja": "カウンター", + "en": "Counter" + }, + "description": { + "ja": "相手に攻撃されたときに反撃する。反撃するたびにMPを消費。", + "en": "Prepares to counterattack. When attacked by a monster, strikes back using SP each time." + } + }, + { + "spell_id": 7, + "spell_tag": "Harainuke", + "name": { + "ja": "払い抜け", + "en": "Harainuke" + }, + "description": { + "ja": "攻撃した後、反対側に抜ける。", + "en": "In one action, attacks a monster with your weapons normally and then moves to the space beyond the monster if that space is not blocked." + } + } + ] + }, + { + "name": { + "ja": "[柳生武芸帳]", + "en": "[Yagyuu Bugeichou]" + }, + "spells": [ + { + "spell_id": 8, + "spell_tag": "Serpents_Tongue", + "name": { + "ja": "サーペンツタン", + "en": "Serpent's Tongue" + }, + "description": { + "ja": "毒耐性のないモンスターに大ダメージを与える。", + "en": "Attacks a monster with more damage unless it has resistance to poison." + } + }, + { + "spell_id": 9, + "spell_tag": "Zammaken", + "name": { + "ja": "斬魔剣弐の太刀", + "en": "Zammaken" + }, + "description": { + "ja": "生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。", + "en": "Attacks an evil unliving monster with great damage. Has no effect on other monsters." + } + }, + { + "spell_id": 10, + "spell_tag": "Wind_Blast", + "name": { + "ja": "裂風剣", + "en": "Wind Blast" + }, + "description": { + "ja": "攻撃した相手を後方へ吹き飛ばす。", + "en": "Attacks an adjacent monster and blows it away." + } + }, + { + "spell_id": 11, + "spell_tag": "Judge", + "name": { + "ja": "刀匠の目利き", + "en": "Judge" + }, + "description": { + "ja": "武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。", + "en": "Identifies a weapon or armor. *Identifies* the item at level 45." + } + }, + { + "spell_id": 12, + "spell_tag": "Rock_Smash", + "name": { + "ja": "破岩斬", + "en": "Rock Smash" + }, + "description": { + "ja": "岩を壊し、岩石系のモンスターに大ダメージを与える。", + "en": "Breaks rock or greatly damages a monster made of rocks." + } + }, + { + "spell_id": 13, + "spell_tag": "Midare-Setsugekka", + "name": { + "ja": "乱れ雪月花", + "en": "Midare-Setsugekka" + }, + "description": { + "ja": "攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。", + "en": "Attacks a monster with an increased number of attacks and more damage unless it has resistance to cold." + } + }, + { + "spell_id": 14, + "spell_tag": "Spot_Aiming", + "name": { + "ja": "急所突き", + "en": "Spot Aiming" + }, + "description": { + "ja": "モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。", + "en": "Attempts to kill a monster instantly. If that fails, causes only 1HP of damage." + } + }, + { + "spell_id": 15, + "spell_tag": "Majingiri", + "name": { + "ja": "魔神斬り", + "en": "Majingiri" + }, + "description": { + "ja": "会心の一撃で攻撃する。攻撃がかわされやすい。", + "en": "Attempts to attack with a critical hit, but this attack is easy to evade for a monster." + } + } + ] + }, + { + "name": { + "ja": "[五輪書]", + "en": "[Gorinnosho]" + }, + "spells": [ + { + "spell_id": 16, + "spell_tag": "Desperate_Attack", + "name": { + "ja": "捨て身", + "en": "Desperate Attack" + }, + "description": { + "ja": "強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。", + "en": "Attacks with all of your power, but all damage you take will be doubled for one turn." + } + }, + { + "spell_id": 17, + "spell_tag": "Lightning_Eagle", + "name": { + "ja": "雷撃鷲爪斬", + "en": "Lightning Eagle" + }, + "description": { + "ja": "電撃耐性のないモンスターに非常に大きいダメージを与える。", + "en": "Attacks a monster with more damage unless it has resistance to electricity." + } + }, + { + "spell_id": 18, + "spell_tag": "Rush_Attack", + "name": { + "ja": "入身", + "en": "Rush Attack" + }, + "description": { + "ja": "素早く相手に近寄り攻撃する。", + "en": "Steps close to a monster and attacks at the same time." + } + }, + { + "spell_id": 19, + "spell_tag": "Bloody_Maelstrom", + "name": { + "ja": "赤流渦", + "en": "Bloody Maelstrom" + }, + "description": { + "ja": "自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。", + "en": "Attacks all adjacent monsters with power corresponding to your cuts. Then increases your cuts. Has no effect on unliving monsters." + } + }, + { + "spell_id": 20, + "spell_tag": "Earthquake_Blow", + "name": { + "ja": "激震撃", + "en": "Earthquake Blow" + }, + "description": { + "ja": "地震を起こす。", + "en": "Shakes dungeon structure, and results in random swapping of floors and walls." + } + }, + { + "spell_id": 21, + "spell_tag": "Crack", + "name": { + "ja": "地走り", + "en": "Crack" + }, + "description": { + "ja": "衝撃波のビームを放つ。", + "en": "Fires a shock wave as a beam." + } + }, + { + "spell_id": 22, + "spell_tag": "War_Cry", + "name": { + "ja": "気迫の雄叫び", + "en": "War Cry" + }, + "description": { + "ja": "視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。", + "en": "Damages all monsters in sight with sound. Aggravates nearby monsters." + } + }, + { + "spell_id": 23, + "spell_tag": "Musou-Sandan", + "name": { + "ja": "無双三段", + "en": "Musou-Sandan" + }, + "description": { + "ja": "強力な3段攻撃を繰り出す。", + "en": "Attacks with three powerful strikes." + } + } + ] + }, + { + "name": { + "ja": "[北辰一刀流皆伝]", + "en": "[Hokusin Ittouryuu Kaiden]" + }, + "spells": [ + { + "spell_id": 24, + "spell_tag": "Vampires_Fang", + "name": { + "ja": "吸血鬼の牙", + "en": "Vampire's Fang" + }, + "description": { + "ja": "攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。", + "en": "Attacks with vampiric strikes which absorb HP from a monster and heal you. Has no effect on unliving monsters." + } + }, + { + "spell_id": 25, + "spell_tag": "Moon_Dazzling", + "name": { + "ja": "幻惑", + "en": "Moon Dazzling" + }, + "description": { + "ja": "視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", + "en": "Attempts to stun, confuse and put to sleep all waking monsters." + } + }, + { + "spell_id": 26, + "spell_tag": "Hundred_Slaughter", + "name": { + "ja": "百人斬り", + "en": "Hundred Slaughter" + }, + "description": { + "ja": "連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。", + "en": "Performs a series of rush attacks. The series continues as long as the attacked monster dies and you have sufficient SP." + } + }, + { + "spell_id": 27, + "spell_tag": "Dragonic_Flash", + "name": { + "ja": "天翔龍閃", + "en": "Dragonic Flash" + }, + "description": { + "ja": "視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。", + "en": "Runs toward given location while attacking all monsters on the path." + } + }, + { + "spell_id": 28, + "spell_tag": "Twin_Slash", + "name": { + "ja": "二重の剣撃", + "en": "Twin Slash" + }, + "description": { + "ja": "1ターンで2度攻撃を行う。", + "en": "Attack twice in one turn." + } + }, + { + "spell_id": 29, + "spell_tag": "Kofuku-Zettousei", + "name": { + "ja": "虎伏絶刀勢", + "en": "Kofuku-Zettousei" + }, + "description": { + "ja": "強力な攻撃を行い、近くの場所にも効果が及ぶ。", + "en": "Performs a powerful attack which even affects nearby monsters." + } + }, + { + "spell_id": 30, + "spell_tag": "Keiun-Kininken", + "name": { + "ja": "慶雲鬼忍剣", + "en": "Keiun-Kininken" + }, + "description": { + "ja": "自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。", + "en": "Attacks a monster with extremely powerful damage, but you also take some damage. Hurts an undead monster greatly." + } + }, + { + "spell_id": 31, + "spell_tag": "Harakiri", + "name": { + "ja": "切腹", + "en": "Harakiri" + }, + "description": { + "ja": "「武士道とは、死ぬことと見つけたり。」", + "en": "'Bushido, the way of warriors, is found in death'" + } + } + ] + } + ] + }, + { + "name": "HEX", + "books": [ + { + "name": { + "ja": "[呪術入門]", + "en": "[Handbook of Hex]" + }, + "spells": [ + { + "spell_id": 0, + "spell_tag": "Evily_blessing", + "name": { + "ja": "邪なる祝福", + "en": "Evily blessing" + }, + "description": { + "ja": "祝福により攻撃精度と防御力が上がる。", + "en": "Attempts to increase +to_hit of a weapon and AC" + } + }, + { + "spell_id": 1, + "spell_tag": "Cure_light_wounds", + "name": { + "ja": "軽傷の治癒", + "en": "Cure light wounds" + }, + "description": { + "ja": "HPや傷を少し回復させる。", + "en": "Heals cuts and HP a little." + } + }, + { + "spell_id": 2, + "spell_tag": "Demonic_aura", + "name": { + "ja": "悪魔のオーラ", + "en": "Demonic aura" + }, + "description": { + "ja": "炎のオーラを身にまとい、回復速度が速くなる。", + "en": "Gives fire aura and regeneration." + } + }, + { + "spell_id": 3, + "spell_tag": "Stinking_mist", + "name": { + "ja": "悪臭霧", + "en": "Stinking mist" + }, + "description": { + "ja": "視界内のモンスターに微弱量の毒のダメージを与える。", + "en": "Deals a little poison damage to all monsters in your sight." + } + }, + { + "spell_id": 4, + "spell_tag": "Extra_might", + "name": { + "ja": "腕力強化", + "en": "Extra might" + }, + "description": { + "ja": "術者の腕力を上昇させる。", + "en": "Attempts to increase your strength." + } + }, + { + "spell_id": 5, + "spell_tag": "Curse weapon", + "name": { + "ja": "武器呪縛", + "en": "Curse weapon" + }, + "description": { + "ja": "装備している武器を呪う。", + "en": "Curses your weapon." + } + }, + { + "spell_id": 6, + "spell_tag": "Evil_detection", + "name": { + "ja": "邪悪感知", + "en": "Evil detection" + }, + "description": { + "ja": "周囲の邪悪なモンスターを感知する。", + "en": "Detects evil monsters." + } + }, + { + "spell_id": 7, + "spell_tag": "Patience", + "name": { + "ja": "我慢", + "en": "Patience" + }, + "description": { + "ja": "数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。", + "en": "Bursts hell fire strongly after enduring damage for a few turns." + } + } + ] + }, + { + "name": { + "ja": "[上級呪法]", + "en": "[High Curse]" + }, + "spells": [ + { + "spell_id": 8, + "spell_tag": "Armor_of_ice", + "name": { + "ja": "氷の鎧", + "en": "Armor of ice" + }, + "description": { + "ja": "氷のオーラを身にまとい、防御力が上昇する。", + "en": "Surrounds you with an icy aura and gives a bonus to AC." + } + }, + { + "spell_id": 9, + "spell_tag": "Cure_serious_wounds", + "name": { + "ja": "重傷の治癒", + "en": "Cure serious wounds" + }, + "description": { + "ja": "体力や傷を多少回復させる。", + "en": "Heals cuts and HP." + } + }, + { + "spell_id": 10, + "spell_tag": "Inhale_potion", + "name": { + "ja": "薬品吸入", + "en": "Inhale potion" + }, + "description": { + "ja": "呪文詠唱を中止することなく、薬の効果を得ることができる。", + "en": "Quaffs a potion without canceling spell casting." + } + }, + { + "spell_id": 11, + "spell_tag": "Hypodynamic_mist", + "name": { + "ja": "衰弱の霧", + "en": "Hypodynamic mist" + }, + "description": { + "ja": "視界内のモンスターに微弱量の衰弱属性のダメージを与える。", + "en": "Deals a little life-draining damage to all monsters in your sight." + } + }, + { + "spell_id": 12, + "spell_tag": "Swords_to_runeswords", + "name": { + "ja": "魔剣化", + "en": "Swords to runeswords" + }, + "description": { + "ja": "武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。", + "en": "Gives vorpal ability to your weapon. Increases damage from your weapon acccording to curse of your weapon." + } + }, + { + "spell_id": 13, + "spell_tag": "Touch_of_confusion", + "name": { + "ja": "混乱の手", + "en": "Touch of confusion" + }, + "description": { + "ja": "攻撃した際モンスターを混乱させる。", + "en": "Confuses a monster when you attack." + } + }, + { + "spell_id": 14, + "spell_tag": "Building_up", + "name": { + "ja": "肉体強化", + "en": "Building up" + }, + "description": { + "ja": "術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。", + "en": "Attempts to increases your strength, dexterity and constitusion." + } + }, + { + "spell_id": 15, + "spell_tag": "Anti_teleport_barrier", + "name": { + "ja": "反テレポート結界", + "en": "Anti teleport barrier" + }, + "description": { + "ja": "視界内のモンスターのテレポートを阻害するバリアを張る。", + "en": "Obstructs all teleportations by monsters in your sight." + } + } + ] + }, + { + "name": { + "ja": "[怨恨呪縛]", + "en": "[Curse and Spelling]" + }, + "spells": [ + { + "spell_id": 16, + "spell_tag": "Cloak_of_shock", + "name": { + "ja": "衝撃のクローク", + "en": "Cloak of shock" + }, + "description": { + "ja": "電気のオーラを身にまとい、動きが速くなる。", + "en": "Gives lightning aura and a bonus to speed." + } + }, + { + "spell_id": 17, + "spell_tag": "Cure_critical_wounds", + "name": { + "ja": "致命傷の治癒", + "en": "Cure critical wounds" + }, + "description": { + "ja": "体力や傷を回復させる。", + "en": "Heals cuts and HP greatly." + } + }, + { + "spell_id": 18, + "spell_tag": "Recharging", + "name": { + "ja": "呪力封入", + "en": "Recharging" + }, + "description": { + "ja": "魔法の道具に魔力を再充填する。", + "en": "Recharges a magic device." + } + }, + { + "spell_id": 19, + "spell_tag": "Animate_Dead", + "name": { + "ja": "死者復活", + "en": "Animate Dead" + }, + "description": { + "ja": "死体を蘇らせてペットにする。", + "en": "Raises corpses and skeletons from dead." + } + }, + { + "spell_id": 20, + "spell_tag": "Curse_armor", + "name": { + "ja": "防具呪縛", + "en": "Curse armor" + }, + "description": { + "ja": "装備している防具に呪いをかける。", + "en": "Curse a piece of armour that you are wielding." + } + }, + { + "spell_id": 21, + "spell_tag": "Cloak_of_shadow", + "name": { + "ja": "影のクローク", + "en": "Cloak of shadow" + }, + "description": { + "ja": "影のオーラを身にまとい、敵に影のダメージを与える。", + "en": "Gives aura of shadow." + } + }, + { + "spell_id": 22, + "spell_tag": "Pain_to_mana", + "name": { + "ja": "苦痛を魔力に", + "en": "Pain to mana" + }, + "description": { + "ja": "視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", + "en": "Deals psychic damage to all monsters in sight and drains some mana." + } + }, + { + "spell_id": 23, + "spell_tag": "Eye_for_an_eye", + "name": { + "ja": "目には目を", + "en": "Eye for an eye" + }, + "description": { + "ja": "打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", + "en": "Returns same damage which you got to the monster which damaged you." + } + } + ] + }, + { + "name": { + "ja": "[禁呪法大全]", + "en": "[Forbidden Cursebook]" + }, + "spells": [ + { + "spell_id": 24, + "spell_tag": "Anti_multiply_barrier", + "name": { + "ja": "反増殖結界", + "en": "Anti multiply barrier" + }, + "description": { + "ja": "その階の増殖するモンスターの増殖を阻止する。", + "en": "Obstructs all multiplying by monsters on entire floor." + } + }, + { + "spell_id": 25, + "spell_tag": "Restoration", + "name": { + "ja": "全復活", + "en": "Restoration" + }, + "description": { + "ja": "経験値を徐々に復活し、減少した能力値を回復させる。", + "en": "Restores experience and status." + } + }, + { + "spell_id": 26, + "spell_tag": "Drain_curse_power", + "name": { + "ja": "呪力吸収", + "en": "Drain curse power" + }, + "description": { + "ja": "呪われた装備品の呪いを吸収して魔力を回復する。", + "en": "Drains curse on your equipment and heals SP a little." + } + }, + { + "spell_id": 27, + "spell_tag": "Swords_to_vampires", + "name": { + "ja": "吸血の刃", + "en": "Swords to vampires" + }, + "description": { + "ja": "吸血属性で攻撃する。", + "en": "Gives vampiric ability to your weapon." + } + }, + { + "spell_id": 28, + "spell_tag": "Word_of_stun", + "name": { + "ja": "朦朧の言葉", + "en": "Word of stun" + }, + "description": { + "ja": "視界内のモンスターを朦朧とさせる。", + "en": "Stuns all monsters in your sight." + } + }, + { + "spell_id": 29, + "spell_tag": "Moving_into_shadow", + "name": { + "ja": "影移動", + "en": "Moving into shadow" + }, + "description": { + "ja": "モンスターの隣のマスに瞬間移動する。", + "en": "Teleports you close to a monster." + } + }, + { + "spell_id": 30, + "spell_tag": "Anti_magic_barrier", + "name": { + "ja": "反魔法結界", + "en": "Anti magic barrier" + }, + "description": { + "ja": "視界内のモンスターの魔法を阻害するバリアを張る。", + "en": "Obstructs all magic spells of monsters in your sight." + } + }, + { + "spell_id": 31, + "spell_tag": "Revenge_sentence", + "name": { + "ja": "復讐の宣告", + "en": "Revenge sentence" + }, + "description": { + "ja": "数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。", + "en": "Fires a ball of hell fire to try avenging damage from a few turns." + } + } + ] + } + ] } ] -} +} \ No newline at end of file diff --git a/schema/SpellDefinitions.schema.json b/schema/SpellDefinitions.schema.json index c6a4ad19a4..98174066d6 100644 --- a/schema/SpellDefinitions.schema.json +++ b/schema/SpellDefinitions.schema.json @@ -31,7 +31,10 @@ "ARCANE", "CRAFT", "DEMON", - "CRUSADE" + "CRUSADE", + "MUSIC", + "HISSATSU", + "HEX" ] }, "books": { diff --git a/src/system/spell-info-list.cpp b/src/system/spell-info-list.cpp index 6a331c58bc..ba993b2b4a 100644 --- a/src/system/spell-info-list.cpp +++ b/src/system/spell-info-list.cpp @@ -5,7 +5,7 @@ SpellInfoList SpellInfoList::instance{}; void SpellInfoList::initiallize() { - this->spell_list.assign(magic_realm_type::MAX_MAGIC + 1, std::vector(SPELLS_IN_REALM)); + this->spell_list.assign(magic_realm_type::REALM_MAX, std::vector(SPELLS_IN_REALM)); } SpellInfoList &SpellInfoList::get_instance() diff --git a/src/system/spell-info-list.h b/src/system/spell-info-list.h index b7951bb4e8..a12fc939eb 100644 --- a/src/system/spell-info-list.h +++ b/src/system/spell-info-list.h @@ -20,6 +20,9 @@ inline const std::unordered_map realms_list = { { "CRAFT", 7 }, { "DEMON", 8 }, { "CRUSADE", 9 }, + { "MUSIC", 15 }, + { "HISSATSU", 16 }, + { "HEX", 17 }, }; class SpellInfo { From cb30e4b4452d6d55933a4f8f614b39809f2434a3 Mon Sep 17 00:00:00 2001 From: dis Date: Mon, 1 Jul 2024 16:46:20 +0900 Subject: [PATCH 03/16] =?UTF-8?q?[Refactor]=20=E6=AD=8C/=E6=AD=A6=E8=8A=B8?= =?UTF-8?q?/=E5=91=AA=E8=A1=93=E3=81=AE=E5=91=AA=E6=96=87=E6=83=85?= =?UTF-8?q?=E5=A0=B1=E3=82=92=E5=A4=96=E9=83=A8=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=8B=E3=82=89=E5=8F=96=E5=BE=97=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 該当の領域の呪文名と呪文説明文を外部ファイルから取得する。 --- src/realm/realm-hex.cpp | 213 +----------------- src/realm/realm-hissatsu.cpp | 249 +-------------------- src/realm/realm-song.cpp | 420 ++++++++--------------------------- 3 files changed, 112 insertions(+), 770 deletions(-) diff --git a/src/realm/realm-hex.cpp b/src/realm/realm-hex.cpp index f83de5accd..8da1e15995 100644 --- a/src/realm/realm-hex.cpp +++ b/src/realm/realm-hex.cpp @@ -43,6 +43,7 @@ #include "system/item-entity.h" #include "system/player-type-definition.h" #include "system/redrawing-flags-updater.h" +#include "system/spell-info-list.h" #include "target/grid-selector.h" #include "target/target-getter.h" #include "term/screen-processor.h" @@ -71,15 +72,19 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s auto stop = mode == SpellProcessType::STOP; auto should_continue = true; int power; + + auto &list = SpellInfoList::get_instance().spell_list[REALM_HEX]; + + if (name) { + return list[spell].name; + } + if (description) { + return list[spell].description; + } + switch (spell) { /*** 1st book (0-7) ***/ case HEX_BLESS: - if (name) { - return _("邪なる祝福", "Evily blessing"); - } - if (description) { - return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC"); - } if (cast) { if (!player_ptr->blessed) { msg_print(_("高潔な気分になった!", "You feel righteous!")); @@ -93,12 +98,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; case HEX_CURE_LIGHT: { - if (name) { - return _("軽傷の治癒", "Cure light wounds"); - } - if (description) { - return _("HPや傷を少し回復させる。", "Heals cuts and HP a little."); - } const Dice dice(1, 10); if (info) { return info_heal(dice, 0); @@ -112,12 +111,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_DEMON_AURA: { - if (name) { - return _("悪魔のオーラ", "Demonic aura"); - } - if (description) { - return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration."); - } if (cast) { msg_print(_("体が炎のオーラで覆われた。", "You are enveloped by a fiery aura!")); } @@ -127,12 +120,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_STINKING_MIST: { - if (name) { - return _("悪臭霧", "Stinking mist"); - } - if (description) { - return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals a little poison damage to all monsters in your sight."); - } const Dice dice(1, player_ptr->lev / 2 + 5); if (info) { return info_damage(dice); @@ -143,26 +130,12 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_XTRA_MIGHT: { - if (name) { - return _("腕力強化", "Extra might"); - } - if (description) { - return _("術者の腕力を上昇させる。", "Attempts to increase your strength."); - } if (cast) { msg_print(_("何だか力が湧いて来る。", "You feel stronger.")); } break; } case HEX_CURSE_WEAPON: { - if (name) { - return _("武器呪縛", "Curse weapon"); - } - - if (description) { - return _("装備している武器を呪う。", "Curses your weapon."); - } - if (cast) { constexpr auto q = _("どれを呪いますか?", "Which weapon do you curse?"); constexpr auto s = _("武器を装備していない。", "You're not wielding a weapon."); @@ -233,12 +206,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_DETECT_EVIL: { - if (name) { - return _("邪悪感知", "Evil detection"); - } - if (description) { - return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters."); - } if (info) { return info_range(MAX_PLAYER_SIGHT); } @@ -248,14 +215,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_PATIENCE: { - if (name) { - return _("我慢", "Patience"); - } - - if (description) { - return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。", "Bursts hell fire strongly after enduring damage for a few turns."); - } - SpellHex spell_hex(player_ptr); power = std::min(200, spell_hex.get_revenge_power() * 2); if (info) { @@ -301,12 +260,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s /*** 2nd book (8-15) ***/ case HEX_ICE_ARMOR: { - if (name) { - return _("氷の鎧", "Armor of ice"); - } - if (description) { - return _("氷のオーラを身にまとい、防御力が上昇する。", "Surrounds you with an icy aura and gives a bonus to AC."); - } if (cast) { msg_print(_("体が氷の鎧で覆われた。", "You are enveloped by icy armor!")); } @@ -316,12 +269,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_CURE_SERIOUS: { - if (name) { - return _("重傷の治癒", "Cure serious wounds"); - } - if (description) { - return _("体力や傷を多少回復させる。", "Heals cuts and HP."); - } const Dice dice(2, 10); if (info) { return info_heal(dice); @@ -335,14 +282,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_INHALE: { - if (name) { - return _("薬品吸入", "Inhale potion"); - } - - if (description) { - return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling spell casting."); - } - SpellHex spell_hex(player_ptr); if (cast) { spell_hex.set_casting_flag(HEX_INHALE); @@ -354,12 +293,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_VAMP_MIST: { - if (name) { - return _("衰弱の霧", "Hypodynamic mist"); - } - if (description) { - return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。", "Deals a little life-draining damage to all monsters in your sight."); - } const Dice dice(1, player_ptr->lev / 2 + 5); if (info) { return info_damage(dice); @@ -370,13 +303,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_RUNESWORD: { - if (name) { - return _("魔剣化", "Swords to runeswords"); - } - if (description) { - return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。", - "Gives vorpal ability to your weapon. Increases damage from your weapon acccording to curse of your weapon."); - } if (cast) { #ifdef JP msg_print("あなたの武器が黒く輝いた。"); @@ -398,12 +324,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_CONFUSION: { - if (name) { - return _("混乱の手", "Touch of confusion"); - } - if (description) { - return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack."); - } if (cast) { msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red.")); } @@ -413,25 +333,12 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_BUILDING: { - if (name) { - return _("肉体強化", "Building up"); - } - if (description) { - return _( - "術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。", "Attempts to increases your strength, dexterity and constitusion."); - } if (cast) { msg_print(_("身体が強くなった気がした。", "You feel your body is more developed now.")); } break; } case HEX_ANTI_TELE: { - if (name) { - return _("反テレポート結界", "Anti teleport barrier"); - } - if (description) { - return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight."); - } power = player_ptr->lev * 3 / 2; if (info) { return info_power(power); @@ -443,12 +350,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s } /*** 3rd book (16-23) ***/ case HEX_SHOCK_CLOAK: { - if (name) { - return _("衝撃のクローク", "Cloak of shock"); - } - if (description) { - return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed."); - } if (cast) { msg_print(_("体が稲妻のオーラで覆われた。", "You are enveloped by an electrical aura!")); } @@ -458,12 +359,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_CURE_CRITICAL: { - if (name) { - return _("致命傷の治癒", "Cure critical wounds"); - } - if (description) { - return _("体力や傷を回復させる。", "Heals cuts and HP greatly."); - } const Dice dice(4, 10); if (info) { return info_heal(dice); @@ -477,12 +372,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_RECHARGE: { - if (name) { - return _("呪力封入", "Recharging"); - } - if (description) { - return _("魔法の道具に魔力を再充填する。", "Recharges a magic device."); - } power = player_ptr->lev * 2; if (info) { return info_power(power); @@ -496,12 +385,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_RAISE_DEAD: { - if (name) { - return _("死者復活", "Animate Dead"); - } - if (description) { - return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead."); - } if (cast) { msg_print(_("死者への呼びかけを始めた。", "You start to call the dead.!")); } @@ -511,12 +394,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_CURSE_ARMOUR: { - if (name) { - return _("防具呪縛", "Curse armor"); - } - if (description) { - return _("装備している防具に呪いをかける。", "Curse a piece of armour that you are wielding."); - } if (cast) { constexpr auto q = _("どれを呪いますか?", "Which piece of armour do you curse?"); constexpr auto s = _("防具を装備していない。", "You're not wearing any armor."); @@ -589,12 +466,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_SHADOW_CLOAK: { - if (name) { - return _("影のクローク", "Cloak of shadow"); - } - if (description) { - return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow."); - } if (cast) { auto *o_ptr = &player_ptr->inventory_list[INVEN_OUTER]; @@ -626,12 +497,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_PAIN_TO_MANA: { - if (name) { - return _("苦痛を魔力に", "Pain to mana"); - } - if (description) { - return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damage to all monsters in sight and drains some mana."); - } const Dice dice(1, player_ptr->lev * 3 / 2); if (info) { return info_damage(dice); @@ -642,12 +507,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_EYE_FOR_EYE: { - if (name) { - return _("目には目を", "Eye for an eye"); - } - if (description) { - return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you."); - } if (cast) { msg_print(_("復讐したい欲望にかられた。", "You feel very vengeful.")); } @@ -655,24 +514,12 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s } /*** 4th book (24-31) ***/ case HEX_ANTI_MULTI: { - if (name) { - return _("反増殖結界", "Anti multiply barrier"); - } - if (description) { - return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters on entire floor."); - } if (cast) { msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not multiply.")); } break; } case HEX_RESTORE: { - if (name) { - return _("全復活", "Restoration"); - } - if (description) { - return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status."); - } if (cast) { msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return.")); } @@ -736,12 +583,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_DRAIN_CURSE: { - if (name) { - return _("呪力吸収", "Drain curse power"); - } - if (description) { - return _("呪われた装備品の呪いを吸収して魔力を回復する。", "Drains curse on your equipment and heals SP a little."); - } if (cast) { constexpr auto q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?"); constexpr auto s = _("呪われたアイテムを装備していない。", "You have no cursed equipment."); @@ -776,12 +617,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_VAMP_BLADE: { - if (name) { - return _("吸血の刃", "Swords to vampires"); - } - if (description) { - return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon."); - } if (cast) { #ifdef JP msg_print("あなたの武器が血を欲している。"); @@ -803,12 +638,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_STUN_MONSTERS: { - if (name) { - return _("朦朧の言葉", "Word of stun"); - } - if (description) { - return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight."); - } power = player_ptr->lev * 4; if (info) { return info_power(power); @@ -819,12 +648,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_SHADOW_MOVE: { - if (name) { - return _("影移動", "Moving into shadow"); - } - if (description) { - return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster."); - } if (cast) { int i, dir; POSITION y, x; @@ -869,12 +692,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_ANTI_MAGIC: { - if (name) { - return _("反魔法結界", "Anti magic barrier"); - } - if (description) { - return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spells of monsters in your sight."); - } power = player_ptr->lev * 3 / 2; if (info) { return info_power(power); @@ -885,14 +702,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s break; } case HEX_REVENGE: { - if (name) { - return _("復讐の宣告", "Revenge sentence"); - } - - if (description) { - return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。", "Fires a ball of hell fire to try avenging damage from a few turns."); - } - SpellHex spell_hex(player_ptr); power = spell_hex.get_revenge_power(); if (info) { diff --git a/src/realm/realm-hissatsu.cpp b/src/realm/realm-hissatsu.cpp index 471a65a2ae..f6d91edd22 100644 --- a/src/realm/realm-hissatsu.cpp +++ b/src/realm/realm-hissatsu.cpp @@ -46,6 +46,7 @@ #include "system/monster-race-info.h" #include "system/player-type-definition.h" #include "system/redrawing-flags-updater.h" +#include "system/spell-info-list.h" #include "target/grid-selector.h" #include "target/projection-path-calculator.h" #include "target/target-getter.h" @@ -70,15 +71,17 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s PLAYER_LEVEL plev = player_ptr->lev; + auto &list = SpellInfoList::get_instance().spell_list[REALM_HISSATSU]; + + if (name) { + return list[spell_id].name; + } + if (desc) { + return list[spell_id].description; + } + switch (spell_id) { case 0: - if (name) { - return _("飛飯綱", "Tobi-Izuna"); - } - if (desc) { - return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a monster two squares away."); - } - if (cast) { project_length = 2; int dir; @@ -91,13 +94,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 1: - if (name) { - return _("五月雨斬り", "3-Way Attack"); - } - if (desc) { - return _("3方向に対して攻撃する。", "Attacks in 3 directions at one time."); - } - if (cast) { const auto cdir = get_direction_as_cdir(player_ptr); if (!cdir) { @@ -122,14 +118,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 2: - if (name) { - return _("ブーメラン", "Boomerang"); - } - if (desc) { - return _( - "武器を手元に戻ってくるように投げる。戻ってこないこともある。", "Throws current weapon. It'll return to your hand unless the action failed."); - } - if (cast) { if (!ThrowCommand(player_ptr).do_cmd_throw(1, true, -1)) { return std::nullopt; @@ -138,13 +126,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 3: - if (name) { - return _("焔霊", "Burning Strike"); - } - if (desc) { - return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -162,26 +143,12 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 4: - if (name) { - return _("殺気感知", "Detect Ferocity"); - } - if (desc) { - return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except the mindless in your vicinity."); - } - if (cast) { detect_monsters_mind(player_ptr, DETECT_RAD_DEFAULT); } break; case 5: - if (name) { - return _("みね打ち", "Strike to Stun"); - } - if (desc) { - return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster next to you."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -199,14 +166,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 6: - if (name) { - return _("カウンター", "Counter"); - } - if (desc) { - return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。", - "Prepares to counterattack. When attacked by a monster, strikes back using SP each time."); - } - if (cast) { if (player_ptr->riding) { msg_print(_("乗馬中には無理だ。", "You cannot do it when riding.")); @@ -218,14 +177,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 7: - if (name) { - return _("払い抜け", "Harainuke"); - } - if (desc) { - return _("攻撃した後、反対側に抜ける。", - "In one action, attacks a monster with your weapons normally and then moves to the space beyond the monster if that space is not blocked."); - } - if (cast) { if (player_ptr->riding) { msg_print(_("乗馬中には無理だ。", "You cannot do it when riding.")); @@ -260,13 +211,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 8: - if (name) { - return _("サーペンツタン", "Serpent's Tongue"); - } - if (desc) { - return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -285,14 +229,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 9: - if (name) { - return _("斬魔剣弐の太刀", "Zammaken"); - } - if (desc) { - return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。", - "Attacks an evil unliving monster with great damage. Has no effect on other monsters."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -311,13 +247,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 10: - if (name) { - return _("裂風剣", "Wind Blast"); - } - if (desc) { - return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster and blows it away."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -372,14 +301,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 11: - if (name) { - return _("刀匠の目利き", "Judge"); - } - if (desc) { - return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。", - "Identifies a weapon or armor. *Identifies* the item at level 45."); - } - if (cast) { if (plev > 44) { if (!identify_fully(player_ptr, true)) { @@ -394,13 +315,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 12: - if (name) { - return _("破岩斬", "Rock Smash"); - } - if (desc) { - return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock or greatly damages a monster made of rocks."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -424,14 +338,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 13: - if (name) { - return _("乱れ雪月花", "Midare-Setsugekka"); - } - if (desc) { - return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。", - "Attacks a monster with an increased number of attacks and more damage unless it has resistance to cold."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -450,14 +356,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 14: - if (name) { - return _("急所突き", "Spot Aiming"); - } - if (desc) { - return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。", - "Attempts to kill a monster instantly. If that fails, causes only 1HP of damage."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -476,13 +374,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 15: - if (name) { - return _("魔神斬り", "Majingiri"); - } - if (desc) { - return _("会心の一撃で攻撃する。攻撃がかわされやすい。", "Attempts to attack with a critical hit, but this attack is easy to evade for a monster."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -501,14 +392,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 16: - if (name) { - return _("捨て身", "Desperate Attack"); - } - if (desc) { - return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。", - "Attacks with all of your power, but all damage you take will be doubled for one turn."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -528,13 +411,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 17: - if (name) { - return _("雷撃鷲爪斬", "Lightning Eagle"); - } - if (desc) { - return _("電撃耐性のないモンスターに非常に大きいダメージを与える。", "Attacks a monster with more damage unless it has resistance to electricity."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -553,13 +429,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 18: - if (name) { - return _("入身", "Rush Attack"); - } - if (desc) { - return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at the same time."); - } - if (cast) { if (!rush_attack(player_ptr, nullptr)) { return std::nullopt; @@ -568,15 +437,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 19: - if (name) { - return _("赤流渦", "Bloody Maelstrom"); - } - - if (desc) { - return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。", - "Attacks all adjacent monsters with power corresponding to your cuts. Then increases your cuts. Has no effect on unliving monsters."); - } - if (cast) { const auto current_cut = player_ptr->effects()->cut().current(); short new_cut = current_cut < 300 ? current_cut + 300 : current_cut * 2; @@ -603,13 +463,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 20: - if (name) { - return _("激震撃", "Earthquake Blow"); - } - if (desc) { - return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -627,13 +480,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 21: - if (name) { - return _("地走り", "Crack"); - } - if (desc) { - return _("衝撃波のビームを放つ。", "Fires a shock wave as a beam."); - } - if (cast) { int total_damage = 0, basedam, i; ItemEntity *o_ptr; @@ -674,14 +520,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 22: - if (name) { - return _("気迫の雄叫び", "War Cry"); - } - if (desc) { - return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。", - "Damages all monsters in sight with sound. Aggravates nearby monsters."); - } - if (cast) { msg_print(_("雄叫びをあげた!", "You roar!")); project_all_los(player_ptr, AttributeType::SOUND, randint1(plev * 3)); @@ -690,13 +528,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 23: - if (name) { - return _("無双三段", "Musou-Sandan"); - } - if (desc) { - return _("強力な3段攻撃を繰り出す。", "Attacks with three powerful strikes."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -768,14 +599,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 24: - if (name) { - return _("吸血鬼の牙", "Vampire's Fang"); - } - if (desc) { - return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。", - "Attacks with vampiric strikes which absorb HP from a monster and heal you. Has no effect on unliving monsters."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -794,13 +617,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 25: - if (name) { - return _("幻惑", "Moon Dazzling"); - } - if (desc) { - return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and put to sleep all waking monsters."); - } - if (cast) { msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon...")); project_all_los(player_ptr, AttributeType::ENGETSU, plev * 4); @@ -808,14 +624,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 26: - if (name) { - return _("百人斬り", "Hundred Slaughter"); - } - if (desc) { - return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。", - "Performs a series of rush attacks. The series continues as long as the attacked monster dies and you have sufficient SP."); - } - if (cast) { const int mana_cost_per_monster = 8; bool is_new = true; @@ -853,14 +661,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 27: - if (name) { - return _("天翔龍閃", "Dragonic Flash"); - } - if (desc) { - return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。", - "Runs toward given location while attacking all monsters on the path."); - } - if (cast) { POSITION y, x; @@ -884,13 +684,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 28: - if (name) { - return _("二重の剣撃", "Twin Slash"); - } - if (desc) { - return _("1ターンで2度攻撃を行う。", "Attack twice in one turn."); - } - if (cast) { int dir; if (!get_rep_dir(player_ptr, &dir)) { @@ -913,13 +706,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 29: - if (name) { - return _("虎伏絶刀勢", "Kofuku-Zettousei"); - } - if (desc) { - return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even affects nearby monsters."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -967,14 +753,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 30: - if (name) { - return _("慶雲鬼忍剣", "Keiun-Kininken"); - } - if (desc) { - return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。", - "Attacks a monster with extremely powerful damage, but you also take some damage. Hurts an undead monster greatly."); - } - if (cast) { const auto dir = get_direction(player_ptr); if (!dir || (dir == 5)) { @@ -994,13 +772,6 @@ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX s break; case 31: - if (name) { - return _("切腹", "Harakiri"); - } - if (desc) { - return _("「武士道とは、死ぬことと見つけたり。」", "'Bushido, the way of warriors, is found in death'"); - } - if (cast) { int i; if (!input_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) { diff --git a/src/realm/realm-song.cpp b/src/realm/realm-song.cpp index 1895c4356a..4159f7c996 100644 --- a/src/realm/realm-song.cpp +++ b/src/realm/realm-song.cpp @@ -23,6 +23,7 @@ #include "status/experience.h" #include "system/player-type-definition.h" #include "system/redrawing-flags-updater.h" +#include "system/spell-info-list.h" #include "target/target-getter.h" #include "timed-effect/timed-effects.h" #include "util/dice.h" @@ -71,15 +72,17 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; + auto &list = SpellInfoList::get_instance().spell_list[REALM_MUSIC]; + + if (name) { + return list[spell].name; + } + if (desc) { + return list[spell].description; + } + switch (spell) { case 0: - if (name) { - return _("遅鈍の歌", "Song of Holding"); - } - if (desc) { - return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -104,13 +107,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 1: - if (name) { - return _("祝福の歌", "Song of Blessing"); - } - if (desc) { - return _("命中率とACのボーナスを得る。", "Gives a bonus to hit and AC for a few turns."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -130,13 +126,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 2: - if (name) { - return _("崩壊の音色", "Wrecking Note"); - } - if (desc) { - return _("轟音のボルトを放つ。", "Fires a bolt of sound."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -160,13 +149,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 3: - if (name) { - return _("朦朧の旋律", "Stun Pattern"); - } - if (desc) { - return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -192,13 +174,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 4: - if (name) { - return _("生命の流れ", "Flow of Life"); - } - if (desc) { - return _("体力を少し回復させる。", "Heals HP a little."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -224,13 +199,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 5: - if (name) { - return _("太陽の歌", "Song of the Sun"); - } - if (desc) { - return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -252,13 +220,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 6: - if (name) { - return _("恐怖の歌", "Song of Fear"); - } - if (desc) { - return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -284,14 +245,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 7: - if (name) { - return _("戦いの歌", "Heroic Ballad"); - } - - if (desc) { - return _("ヒーロー気分になる。", "Removes fear. Gives a bonus to hit for a while. Heals you for 10 HP."); - } - if (cast || fail) { stop_singing(player_ptr); } @@ -314,17 +267,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 8: - if (name) { - return _("霊的知覚", "Clairaudience"); - } - if (desc) { - return _("近くの罠/扉/" - "階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久" - "に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。", - "Detects traps, doors and stairs in your vicinity. And detects all monsters at level 15, treasures and items at level 20. Maps nearby area at " - "level 25. Lights and know the whole level at level 40. These effects accumulate as the song continues."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -387,13 +329,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 9: - if (name) { - return _("魂の歌", "Soul Shriek"); - } - if (desc) { - return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -419,13 +354,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 10: - if (name) { - return _("知識の歌", "Song of Lore"); - } - if (desc) { - return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -455,13 +383,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 11: - if (name) { - return _("隠遁の歌", "Hiding Tune"); - } - if (desc) { - return _("隠密行動能力を上昇させる。", "Gives improved stealth."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -481,13 +402,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 12: - if (name) { - return _("幻影の旋律", "Illusion Pattern"); - } - if (desc) { - return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -513,13 +427,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 13: - if (name) { - return _("破滅の叫び", "Doomcall"); - } - if (desc) { - return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -544,35 +451,19 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; - case 14: - if (name) { - return _("フィリエルの歌", "Firiel's Song"); - } - if (desc) { - return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpses and skeletons. And makes them your pets."); + case 14: { + /* Stop singing before start another */ + if (cast || fail) { + stop_singing(player_ptr); } - { - /* Stop singing before start another */ - if (cast || fail) { - stop_singing(player_ptr); - } - - if (cast) { - msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song...")); - animate_dead(player_ptr, 0, player_ptr->y, player_ptr->x); - } + if (cast) { + msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song...")); + animate_dead(player_ptr, 0, player_ptr->y, player_ptr->x); } - break; + } break; case 15: - if (name) { - return _("旅の仲間", "Fellowship Chant"); - } - if (desc) { - return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -598,13 +489,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 16: - if (name) { - return _("フルゥの行進曲", "Hru's March"); - } - if (desc) { - return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -627,15 +511,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 17: - if (name) { - return _("フィンロドの護り", "Finrod's Resistance"); - } - if (desc) { - return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", - "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to those from equipment for more powerful " - "resistances."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -671,13 +546,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 18: - if (name) { - return _("ホビットのメロディ", "Hobbit Melodies"); - } - if (desc) { - return _("加速する。", "Hastes you."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -696,43 +564,26 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; - case 19: - if (name) { - return _("歪んだ世界", "World Contortion"); - } - if (desc) { - return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted."); - } - - { - POSITION rad = plev / 15 + 1; - POWER power = plev * 3 + 1; - - if (info) { - return info_radius(rad); - } - - /* Stop singing before start another */ - if (cast || fail) { - stop_singing(player_ptr); - } + case 19: { + POSITION rad = plev / 15 + 1; + POWER power = plev * 3 + 1; - if (cast) { - msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody...")); - project(player_ptr, 0, rad, player_ptr->y, player_ptr->x, power, AttributeType::AWAY_ALL, PROJECT_KILL); - } + if (info) { + return info_radius(rad); } - break; - case 20: - if (name) { - return _("退散の歌", "Dispelling Chant"); + /* Stop singing before start another */ + if (cast || fail) { + stop_singing(player_ptr); } - if (desc) { - return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。", - "Damages all monsters in sight. Hurts evil monsters greatly."); + + if (cast) { + msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody...")); + project(player_ptr, 0, rad, player_ptr->y, player_ptr->x, power, AttributeType::AWAY_ALL, PROJECT_KILL); } + } break; + case 20: /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -759,13 +610,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 21: - if (name) { - return _("サルマンの甘言", "The Voice of Saruman"); - } - if (desc) { - return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and put to sleep all monsters in sight."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -791,73 +635,47 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; - case 22: - if (name) { - return _("嵐の音色", "Song of the Tempest"); - } - if (desc) { - return _("轟音のビームを放つ。", "Fires a beam of sound."); + case 22: { + const Dice dice(15 + (plev - 1) / 2, 10); + + if (info) { + return info_damage(dice); } - { - const Dice dice(15 + (plev - 1) / 2, 10); + /* Stop singing before start another */ + if (cast || fail) { + stop_singing(player_ptr); + } - if (info) { - return info_damage(dice); + if (cast) { + if (!get_aim_dir(player_ptr, &dir)) { + return std::nullopt; } - /* Stop singing before start another */ - if (cast || fail) { - stop_singing(player_ptr); - } + fire_beam(player_ptr, AttributeType::SOUND, dir, dice.roll()); + } + } break; - if (cast) { - if (!get_aim_dir(player_ptr, &dir)) { - return std::nullopt; - } + case 23: { + int base = 15; + const Dice dice(1, 20); - fire_beam(player_ptr, AttributeType::SOUND, dir, dice.roll()); - } + if (info) { + return info_delay(base, dice); } - break; - case 23: - if (name) { - return _("もう一つの世界", "Ambarkanta"); - } - if (desc) { - return _("現在の階を再構成する。", "Recreates current dungeon level."); + /* Stop singing before start another */ + if (cast || fail) { + stop_singing(player_ptr); } - { - int base = 15; - const Dice dice(1, 20); - - if (info) { - return info_delay(base, dice); - } - - /* Stop singing before start another */ - if (cast || fail) { - stop_singing(player_ptr); - } - - if (cast) { - msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth...")); - reserve_alter_reality(player_ptr, dice.roll() + base); - } + if (cast) { + msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth...")); + reserve_alter_reality(player_ptr, dice.roll() + base); } - break; + } break; case 24: - if (name) { - return _("破壊の旋律", "Wrecking Pattern"); - } - if (desc) { - return _( - "周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", "Shakes dungeon structure, and results in random swapping of floors and walls."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -883,13 +701,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; case 25: - if (name) { - return _("停滞の歌", "Stationary Shriek"); - } - if (desc) { - return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); @@ -914,36 +725,19 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; - case 26: - if (name) { - return _("エルベレスの聖歌", "Elbereth's Chant"); - } - if (desc) { - return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", - "Sets a rune on the floor beneath you. If you are on a rune, monsters cannot attack you but can try to break the rune."); + case 26: { + /* Stop singing before start another */ + if (cast || fail) { + stop_singing(player_ptr); } - { - /* Stop singing before start another */ - if (cast || fail) { - stop_singing(player_ptr); - } - - if (cast) { - msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field...")); - create_rune_protection_one(player_ptr); - } + if (cast) { + msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field...")); + create_rune_protection_one(player_ptr); } - break; + } break; case 27: { - if (name) { - return _("英雄の詩", "The Hero's Poem"); - } - - if (desc) { - return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。", "Hastes you. Gives heroism. Damages all monsters in sight."); - } if (cast || fail) { stop_singing(player_ptr); @@ -980,13 +774,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; } case 28: { - if (name) { - return _("ヤヴァンナの助け", "Relief of Yavanna"); - } - - if (desc) { - return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also completely heals cuts and being stunned."); - } if (cast || fail) { stop_singing(player_ptr); @@ -1011,68 +798,43 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel break; } - case 29: - if (name) { - return _("再生の歌", "Goddess's rebirth"); + case 29: { + /* Stop singing before start another */ + if (cast || fail) { + stop_singing(player_ptr); } - if (desc) { - return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience."); + + if (cast) { + msg_print( + _("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。", "You strew light and beauty in the dark as you sing. You feel refreshed.")); + (void)restore_all_status(player_ptr); + (void)restore_level(player_ptr); } + } break; - { - /* Stop singing before start another */ - if (cast || fail) { - stop_singing(player_ptr); - } + case 30: { + const Dice dice(50 + plev, 10); + POSITION rad = 0; - if (cast) { - msg_print( - _("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。", "You strew light and beauty in the dark as you sing. You feel refreshed.")); - (void)restore_all_status(player_ptr); - (void)restore_level(player_ptr); - } + if (info) { + return info_damage(dice); } - break; - case 30: - if (name) { - return _("サウロンの魔術", "Wizardry of Sauron"); - } - if (desc) { - return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound."); + /* Stop singing before start another */ + if (cast || fail) { + stop_singing(player_ptr); } - { - const Dice dice(50 + plev, 10); - POSITION rad = 0; - - if (info) { - return info_damage(dice); - } - - /* Stop singing before start another */ - if (cast || fail) { - stop_singing(player_ptr); + if (cast) { + if (!get_aim_dir(player_ptr, &dir)) { + return std::nullopt; } - if (cast) { - if (!get_aim_dir(player_ptr, &dir)) { - return std::nullopt; - } - - fire_ball(player_ptr, AttributeType::SOUND, dir, dice.roll(), rad); - } + fire_ball(player_ptr, AttributeType::SOUND, dir, dice.roll(), rad); } - break; + } break; case 31: - if (name) { - return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge"); - } - if (desc) { - return _("ダメージを受けなくなるバリアを張る。", "Generates a barrier which completely protects you from almost all damage."); - } - /* Stop singing before start another */ if (cast || fail) { stop_singing(player_ptr); From 974c676edf296a630373f483ecdcea5f13c7e82c Mon Sep 17 00:00:00 2001 From: Habu Date: Mon, 1 Jul 2024 00:28:28 +0900 Subject: [PATCH 04/16] =?UTF-8?q?[Fix]=20=E3=82=B9=E3=83=9D=E3=82=A4?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=81=AE=E9=AD=94=E6=B3=95=E9=A0=98=E5=9F=9F?= =?UTF-8?q?=E5=87=BA=E5=8A=9B=E3=81=AE=E5=86=85=E5=AE=B9=E3=81=8C=E3=81=8A?= =?UTF-8?q?=E3=81=8B=E3=81=97=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit off-by-oneエラーによりスポイラーの魔法領域出力の内容がおかしくなっている ので、正しい内容が出力されるように修正する。 --- src/wizard/wizard-spoiler.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/wizard/wizard-spoiler.cpp b/src/wizard/wizard-spoiler.cpp index aefa2662be..7a913484c3 100644 --- a/src/wizard/wizard-spoiler.cpp +++ b/src/wizard/wizard-spoiler.cpp @@ -182,11 +182,10 @@ static SpoilerOutputResultType spoil_player_spell() PlayerType dummy_p; dummy_p.lev = 1; - for (auto c = 0; c < PLAYER_CLASS_TYPE_MAX; c++) { - auto class_ptr = &class_info.at(i2enum(c)); - spoil_out(format("[[Class: %s]]\n", class_ptr->title.data())); + for (const auto pclass : EnumRange(PlayerClassType::WARRIOR, PlayerClassType::MAX)) { + spoil_out(format("[[Class: %s]]\n", class_info.at(pclass).title.data())); - auto magic_ptr = &class_magics_info[c]; + const auto *magic_ptr = &class_magics_info[enum2i(pclass)]; std::string book_name = _("なし", "None"); if (magic_ptr->spell_book != ItemKindType::NONE) { ItemEntity item({ magic_ptr->spell_book, 0 }); @@ -198,24 +197,24 @@ static SpoilerOutputResultType spoil_player_spell() } constexpr auto mes = "BookType:%s Stat:%s %s%s%sType:%d Weight:%d\n"; - const auto &spell = wiz_spell_stat[magic_ptr->spell_stat]; + const auto &spell_stat_txt = wiz_spell_stat[magic_ptr->spell_stat]; auto trainable = magic_ptr->is_spell_trainable ? "Trainable " : ""; auto glove = magic_ptr->has_glove_mp_penalty ? "GlovePenalty " : ""; auto failcap = magic_ptr->has_magic_fail_rate_cap ? "5%FailCap " : ""; auto spell_type = enum2i(magic_ptr->spell_book); - spoil_out(format(mes, book_name.data(), spell.data(), glove, failcap, trainable, spell_type, magic_ptr->spell_weight)); + spoil_out(format(mes, book_name.data(), spell_stat_txt.data(), glove, failcap, trainable, spell_type, magic_ptr->spell_weight)); if (magic_ptr->spell_book == ItemKindType::NONE) { spoil_out(_("呪文なし\n\n", "No spells.\n\n")); continue; } - for (int16_t r = 1; r < MAX_MAGIC; r++) { - spoil_out(format("[Realm: %s]\n", PlayerRealm::get_name(r).data())); + for (const auto realm : MAGIC_REALM_RANGE) { + spoil_out(format("[Realm: %s]\n", PlayerRealm::get_name(realm).data())); spoil_out("Name Lv Cst Dif Exp\n"); for (SPELL_IDX i = 0; i < 32; i++) { - auto spell_ptr = &magic_ptr->info[r][i]; - const auto spell_name = exe_spell(&dummy_p, r, i, SpellProcessType::NAME); - spoil_out(format("%-24s %2d %3d %3d %3d\n", spell_name->data(), spell_ptr->slevel, spell_ptr->smana, spell_ptr->sfail, spell_ptr->sexp)); + const auto &spell = PlayerRealm::get_spell_info(realm, i, pclass); + const auto spell_name = exe_spell(&dummy_p, realm, i, SpellProcessType::NAME); + spoil_out(format("%-24s %2d %3d %3d %3d\n", spell_name->data(), spell.slevel, spell.smana, spell.sfail, spell.sexp)); } spoil_out("\n"); } From 179f651701bc92e4a61e94aee85f33151692e66e Mon Sep 17 00:00:00 2001 From: Habu Date: Mon, 1 Jul 2024 00:28:28 +0900 Subject: [PATCH 05/16] =?UTF-8?q?[Feature]=20=E4=BD=BF=E7=94=A8=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E3=81=AA=E9=A0=98=E5=9F=9F=E3=81=AE=E3=81=BF=E3=82=B9?= =?UTF-8?q?=E3=83=9D=E3=82=A4=E3=83=A9=E3=83=BC=E3=81=AB=E5=87=BA=E5=8A=9B?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 最初から魔法を使用できない職業を除き、使用不可能な領域も含めてすべての 領域の情報を出力してしまっているので、職業ごとに使用可能な領域の情報 のみを出力するようにする。 --- src/wizard/wizard-spoiler.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/wizard/wizard-spoiler.cpp b/src/wizard/wizard-spoiler.cpp index 7a913484c3..af724edb1f 100644 --- a/src/wizard/wizard-spoiler.cpp +++ b/src/wizard/wizard-spoiler.cpp @@ -208,7 +208,14 @@ static SpoilerOutputResultType spoil_player_spell() continue; } + const auto choices = PlayerRealm::get_realm1_choices(pclass) | PlayerRealm::get_realm2_choices(pclass); + const auto is_every_magic = pclass == PlayerClassType::SORCERER || pclass == PlayerClassType::RED_MAGE; for (const auto realm : MAGIC_REALM_RANGE) { + /// @todo 歌・武芸・呪術への対応 + if (!is_every_magic && choices.has_not(realm)) { + continue; + } + spoil_out(format("[Realm: %s]\n", PlayerRealm::get_name(realm).data())); spoil_out("Name Lv Cst Dif Exp\n"); for (SPELL_IDX i = 0; i < 32; i++) { From 657f777d95857f93b096d48ab48f278f0c7b2827 Mon Sep 17 00:00:00 2001 From: Habu Date: Mon, 1 Jul 2024 00:54:15 +0900 Subject: [PATCH 06/16] =?UTF-8?q?[Feature]=20=E6=AD=8C=E3=83=BB=E6=AD=A6?= =?UTF-8?q?=E8=8A=B8=E3=83=BB=E5=91=AA=E8=A1=93=E3=81=AE=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E3=81=AE=E3=82=B9=E3=83=9D=E3=82=A4=E3=83=A9=E3=83=BC=E5=87=BA?= =?UTF-8?q?=E5=8A=9B=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/wizard/wizard-spoiler.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/wizard/wizard-spoiler.cpp b/src/wizard/wizard-spoiler.cpp index af724edb1f..d908ef01b8 100644 --- a/src/wizard/wizard-spoiler.cpp +++ b/src/wizard/wizard-spoiler.cpp @@ -210,9 +210,8 @@ static SpoilerOutputResultType spoil_player_spell() const auto choices = PlayerRealm::get_realm1_choices(pclass) | PlayerRealm::get_realm2_choices(pclass); const auto is_every_magic = pclass == PlayerClassType::SORCERER || pclass == PlayerClassType::RED_MAGE; - for (const auto realm : MAGIC_REALM_RANGE) { - /// @todo 歌・武芸・呪術への対応 - if (!is_every_magic && choices.has_not(realm)) { + for (const auto realm : EnumRange(REALM_LIFE, REALM_MAX)) { + if (!(is_every_magic && MAGIC_REALM_RANGE.contains(realm)) && choices.has_not(realm)) { continue; } From ee9836b53efc62d56470cede93dc15652ad42703 Mon Sep 17 00:00:00 2001 From: Habu Date: Tue, 2 Jul 2024 21:08:27 +0900 Subject: [PATCH 07/16] =?UTF-8?q?[Refactor]=20=E9=A0=98=E5=9F=9F=E3=81=8C?= =?UTF-8?q?=E6=9C=89=E5=8A=B9=E3=81=8B=E8=AA=BF=E3=81=B9=E3=82=8B=E5=88=A4?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 現在 REALM_NONE との比較によって領域が有効(魔法なしではなくなんらかの 魔法領域を使用可能)であるかをチェックしている箇所を、PlayerRealm::Realm クラスのメンバ関数 is_available() によってチェックするように変更する。 --- src/avatar/avatar.cpp | 6 ++++-- src/birth/character-builder.cpp | 4 ++-- src/cmd-action/cmd-spell.cpp | 11 ++++++----- src/io/read-pref-file.cpp | 4 ++-- src/knowledge/knowledge-experiences.cpp | 4 ++-- src/knowledge/knowledge-self.cpp | 4 ++-- src/player/player-realm.cpp | 5 +++++ src/player/player-realm.h | 1 + src/player/player-status-flags.cpp | 4 +++- src/player/player-status.cpp | 6 +++--- src/view/display-player.cpp | 6 +++--- src/view/object-describer.cpp | 4 +++- src/window/display-sub-windows.cpp | 5 +++-- 13 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/avatar/avatar.cpp b/src/avatar/avatar.cpp index c9ad98b23b..080239faad 100644 --- a/src/avatar/avatar.cpp +++ b/src/avatar/avatar.cpp @@ -16,6 +16,7 @@ #include "game-option/text-display-options.h" #include "player-info/class-info.h" #include "player-info/race-types.h" +#include "player/player-realm.h" #include "realm/realm-names-table.h" #include "system/player-type-definition.h" #include "system/redrawing-flags-updater.h" @@ -374,14 +375,15 @@ void initialize_virtues(PlayerType *player_ptr) } /* Get a virtue_names for realms */ - if (player_ptr->realm1) { + PlayerRealm pr(player_ptr); + if (pr.realm1().is_available()) { tmp_vir = get_realm_virtues(player_ptr, player_ptr->realm1); if (tmp_vir != Virtue::NONE) { player_ptr->vir_types[i++] = tmp_vir; } } - if (player_ptr->realm2) { + if (pr.realm2().is_available()) { tmp_vir = get_realm_virtues(player_ptr, player_ptr->realm2); if (tmp_vir != Virtue::NONE) { player_ptr->vir_types[i++] = tmp_vir; diff --git a/src/birth/character-builder.cpp b/src/birth/character-builder.cpp index 67c2ffa325..ad387ba6fb 100644 --- a/src/birth/character-builder.cpp +++ b/src/birth/character-builder.cpp @@ -67,8 +67,8 @@ static void write_birth_diary(PlayerType *player_ptr) const auto mes_class = format(_("%s職業に%sを選択した。", "%schose %s class."), indent, class_info.at(player_ptr->pclass).title.data()); exe_write_diary(floor, DiaryKind::DESCRIPTION, 1, mes_class); PlayerRealm pr(player_ptr); - if (player_ptr->realm1) { - const auto mes_realm2 = player_ptr->realm2 ? format(_("と%s", " and %s realms"), pr.realm2().get_name().data()) : _("", " realm"); + if (pr.realm1().is_available()) { + const auto mes_realm2 = pr.realm2().is_available() ? format(_("と%s", " and %s realms"), pr.realm2().get_name().data()) : _("", " realm"); const auto mes_realm = format(_("%s魔法の領域に%s%sを選択した。", "%schose %s%s."), indent, pr.realm1().get_name().data(), mes_realm2.data()); exe_write_diary(floor, DiaryKind::DESCRIPTION, 1, mes_realm); } diff --git a/src/cmd-action/cmd-spell.cpp b/src/cmd-action/cmd-spell.cpp index 7abfb92e21..fdefc77606 100644 --- a/src/cmd-action/cmd-spell.cpp +++ b/src/cmd-action/cmd-spell.cpp @@ -560,7 +560,7 @@ static FuncItemTester get_castable_spellbook_tester(PlayerType *player_ptr) static FuncItemTester get_learnable_spellbook_tester(PlayerType *player_ptr) { - if (player_ptr->realm2 == REALM_NONE) { + if (!PlayerRealm(player_ptr).realm2().is_available()) { return get_castable_spellbook_tester(player_ptr); } else { return FuncItemTester(item_tester_learn_spell, player_ptr); @@ -584,7 +584,7 @@ void do_cmd_browse(PlayerType *player_ptr) /* Warriors are illiterate */ PlayerClass pc(player_ptr); - if (!(player_ptr->realm1 || player_ptr->realm2) && !pc.is_every_magic()) { + if (!PlayerRealm(player_ptr).realm1().is_available() && !pc.is_every_magic()) { msg_print(_("本を読むことができない!", "You cannot read books!")); return; } @@ -727,7 +727,8 @@ void do_cmd_study(PlayerType *player_ptr) /* Spells of realm2 will have an increment of +32 */ SPELL_IDX spell = -1; const auto spell_category = spell_category_name(mp_ptr->spell_book); - if (!player_ptr->realm1) { + PlayerRealm pr(player_ptr); + if (!pr.realm1().is_available()) { msg_print(_("本を読むことができない!", "You cannot read books!")); return; } @@ -769,7 +770,6 @@ void do_cmd_study(PlayerType *player_ptr) const auto tval = o_ptr->bi_key.tval(); const auto sval = *o_ptr->bi_key.sval(); - PlayerRealm pr(player_ptr); if (tval == pr.realm2().get_book()) { increment = 32; } else if (tval != pr.realm1().get_book()) { @@ -943,7 +943,8 @@ bool do_cmd_cast(PlayerType *player_ptr) /* Require spell ability */ PlayerClass pc(player_ptr); auto is_every_magic = pc.is_every_magic(); - if (!player_ptr->realm1 && !is_every_magic) { + PlayerRealm pr(player_ptr); + if (!pr.realm1().is_available() && !is_every_magic) { msg_print(_("呪文を唱えられない!", "You cannot cast spells!")); return false; } diff --git a/src/io/read-pref-file.cpp b/src/io/read-pref-file.cpp index ed33aab04e..81fff6b52e 100644 --- a/src/io/read-pref-file.cpp +++ b/src/io/read-pref-file.cpp @@ -285,11 +285,11 @@ void load_all_pref_files(PlayerType *player_ptr) process_pref_file(player_ptr, format(fmt, cp_ptr->title.data())); process_pref_file(player_ptr, format(fmt, player_ptr->base_name)); PlayerRealm pr(player_ptr); - if (player_ptr->realm1 != REALM_NONE) { + if (pr.realm1().is_available()) { process_pref_file(player_ptr, format(fmt, pr.realm1().get_name().data())); } - if (player_ptr->realm2 != REALM_NONE) { + if (pr.realm2().is_available()) { process_pref_file(player_ptr, format(fmt, pr.realm2().get_name().data())); } diff --git a/src/knowledge/knowledge-experiences.cpp b/src/knowledge/knowledge-experiences.cpp index 3d819baf1d..24ad048cb6 100644 --- a/src/knowledge/knowledge-experiences.cpp +++ b/src/knowledge/knowledge-experiences.cpp @@ -85,7 +85,7 @@ void do_cmd_knowledge_spell_exp(PlayerType *player_ptr) PlayerRealm pr(player_ptr); - if (player_ptr->realm1 != REALM_NONE) { + if (pr.realm1().is_available()) { fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), pr.realm1().get_name().data()); for (SPELL_IDX i = 0; i < 32; i++) { const auto &spell = pr.realm1().get_spell_info(i); @@ -121,7 +121,7 @@ void do_cmd_knowledge_spell_exp(PlayerType *player_ptr) } } - if (player_ptr->realm2 != REALM_NONE) { + if (pr.realm2().is_available()) { fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), pr.realm2().get_name().data()); for (SPELL_IDX i = 0; i < 32; i++) { const auto &spell = pr.realm2().get_spell_info(i); diff --git a/src/knowledge/knowledge-self.cpp b/src/knowledge/knowledge-self.cpp index 87a204d0bf..529c0c6b9c 100644 --- a/src/knowledge/knowledge-self.cpp +++ b/src/knowledge/knowledge-self.cpp @@ -83,13 +83,13 @@ static void dump_yourself(PlayerType *player_ptr, FILE *fff) fprintf(fff, "\n"); PlayerRealm pr(player_ptr); - if (player_ptr->realm1) { + if (pr.realm1().is_available()) { fprintf(fff, _("魔法: %s\n", "Realm: %s\n"), pr.realm1().get_name().data()); dump_explanation(realm_explanations[technic2magic(player_ptr->realm1) - 1], fff); } fprintf(fff, "\n"); - if (player_ptr->realm2) { + if (pr.realm2().is_available()) { fprintf(fff, _("魔法: %s\n", "Realm: %s\n"), pr.realm2().get_name().data()); dump_explanation(realm_explanations[technic2magic(player_ptr->realm2) - 1], fff); } diff --git a/src/player/player-realm.cpp b/src/player/player-realm.cpp index 18c02e0486..ed4916e7f7 100644 --- a/src/player/player-realm.cpp +++ b/src/player/player-realm.cpp @@ -167,6 +167,11 @@ ItemKindType PlayerRealm::Realm::get_book() const return PlayerRealm::get_book(this->realm); } +bool PlayerRealm::Realm::is_available() const +{ + return this->realm != REALM_NONE; +} + bool PlayerRealm::Realm::is_good_attribute() const { return this->realm == REALM_LIFE || this->realm == REALM_CRUSADE; diff --git a/src/player/player-realm.h b/src/player/player-realm.h index bf59e1d5a8..b65301a53d 100644 --- a/src/player/player-realm.h +++ b/src/player/player-realm.h @@ -30,6 +30,7 @@ class PlayerRealm { const LocalizedString &get_name() const; const magic_type &get_spell_info(int num) const; ItemKindType get_book() const; + bool is_available() const; bool is_good_attribute() const; private: diff --git a/src/player/player-status-flags.cpp b/src/player/player-status-flags.cpp index 14dd99816a..02d8581a41 100644 --- a/src/player/player-status-flags.cpp +++ b/src/player/player-status-flags.cpp @@ -25,6 +25,7 @@ #include "player-status/player-stealth.h" #include "player/attack-defense-types.h" #include "player/digestion-processor.h" +#include "player/player-realm.h" #include "player/player-skill.h" #include "player/player-status.h" #include "player/race-info-table.h" @@ -711,7 +712,8 @@ void check_no_flowed(PlayerType *player_ptr) return; } - if (!player_ptr->realm1) { + PlayerRealm pr(player_ptr); + if (!pr.realm1().is_available()) { player_ptr->no_flowed = false; return; } diff --git a/src/player/player-status.cpp b/src/player/player-status.cpp index ab1e0467d1..553b8a5935 100644 --- a/src/player/player-status.cpp +++ b/src/player/player-status.cpp @@ -519,9 +519,10 @@ static void update_num_of_spells(PlayerType *player_ptr) bonus = 4; } + PlayerRealm pr(player_ptr); if (pc.equals(PlayerClassType::SAMURAI)) { num_allowed = 32; - } else if (player_ptr->realm2 == REALM_NONE) { + } else if (!pr.realm2().is_available()) { num_allowed = (num_allowed + 1) / 2; if (num_allowed > (32 + bonus)) { num_allowed = 32 + bonus; @@ -543,7 +544,6 @@ static void update_num_of_spells(PlayerType *player_ptr) } } - PlayerRealm pr(player_ptr); player_ptr->new_spells = num_allowed + player_ptr->add_spells + num_boukyaku - player_ptr->learned_spells; for (int i = 63; i >= 0; i--) { if (!player_ptr->spell_learned1 && !player_ptr->spell_learned2) { @@ -689,7 +689,7 @@ static void update_num_of_spells(PlayerType *player_ptr) player_ptr->new_spells--; } - if (player_ptr->realm2 == REALM_NONE) { + if (!pr.realm2().is_available()) { int k = 0; for (int j = 0; j < 32; j++) { const auto &spell = pr.realm1().get_spell_info(j); diff --git a/src/view/display-player.cpp b/src/view/display-player.cpp index 96de6a740b..9aae43c75c 100644 --- a/src/view/display-player.cpp +++ b/src/view/display-player.cpp @@ -97,7 +97,8 @@ static void display_player_basic_info(PlayerType *player_ptr) */ static void display_magic_realms(PlayerType *player_ptr) { - if (player_ptr->realm1 == REALM_NONE && player_ptr->element == REALM_NONE) { + PlayerRealm pr(player_ptr); + if (!pr.realm1().is_available() && player_ptr->element == REALM_NONE) { return; } @@ -106,10 +107,9 @@ static void display_magic_realms(PlayerType *player_ptr) return; } - PlayerRealm pr(player_ptr); std::stringstream ss; ss << pr.realm1().get_name(); - if (player_ptr->realm2) { + if (pr.realm2().is_available()) { ss << ", " << pr.realm2().get_name(); } display_player_one_line(ENTRY_REALM, ss.str(), TERM_L_BLUE); diff --git a/src/view/object-describer.cpp b/src/view/object-describer.cpp index 1907075dcd..decb73ed29 100644 --- a/src/view/object-describer.cpp +++ b/src/view/object-describer.cpp @@ -6,6 +6,7 @@ #include "object/tval-types.h" #include "perception/object-perception.h" #include "player-base/player-class.h" +#include "player/player-realm.h" #include "realm/realm-names-table.h" #include "spell/spell-info.h" #include "system/item-entity.h" @@ -82,7 +83,8 @@ void display_koff(PlayerType *player_ptr) const auto sval = *item.bi_key.sval(); const short use_realm = tval2realm(item.bi_key.tval()); - if (player_ptr->realm1 || player_ptr->realm2) { + PlayerRealm pr(player_ptr); + if (pr.realm1().is_available() || pr.realm2().is_available()) { if ((use_realm != player_ptr->realm1) && (use_realm != player_ptr->realm2)) { return; } diff --git a/src/window/display-sub-windows.cpp b/src/window/display-sub-windows.cpp index e8af9efa27..e2f6df5ecb 100644 --- a/src/window/display-sub-windows.cpp +++ b/src/window/display-sub-windows.cpp @@ -815,11 +815,12 @@ static void display_spell_list(PlayerType *player_ptr) return; } - if (REALM_NONE == player_ptr->realm1) { + PlayerRealm pr(player_ptr); + if (!pr.realm1().is_available()) { return; } - for (int j = 0; j < ((player_ptr->realm2 > REALM_NONE) ? 2 : 1); j++) { + for (int j = 0; j < (pr.realm2().is_available() ? 2 : 1); j++) { m[j] = 0; y = (j < 3) ? 0 : (m[j - 3] + 2); x = 27 * (j % 3); From 5207ded9445fdf09ebcafa2d9b7691775e787bee Mon Sep 17 00:00:00 2001 From: dis Date: Tue, 2 Jul 2024 18:56:02 +0900 Subject: [PATCH 08/16] =?UTF-8?q?[Refactor]=20=E3=82=AF=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E9=AD=94=E6=B3=95=E5=AE=9A=E7=BE=A9=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=ABspell=5Ftag=E3=82=92=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 呪文タグを用いることで定義ファイルの可読性を向上させる。 --- lib/edit/ClassMagicDefinitions.jsonc | 5570 +++++++++++----------- schema/ClassMagicDefinitions.schema.json | 10 +- src/info-reader/magic-reader.cpp | 13 +- src/system/spell-info-list.cpp | 14 + src/system/spell-info-list.h | 3 + 5 files changed, 2814 insertions(+), 2796 deletions(-) diff --git a/lib/edit/ClassMagicDefinitions.jsonc b/lib/edit/ClassMagicDefinitions.jsonc index 8e77fb5b91..f996cad087 100644 --- a/lib/edit/ClassMagicDefinitions.jsonc +++ b/lib/edit/ClassMagicDefinitions.jsonc @@ -26,224 +26,224 @@ "name": "LIFE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Cure_Light_Wounds", "learn_level": 1, "mana_cost": 1, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Bless", "learn_level": 3, "mana_cost": 2, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Cause_Light_Wounds", "learn_level": 4, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Call_Light", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Detect_Doors_And_Traps", "learn_level": 7, "mana_cost": 7, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 9, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Cure_Poison", "learn_level": 12, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Satisfy_Hunger", "learn_level": 15, "mana_cost": 14, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Remove_Curse", "learn_level": 16, "mana_cost": 16, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Cause_Medium_Wounds", "learn_level": 17, "mana_cost": 17, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cure_Critical_Wounds", "learn_level": 18, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Resist_Heat_and_Cold", "learn_level": 19, "mana_cost": 19, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Surroundings", "learn_level": 20, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Turn_Undead", "learn_level": 23, "mana_cost": 23, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Healing", "learn_level": 30, "mana_cost": 30, "difficulty": 55, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Rune_of_Protection", "learn_level": 35, "mana_cost": 70, "difficulty": 75, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Dispel_Curse", "learn_level": 26, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 75 }, { - "spell_id": 17, + "spell_tag": "Perception", "learn_level": 28, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 18, + "spell_tag": "Dispel_Undead", "learn_level": 33, "mana_cost": 33, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 19, + "spell_tag": "Day_of_the_Dove", "learn_level": 35, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 20, + "spell_tag": "Cause_Critical_Wounds", "learn_level": 35, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 75 }, { - "spell_id": 21, + "spell_tag": "Word_of_Recall", "learn_level": 35, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 22, + "spell_tag": "Alter_Reality", "learn_level": 39, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 23, + "spell_tag": "Warding_True", "learn_level": 46, "mana_cost": 70, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 24, + "spell_tag": "Sterilization", "learn_level": 9, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Detection", "learn_level": 25, "mana_cost": 25, "difficulty": 50, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Annihilate_Undead", "learn_level": 35, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 42, "mana_cost": 100, "difficulty": 80, "first_cast_exp_rate": 225 }, { - "spell_id": 28, + "spell_tag": "Restoration", "learn_level": 45, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 29, + "spell_tag": "Healing_True", "learn_level": 48, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Holy_Vision", "learn_level": 49, "mana_cost": 100, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Ultimate_Resistance", "learn_level": 50, "mana_cost": 100, "difficulty": 80, @@ -255,224 +255,224 @@ "name": "SORCERY", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Monsters", "learn_level": 1, "mana_cost": 1, "difficulty": 23, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Phase_Door", "learn_level": 1, "mana_cost": 2, "difficulty": 24, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Light_Area", "learn_level": 3, "mana_cost": 3, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Confuse_Monster", "learn_level": 4, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Teleport", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Sleep_Monster", "learn_level": 6, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Recharging", "learn_level": 7, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 9 }, { - "spell_id": 8, + "spell_tag": "Magic_Mapping", "learn_level": 9, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Identify", "learn_level": 10, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 8 }, { - "spell_id": 10, + "spell_tag": "Slow_Monster", "learn_level": 11, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 7 }, { - "spell_id": 11, + "spell_tag": "Mass_Sleep", "learn_level": 13, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Teleport_Away", "learn_level": 18, "mana_cost": 12, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 13, + "spell_tag": "Haste_Self", "learn_level": 22, "mana_cost": 12, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Detection_True", "learn_level": 28, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Identify_True", "learn_level": 33, "mana_cost": 30, "difficulty": 75, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Detect_items_and_Treasure", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 15 }, { - "spell_id": 17, + "spell_tag": "Charm_Monster", "learn_level": 10, "mana_cost": 10, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 18, + "spell_tag": "Sense_Minds", "learn_level": 14, "mana_cost": 10, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 19, + "spell_tag": "Teleport_to_town", "learn_level": 18, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Self_Knowledge", "learn_level": 20, "mana_cost": 18, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Teleport_Level", "learn_level": 20, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 22, + "spell_tag": "Word_of_Recall", "learn_level": 25, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 19 }, { - "spell_id": 23, + "spell_tag": "Dimension_Door", "learn_level": 40, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 24, + "spell_tag": "Probing", "learn_level": 10, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 20 }, { - "spell_id": 25, + "spell_tag": "Explosive_Rune", "learn_level": 20, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Telekinesis", "learn_level": 25, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 70 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 30, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 120 }, { - "spell_id": 28, + "spell_tag": "Charm_monsters", "learn_level": 33, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Alchemy", "learn_level": 42, "mana_cost": 50, "difficulty": 90, "first_cast_exp_rate": 175 }, { - "spell_id": 30, + "spell_tag": "Banishment", "learn_level": 43, "mana_cost": 40, "difficulty": 55, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Globe_of_Invulnerability", "learn_level": 45, "mana_cost": 70, "difficulty": 85, @@ -484,224 +484,224 @@ "name": "NATURE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Creatures", "learn_level": 1, "mana_cost": 1, "difficulty": 23, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Lightning", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Produce_Food", "learn_level": 4, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Daylight", "learn_level": 4, "mana_cost": 4, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Animal_Taming", "learn_level": 4, "mana_cost": 5, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Resist_Environment", "learn_level": 5, "mana_cost": 5, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Cure_Wounds_And_Poison", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Stone_to_Mud", "learn_level": 5, "mana_cost": 5, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 9, + "spell_tag": "Frost_Bolt", "learn_level": 5, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 10, + "spell_tag": "Nature_Awareness", "learn_level": 7, "mana_cost": 6, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Fire_Bolt", "learn_level": 7, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Ray_of_Sunlight", "learn_level": 9, "mana_cost": 6, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 13, + "spell_tag": "Entangle", "learn_level": 19, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Summon_Animal", "learn_level": 25, "mana_cost": 25, "difficulty": 90, "first_cast_exp_rate": 50 }, { - "spell_id": 15, + "spell_tag": "Herbal_Healing", "learn_level": 40, "mana_cost": 60, "difficulty": 90, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Stair_Building", "learn_level": 9, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 44 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 10, "mana_cost": 12, "difficulty": 75, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance_True", "learn_level": 15, "mana_cost": 20, "difficulty": 85, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Forest_Creation", "learn_level": 20, "mana_cost": 22, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Animal_Friendship", "learn_level": 30, "mana_cost": 30, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 21, + "spell_tag": "Stone_Tell", "learn_level": 37, "mana_cost": 40, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 22, + "spell_tag": "Wall_of_Stone", "learn_level": 38, "mana_cost": 45, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Protect_from_Corrosion", "learn_level": 40, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Earthquake", "learn_level": 20, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 25, + "spell_tag": "Whirlwind", "learn_level": 23, "mana_cost": 23, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Blizzard", "learn_level": 25, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 29 }, { - "spell_id": 27, + "spell_tag": "Lightning_Storm", "learn_level": 30, "mana_cost": 27, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 28, + "spell_tag": "Whirlpool", "learn_level": 35, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 65 }, { - "spell_id": 29, + "spell_tag": "Call_Sunlight", "learn_level": 37, "mana_cost": 35, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Elemental_Branding", "learn_level": 40, "mana_cost": 90, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Natures_Wrath", "learn_level": 40, "mana_cost": 75, "difficulty": 65, @@ -713,224 +713,224 @@ "name": "CHAOS", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Trap_Door_Destruction", "learn_level": 1, "mana_cost": 2, "difficulty": 22, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Flash_of_Light", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Touch_of_Confusion", "learn_level": 5, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Mana_Burst", "learn_level": 9, "mana_cost": 6, "difficulty": 50, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Fire_Bolt", "learn_level": 13, "mana_cost": 9, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Fist_of_Force", "learn_level": 14, "mana_cost": 9, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Teleport_Self", "learn_level": 15, "mana_cost": 9, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Wonder", "learn_level": 17, "mana_cost": 10, "difficulty": 25, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Chaos_Bolt", "learn_level": 19, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Sonic_Boom", "learn_level": 21, "mana_cost": 13, "difficulty": 45, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Doom_Bolt", "learn_level": 23, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 11 }, { - "spell_id": 12, + "spell_tag": "Fire_Ball", "learn_level": 25, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 13, + "spell_tag": "Teleport_Other", "learn_level": 25, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Word_of_Destruction", "learn_level": 30, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Invoke_Logrus", "learn_level": 35, "mana_cost": 40, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 16, + "spell_tag": "Polymorph_Other", "learn_level": 11, "mana_cost": 7, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Chain_Lightning", "learn_level": 15, "mana_cost": 15, "difficulty": 80, "first_cast_exp_rate": 35 }, { - "spell_id": 18, + "spell_tag": "Arcane_Binding", "learn_level": 16, "mana_cost": 14, "difficulty": 80, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Disintegrate", "learn_level": 25, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 20, + "spell_tag": "Alter_Reality", "learn_level": 30, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 21, + "spell_tag": "Magic_Rocket", "learn_level": 40, "mana_cost": 41, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Chaos_Branding", "learn_level": 45, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Summon_Demon", "learn_level": 47, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Beam_of_Gravity", "learn_level": 20, "mana_cost": 20, "difficulty": 66, "first_cast_exp_rate": 8 }, { - "spell_id": 25, + "spell_tag": "Meteor_Swarm", "learn_level": 35, "mana_cost": 32, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 26, + "spell_tag": "Flame_Strike", "learn_level": 37, "mana_cost": 34, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 27, + "spell_tag": "Call_Chaos", "learn_level": 39, "mana_cost": 42, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Polymorph_Self", "learn_level": 42, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 29, + "spell_tag": "Mana_Storm", "learn_level": 45, "mana_cost": 58, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Breathe_Logrus", "learn_level": 47, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Call_the_Void", "learn_level": 49, "mana_cost": 100, "difficulty": 85, @@ -942,224 +942,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 3, "mana_cost": 3, "difficulty": 27, "first_cast_exp_rate": 3 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 5, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 7, "mana_cost": 10, "difficulty": 75, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 9, "mana_cost": 9, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 10, "mana_cost": 10, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 12, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 13, "mana_cost": 12, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 18, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 24, "mana_cost": 21, "difficulty": 60, "first_cast_exp_rate": 30 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 30, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 32, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 16 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 36, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 39, "mana_cost": 30, "difficulty": 95, "first_cast_exp_rate": 25 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 10, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 180 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 10, "mana_cost": 15, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 11, "mana_cost": 11, "difficulty": 30, "first_cast_exp_rate": 15 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 30, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 34, "mana_cost": 90, "difficulty": 70, "first_cast_exp_rate": 90 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 36, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 125 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 38, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 40, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 20, "mana_cost": 20, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 25, "mana_cost": 66, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 30, "mana_cost": 40, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 35, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 42, "mana_cost": 50, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 43, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 45, "mana_cost": 95, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 47, "mana_cost": 100, "difficulty": 90, @@ -1171,224 +1171,224 @@ "name": "TRUMP", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Phase_Door", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Trump_Spiders", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Shuffle", "learn_level": 5, "mana_cost": 5, "difficulty": 37, "first_cast_exp_rate": 8 }, { - "spell_id": 3, + "spell_tag": "Reset_Recall", "learn_level": 6, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 4, + "spell_tag": "Teleport", "learn_level": 7, "mana_cost": 7, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Trump_Spying", "learn_level": 11, "mana_cost": 12, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Teleport_Away", "learn_level": 14, "mana_cost": 15, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Trump_Animals", "learn_level": 18, "mana_cost": 20, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 8, + "spell_tag": "Trump_Reach", "learn_level": 20, "mana_cost": 20, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Trump_Kamikaze", "learn_level": 23, "mana_cost": 20, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Phantasmal_Servant", "learn_level": 25, "mana_cost": 24, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 11, + "spell_tag": "Haste_Monster", "learn_level": 30, "mana_cost": 28, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Teleport_Level", "learn_level": 33, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 13, + "spell_tag": "Dimension_Door", "learn_level": 35, "mana_cost": 33, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 14, + "spell_tag": "Word_of_Recall", "learn_level": 40, "mana_cost": 35, "difficulty": 40, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Banish", "learn_level": 42, "mana_cost": 40, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 16, + "spell_tag": "Swap_Position", "learn_level": 22, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Trump_Undead", "learn_level": 24, "mana_cost": 24, "difficulty": 35, "first_cast_exp_rate": 25 }, { - "spell_id": 18, + "spell_tag": "Trump_Reptile", "learn_level": 26, "mana_cost": 26, "difficulty": 35, "first_cast_exp_rate": 30 }, { - "spell_id": 19, + "spell_tag": "Trump_Monsters", "learn_level": 30, "mana_cost": 25, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 20, + "spell_tag": "Trump_Hounds", "learn_level": 30, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 35 }, { - "spell_id": 21, + "spell_tag": "Trump_Branding", "learn_level": 35, "mana_cost": 70, "difficulty": 40, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Living_Trump", "learn_level": 40, "mana_cost": 100, "difficulty": 45, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Trump_Cyberdemon", "learn_level": 45, "mana_cost": 100, "difficulty": 45, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Trump_Divination", "learn_level": 30, "mana_cost": 30, "difficulty": 30, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Trump_Lore", "learn_level": 35, "mana_cost": 50, "difficulty": 45, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Heal_Monster", "learn_level": 36, "mana_cost": 55, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 27, + "spell_tag": "Trump_Dragon", "learn_level": 39, "mana_cost": 80, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "Trump_Meteor", "learn_level": 41, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Trump_Demon", "learn_level": 47, "mana_cost": 100, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 30, + "spell_tag": "Trump_Greater_Undead", "learn_level": 48, "mana_cost": 100, "difficulty": 40, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Trump_Ancient_Dragon", "learn_level": 49, "mana_cost": 100, "difficulty": 40, @@ -1400,224 +1400,224 @@ "name": "ARCANE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Zap", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Wizard_Lock", "learn_level": 1, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 2, + "spell_tag": "Detect_Invisibility", "learn_level": 1, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Detect_Monsters", "learn_level": 2, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Blink", "learn_level": 2, "mana_cost": 2, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Light_Area", "learn_level": 4, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Trap_and_Door_Destruction", "learn_level": 5, "mana_cost": 5, "difficulty": 33, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Cure_Light_Wounds", "learn_level": 6, "mana_cost": 5, "difficulty": 44, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 7, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Phlogiston", "learn_level": 8, "mana_cost": 8, "difficulty": 60, "first_cast_exp_rate": 7 }, { - "spell_id": 10, + "spell_tag": "Detect_Treasure", "learn_level": 9, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Detect_Enchantment", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Detect_Objects", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 13, + "spell_tag": "Cure_Poison", "learn_level": 11, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Resist_Cold", "learn_level": 12, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Resist_Fire", "learn_level": 13, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Resist_Lightning", "learn_level": 14, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Resist_Acid", "learn_level": 15, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 18, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 16, "mana_cost": 14, "difficulty": 33, "first_cast_exp_rate": 6 }, { - "spell_id": 19, + "spell_tag": "Teleport", "learn_level": 18, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 8 }, { - "spell_id": 20, + "spell_tag": "Identify", "learn_level": 20, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 21, + "spell_tag": "Stone_to_Mud", "learn_level": 22, "mana_cost": 16, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 22, + "spell_tag": "Ray_of_Light", "learn_level": 25, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 23, + "spell_tag": "Satisfy_Hunger", "learn_level": 28, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 12 }, { - "spell_id": 24, + "spell_tag": "See_Invisible", "learn_level": 28, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 13 }, { - "spell_id": 25, + "spell_tag": "Conjure_Elemental", "learn_level": 31, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 30 }, { - "spell_id": 26, + "spell_tag": "Teleport_Level", "learn_level": 35, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 25 }, { - "spell_id": 27, + "spell_tag": "Teleport_Away", "learn_level": 40, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 28, + "spell_tag": "Elemental_Ball", "learn_level": 41, "mana_cost": 30, "difficulty": 66, "first_cast_exp_rate": 30 }, { - "spell_id": 29, + "spell_tag": "Detection", "learn_level": 42, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 30, + "spell_tag": "Word_of_Recall", "learn_level": 45, "mana_cost": 50, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 31, + "spell_tag": "Clairvoyance", "learn_level": 49, "mana_cost": 100, "difficulty": 80, @@ -1629,224 +1629,224 @@ "name": "CRAFT", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Infravision", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Regeneration", "learn_level": 2, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Satisfy_Hunger", "learn_level": 3, "mana_cost": 3, "difficulty": 30, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Resist_Cold", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Resist_Fire", "learn_level": 6, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Heroism", "learn_level": 8, "mana_cost": 6, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Resist_Lightning", "learn_level": 9, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Resist_Acid", "learn_level": 10, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "See_Invisibility", "learn_level": 12, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Remove_Curse", "learn_level": 15, "mana_cost": 14, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Resist_Poison", "learn_level": 17, "mana_cost": 15, "difficulty": 60, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Berserk", "learn_level": 20, "mana_cost": 17, "difficulty": 75, "first_cast_exp_rate": 80 }, { - "spell_id": 12, + "spell_tag": "Self_Knowledge", "learn_level": 23, "mana_cost": 18, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 26, "mana_cost": 22, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Cure", "learn_level": 29, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Mana_Branding", "learn_level": 38, "mana_cost": 65, "difficulty": 95, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Telepathy", "learn_level": 12, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 14, "mana_cost": 10, "difficulty": 75, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance", "learn_level": 20, "mana_cost": 20, "difficulty": 85, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Haste_Self", "learn_level": 24, "mana_cost": 12, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 20, + "spell_tag": "Walk_through_Wall", "learn_level": 30, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Polish_Shield", "learn_level": 34, "mana_cost": 70, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Create_Golem", "learn_level": 41, "mana_cost": 80, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Magical_armor", "learn_level": 45, "mana_cost": 55, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Remove_Enchantment", "learn_level": 14, "mana_cost": 14, "difficulty": 65, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Remove_All_Curse", "learn_level": 30, "mana_cost": 32, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 26, + "spell_tag": "Knowledge_True", "learn_level": 36, "mana_cost": 45, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 27, + "spell_tag": "Enchant_Weapon", "learn_level": 38, "mana_cost": 80, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Enchant_Armor", "learn_level": 38, "mana_cost": 100, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Brand_Weapon", "learn_level": 40, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 30, + "spell_tag": "Living_Trump", "learn_level": 43, "mana_cost": 100, "difficulty": 70, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Immunity", "learn_level": 47, "mana_cost": 70, "difficulty": 80, @@ -1858,224 +1858,224 @@ "name": "DEMON", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Unlife", "learn_level": 2, "mana_cost": 1, "difficulty": 22, "first_cast_exp_rate": 1 }, { - "spell_id": 2, + "spell_tag": "Evil_Bless", "learn_level": 3, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Resist_Fire", "learn_level": 4, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Fire_Bolt", "learn_level": 10, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 5, + "spell_tag": "Summon_Manes", "learn_level": 11, "mana_cost": 9, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Nether_Ball", "learn_level": 13, "mana_cost": 13, "difficulty": 40, "first_cast_exp_rate": 10 }, { - "spell_id": 7, + "spell_tag": "Raise_the_Morale", "learn_level": 14, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Vision", "learn_level": 17, "mana_cost": 15, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 9, + "spell_tag": "Resist_Nether", "learn_level": 20, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 11 }, { - "spell_id": 10, + "spell_tag": "Plasma_bolt", "learn_level": 23, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 11, + "spell_tag": "Fire_Ball", "learn_level": 25, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Fire_Branding", "learn_level": 30, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Demonfire", "learn_level": 33, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 15 }, { - "spell_id": 14, + "spell_tag": "Summon_Demon", "learn_level": 36, "mana_cost": 70, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 15, + "spell_tag": "Nether_Wave", "learn_level": 37, "mana_cost": 18, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 16, + "spell_tag": "Devilish_Eye", "learn_level": 12, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Devil_Cloak", "learn_level": 15, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Lava_Flow", "learn_level": 25, "mana_cost": 22, "difficulty": 65, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Plasma_Ball", "learn_level": 34, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 20, + "spell_tag": "Polymorph_Demon", "learn_level": 35, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 21, + "spell_tag": "Fireblast", "learn_level": 36, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Succubuss_Kiss", "learn_level": 40, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Doom_Hand", "learn_level": 46, "mana_cost": 80, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Immortal_Body", "learn_level": 26, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 25, + "spell_tag": "Insanity_Circle", "learn_level": 36, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 26, + "spell_tag": "Explode_Pets", "learn_level": 41, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Summon_Greater_Demon", "learn_level": 43, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 28, + "spell_tag": "Fire_Storm", "learn_level": 44, "mana_cost": 58, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Nether_Storm", "learn_level": 45, "mana_cost": 58, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Bloody_Curse", "learn_level": 47, "mana_cost": 85, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Polymorph_Demonlord", "learn_level": 49, "mana_cost": 80, "difficulty": 85, @@ -2087,224 +2087,224 @@ "name": "CRUSADE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Punishment", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Evil", "learn_level": 2, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Remove_Fear", "learn_level": 4, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Scare_Monster", "learn_level": 6, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Sanctuary", "learn_level": 7, "mana_cost": 5, "difficulty": 34, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Portal", "learn_level": 9, "mana_cost": 7, "difficulty": 30, "first_cast_exp_rate": 2 }, { - "spell_id": 6, + "spell_tag": "Star_Dust", "learn_level": 10, "mana_cost": 10, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Purify", "learn_level": 15, "mana_cost": 11, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Scatter_Evil", "learn_level": 17, "mana_cost": 15, "difficulty": 55, "first_cast_exp_rate": 10 }, { - "spell_id": 9, + "spell_tag": "Holy_Orb", "learn_level": 17, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Exorcism", "learn_level": 21, "mana_cost": 19, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Remove_Curse", "learn_level": 23, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 5 }, { - "spell_id": 12, + "spell_tag": "Sense_Unseen", "learn_level": 26, "mana_cost": 24, "difficulty": 50, "first_cast_exp_rate": 7 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 29, "mana_cost": 23, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 14, + "spell_tag": "Judgment_Thunder", "learn_level": 34, "mana_cost": 32, "difficulty": 85, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Holy_Word", "learn_level": 40, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Unbarring_Ways", "learn_level": 6, "mana_cost": 5, "difficulty": 33, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Arrest", "learn_level": 18, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 50 }, { - "spell_id": 18, + "spell_tag": "Holy_Aura", "learn_level": 21, "mana_cost": 16, "difficulty": 60, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Dispel_Undead_and_Demons", "learn_level": 25, "mana_cost": 20, "difficulty": 65, "first_cast_exp_rate": 70 }, { - "spell_id": 20, + "spell_tag": "Dispel_Evil", "learn_level": 32, "mana_cost": 27, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 21, + "spell_tag": "Holy_Blade", "learn_level": 34, "mana_cost": 75, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Star_Burst", "learn_level": 40, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Summon_Angel", "learn_level": 44, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Heroism", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 80 }, { - "spell_id": 25, + "spell_tag": "Dispel_Curse", "learn_level": 30, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 26, + "spell_tag": "Banish_Evil", "learn_level": 32, "mana_cost": 32, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Armageddon", "learn_level": 36, "mana_cost": 22, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "An_Eye_for_an_Eye", "learn_level": 40, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Wrath_of_the_God", "learn_level": 43, "mana_cost": 65, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Divine_Intervention", "learn_level": 46, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Crusade", "learn_level": 48, "mana_cost": 100, "difficulty": 85, @@ -2328,224 +2328,224 @@ "name": "LIFE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Cure_Light_Wounds", "learn_level": 1, "mana_cost": 1, "difficulty": 10, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Bless", "learn_level": 1, "mana_cost": 2, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Cause_Light_Wounds", "learn_level": 1, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Call_Light", "learn_level": 3, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Detect_Doors_And_Traps", "learn_level": 3, "mana_cost": 3, "difficulty": 27, "first_cast_exp_rate": 2 }, { - "spell_id": 5, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 4, "mana_cost": 4, "difficulty": 28, "first_cast_exp_rate": 2 }, { - "spell_id": 6, + "spell_tag": "Cure_Poison", "learn_level": 5, "mana_cost": 4, "difficulty": 32, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Satisfy_Hunger", "learn_level": 7, "mana_cost": 5, "difficulty": 38, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Remove_Curse", "learn_level": 7, "mana_cost": 6, "difficulty": 38, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Cause_Medium_Wounds", "learn_level": 9, "mana_cost": 6, "difficulty": 38, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cure_Critical_Wounds", "learn_level": 9, "mana_cost": 7, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Resist_Heat_and_Cold", "learn_level": 10, "mana_cost": 8, "difficulty": 38, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Surroundings", "learn_level": 10, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Turn_Undead", "learn_level": 11, "mana_cost": 8, "difficulty": 42, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Healing", "learn_level": 20, "mana_cost": 16, "difficulty": 60, "first_cast_exp_rate": 7 }, { - "spell_id": 15, + "spell_tag": "Rune_of_Protection", "learn_level": 33, "mana_cost": 55, "difficulty": 90, "first_cast_exp_rate": 15 }, { - "spell_id": 16, + "spell_tag": "Dispel_Curse", "learn_level": 15, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 50 }, { - "spell_id": 17, + "spell_tag": "Perception", "learn_level": 16, "mana_cost": 14, "difficulty": 80, "first_cast_exp_rate": 60 }, { - "spell_id": 18, + "spell_tag": "Dispel_Undead", "learn_level": 17, "mana_cost": 14, "difficulty": 55, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Day_of_the_Dove", "learn_level": 24, "mana_cost": 20, "difficulty": 55, "first_cast_exp_rate": 70 }, { - "spell_id": 20, + "spell_tag": "Cause_Critical_Wounds", "learn_level": 25, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 21, + "spell_tag": "Word_of_Recall", "learn_level": 25, "mana_cost": 25, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 22, + "spell_tag": "Alter_Reality", "learn_level": 39, "mana_cost": 32, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Warding_True", "learn_level": 44, "mana_cost": 44, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Sterilization", "learn_level": 5, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 80 }, { - "spell_id": 25, + "spell_tag": "Detection", "learn_level": 15, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Annihilate_Undead", "learn_level": 30, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 130 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 35, "mana_cost": 70, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 28, + "spell_tag": "Restoration", "learn_level": 40, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 130 }, { - "spell_id": 29, + "spell_tag": "Healing_True", "learn_level": 40, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Holy_Vision", "learn_level": 42, "mana_cost": 90, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Ultimate_Resistance", "learn_level": 45, "mana_cost": 90, "difficulty": 85, @@ -2557,224 +2557,224 @@ "name": "SORCERY", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Monsters", "learn_level": 2, "mana_cost": 1, "difficulty": 18, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Phase_Door", "learn_level": 3, "mana_cost": 2, "difficulty": 19, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 4, "mana_cost": 3, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Light_Area", "learn_level": 5, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Confuse_Monster", "learn_level": 6, "mana_cost": 5, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Teleport", "learn_level": 7, "mana_cost": 6, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Sleep_Monster", "learn_level": 9, "mana_cost": 7, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Recharging", "learn_level": 11, "mana_cost": 10, "difficulty": 70, "first_cast_exp_rate": 9 }, { - "spell_id": 8, + "spell_tag": "Magic_Mapping", "learn_level": 13, "mana_cost": 11, "difficulty": 70, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Identify", "learn_level": 14, "mana_cost": 12, "difficulty": 70, "first_cast_exp_rate": 6 }, { - "spell_id": 10, + "spell_tag": "Slow_Monster", "learn_level": 15, "mana_cost": 13, "difficulty": 70, "first_cast_exp_rate": 7 }, { - "spell_id": 11, + "spell_tag": "Mass_Sleep", "learn_level": 16, "mana_cost": 14, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Teleport_Away", "learn_level": 22, "mana_cost": 15, "difficulty": 55, "first_cast_exp_rate": 8 }, { - "spell_id": 13, + "spell_tag": "Haste_Self", "learn_level": 27, "mana_cost": 17, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 14, + "spell_tag": "Detection_True", "learn_level": 30, "mana_cost": 22, "difficulty": 65, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Identify_True", "learn_level": 36, "mana_cost": 33, "difficulty": 70, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Detect_items_and_Treasure", "learn_level": 7, "mana_cost": 7, "difficulty": 20, "first_cast_exp_rate": 15 }, { - "spell_id": 17, + "spell_tag": "Charm_Monster", "learn_level": 14, "mana_cost": 14, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 18, + "spell_tag": "Sense_Minds", "learn_level": 18, "mana_cost": 18, "difficulty": 55, "first_cast_exp_rate": 25 }, { - "spell_id": 19, + "spell_tag": "Teleport_to_town", "learn_level": 20, "mana_cost": 33, "difficulty": 65, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Self_Knowledge", "learn_level": 20, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Teleport_Level", "learn_level": 22, "mana_cost": 22, "difficulty": 55, "first_cast_exp_rate": 25 }, { - "spell_id": 22, + "spell_tag": "Word_of_Recall", "learn_level": 27, "mana_cost": 27, "difficulty": 70, "first_cast_exp_rate": 19 }, { - "spell_id": 23, + "spell_tag": "Dimension_Door", "learn_level": 42, "mana_cost": 45, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 24, + "spell_tag": "Probing", "learn_level": 13, "mana_cost": 13, "difficulty": 35, "first_cast_exp_rate": 20 }, { - "spell_id": 25, + "spell_tag": "Explosive_Rune", "learn_level": 21, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Telekinesis", "learn_level": 24, "mana_cost": 24, "difficulty": 70, "first_cast_exp_rate": 70 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 33, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 120 }, { - "spell_id": 28, + "spell_tag": "Charm_monsters", "learn_level": 35, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Alchemy", "learn_level": 45, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 175 }, { - "spell_id": 30, + "spell_tag": "Banishment", "learn_level": 46, "mana_cost": 45, "difficulty": 55, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Globe_of_Invulnerability", "learn_level": 48, "mana_cost": 70, "difficulty": 80, @@ -2786,224 +2786,224 @@ "name": "NATURE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Creatures", "learn_level": 2, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Lightning", "learn_level": 5, "mana_cost": 3, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 5, "mana_cost": 4, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Produce_Food", "learn_level": 6, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Daylight", "learn_level": 6, "mana_cost": 5, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Animal_Taming", "learn_level": 6, "mana_cost": 6, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Resist_Environment", "learn_level": 7, "mana_cost": 7, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Cure_Wounds_And_Poison", "learn_level": 7, "mana_cost": 7, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Stone_to_Mud", "learn_level": 7, "mana_cost": 7, "difficulty": 35, "first_cast_exp_rate": 6 }, { - "spell_id": 9, + "spell_tag": "Frost_Bolt", "learn_level": 8, "mana_cost": 7, "difficulty": 25, "first_cast_exp_rate": 6 }, { - "spell_id": 10, + "spell_tag": "Nature_Awareness", "learn_level": 9, "mana_cost": 10, "difficulty": 35, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Fire_Bolt", "learn_level": 10, "mana_cost": 10, "difficulty": 35, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Ray_of_Sunlight", "learn_level": 11, "mana_cost": 11, "difficulty": 25, "first_cast_exp_rate": 5 }, { - "spell_id": 13, + "spell_tag": "Entangle", "learn_level": 20, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 7 }, { - "spell_id": 14, + "spell_tag": "Summon_Animal", "learn_level": 30, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 8 }, { - "spell_id": 15, + "spell_tag": "Herbal_Healing", "learn_level": 42, "mana_cost": 60, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Stair_Building", "learn_level": 11, "mana_cost": 12, "difficulty": 35, "first_cast_exp_rate": 44 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 12, "mana_cost": 13, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance_True", "learn_level": 18, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Forest_Creation", "learn_level": 23, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Animal_Friendship", "learn_level": 35, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Stone_Tell", "learn_level": 39, "mana_cost": 40, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 22, + "spell_tag": "Wall_of_Stone", "learn_level": 40, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Protect_from_Corrosion", "learn_level": 42, "mana_cost": 90, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Earthquake", "learn_level": 22, "mana_cost": 22, "difficulty": 55, "first_cast_exp_rate": 24 }, { - "spell_id": 25, + "spell_tag": "Whirlwind", "learn_level": 25, "mana_cost": 25, "difficulty": 55, "first_cast_exp_rate": 25 }, { - "spell_id": 26, + "spell_tag": "Blizzard", "learn_level": 27, "mana_cost": 27, "difficulty": 70, "first_cast_exp_rate": 29 }, { - "spell_id": 27, + "spell_tag": "Lightning_Storm", "learn_level": 32, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 29 }, { - "spell_id": 28, + "spell_tag": "Whirlpool", "learn_level": 37, "mana_cost": 32, "difficulty": 80, "first_cast_exp_rate": 65 }, { - "spell_id": 29, + "spell_tag": "Call_Sunlight", "learn_level": 39, "mana_cost": 37, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Elemental_Branding", "learn_level": 42, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Natures_Wrath", "learn_level": 44, "mana_cost": 80, "difficulty": 60, @@ -3015,224 +3015,224 @@ "name": "CHAOS", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 2, "mana_cost": 1, "difficulty": 17, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Trap_Door_Destruction", "learn_level": 3, "mana_cost": 2, "difficulty": 19, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Flash_of_Light", "learn_level": 4, "mana_cost": 3, "difficulty": 21, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Touch_of_Confusion", "learn_level": 5, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 6 }, { - "spell_id": 4, + "spell_tag": "Mana_Burst", "learn_level": 10, "mana_cost": 6, "difficulty": 25, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Fire_Bolt", "learn_level": 11, "mana_cost": 6, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Fist_of_Force", "learn_level": 16, "mana_cost": 11, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Teleport_Self", "learn_level": 17, "mana_cost": 11, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Wonder", "learn_level": 19, "mana_cost": 15, "difficulty": 45, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Chaos_Bolt", "learn_level": 21, "mana_cost": 16, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Sonic_Boom", "learn_level": 23, "mana_cost": 18, "difficulty": 75, "first_cast_exp_rate": 20 }, { - "spell_id": 11, + "spell_tag": "Doom_Bolt", "learn_level": 25, "mana_cost": 18, "difficulty": 45, "first_cast_exp_rate": 11 }, { - "spell_id": 12, + "spell_tag": "Fire_Ball", "learn_level": 27, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 12 }, { - "spell_id": 13, + "spell_tag": "Teleport_Other", "learn_level": 29, "mana_cost": 22, "difficulty": 55, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Word_of_Destruction", "learn_level": 33, "mana_cost": 23, "difficulty": 75, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Invoke_Logrus", "learn_level": 37, "mana_cost": 42, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 16, + "spell_tag": "Polymorph_Other", "learn_level": 14, "mana_cost": 11, "difficulty": 40, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Chain_Lightning", "learn_level": 17, "mana_cost": 17, "difficulty": 65, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Arcane_Binding", "learn_level": 20, "mana_cost": 18, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Disintegrate", "learn_level": 27, "mana_cost": 27, "difficulty": 65, "first_cast_exp_rate": 35 }, { - "spell_id": 20, + "spell_tag": "Alter_Reality", "learn_level": 35, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 21, + "spell_tag": "Magic_Rocket", "learn_level": 44, "mana_cost": 45, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Chaos_Branding", "learn_level": 47, "mana_cost": 90, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Summon_Demon", "learn_level": 49, "mana_cost": 100, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Beam_of_Gravity", "learn_level": 25, "mana_cost": 25, "difficulty": 61, "first_cast_exp_rate": 8 }, { - "spell_id": 25, + "spell_tag": "Meteor_Swarm", "learn_level": 37, "mana_cost": 37, "difficulty": 80, "first_cast_exp_rate": 35 }, { - "spell_id": 26, + "spell_tag": "Flame_Strike", "learn_level": 39, "mana_cost": 37, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 27, + "spell_tag": "Call_Chaos", "learn_level": 41, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Polymorph_Self", "learn_level": 45, "mana_cost": 55, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 29, + "spell_tag": "Mana_Storm", "learn_level": 47, "mana_cost": 60, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Breathe_Logrus", "learn_level": 49, "mana_cost": 95, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Call_the_Void", "learn_level": 50, "mana_cost": 100, "difficulty": 90, @@ -3244,224 +3244,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 5, "mana_cost": 4, "difficulty": 27, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 7, "mana_cost": 7, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 9, "mana_cost": 11, "difficulty": 75, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 11, "mana_cost": 11, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 12, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 14, "mana_cost": 14, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 16, "mana_cost": 16, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 21, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 26, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 30 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 33, "mana_cost": 75, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 35, "mana_cost": 32, "difficulty": 60, "first_cast_exp_rate": 16 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 41, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 43, "mana_cost": 35, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 13, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 180 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 13, "mana_cost": 15, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 14, "mana_cost": 15, "difficulty": 30, "first_cast_exp_rate": 15 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 33, "mana_cost": 33, "difficulty": 70, "first_cast_exp_rate": 33 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 36, "mana_cost": 95, "difficulty": 70, "first_cast_exp_rate": 90 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 38, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 125 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 40, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 44, "mana_cost": 44, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 25, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 30, "mana_cost": 75, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 35, "mana_cost": 45, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 37, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 44, "mana_cost": 52, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 47, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 48, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 50, "mana_cost": 111, "difficulty": 90, @@ -3473,224 +3473,224 @@ "name": "TRUMP", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Phase_Door", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Trump_Spiders", "learn_level": 4, "mana_cost": 4, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Shuffle", "learn_level": 6, "mana_cost": 5, "difficulty": 32, "first_cast_exp_rate": 8 }, { - "spell_id": 3, + "spell_tag": "Reset_Recall", "learn_level": 7, "mana_cost": 7, "difficulty": 35, "first_cast_exp_rate": 8 }, { - "spell_id": 4, + "spell_tag": "Teleport", "learn_level": 9, "mana_cost": 9, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Trump_Spying", "learn_level": 13, "mana_cost": 14, "difficulty": 25, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Teleport_Away", "learn_level": 17, "mana_cost": 17, "difficulty": 25, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Trump_Animals", "learn_level": 29, "mana_cost": 22, "difficulty": 25, "first_cast_exp_rate": 8 }, { - "spell_id": 8, + "spell_tag": "Trump_Reach", "learn_level": 22, "mana_cost": 22, "difficulty": 35, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Trump_Kamikaze", "learn_level": 26, "mana_cost": 22, "difficulty": 30, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Phantasmal_Servant", "learn_level": 28, "mana_cost": 25, "difficulty": 25, "first_cast_exp_rate": 8 }, { - "spell_id": 11, + "spell_tag": "Haste_Monster", "learn_level": 32, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Teleport_Level", "learn_level": 35, "mana_cost": 35, "difficulty": 30, "first_cast_exp_rate": 10 }, { - "spell_id": 13, + "spell_tag": "Dimension_Door", "learn_level": 38, "mana_cost": 37, "difficulty": 25, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Word_of_Recall", "learn_level": 42, "mana_cost": 40, "difficulty": 35, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Banish", "learn_level": 45, "mana_cost": 45, "difficulty": 30, "first_cast_exp_rate": 12 }, { - "spell_id": 16, + "spell_tag": "Swap_Position", "learn_level": 24, "mana_cost": 38, "difficulty": 65, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Trump_Undead", "learn_level": 27, "mana_cost": 25, "difficulty": 30, "first_cast_exp_rate": 25 }, { - "spell_id": 18, + "spell_tag": "Trump_Reptile", "learn_level": 29, "mana_cost": 27, "difficulty": 30, "first_cast_exp_rate": 30 }, { - "spell_id": 19, + "spell_tag": "Trump_Monsters", "learn_level": 32, "mana_cost": 30, "difficulty": 30, "first_cast_exp_rate": 9 }, { - "spell_id": 20, + "spell_tag": "Trump_Hounds", "learn_level": 33, "mana_cost": 30, "difficulty": 30, "first_cast_exp_rate": 35 }, { - "spell_id": 21, + "spell_tag": "Trump_Branding", "learn_level": 38, "mana_cost": 75, "difficulty": 35, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Living_Trump", "learn_level": 41, "mana_cost": 110, "difficulty": 40, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Trump_Cyberdemon", "learn_level": 49, "mana_cost": 125, "difficulty": 40, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Trump_Divination", "learn_level": 32, "mana_cost": 30, "difficulty": 25, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Trump_Lore", "learn_level": 38, "mana_cost": 55, "difficulty": 40, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Heal_Monster", "learn_level": 40, "mana_cost": 60, "difficulty": 35, "first_cast_exp_rate": 150 }, { - "spell_id": 27, + "spell_tag": "Trump_Dragon", "learn_level": 43, "mana_cost": 85, "difficulty": 35, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "Trump_Meteor", "learn_level": 43, "mana_cost": 50, "difficulty": 65, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Trump_Demon", "learn_level": 48, "mana_cost": 115, "difficulty": 35, "first_cast_exp_rate": 150 }, { - "spell_id": 30, + "spell_tag": "Trump_Greater_Undead", "learn_level": 49, "mana_cost": 120, "difficulty": 35, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Trump_Ancient_Dragon", "learn_level": 50, "mana_cost": 125, "difficulty": 35, @@ -3702,224 +3702,224 @@ "name": "ARCANE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Zap", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Wizard_Lock", "learn_level": 1, "mana_cost": 1, "difficulty": 28, "first_cast_exp_rate": 5 }, { - "spell_id": 2, + "spell_tag": "Detect_Invisibility", "learn_level": 2, "mana_cost": 1, "difficulty": 28, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Detect_Monsters", "learn_level": 2, "mana_cost": 2, "difficulty": 28, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Blink", "learn_level": 3, "mana_cost": 3, "difficulty": 28, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Light_Area", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Trap_and_Door_Destruction", "learn_level": 6, "mana_cost": 6, "difficulty": 28, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Cure_Light_Wounds", "learn_level": 7, "mana_cost": 6, "difficulty": 39, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 8, "mana_cost": 7, "difficulty": 35, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Phlogiston", "learn_level": 9, "mana_cost": 8, "difficulty": 55, "first_cast_exp_rate": 7 }, { - "spell_id": 10, + "spell_tag": "Detect_Treasure", "learn_level": 10, "mana_cost": 9, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Detect_Enchantment", "learn_level": 11, "mana_cost": 10, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Detect_Objects", "learn_level": 12, "mana_cost": 11, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 13, + "spell_tag": "Cure_Poison", "learn_level": 13, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Resist_Cold", "learn_level": 14, "mana_cost": 13, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Resist_Fire", "learn_level": 15, "mana_cost": 14, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Resist_Lightning", "learn_level": 16, "mana_cost": 15, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Resist_Acid", "learn_level": 17, "mana_cost": 16, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 18, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 18, "mana_cost": 17, "difficulty": 28, "first_cast_exp_rate": 6 }, { - "spell_id": 19, + "spell_tag": "Teleport", "learn_level": 19, "mana_cost": 18, "difficulty": 45, "first_cast_exp_rate": 8 }, { - "spell_id": 20, + "spell_tag": "Identify", "learn_level": 22, "mana_cost": 25, "difficulty": 55, "first_cast_exp_rate": 25 }, { - "spell_id": 21, + "spell_tag": "Stone_to_Mud", "learn_level": 24, "mana_cost": 22, "difficulty": 55, "first_cast_exp_rate": 9 }, { - "spell_id": 22, + "spell_tag": "Ray_of_Light", "learn_level": 27, "mana_cost": 24, "difficulty": 55, "first_cast_exp_rate": 9 }, { - "spell_id": 23, + "spell_tag": "Satisfy_Hunger", "learn_level": 29, "mana_cost": 26, "difficulty": 65, "first_cast_exp_rate": 12 }, { - "spell_id": 24, + "spell_tag": "See_Invisible", "learn_level": 33, "mana_cost": 30, "difficulty": 55, "first_cast_exp_rate": 13 }, { - "spell_id": 25, + "spell_tag": "Conjure_Elemental", "learn_level": 37, "mana_cost": 32, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Teleport_Level", "learn_level": 40, "mana_cost": 36, "difficulty": 75, "first_cast_exp_rate": 25 }, { - "spell_id": 27, + "spell_tag": "Teleport_Away", "learn_level": 42, "mana_cost": 38, "difficulty": 65, "first_cast_exp_rate": 25 }, { - "spell_id": 28, + "spell_tag": "Elemental_Ball", "learn_level": 44, "mana_cost": 39, "difficulty": 61, "first_cast_exp_rate": 30 }, { - "spell_id": 29, + "spell_tag": "Detection", "learn_level": 46, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 30, + "spell_tag": "Word_of_Recall", "learn_level": 47, "mana_cost": 55, "difficulty": 65, "first_cast_exp_rate": 50 }, { - "spell_id": 31, + "spell_tag": "Clairvoyance", "learn_level": 50, "mana_cost": 120, "difficulty": 75, @@ -3931,224 +3931,224 @@ "name": "CRAFT", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Infravision", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Regeneration", "learn_level": 3, "mana_cost": 3, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Satisfy_Hunger", "learn_level": 4, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Resist_Cold", "learn_level": 6, "mana_cost": 6, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Resist_Fire", "learn_level": 7, "mana_cost": 6, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Heroism", "learn_level": 9, "mana_cost": 7, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Resist_Lightning", "learn_level": 10, "mana_cost": 6, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Resist_Acid", "learn_level": 11, "mana_cost": 6, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "See_Invisibility", "learn_level": 13, "mana_cost": 15, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Remove_Curse", "learn_level": 15, "mana_cost": 13, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Resist_Poison", "learn_level": 18, "mana_cost": 17, "difficulty": 60, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Berserk", "learn_level": 22, "mana_cost": 20, "difficulty": 75, "first_cast_exp_rate": 80 }, { - "spell_id": 12, + "spell_tag": "Self_Knowledge", "learn_level": 23, "mana_cost": 21, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 26, "mana_cost": 24, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Cure", "learn_level": 29, "mana_cost": 28, "difficulty": 60, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Mana_Branding", "learn_level": 42, "mana_cost": 70, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Telepathy", "learn_level": 14, "mana_cost": 14, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 16, "mana_cost": 12, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance", "learn_level": 22, "mana_cost": 23, "difficulty": 85, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Haste_Self", "learn_level": 27, "mana_cost": 17, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 20, + "spell_tag": "Walk_through_Wall", "learn_level": 33, "mana_cost": 58, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Polish_Shield", "learn_level": 36, "mana_cost": 80, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Create_Golem", "learn_level": 43, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Magical_armor", "learn_level": 46, "mana_cost": 60, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Remove_Enchantment", "learn_level": 15, "mana_cost": 15, "difficulty": 65, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Remove_All_Curse", "learn_level": 30, "mana_cost": 28, "difficulty": 60, "first_cast_exp_rate": 150 }, { - "spell_id": 26, + "spell_tag": "Knowledge_True", "learn_level": 38, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 27, + "spell_tag": "Enchant_Weapon", "learn_level": 40, "mana_cost": 80, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Enchant_Armor", "learn_level": 40, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Brand_Weapon", "learn_level": 42, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 30, + "spell_tag": "Living_Trump", "learn_level": 45, "mana_cost": 110, "difficulty": 75, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Immunity", "learn_level": 48, "mana_cost": 70, "difficulty": 75, @@ -4160,224 +4160,224 @@ "name": "DEMON", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 2, "mana_cost": 1, "difficulty": 22, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Unlife", "learn_level": 3, "mana_cost": 2, "difficulty": 24, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Evil_Bless", "learn_level": 4, "mana_cost": 3, "difficulty": 26, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Resist_Fire", "learn_level": 5, "mana_cost": 6, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 4, + "spell_tag": "Fire_Bolt", "learn_level": 12, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 5, + "spell_tag": "Summon_Manes", "learn_level": 14, "mana_cost": 12, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Nether_Ball", "learn_level": 15, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Raise_the_Morale", "learn_level": 16, "mana_cost": 9, "difficulty": 66, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Vision", "learn_level": 20, "mana_cost": 19, "difficulty": 65, "first_cast_exp_rate": 20 }, { - "spell_id": 9, + "spell_tag": "Resist_Nether", "learn_level": 23, "mana_cost": 23, "difficulty": 60, "first_cast_exp_rate": 11 }, { - "spell_id": 10, + "spell_tag": "Plasma_bolt", "learn_level": 25, "mana_cost": 18, "difficulty": 65, "first_cast_exp_rate": 12 }, { - "spell_id": 11, + "spell_tag": "Fire_Ball", "learn_level": 27, "mana_cost": 20, "difficulty": 65, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Fire_Branding", "learn_level": 33, "mana_cost": 75, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Demonfire", "learn_level": 35, "mana_cost": 33, "difficulty": 85, "first_cast_exp_rate": 30 }, { - "spell_id": 14, + "spell_tag": "Summon_Demon", "learn_level": 39, "mana_cost": 85, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 15, + "spell_tag": "Nether_Wave", "learn_level": 39, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 16, + "spell_tag": "Devilish_Eye", "learn_level": 14, "mana_cost": 14, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Devil_Cloak", "learn_level": 18, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Lava_Flow", "learn_level": 27, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Plasma_Ball", "learn_level": 36, "mana_cost": 34, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 20, + "spell_tag": "Polymorph_Demon", "learn_level": 37, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 21, + "spell_tag": "Fireblast", "learn_level": 38, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Succubuss_Kiss", "learn_level": 44, "mana_cost": 44, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 23, + "spell_tag": "Doom_Hand", "learn_level": 47, "mana_cost": 95, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Immortal_Body", "learn_level": 28, "mana_cost": 28, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 25, + "spell_tag": "Insanity_Circle", "learn_level": 38, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 26, + "spell_tag": "Explode_Pets", "learn_level": 43, "mana_cost": 58, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Summon_Greater_Demon", "learn_level": 45, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 28, + "spell_tag": "Fire_Storm", "learn_level": 46, "mana_cost": 60, "difficulty": 90, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Nether_Storm", "learn_level": 47, "mana_cost": 60, "difficulty": 90, "first_cast_exp_rate": 150 }, { - "spell_id": 30, + "spell_tag": "Bloody_Curse", "learn_level": 49, "mana_cost": 95, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Polymorph_Demonlord", "learn_level": 50, "mana_cost": 80, "difficulty": 85, @@ -4389,224 +4389,224 @@ "name": "CRUSADE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Punishment", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Evil", "learn_level": 1, "mana_cost": 1, "difficulty": 10, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Remove_Fear", "learn_level": 3, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Scare_Monster", "learn_level": 5, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Sanctuary", "learn_level": 6, "mana_cost": 5, "difficulty": 34, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Portal", "learn_level": 10, "mana_cost": 7, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 6, + "spell_tag": "Star_Dust", "learn_level": 12, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Purify", "learn_level": 14, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Scatter_Evil", "learn_level": 15, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 9, + "spell_tag": "Holy_Orb", "learn_level": 16, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Exorcism", "learn_level": 18, "mana_cost": 17, "difficulty": 40, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Remove_Curse", "learn_level": 21, "mana_cost": 19, "difficulty": 70, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Unseen", "learn_level": 26, "mana_cost": 22, "difficulty": 55, "first_cast_exp_rate": 7 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 29, "mana_cost": 23, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 14, + "spell_tag": "Judgment_Thunder", "learn_level": 36, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Holy_Word", "learn_level": 40, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Unbarring_Ways", "learn_level": 5, "mana_cost": 5, "difficulty": 33, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Arrest", "learn_level": 15, "mana_cost": 13, "difficulty": 83, "first_cast_exp_rate": 40 }, { - "spell_id": 18, + "spell_tag": "Holy_Aura", "learn_level": 20, "mana_cost": 15, "difficulty": 55, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Dispel_Undead_and_Demons", "learn_level": 23, "mana_cost": 17, "difficulty": 60, "first_cast_exp_rate": 70 }, { - "spell_id": 20, + "spell_tag": "Dispel_Evil", "learn_level": 30, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 21, + "spell_tag": "Holy_Blade", "learn_level": 34, "mana_cost": 75, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Star_Burst", "learn_level": 41, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Summon_Angel", "learn_level": 43, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Heroism", "learn_level": 9, "mana_cost": 9, "difficulty": 66, "first_cast_exp_rate": 80 }, { - "spell_id": 25, + "spell_tag": "Dispel_Curse", "learn_level": 28, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 26, + "spell_tag": "Banish_Evil", "learn_level": 30, "mana_cost": 28, "difficulty": 65, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Armageddon", "learn_level": 38, "mana_cost": 22, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "An_Eye_for_an_Eye", "learn_level": 40, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Wrath_of_the_God", "learn_level": 43, "mana_cost": 65, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Divine_Intervention", "learn_level": 45, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Crusade", "learn_level": 46, "mana_cost": 100, "difficulty": 85, @@ -4630,224 +4630,224 @@ "name": "SORCERY", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Monsters", "learn_level": 5, "mana_cost": 1, "difficulty": 50, "first_cast_exp_rate": 1 }, { - "spell_id": 1, + "spell_tag": "Phase_Door", "learn_level": 7, "mana_cost": 2, "difficulty": 55, "first_cast_exp_rate": 1 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 8, "mana_cost": 3, "difficulty": 65, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Light_Area", "learn_level": 9, "mana_cost": 3, "difficulty": 65, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Confuse_Monster", "learn_level": 13, "mana_cost": 6, "difficulty": 75, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Teleport", "learn_level": 15, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 1 }, { - "spell_id": 6, + "spell_tag": "Sleep_Monster", "learn_level": 17, "mana_cost": 9, "difficulty": 75, "first_cast_exp_rate": 1 }, { - "spell_id": 7, + "spell_tag": "Recharging", "learn_level": 21, "mana_cost": 12, "difficulty": 80, "first_cast_exp_rate": 1 }, { - "spell_id": 8, + "spell_tag": "Magic_Mapping", "learn_level": 25, "mana_cost": 14, "difficulty": 80, "first_cast_exp_rate": 1 }, { - "spell_id": 9, + "spell_tag": "Identify", "learn_level": 27, "mana_cost": 15, "difficulty": 80, "first_cast_exp_rate": 1 }, { - "spell_id": 10, + "spell_tag": "Slow_Monster", "learn_level": 29, "mana_cost": 17, "difficulty": 75, "first_cast_exp_rate": 2 }, { - "spell_id": 11, + "spell_tag": "Mass_Sleep", "learn_level": 30, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Teleport_Away", "learn_level": 31, "mana_cost": 23, "difficulty": 80, "first_cast_exp_rate": 5 }, { - "spell_id": 13, + "spell_tag": "Haste_Self", "learn_level": 32, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Detection_True", "learn_level": 35, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 12 }, { - "spell_id": 15, + "spell_tag": "Identify_True", "learn_level": 40, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Detect_items_and_Treasure", "learn_level": 9, "mana_cost": 3, "difficulty": 65, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Charm_Monster", "learn_level": 14, "mana_cost": 10, "difficulty": 80, "first_cast_exp_rate": 8 }, { - "spell_id": 18, + "spell_tag": "Sense_Minds", "learn_level": 16, "mana_cost": 10, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 19, + "spell_tag": "Teleport_to_town", "learn_level": 22, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 20 }, { - "spell_id": 20, + "spell_tag": "Self_Knowledge", "learn_level": 17, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 20 }, { - "spell_id": 21, + "spell_tag": "Teleport_Level", "learn_level": 18, "mana_cost": 17, "difficulty": 60, "first_cast_exp_rate": 30 }, { - "spell_id": 22, + "spell_tag": "Word_of_Recall", "learn_level": 30, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 15 }, { - "spell_id": 23, + "spell_tag": "Dimension_Door", "learn_level": 44, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 24, + "spell_tag": "Probing", "learn_level": 15, "mana_cost": 15, "difficulty": 40, "first_cast_exp_rate": 10 }, { - "spell_id": 25, + "spell_tag": "Explosive_Rune", "learn_level": 28, "mana_cost": 33, "difficulty": 80, "first_cast_exp_rate": 60 }, { - "spell_id": 26, + "spell_tag": "Telekinesis", "learn_level": 20, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 37, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Charm_monsters", "learn_level": 44, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 80 }, { - "spell_id": 29, + "spell_tag": "Alchemy", "learn_level": 45, "mana_cost": 50, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Banishment", "learn_level": 49, "mana_cost": 50, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 31, + "spell_tag": "Globe_of_Invulnerability", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -4859,224 +4859,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 5, "mana_cost": 3, "difficulty": 40, "first_cast_exp_rate": 1 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 7, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 1 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 9, "mana_cost": 5, "difficulty": 50, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 13, "mana_cost": 7, "difficulty": 60, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 15, "mana_cost": 7, "difficulty": 80, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 17, "mana_cost": 15, "difficulty": 80, "first_cast_exp_rate": 1 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 19, "mana_cost": 17, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 19, "mana_cost": 19, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 21, "mana_cost": 21, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 23, "mana_cost": 23, "difficulty": 75, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 27, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 31, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 5 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 35, "mana_cost": 80, "difficulty": 75, "first_cast_exp_rate": 5 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 40, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 20, "mana_cost": 25, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 23, "mana_cost": 20, "difficulty": 40, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 28, "mana_cost": 28, "difficulty": 75, "first_cast_exp_rate": 25 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 32, "mana_cost": 32, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 46, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 48, "mana_cost": 45, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 50, "mana_cost": 50, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 30, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 31, "mana_cost": 80, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 32, "mana_cost": 40, "difficulty": 90, "first_cast_exp_rate": 150 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 41, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 50, "mana_cost": 125, "difficulty": 90, @@ -5088,224 +5088,224 @@ "name": "TRUMP", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Phase_Door", "learn_level": 5, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Trump_Spiders", "learn_level": 7, "mana_cost": 5, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Shuffle", "learn_level": 9, "mana_cost": 7, "difficulty": 37, "first_cast_exp_rate": 8 }, { - "spell_id": 3, + "spell_tag": "Reset_Recall", "learn_level": 11, "mana_cost": 9, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 4, + "spell_tag": "Teleport", "learn_level": 13, "mana_cost": 11, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Trump_Spying", "learn_level": 15, "mana_cost": 15, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Teleport_Away", "learn_level": 19, "mana_cost": 20, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Trump_Animals", "learn_level": 22, "mana_cost": 21, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 8, + "spell_tag": "Trump_Reach", "learn_level": 25, "mana_cost": 22, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Trump_Kamikaze", "learn_level": 28, "mana_cost": 23, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Phantasmal_Servant", "learn_level": 30, "mana_cost": 26, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 11, + "spell_tag": "Haste_Monster", "learn_level": 35, "mana_cost": 35, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Teleport_Level", "learn_level": 39, "mana_cost": 38, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 13, + "spell_tag": "Dimension_Door", "learn_level": 41, "mana_cost": 40, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 14, + "spell_tag": "Word_of_Recall", "learn_level": 46, "mana_cost": 44, "difficulty": 40, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Banish", "learn_level": 49, "mana_cost": 50, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 16, + "spell_tag": "Swap_Position", "learn_level": 26, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Trump_Undead", "learn_level": 30, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 25 }, { - "spell_id": 18, + "spell_tag": "Trump_Reptile", "learn_level": 33, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 30 }, { - "spell_id": 19, + "spell_tag": "Trump_Monsters", "learn_level": 35, "mana_cost": 32, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 20, + "spell_tag": "Trump_Hounds", "learn_level": 38, "mana_cost": 33, "difficulty": 35, "first_cast_exp_rate": 35 }, { - "spell_id": 21, + "spell_tag": "Trump_Branding", "learn_level": 42, "mana_cost": 90, "difficulty": 40, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Living_Trump", "learn_level": 45, "mana_cost": 150, "difficulty": 45, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Trump_Cyberdemon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Trump_Divination", "learn_level": 35, "mana_cost": 30, "difficulty": 30, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Trump_Lore", "learn_level": 42, "mana_cost": 65, "difficulty": 45, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Heal_Monster", "learn_level": 44, "mana_cost": 70, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 27, + "spell_tag": "Trump_Dragon", "learn_level": 46, "mana_cost": 100, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "Trump_Meteor", "learn_level": 46, "mana_cost": 60, "difficulty": 70, "first_cast_exp_rate": 75 }, { - "spell_id": 29, + "spell_tag": "Trump_Demon", "learn_level": 49, "mana_cost": 125, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 30, + "spell_tag": "Trump_Greater_Undead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Trump_Ancient_Dragon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -5317,224 +5317,224 @@ "name": "ARCANE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Zap", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Wizard_Lock", "learn_level": 1, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 2, + "spell_tag": "Detect_Invisibility", "learn_level": 1, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Detect_Monsters", "learn_level": 2, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Blink", "learn_level": 2, "mana_cost": 2, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Light_Area", "learn_level": 4, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Trap_and_Door_Destruction", "learn_level": 5, "mana_cost": 5, "difficulty": 33, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Cure_Light_Wounds", "learn_level": 6, "mana_cost": 7, "difficulty": 44, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 7, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Phlogiston", "learn_level": 8, "mana_cost": 8, "difficulty": 60, "first_cast_exp_rate": 7 }, { - "spell_id": 10, + "spell_tag": "Detect_Treasure", "learn_level": 9, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Detect_Enchantment", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Detect_Objects", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 13, + "spell_tag": "Cure_Poison", "learn_level": 11, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Resist_Cold", "learn_level": 12, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Resist_Fire", "learn_level": 13, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Resist_Lightning", "learn_level": 14, "mana_cost": 13, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Resist_Acid", "learn_level": 15, "mana_cost": 13, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 18, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 16, "mana_cost": 15, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 19, + "spell_tag": "Teleport", "learn_level": 18, "mana_cost": 15, "difficulty": 45, "first_cast_exp_rate": 8 }, { - "spell_id": 20, + "spell_tag": "Identify", "learn_level": 21, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 25 }, { - "spell_id": 21, + "spell_tag": "Stone_to_Mud", "learn_level": 23, "mana_cost": 15, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 22, + "spell_tag": "Ray_of_Light", "learn_level": 27, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 23, + "spell_tag": "Satisfy_Hunger", "learn_level": 30, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 12 }, { - "spell_id": 24, + "spell_tag": "See_Invisible", "learn_level": 30, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 13 }, { - "spell_id": 25, + "spell_tag": "Conjure_Elemental", "learn_level": 33, "mana_cost": 50, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 26, + "spell_tag": "Teleport_Level", "learn_level": 36, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 27, + "spell_tag": "Teleport_Away", "learn_level": 41, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 28, + "spell_tag": "Elemental_Ball", "learn_level": 42, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 29, + "spell_tag": "Detection", "learn_level": 43, "mana_cost": 30, "difficulty": 65, "first_cast_exp_rate": 40 }, { - "spell_id": 30, + "spell_tag": "Word_of_Recall", "learn_level": 46, "mana_cost": 50, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 31, + "spell_tag": "Clairvoyance", "learn_level": 49, "mana_cost": 100, "difficulty": 80, @@ -5546,224 +5546,224 @@ "name": "CRAFT", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Infravision", "learn_level": 5, "mana_cost": 2, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 1, + "spell_tag": "Regeneration", "learn_level": 7, "mana_cost": 3, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Satisfy_Hunger", "learn_level": 8, "mana_cost": 5, "difficulty": 45, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Resist_Cold", "learn_level": 11, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Resist_Fire", "learn_level": 13, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 2 }, { - "spell_id": 5, + "spell_tag": "Heroism", "learn_level": 15, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 3 }, { - "spell_id": 6, + "spell_tag": "Resist_Lightning", "learn_level": 18, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 2 }, { - "spell_id": 7, + "spell_tag": "Resist_Acid", "learn_level": 20, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 2 }, { - "spell_id": 8, + "spell_tag": "See_Invisibility", "learn_level": 23, "mana_cost": 18, "difficulty": 55, "first_cast_exp_rate": 2 }, { - "spell_id": 9, + "spell_tag": "Remove_Curse", "learn_level": 27, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 2 }, { - "spell_id": 10, + "spell_tag": "Resist_Poison", "learn_level": 28, "mana_cost": 24, "difficulty": 65, "first_cast_exp_rate": 3 }, { - "spell_id": 11, + "spell_tag": "Berserk", "learn_level": 30, "mana_cost": 27, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 12, + "spell_tag": "Self_Knowledge", "learn_level": 25, "mana_cost": 22, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 35, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 2 }, { - "spell_id": 14, + "spell_tag": "Cure", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 15, + "spell_tag": "Mana_Branding", "learn_level": 50, "mana_cost": 90, "difficulty": 85, "first_cast_exp_rate": 25 }, { - "spell_id": 16, + "spell_tag": "Telepathy", "learn_level": 23, "mana_cost": 23, "difficulty": 60, "first_cast_exp_rate": 6 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 24, "mana_cost": 18, "difficulty": 80, "first_cast_exp_rate": 60 }, { - "spell_id": 18, + "spell_tag": "Resistance", "learn_level": 28, "mana_cost": 30, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 19, + "spell_tag": "Haste_Self", "learn_level": 32, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 5 }, { - "spell_id": 20, + "spell_tag": "Walk_through_Wall", "learn_level": 37, "mana_cost": 65, "difficulty": 80, "first_cast_exp_rate": 25 }, { - "spell_id": 21, + "spell_tag": "Polish_Shield", "learn_level": 41, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 75 }, { - "spell_id": 22, + "spell_tag": "Create_Golem", "learn_level": 48, "mana_cost": 120, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 23, + "spell_tag": "Magical_armor", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Remove_Enchantment", "learn_level": 24, "mana_cost": 24, "difficulty": 75, "first_cast_exp_rate": 25 }, { - "spell_id": 25, + "spell_tag": "Remove_All_Curse", "learn_level": 37, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 75 }, { - "spell_id": 26, + "spell_tag": "Knowledge_True", "learn_level": 42, "mana_cost": 60, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Enchant_Weapon", "learn_level": 42, "mana_cost": 80, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Enchant_Armor", "learn_level": 43, "mana_cost": 100, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Brand_Weapon", "learn_level": 46, "mana_cost": 120, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 30, + "spell_tag": "Living_Trump", "learn_level": 49, "mana_cost": 150, "difficulty": 90, "first_cast_exp_rate": 125 }, { - "spell_id": 31, + "spell_tag": "Immunity", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -5787,224 +5787,224 @@ "name": "SORCERY", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Monsters", "learn_level": 3, "mana_cost": 2, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 1, + "spell_tag": "Phase_Door", "learn_level": 3, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 5, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 3, + "spell_tag": "Light_Area", "learn_level": 7, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Confuse_Monster", "learn_level": 9, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 5, + "spell_tag": "Teleport", "learn_level": 11, "mana_cost": 8, "difficulty": 45, "first_cast_exp_rate": 2 }, { - "spell_id": 6, + "spell_tag": "Sleep_Monster", "learn_level": 13, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Recharging", "learn_level": 17, "mana_cost": 17, "difficulty": 90, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Magic_Mapping", "learn_level": 20, "mana_cost": 19, "difficulty": 85, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Identify", "learn_level": 23, "mana_cost": 25, "difficulty": 90, "first_cast_exp_rate": 3 }, { - "spell_id": 10, + "spell_tag": "Slow_Monster", "learn_level": 25, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 11, + "spell_tag": "Mass_Sleep", "learn_level": 27, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 3 }, { - "spell_id": 12, + "spell_tag": "Teleport_Away", "learn_level": 31, "mana_cost": 27, "difficulty": 70, "first_cast_exp_rate": 3 }, { - "spell_id": 13, + "spell_tag": "Haste_Self", "learn_level": 34, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Detection_True", "learn_level": 38, "mana_cost": 37, "difficulty": 70, "first_cast_exp_rate": 8 }, { - "spell_id": 15, + "spell_tag": "Identify_True", "learn_level": 42, "mana_cost": 40, "difficulty": 90, "first_cast_exp_rate": 10 }, { - "spell_id": 16, + "spell_tag": "Detect_items_and_Treasure", "learn_level": 15, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 20 }, { - "spell_id": 17, + "spell_tag": "Charm_Monster", "learn_level": 17, "mana_cost": 17, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 18, + "spell_tag": "Sense_Minds", "learn_level": 19, "mana_cost": 25, "difficulty": 65, "first_cast_exp_rate": 20 }, { - "spell_id": 19, + "spell_tag": "Teleport_to_town", "learn_level": 22, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Self_Knowledge", "learn_level": 23, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 20 }, { - "spell_id": 21, + "spell_tag": "Teleport_Level", "learn_level": 27, "mana_cost": 27, "difficulty": 60, "first_cast_exp_rate": 15 }, { - "spell_id": 22, + "spell_tag": "Word_of_Recall", "learn_level": 35, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 13 }, { - "spell_id": 23, + "spell_tag": "Dimension_Door", "learn_level": 47, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 24, + "spell_tag": "Probing", "learn_level": 20, "mana_cost": 20, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 25, + "spell_tag": "Explosive_Rune", "learn_level": 26, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 60 }, { - "spell_id": 26, + "spell_tag": "Telekinesis", "learn_level": 27, "mana_cost": 27, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 40, "mana_cost": 40, "difficulty": 95, "first_cast_exp_rate": 120 }, { - "spell_id": 28, + "spell_tag": "Charm_monsters", "learn_level": 45, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Alchemy", "learn_level": 50, "mana_cost": 50, "difficulty": 90, "first_cast_exp_rate": 175 }, { - "spell_id": 30, + "spell_tag": "Banishment", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Globe_of_Invulnerability", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -6016,224 +6016,224 @@ "name": "NATURE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Creatures", "learn_level": 3, "mana_cost": 1, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 1, + "spell_tag": "Lightning", "learn_level": 4, "mana_cost": 3, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 4, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Produce_Food", "learn_level": 5, "mana_cost": 7, "difficulty": 55, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Daylight", "learn_level": 6, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 5, + "spell_tag": "Animal_Taming", "learn_level": 7, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 6, + "spell_tag": "Resist_Environment", "learn_level": 8, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Cure_Wounds_And_Poison", "learn_level": 9, "mana_cost": 7, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Stone_to_Mud", "learn_level": 9, "mana_cost": 7, "difficulty": 80, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Frost_Bolt", "learn_level": 10, "mana_cost": 7, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 10, + "spell_tag": "Nature_Awareness", "learn_level": 11, "mana_cost": 9, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Fire_Bolt", "learn_level": 12, "mana_cost": 9, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Ray_of_Sunlight", "learn_level": 14, "mana_cost": 9, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Entangle", "learn_level": 18, "mana_cost": 20, "difficulty": 65, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Summon_Animal", "learn_level": 23, "mana_cost": 23, "difficulty": 65, "first_cast_exp_rate": 10 }, { - "spell_id": 15, + "spell_tag": "Herbal_Healing", "learn_level": 40, "mana_cost": 60, "difficulty": 90, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Stair_Building", "learn_level": 12, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 25 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 14, "mana_cost": 15, "difficulty": 70, "first_cast_exp_rate": 60 }, { - "spell_id": 18, + "spell_tag": "Resistance_True", "learn_level": 20, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Forest_Creation", "learn_level": 22, "mana_cost": 24, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 20, + "spell_tag": "Animal_Friendship", "learn_level": 35, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 75 }, { - "spell_id": 21, + "spell_tag": "Stone_Tell", "learn_level": 38, "mana_cost": 40, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 22, + "spell_tag": "Wall_of_Stone", "learn_level": 40, "mana_cost": 55, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Protect_from_Corrosion", "learn_level": 42, "mana_cost": 80, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Earthquake", "learn_level": 25, "mana_cost": 28, "difficulty": 60, "first_cast_exp_rate": 150 }, { - "spell_id": 25, + "spell_tag": "Whirlwind", "learn_level": 26, "mana_cost": 26, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Blizzard", "learn_level": 30, "mana_cost": 27, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 27, + "spell_tag": "Lightning_Storm", "learn_level": 32, "mana_cost": 29, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 28, + "spell_tag": "Whirlpool", "learn_level": 36, "mana_cost": 33, "difficulty": 75, "first_cast_exp_rate": 45 }, { - "spell_id": 29, + "spell_tag": "Call_Sunlight", "learn_level": 40, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Elemental_Branding", "learn_level": 41, "mana_cost": 80, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Natures_Wrath", "learn_level": 42, "mana_cost": 80, "difficulty": 75, @@ -6245,224 +6245,224 @@ "name": "CHAOS", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 3, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 1, + "spell_tag": "Trap_Door_Destruction", "learn_level": 3, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Flash_of_Light", "learn_level": 5, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 3, + "spell_tag": "Touch_of_Confusion", "learn_level": 7, "mana_cost": 5, "difficulty": 45, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Mana_Burst", "learn_level": 14, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 5, + "spell_tag": "Fire_Bolt", "learn_level": 20, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Fist_of_Force", "learn_level": 25, "mana_cost": 21, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Teleport_Self", "learn_level": 25, "mana_cost": 22, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Wonder", "learn_level": 27, "mana_cost": 23, "difficulty": 60, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Chaos_Bolt", "learn_level": 30, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 10, + "spell_tag": "Sonic_Boom", "learn_level": 33, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 13 }, { - "spell_id": 11, + "spell_tag": "Doom_Bolt", "learn_level": 35, "mana_cost": 31, "difficulty": 70, "first_cast_exp_rate": 10 }, { - "spell_id": 12, + "spell_tag": "Fire_Ball", "learn_level": 37, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 15 }, { - "spell_id": 13, + "spell_tag": "Teleport_Other", "learn_level": 39, "mana_cost": 29, "difficulty": 65, "first_cast_exp_rate": 5 }, { - "spell_id": 14, + "spell_tag": "Word_of_Destruction", "learn_level": 43, "mana_cost": 30, "difficulty": 95, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Invoke_Logrus", "learn_level": 48, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 30 }, { - "spell_id": 16, + "spell_tag": "Polymorph_Other", "learn_level": 22, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 30 }, { - "spell_id": 17, + "spell_tag": "Chain_Lightning", "learn_level": 25, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Arcane_Binding", "learn_level": 28, "mana_cost": 25, "difficulty": 80, "first_cast_exp_rate": 45 }, { - "spell_id": 19, + "spell_tag": "Disintegrate", "learn_level": 35, "mana_cost": 32, "difficulty": 70, "first_cast_exp_rate": 35 }, { - "spell_id": 20, + "spell_tag": "Alter_Reality", "learn_level": 38, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 21, + "spell_tag": "Magic_Rocket", "learn_level": 50, "mana_cost": 50, "difficulty": 90, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Chaos_Branding", "learn_level": 48, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Summon_Demon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Beam_of_Gravity", "learn_level": 33, "mana_cost": 33, "difficulty": 66, "first_cast_exp_rate": 8 }, { - "spell_id": 25, + "spell_tag": "Meteor_Swarm", "learn_level": 40, "mana_cost": 45, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 26, + "spell_tag": "Flame_Strike", "learn_level": 42, "mana_cost": 42, "difficulty": 75, "first_cast_exp_rate": 42 }, { - "spell_id": 27, + "spell_tag": "Call_Chaos", "learn_level": 48, "mana_cost": 48, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Polymorph_Self", "learn_level": 42, "mana_cost": 75, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 29, + "spell_tag": "Mana_Storm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Breathe_Logrus", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Call_the_Void", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -6474,224 +6474,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 5, "mana_cost": 2, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 5, "mana_cost": 3, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 7, "mana_cost": 4, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 9, "mana_cost": 5, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 11, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 17, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 19, "mana_cost": 19, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 22, "mana_cost": 22, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 24, "mana_cost": 24, "difficulty": 55, "first_cast_exp_rate": 3 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 26, "mana_cost": 26, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 28, "mana_cost": 28, "difficulty": 75, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 34, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 10 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 42, "mana_cost": 85, "difficulty": 80, "first_cast_exp_rate": 5 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 43, "mana_cost": 50, "difficulty": 90, "first_cast_exp_rate": 75 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 44, "mana_cost": 39, "difficulty": 76, "first_cast_exp_rate": 50 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 25, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 25, "mana_cost": 25, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 27, "mana_cost": 27, "difficulty": 40, "first_cast_exp_rate": 40 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 41, "mana_cost": 60, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 45, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 9 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 45, "mana_cost": 50, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 47, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 35, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 38, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 40, "mana_cost": 45, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 48, "mana_cost": 50, "difficulty": 30, "first_cast_exp_rate": 75 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -6703,224 +6703,224 @@ "name": "TRUMP", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Phase_Door", "learn_level": 3, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Trump_Spiders", "learn_level": 6, "mana_cost": 6, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Shuffle", "learn_level": 9, "mana_cost": 7, "difficulty": 37, "first_cast_exp_rate": 8 }, { - "spell_id": 3, + "spell_tag": "Reset_Recall", "learn_level": 10, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 4, + "spell_tag": "Teleport", "learn_level": 13, "mana_cost": 10, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Trump_Spying", "learn_level": 17, "mana_cost": 17, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Teleport_Away", "learn_level": 20, "mana_cost": 20, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Trump_Animals", "learn_level": 23, "mana_cost": 22, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 8, + "spell_tag": "Trump_Reach", "learn_level": 24, "mana_cost": 22, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Trump_Kamikaze", "learn_level": 27, "mana_cost": 23, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Phantasmal_Servant", "learn_level": 30, "mana_cost": 26, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 11, + "spell_tag": "Haste_Monster", "learn_level": 35, "mana_cost": 33, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Teleport_Level", "learn_level": 39, "mana_cost": 38, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 13, + "spell_tag": "Dimension_Door", "learn_level": 42, "mana_cost": 40, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 14, + "spell_tag": "Word_of_Recall", "learn_level": 45, "mana_cost": 42, "difficulty": 40, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Banish", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 16, + "spell_tag": "Swap_Position", "learn_level": 25, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Trump_Undead", "learn_level": 28, "mana_cost": 26, "difficulty": 35, "first_cast_exp_rate": 25 }, { - "spell_id": 18, + "spell_tag": "Trump_Reptile", "learn_level": 31, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 30 }, { - "spell_id": 19, + "spell_tag": "Trump_Monsters", "learn_level": 36, "mana_cost": 32, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 20, + "spell_tag": "Trump_Hounds", "learn_level": 36, "mana_cost": 33, "difficulty": 35, "first_cast_exp_rate": 35 }, { - "spell_id": 21, + "spell_tag": "Trump_Branding", "learn_level": 41, "mana_cost": 80, "difficulty": 40, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Living_Trump", "learn_level": 44, "mana_cost": 120, "difficulty": 45, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Trump_Cyberdemon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Trump_Divination", "learn_level": 35, "mana_cost": 33, "difficulty": 30, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Trump_Lore", "learn_level": 40, "mana_cost": 65, "difficulty": 45, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Heal_Monster", "learn_level": 44, "mana_cost": 65, "difficulty": 45, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Trump_Dragon", "learn_level": 48, "mana_cost": 95, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "Trump_Meteor", "learn_level": 46, "mana_cost": 60, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Trump_Demon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Trump_Greater_Undead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Trump_Ancient_Dragon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -6932,224 +6932,224 @@ "name": "ARCANE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Zap", "learn_level": 3, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Wizard_Lock", "learn_level": 3, "mana_cost": 2, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 2, + "spell_tag": "Detect_Invisibility", "learn_level": 4, "mana_cost": 3, "difficulty": 33, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Detect_Monsters", "learn_level": 4, "mana_cost": 3, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Blink", "learn_level": 5, "mana_cost": 4, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Light_Area", "learn_level": 6, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Trap_and_Door_Destruction", "learn_level": 7, "mana_cost": 7, "difficulty": 33, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Cure_Light_Wounds", "learn_level": 8, "mana_cost": 8, "difficulty": 44, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 9, "mana_cost": 9, "difficulty": 40, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Phlogiston", "learn_level": 10, "mana_cost": 10, "difficulty": 60, "first_cast_exp_rate": 7 }, { - "spell_id": 10, + "spell_tag": "Detect_Treasure", "learn_level": 11, "mana_cost": 11, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Detect_Enchantment", "learn_level": 12, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Detect_Objects", "learn_level": 14, "mana_cost": 13, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 13, + "spell_tag": "Cure_Poison", "learn_level": 15, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Resist_Cold", "learn_level": 16, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Resist_Fire", "learn_level": 17, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Resist_Lightning", "learn_level": 18, "mana_cost": 17, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Resist_Acid", "learn_level": 19, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 18, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 20, "mana_cost": 19, "difficulty": 33, "first_cast_exp_rate": 6 }, { - "spell_id": 19, + "spell_tag": "Teleport", "learn_level": 22, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 8 }, { - "spell_id": 20, + "spell_tag": "Identify", "learn_level": 25, "mana_cost": 29, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 21, + "spell_tag": "Stone_to_Mud", "learn_level": 27, "mana_cost": 26, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 22, + "spell_tag": "Ray_of_Light", "learn_level": 29, "mana_cost": 27, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 23, + "spell_tag": "Satisfy_Hunger", "learn_level": 33, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 12 }, { - "spell_id": 24, + "spell_tag": "See_Invisible", "learn_level": 35, "mana_cost": 33, "difficulty": 60, "first_cast_exp_rate": 13 }, { - "spell_id": 25, + "spell_tag": "Conjure_Elemental", "learn_level": 38, "mana_cost": 36, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 26, + "spell_tag": "Teleport_Level", "learn_level": 42, "mana_cost": 38, "difficulty": 80, "first_cast_exp_rate": 25 }, { - "spell_id": 27, + "spell_tag": "Teleport_Away", "learn_level": 46, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 28, + "spell_tag": "Elemental_Ball", "learn_level": 47, "mana_cost": 42, "difficulty": 66, "first_cast_exp_rate": 30 }, { - "spell_id": 29, + "spell_tag": "Detection", "learn_level": 48, "mana_cost": 44, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 30, + "spell_tag": "Word_of_Recall", "learn_level": 49, "mana_cost": 65, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 31, + "spell_tag": "Clairvoyance", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -7161,224 +7161,224 @@ "name": "DEMON", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 3, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 1, + "spell_tag": "Detect_Unlife", "learn_level": 4, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Evil_Bless", "learn_level": 6, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 3, + "spell_tag": "Resist_Fire", "learn_level": 7, "mana_cost": 8, "difficulty": 45, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Fire_Bolt", "learn_level": 17, "mana_cost": 10, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 5, + "spell_tag": "Summon_Manes", "learn_level": 20, "mana_cost": 15, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 6, + "spell_tag": "Nether_Ball", "learn_level": 25, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Raise_the_Morale", "learn_level": 26, "mana_cost": 14, "difficulty": 66, "first_cast_exp_rate": 2 }, { - "spell_id": 8, + "spell_tag": "Vision", "learn_level": 29, "mana_cost": 26, "difficulty": 70, "first_cast_exp_rate": 13 }, { - "spell_id": 9, + "spell_tag": "Resist_Nether", "learn_level": 32, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 10 }, { - "spell_id": 10, + "spell_tag": "Plasma_bolt", "learn_level": 35, "mana_cost": 31, "difficulty": 75, "first_cast_exp_rate": 15 }, { - "spell_id": 11, + "spell_tag": "Fire_Ball", "learn_level": 37, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 15 }, { - "spell_id": 12, + "spell_tag": "Fire_Branding", "learn_level": 38, "mana_cost": 80, "difficulty": 95, "first_cast_exp_rate": 20 }, { - "spell_id": 13, + "spell_tag": "Demonfire", "learn_level": 44, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 15 }, { - "spell_id": 14, + "spell_tag": "Summon_Demon", "learn_level": 47, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 15, + "spell_tag": "Nether_Wave", "learn_level": 47, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 35 }, { - "spell_id": 16, + "spell_tag": "Devilish_Eye", "learn_level": 18, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 30 }, { - "spell_id": 17, + "spell_tag": "Devil_Cloak", "learn_level": 22, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Lava_Flow", "learn_level": 37, "mana_cost": 38, "difficulty": 80, "first_cast_exp_rate": 45 }, { - "spell_id": 19, + "spell_tag": "Plasma_Ball", "learn_level": 40, "mana_cost": 42, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 20, + "spell_tag": "Polymorph_Demon", "learn_level": 41, "mana_cost": 60, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 21, + "spell_tag": "Fireblast", "learn_level": 45, "mana_cost": 50, "difficulty": 60, "first_cast_exp_rate": 35 }, { - "spell_id": 22, + "spell_tag": "Succubuss_Kiss", "learn_level": 48, "mana_cost": 48, "difficulty": 80, "first_cast_exp_rate": 42 }, { - "spell_id": 23, + "spell_tag": "Doom_Hand", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Immortal_Body", "learn_level": 35, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 25, + "spell_tag": "Insanity_Circle", "learn_level": 45, "mana_cost": 55, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 26, + "spell_tag": "Explode_Pets", "learn_level": 50, "mana_cost": 70, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Summon_Greater_Demon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "Fire_Storm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Nether_Storm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Bloody_Curse", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Polymorph_Demonlord", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -7402,224 +7402,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 3, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 4, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 6, "mana_cost": 5, "difficulty": 27, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 8, "mana_cost": 8, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 10, "mana_cost": 11, "difficulty": 75, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 12, "mana_cost": 12, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 15, "mana_cost": 15, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 17, "mana_cost": 17, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 19, "mana_cost": 19, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 23, "mana_cost": 23, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 35, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 30 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 38, "mana_cost": 75, "difficulty": 90, "first_cast_exp_rate": 16 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 46, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 45, "mana_cost": 38, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 47, "mana_cost": 35, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 15, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 180 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 15, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 18, "mana_cost": 20, "difficulty": 30, "first_cast_exp_rate": 15 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 38, "mana_cost": 53, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 40, "mana_cost": 100, "difficulty": 60, "first_cast_exp_rate": 16 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 42, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 44, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 125 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 48, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 30, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 36, "mana_cost": 85, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 38, "mana_cost": 45, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 45, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 47, "mana_cost": 52, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 48, "mana_cost": 75, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 50, "mana_cost": 115, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 50, "mana_cost": 111, "difficulty": 95, @@ -7631,224 +7631,224 @@ "name": "CRUSADE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Punishment", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Evil", "learn_level": 3, "mana_cost": 1, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Remove_Fear", "learn_level": 5, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Scare_Monster", "learn_level": 8, "mana_cost": 8, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Sanctuary", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Portal", "learn_level": 13, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Star_Dust", "learn_level": 15, "mana_cost": 14, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Purify", "learn_level": 17, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Scatter_Evil", "learn_level": 18, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Holy_Orb", "learn_level": 22, "mana_cost": 19, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Exorcism", "learn_level": 24, "mana_cost": 22, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Remove_Curse", "learn_level": 27, "mana_cost": 25, "difficulty": 80, "first_cast_exp_rate": 5 }, { - "spell_id": 12, + "spell_tag": "Sense_Unseen", "learn_level": 29, "mana_cost": 28, "difficulty": 65, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 34, "mana_cost": 28, "difficulty": 65, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Judgment_Thunder", "learn_level": 43, "mana_cost": 43, "difficulty": 85, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Holy_Word", "learn_level": 40, "mana_cost": 40, "difficulty": 85, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Unbarring_Ways", "learn_level": 8, "mana_cost": 8, "difficulty": 33, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Arrest", "learn_level": 20, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 50 }, { - "spell_id": 18, + "spell_tag": "Holy_Aura", "learn_level": 25, "mana_cost": 21, "difficulty": 65, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Dispel_Undead_and_Demons", "learn_level": 28, "mana_cost": 28, "difficulty": 60, "first_cast_exp_rate": 70 }, { - "spell_id": 20, + "spell_tag": "Dispel_Evil", "learn_level": 35, "mana_cost": 32, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 21, + "spell_tag": "Holy_Blade", "learn_level": 38, "mana_cost": 80, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Star_Burst", "learn_level": 46, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 23, + "spell_tag": "Summon_Angel", "learn_level": 48, "mana_cost": 111, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 24, + "spell_tag": "Heroism", "learn_level": 10, "mana_cost": 10, "difficulty": 66, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Dispel_Curse", "learn_level": 35, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 26, + "spell_tag": "Banish_Evil", "learn_level": 36, "mana_cost": 33, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Armageddon", "learn_level": 42, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 75 }, { - "spell_id": 28, + "spell_tag": "An_Eye_for_an_Eye", "learn_level": 44, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 75 }, { - "spell_id": 29, + "spell_tag": "Wrath_of_the_God", "learn_level": 47, "mana_cost": 80, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Divine_Intervention", "learn_level": 48, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Crusade", "learn_level": 50, "mana_cost": 100, "difficulty": 80, @@ -7872,224 +7872,224 @@ "name": "LIFE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Cure_Light_Wounds", "learn_level": 2, "mana_cost": 2, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Bless", "learn_level": 4, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Cause_Light_Wounds", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Call_Light", "learn_level": 6, "mana_cost": 6, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Detect_Doors_And_Traps", "learn_level": 8, "mana_cost": 8, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 9, "mana_cost": 9, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Cure_Poison", "learn_level": 14, "mana_cost": 14, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Satisfy_Hunger", "learn_level": 16, "mana_cost": 16, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Remove_Curse", "learn_level": 18, "mana_cost": 18, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Cause_Medium_Wounds", "learn_level": 20, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cure_Critical_Wounds", "learn_level": 22, "mana_cost": 22, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Resist_Heat_and_Cold", "learn_level": 24, "mana_cost": 24, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Surroundings", "learn_level": 26, "mana_cost": 26, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Turn_Undead", "learn_level": 28, "mana_cost": 28, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Healing", "learn_level": 33, "mana_cost": 33, "difficulty": 55, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Rune_of_Protection", "learn_level": 40, "mana_cost": 70, "difficulty": 75, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Dispel_Curse", "learn_level": 28, "mana_cost": 28, "difficulty": 50, "first_cast_exp_rate": 75 }, { - "spell_id": 17, + "spell_tag": "Perception", "learn_level": 30, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 18, + "spell_tag": "Dispel_Undead", "learn_level": 34, "mana_cost": 34, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 19, + "spell_tag": "Day_of_the_Dove", "learn_level": 36, "mana_cost": 36, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 20, + "spell_tag": "Cause_Critical_Wounds", "learn_level": 38, "mana_cost": 38, "difficulty": 70, "first_cast_exp_rate": 75 }, { - "spell_id": 21, + "spell_tag": "Word_of_Recall", "learn_level": 42, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 22, + "spell_tag": "Alter_Reality", "learn_level": 45, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 23, + "spell_tag": "Warding_True", "learn_level": 50, "mana_cost": 70, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 24, + "spell_tag": "Sterilization", "learn_level": 10, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Detection", "learn_level": 28, "mana_cost": 28, "difficulty": 50, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Annihilate_Undead", "learn_level": 38, "mana_cost": 85, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 45, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 225 }, { - "spell_id": 28, + "spell_tag": "Restoration", "learn_level": 46, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 29, + "spell_tag": "Healing_True", "learn_level": 48, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Holy_Vision", "learn_level": 49, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 31, + "spell_tag": "Ultimate_Resistance", "learn_level": 50, "mana_cost": 100, "difficulty": 80, @@ -8101,224 +8101,224 @@ "name": "SORCERY", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Monsters", "learn_level": 1, "mana_cost": 1, "difficulty": 23, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Phase_Door", "learn_level": 2, "mana_cost": 2, "difficulty": 24, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Light_Area", "learn_level": 4, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Confuse_Monster", "learn_level": 5, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Teleport", "learn_level": 6, "mana_cost": 6, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Sleep_Monster", "learn_level": 7, "mana_cost": 7, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Recharging", "learn_level": 8, "mana_cost": 8, "difficulty": 75, "first_cast_exp_rate": 9 }, { - "spell_id": 8, + "spell_tag": "Magic_Mapping", "learn_level": 10, "mana_cost": 9, "difficulty": 75, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Identify", "learn_level": 11, "mana_cost": 10, "difficulty": 75, "first_cast_exp_rate": 8 }, { - "spell_id": 10, + "spell_tag": "Slow_Monster", "learn_level": 12, "mana_cost": 11, "difficulty": 75, "first_cast_exp_rate": 7 }, { - "spell_id": 11, + "spell_tag": "Mass_Sleep", "learn_level": 13, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Teleport_Away", "learn_level": 20, "mana_cost": 15, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 13, + "spell_tag": "Haste_Self", "learn_level": 27, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Detection_True", "learn_level": 33, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Identify_True", "learn_level": 40, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Detect_items_and_Treasure", "learn_level": 4, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 15 }, { - "spell_id": 17, + "spell_tag": "Charm_Monster", "learn_level": 14, "mana_cost": 12, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 18, + "spell_tag": "Sense_Minds", "learn_level": 16, "mana_cost": 14, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 19, + "spell_tag": "Teleport_to_town", "learn_level": 21, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Self_Knowledge", "learn_level": 19, "mana_cost": 19, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Teleport_Level", "learn_level": 24, "mana_cost": 22, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 22, + "spell_tag": "Word_of_Recall", "learn_level": 28, "mana_cost": 28, "difficulty": 75, "first_cast_exp_rate": 19 }, { - "spell_id": 23, + "spell_tag": "Dimension_Door", "learn_level": 44, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 24, + "spell_tag": "Probing", "learn_level": 12, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 20 }, { - "spell_id": 25, + "spell_tag": "Explosive_Rune", "learn_level": 23, "mana_cost": 28, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Telekinesis", "learn_level": 19, "mana_cost": 19, "difficulty": 75, "first_cast_exp_rate": 70 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 35, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 120 }, { - "spell_id": 28, + "spell_tag": "Charm_monsters", "learn_level": 39, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Alchemy", "learn_level": 46, "mana_cost": 55, "difficulty": 90, "first_cast_exp_rate": 175 }, { - "spell_id": 30, + "spell_tag": "Banishment", "learn_level": 48, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Globe_of_Invulnerability", "learn_level": 48, "mana_cost": 75, "difficulty": 85, @@ -8330,224 +8330,224 @@ "name": "NATURE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Creatures", "learn_level": 2, "mana_cost": 2, "difficulty": 23, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Lightning", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 4, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Produce_Food", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Daylight", "learn_level": 6, "mana_cost": 6, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Animal_Taming", "learn_level": 7, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Resist_Environment", "learn_level": 8, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Cure_Wounds_And_Poison", "learn_level": 9, "mana_cost": 9, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Stone_to_Mud", "learn_level": 10, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 9, + "spell_tag": "Frost_Bolt", "learn_level": 11, "mana_cost": 11, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 10, + "spell_tag": "Nature_Awareness", "learn_level": 12, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Fire_Bolt", "learn_level": 13, "mana_cost": 13, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Ray_of_Sunlight", "learn_level": 14, "mana_cost": 14, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 13, + "spell_tag": "Entangle", "learn_level": 19, "mana_cost": 15, "difficulty": 65, "first_cast_exp_rate": 7 }, { - "spell_id": 14, + "spell_tag": "Summon_Animal", "learn_level": 31, "mana_cost": 31, "difficulty": 65, "first_cast_exp_rate": 10 }, { - "spell_id": 15, + "spell_tag": "Herbal_Healing", "learn_level": 45, "mana_cost": 60, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Stair_Building", "learn_level": 12, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 44 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 15, "mana_cost": 15, "difficulty": 75, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance_True", "learn_level": 20, "mana_cost": 22, "difficulty": 85, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Forest_Creation", "learn_level": 25, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Animal_Friendship", "learn_level": 38, "mana_cost": 38, "difficulty": 85, "first_cast_exp_rate": 80 }, { - "spell_id": 21, + "spell_tag": "Stone_Tell", "learn_level": 40, "mana_cost": 42, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 22, + "spell_tag": "Wall_of_Stone", "learn_level": 45, "mana_cost": 48, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Protect_from_Corrosion", "learn_level": 49, "mana_cost": 95, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Earthquake", "learn_level": 25, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 25, + "spell_tag": "Whirlwind", "learn_level": 27, "mana_cost": 27, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 26, + "spell_tag": "Blizzard", "learn_level": 28, "mana_cost": 28, "difficulty": 75, "first_cast_exp_rate": 29 }, { - "spell_id": 27, + "spell_tag": "Lightning_Storm", "learn_level": 33, "mana_cost": 33, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 28, + "spell_tag": "Whirlpool", "learn_level": 38, "mana_cost": 38, "difficulty": 85, "first_cast_exp_rate": 65 }, { - "spell_id": 29, + "spell_tag": "Call_Sunlight", "learn_level": 41, "mana_cost": 41, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Elemental_Branding", "learn_level": 45, "mana_cost": 95, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Natures_Wrath", "learn_level": 50, "mana_cost": 85, "difficulty": 65, @@ -8559,224 +8559,224 @@ "name": "CHAOS", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 2, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Trap_Door_Destruction", "learn_level": 3, "mana_cost": 3, "difficulty": 22, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Flash_of_Light", "learn_level": 4, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Touch_of_Confusion", "learn_level": 5, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 4, + "spell_tag": "Mana_Burst", "learn_level": 8, "mana_cost": 8, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Fire_Bolt", "learn_level": 11, "mana_cost": 11, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Fist_of_Force", "learn_level": 17, "mana_cost": 15, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Teleport_Self", "learn_level": 18, "mana_cost": 17, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Wonder", "learn_level": 21, "mana_cost": 21, "difficulty": 45, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Chaos_Bolt", "learn_level": 23, "mana_cost": 22, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Sonic_Boom", "learn_level": 27, "mana_cost": 25, "difficulty": 50, "first_cast_exp_rate": 20 }, { - "spell_id": 11, + "spell_tag": "Doom_Bolt", "learn_level": 29, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 11 }, { - "spell_id": 12, + "spell_tag": "Fire_Ball", "learn_level": 33, "mana_cost": 33, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 13, + "spell_tag": "Teleport_Other", "learn_level": 37, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Word_of_Destruction", "learn_level": 41, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Invoke_Logrus", "learn_level": 48, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 16, + "spell_tag": "Polymorph_Other", "learn_level": 12, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Chain_Lightning", "learn_level": 17, "mana_cost": 16, "difficulty": 60, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Arcane_Binding", "learn_level": 20, "mana_cost": 18, "difficulty": 80, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Disintegrate", "learn_level": 27, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 35 }, { - "spell_id": 20, + "spell_tag": "Alter_Reality", "learn_level": 35, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 21, + "spell_tag": "Magic_Rocket", "learn_level": 46, "mana_cost": 46, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Chaos_Branding", "learn_level": 49, "mana_cost": 95, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Summon_Demon", "learn_level": 50, "mana_cost": 111, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Beam_of_Gravity", "learn_level": 24, "mana_cost": 20, "difficulty": 66, "first_cast_exp_rate": 8 }, { - "spell_id": 25, + "spell_tag": "Meteor_Swarm", "learn_level": 40, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 26, + "spell_tag": "Flame_Strike", "learn_level": 41, "mana_cost": 39, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 27, + "spell_tag": "Call_Chaos", "learn_level": 45, "mana_cost": 55, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 28, + "spell_tag": "Polymorph_Self", "learn_level": 48, "mana_cost": 48, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Mana_Storm", "learn_level": 49, "mana_cost": 60, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Breathe_Logrus", "learn_level": 50, "mana_cost": 100, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Call_the_Void", "learn_level": 50, "mana_cost": 100, "difficulty": 85, @@ -8788,224 +8788,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 4, "mana_cost": 4, "difficulty": 27, "first_cast_exp_rate": 3 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 7, "mana_cost": 7, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 9, "mana_cost": 10, "difficulty": 75, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 10, "mana_cost": 10, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 12, "mana_cost": 12, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 14, "mana_cost": 14, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 16, "mana_cost": 16, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 21, "mana_cost": 21, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 28, "mana_cost": 28, "difficulty": 85, "first_cast_exp_rate": 30 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 35, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 38, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 16 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 44, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 46, "mana_cost": 45, "difficulty": 95, "first_cast_exp_rate": 25 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 10, "mana_cost": 22, "difficulty": 80, "first_cast_exp_rate": 180 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 12, "mana_cost": 18, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 14, "mana_cost": 18, "difficulty": 30, "first_cast_exp_rate": 15 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 30, "mana_cost": 30, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 42, "mana_cost": 90, "difficulty": 70, "first_cast_exp_rate": 90 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 43, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 125 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 43, "mana_cost": 50, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 45, "mana_cost": 50, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 24, "mana_cost": 24, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 33, "mana_cost": 80, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 35, "mana_cost": 45, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 39, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 46, "mana_cost": 55, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 48, "mana_cost": 85, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 50, "mana_cost": 110, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 50, "mana_cost": 123, "difficulty": 95, @@ -9017,224 +9017,224 @@ "name": "TRUMP", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Phase_Door", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Trump_Spiders", "learn_level": 5, "mana_cost": 5, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Shuffle", "learn_level": 7, "mana_cost": 7, "difficulty": 37, "first_cast_exp_rate": 8 }, { - "spell_id": 3, + "spell_tag": "Reset_Recall", "learn_level": 8, "mana_cost": 7, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 4, + "spell_tag": "Teleport", "learn_level": 10, "mana_cost": 10, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Trump_Spying", "learn_level": 14, "mana_cost": 15, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Teleport_Away", "learn_level": 18, "mana_cost": 18, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Trump_Animals", "learn_level": 21, "mana_cost": 23, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 8, + "spell_tag": "Trump_Reach", "learn_level": 24, "mana_cost": 23, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Trump_Kamikaze", "learn_level": 27, "mana_cost": 24, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Phantasmal_Servant", "learn_level": 29, "mana_cost": 26, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 11, + "spell_tag": "Haste_Monster", "learn_level": 35, "mana_cost": 32, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Teleport_Level", "learn_level": 38, "mana_cost": 38, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 13, + "spell_tag": "Dimension_Door", "learn_level": 41, "mana_cost": 40, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 14, + "spell_tag": "Word_of_Recall", "learn_level": 44, "mana_cost": 42, "difficulty": 40, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Banish", "learn_level": 48, "mana_cost": 46, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 16, + "spell_tag": "Swap_Position", "learn_level": 23, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Trump_Undead", "learn_level": 29, "mana_cost": 27, "difficulty": 35, "first_cast_exp_rate": 25 }, { - "spell_id": 18, + "spell_tag": "Trump_Reptile", "learn_level": 31, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 30 }, { - "spell_id": 19, + "spell_tag": "Trump_Monsters", "learn_level": 33, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 20, + "spell_tag": "Trump_Hounds", "learn_level": 35, "mana_cost": 33, "difficulty": 35, "first_cast_exp_rate": 35 }, { - "spell_id": 21, + "spell_tag": "Trump_Branding", "learn_level": 40, "mana_cost": 80, "difficulty": 40, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Living_Trump", "learn_level": 42, "mana_cost": 120, "difficulty": 45, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Trump_Cyberdemon", "learn_level": 50, "mana_cost": 135, "difficulty": 45, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Trump_Divination", "learn_level": 33, "mana_cost": 30, "difficulty": 30, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Trump_Lore", "learn_level": 40, "mana_cost": 60, "difficulty": 45, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Heal_Monster", "learn_level": 42, "mana_cost": 65, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 27, + "spell_tag": "Trump_Dragon", "learn_level": 45, "mana_cost": 95, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "Trump_Meteor", "learn_level": 45, "mana_cost": 50, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Trump_Demon", "learn_level": 48, "mana_cost": 125, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 30, + "spell_tag": "Trump_Greater_Undead", "learn_level": 49, "mana_cost": 130, "difficulty": 40, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Trump_Ancient_Dragon", "learn_level": 50, "mana_cost": 135, "difficulty": 40, @@ -9246,224 +9246,224 @@ "name": "ARCANE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Zap", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Wizard_Lock", "learn_level": 1, "mana_cost": 1, "difficulty": 28, "first_cast_exp_rate": 5 }, { - "spell_id": 2, + "spell_tag": "Detect_Invisibility", "learn_level": 2, "mana_cost": 1, "difficulty": 28, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Detect_Monsters", "learn_level": 2, "mana_cost": 2, "difficulty": 28, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Blink", "learn_level": 3, "mana_cost": 3, "difficulty": 28, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Light_Area", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Trap_and_Door_Destruction", "learn_level": 6, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Cure_Light_Wounds", "learn_level": 7, "mana_cost": 6, "difficulty": 39, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 8, "mana_cost": 7, "difficulty": 35, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Phlogiston", "learn_level": 9, "mana_cost": 8, "difficulty": 55, "first_cast_exp_rate": 7 }, { - "spell_id": 10, + "spell_tag": "Detect_Treasure", "learn_level": 10, "mana_cost": 9, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Detect_Enchantment", "learn_level": 11, "mana_cost": 10, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Detect_Objects", "learn_level": 12, "mana_cost": 11, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 13, + "spell_tag": "Cure_Poison", "learn_level": 13, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Resist_Cold", "learn_level": 14, "mana_cost": 13, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Resist_Fire", "learn_level": 15, "mana_cost": 14, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Resist_Lightning", "learn_level": 16, "mana_cost": 15, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Resist_Acid", "learn_level": 17, "mana_cost": 16, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 18, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 18, "mana_cost": 17, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 19, + "spell_tag": "Teleport", "learn_level": 19, "mana_cost": 18, "difficulty": 45, "first_cast_exp_rate": 8 }, { - "spell_id": 20, + "spell_tag": "Identify", "learn_level": 22, "mana_cost": 25, "difficulty": 55, "first_cast_exp_rate": 25 }, { - "spell_id": 21, + "spell_tag": "Stone_to_Mud", "learn_level": 24, "mana_cost": 22, "difficulty": 55, "first_cast_exp_rate": 9 }, { - "spell_id": 22, + "spell_tag": "Ray_of_Light", "learn_level": 27, "mana_cost": 24, "difficulty": 55, "first_cast_exp_rate": 9 }, { - "spell_id": 23, + "spell_tag": "Satisfy_Hunger", "learn_level": 29, "mana_cost": 26, "difficulty": 65, "first_cast_exp_rate": 12 }, { - "spell_id": 24, + "spell_tag": "See_Invisible", "learn_level": 33, "mana_cost": 30, "difficulty": 55, "first_cast_exp_rate": 13 }, { - "spell_id": 25, + "spell_tag": "Conjure_Elemental", "learn_level": 37, "mana_cost": 32, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Teleport_Level", "learn_level": 40, "mana_cost": 36, "difficulty": 75, "first_cast_exp_rate": 25 }, { - "spell_id": 27, + "spell_tag": "Teleport_Away", "learn_level": 42, "mana_cost": 38, "difficulty": 65, "first_cast_exp_rate": 25 }, { - "spell_id": 28, + "spell_tag": "Elemental_Ball", "learn_level": 44, "mana_cost": 39, "difficulty": 61, "first_cast_exp_rate": 30 }, { - "spell_id": 29, + "spell_tag": "Detection", "learn_level": 46, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 30, + "spell_tag": "Word_of_Recall", "learn_level": 47, "mana_cost": 55, "difficulty": 65, "first_cast_exp_rate": 50 }, { - "spell_id": 31, + "spell_tag": "Clairvoyance", "learn_level": 50, "mana_cost": 120, "difficulty": 75, @@ -9475,224 +9475,224 @@ "name": "CRAFT", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Infravision", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Regeneration", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Satisfy_Hunger", "learn_level": 5, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Resist_Cold", "learn_level": 7, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Resist_Fire", "learn_level": 8, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Heroism", "learn_level": 10, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Resist_Lightning", "learn_level": 12, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Resist_Acid", "learn_level": 13, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "See_Invisibility", "learn_level": 15, "mana_cost": 17, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Remove_Curse", "learn_level": 20, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Resist_Poison", "learn_level": 22, "mana_cost": 22, "difficulty": 65, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Berserk", "learn_level": 25, "mana_cost": 24, "difficulty": 80, "first_cast_exp_rate": 80 }, { - "spell_id": 12, + "spell_tag": "Self_Knowledge", "learn_level": 26, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 31, "mana_cost": 30, "difficulty": 65, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Cure", "learn_level": 34, "mana_cost": 33, "difficulty": 70, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Mana_Branding", "learn_level": 44, "mana_cost": 80, "difficulty": 90, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Telepathy", "learn_level": 16, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 18, "mana_cost": 13, "difficulty": 75, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance", "learn_level": 24, "mana_cost": 25, "difficulty": 90, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Haste_Self", "learn_level": 28, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 20, + "spell_tag": "Walk_through_Wall", "learn_level": 35, "mana_cost": 65, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Polish_Shield", "learn_level": 38, "mana_cost": 85, "difficulty": 90, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Create_Golem", "learn_level": 45, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Magical_armor", "learn_level": 48, "mana_cost": 65, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Remove_Enchantment", "learn_level": 17, "mana_cost": 17, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Remove_All_Curse", "learn_level": 33, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 26, + "spell_tag": "Knowledge_True", "learn_level": 40, "mana_cost": 55, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 27, + "spell_tag": "Enchant_Weapon", "learn_level": 40, "mana_cost": 85, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Enchant_Armor", "learn_level": 43, "mana_cost": 100, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Brand_Weapon", "learn_level": 45, "mana_cost": 110, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 30, + "spell_tag": "Living_Trump", "learn_level": 47, "mana_cost": 120, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Immunity", "learn_level": 50, "mana_cost": 75, "difficulty": 80, @@ -9704,224 +9704,224 @@ "name": "DEMON", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 2, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Unlife", "learn_level": 3, "mana_cost": 2, "difficulty": 22, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Evil_Bless", "learn_level": 5, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Resist_Fire", "learn_level": 7, "mana_cost": 8, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 4, + "spell_tag": "Fire_Bolt", "learn_level": 13, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 5, + "spell_tag": "Summon_Manes", "learn_level": 15, "mana_cost": 13, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Nether_Ball", "learn_level": 16, "mana_cost": 16, "difficulty": 45, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Raise_the_Morale", "learn_level": 17, "mana_cost": 10, "difficulty": 66, "first_cast_exp_rate": 1 }, { - "spell_id": 8, + "spell_tag": "Vision", "learn_level": 24, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 20 }, { - "spell_id": 9, + "spell_tag": "Resist_Nether", "learn_level": 26, "mana_cost": 25, "difficulty": 50, "first_cast_exp_rate": 11 }, { - "spell_id": 10, + "spell_tag": "Plasma_bolt", "learn_level": 29, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 11, + "spell_tag": "Fire_Ball", "learn_level": 33, "mana_cost": 33, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Fire_Branding", "learn_level": 35, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 8 }, { - "spell_id": 13, + "spell_tag": "Demonfire", "learn_level": 41, "mana_cost": 36, "difficulty": 85, "first_cast_exp_rate": 15 }, { - "spell_id": 14, + "spell_tag": "Summon_Demon", "learn_level": 44, "mana_cost": 90, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 15, + "spell_tag": "Nether_Wave", "learn_level": 44, "mana_cost": 19, "difficulty": 70, "first_cast_exp_rate": 35 }, { - "spell_id": 16, + "spell_tag": "Devilish_Eye", "learn_level": 16, "mana_cost": 16, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Devil_Cloak", "learn_level": 19, "mana_cost": 22, "difficulty": 60, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Lava_Flow", "learn_level": 37, "mana_cost": 50, "difficulty": 60, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Plasma_Ball", "learn_level": 38, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 20, + "spell_tag": "Polymorph_Demon", "learn_level": 39, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 21, + "spell_tag": "Fireblast", "learn_level": 42, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 35 }, { - "spell_id": 22, + "spell_tag": "Succubuss_Kiss", "learn_level": 46, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Doom_Hand", "learn_level": 50, "mana_cost": 108, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Immortal_Body", "learn_level": 32, "mana_cost": 32, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 25, + "spell_tag": "Insanity_Circle", "learn_level": 41, "mana_cost": 48, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 26, + "spell_tag": "Explode_Pets", "learn_level": 46, "mana_cost": 62, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Summon_Greater_Demon", "learn_level": 48, "mana_cost": 111, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 28, + "spell_tag": "Fire_Storm", "learn_level": 48, "mana_cost": 60, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Nether_Storm", "learn_level": 49, "mana_cost": 60, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Bloody_Curse", "learn_level": 50, "mana_cost": 105, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Polymorph_Demonlord", "learn_level": 50, "mana_cost": 80, "difficulty": 85, @@ -9933,224 +9933,224 @@ "name": "CRUSADE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Punishment", "learn_level": 2, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Evil", "learn_level": 4, "mana_cost": 2, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Remove_Fear", "learn_level": 6, "mana_cost": 6, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Scare_Monster", "learn_level": 9, "mana_cost": 9, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Sanctuary", "learn_level": 12, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Portal", "learn_level": 14, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Star_Dust", "learn_level": 15, "mana_cost": 14, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Purify", "learn_level": 17, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Scatter_Evil", "learn_level": 20, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Holy_Orb", "learn_level": 24, "mana_cost": 22, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Exorcism", "learn_level": 27, "mana_cost": 26, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Remove_Curse", "learn_level": 29, "mana_cost": 28, "difficulty": 80, "first_cast_exp_rate": 5 }, { - "spell_id": 12, + "spell_tag": "Sense_Unseen", "learn_level": 31, "mana_cost": 30, "difficulty": 65, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 35, "mana_cost": 28, "difficulty": 65, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Judgment_Thunder", "learn_level": 42, "mana_cost": 38, "difficulty": 85, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Holy_Word", "learn_level": 45, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Unbarring_Ways", "learn_level": 7, "mana_cost": 6, "difficulty": 33, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Arrest", "learn_level": 23, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 50 }, { - "spell_id": 18, + "spell_tag": "Holy_Aura", "learn_level": 26, "mana_cost": 22, "difficulty": 65, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Dispel_Undead_and_Demons", "learn_level": 30, "mana_cost": 30, "difficulty": 65, "first_cast_exp_rate": 70 }, { - "spell_id": 20, + "spell_tag": "Dispel_Evil", "learn_level": 37, "mana_cost": 37, "difficulty": 65, "first_cast_exp_rate": 100 }, { - "spell_id": 21, + "spell_tag": "Holy_Blade", "learn_level": 39, "mana_cost": 80, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Star_Burst", "learn_level": 45, "mana_cost": 55, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 23, + "spell_tag": "Summon_Angel", "learn_level": 48, "mana_cost": 111, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 24, + "spell_tag": "Heroism", "learn_level": 10, "mana_cost": 10, "difficulty": 66, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Dispel_Curse", "learn_level": 36, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 26, + "spell_tag": "Banish_Evil", "learn_level": 39, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Armageddon", "learn_level": 42, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 75 }, { - "spell_id": 28, + "spell_tag": "An_Eye_for_an_Eye", "learn_level": 44, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 75 }, { - "spell_id": 29, + "spell_tag": "Wrath_of_the_God", "learn_level": 48, "mana_cost": 80, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Divine_Intervention", "learn_level": 49, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 31, + "spell_tag": "Crusade", "learn_level": 50, "mana_cost": 100, "difficulty": 80, @@ -10174,224 +10174,224 @@ "name": "CHAOS", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 2, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Trap_Door_Destruction", "learn_level": 3, "mana_cost": 2, "difficulty": 22, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Flash_of_Light", "learn_level": 4, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Touch_of_Confusion", "learn_level": 5, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 4, + "spell_tag": "Mana_Burst", "learn_level": 7, "mana_cost": 7, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Fire_Bolt", "learn_level": 8, "mana_cost": 7, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Fist_of_Force", "learn_level": 15, "mana_cost": 9, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Teleport_Self", "learn_level": 16, "mana_cost": 10, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Wonder", "learn_level": 19, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Chaos_Bolt", "learn_level": 22, "mana_cost": 14, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Sonic_Boom", "learn_level": 25, "mana_cost": 17, "difficulty": 50, "first_cast_exp_rate": 20 }, { - "spell_id": 11, + "spell_tag": "Doom_Bolt", "learn_level": 28, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 11 }, { - "spell_id": 12, + "spell_tag": "Fire_Ball", "learn_level": 30, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 13, + "spell_tag": "Teleport_Other", "learn_level": 33, "mana_cost": 24, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Word_of_Destruction", "learn_level": 36, "mana_cost": 26, "difficulty": 80, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Invoke_Logrus", "learn_level": 40, "mana_cost": 45, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 16, + "spell_tag": "Polymorph_Other", "learn_level": 11, "mana_cost": 11, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Chain_Lightning", "learn_level": 14, "mana_cost": 14, "difficulty": 60, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Arcane_Binding", "learn_level": 16, "mana_cost": 15, "difficulty": 80, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Disintegrate", "learn_level": 23, "mana_cost": 23, "difficulty": 60, "first_cast_exp_rate": 35 }, { - "spell_id": 20, + "spell_tag": "Alter_Reality", "learn_level": 30, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 21, + "spell_tag": "Magic_Rocket", "learn_level": 40, "mana_cost": 41, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Chaos_Branding", "learn_level": 45, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Summon_Demon", "learn_level": 47, "mana_cost": 100, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Beam_of_Gravity", "learn_level": 23, "mana_cost": 23, "difficulty": 66, "first_cast_exp_rate": 10 }, { - "spell_id": 25, + "spell_tag": "Meteor_Swarm", "learn_level": 35, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 26, + "spell_tag": "Flame_Strike", "learn_level": 37, "mana_cost": 37, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 27, + "spell_tag": "Call_Chaos", "learn_level": 39, "mana_cost": 40, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Polymorph_Self", "learn_level": 42, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 29, + "spell_tag": "Mana_Storm", "learn_level": 45, "mana_cost": 58, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Breathe_Logrus", "learn_level": 48, "mana_cost": 100, "difficulty": 80, "first_cast_exp_rate": 220 }, { - "spell_id": 31, + "spell_tag": "Call_the_Void", "learn_level": 49, "mana_cost": 100, "difficulty": 85, @@ -10403,224 +10403,224 @@ "name": "DEMON", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 2, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Unlife", "learn_level": 3, "mana_cost": 2, "difficulty": 22, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Evil_Bless", "learn_level": 5, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Resist_Fire", "learn_level": 6, "mana_cost": 6, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 4, + "spell_tag": "Fire_Bolt", "learn_level": 10, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 5, + "spell_tag": "Summon_Manes", "learn_level": 12, "mana_cost": 10, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Nether_Ball", "learn_level": 13, "mana_cost": 13, "difficulty": 45, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Raise_the_Morale", "learn_level": 14, "mana_cost": 11, "difficulty": 66, "first_cast_exp_rate": 1 }, { - "spell_id": 8, + "spell_tag": "Vision", "learn_level": 23, "mana_cost": 22, "difficulty": 50, "first_cast_exp_rate": 20 }, { - "spell_id": 9, + "spell_tag": "Resist_Nether", "learn_level": 24, "mana_cost": 24, "difficulty": 50, "first_cast_exp_rate": 11 }, { - "spell_id": 10, + "spell_tag": "Plasma_bolt", "learn_level": 28, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 11, + "spell_tag": "Fire_Ball", "learn_level": 30, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Fire_Branding", "learn_level": 33, "mana_cost": 75, "difficulty": 90, "first_cast_exp_rate": 8 }, { - "spell_id": 13, + "spell_tag": "Demonfire", "learn_level": 38, "mana_cost": 33, "difficulty": 85, "first_cast_exp_rate": 15 }, { - "spell_id": 14, + "spell_tag": "Summon_Demon", "learn_level": 39, "mana_cost": 85, "difficulty": 90, "first_cast_exp_rate": 40 }, { - "spell_id": 15, + "spell_tag": "Nether_Wave", "learn_level": 39, "mana_cost": 20, "difficulty": 65, "first_cast_exp_rate": 40 }, { - "spell_id": 16, + "spell_tag": "Devilish_Eye", "learn_level": 15, "mana_cost": 15, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Devil_Cloak", "learn_level": 18, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Lava_Flow", "learn_level": 27, "mana_cost": 27, "difficulty": 80, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Plasma_Ball", "learn_level": 35, "mana_cost": 32, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 20, + "spell_tag": "Polymorph_Demon", "learn_level": 36, "mana_cost": 45, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 21, + "spell_tag": "Fireblast", "learn_level": 37, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 40 }, { - "spell_id": 22, + "spell_tag": "Succubuss_Kiss", "learn_level": 40, "mana_cost": 43, "difficulty": 60, "first_cast_exp_rate": 35 }, { - "spell_id": 23, + "spell_tag": "Doom_Hand", "learn_level": 46, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Immortal_Body", "learn_level": 29, "mana_cost": 28, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 25, + "spell_tag": "Insanity_Circle", "learn_level": 36, "mana_cost": 37, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 26, + "spell_tag": "Explode_Pets", "learn_level": 41, "mana_cost": 55, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Summon_Greater_Demon", "learn_level": 43, "mana_cost": 100, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 28, + "spell_tag": "Fire_Storm", "learn_level": 44, "mana_cost": 58, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Nether_Storm", "learn_level": 45, "mana_cost": 58, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Bloody_Curse", "learn_level": 48, "mana_cost": 105, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Polymorph_Demonlord", "learn_level": 49, "mana_cost": 80, "difficulty": 85, @@ -10644,224 +10644,224 @@ "name": "LIFE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Cure_Light_Wounds", "learn_level": 1, "mana_cost": 1, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Bless", "learn_level": 2, "mana_cost": 2, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Cause_Light_Wounds", "learn_level": 3, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Call_Light", "learn_level": 4, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Detect_Doors_And_Traps", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 8, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Cure_Poison", "learn_level": 11, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Satisfy_Hunger", "learn_level": 13, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Remove_Curse", "learn_level": 15, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Cause_Medium_Wounds", "learn_level": 16, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cure_Critical_Wounds", "learn_level": 17, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Resist_Heat_and_Cold", "learn_level": 18, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Surroundings", "learn_level": 19, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Turn_Undead", "learn_level": 20, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Healing", "learn_level": 30, "mana_cost": 25, "difficulty": 55, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Rune_of_Protection", "learn_level": 35, "mana_cost": 70, "difficulty": 75, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Dispel_Curse", "learn_level": 26, "mana_cost": 26, "difficulty": 50, "first_cast_exp_rate": 75 }, { - "spell_id": 17, + "spell_tag": "Perception", "learn_level": 28, "mana_cost": 28, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 18, + "spell_tag": "Dispel_Undead", "learn_level": 32, "mana_cost": 32, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 19, + "spell_tag": "Day_of_the_Dove", "learn_level": 36, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 20, + "spell_tag": "Cause_Critical_Wounds", "learn_level": 38, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 75 }, { - "spell_id": 21, + "spell_tag": "Word_of_Recall", "learn_level": 40, "mana_cost": 60, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 22, + "spell_tag": "Alter_Reality", "learn_level": 45, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 23, + "spell_tag": "Warding_True", "learn_level": 48, "mana_cost": 64, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 24, + "spell_tag": "Sterilization", "learn_level": 10, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Detection", "learn_level": 25, "mana_cost": 25, "difficulty": 50, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Annihilate_Undead", "learn_level": 40, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 44, "mana_cost": 84, "difficulty": 80, "first_cast_exp_rate": 225 }, { - "spell_id": 28, + "spell_tag": "Restoration", "learn_level": 46, "mana_cost": 64, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 29, + "spell_tag": "Healing_True", "learn_level": 48, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Holy_Vision", "learn_level": 49, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Ultimate_Resistance", "learn_level": 50, "mana_cost": 100, "difficulty": 80, @@ -10873,224 +10873,224 @@ "name": "NATURE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Creatures", "learn_level": 1, "mana_cost": 1, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 1, + "spell_tag": "Lightning", "learn_level": 3, "mana_cost": 3, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 4, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Produce_Food", "learn_level": 7, "mana_cost": 7, "difficulty": 55, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Daylight", "learn_level": 7, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 5, + "spell_tag": "Animal_Taming", "learn_level": 7, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 6, + "spell_tag": "Resist_Environment", "learn_level": 8, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Cure_Wounds_And_Poison", "learn_level": 9, "mana_cost": 9, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Stone_to_Mud", "learn_level": 10, "mana_cost": 8, "difficulty": 80, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Frost_Bolt", "learn_level": 11, "mana_cost": 9, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 10, + "spell_tag": "Nature_Awareness", "learn_level": 12, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Fire_Bolt", "learn_level": 14, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Ray_of_Sunlight", "learn_level": 16, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Entangle", "learn_level": 18, "mana_cost": 22, "difficulty": 65, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Summon_Animal", "learn_level": 31, "mana_cost": 31, "difficulty": 75, "first_cast_exp_rate": 10 }, { - "spell_id": 15, + "spell_tag": "Herbal_Healing", "learn_level": 40, "mana_cost": 60, "difficulty": 90, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Stair_Building", "learn_level": 14, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 25 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 16, "mana_cost": 16, "difficulty": 70, "first_cast_exp_rate": 60 }, { - "spell_id": 18, + "spell_tag": "Resistance_True", "learn_level": 22, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Forest_Creation", "learn_level": 27, "mana_cost": 33, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Animal_Friendship", "learn_level": 35, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 80 }, { - "spell_id": 21, + "spell_tag": "Stone_Tell", "learn_level": 40, "mana_cost": 40, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 22, + "spell_tag": "Wall_of_Stone", "learn_level": 45, "mana_cost": 55, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Protect_from_Corrosion", "learn_level": 50, "mana_cost": 80, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Earthquake", "learn_level": 28, "mana_cost": 28, "difficulty": 60, "first_cast_exp_rate": 150 }, { - "spell_id": 25, + "spell_tag": "Whirlwind", "learn_level": 30, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 160 }, { - "spell_id": 26, + "spell_tag": "Blizzard", "learn_level": 31, "mana_cost": 31, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 27, + "spell_tag": "Lightning_Storm", "learn_level": 33, "mana_cost": 33, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 28, + "spell_tag": "Whirlpool", "learn_level": 38, "mana_cost": 38, "difficulty": 75, "first_cast_exp_rate": 45 }, { - "spell_id": 29, + "spell_tag": "Call_Sunlight", "learn_level": 42, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Elemental_Branding", "learn_level": 45, "mana_cost": 85, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Natures_Wrath", "learn_level": 48, "mana_cost": 85, "difficulty": 75, @@ -11102,224 +11102,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 5, "mana_cost": 5, "difficulty": 27, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 7, "mana_cost": 7, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 11, "mana_cost": 11, "difficulty": 75, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 12, "mana_cost": 12, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 14, "mana_cost": 14, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 16, "mana_cost": 16, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 19, "mana_cost": 19, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 22, "mana_cost": 22, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 28, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 30 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 33, "mana_cost": 80, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 37, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 16 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 45, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 47, "mana_cost": 45, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 15, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 180 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 16, "mana_cost": 16, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 18, "mana_cost": 18, "difficulty": 30, "first_cast_exp_rate": 15 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 35, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 42, "mana_cost": 95, "difficulty": 70, "first_cast_exp_rate": 90 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 44, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 125 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 45, "mana_cost": 44, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 48, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 30, "mana_cost": 30, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 37, "mana_cost": 85, "difficulty": 85, "first_cast_exp_rate": 220 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 38, "mana_cost": 50, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 42, "mana_cost": 60, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 48, "mana_cost": 60, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 49, "mana_cost": 80, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 50, "mana_cost": 110, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 50, "mana_cost": 115, "difficulty": 95, @@ -11331,224 +11331,224 @@ "name": "CRAFT", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Infravision", "learn_level": 2, "mana_cost": 2, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Regeneration", "learn_level": 3, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Satisfy_Hunger", "learn_level": 5, "mana_cost": 5, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Resist_Cold", "learn_level": 7, "mana_cost": 10, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Resist_Fire", "learn_level": 9, "mana_cost": 10, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Heroism", "learn_level": 11, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Resist_Lightning", "learn_level": 13, "mana_cost": 10, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Resist_Acid", "learn_level": 14, "mana_cost": 10, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "See_Invisibility", "learn_level": 17, "mana_cost": 18, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Remove_Curse", "learn_level": 21, "mana_cost": 21, "difficulty": 60, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Resist_Poison", "learn_level": 23, "mana_cost": 23, "difficulty": 65, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Berserk", "learn_level": 26, "mana_cost": 25, "difficulty": 80, "first_cast_exp_rate": 80 }, { - "spell_id": 12, + "spell_tag": "Self_Knowledge", "learn_level": 28, "mana_cost": 26, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 32, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Cure", "learn_level": 37, "mana_cost": 28, "difficulty": 55, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Mana_Branding", "learn_level": 45, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Telepathy", "learn_level": 18, "mana_cost": 18, "difficulty": 55, "first_cast_exp_rate": 12 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 20, "mana_cost": 17, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance", "learn_level": 26, "mana_cost": 28, "difficulty": 85, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Haste_Self", "learn_level": 30, "mana_cost": 23, "difficulty": 70, "first_cast_exp_rate": 10 }, { - "spell_id": 20, + "spell_tag": "Walk_through_Wall", "learn_level": 37, "mana_cost": 60, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Polish_Shield", "learn_level": 40, "mana_cost": 85, "difficulty": 90, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Create_Golem", "learn_level": 46, "mana_cost": 100, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Magical_armor", "learn_level": 49, "mana_cost": 70, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Remove_Enchantment", "learn_level": 20, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Remove_All_Curse", "learn_level": 36, "mana_cost": 34, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 26, + "spell_tag": "Knowledge_True", "learn_level": 41, "mana_cost": 55, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 27, + "spell_tag": "Enchant_Weapon", "learn_level": 45, "mana_cost": 80, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Enchant_Armor", "learn_level": 46, "mana_cost": 100, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Brand_Weapon", "learn_level": 48, "mana_cost": 120, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 30, + "spell_tag": "Living_Trump", "learn_level": 47, "mana_cost": 120, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Immunity", "learn_level": 50, "mana_cost": 100, "difficulty": 90, @@ -11583,224 +11583,224 @@ "name": "LIFE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Cure_Light_Wounds", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Bless", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Cause_Light_Wounds", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Call_Light", "learn_level": 4, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Detect_Doors_And_Traps", "learn_level": 5, "mana_cost": 5, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 6, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Cure_Poison", "learn_level": 9, "mana_cost": 9, "difficulty": 30, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Satisfy_Hunger", "learn_level": 12, "mana_cost": 10, "difficulty": 35, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Remove_Curse", "learn_level": 14, "mana_cost": 12, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Cause_Medium_Wounds", "learn_level": 15, "mana_cost": 14, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cure_Critical_Wounds", "learn_level": 15, "mana_cost": 15, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Resist_Heat_and_Cold", "learn_level": 17, "mana_cost": 15, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Surroundings", "learn_level": 19, "mana_cost": 17, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Turn_Undead", "learn_level": 21, "mana_cost": 19, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Healing", "learn_level": 25, "mana_cost": 25, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Rune_of_Protection", "learn_level": 30, "mana_cost": 50, "difficulty": 55, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Dispel_Curse", "learn_level": 20, "mana_cost": 20, "difficulty": 40, "first_cast_exp_rate": 75 }, { - "spell_id": 17, + "spell_tag": "Perception", "learn_level": 24, "mana_cost": 24, "difficulty": 60, "first_cast_exp_rate": 150 }, { - "spell_id": 18, + "spell_tag": "Dispel_Undead", "learn_level": 30, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 75 }, { - "spell_id": 19, + "spell_tag": "Day_of_the_Dove", "learn_level": 31, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 75 }, { - "spell_id": 20, + "spell_tag": "Cause_Critical_Wounds", "learn_level": 32, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 21, + "spell_tag": "Word_of_Recall", "learn_level": 33, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 115 }, { - "spell_id": 22, + "spell_tag": "Alter_Reality", "learn_level": 35, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 125 }, { - "spell_id": 23, + "spell_tag": "Warding_True", "learn_level": 40, "mana_cost": 70, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 24, + "spell_tag": "Sterilization", "learn_level": 5, "mana_cost": 9, "difficulty": 40, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Detection", "learn_level": 20, "mana_cost": 20, "difficulty": 40, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Annihilate_Undead", "learn_level": 30, "mana_cost": 50, "difficulty": 60, "first_cast_exp_rate": 115 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 40, "mana_cost": 80, "difficulty": 60, "first_cast_exp_rate": 225 }, { - "spell_id": 28, + "spell_tag": "Restoration", "learn_level": 42, "mana_cost": 75, "difficulty": 60, "first_cast_exp_rate": 115 }, { - "spell_id": 29, + "spell_tag": "Healing_True", "learn_level": 45, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Holy_Vision", "learn_level": 47, "mana_cost": 90, "difficulty": 70, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Ultimate_Resistance", "learn_level": 49, "mana_cost": 90, "difficulty": 70, @@ -11812,224 +11812,224 @@ "name": "SORCERY", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Monsters", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Phase_Door", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 2, "mana_cost": 2, "difficulty": 15, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Light_Area", "learn_level": 2, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Confuse_Monster", "learn_level": 3, "mana_cost": 3, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Teleport", "learn_level": 4, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Sleep_Monster", "learn_level": 5, "mana_cost": 4, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Recharging", "learn_level": 5, "mana_cost": 5, "difficulty": 65, "first_cast_exp_rate": 9 }, { - "spell_id": 8, + "spell_tag": "Magic_Mapping", "learn_level": 7, "mana_cost": 5, "difficulty": 65, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Identify", "learn_level": 7, "mana_cost": 5, "difficulty": 65, "first_cast_exp_rate": 8 }, { - "spell_id": 10, + "spell_tag": "Slow_Monster", "learn_level": 9, "mana_cost": 5, "difficulty": 65, "first_cast_exp_rate": 7 }, { - "spell_id": 11, + "spell_tag": "Mass_Sleep", "learn_level": 9, "mana_cost": 5, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Teleport_Away", "learn_level": 13, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 8 }, { - "spell_id": 13, + "spell_tag": "Haste_Self", "learn_level": 17, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Detection_True", "learn_level": 24, "mana_cost": 15, "difficulty": 60, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Identify_True", "learn_level": 28, "mana_cost": 20, "difficulty": 65, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Detect_items_and_Treasure", "learn_level": 2, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 15 }, { - "spell_id": 17, + "spell_tag": "Charm_Monster", "learn_level": 8, "mana_cost": 8, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 18, + "spell_tag": "Sense_Minds", "learn_level": 12, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 25 }, { - "spell_id": 19, + "spell_tag": "Teleport_to_town", "learn_level": 15, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Self_Knowledge", "learn_level": 15, "mana_cost": 12, "difficulty": 65, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Teleport_Level", "learn_level": 17, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 25 }, { - "spell_id": 22, + "spell_tag": "Word_of_Recall", "learn_level": 20, "mana_cost": 20, "difficulty": 65, "first_cast_exp_rate": 19 }, { - "spell_id": 23, + "spell_tag": "Dimension_Door", "learn_level": 36, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 24, + "spell_tag": "Probing", "learn_level": 8, "mana_cost": 8, "difficulty": 30, "first_cast_exp_rate": 20 }, { - "spell_id": 25, + "spell_tag": "Explosive_Rune", "learn_level": 18, "mana_cost": 20, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Telekinesis", "learn_level": 20, "mana_cost": 20, "difficulty": 65, "first_cast_exp_rate": 70 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 25, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 28, + "spell_tag": "Charm_monsters", "learn_level": 33, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Alchemy", "learn_level": 40, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 175 }, { - "spell_id": 30, + "spell_tag": "Banishment", "learn_level": 41, "mana_cost": 43, "difficulty": 50, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Globe_of_Invulnerability", "learn_level": 42, "mana_cost": 65, "difficulty": 75, @@ -12041,224 +12041,224 @@ "name": "NATURE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Creatures", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Lightning", "learn_level": 2, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 3 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 2, "mana_cost": 2, "difficulty": 15, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Produce_Food", "learn_level": 3, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Daylight", "learn_level": 3, "mana_cost": 3, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Animal_Taming", "learn_level": 4, "mana_cost": 3, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Resist_Environment", "learn_level": 4, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Cure_Wounds_And_Poison", "learn_level": 5, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Stone_to_Mud", "learn_level": 5, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 9, + "spell_tag": "Frost_Bolt", "learn_level": 5, "mana_cost": 4, "difficulty": 20, "first_cast_exp_rate": 6 }, { - "spell_id": 10, + "spell_tag": "Nature_Awareness", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Fire_Bolt", "learn_level": 5, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Ray_of_Sunlight", "learn_level": 7, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 13, + "spell_tag": "Entangle", "learn_level": 14, "mana_cost": 10, "difficulty": 35, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Summon_Animal", "learn_level": 20, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 15, + "spell_tag": "Herbal_Healing", "learn_level": 35, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Stair_Building", "learn_level": 7, "mana_cost": 7, "difficulty": 20, "first_cast_exp_rate": 44 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 8, "mana_cost": 8, "difficulty": 65, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance_True", "learn_level": 12, "mana_cost": 15, "difficulty": 75, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Forest_Creation", "learn_level": 17, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Animal_Friendship", "learn_level": 25, "mana_cost": 25, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 21, + "spell_tag": "Stone_Tell", "learn_level": 33, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 22, + "spell_tag": "Wall_of_Stone", "learn_level": 35, "mana_cost": 40, "difficulty": 65, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Protect_from_Corrosion", "learn_level": 37, "mana_cost": 65, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Earthquake", "learn_level": 15, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 25 }, { - "spell_id": 25, + "spell_tag": "Whirlwind", "learn_level": 20, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Blizzard", "learn_level": 22, "mana_cost": 22, "difficulty": 65, "first_cast_exp_rate": 29 }, { - "spell_id": 27, + "spell_tag": "Lightning_Storm", "learn_level": 28, "mana_cost": 25, "difficulty": 65, "first_cast_exp_rate": 35 }, { - "spell_id": 28, + "spell_tag": "Whirlpool", "learn_level": 32, "mana_cost": 28, "difficulty": 75, "first_cast_exp_rate": 65 }, { - "spell_id": 29, + "spell_tag": "Call_Sunlight", "learn_level": 34, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Elemental_Branding", "learn_level": 36, "mana_cost": 80, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Natures_Wrath", "learn_level": 39, "mana_cost": 65, "difficulty": 55, @@ -12270,224 +12270,224 @@ "name": "CHAOS", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Trap_Door_Destruction", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Flash_of_Light", "learn_level": 2, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Touch_of_Confusion", "learn_level": 4, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Mana_Burst", "learn_level": 6, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Fire_Bolt", "learn_level": 10, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Fist_of_Force", "learn_level": 12, "mana_cost": 6, "difficulty": 35, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Teleport_Self", "learn_level": 14, "mana_cost": 7, "difficulty": 25, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Wonder", "learn_level": 15, "mana_cost": 9, "difficulty": 20, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Chaos_Bolt", "learn_level": 17, "mana_cost": 10, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Sonic_Boom", "learn_level": 19, "mana_cost": 11, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Doom_Bolt", "learn_level": 21, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 11 }, { - "spell_id": 12, + "spell_tag": "Fire_Ball", "learn_level": 22, "mana_cost": 13, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 13, + "spell_tag": "Teleport_Other", "learn_level": 23, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Word_of_Destruction", "learn_level": 27, "mana_cost": 17, "difficulty": 70, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Invoke_Logrus", "learn_level": 30, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 16, + "spell_tag": "Polymorph_Other", "learn_level": 9, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Chain_Lightning", "learn_level": 12, "mana_cost": 12, "difficulty": 70, "first_cast_exp_rate": 35 }, { - "spell_id": 18, + "spell_tag": "Arcane_Binding", "learn_level": 14, "mana_cost": 12, "difficulty": 70, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Disintegrate", "learn_level": 21, "mana_cost": 21, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 20, + "spell_tag": "Alter_Reality", "learn_level": 26, "mana_cost": 22, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 21, + "spell_tag": "Magic_Rocket", "learn_level": 36, "mana_cost": 36, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Chaos_Branding", "learn_level": 42, "mana_cost": 80, "difficulty": 70, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Summon_Demon", "learn_level": 44, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Beam_of_Gravity", "learn_level": 16, "mana_cost": 16, "difficulty": 55, "first_cast_exp_rate": 8 }, { - "spell_id": 25, + "spell_tag": "Meteor_Swarm", "learn_level": 32, "mana_cost": 30, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 26, + "spell_tag": "Flame_Strike", "learn_level": 34, "mana_cost": 32, "difficulty": 65, "first_cast_exp_rate": 40 }, { - "spell_id": 27, + "spell_tag": "Call_Chaos", "learn_level": 35, "mana_cost": 34, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Polymorph_Self", "learn_level": 39, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 250 }, { - "spell_id": 29, + "spell_tag": "Mana_Storm", "learn_level": 40, "mana_cost": 53, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Breathe_Logrus", "learn_level": 43, "mana_cost": 60, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Call_the_Void", "learn_level": 46, "mana_cost": 90, "difficulty": 75, @@ -12499,224 +12499,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 2, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 2, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 3 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 3, "mana_cost": 3, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 5, "mana_cost": 9, "difficulty": 55, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 7, "mana_cost": 7, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 8, "mana_cost": 8, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 10, "mana_cost": 10, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 11, "mana_cost": 10, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 14, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 22, "mana_cost": 20, "difficulty": 75, "first_cast_exp_rate": 30 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 26, "mana_cost": 65, "difficulty": 70, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 30, "mana_cost": 25, "difficulty": 50, "first_cast_exp_rate": 16 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 32, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 70 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 35, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 25 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 8, "mana_cost": 15, "difficulty": 70, "first_cast_exp_rate": 180 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 8, "mana_cost": 10, "difficulty": 70, "first_cast_exp_rate": 30 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 9, "mana_cost": 9, "difficulty": 20, "first_cast_exp_rate": 15 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 25, "mana_cost": 20, "difficulty": 65, "first_cast_exp_rate": 50 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 31, "mana_cost": 80, "difficulty": 60, "first_cast_exp_rate": 90 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 33, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 125 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 34, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 36, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 16, "mana_cost": 16, "difficulty": 65, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 22, "mana_cost": 60, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 26, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 32, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 37, "mana_cost": 40, "difficulty": 65, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 38, "mana_cost": 66, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 42, "mana_cost": 85, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 45, "mana_cost": 75, "difficulty": 80, @@ -12728,224 +12728,224 @@ "name": "TRUMP", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Phase_Door", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Trump_Spiders", "learn_level": 2, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Shuffle", "learn_level": 4, "mana_cost": 4, "difficulty": 32, "first_cast_exp_rate": 8 }, { - "spell_id": 3, + "spell_tag": "Reset_Recall", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 8 }, { - "spell_id": 4, + "spell_tag": "Teleport", "learn_level": 6, "mana_cost": 5, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Trump_Spying", "learn_level": 9, "mana_cost": 10, "difficulty": 25, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Teleport_Away", "learn_level": 12, "mana_cost": 12, "difficulty": 25, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Trump_Animals", "learn_level": 15, "mana_cost": 16, "difficulty": 25, "first_cast_exp_rate": 8 }, { - "spell_id": 8, + "spell_tag": "Trump_Reach", "learn_level": 16, "mana_cost": 16, "difficulty": 35, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Trump_Kamikaze", "learn_level": 20, "mana_cost": 17, "difficulty": 30, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Phantasmal_Servant", "learn_level": 23, "mana_cost": 22, "difficulty": 25, "first_cast_exp_rate": 8 }, { - "spell_id": 11, + "spell_tag": "Haste_Monster", "learn_level": 25, "mana_cost": 26, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Teleport_Level", "learn_level": 28, "mana_cost": 28, "difficulty": 30, "first_cast_exp_rate": 10 }, { - "spell_id": 13, + "spell_tag": "Dimension_Door", "learn_level": 32, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 14, + "spell_tag": "Word_of_Recall", "learn_level": 35, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Banish", "learn_level": 39, "mana_cost": 36, "difficulty": 30, "first_cast_exp_rate": 12 }, { - "spell_id": 16, + "spell_tag": "Swap_Position", "learn_level": 17, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Trump_Undead", "learn_level": 21, "mana_cost": 21, "difficulty": 30, "first_cast_exp_rate": 25 }, { - "spell_id": 18, + "spell_tag": "Trump_Reptile", "learn_level": 23, "mana_cost": 23, "difficulty": 30, "first_cast_exp_rate": 30 }, { - "spell_id": 19, + "spell_tag": "Trump_Monsters", "learn_level": 28, "mana_cost": 24, "difficulty": 30, "first_cast_exp_rate": 9 }, { - "spell_id": 20, + "spell_tag": "Trump_Hounds", "learn_level": 25, "mana_cost": 25, "difficulty": 30, "first_cast_exp_rate": 35 }, { - "spell_id": 21, + "spell_tag": "Trump_Branding", "learn_level": 31, "mana_cost": 65, "difficulty": 35, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Living_Trump", "learn_level": 36, "mana_cost": 90, "difficulty": 40, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Trump_Cyberdemon", "learn_level": 42, "mana_cost": 90, "difficulty": 40, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Trump_Divination", "learn_level": 25, "mana_cost": 25, "difficulty": 25, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Trump_Lore", "learn_level": 32, "mana_cost": 45, "difficulty": 40, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Heal_Monster", "learn_level": 34, "mana_cost": 50, "difficulty": 35, "first_cast_exp_rate": 150 }, { - "spell_id": 27, + "spell_tag": "Trump_Dragon", "learn_level": 36, "mana_cost": 75, "difficulty": 35, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "Trump_Meteor", "learn_level": 37, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Trump_Demon", "learn_level": 42, "mana_cost": 90, "difficulty": 35, "first_cast_exp_rate": 150 }, { - "spell_id": 30, + "spell_tag": "Trump_Greater_Undead", "learn_level": 44, "mana_cost": 90, "difficulty": 35, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Trump_Ancient_Dragon", "learn_level": 46, "mana_cost": 90, "difficulty": 35, @@ -12957,224 +12957,224 @@ "name": "ARCANE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Zap", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Wizard_Lock", "learn_level": 1, "mana_cost": 1, "difficulty": 23, "first_cast_exp_rate": 5 }, { - "spell_id": 2, + "spell_tag": "Detect_Invisibility", "learn_level": 1, "mana_cost": 1, "difficulty": 23, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Detect_Monsters", "learn_level": 1, "mana_cost": 1, "difficulty": 23, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Blink", "learn_level": 2, "mana_cost": 1, "difficulty": 23, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Light_Area", "learn_level": 3, "mana_cost": 2, "difficulty": 33, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Trap_and_Door_Destruction", "learn_level": 4, "mana_cost": 4, "difficulty": 23, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Cure_Light_Wounds", "learn_level": 5, "mana_cost": 4, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 6, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Phlogiston", "learn_level": 7, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 7 }, { - "spell_id": 10, + "spell_tag": "Detect_Treasure", "learn_level": 8, "mana_cost": 7, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Detect_Enchantment", "learn_level": 8, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Detect_Objects", "learn_level": 9, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 13, + "spell_tag": "Cure_Poison", "learn_level": 10, "mana_cost": 9, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Resist_Cold", "learn_level": 10, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Resist_Fire", "learn_level": 11, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Resist_Lightning", "learn_level": 12, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Resist_Acid", "learn_level": 13, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 18, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 14, "mana_cost": 11, "difficulty": 22, "first_cast_exp_rate": 6 }, { - "spell_id": 19, + "spell_tag": "Teleport", "learn_level": 15, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 20, + "spell_tag": "Identify", "learn_level": 17, "mana_cost": 17, "difficulty": 50, "first_cast_exp_rate": 25 }, { - "spell_id": 21, + "spell_tag": "Stone_to_Mud", "learn_level": 19, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 9 }, { - "spell_id": 22, + "spell_tag": "Ray_of_Light", "learn_level": 20, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 9 }, { - "spell_id": 23, + "spell_tag": "Satisfy_Hunger", "learn_level": 22, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 12 }, { - "spell_id": 24, + "spell_tag": "See_Invisible", "learn_level": 24, "mana_cost": 22, "difficulty": 50, "first_cast_exp_rate": 13 }, { - "spell_id": 25, + "spell_tag": "Conjure_Elemental", "learn_level": 26, "mana_cost": 26, "difficulty": 60, "first_cast_exp_rate": 30 }, { - "spell_id": 26, + "spell_tag": "Teleport_Level", "learn_level": 30, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 27, + "spell_tag": "Teleport_Away", "learn_level": 35, "mana_cost": 28, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 28, + "spell_tag": "Elemental_Ball", "learn_level": 40, "mana_cost": 28, "difficulty": 55, "first_cast_exp_rate": 30 }, { - "spell_id": 29, + "spell_tag": "Detection", "learn_level": 41, "mana_cost": 28, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 30, + "spell_tag": "Word_of_Recall", "learn_level": 43, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 50 }, { - "spell_id": 31, + "spell_tag": "Clairvoyance", "learn_level": 46, "mana_cost": 80, "difficulty": 70, @@ -13186,224 +13186,224 @@ "name": "CRAFT", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Infravision", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Regeneration", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Satisfy_Hunger", "learn_level": 3, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Resist_Cold", "learn_level": 4, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Resist_Fire", "learn_level": 5, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Heroism", "learn_level": 6, "mana_cost": 5, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Resist_Lightning", "learn_level": 7, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Resist_Acid", "learn_level": 8, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "See_Invisibility", "learn_level": 10, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Remove_Curse", "learn_level": 13, "mana_cost": 12, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Resist_Poison", "learn_level": 14, "mana_cost": 13, "difficulty": 55, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Berserk", "learn_level": 16, "mana_cost": 15, "difficulty": 70, "first_cast_exp_rate": 80 }, { - "spell_id": 12, + "spell_tag": "Self_Knowledge", "learn_level": 20, "mana_cost": 12, "difficulty": 65, "first_cast_exp_rate": 50 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 21, "mana_cost": 19, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Cure", "learn_level": 25, "mana_cost": 25, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Mana_Branding", "learn_level": 35, "mana_cost": 60, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Telepathy", "learn_level": 9, "mana_cost": 10, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 11, "mana_cost": 8, "difficulty": 65, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance", "learn_level": 16, "mana_cost": 15, "difficulty": 75, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Haste_Self", "learn_level": 20, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 20, + "spell_tag": "Walk_through_Wall", "learn_level": 27, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Polish_Shield", "learn_level": 31, "mana_cost": 60, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Create_Golem", "learn_level": 38, "mana_cost": 70, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Magical_armor", "learn_level": 42, "mana_cost": 50, "difficulty": 60, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Remove_Enchantment", "learn_level": 10, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Remove_All_Curse", "learn_level": 27, "mana_cost": 24, "difficulty": 60, "first_cast_exp_rate": 150 }, { - "spell_id": 26, + "spell_tag": "Knowledge_True", "learn_level": 33, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 27, + "spell_tag": "Enchant_Weapon", "learn_level": 30, "mana_cost": 65, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Enchant_Armor", "learn_level": 34, "mana_cost": 80, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Brand_Weapon", "learn_level": 37, "mana_cost": 80, "difficulty": 70, "first_cast_exp_rate": 250 }, { - "spell_id": 30, + "spell_tag": "Living_Trump", "learn_level": 40, "mana_cost": 90, "difficulty": 50, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Immunity", "learn_level": 44, "mana_cost": 65, "difficulty": 70, @@ -13415,224 +13415,224 @@ "name": "DEMON", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Unlife", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Evil_Bless", "learn_level": 2, "mana_cost": 2, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Resist_Fire", "learn_level": 3, "mana_cost": 4, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Fire_Bolt", "learn_level": 7, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 5, + "spell_tag": "Summon_Manes", "learn_level": 9, "mana_cost": 8, "difficulty": 25, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Nether_Ball", "learn_level": 11, "mana_cost": 11, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Raise_the_Morale", "learn_level": 12, "mana_cost": 8, "difficulty": 55, "first_cast_exp_rate": 1 }, { - "spell_id": 8, + "spell_tag": "Vision", "learn_level": 15, "mana_cost": 13, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 9, + "spell_tag": "Resist_Nether", "learn_level": 17, "mana_cost": 15, "difficulty": 40, "first_cast_exp_rate": 11 }, { - "spell_id": 10, + "spell_tag": "Plasma_bolt", "learn_level": 21, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 11, + "spell_tag": "Fire_Ball", "learn_level": 22, "mana_cost": 13, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Fire_Branding", "learn_level": 26, "mana_cost": 65, "difficulty": 70, "first_cast_exp_rate": 8 }, { - "spell_id": 13, + "spell_tag": "Demonfire", "learn_level": 27, "mana_cost": 28, "difficulty": 65, "first_cast_exp_rate": 15 }, { - "spell_id": 14, + "spell_tag": "Summon_Demon", "learn_level": 33, "mana_cost": 65, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 15, + "spell_tag": "Nether_Wave", "learn_level": 34, "mana_cost": 16, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 16, + "spell_tag": "Devilish_Eye", "learn_level": 9, "mana_cost": 10, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Devil_Cloak", "learn_level": 12, "mana_cost": 15, "difficulty": 70, "first_cast_exp_rate": 35 }, { - "spell_id": 18, + "spell_tag": "Lava_Flow", "learn_level": 22, "mana_cost": 19, "difficulty": 70, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Plasma_Ball", "learn_level": 31, "mana_cost": 26, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 20, + "spell_tag": "Polymorph_Demon", "learn_level": 32, "mana_cost": 35, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 21, + "spell_tag": "Fireblast", "learn_level": 33, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Succubuss_Kiss", "learn_level": 36, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Doom_Hand", "learn_level": 44, "mana_cost": 70, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Immortal_Body", "learn_level": 23, "mana_cost": 20, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 25, + "spell_tag": "Insanity_Circle", "learn_level": 33, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 26, + "spell_tag": "Explode_Pets", "learn_level": 36, "mana_cost": 44, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Summon_Greater_Demon", "learn_level": 38, "mana_cost": 90, "difficulty": 75, "first_cast_exp_rate": 250 }, { - "spell_id": 28, + "spell_tag": "Fire_Storm", "learn_level": 39, "mana_cost": 53, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Nether_Storm", "learn_level": 40, "mana_cost": 53, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Bloody_Curse", "learn_level": 43, "mana_cost": 75, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Polymorph_Demonlord", "learn_level": 46, "mana_cost": 70, "difficulty": 75, @@ -13644,224 +13644,224 @@ "name": "CRUSADE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Punishment", "learn_level": 1, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Evil", "learn_level": 1, "mana_cost": 1, "difficulty": 10, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Remove_Fear", "learn_level": 3, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Scare_Monster", "learn_level": 4, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Sanctuary", "learn_level": 5, "mana_cost": 4, "difficulty": 34, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Portal", "learn_level": 7, "mana_cost": 6, "difficulty": 30, "first_cast_exp_rate": 2 }, { - "spell_id": 6, + "spell_tag": "Star_Dust", "learn_level": 8, "mana_cost": 8, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Purify", "learn_level": 10, "mana_cost": 8, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Scatter_Evil", "learn_level": 11, "mana_cost": 11, "difficulty": 45, "first_cast_exp_rate": 10 }, { - "spell_id": 9, + "spell_tag": "Holy_Orb", "learn_level": 12, "mana_cost": 11, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Exorcism", "learn_level": 15, "mana_cost": 15, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Remove_Curse", "learn_level": 16, "mana_cost": 16, "difficulty": 55, "first_cast_exp_rate": 50 }, { - "spell_id": 12, + "spell_tag": "Sense_Unseen", "learn_level": 17, "mana_cost": 16, "difficulty": 40, "first_cast_exp_rate": 7 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 20, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 14, + "spell_tag": "Judgment_Thunder", "learn_level": 28, "mana_cost": 30, "difficulty": 65, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Holy_Word", "learn_level": 36, "mana_cost": 32, "difficulty": 95, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Unbarring_Ways", "learn_level": 4, "mana_cost": 4, "difficulty": 23, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Arrest", "learn_level": 13, "mana_cost": 12, "difficulty": 35, "first_cast_exp_rate": 50 }, { - "spell_id": 18, + "spell_tag": "Holy_Aura", "learn_level": 15, "mana_cost": 13, "difficulty": 55, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Dispel_Undead_and_Demons", "learn_level": 17, "mana_cost": 14, "difficulty": 55, "first_cast_exp_rate": 70 }, { - "spell_id": 20, + "spell_tag": "Dispel_Evil", "learn_level": 25, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 21, + "spell_tag": "Holy_Blade", "learn_level": 28, "mana_cost": 65, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Star_Burst", "learn_level": 36, "mana_cost": 38, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 23, + "spell_tag": "Summon_Angel", "learn_level": 38, "mana_cost": 90, "difficulty": 75, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Heroism", "learn_level": 8, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Dispel_Curse", "learn_level": 25, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 250 }, { - "spell_id": 26, + "spell_tag": "Banish_Evil", "learn_level": 27, "mana_cost": 24, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Armageddon", "learn_level": 28, "mana_cost": 19, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "An_Eye_for_an_Eye", "learn_level": 34, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Wrath_of_the_God", "learn_level": 39, "mana_cost": 55, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Divine_Intervention", "learn_level": 42, "mana_cost": 85, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Crusade", "learn_level": 45, "mana_cost": 90, "difficulty": 75, @@ -13885,224 +13885,224 @@ "name": "ARCANE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Zap", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 1, + "spell_tag": "Wizard_Lock", "learn_level": 1, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 2, + "spell_tag": "Detect_Invisibility", "learn_level": 2, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Detect_Monsters", "learn_level": 2, "mana_cost": 2, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Blink", "learn_level": 3, "mana_cost": 3, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Light_Area", "learn_level": 5, "mana_cost": 5, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Trap_and_Door_Destruction", "learn_level": 6, "mana_cost": 6, "difficulty": 33, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Cure_Light_Wounds", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 8, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 8, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Phlogiston", "learn_level": 9, "mana_cost": 9, "difficulty": 60, "first_cast_exp_rate": 7 }, { - "spell_id": 10, + "spell_tag": "Detect_Treasure", "learn_level": 10, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Detect_Enchantment", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 12, + "spell_tag": "Detect_Objects", "learn_level": 13, "mana_cost": 11, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 13, + "spell_tag": "Cure_Poison", "learn_level": 14, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Resist_Cold", "learn_level": 15, "mana_cost": 13, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Resist_Fire", "learn_level": 16, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Resist_Lightning", "learn_level": 17, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Resist_Acid", "learn_level": 18, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 18, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Teleport", "learn_level": 20, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 8 }, { - "spell_id": 20, + "spell_tag": "Identify", "learn_level": 5, "mana_cost": 3, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 21, + "spell_tag": "Stone_to_Mud", "learn_level": 25, "mana_cost": 22, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 22, + "spell_tag": "Ray_of_Light", "learn_level": 28, "mana_cost": 24, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 23, + "spell_tag": "Satisfy_Hunger", "learn_level": 20, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 12 }, { - "spell_id": 24, + "spell_tag": "See_Invisible", "learn_level": 30, "mana_cost": 28, "difficulty": 60, "first_cast_exp_rate": 13 }, { - "spell_id": 25, + "spell_tag": "Conjure_Elemental", "learn_level": 35, "mana_cost": 33, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 26, + "spell_tag": "Teleport_Level", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Teleport_Away", "learn_level": 44, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 28, + "spell_tag": "Elemental_Ball", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Detection", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Word_of_Recall", "learn_level": 48, "mana_cost": 70, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 31, + "spell_tag": "Clairvoyance", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -14137,224 +14137,224 @@ "name": "TRUMP", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Phase_Door", "learn_level": 5, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Trump_Spiders", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Shuffle", "learn_level": 8, "mana_cost": 7, "difficulty": 37, "first_cast_exp_rate": 8 }, { - "spell_id": 3, + "spell_tag": "Reset_Recall", "learn_level": 12, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 4, + "spell_tag": "Teleport", "learn_level": 16, "mana_cost": 15, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Trump_Spying", "learn_level": 20, "mana_cost": 25, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Teleport_Away", "learn_level": 24, "mana_cost": 30, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Trump_Animals", "learn_level": 21, "mana_cost": 22, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 8, + "spell_tag": "Trump_Reach", "learn_level": 32, "mana_cost": 30, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Trump_Kamikaze", "learn_level": 23, "mana_cost": 25, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Phantasmal_Servant", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 11, + "spell_tag": "Haste_Monster", "learn_level": 29, "mana_cost": 28, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Teleport_Level", "learn_level": 37, "mana_cost": 50, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 13, + "spell_tag": "Dimension_Door", "learn_level": 40, "mana_cost": 45, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 14, + "spell_tag": "Word_of_Recall", "learn_level": 42, "mana_cost": 60, "difficulty": 40, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Banish", "learn_level": 44, "mana_cost": 80, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 16, + "spell_tag": "Swap_Position", "learn_level": 20, "mana_cost": 32, "difficulty": 65, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Trump_Undead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Trump_Reptile", "learn_level": 23, "mana_cost": 26, "difficulty": 35, "first_cast_exp_rate": 30 }, { - "spell_id": 19, + "spell_tag": "Trump_Monsters", "learn_level": 25, "mana_cost": 25, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 20, + "spell_tag": "Trump_Hounds", "learn_level": 27, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 35 }, { - "spell_id": 21, + "spell_tag": "Trump_Branding", "learn_level": 40, "mana_cost": 100, "difficulty": 40, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Living_Trump", "learn_level": 45, "mana_cost": 120, "difficulty": 45, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Trump_Cyberdemon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Trump_Divination", "learn_level": 33, "mana_cost": 35, "difficulty": 30, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Trump_Lore", "learn_level": 38, "mana_cost": 60, "difficulty": 45, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Heal_Monster", "learn_level": 32, "mana_cost": 50, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 27, + "spell_tag": "Trump_Dragon", "learn_level": 36, "mana_cost": 80, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "Trump_Meteor", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Trump_Demon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Trump_Greater_Undead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Trump_Ancient_Dragon", "learn_level": 47, "mana_cost": 100, "difficulty": 40, @@ -14378,224 +14378,224 @@ "name": "LIFE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Cure_Light_Wounds", "learn_level": 1, "mana_cost": 1, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Bless", "learn_level": 3, "mana_cost": 2, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Cause_Light_Wounds", "learn_level": 4, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Call_Light", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Detect_Doors_And_Traps", "learn_level": 7, "mana_cost": 7, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 9, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Cure_Poison", "learn_level": 12, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Satisfy_Hunger", "learn_level": 15, "mana_cost": 14, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Remove_Curse", "learn_level": 16, "mana_cost": 16, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Cause_Medium_Wounds", "learn_level": 17, "mana_cost": 17, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cure_Critical_Wounds", "learn_level": 18, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Resist_Heat_and_Cold", "learn_level": 19, "mana_cost": 19, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Surroundings", "learn_level": 20, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Turn_Undead", "learn_level": 23, "mana_cost": 23, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Healing", "learn_level": 30, "mana_cost": 30, "difficulty": 55, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Rune_of_Protection", "learn_level": 35, "mana_cost": 70, "difficulty": 75, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Dispel_Curse", "learn_level": 26, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 75 }, { - "spell_id": 17, + "spell_tag": "Perception", "learn_level": 28, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 18, + "spell_tag": "Dispel_Undead", "learn_level": 33, "mana_cost": 33, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 19, + "spell_tag": "Day_of_the_Dove", "learn_level": 35, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 20, + "spell_tag": "Cause_Critical_Wounds", "learn_level": 35, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 75 }, { - "spell_id": 21, + "spell_tag": "Word_of_Recall", "learn_level": 35, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 22, + "spell_tag": "Alter_Reality", "learn_level": 39, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 23, + "spell_tag": "Warding_True", "learn_level": 46, "mana_cost": 70, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 24, + "spell_tag": "Sterilization", "learn_level": 9, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Detection", "learn_level": 25, "mana_cost": 25, "difficulty": 50, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Annihilate_Undead", "learn_level": 35, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 42, "mana_cost": 100, "difficulty": 80, "first_cast_exp_rate": 225 }, { - "spell_id": 28, + "spell_tag": "Restoration", "learn_level": 45, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 29, + "spell_tag": "Healing_True", "learn_level": 48, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Holy_Vision", "learn_level": 49, "mana_cost": 100, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Ultimate_Resistance", "learn_level": 50, "mana_cost": 100, "difficulty": 80, @@ -14607,224 +14607,224 @@ "name": "SORCERY", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Monsters", "learn_level": 1, "mana_cost": 1, "difficulty": 23, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Phase_Door", "learn_level": 1, "mana_cost": 2, "difficulty": 24, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Light_Area", "learn_level": 3, "mana_cost": 3, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Confuse_Monster", "learn_level": 4, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Teleport", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Sleep_Monster", "learn_level": 6, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Recharging", "learn_level": 7, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 9 }, { - "spell_id": 8, + "spell_tag": "Magic_Mapping", "learn_level": 9, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Identify", "learn_level": 10, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 8 }, { - "spell_id": 10, + "spell_tag": "Slow_Monster", "learn_level": 11, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 7 }, { - "spell_id": 11, + "spell_tag": "Mass_Sleep", "learn_level": 13, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Teleport_Away", "learn_level": 18, "mana_cost": 12, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 13, + "spell_tag": "Haste_Self", "learn_level": 22, "mana_cost": 12, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Detection_True", "learn_level": 28, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Identify_True", "learn_level": 33, "mana_cost": 30, "difficulty": 75, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Detect_items_and_Treasure", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 15 }, { - "spell_id": 17, + "spell_tag": "Charm_Monster", "learn_level": 10, "mana_cost": 10, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 18, + "spell_tag": "Sense_Minds", "learn_level": 14, "mana_cost": 10, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 19, + "spell_tag": "Teleport_to_town", "learn_level": 18, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Self_Knowledge", "learn_level": 20, "mana_cost": 18, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Teleport_Level", "learn_level": 20, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 22, + "spell_tag": "Word_of_Recall", "learn_level": 25, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 19 }, { - "spell_id": 23, + "spell_tag": "Dimension_Door", "learn_level": 40, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 24, + "spell_tag": "Probing", "learn_level": 10, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 20 }, { - "spell_id": 25, + "spell_tag": "Explosive_Rune", "learn_level": 20, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Telekinesis", "learn_level": 25, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 70 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 30, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 120 }, { - "spell_id": 28, + "spell_tag": "Charm_monsters", "learn_level": 33, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Alchemy", "learn_level": 42, "mana_cost": 50, "difficulty": 90, "first_cast_exp_rate": 175 }, { - "spell_id": 30, + "spell_tag": "Banishment", "learn_level": 43, "mana_cost": 40, "difficulty": 55, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Globe_of_Invulnerability", "learn_level": 45, "mana_cost": 70, "difficulty": 85, @@ -14836,224 +14836,224 @@ "name": "NATURE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Creatures", "learn_level": 1, "mana_cost": 1, "difficulty": 23, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Lightning", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Produce_Food", "learn_level": 4, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Daylight", "learn_level": 4, "mana_cost": 4, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Animal_Taming", "learn_level": 4, "mana_cost": 5, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Resist_Environment", "learn_level": 5, "mana_cost": 5, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Cure_Wounds_And_Poison", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Stone_to_Mud", "learn_level": 5, "mana_cost": 5, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 9, + "spell_tag": "Frost_Bolt", "learn_level": 5, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 10, + "spell_tag": "Nature_Awareness", "learn_level": 7, "mana_cost": 6, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Fire_Bolt", "learn_level": 7, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Ray_of_Sunlight", "learn_level": 9, "mana_cost": 6, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 13, + "spell_tag": "Entangle", "learn_level": 19, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Summon_Animal", "learn_level": 25, "mana_cost": 25, "difficulty": 90, "first_cast_exp_rate": 50 }, { - "spell_id": 15, + "spell_tag": "Herbal_Healing", "learn_level": 40, "mana_cost": 60, "difficulty": 90, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Stair_Building", "learn_level": 9, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 44 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 10, "mana_cost": 12, "difficulty": 75, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance_True", "learn_level": 15, "mana_cost": 20, "difficulty": 85, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Forest_Creation", "learn_level": 20, "mana_cost": 22, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Animal_Friendship", "learn_level": 30, "mana_cost": 30, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 21, + "spell_tag": "Stone_Tell", "learn_level": 37, "mana_cost": 40, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 22, + "spell_tag": "Wall_of_Stone", "learn_level": 38, "mana_cost": 45, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Protect_from_Corrosion", "learn_level": 40, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Earthquake", "learn_level": 20, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 25, + "spell_tag": "Whirlwind", "learn_level": 23, "mana_cost": 23, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Blizzard", "learn_level": 25, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 29 }, { - "spell_id": 27, + "spell_tag": "Lightning_Storm", "learn_level": 30, "mana_cost": 27, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 28, + "spell_tag": "Whirlpool", "learn_level": 35, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 65 }, { - "spell_id": 29, + "spell_tag": "Call_Sunlight", "learn_level": 37, "mana_cost": 35, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Elemental_Branding", "learn_level": 40, "mana_cost": 90, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Natures_Wrath", "learn_level": 40, "mana_cost": 75, "difficulty": 65, @@ -15065,224 +15065,224 @@ "name": "CHAOS", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Trap_Door_Destruction", "learn_level": 1, "mana_cost": 2, "difficulty": 22, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Flash_of_Light", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Touch_of_Confusion", "learn_level": 5, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Mana_Burst", "learn_level": 9, "mana_cost": 6, "difficulty": 50, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Fire_Bolt", "learn_level": 13, "mana_cost": 9, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Fist_of_Force", "learn_level": 14, "mana_cost": 9, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Teleport_Self", "learn_level": 15, "mana_cost": 9, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Wonder", "learn_level": 17, "mana_cost": 10, "difficulty": 25, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Chaos_Bolt", "learn_level": 19, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Sonic_Boom", "learn_level": 21, "mana_cost": 13, "difficulty": 45, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Doom_Bolt", "learn_level": 23, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 11 }, { - "spell_id": 12, + "spell_tag": "Fire_Ball", "learn_level": 25, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 13, + "spell_tag": "Teleport_Other", "learn_level": 25, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Word_of_Destruction", "learn_level": 30, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Invoke_Logrus", "learn_level": 35, "mana_cost": 40, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 16, + "spell_tag": "Polymorph_Other", "learn_level": 11, "mana_cost": 7, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Chain_Lightning", "learn_level": 15, "mana_cost": 15, "difficulty": 80, "first_cast_exp_rate": 35 }, { - "spell_id": 18, + "spell_tag": "Arcane_Binding", "learn_level": 16, "mana_cost": 14, "difficulty": 80, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Disintegrate", "learn_level": 25, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 20, + "spell_tag": "Alter_Reality", "learn_level": 30, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 21, + "spell_tag": "Magic_Rocket", "learn_level": 40, "mana_cost": 41, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Chaos_Branding", "learn_level": 45, "mana_cost": 90, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Summon_Demon", "learn_level": 47, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Beam_of_Gravity", "learn_level": 20, "mana_cost": 20, "difficulty": 66, "first_cast_exp_rate": 8 }, { - "spell_id": 25, + "spell_tag": "Meteor_Swarm", "learn_level": 35, "mana_cost": 32, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 26, + "spell_tag": "Flame_Strike", "learn_level": 37, "mana_cost": 34, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 27, + "spell_tag": "Call_Chaos", "learn_level": 39, "mana_cost": 42, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Polymorph_Self", "learn_level": 42, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 250 }, { - "spell_id": 29, + "spell_tag": "Mana_Storm", "learn_level": 45, "mana_cost": 58, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Breathe_Logrus", "learn_level": 47, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Call_the_Void", "learn_level": 49, "mana_cost": 100, "difficulty": 85, @@ -15294,224 +15294,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 3, "mana_cost": 3, "difficulty": 27, "first_cast_exp_rate": 3 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 5, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 7, "mana_cost": 10, "difficulty": 75, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 9, "mana_cost": 9, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 10, "mana_cost": 10, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 12, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 13, "mana_cost": 12, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 18, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 24, "mana_cost": 21, "difficulty": 60, "first_cast_exp_rate": 30 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 30, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 32, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 16 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 36, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 39, "mana_cost": 30, "difficulty": 95, "first_cast_exp_rate": 25 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 10, "mana_cost": 20, "difficulty": 80, "first_cast_exp_rate": 180 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 10, "mana_cost": 15, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 11, "mana_cost": 11, "difficulty": 30, "first_cast_exp_rate": 15 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 30, "mana_cost": 25, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 34, "mana_cost": 90, "difficulty": 70, "first_cast_exp_rate": 90 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 36, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 125 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 38, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 40, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 20, "mana_cost": 20, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 25, "mana_cost": 66, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 30, "mana_cost": 40, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 35, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 42, "mana_cost": 50, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 43, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 45, "mana_cost": 95, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 47, "mana_cost": 100, "difficulty": 90, @@ -15523,224 +15523,224 @@ "name": "TRUMP", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Phase_Door", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Trump_Spiders", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Shuffle", "learn_level": 5, "mana_cost": 5, "difficulty": 37, "first_cast_exp_rate": 8 }, { - "spell_id": 3, + "spell_tag": "Reset_Recall", "learn_level": 6, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 4, + "spell_tag": "Teleport", "learn_level": 7, "mana_cost": 7, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Trump_Spying", "learn_level": 11, "mana_cost": 12, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Teleport_Away", "learn_level": 14, "mana_cost": 15, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Trump_Animals", "learn_level": 18, "mana_cost": 20, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 8, + "spell_tag": "Trump_Reach", "learn_level": 20, "mana_cost": 20, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Trump_Kamikaze", "learn_level": 23, "mana_cost": 20, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Phantasmal_Servant", "learn_level": 25, "mana_cost": 24, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 11, + "spell_tag": "Haste_Monster", "learn_level": 30, "mana_cost": 28, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Teleport_Level", "learn_level": 33, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 13, + "spell_tag": "Dimension_Door", "learn_level": 35, "mana_cost": 33, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 14, + "spell_tag": "Word_of_Recall", "learn_level": 40, "mana_cost": 35, "difficulty": 40, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Banish", "learn_level": 42, "mana_cost": 40, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 16, + "spell_tag": "Swap_Position", "learn_level": 22, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Trump_Undead", "learn_level": 24, "mana_cost": 24, "difficulty": 35, "first_cast_exp_rate": 25 }, { - "spell_id": 18, + "spell_tag": "Trump_Reptile", "learn_level": 26, "mana_cost": 26, "difficulty": 35, "first_cast_exp_rate": 30 }, { - "spell_id": 19, + "spell_tag": "Trump_Monsters", "learn_level": 30, "mana_cost": 25, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 20, + "spell_tag": "Trump_Hounds", "learn_level": 30, "mana_cost": 30, "difficulty": 35, "first_cast_exp_rate": 35 }, { - "spell_id": 21, + "spell_tag": "Trump_Branding", "learn_level": 35, "mana_cost": 70, "difficulty": 40, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Living_Trump", "learn_level": 40, "mana_cost": 100, "difficulty": 45, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Trump_Cyberdemon", "learn_level": 45, "mana_cost": 100, "difficulty": 45, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Trump_Divination", "learn_level": 30, "mana_cost": 30, "difficulty": 30, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Trump_Lore", "learn_level": 35, "mana_cost": 50, "difficulty": 45, "first_cast_exp_rate": 100 }, { - "spell_id": 26, + "spell_tag": "Heal_Monster", "learn_level": 36, "mana_cost": 55, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 27, + "spell_tag": "Trump_Dragon", "learn_level": 39, "mana_cost": 80, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "Trump_Meteor", "learn_level": 41, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 29, + "spell_tag": "Trump_Demon", "learn_level": 47, "mana_cost": 100, "difficulty": 40, "first_cast_exp_rate": 150 }, { - "spell_id": 30, + "spell_tag": "Trump_Greater_Undead", "learn_level": 48, "mana_cost": 100, "difficulty": 40, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Trump_Ancient_Dragon", "learn_level": 49, "mana_cost": 100, "difficulty": 40, @@ -15752,224 +15752,224 @@ "name": "ARCANE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Zap", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Wizard_Lock", "learn_level": 1, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 2, + "spell_tag": "Detect_Invisibility", "learn_level": 1, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Detect_Monsters", "learn_level": 2, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Blink", "learn_level": 2, "mana_cost": 2, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Light_Area", "learn_level": 4, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Trap_and_Door_Destruction", "learn_level": 5, "mana_cost": 5, "difficulty": 33, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Cure_Light_Wounds", "learn_level": 6, "mana_cost": 5, "difficulty": 44, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 7, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Phlogiston", "learn_level": 8, "mana_cost": 8, "difficulty": 60, "first_cast_exp_rate": 7 }, { - "spell_id": 10, + "spell_tag": "Detect_Treasure", "learn_level": 9, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Detect_Enchantment", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Detect_Objects", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 13, + "spell_tag": "Cure_Poison", "learn_level": 11, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Resist_Cold", "learn_level": 12, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Resist_Fire", "learn_level": 13, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Resist_Lightning", "learn_level": 14, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Resist_Acid", "learn_level": 15, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 18, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 16, "mana_cost": 14, "difficulty": 33, "first_cast_exp_rate": 6 }, { - "spell_id": 19, + "spell_tag": "Teleport", "learn_level": 18, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 8 }, { - "spell_id": 20, + "spell_tag": "Identify", "learn_level": 20, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 21, + "spell_tag": "Stone_to_Mud", "learn_level": 22, "mana_cost": 16, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 22, + "spell_tag": "Ray_of_Light", "learn_level": 25, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 23, + "spell_tag": "Satisfy_Hunger", "learn_level": 28, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 12 }, { - "spell_id": 24, + "spell_tag": "See_Invisible", "learn_level": 28, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 13 }, { - "spell_id": 25, + "spell_tag": "Conjure_Elemental", "learn_level": 31, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 30 }, { - "spell_id": 26, + "spell_tag": "Teleport_Level", "learn_level": 35, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 25 }, { - "spell_id": 27, + "spell_tag": "Teleport_Away", "learn_level": 40, "mana_cost": 30, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 28, + "spell_tag": "Elemental_Ball", "learn_level": 41, "mana_cost": 30, "difficulty": 66, "first_cast_exp_rate": 30 }, { - "spell_id": 29, + "spell_tag": "Detection", "learn_level": 42, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 30, + "spell_tag": "Word_of_Recall", "learn_level": 45, "mana_cost": 50, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 31, + "spell_tag": "Clairvoyance", "learn_level": 49, "mana_cost": 100, "difficulty": 80, @@ -15981,224 +15981,224 @@ "name": "CRAFT", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Infravision", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Regeneration", "learn_level": 2, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Satisfy_Hunger", "learn_level": 3, "mana_cost": 3, "difficulty": 30, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Resist_Cold", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Resist_Fire", "learn_level": 6, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Heroism", "learn_level": 8, "mana_cost": 6, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Resist_Lightning", "learn_level": 9, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Resist_Acid", "learn_level": 10, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "See_Invisibility", "learn_level": 12, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Remove_Curse", "learn_level": 15, "mana_cost": 14, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Resist_Poison", "learn_level": 17, "mana_cost": 15, "difficulty": 60, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Berserk", "learn_level": 20, "mana_cost": 17, "difficulty": 75, "first_cast_exp_rate": 80 }, { - "spell_id": 12, + "spell_tag": "Self_Knowledge", "learn_level": 23, "mana_cost": 18, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 26, "mana_cost": 22, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Cure", "learn_level": 29, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Mana_Branding", "learn_level": 38, "mana_cost": 65, "difficulty": 95, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Telepathy", "learn_level": 12, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 14, "mana_cost": 10, "difficulty": 75, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance", "learn_level": 20, "mana_cost": 20, "difficulty": 85, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Haste_Self", "learn_level": 24, "mana_cost": 12, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 20, + "spell_tag": "Walk_through_Wall", "learn_level": 30, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Polish_Shield", "learn_level": 34, "mana_cost": 70, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Create_Golem", "learn_level": 41, "mana_cost": 80, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Magical_armor", "learn_level": 45, "mana_cost": 55, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Remove_Enchantment", "learn_level": 14, "mana_cost": 14, "difficulty": 65, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Remove_All_Curse", "learn_level": 30, "mana_cost": 32, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 26, + "spell_tag": "Knowledge_True", "learn_level": 36, "mana_cost": 45, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 27, + "spell_tag": "Enchant_Weapon", "learn_level": 38, "mana_cost": 80, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Enchant_Armor", "learn_level": 38, "mana_cost": 100, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Brand_Weapon", "learn_level": 40, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 30, + "spell_tag": "Living_Trump", "learn_level": 43, "mana_cost": 100, "difficulty": 70, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Immunity", "learn_level": 47, "mana_cost": 70, "difficulty": 80, @@ -16210,224 +16210,224 @@ "name": "DEMON", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Unlife", "learn_level": 2, "mana_cost": 1, "difficulty": 22, "first_cast_exp_rate": 1 }, { - "spell_id": 2, + "spell_tag": "Evil_Bless", "learn_level": 3, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Resist_Fire", "learn_level": 4, "mana_cost": 5, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Fire_Bolt", "learn_level": 10, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 5, + "spell_tag": "Summon_Manes", "learn_level": 11, "mana_cost": 9, "difficulty": 35, "first_cast_exp_rate": 5 }, { - "spell_id": 6, + "spell_tag": "Nether_Ball", "learn_level": 13, "mana_cost": 13, "difficulty": 40, "first_cast_exp_rate": 10 }, { - "spell_id": 7, + "spell_tag": "Raise_the_Morale", "learn_level": 14, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Vision", "learn_level": 17, "mana_cost": 15, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 9, + "spell_tag": "Resist_Nether", "learn_level": 20, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 11 }, { - "spell_id": 10, + "spell_tag": "Plasma_bolt", "learn_level": 23, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 11, + "spell_tag": "Fire_Ball", "learn_level": 25, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Fire_Branding", "learn_level": 30, "mana_cost": 75, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Demonfire", "learn_level": 33, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 15 }, { - "spell_id": 14, + "spell_tag": "Summon_Demon", "learn_level": 36, "mana_cost": 70, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 15, + "spell_tag": "Nether_Wave", "learn_level": 37, "mana_cost": 18, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 16, + "spell_tag": "Devilish_Eye", "learn_level": 12, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 9 }, { - "spell_id": 17, + "spell_tag": "Devil_Cloak", "learn_level": 15, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 20 }, { - "spell_id": 18, + "spell_tag": "Lava_Flow", "learn_level": 25, "mana_cost": 22, "difficulty": 65, "first_cast_exp_rate": 35 }, { - "spell_id": 19, + "spell_tag": "Plasma_Ball", "learn_level": 34, "mana_cost": 30, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 20, + "spell_tag": "Polymorph_Demon", "learn_level": 35, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 21, + "spell_tag": "Fireblast", "learn_level": 36, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Succubuss_Kiss", "learn_level": 40, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Doom_Hand", "learn_level": 46, "mana_cost": 80, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Immortal_Body", "learn_level": 26, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 35 }, { - "spell_id": 25, + "spell_tag": "Insanity_Circle", "learn_level": 36, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 26, + "spell_tag": "Explode_Pets", "learn_level": 41, "mana_cost": 50, "difficulty": 85, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Summon_Greater_Demon", "learn_level": 43, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 28, + "spell_tag": "Fire_Storm", "learn_level": 44, "mana_cost": 58, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Nether_Storm", "learn_level": 45, "mana_cost": 58, "difficulty": 85, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Bloody_Curse", "learn_level": 47, "mana_cost": 85, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Polymorph_Demonlord", "learn_level": 49, "mana_cost": 80, "difficulty": 85, @@ -16439,224 +16439,224 @@ "name": "CRUSADE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Punishment", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Evil", "learn_level": 2, "mana_cost": 1, "difficulty": 15, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Remove_Fear", "learn_level": 4, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Scare_Monster", "learn_level": 6, "mana_cost": 4, "difficulty": 30, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Sanctuary", "learn_level": 7, "mana_cost": 5, "difficulty": 34, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Portal", "learn_level": 9, "mana_cost": 7, "difficulty": 30, "first_cast_exp_rate": 2 }, { - "spell_id": 6, + "spell_tag": "Star_Dust", "learn_level": 10, "mana_cost": 10, "difficulty": 45, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Purify", "learn_level": 15, "mana_cost": 11, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Scatter_Evil", "learn_level": 17, "mana_cost": 15, "difficulty": 55, "first_cast_exp_rate": 10 }, { - "spell_id": 9, + "spell_tag": "Holy_Orb", "learn_level": 17, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Exorcism", "learn_level": 21, "mana_cost": 19, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Remove_Curse", "learn_level": 23, "mana_cost": 20, "difficulty": 70, "first_cast_exp_rate": 5 }, { - "spell_id": 12, + "spell_tag": "Sense_Unseen", "learn_level": 26, "mana_cost": 24, "difficulty": 50, "first_cast_exp_rate": 7 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 29, "mana_cost": 23, "difficulty": 60, "first_cast_exp_rate": 10 }, { - "spell_id": 14, + "spell_tag": "Judgment_Thunder", "learn_level": 34, "mana_cost": 32, "difficulty": 85, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Holy_Word", "learn_level": 40, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Unbarring_Ways", "learn_level": 6, "mana_cost": 5, "difficulty": 33, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Arrest", "learn_level": 18, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 50 }, { - "spell_id": 18, + "spell_tag": "Holy_Aura", "learn_level": 21, "mana_cost": 16, "difficulty": 60, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Dispel_Undead_and_Demons", "learn_level": 25, "mana_cost": 20, "difficulty": 65, "first_cast_exp_rate": 70 }, { - "spell_id": 20, + "spell_tag": "Dispel_Evil", "learn_level": 32, "mana_cost": 27, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 21, + "spell_tag": "Holy_Blade", "learn_level": 34, "mana_cost": 75, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Star_Burst", "learn_level": 40, "mana_cost": 45, "difficulty": 70, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Summon_Angel", "learn_level": 44, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Heroism", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 80 }, { - "spell_id": 25, + "spell_tag": "Dispel_Curse", "learn_level": 30, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 26, + "spell_tag": "Banish_Evil", "learn_level": 32, "mana_cost": 32, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Armageddon", "learn_level": 36, "mana_cost": 22, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 28, + "spell_tag": "An_Eye_for_an_Eye", "learn_level": 40, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Wrath_of_the_God", "learn_level": 43, "mana_cost": 65, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 30, + "spell_tag": "Divine_Intervention", "learn_level": 46, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Crusade", "learn_level": 48, "mana_cost": 100, "difficulty": 85, @@ -16713,224 +16713,224 @@ "name": "LIFE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Cure_Light_Wounds", "learn_level": 2, "mana_cost": 2, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Bless", "learn_level": 4, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Cause_Light_Wounds", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Call_Light", "learn_level": 7, "mana_cost": 8, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Detect_Doors_And_Traps", "learn_level": 9, "mana_cost": 9, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 11, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Cure_Poison", "learn_level": 15, "mana_cost": 15, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Satisfy_Hunger", "learn_level": 18, "mana_cost": 18, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Remove_Curse", "learn_level": 20, "mana_cost": 20, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Cause_Medium_Wounds", "learn_level": 23, "mana_cost": 23, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cure_Critical_Wounds", "learn_level": 26, "mana_cost": 25, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Resist_Heat_and_Cold", "learn_level": 30, "mana_cost": 28, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Surroundings", "learn_level": 34, "mana_cost": 30, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Turn_Undead", "learn_level": 38, "mana_cost": 32, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Healing", "learn_level": 42, "mana_cost": 38, "difficulty": 55, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Rune_of_Protection", "learn_level": 45, "mana_cost": 80, "difficulty": 75, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Dispel_Curse", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 17, + "spell_tag": "Perception", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Dispel_Undead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Day_of_the_Dove", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 20, + "spell_tag": "Cause_Critical_Wounds", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 21, + "spell_tag": "Word_of_Recall", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 22, + "spell_tag": "Alter_Reality", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Warding_True", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Sterilization", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 25, + "spell_tag": "Detection", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 26, + "spell_tag": "Annihilate_Undead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "Restoration", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Healing_True", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Holy_Vision", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Ultimate_Resistance", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -16942,224 +16942,224 @@ "name": "SORCERY", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Monsters", "learn_level": 3, "mana_cost": 1, "difficulty": 50, "first_cast_exp_rate": 1 }, { - "spell_id": 1, + "spell_tag": "Phase_Door", "learn_level": 5, "mana_cost": 2, "difficulty": 55, "first_cast_exp_rate": 1 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 7, "mana_cost": 3, "difficulty": 65, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Light_Area", "learn_level": 8, "mana_cost": 4, "difficulty": 65, "first_cast_exp_rate": 1 }, { - "spell_id": 4, + "spell_tag": "Confuse_Monster", "learn_level": 12, "mana_cost": 7, "difficulty": 75, "first_cast_exp_rate": 1 }, { - "spell_id": 5, + "spell_tag": "Teleport", "learn_level": 15, "mana_cost": 8, "difficulty": 75, "first_cast_exp_rate": 1 }, { - "spell_id": 6, + "spell_tag": "Sleep_Monster", "learn_level": 18, "mana_cost": 10, "difficulty": 75, "first_cast_exp_rate": 1 }, { - "spell_id": 7, + "spell_tag": "Recharging", "learn_level": 22, "mana_cost": 13, "difficulty": 80, "first_cast_exp_rate": 1 }, { - "spell_id": 8, + "spell_tag": "Magic_Mapping", "learn_level": 26, "mana_cost": 16, "difficulty": 80, "first_cast_exp_rate": 1 }, { - "spell_id": 9, + "spell_tag": "Identify", "learn_level": 29, "mana_cost": 17, "difficulty": 80, "first_cast_exp_rate": 1 }, { - "spell_id": 10, + "spell_tag": "Slow_Monster", "learn_level": 32, "mana_cost": 19, "difficulty": 75, "first_cast_exp_rate": 2 }, { - "spell_id": 11, + "spell_tag": "Mass_Sleep", "learn_level": 34, "mana_cost": 23, "difficulty": 80, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Teleport_Away", "learn_level": 35, "mana_cost": 26, "difficulty": 80, "first_cast_exp_rate": 5 }, { - "spell_id": 13, + "spell_tag": "Haste_Self", "learn_level": 39, "mana_cost": 29, "difficulty": 70, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Detection_True", "learn_level": 42, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 12 }, { - "spell_id": 15, + "spell_tag": "Identify_True", "learn_level": 46, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Detect_items_and_Treasure", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 17, + "spell_tag": "Charm_Monster", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Sense_Minds", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Teleport_to_town", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 20, + "spell_tag": "Self_Knowledge", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 21, + "spell_tag": "Teleport_Level", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 22, + "spell_tag": "Word_of_Recall", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Dimension_Door", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Probing", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 25, + "spell_tag": "Explosive_Rune", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 26, + "spell_tag": "Telekinesis", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "Charm_monsters", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Alchemy", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Banishment", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Globe_of_Invulnerability", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -17171,224 +17171,224 @@ "name": "NATURE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Creatures", "learn_level": 3, "mana_cost": 1, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 1, + "spell_tag": "Lightning", "learn_level": 4, "mana_cost": 3, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 6, "mana_cost": 5, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Produce_Food", "learn_level": 7, "mana_cost": 8, "difficulty": 55, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Daylight", "learn_level": 9, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 5, + "spell_tag": "Animal_Taming", "learn_level": 10, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 6, + "spell_tag": "Resist_Environment", "learn_level": 12, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Cure_Wounds_And_Poison", "learn_level": 14, "mana_cost": 10, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Stone_to_Mud", "learn_level": 16, "mana_cost": 10, "difficulty": 80, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Frost_Bolt", "learn_level": 18, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 10, + "spell_tag": "Nature_Awareness", "learn_level": 19, "mana_cost": 13, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Fire_Bolt", "learn_level": 21, "mana_cost": 15, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Ray_of_Sunlight", "learn_level": 23, "mana_cost": 15, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Entangle", "learn_level": 26, "mana_cost": 27, "difficulty": 65, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Summon_Animal", "learn_level": 37, "mana_cost": 38, "difficulty": 75, "first_cast_exp_rate": 10 }, { - "spell_id": 15, + "spell_tag": "Herbal_Healing", "learn_level": 49, "mana_cost": 67, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 16, + "spell_tag": "Stair_Building", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Resistance_True", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Forest_Creation", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 20, + "spell_tag": "Animal_Friendship", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 21, + "spell_tag": "Stone_Tell", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 22, + "spell_tag": "Wall_of_Stone", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Protect_from_Corrosion", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Earthquake", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 25, + "spell_tag": "Whirlwind", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 26, + "spell_tag": "Blizzard", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Lightning_Storm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "Whirlpool", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Call_Sunlight", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Elemental_Branding", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Natures_Wrath", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -17400,224 +17400,224 @@ "name": "CHAOS", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 3, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 1, + "spell_tag": "Trap_Door_Destruction", "learn_level": 4, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Flash_of_Light", "learn_level": 6, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 3, + "spell_tag": "Touch_of_Confusion", "learn_level": 9, "mana_cost": 6, "difficulty": 45, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Mana_Burst", "learn_level": 16, "mana_cost": 14, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 5, + "spell_tag": "Fire_Bolt", "learn_level": 23, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Fist_of_Force", "learn_level": 26, "mana_cost": 24, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Teleport_Self", "learn_level": 28, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Wonder", "learn_level": 29, "mana_cost": 26, "difficulty": 60, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Chaos_Bolt", "learn_level": 32, "mana_cost": 29, "difficulty": 60, "first_cast_exp_rate": 8 }, { - "spell_id": 10, + "spell_tag": "Sonic_Boom", "learn_level": 35, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 13 }, { - "spell_id": 11, + "spell_tag": "Doom_Bolt", "learn_level": 38, "mana_cost": 36, "difficulty": 70, "first_cast_exp_rate": 10 }, { - "spell_id": 12, + "spell_tag": "Fire_Ball", "learn_level": 41, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 15 }, { - "spell_id": 13, + "spell_tag": "Teleport_Other", "learn_level": 43, "mana_cost": 35, "difficulty": 65, "first_cast_exp_rate": 5 }, { - "spell_id": 14, + "spell_tag": "Word_of_Destruction", "learn_level": 46, "mana_cost": 38, "difficulty": 95, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Invoke_Logrus", "learn_level": 49, "mana_cost": 60, "difficulty": 85, "first_cast_exp_rate": 30 }, { - "spell_id": 16, + "spell_tag": "Polymorph_Other", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 17, + "spell_tag": "Chain_Lightning", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Arcane_Binding", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Disintegrate", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 20, + "spell_tag": "Alter_Reality", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 21, + "spell_tag": "Magic_Rocket", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 22, + "spell_tag": "Chaos_Branding", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Summon_Demon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Beam_of_Gravity", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 25, + "spell_tag": "Meteor_Swarm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 26, + "spell_tag": "Flame_Strike", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Call_Chaos", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "Polymorph_Self", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Mana_Storm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Breathe_Logrus", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Call_the_Void", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -17629,224 +17629,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 4, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 6, "mana_cost": 4, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 8, "mana_cost": 6, "difficulty": 27, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 11, "mana_cost": 10, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 14, "mana_cost": 13, "difficulty": 75, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 16, "mana_cost": 14, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 20, "mana_cost": 18, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 22, "mana_cost": 21, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 25, "mana_cost": 22, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 27, "mana_cost": 27, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 35, "mana_cost": 35, "difficulty": 85, "first_cast_exp_rate": 10 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 38, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 41, "mana_cost": 38, "difficulty": 60, "first_cast_exp_rate": 16 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 48, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 50, "mana_cost": 70, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -17858,224 +17858,224 @@ "name": "TRUMP", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Phase_Door", "learn_level": 3, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 3 }, { - "spell_id": 1, + "spell_tag": "Trump_Spiders", "learn_level": 7, "mana_cost": 5, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Shuffle", "learn_level": 9, "mana_cost": 8, "difficulty": 37, "first_cast_exp_rate": 8 }, { - "spell_id": 3, + "spell_tag": "Reset_Recall", "learn_level": 12, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 4, + "spell_tag": "Teleport", "learn_level": 15, "mana_cost": 12, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Trump_Spying", "learn_level": 18, "mana_cost": 17, "difficulty": 30, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Teleport_Away", "learn_level": 21, "mana_cost": 23, "difficulty": 30, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Trump_Animals", "learn_level": 25, "mana_cost": 30, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 8, + "spell_tag": "Trump_Reach", "learn_level": 29, "mana_cost": 25, "difficulty": 40, "first_cast_exp_rate": 8 }, { - "spell_id": 9, + "spell_tag": "Trump_Kamikaze", "learn_level": 32, "mana_cost": 27, "difficulty": 35, "first_cast_exp_rate": 9 }, { - "spell_id": 10, + "spell_tag": "Phantasmal_Servant", "learn_level": 35, "mana_cost": 30, "difficulty": 30, "first_cast_exp_rate": 8 }, { - "spell_id": 11, + "spell_tag": "Haste_Monster", "learn_level": 38, "mana_cost": 40, "difficulty": 40, "first_cast_exp_rate": 12 }, { - "spell_id": 12, + "spell_tag": "Teleport_Level", "learn_level": 42, "mana_cost": 44, "difficulty": 35, "first_cast_exp_rate": 10 }, { - "spell_id": 13, + "spell_tag": "Dimension_Door", "learn_level": 44, "mana_cost": 45, "difficulty": 45, "first_cast_exp_rate": 12 }, { - "spell_id": 14, + "spell_tag": "Word_of_Recall", "learn_level": 47, "mana_cost": 51, "difficulty": 40, "first_cast_exp_rate": 15 }, { - "spell_id": 15, + "spell_tag": "Banish", "learn_level": 49, "mana_cost": 55, "difficulty": 35, "first_cast_exp_rate": 12 }, { - "spell_id": 16, + "spell_tag": "Swap_Position", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 17, + "spell_tag": "Trump_Undead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Trump_Reptile", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Trump_Monsters", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 20, + "spell_tag": "Trump_Hounds", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 21, + "spell_tag": "Trump_Branding", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 22, + "spell_tag": "Living_Trump", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Trump_Cyberdemon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Trump_Divination", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 25, + "spell_tag": "Trump_Lore", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 26, + "spell_tag": "Heal_Monster", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Trump_Dragon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "Trump_Meteor", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Trump_Demon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Trump_Greater_Undead", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Trump_Ancient_Dragon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -18087,224 +18087,224 @@ "name": "ARCANE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Zap", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Wizard_Lock", "learn_level": 1, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 2, + "spell_tag": "Detect_Invisibility", "learn_level": 2, "mana_cost": 1, "difficulty": 33, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Detect_Monsters", "learn_level": 2, "mana_cost": 2, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Blink", "learn_level": 3, "mana_cost": 3, "difficulty": 33, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Light_Area", "learn_level": 5, "mana_cost": 5, "difficulty": 40, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Trap_and_Door_Destruction", "learn_level": 6, "mana_cost": 6, "difficulty": 33, "first_cast_exp_rate": 7 }, { - "spell_id": 7, + "spell_tag": "Cure_Light_Wounds", "learn_level": 7, "mana_cost": 7, "difficulty": 44, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 8, "mana_cost": 8, "difficulty": 40, "first_cast_exp_rate": 7 }, { - "spell_id": 9, + "spell_tag": "Phlogiston", "learn_level": 9, "mana_cost": 9, "difficulty": 60, "first_cast_exp_rate": 7 }, { - "spell_id": 10, + "spell_tag": "Detect_Treasure", "learn_level": 10, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Detect_Enchantment", "learn_level": 11, "mana_cost": 11, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 12, + "spell_tag": "Detect_Objects", "learn_level": 13, "mana_cost": 11, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 13, + "spell_tag": "Cure_Poison", "learn_level": 14, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 14, + "spell_tag": "Resist_Cold", "learn_level": 15, "mana_cost": 13, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Resist_Fire", "learn_level": 16, "mana_cost": 14, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Resist_Lightning", "learn_level": 17, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 17, + "spell_tag": "Resist_Acid", "learn_level": 18, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 5 }, { - "spell_id": 18, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 19, "mana_cost": 17, "difficulty": 33, "first_cast_exp_rate": 6 }, { - "spell_id": 19, + "spell_tag": "Teleport", "learn_level": 20, "mana_cost": 20, "difficulty": 50, "first_cast_exp_rate": 8 }, { - "spell_id": 20, + "spell_tag": "Identify", "learn_level": 23, "mana_cost": 28, "difficulty": 60, "first_cast_exp_rate": 25 }, { - "spell_id": 21, + "spell_tag": "Stone_to_Mud", "learn_level": 25, "mana_cost": 24, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 22, + "spell_tag": "Ray_of_Light", "learn_level": 28, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 9 }, { - "spell_id": 23, + "spell_tag": "Satisfy_Hunger", "learn_level": 30, "mana_cost": 28, "difficulty": 70, "first_cast_exp_rate": 12 }, { - "spell_id": 24, + "spell_tag": "See_Invisible", "learn_level": 33, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 13 }, { - "spell_id": 25, + "spell_tag": "Conjure_Elemental", "learn_level": 37, "mana_cost": 33, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 26, + "spell_tag": "Teleport_Level", "learn_level": 40, "mana_cost": 36, "difficulty": 80, "first_cast_exp_rate": 25 }, { - "spell_id": 27, + "spell_tag": "Teleport_Away", "learn_level": 44, "mana_cost": 38, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 28, + "spell_tag": "Elemental_Ball", "learn_level": 46, "mana_cost": 40, "difficulty": 66, "first_cast_exp_rate": 30 }, { - "spell_id": 29, + "spell_tag": "Detection", "learn_level": 47, "mana_cost": 42, "difficulty": 80, "first_cast_exp_rate": 40 }, { - "spell_id": 30, + "spell_tag": "Word_of_Recall", "learn_level": 48, "mana_cost": 60, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 31, + "spell_tag": "Clairvoyance", "learn_level": 50, "mana_cost": 125, "difficulty": 80, @@ -18316,224 +18316,224 @@ "name": "CRAFT", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Infravision", "learn_level": 2, "mana_cost": 2, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 1, + "spell_tag": "Regeneration", "learn_level": 4, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Satisfy_Hunger", "learn_level": 7, "mana_cost": 6, "difficulty": 45, "first_cast_exp_rate": 1 }, { - "spell_id": 3, + "spell_tag": "Resist_Cold", "learn_level": 10, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Resist_Fire", "learn_level": 13, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 2 }, { - "spell_id": 5, + "spell_tag": "Heroism", "learn_level": 16, "mana_cost": 14, "difficulty": 55, "first_cast_exp_rate": 3 }, { - "spell_id": 6, + "spell_tag": "Resist_Lightning", "learn_level": 19, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 2 }, { - "spell_id": 7, + "spell_tag": "Resist_Acid", "learn_level": 21, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 2 }, { - "spell_id": 8, + "spell_tag": "See_Invisibility", "learn_level": 25, "mana_cost": 20, "difficulty": 55, "first_cast_exp_rate": 2 }, { - "spell_id": 9, + "spell_tag": "Remove_Curse", "learn_level": 29, "mana_cost": 23, "difficulty": 60, "first_cast_exp_rate": 2 }, { - "spell_id": 10, + "spell_tag": "Resist_Poison", "learn_level": 32, "mana_cost": 27, "difficulty": 65, "first_cast_exp_rate": 3 }, { - "spell_id": 11, + "spell_tag": "Berserk", "learn_level": 36, "mana_cost": 31, "difficulty": 75, "first_cast_exp_rate": 40 }, { - "spell_id": 12, + "spell_tag": "Self_Knowledge", "learn_level": 38, "mana_cost": 26, "difficulty": 70, "first_cast_exp_rate": 25 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 41, "mana_cost": 40, "difficulty": 70, "first_cast_exp_rate": 2 }, { - "spell_id": 14, + "spell_tag": "Cure", "learn_level": 44, "mana_cost": 38, "difficulty": 55, "first_cast_exp_rate": 3 }, { - "spell_id": 15, + "spell_tag": "Mana_Branding", "learn_level": 46, "mana_cost": 70, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 16, + "spell_tag": "Telepathy", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Resistance", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Haste_Self", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 20, + "spell_tag": "Walk_through_Wall", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 21, + "spell_tag": "Polish_Shield", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 22, + "spell_tag": "Create_Golem", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Magical_armor", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Remove_Enchantment", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 25, + "spell_tag": "Remove_All_Curse", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 26, + "spell_tag": "Knowledge_True", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Enchant_Weapon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "Enchant_Armor", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Brand_Weapon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Living_Trump", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Immunity", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -18545,224 +18545,224 @@ "name": "DEMON", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Magic_Missile", "learn_level": 3, "mana_cost": 2, "difficulty": 20, "first_cast_exp_rate": 1 }, { - "spell_id": 1, + "spell_tag": "Detect_Unlife", "learn_level": 5, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Evil_Bless", "learn_level": 7, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 3, + "spell_tag": "Resist_Fire", "learn_level": 10, "mana_cost": 8, "difficulty": 45, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Fire_Bolt", "learn_level": 20, "mana_cost": 12, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 5, + "spell_tag": "Summon_Manes", "learn_level": 23, "mana_cost": 18, "difficulty": 60, "first_cast_exp_rate": 3 }, { - "spell_id": 6, + "spell_tag": "Nether_Ball", "learn_level": 25, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Raise_the_Morale", "learn_level": 26, "mana_cost": 15, "difficulty": 66, "first_cast_exp_rate": 2 }, { - "spell_id": 8, + "spell_tag": "Vision", "learn_level": 32, "mana_cost": 29, "difficulty": 70, "first_cast_exp_rate": 13 }, { - "spell_id": 9, + "spell_tag": "Resist_Nether", "learn_level": 35, "mana_cost": 33, "difficulty": 70, "first_cast_exp_rate": 10 }, { - "spell_id": 10, + "spell_tag": "Plasma_bolt", "learn_level": 38, "mana_cost": 36, "difficulty": 75, "first_cast_exp_rate": 15 }, { - "spell_id": 11, + "spell_tag": "Fire_Ball", "learn_level": 41, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 15 }, { - "spell_id": 12, + "spell_tag": "Fire_Branding", "learn_level": 42, "mana_cost": 90, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Demonfire", "learn_level": 44, "mana_cost": 58, "difficulty": 85, "first_cast_exp_rate": 15 }, { - "spell_id": 14, + "spell_tag": "Summon_Demon", "learn_level": 49, "mana_cost": 111, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 15, + "spell_tag": "Nether_Wave", "learn_level": 49, "mana_cost": 58, "difficulty": 80, "first_cast_exp_rate": 0 }, { - "spell_id": 16, + "spell_tag": "Devilish_Eye", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 17, + "spell_tag": "Devil_Cloak", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Lava_Flow", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Plasma_Ball", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 20, + "spell_tag": "Polymorph_Demon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 21, + "spell_tag": "Fireblast", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 22, + "spell_tag": "Succubuss_Kiss", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Doom_Hand", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Immortal_Body", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 25, + "spell_tag": "Insanity_Circle", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 26, + "spell_tag": "Explode_Pets", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Summon_Greater_Demon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "Fire_Storm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Nether_Storm", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Bloody_Curse", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Polymorph_Demonlord", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -18774,224 +18774,224 @@ "name": "CRUSADE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Punishment", "learn_level": 2, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Evil", "learn_level": 3, "mana_cost": 3, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Remove_Fear", "learn_level": 7, "mana_cost": 8, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Scare_Monster", "learn_level": 12, "mana_cost": 11, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Sanctuary", "learn_level": 16, "mana_cost": 16, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Portal", "learn_level": 19, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Star_Dust", "learn_level": 22, "mana_cost": 22, "difficulty": 55, "first_cast_exp_rate": 6 }, { - "spell_id": 7, + "spell_tag": "Purify", "learn_level": 25, "mana_cost": 19, "difficulty": 60, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Scatter_Evil", "learn_level": 27, "mana_cost": 27, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Holy_Orb", "learn_level": 29, "mana_cost": 28, "difficulty": 80, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Exorcism", "learn_level": 33, "mana_cost": 32, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Remove_Curse", "learn_level": 35, "mana_cost": 30, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Unseen", "learn_level": 37, "mana_cost": 37, "difficulty": 70, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 40, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Judgment_Thunder", "learn_level": 45, "mana_cost": 55, "difficulty": 85, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Holy_Word", "learn_level": 48, "mana_cost": 65, "difficulty": 80, "first_cast_exp_rate": 20 }, { - "spell_id": 16, + "spell_tag": "Unbarring_Ways", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 17, + "spell_tag": "Arrest", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 18, + "spell_tag": "Holy_Aura", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 19, + "spell_tag": "Dispel_Undead_and_Demons", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 20, + "spell_tag": "Dispel_Evil", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 21, + "spell_tag": "Holy_Blade", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 22, + "spell_tag": "Star_Burst", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 23, + "spell_tag": "Summon_Angel", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 24, + "spell_tag": "Heroism", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 25, + "spell_tag": "Dispel_Curse", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 26, + "spell_tag": "Banish_Evil", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 27, + "spell_tag": "Armageddon", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 28, + "spell_tag": "An_Eye_for_an_Eye", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 29, + "spell_tag": "Wrath_of_the_God", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 30, + "spell_tag": "Divine_Intervention", "learn_level": 99, "mana_cost": 0, "difficulty": 0, "first_cast_exp_rate": 0 }, { - "spell_id": 31, + "spell_tag": "Crusade", "learn_level": 99, "mana_cost": 0, "difficulty": 0, @@ -19026,224 +19026,224 @@ "name": "LIFE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Cure_Light_Wounds", "learn_level": 1, "mana_cost": 1, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Bless", "learn_level": 2, "mana_cost": 2, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Cause_Light_Wounds", "learn_level": 3, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Call_Light", "learn_level": 4, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Detect_Doors_And_Traps", "learn_level": 5, "mana_cost": 5, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Cure_Medium_Wounds", "learn_level": 8, "mana_cost": 6, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Cure_Poison", "learn_level": 11, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Satisfy_Hunger", "learn_level": 13, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Remove_Curse", "learn_level": 15, "mana_cost": 12, "difficulty": 45, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Cause_Medium_Wounds", "learn_level": 16, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cure_Critical_Wounds", "learn_level": 17, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Resist_Heat_and_Cold", "learn_level": 18, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Sense_Surroundings", "learn_level": 19, "mana_cost": 16, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Turn_Undead", "learn_level": 20, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Healing", "learn_level": 30, "mana_cost": 25, "difficulty": 55, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Rune_of_Protection", "learn_level": 35, "mana_cost": 70, "difficulty": 75, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Dispel_Curse", "learn_level": 26, "mana_cost": 26, "difficulty": 50, "first_cast_exp_rate": 75 }, { - "spell_id": 17, + "spell_tag": "Perception", "learn_level": 28, "mana_cost": 25, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 18, + "spell_tag": "Dispel_Undead", "learn_level": 32, "mana_cost": 32, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 19, + "spell_tag": "Day_of_the_Dove", "learn_level": 35, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 75 }, { - "spell_id": 20, + "spell_tag": "Cause_Critical_Wounds", "learn_level": 35, "mana_cost": 35, "difficulty": 70, "first_cast_exp_rate": 75 }, { - "spell_id": 21, + "spell_tag": "Word_of_Recall", "learn_level": 35, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 22, + "spell_tag": "Alter_Reality", "learn_level": 39, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 23, + "spell_tag": "Warding_True", "learn_level": 46, "mana_cost": 64, "difficulty": 80, "first_cast_exp_rate": 150 }, { - "spell_id": 24, + "spell_tag": "Sterilization", "learn_level": 9, "mana_cost": 15, "difficulty": 50, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Detection", "learn_level": 25, "mana_cost": 25, "difficulty": 50, "first_cast_exp_rate": 50 }, { - "spell_id": 26, + "spell_tag": "Annihilate_Undead", "learn_level": 35, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 27, + "spell_tag": "Clairvoyance", "learn_level": 42, "mana_cost": 84, "difficulty": 80, "first_cast_exp_rate": 225 }, { - "spell_id": 28, + "spell_tag": "Restoration", "learn_level": 45, "mana_cost": 64, "difficulty": 80, "first_cast_exp_rate": 115 }, { - "spell_id": 29, + "spell_tag": "Healing_True", "learn_level": 48, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Holy_Vision", "learn_level": 49, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Ultimate_Resistance", "learn_level": 50, "mana_cost": 100, "difficulty": 80, @@ -19255,224 +19255,224 @@ "name": "NATURE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Creatures", "learn_level": 1, "mana_cost": 1, "difficulty": 35, "first_cast_exp_rate": 2 }, { - "spell_id": 1, + "spell_tag": "Lightning", "learn_level": 3, "mana_cost": 3, "difficulty": 40, "first_cast_exp_rate": 2 }, { - "spell_id": 2, + "spell_tag": "Detect_Doors_and_Traps", "learn_level": 4, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Produce_Food", "learn_level": 5, "mana_cost": 5, "difficulty": 55, "first_cast_exp_rate": 2 }, { - "spell_id": 4, + "spell_tag": "Daylight", "learn_level": 6, "mana_cost": 6, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 5, + "spell_tag": "Animal_Taming", "learn_level": 7, "mana_cost": 7, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 6, + "spell_tag": "Resist_Environment", "learn_level": 8, "mana_cost": 8, "difficulty": 50, "first_cast_exp_rate": 3 }, { - "spell_id": 7, + "spell_tag": "Cure_Wounds_And_Poison", "learn_level": 9, "mana_cost": 9, "difficulty": 45, "first_cast_exp_rate": 3 }, { - "spell_id": 8, + "spell_tag": "Stone_to_Mud", "learn_level": 10, "mana_cost": 8, "difficulty": 80, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Frost_Bolt", "learn_level": 11, "mana_cost": 9, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 10, + "spell_tag": "Nature_Awareness", "learn_level": 12, "mana_cost": 10, "difficulty": 40, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Fire_Bolt", "learn_level": 14, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 12, + "spell_tag": "Ray_of_Sunlight", "learn_level": 16, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Entangle", "learn_level": 18, "mana_cost": 15, "difficulty": 65, "first_cast_exp_rate": 8 }, { - "spell_id": 14, + "spell_tag": "Summon_Animal", "learn_level": 31, "mana_cost": 31, "difficulty": 75, "first_cast_exp_rate": 10 }, { - "spell_id": 15, + "spell_tag": "Herbal_Healing", "learn_level": 40, "mana_cost": 60, "difficulty": 90, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Stair_Building", "learn_level": 12, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 25 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 15, "mana_cost": 15, "difficulty": 70, "first_cast_exp_rate": 60 }, { - "spell_id": 18, + "spell_tag": "Resistance_True", "learn_level": 20, "mana_cost": 22, "difficulty": 85, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Forest_Creation", "learn_level": 25, "mana_cost": 30, "difficulty": 85, "first_cast_exp_rate": 40 }, { - "spell_id": 20, + "spell_tag": "Animal_Friendship", "learn_level": 35, "mana_cost": 35, "difficulty": 80, "first_cast_exp_rate": 80 }, { - "spell_id": 21, + "spell_tag": "Stone_Tell", "learn_level": 40, "mana_cost": 40, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 22, + "spell_tag": "Wall_of_Stone", "learn_level": 45, "mana_cost": 48, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 23, + "spell_tag": "Protect_from_Corrosion", "learn_level": 49, "mana_cost": 80, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 24, + "spell_tag": "Earthquake", "learn_level": 25, "mana_cost": 25, "difficulty": 60, "first_cast_exp_rate": 150 }, { - "spell_id": 25, + "spell_tag": "Whirlwind", "learn_level": 27, "mana_cost": 27, "difficulty": 60, "first_cast_exp_rate": 160 }, { - "spell_id": 26, + "spell_tag": "Blizzard", "learn_level": 28, "mana_cost": 28, "difficulty": 75, "first_cast_exp_rate": 125 }, { - "spell_id": 27, + "spell_tag": "Lightning_Storm", "learn_level": 33, "mana_cost": 33, "difficulty": 75, "first_cast_exp_rate": 35 }, { - "spell_id": 28, + "spell_tag": "Whirlpool", "learn_level": 38, "mana_cost": 38, "difficulty": 75, "first_cast_exp_rate": 45 }, { - "spell_id": 29, + "spell_tag": "Call_Sunlight", "learn_level": 41, "mana_cost": 40, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Elemental_Branding", "learn_level": 45, "mana_cost": 85, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Natures_Wrath", "learn_level": 48, "mana_cost": 85, "difficulty": 75, @@ -19484,224 +19484,224 @@ "name": "DEATH", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Detect_Unlife", "learn_level": 1, "mana_cost": 1, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Malediction", "learn_level": 2, "mana_cost": 2, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Detect_Evil", "learn_level": 3, "mana_cost": 3, "difficulty": 25, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Stinking_Cloud", "learn_level": 4, "mana_cost": 4, "difficulty": 27, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Black_Sleep", "learn_level": 7, "mana_cost": 7, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Resist_Poison", "learn_level": 9, "mana_cost": 10, "difficulty": 75, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Horrify", "learn_level": 10, "mana_cost": 10, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Enslave_Undead", "learn_level": 12, "mana_cost": 12, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "Orb_of_Entropy", "learn_level": 14, "mana_cost": 14, "difficulty": 40, "first_cast_exp_rate": 5 }, { - "spell_id": 9, + "spell_tag": "Nether_Bolt", "learn_level": 16, "mana_cost": 16, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Cloud_kill", "learn_level": 21, "mana_cost": 21, "difficulty": 50, "first_cast_exp_rate": 10 }, { - "spell_id": 11, + "spell_tag": "Genocide_One", "learn_level": 27, "mana_cost": 27, "difficulty": 85, "first_cast_exp_rate": 30 }, { - "spell_id": 12, + "spell_tag": "Poison_Branding", "learn_level": 33, "mana_cost": 75, "difficulty": 90, "first_cast_exp_rate": 30 }, { - "spell_id": 13, + "spell_tag": "Vampiric_Bolt", "learn_level": 36, "mana_cost": 35, "difficulty": 60, "first_cast_exp_rate": 16 }, { - "spell_id": 14, + "spell_tag": "Animate_dead", "learn_level": 44, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 70 }, { - "spell_id": 15, + "spell_tag": "Genocide", "learn_level": 46, "mana_cost": 45, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 16, + "spell_tag": "Berserk", "learn_level": 10, "mana_cost": 22, "difficulty": 80, "first_cast_exp_rate": 180 }, { - "spell_id": 17, + "spell_tag": "Invoke_Spirits", "learn_level": 12, "mana_cost": 18, "difficulty": 80, "first_cast_exp_rate": 30 }, { - "spell_id": 18, + "spell_tag": "Dark_Bolt", "learn_level": 14, "mana_cost": 18, "difficulty": 30, "first_cast_exp_rate": 15 }, { - "spell_id": 19, + "spell_tag": "Battle_Frenzy", "learn_level": 30, "mana_cost": 30, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 20, + "spell_tag": "Vampiric_Branding", "learn_level": 42, "mana_cost": 90, "difficulty": 70, "first_cast_exp_rate": 90 }, { - "spell_id": 21, + "spell_tag": "Vampiric_Bolts", "learn_level": 43, "mana_cost": 40, "difficulty": 60, "first_cast_exp_rate": 125 }, { - "spell_id": 22, + "spell_tag": "Nether_Wave", "learn_level": 43, "mana_cost": 44, "difficulty": 70, "first_cast_exp_rate": 40 }, { - "spell_id": 23, + "spell_tag": "Darkness_Storm", "learn_level": 45, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Death_Ray", "learn_level": 24, "mana_cost": 24, "difficulty": 75, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Raise_the_Dead", "learn_level": 33, "mana_cost": 85, "difficulty": 85, "first_cast_exp_rate": 220 }, { - "spell_id": 26, + "spell_tag": "Secrets_of_the_Dead", "learn_level": 35, "mana_cost": 45, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 27, + "spell_tag": "Polymorph_Vampire", "learn_level": 39, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Restore_Life", "learn_level": 46, "mana_cost": 55, "difficulty": 75, "first_cast_exp_rate": 150 }, { - "spell_id": 29, + "spell_tag": "Mass_Genocide", "learn_level": 48, "mana_cost": 80, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 30, + "spell_tag": "Hellfire", "learn_level": 50, "mana_cost": 110, "difficulty": 95, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Wraithform", "learn_level": 50, "mana_cost": 115, "difficulty": 95, @@ -19713,224 +19713,224 @@ "name": "CRAFT", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Infravision", "learn_level": 1, "mana_cost": 2, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Regeneration", "learn_level": 3, "mana_cost": 3, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Satisfy_Hunger", "learn_level": 5, "mana_cost": 4, "difficulty": 40, "first_cast_exp_rate": 3 }, { - "spell_id": 3, + "spell_tag": "Resist_Cold", "learn_level": 7, "mana_cost": 8, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 4, + "spell_tag": "Resist_Fire", "learn_level": 8, "mana_cost": 8, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 5, + "spell_tag": "Heroism", "learn_level": 10, "mana_cost": 10, "difficulty": 50, "first_cast_exp_rate": 6 }, { - "spell_id": 6, + "spell_tag": "Resist_Lightning", "learn_level": 12, "mana_cost": 8, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 7, + "spell_tag": "Resist_Acid", "learn_level": 13, "mana_cost": 8, "difficulty": 45, "first_cast_exp_rate": 5 }, { - "spell_id": 8, + "spell_tag": "See_Invisibility", "learn_level": 15, "mana_cost": 17, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Remove_Curse", "learn_level": 20, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Resist_Poison", "learn_level": 22, "mana_cost": 22, "difficulty": 65, "first_cast_exp_rate": 6 }, { - "spell_id": 11, + "spell_tag": "Berserk", "learn_level": 25, "mana_cost": 24, "difficulty": 80, "first_cast_exp_rate": 80 }, { - "spell_id": 12, + "spell_tag": "Self_Knowledge", "learn_level": 26, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 50 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 31, "mana_cost": 30, "difficulty": 60, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Cure", "learn_level": 34, "mana_cost": 28, "difficulty": 55, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Mana_Branding", "learn_level": 44, "mana_cost": 80, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 16, + "spell_tag": "Telepathy", "learn_level": 16, "mana_cost": 16, "difficulty": 55, "first_cast_exp_rate": 12 }, { - "spell_id": 17, + "spell_tag": "Stone_Skin", "learn_level": 18, "mana_cost": 13, "difficulty": 70, "first_cast_exp_rate": 120 }, { - "spell_id": 18, + "spell_tag": "Resistance", "learn_level": 24, "mana_cost": 25, "difficulty": 85, "first_cast_exp_rate": 60 }, { - "spell_id": 19, + "spell_tag": "Haste_Self", "learn_level": 28, "mana_cost": 18, "difficulty": 70, "first_cast_exp_rate": 10 }, { - "spell_id": 20, + "spell_tag": "Walk_through_Wall", "learn_level": 35, "mana_cost": 60, "difficulty": 80, "first_cast_exp_rate": 50 }, { - "spell_id": 21, + "spell_tag": "Polish_Shield", "learn_level": 38, "mana_cost": 85, "difficulty": 90, "first_cast_exp_rate": 150 }, { - "spell_id": 22, + "spell_tag": "Create_Golem", "learn_level": 45, "mana_cost": 100, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 23, + "spell_tag": "Magical_armor", "learn_level": 48, "mana_cost": 65, "difficulty": 75, "first_cast_exp_rate": 200 }, { - "spell_id": 24, + "spell_tag": "Remove_Enchantment", "learn_level": 17, "mana_cost": 17, "difficulty": 70, "first_cast_exp_rate": 50 }, { - "spell_id": 25, + "spell_tag": "Remove_All_Curse", "learn_level": 33, "mana_cost": 34, "difficulty": 70, "first_cast_exp_rate": 150 }, { - "spell_id": 26, + "spell_tag": "Knowledge_True", "learn_level": 40, "mana_cost": 55, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 27, + "spell_tag": "Enchant_Weapon", "learn_level": 40, "mana_cost": 85, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 28, + "spell_tag": "Enchant_Armor", "learn_level": 43, "mana_cost": 100, "difficulty": 95, "first_cast_exp_rate": 200 }, { - "spell_id": 29, + "spell_tag": "Brand_Weapon", "learn_level": 45, "mana_cost": 110, "difficulty": 80, "first_cast_exp_rate": 250 }, { - "spell_id": 30, + "spell_tag": "Living_Trump", "learn_level": 47, "mana_cost": 120, "difficulty": 90, "first_cast_exp_rate": 250 }, { - "spell_id": 31, + "spell_tag": "Immunity", "learn_level": 50, "mana_cost": 75, "difficulty": 90, @@ -19942,224 +19942,224 @@ "name": "CRUSADE", "spells_info": [ { - "spell_id": 0, + "spell_tag": "Punishment", "learn_level": 1, "mana_cost": 1, "difficulty": 20, "first_cast_exp_rate": 4 }, { - "spell_id": 1, + "spell_tag": "Detect_Evil", "learn_level": 3, "mana_cost": 1, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 2, + "spell_tag": "Remove_Fear", "learn_level": 5, "mana_cost": 4, "difficulty": 35, "first_cast_exp_rate": 4 }, { - "spell_id": 3, + "spell_tag": "Scare_Monster", "learn_level": 8, "mana_cost": 8, "difficulty": 30, "first_cast_exp_rate": 4 }, { - "spell_id": 4, + "spell_tag": "Sanctuary", "learn_level": 9, "mana_cost": 9, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 5, + "spell_tag": "Portal", "learn_level": 13, "mana_cost": 12, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 6, + "spell_tag": "Star_Dust", "learn_level": 15, "mana_cost": 14, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 7, + "spell_tag": "Purify", "learn_level": 17, "mana_cost": 12, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 8, + "spell_tag": "Scatter_Evil", "learn_level": 18, "mana_cost": 18, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 9, + "spell_tag": "Holy_Orb", "learn_level": 22, "mana_cost": 19, "difficulty": 55, "first_cast_exp_rate": 4 }, { - "spell_id": 10, + "spell_tag": "Exorcism", "learn_level": 24, "mana_cost": 22, "difficulty": 50, "first_cast_exp_rate": 4 }, { - "spell_id": 11, + "spell_tag": "Remove_Curse", "learn_level": 27, "mana_cost": 25, "difficulty": 80, "first_cast_exp_rate": 5 }, { - "spell_id": 12, + "spell_tag": "Sense_Unseen", "learn_level": 29, "mana_cost": 28, "difficulty": 65, "first_cast_exp_rate": 4 }, { - "spell_id": 13, + "spell_tag": "Protection_from_Evil", "learn_level": 34, "mana_cost": 28, "difficulty": 65, "first_cast_exp_rate": 4 }, { - "spell_id": 14, + "spell_tag": "Judgment_Thunder", "learn_level": 43, "mana_cost": 43, "difficulty": 85, "first_cast_exp_rate": 5 }, { - "spell_id": 15, + "spell_tag": "Holy_Word", "learn_level": 40, "mana_cost": 40, "difficulty": 85, "first_cast_exp_rate": 5 }, { - "spell_id": 16, + "spell_tag": "Unbarring_Ways", "learn_level": 8, "mana_cost": 8, "difficulty": 33, "first_cast_exp_rate": 40 }, { - "spell_id": 17, + "spell_tag": "Arrest", "learn_level": 20, "mana_cost": 20, "difficulty": 60, "first_cast_exp_rate": 50 }, { - "spell_id": 18, + "spell_tag": "Holy_Aura", "learn_level": 25, "mana_cost": 21, "difficulty": 65, "first_cast_exp_rate": 70 }, { - "spell_id": 19, + "spell_tag": "Dispel_Undead_and_Demons", "learn_level": 28, "mana_cost": 28, "difficulty": 60, "first_cast_exp_rate": 70 }, { - "spell_id": 20, + "spell_tag": "Dispel_Evil", "learn_level": 35, "mana_cost": 32, "difficulty": 70, "first_cast_exp_rate": 100 }, { - "spell_id": 21, + "spell_tag": "Holy_Blade", "learn_level": 38, "mana_cost": 80, "difficulty": 95, "first_cast_exp_rate": 100 }, { - "spell_id": 22, + "spell_tag": "Star_Burst", "learn_level": 46, "mana_cost": 55, "difficulty": 80, "first_cast_exp_rate": 100 }, { - "spell_id": 23, + "spell_tag": "Summon_Angel", "learn_level": 48, "mana_cost": 111, "difficulty": 85, "first_cast_exp_rate": 150 }, { - "spell_id": 24, + "spell_tag": "Heroism", "learn_level": 10, "mana_cost": 10, "difficulty": 66, "first_cast_exp_rate": 40 }, { - "spell_id": 25, + "spell_tag": "Dispel_Curse", "learn_level": 35, "mana_cost": 45, "difficulty": 80, "first_cast_exp_rate": 125 }, { - "spell_id": 26, + "spell_tag": "Banish_Evil", "learn_level": 36, "mana_cost": 33, "difficulty": 75, "first_cast_exp_rate": 100 }, { - "spell_id": 27, + "spell_tag": "Armageddon", "learn_level": 42, "mana_cost": 40, "difficulty": 80, "first_cast_exp_rate": 75 }, { - "spell_id": 28, + "spell_tag": "An_Eye_for_an_Eye", "learn_level": 44, "mana_cost": 50, "difficulty": 80, "first_cast_exp_rate": 75 }, { - "spell_id": 29, + "spell_tag": "Wrath_of_the_God", "learn_level": 47, "mana_cost": 80, "difficulty": 90, "first_cast_exp_rate": 100 }, { - "spell_id": 30, + "spell_tag": "Divine_Intervention", "learn_level": 48, "mana_cost": 100, "difficulty": 90, "first_cast_exp_rate": 200 }, { - "spell_id": 31, + "spell_tag": "Crusade", "learn_level": 50, "mana_cost": 100, "difficulty": 80, @@ -20258,4 +20258,4 @@ "realms": [] } ] -} +} \ No newline at end of file diff --git a/schema/ClassMagicDefinitions.schema.json b/schema/ClassMagicDefinitions.schema.json index 87de1361bc..77210e0a67 100644 --- a/schema/ClassMagicDefinitions.schema.json +++ b/schema/ClassMagicDefinitions.schema.json @@ -144,18 +144,16 @@ "description": "呪文情報", "additionalProperties": false, "required": [ - "spell_id", + "spell_tag", "learn_level", "mana_cost", "difficulty", "first_cast_exp_rate" ], "properties": { - "spell_id": { - "type": "integer", - "description": "呪文番号", - "minimum": 0, - "maximum": 31 + "spell_tag": { + "type": "string", + "description": "呪文タグ" }, "learn_level": { "type": "integer", diff --git a/src/info-reader/magic-reader.cpp b/src/info-reader/magic-reader.cpp index b1a0a12c36..ce48e516f3 100644 --- a/src/info-reader/magic-reader.cpp +++ b/src/info-reader/magic-reader.cpp @@ -153,12 +153,15 @@ static errr set_magic_status(const nlohmann::json &class_data, player_magic &mag */ static errr set_spell_data(const nlohmann::json &spell_data, player_magic &magics_info, int realm_id) { - int spell_id; - if (auto err = info_set_integer(spell_data["spell_id"], spell_id, true, Range(0, 31))) { - msg_format(_("呪文ID読込失敗。ID: '%d'。", "Failed to load spell ID. ID: '%d'."), error_idx); - return err; + const auto &spell_tag_obj = spell_data["spell_tag"]; + if (!spell_tag_obj.is_string()) { + return PARSE_ERROR_TOO_FEW_ARGUMENTS; + } + const auto spell_id = SpellInfoList::get_instance().get_spell_id(realm_id + 1, spell_tag_obj.get()); + if (!spell_id) { + return PARSE_ERROR_INVALID_FLAG; } - auto &info = magics_info.info[realm_id][spell_id]; + auto &info = magics_info.info[realm_id][*spell_id]; if (auto err = info_set_integer(spell_data["learn_level"], info.slevel, true, Range(0, 99))) { msg_format(_("呪文学習レベル読込失敗。ID: '%d'。", "Failed to load spell learn_level. ID: '%d'."), error_idx); diff --git a/src/system/spell-info-list.cpp b/src/system/spell-info-list.cpp index ba993b2b4a..b42ae6ba89 100644 --- a/src/system/spell-info-list.cpp +++ b/src/system/spell-info-list.cpp @@ -1,5 +1,6 @@ #include "system/spell-info-list.h" #include "realm/realm-types.h" +#include SpellInfoList SpellInfoList::instance{}; @@ -12,3 +13,16 @@ SpellInfoList &SpellInfoList::get_instance() { return instance; } + +std::optional SpellInfoList::get_spell_id(int realm_id, std::string_view spell_tag) +{ + const auto &realm = this->spell_list[realm_id]; + const auto result = std::find_if(realm.begin(), realm.end(), [spell_tag](auto &spell_info) { + return spell_info.tag == spell_tag; + }); + + if (result == realm.end()) { + return std::nullopt; + } + return (*result).idx; +} diff --git a/src/system/spell-info-list.h b/src/system/spell-info-list.h index a12fc939eb..87c51b41f5 100644 --- a/src/system/spell-info-list.h +++ b/src/system/spell-info-list.h @@ -1,5 +1,6 @@ #pragma once +#include "realm/realm-types.h" #include "system/angband.h" #include "util/flag-group.h" #include @@ -47,6 +48,8 @@ class SpellInfoList { static SpellInfoList &get_instance(); std::vector> spell_list{}; + std::optional get_spell_id(int realm, std::string_view spell_tag); + private: SpellInfoList() = default; From d43c2669c975d0948a7837bf9b23316733e19088 Mon Sep 17 00:00:00 2001 From: Habu Date: Tue, 2 Jul 2024 22:33:10 +0900 Subject: [PATCH 09/16] =?UTF-8?q?[Reafctor]=20=E7=89=B9=E5=AE=9A=E3=81=AE?= =?UTF-8?q?=E9=A0=98=E5=9F=9F=E3=81=8B=E3=81=A9=E3=81=86=E3=81=8B=E3=82=92?= =?UTF-8?q?=E8=AA=BF=E3=81=B9=E3=82=8B=E5=88=A4=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PlayerRealm::Realmクラスにメンバ関数equalsを実装し、現在PlayerTypeの データメンバrealm1およびrealm2との直接比較によって特定の領域であるかを 調べている箇所を置き換える。 また、呪術ハイメイジ専用処理で第1領域がREALM_HEXであるかどうかを調べて いる箇所は特別に多いので、PlayerRealmクラスにメンバ関数is_realm_hexを 実装し、この関数によりチェックするようにする。 --- src/cmd-action/cmd-spell.cpp | 12 +++++++----- src/knowledge/knowledge-experiences.cpp | 2 +- src/player-ability/player-constitution.cpp | 3 ++- src/player-ability/player-dexterity.cpp | 3 ++- src/player-ability/player-strength.cpp | 3 ++- src/player-base/player-class.cpp | 3 ++- src/player-info/class-ability-info.cpp | 2 +- src/player-status/player-speed.cpp | 3 ++- src/player-status/player-stealth.cpp | 3 ++- src/player/player-realm.cpp | 10 ++++++++++ src/player/player-realm.h | 2 ++ src/player/player-skill.cpp | 10 ++++++---- src/player/player-status-flags.cpp | 6 +++--- src/player/player-status.cpp | 6 +++--- src/racial/class-racial-switcher.cpp | 2 +- src/racial/racial-switcher.cpp | 2 +- src/spell/spell-info.cpp | 18 ++++++++++-------- src/view/object-describer.cpp | 2 +- src/window/main-window-stat-poster.cpp | 3 ++- 19 files changed, 60 insertions(+), 35 deletions(-) diff --git a/src/cmd-action/cmd-spell.cpp b/src/cmd-action/cmd-spell.cpp index fdefc77606..56cc034b80 100644 --- a/src/cmd-action/cmd-spell.cpp +++ b/src/cmd-action/cmd-spell.cpp @@ -273,7 +273,8 @@ static bool spell_okay(PlayerType *player_ptr, int spell_id, bool learned, bool } /* Spell is forgotten */ - if ((use_realm == player_ptr->realm2) ? (player_ptr->spell_forgotten2 & (1UL << spell_id)) : (player_ptr->spell_forgotten1 & (1UL << spell_id))) { + PlayerRealm pr(player_ptr); + if (pr.realm2().equals(use_realm) ? (player_ptr->spell_forgotten2 & (1UL << spell_id)) : (player_ptr->spell_forgotten1 & (1UL << spell_id))) { /* Never okay */ return false; } @@ -283,7 +284,7 @@ static bool spell_okay(PlayerType *player_ptr, int spell_id, bool learned, bool } /* Spell is learned */ - if ((use_realm == player_ptr->realm2) ? (player_ptr->spell_learned2 & (1UL << spell_id)) : (player_ptr->spell_learned1 & (1UL << spell_id))) { + if (pr.realm2().equals(use_realm) ? (player_ptr->spell_learned2 & (1UL << spell_id)) : (player_ptr->spell_learned1 & (1UL << spell_id))) { /* Always true */ return !study_pray; } @@ -357,8 +358,9 @@ static int get_spell(PlayerType *player_ptr, SPELL_IDX *sn, std::string_view pro } PlayerClass pc(player_ptr); + PlayerRealm pr(player_ptr); auto is_every_magic = pc.is_every_magic(); - if (((use_realm) != player_ptr->realm1) && ((use_realm) != player_ptr->realm2) && !is_every_magic) { + if (!pr.realm1().equals(use_realm) && !pr.realm2().equals(use_realm) && !is_every_magic) { return false; } if (is_every_magic && !is_magic(use_realm)) { @@ -964,7 +966,7 @@ bool do_cmd_cast(PlayerType *player_ptr) return false; } - if (player_ptr->realm1 == REALM_HEX) { + if (pr.is_realm_hex()) { if (SpellHex(player_ptr).is_casting_full_capacity()) { auto flag = false; msg_print(_("これ以上新しい呪文を詠唱することはできない。", "Can not cast more spells.")); @@ -1172,7 +1174,7 @@ bool do_cmd_cast(PlayerType *player_ptr) int e = spell.sexp; /* The spell worked */ - if (realm == player_ptr->realm1) { + if (pr.realm1().equals(realm)) { player_ptr->spell_worked1 |= (1UL << spell_id); } else { player_ptr->spell_worked2 |= (1UL << spell_id); diff --git a/src/knowledge/knowledge-experiences.cpp b/src/knowledge/knowledge-experiences.cpp index 24ad048cb6..fa2dd49e2e 100644 --- a/src/knowledge/knowledge-experiences.cpp +++ b/src/knowledge/knowledge-experiences.cpp @@ -97,7 +97,7 @@ void do_cmd_knowledge_spell_exp(PlayerType *player_ptr) auto skill_rank = PlayerSkill::spell_skill_rank(spell_exp); const auto spell_name = exe_spell(player_ptr, player_ptr->realm1, i, SpellProcessType::NAME); fprintf(fff, "%-25s ", spell_name->data()); - if (player_ptr->realm1 == REALM_HISSATSU) { + if (pr.realm1().equals(REALM_HISSATSU)) { if (show_actual_value) { fprintf(fff, "----/---- "); } diff --git a/src/player-ability/player-constitution.cpp b/src/player-ability/player-constitution.cpp index de3d0f7cd2..a7dde489db 100644 --- a/src/player-ability/player-constitution.cpp +++ b/src/player-ability/player-constitution.cpp @@ -6,6 +6,7 @@ #include "player-info/monk-data-type.h" #include "player-info/samurai-data-type.h" #include "player/player-personality.h" +#include "player/player-realm.h" #include "player/race-info-table.h" #include "player/special-defense-types.h" #include "realm/realm-hex-numbers.h" @@ -51,7 +52,7 @@ int16_t PlayerConstitution::time_effect_bonus() { int16_t result = 0; - if (this->player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(this->player_ptr).is_realm_hex()) { if (SpellHex(this->player_ptr).is_spelling_specific(HEX_BUILDING)) { result += 4; } diff --git a/src/player-ability/player-dexterity.cpp b/src/player-ability/player-dexterity.cpp index 70a49adb7c..8756f22599 100644 --- a/src/player-ability/player-dexterity.cpp +++ b/src/player-ability/player-dexterity.cpp @@ -6,6 +6,7 @@ #include "player-info/monk-data-type.h" #include "player-info/samurai-data-type.h" #include "player/player-personality.h" +#include "player/player-realm.h" #include "player/race-info-table.h" #include "player/special-defense-types.h" #include "realm/realm-hex-numbers.h" @@ -51,7 +52,7 @@ int16_t PlayerDexterity::time_effect_bonus() { int16_t result = 0; - if (this->player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(this->player_ptr).is_realm_hex()) { if (SpellHex(this->player_ptr).is_spelling_specific(HEX_BUILDING)) { result += 4; } diff --git a/src/player-ability/player-strength.cpp b/src/player-ability/player-strength.cpp index b9b16a7f73..7fc6e9a798 100644 --- a/src/player-ability/player-strength.cpp +++ b/src/player-ability/player-strength.cpp @@ -5,6 +5,7 @@ #include "player-info/monk-data-type.h" #include "player-info/samurai-data-type.h" #include "player/player-personality.h" +#include "player/player-realm.h" #include "player/race-info-table.h" #include "player/special-defense-types.h" #include "realm/realm-hex-numbers.h" @@ -53,7 +54,7 @@ int16_t PlayerStrength::time_effect_bonus() { int16_t result = 0; - if (this->player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(this->player_ptr).is_realm_hex()) { SpellHex spell_hex(this->player_ptr); if (spell_hex.is_spelling_specific(HEX_XTRA_MIGHT)) { result += 4; diff --git a/src/player-base/player-class.cpp b/src/player-base/player-class.cpp index a45eb6e541..4146bf3c02 100644 --- a/src/player-base/player-class.cpp +++ b/src/player-base/player-class.cpp @@ -21,6 +21,7 @@ #include "player-info/sniper-data-type.h" #include "player-info/spell-hex-data-type.h" #include "player/attack-defense-types.h" +#include "player/player-realm.h" #include "player/player-status-flags.h" #include "player/special-defense-types.h" #include "realm/realm-types.h" @@ -518,7 +519,7 @@ void PlayerClass::init_specific_data() this->player_ptr->class_specific_data = std::make_shared(); break; case PlayerClassType::HIGH_MAGE: - if (this->player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(this->player_ptr).is_realm_hex()) { this->player_ptr->class_specific_data = std::make_shared(); } else { this->player_ptr->class_specific_data = no_class_specific_data(); diff --git a/src/player-info/class-ability-info.cpp b/src/player-info/class-ability-info.cpp index 9bf12bc349..03c771bb3e 100644 --- a/src/player-info/class-ability-info.cpp +++ b/src/player-info/class-ability-info.cpp @@ -14,7 +14,7 @@ void set_class_ability_info(PlayerType *player_ptr, self_info_type *self_ptr) break; case PlayerClassType::HIGH_MAGE: - if (player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(player_ptr).is_realm_hex()) { break; } [[fallthrough]]; diff --git a/src/player-status/player-speed.cpp b/src/player-status/player-speed.cpp index 009ec1d8b5..38deb0c509 100644 --- a/src/player-status/player-speed.cpp +++ b/src/player-status/player-speed.cpp @@ -13,6 +13,7 @@ #include "player-info/race-info.h" #include "player/attack-defense-types.h" #include "player/digestion-processor.h" +#include "player/player-realm.h" #include "player/player-skill.h" #include "player/player-status-flags.h" #include "player/player-status.h" @@ -195,7 +196,7 @@ int16_t PlayerSpeed::time_effect_bonus() bonus -= 10; } - if (this->player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(this->player_ptr).is_realm_hex()) { if (SpellHex(this->player_ptr).is_spelling_specific(HEX_SHOCK_CLOAK)) { bonus += 3; } diff --git a/src/player-status/player-stealth.cpp b/src/player-status/player-stealth.cpp index f7fd1e5047..654bbe5a5e 100644 --- a/src/player-status/player-stealth.cpp +++ b/src/player-status/player-stealth.cpp @@ -8,6 +8,7 @@ #include "player-info/mimic-info-table.h" #include "player-info/race-types.h" #include "player/player-personality.h" +#include "player/player-realm.h" #include "player/player-skill.h" #include "player/player-status-flags.h" #include "player/player-status.h" @@ -115,7 +116,7 @@ int16_t PlayerStealth::mutation_bonus() int16_t PlayerStealth::time_effect_bonus() { int16_t bonus = 0; - if (this->player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(this->player_ptr).is_realm_hex()) { SpellHex spell_hex(this->player_ptr); if (spell_hex.is_spelling_any()) { bonus -= spell_hex.get_casting_num() + 1; diff --git a/src/player/player-realm.cpp b/src/player/player-realm.cpp index ed4916e7f7..95207b123f 100644 --- a/src/player/player-realm.cpp +++ b/src/player/player-realm.cpp @@ -147,6 +147,11 @@ const PlayerRealm::Realm &PlayerRealm::realm2() const return this->realm2_; } +bool PlayerRealm::is_realm_hex() const +{ + return this->realm1_.equals(REALM_HEX); +} + PlayerRealm::Realm::Realm(int realm) : realm(realm) { @@ -176,3 +181,8 @@ bool PlayerRealm::Realm::is_good_attribute() const { return this->realm == REALM_LIFE || this->realm == REALM_CRUSADE; } + +bool PlayerRealm::Realm::equals(int realm) const +{ + return this->realm == realm; +} diff --git a/src/player/player-realm.h b/src/player/player-realm.h index b65301a53d..fc27c3207a 100644 --- a/src/player/player-realm.h +++ b/src/player/player-realm.h @@ -32,6 +32,7 @@ class PlayerRealm { ItemKindType get_book() const; bool is_available() const; bool is_good_attribute() const; + bool equals(int realm) const; private: int realm; @@ -39,6 +40,7 @@ class PlayerRealm { const Realm &realm1() const; const Realm &realm2() const; + bool is_realm_hex() const; private: Realm realm1_; diff --git a/src/player/player-skill.cpp b/src/player/player-skill.cpp index 034402f335..8002ec8c58 100644 --- a/src/player/player-skill.cpp +++ b/src/player/player-skill.cpp @@ -352,9 +352,10 @@ void PlayerSkill::gain_riding_skill_exp_on_fall_off_check(int dam) void PlayerSkill::gain_spell_skill_exp(int realm, int spell_idx) { + PlayerRealm pr(this->player_ptr); auto is_valid_realm = is_magic(realm) || (realm == REALM_MUSIC) || (realm == REALM_HEX); - is_valid_realm &= (realm == this->player_ptr->realm1) || (realm == this->player_ptr->realm2); + is_valid_realm &= pr.realm1().equals(realm) || pr.realm2().equals(realm); const auto is_valid_spell_idx = (0 <= spell_idx) && (spell_idx < 32); if (!is_valid_realm || !is_valid_spell_idx) { @@ -364,7 +365,7 @@ void PlayerSkill::gain_spell_skill_exp(int realm, int spell_idx) constexpr GainAmountList gain_amount_list_first{ { 60, 8, 2, 1 } }; constexpr GainAmountList gain_amount_list_second{ { 60, 8, 2, 0 } }; - const auto is_first_realm = (realm == this->player_ptr->realm1); + const auto is_first_realm = pr.realm1().equals(realm); const auto &spell = PlayerRealm::get_spell_info(realm, spell_idx); gain_spell_skill_exp_aux(this->player_ptr, this->player_ptr->spell_exp[spell_idx + (is_first_realm ? 0 : 32)], @@ -421,13 +422,14 @@ PlayerSkillRank PlayerSkill::gain_spell_skill_exp_over_learning(int spell_idx) EXP PlayerSkill::exp_of_spell(int realm, int spell_idx) const { PlayerClass pc(this->player_ptr); + PlayerRealm pr(this->player_ptr); if (pc.equals(PlayerClassType::SORCERER)) { return SPELL_EXP_MASTER; } else if (pc.equals(PlayerClassType::RED_MAGE)) { return SPELL_EXP_SKILLED; - } else if (realm == this->player_ptr->realm1) { + } else if (pr.realm1().equals(realm)) { return this->player_ptr->spell_exp[spell_idx]; - } else if (realm == this->player_ptr->realm2) { + } else if (pr.realm2().equals(realm)) { return this->player_ptr->spell_exp[spell_idx + 32]; } else { return 0; diff --git a/src/player/player-status-flags.cpp b/src/player/player-status-flags.cpp index 02d8581a41..b53ee7b201 100644 --- a/src/player/player-status-flags.cpp +++ b/src/player/player-status-flags.cpp @@ -533,7 +533,7 @@ BIT_FLAGS has_xtra_might(PlayerType *player_ptr) BIT_FLAGS has_esp_evil(PlayerType *player_ptr) { BIT_FLAGS result = common_cause_flags(player_ptr, TR_ESP_EVIL); - if (player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(player_ptr).is_realm_hex()) { if (SpellHex(player_ptr).is_spelling_specific(HEX_DETECT_EVIL)) { result |= FLAG_CAUSE_MAGIC_TIME_EFFECT; } @@ -741,14 +741,14 @@ void check_no_flowed(PlayerType *player_ptr) } PlayerClass pc(player_ptr); - if (has_sw && ((player_ptr->realm1 == REALM_NATURE) || (player_ptr->realm2 == REALM_NATURE) || pc.equals(PlayerClassType::SORCERER))) { + if (has_sw && (pr.realm1().equals(REALM_NATURE) || pr.realm2().equals(REALM_NATURE) || pc.equals(PlayerClassType::SORCERER))) { const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE - 1][SPELL_SW]; if (player_ptr->lev >= s_ptr->slevel) { player_ptr->no_flowed = true; } } - if (has_kabe && ((player_ptr->realm1 == REALM_CRAFT) || (player_ptr->realm2 == REALM_CRAFT) || pc.equals(PlayerClassType::SORCERER))) { + if (has_kabe && (pr.realm1().equals(REALM_CRAFT) || pr.realm2().equals(REALM_CRAFT) || pc.equals(PlayerClassType::SORCERER))) { const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT - 1][SPELL_WALL]; if (player_ptr->lev >= s_ptr->slevel) { player_ptr->no_flowed = true; diff --git a/src/player/player-status.cpp b/src/player/player-status.cpp index 553b8a5935..627bd1b325 100644 --- a/src/player/player-status.cpp +++ b/src/player/player-status.cpp @@ -1815,7 +1815,7 @@ static ARMOUR_CLASS calc_to_ac(PlayerType *player_ptr, bool is_real_value) } } - if (player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(player_ptr).is_realm_hex()) { if (SpellHex(player_ptr).is_spelling_specific(HEX_ICE_ARMOR)) { ac += 30; } @@ -2118,7 +2118,7 @@ static short calc_to_damage(PlayerType *player_ptr, INVENTORY_IDX slot, bool is_ } } - if ((player_ptr->realm1 == REALM_HEX) && o_ptr->is_cursed()) { + if (PlayerRealm(player_ptr).is_realm_hex() && o_ptr->is_cursed()) { if (SpellHex(player_ptr).is_spelling_specific(HEX_RUNESWORD)) { if (o_ptr->curse_flags.has(CurseTraitType::CURSED)) { damage += 5; @@ -2355,7 +2355,7 @@ static short calc_to_hit(PlayerType *player_ptr, INVENTORY_IDX slot, bool is_rea } /* Hex realm bonuses */ - if ((player_ptr->realm1 == REALM_HEX) && o_ptr->is_cursed()) { + if (PlayerRealm(player_ptr).is_realm_hex() && o_ptr->is_cursed()) { if (o_ptr->curse_flags.has(CurseTraitType::CURSED)) { hit += 5; } diff --git a/src/racial/class-racial-switcher.cpp b/src/racial/class-racial-switcher.cpp index 07ebdf67f0..f4c8b8290d 100644 --- a/src/racial/class-racial-switcher.cpp +++ b/src/racial/class-racial-switcher.cpp @@ -20,7 +20,7 @@ void switch_class_racial(PlayerType *player_ptr, rc_type *rc_ptr) rc_ptr->add_power(rpi, RC_IDX_CLASS_0); break; case PlayerClassType::HIGH_MAGE: - if (player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(player_ptr).is_realm_hex()) { rpi = rpi_type(_("詠唱をやめる", "Stop spell casting")); rpi.text = _("呪術の詠唱を全てやめる。", "Stops all casting hex spells."); rpi.min_level = 1; diff --git a/src/racial/racial-switcher.cpp b/src/racial/racial-switcher.cpp index 9d689fe53d..c22ce2b647 100644 --- a/src/racial/racial-switcher.cpp +++ b/src/racial/racial-switcher.cpp @@ -91,7 +91,7 @@ bool switch_class_racial_execution(PlayerType *player_ptr, const int32_t command case PlayerClassType::WARRIOR: return sword_dancing(player_ptr); case PlayerClassType::HIGH_MAGE: - if (player_ptr->realm1 == REALM_HEX) { + if (PlayerRealm(player_ptr).is_realm_hex()) { const auto retval = SpellHex(player_ptr).stop_spells_with_selection(); if (retval) { PlayerEnergy(player_ptr).set_player_turn_energy(10); diff --git a/src/spell/spell-info.cpp b/src/spell/spell-info.cpp index e06239e431..2f2e4262a2 100644 --- a/src/spell/spell-info.cpp +++ b/src/spell/spell-info.cpp @@ -141,7 +141,8 @@ PERCENTAGE spell_chance(PlayerType *player_ptr, SPELL_IDX spell_id, int16_t use_ } PlayerClass pc(player_ptr); - if ((use_realm != player_ptr->realm1) && (pc.equals(PlayerClassType::MAGE) || pc.equals(PlayerClassType::PRIEST))) { + PlayerRealm pr(player_ptr); + if (!pr.realm1().equals(use_realm) && (pc.equals(PlayerClassType::MAGE) || pc.equals(PlayerClassType::PRIEST))) { chance += 5; } @@ -194,7 +195,7 @@ PERCENTAGE spell_chance(PlayerType *player_ptr, SPELL_IDX spell_id, int16_t use_ chance = 95; } - if ((use_realm == player_ptr->realm1) || (use_realm == player_ptr->realm2) || pc.is_every_magic()) { + if (pr.realm1().equals(use_realm) || pr.realm2().equals(use_realm) || pc.is_every_magic()) { auto exp = PlayerSkill(player_ptr).exp_of_spell(use_realm, spell_id); if (exp >= PlayerSkill::spell_exp_at(PlayerSkillRank::EXPERT)) { chance--; @@ -238,11 +239,12 @@ void print_spells(PlayerType *player_ptr, SPELL_IDX target_spell_id, const SPELL int increment = 64; PlayerClass pc(player_ptr); + PlayerRealm pr(player_ptr); if (pc.is_every_magic()) { increment = 0; - } else if (use_realm == player_ptr->realm1) { + } else if (pr.realm1().equals(use_realm)) { increment = 0; - } else if (use_realm == player_ptr->realm2) { + } else if (pr.realm2().equals(use_realm)) { increment = 32; } @@ -310,16 +312,16 @@ void print_spells(PlayerType *player_ptr, SPELL_IDX target_spell_id, const SPELL comment = _("忘却", "forgotten"); line_attr = TERM_YELLOW; } - } else if ((use_realm != player_ptr->realm1) && (use_realm != player_ptr->realm2)) { + } else if (!pr.realm1().equals(use_realm) && !pr.realm2().equals(use_realm)) { comment = _("未知", "unknown"); line_attr = TERM_L_BLUE; - } else if ((use_realm == player_ptr->realm1) ? ((player_ptr->spell_forgotten1 & (1UL << spell_id))) : ((player_ptr->spell_forgotten2 & (1UL << spell_id)))) { + } else if (pr.realm1().equals(use_realm) ? ((player_ptr->spell_forgotten1 & (1UL << spell_id))) : ((player_ptr->spell_forgotten2 & (1UL << spell_id)))) { comment = _("忘却", "forgotten"); line_attr = TERM_YELLOW; - } else if (!((use_realm == player_ptr->realm1) ? (player_ptr->spell_learned1 & (1UL << spell_id)) : (player_ptr->spell_learned2 & (1UL << spell_id)))) { + } else if (!(pr.realm1().equals(use_realm) ? (player_ptr->spell_learned1 & (1UL << spell_id)) : (player_ptr->spell_learned2 & (1UL << spell_id)))) { comment = _("未知", "unknown"); line_attr = TERM_L_BLUE; - } else if (!((use_realm == player_ptr->realm1) ? (player_ptr->spell_worked1 & (1UL << spell_id)) : (player_ptr->spell_worked2 & (1UL << spell_id)))) { + } else if (!(pr.realm1().equals(use_realm) ? (player_ptr->spell_worked1 & (1UL << spell_id)) : (player_ptr->spell_worked2 & (1UL << spell_id)))) { comment = _("未経験", "untried"); line_attr = TERM_L_GREEN; } diff --git a/src/view/object-describer.cpp b/src/view/object-describer.cpp index decb73ed29..4b5b521cf3 100644 --- a/src/view/object-describer.cpp +++ b/src/view/object-describer.cpp @@ -85,7 +85,7 @@ void display_koff(PlayerType *player_ptr) PlayerRealm pr(player_ptr); if (pr.realm1().is_available() || pr.realm2().is_available()) { - if ((use_realm != player_ptr->realm1) && (use_realm != player_ptr->realm2)) { + if (!pr.realm1().equals(use_realm) && !pr.realm2().equals(use_realm)) { return; } } else { diff --git a/src/window/main-window-stat-poster.cpp b/src/window/main-window-stat-poster.cpp index 9a5a6b1f25..32a883f508 100644 --- a/src/window/main-window-stat-poster.cpp +++ b/src/window/main-window-stat-poster.cpp @@ -11,6 +11,7 @@ #include "player-info/sniper-data-type.h" #include "player/attack-defense-types.h" #include "player/digestion-processor.h" +#include "player/player-realm.h" #include "player/player-status-table.h" #include "player/player-status.h" #include "realm/realm-hex-numbers.h" @@ -348,7 +349,7 @@ void print_imitation(PlayerType *player_ptr) */ static void add_hex_status_flags(PlayerType *player_ptr, BIT_FLAGS *bar_flags) { - if (player_ptr->realm1 != REALM_HEX) { + if (!PlayerRealm(player_ptr).is_realm_hex()) { return; } From 4e58b62b8d69f45d10af45d021d94242e887cef8 Mon Sep 17 00:00:00 2001 From: Habu Date: Tue, 2 Jul 2024 22:53:47 +0900 Subject: [PATCH 10/16] =?UTF-8?q?[Refactor]=20PlayerRealm::Realm=E3=81=AE?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=90realm=E3=81=AB=5F=E3=82=92=E4=BB=98?= =?UTF-8?q?=E3=81=91=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 引数名とのバッティングを避けるため、データメンバ realm を realm_ に 改名する。 --- src/player/player-realm.cpp | 14 +++++++------- src/player/player-realm.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/player/player-realm.cpp b/src/player/player-realm.cpp index 95207b123f..2866711782 100644 --- a/src/player/player-realm.cpp +++ b/src/player/player-realm.cpp @@ -153,36 +153,36 @@ bool PlayerRealm::is_realm_hex() const } PlayerRealm::Realm::Realm(int realm) - : realm(realm) + : realm_(realm) { } const LocalizedString &PlayerRealm::Realm::get_name() const { - return PlayerRealm::get_name(this->realm); + return PlayerRealm::get_name(this->realm_); } const magic_type &PlayerRealm::Realm::get_spell_info(int num) const { - return PlayerRealm::get_spell_info(this->realm, num); + return PlayerRealm::get_spell_info(this->realm_, num); } ItemKindType PlayerRealm::Realm::get_book() const { - return PlayerRealm::get_book(this->realm); + return PlayerRealm::get_book(this->realm_); } bool PlayerRealm::Realm::is_available() const { - return this->realm != REALM_NONE; + return this->realm_ != REALM_NONE; } bool PlayerRealm::Realm::is_good_attribute() const { - return this->realm == REALM_LIFE || this->realm == REALM_CRUSADE; + return this->realm_ == REALM_LIFE || this->realm_ == REALM_CRUSADE; } bool PlayerRealm::Realm::equals(int realm) const { - return this->realm == realm; + return this->realm_ == realm; } diff --git a/src/player/player-realm.h b/src/player/player-realm.h index fc27c3207a..dfe1d6fa1c 100644 --- a/src/player/player-realm.h +++ b/src/player/player-realm.h @@ -35,7 +35,7 @@ class PlayerRealm { bool equals(int realm) const; private: - int realm; + int realm_; }; const Realm &realm1() const; From 3c0bde5bf341de0a37d7c45b2a90eea44705ca40 Mon Sep 17 00:00:00 2001 From: Habu Date: Tue, 2 Jul 2024 23:50:46 +0900 Subject: [PATCH 11/16] =?UTF-8?q?[Refactor]=20=E3=82=AD=E3=83=A3=E3=83=A9?= =?UTF-8?q?=E3=83=A1=E3=82=A4=E3=82=AF=E6=99=82=E3=81=AE=E9=A0=98=E5=9F=9F?= =?UTF-8?q?=E9=81=B8=E6=8A=9E=E5=87=A6=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PlayerTypeクラスのrealm1とrealm2に対する直接アクセスを減らすため、 キャラメイク時の領域選択処理をリファクタリングする。 --- src/birth/birth-select-realm.cpp | 112 ++++++++++++++----------------- 1 file changed, 49 insertions(+), 63 deletions(-) diff --git a/src/birth/birth-select-realm.cpp b/src/birth/birth-select-realm.cpp index d5d09fa0b1..3765b5bacf 100644 --- a/src/birth/birth-select-realm.cpp +++ b/src/birth/birth-select-realm.cpp @@ -13,6 +13,7 @@ #include "term/z-form.h" #include "util/int-char-converter.h" #include "view/display-util.h" +#include #include static const byte REALM_SELECT_CANCEL = 255; @@ -43,7 +44,8 @@ static birth_realm_type *initialize_birth_realm_type(birth_realm_type *birth_rea static void impose_first_realm(PlayerType *player_ptr, RealmChoices &choices) { - if (player_ptr->realm2 == REALM_SELECT_CANCEL) { + PlayerRealm pr(player_ptr); + if (!pr.realm1().is_available()) { return; } @@ -51,29 +53,22 @@ static void impose_first_realm(PlayerType *player_ptr, RealmChoices &choices) return; } - if (PlayerRealm(player_ptr).realm1().is_good_attribute()) { + if (pr.realm1().is_good_attribute()) { choices.reset({ REALM_DEATH, REALM_DAEMON }); } else { choices.reset({ REALM_LIFE, REALM_CRUSADE }); } } -static void analyze_realms(const PlayerType *player_ptr, const RealmChoices &choices, birth_realm_type *birth_realm_ptr) +static void analyze_realms(PlayerType *player_ptr, magic_realm_type selecting_realm, const RealmChoices &choices, birth_realm_type *birth_realm_ptr) { + PlayerRealm pr(player_ptr); for (auto realm : EnumRange(REALM_LIFE, REALM_MAX)) { - if (choices.has_not(realm)) { + if (choices.has_not(realm) || pr.realm1().equals(realm)) { continue; } - if (player_ptr->realm1 == realm) { - if (player_ptr->realm2 == REALM_SELECT_CANCEL) { - birth_realm_ptr->cs = birth_realm_ptr->n; - } else { - continue; - } - } - - if (player_ptr->realm2 == realm) { + if (realm == selecting_realm) { birth_realm_ptr->cs = birth_realm_ptr->n; } @@ -195,12 +190,12 @@ static bool get_a_realm(PlayerType *player_ptr, birth_realm_type *birth_realm_pt /*! * @brief プレイヤーの魔法領域を選択する / Choose from one of the available magical realms + * @param selecting_realm 現在選択中の魔法領域 * @param choices 選択可能な魔法領域のビット配列 - * @param count 選択可能な魔法領域を返すポインタ群。 * @return 選択した魔法領域のID * @details 領域数が0 (戦士等)or 1 (観光客等)なら自動での値を返す */ -static byte select_realm(PlayerType *player_ptr, RealmChoices choices) +static std::optional select_realm(PlayerType *player_ptr, magic_realm_type selecting_realm, RealmChoices choices) { clear_from(10); if (choices.count() <= 1) { @@ -213,14 +208,14 @@ static byte select_realm(PlayerType *player_ptr, RealmChoices choices) birth_realm_type tmp_birth_realm; birth_realm_type *birth_realm_ptr = initialize_birth_realm_type(&tmp_birth_realm); - analyze_realms(player_ptr, choices, birth_realm_ptr); + analyze_realms(player_ptr, selecting_realm, choices, birth_realm_ptr); birth_realm_ptr->cur = format("%c%c %s", '*', birth_realm_ptr->p2, _("ランダム", "Random")); if (get_a_realm(player_ptr, birth_realm_ptr)) { - return REALM_SELECT_CANCEL; + return std::nullopt; } clear_from(10); - return static_cast(birth_realm_ptr->picks[birth_realm_ptr->k]); + return i2enum(birth_realm_ptr->picks[birth_realm_ptr->k]); } static void cleanup_realm_selection_window(void) @@ -250,16 +245,35 @@ static bool check_realm_selection(PlayerType *player_ptr, int count) return false; } +static std::optional process_choose_realm(PlayerType *player_ptr, RealmChoices choices) +{ + auto selecting_realm = REALM_NONE; + while (true) { + const auto selected_realm = select_realm(player_ptr, selecting_realm, choices); + if (!selected_realm || *selected_realm == REALM_NONE) { + return selected_realm; + } + + cleanup_realm_selection_window(); + display_wrap_around(realm_explanations[technic2magic(*selected_realm) - 1], 74, 12, 3); + + if (check_realm_selection(player_ptr, choices.count())) { + return selected_realm; + } + selecting_realm = *selected_realm; + } +} + static void print_choosed_realms(PlayerType *player_ptr) { put_str(_("魔法 :", "Magic :"), 6, 1); PlayerRealm pr(player_ptr); std::string choosed_realms; - if (player_ptr->realm2 == REALM_NONE) { - choosed_realms = pr.realm1().get_name(); - } else { + if (pr.realm2().is_available()) { choosed_realms = format("%s, %s", pr.realm1().get_name().data(), pr.realm2().get_name().data()); + } else { + choosed_realms = pr.realm1().get_name(); } c_put_str(TERM_L_BLUE, choosed_realms, 6, 15); @@ -277,9 +291,8 @@ bool get_player_realms(PlayerType *player_ptr) put_str(" ", 5, 40); put_str(" ", 6, 40); - /* Select the first realm */ player_ptr->realm1 = REALM_NONE; - player_ptr->realm2 = REALM_SELECT_CANCEL; + player_ptr->realm2 = REALM_NONE; if (PlayerClass(player_ptr).equals(PlayerClassType::ELEMENTALIST)) { player_ptr->element = select_element_realm(player_ptr); @@ -289,56 +302,29 @@ bool get_player_realms(PlayerType *player_ptr) put_str(_("魔法 :", "Magic :"), 6, 1); c_put_str(TERM_L_BLUE, get_element_title(player_ptr->element), 6, 15); - player_ptr->realm2 = REALM_NONE; return true; } - while (true) { - auto choices = PlayerRealm::get_realm1_choices(player_ptr->pclass); - player_ptr->realm1 = select_realm(player_ptr, choices); - if (player_ptr->realm1 == REALM_SELECT_CANCEL) { - return false; - } - if (!player_ptr->realm1) { - break; - } - - cleanup_realm_selection_window(); - display_wrap_around(realm_explanations[technic2magic(player_ptr->realm1) - 1], 74, 12, 3); - - if (check_realm_selection(player_ptr, choices.count())) { - break; - } + /* Select the first realm */ + const auto realm1 = process_choose_realm(player_ptr, PlayerRealm::get_realm1_choices(player_ptr->pclass)); + if (!realm1) { + return false; } - - /* Select the second realm */ - player_ptr->realm2 = REALM_NONE; - if (player_ptr->realm1 == REALM_NONE) { + if (*realm1 == REALM_NONE) { return true; } - + player_ptr->realm1 = *realm1; print_choosed_realms(player_ptr); /* Select the second realm */ - while (true) { - auto choices = PlayerRealm::get_realm2_choices(player_ptr->pclass); - player_ptr->realm2 = select_realm(player_ptr, choices); - - if (player_ptr->realm2 == REALM_SELECT_CANCEL) { - return false; - } - if (!player_ptr->realm2) { - break; - } - - cleanup_realm_selection_window(); - display_wrap_around(realm_explanations[technic2magic(player_ptr->realm2) - 1], 74, 12, 3); - - if (check_realm_selection(player_ptr, choices.count())) { - break; - } + const auto realm2 = process_choose_realm(player_ptr, PlayerRealm::get_realm2_choices(player_ptr->pclass)); + if (!realm2) { + return false; } - + if (*realm2 == REALM_NONE) { + return true; + } + player_ptr->realm2 = *realm2; print_choosed_realms(player_ptr); return true; From ad49afc0cd483a55bdd23de7158881597edabf5b Mon Sep 17 00:00:00 2001 From: dis Date: Wed, 3 Jul 2024 16:41:51 +0900 Subject: [PATCH 12/16] =?UTF-8?q?[Fix]=20=E5=91=AA=E6=96=87=E6=83=85?= =?UTF-8?q?=E5=A0=B1=E3=81=AE=E3=83=8F=E3=83=BC=E3=83=89=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=82=92=E8=A7=A3=E6=B6=88=E3=81=99=E3=82=8B=E4=BD=9C?= =?UTF-8?q?=E6=A5=AD=E3=81=AE=E3=83=9F=E3=82=B9=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #4353 #4373 の作業漏れを解消する。 --- src/realm/realm-crusade.cpp | 40 +------------------------------------ src/realm/realm-demon.cpp | 10 ---------- src/realm/realm-life.cpp | 8 -------- 3 files changed, 1 insertion(+), 57 deletions(-) diff --git a/src/realm/realm-crusade.cpp b/src/realm/realm-crusade.cpp index c1c3e78d2d..bace35563d 100644 --- a/src/realm/realm-crusade.cpp +++ b/src/realm/realm-crusade.cpp @@ -85,14 +85,6 @@ std::optional do_crusade_spell(PlayerType *player_ptr, SPELL_IDX sp } break; case 2: - if (name) { - return _("恐怖除去", "Remove Fear"); - } - - if (desc) { - return _("恐怖を取り除く。", "Removes fear."); - } - if (cast) { (void)BadStatusSetter(player_ptr).set_fear(0); } @@ -145,14 +137,6 @@ std::optional do_crusade_spell(PlayerType *player_ptr, SPELL_IDX sp } break; case 7: - if (name) { - return _("身体浄化", "Purify"); - } - - if (desc) { - return _("傷、毒、朦朧から全快する。", "Heals all cuts, poisons and being stunned."); - } - if (cast) { BadStatusSetter bss(player_ptr); (void)bss.set_cut(0); @@ -260,15 +244,6 @@ std::optional do_crusade_spell(PlayerType *player_ptr, SPELL_IDX sp } break; case 15: { - if (name) { - return _("聖なる御言葉", "Holy Word"); - } - - if (desc) { - return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。", - "Damages all evil monsters in sight, heals HP somewhat and completely cures fear, poisons, cuts and being stunned."); - } - auto dam_sides = plev * 6; auto heal = 100; if (info) { @@ -312,9 +287,7 @@ std::optional do_crusade_spell(PlayerType *player_ptr, SPELL_IDX sp } } break; - case 18: - - { + case 18: { int base = 20; const Dice dice(1, 20); @@ -491,17 +464,6 @@ std::optional do_crusade_spell(PlayerType *player_ptr, SPELL_IDX sp } break; case 31: - if (name) { - return _("聖戦", "Crusade"); - } - - if (desc) { - return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、" - "ヒーロー、祝福、加速、対邪悪結界を得る。", - "Attempts to charm all good monsters in sight and scares all non-charmed monsters. Summons a great number of knights. Gives heroism, bless, " - "speed and protection from evil to the caster."); - } - if (cast) { auto base = 25; auto sp_sides = 20 + plev; diff --git a/src/realm/realm-demon.cpp b/src/realm/realm-demon.cpp index d0cf50003b..484725ecca 100644 --- a/src/realm/realm-demon.cpp +++ b/src/realm/realm-demon.cpp @@ -284,16 +284,6 @@ std::optional do_daemon_spell(PlayerType *player_ptr, SPELL_IDX spe } break; case 17: { - if (name) { - return _("悪魔のクローク", "Devil Cloak"); - } - - if (desc) { - return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。", - "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to those from equipment for more powerful " - "resistances."); - } - TIME_EFFECT base = 20; const Dice dice(1, 20); if (info) { diff --git a/src/realm/realm-life.cpp b/src/realm/realm-life.cpp index 3880a09d4a..ea3632d7f8 100644 --- a/src/realm/realm-life.cpp +++ b/src/realm/realm-life.cpp @@ -130,14 +130,6 @@ std::optional do_life_spell(PlayerType *player_ptr, SPELL_IDX spell } break; case 6: - if (name) { - return _("解毒", "Cure Poison"); - } - - if (desc) { - return _("体内の毒を取り除く。", "Cures yourself of any poisons."); - } - if (cast) { (void)BadStatusSetter(player_ptr).set_poison(0); } From 9cb7cc2df5cb32c65ed9e0be2308fcfd76b5c8e7 Mon Sep 17 00:00:00 2001 From: Habu Date: Wed, 3 Jul 2024 20:00:56 +0900 Subject: [PATCH 13/16] =?UTF-8?q?[Refactor]=20PlayerRealm=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=B9=E3=81=AE=E5=91=AA=E6=96=87ID=E3=81=AE?= =?UTF-8?q?=E8=A1=A8=E8=A8=98=E6=8F=BA=E3=82=8C=E3=82=92=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 呪文IDを示す引数名が num だったり spell_idx だったりしていてあまり よろしくないので、spell_id に統一する。 --- src/player/player-realm.cpp | 16 ++++++++-------- src/player/player-realm.h | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/player/player-realm.cpp b/src/player/player-realm.cpp index 2866711782..1999152d71 100644 --- a/src/player/player-realm.cpp +++ b/src/player/player-realm.cpp @@ -89,22 +89,22 @@ const LocalizedString &PlayerRealm::get_name(int realm) return it->second; } -const magic_type &PlayerRealm::get_spell_info(int realm, int spell_idx, std::optional pclass) +const magic_type &PlayerRealm::get_spell_info(int realm, int spell_id, std::optional pclass) { - if (spell_idx < 0 || 32 <= spell_idx) { - THROW_EXCEPTION(std::invalid_argument, format("Invalid spell idx: %d", spell_idx)); + if (spell_id < 0 || 32 <= spell_id) { + THROW_EXCEPTION(std::invalid_argument, format("Invalid spell id: %d", spell_id)); } const auto realm_enum = i2enum(realm); if (MAGIC_REALM_RANGE.contains(realm_enum)) { if (pclass) { - return class_magics_info.at(enum2i(*pclass)).info[realm - 1][spell_idx]; + return class_magics_info.at(enum2i(*pclass)).info[realm - 1][spell_id]; } - return mp_ptr->info[realm - 1][spell_idx]; + return mp_ptr->info[realm - 1][spell_id]; } if (TECHNIC_REALM_RANGE.contains(realm_enum)) { - return technic_info[realm - MIN_TECHNIC][spell_idx]; + return technic_info[realm - MIN_TECHNIC][spell_id]; } THROW_EXCEPTION(std::invalid_argument, format("Invalid realm: %d", realm)); @@ -162,9 +162,9 @@ const LocalizedString &PlayerRealm::Realm::get_name() const return PlayerRealm::get_name(this->realm_); } -const magic_type &PlayerRealm::Realm::get_spell_info(int num) const +const magic_type &PlayerRealm::Realm::get_spell_info(int spell_id) const { - return PlayerRealm::get_spell_info(this->realm_, num); + return PlayerRealm::get_spell_info(this->realm_, spell_id); } ItemKindType PlayerRealm::Realm::get_book() const diff --git a/src/player/player-realm.h b/src/player/player-realm.h index dfe1d6fa1c..5e02731c8c 100644 --- a/src/player/player-realm.h +++ b/src/player/player-realm.h @@ -19,7 +19,7 @@ class PlayerRealm { PlayerRealm(PlayerType *player_ptr); static const LocalizedString &get_name(int realm); - static const magic_type &get_spell_info(int realm, int num, std::optional pclass = std::nullopt); + static const magic_type &get_spell_info(int realm, int spell_id, std::optional pclass = std::nullopt); static ItemKindType get_book(int realm); static RealmChoices get_realm1_choices(PlayerClassType pclass); static RealmChoices get_realm2_choices(PlayerClassType pclass); @@ -28,7 +28,7 @@ class PlayerRealm { public: Realm(int realm); const LocalizedString &get_name() const; - const magic_type &get_spell_info(int num) const; + const magic_type &get_spell_info(int spell_id) const; ItemKindType get_book() const; bool is_available() const; bool is_good_attribute() const; From 48f79429613f143c739e1944d8eaccc743e33b5a Mon Sep 17 00:00:00 2001 From: Habu Date: Wed, 3 Jul 2024 20:00:56 +0900 Subject: [PATCH 14/16] =?UTF-8?q?[Refactor]=20=E5=91=AA=E6=96=87=E3=81=AE?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E3=81=A8=E8=AA=AC=E6=98=8E=E6=96=87=E3=81=AE?= =?UTF-8?q?=E5=8F=96=E5=BE=97=E5=87=A6=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit exe_spellの引数にSpellProcessTypeのNAMEとDESCRIPTIONを指定することにより 呪文の名称と説明文の取得を行うのをやめ、代わりにPlayerRealmクラスに get_spell_nameとget_spell_descriptionを実装し、これを使用して取得する。 --- src/cmd-action/cmd-hissatsu.cpp | 8 ++--- src/cmd-action/cmd-spell.cpp | 24 +++++++-------- src/knowledge/knowledge-experiences.cpp | 8 ++--- src/player/player-realm.cpp | 41 +++++++++++++++++++++++++ src/player/player-realm.h | 4 +++ src/player/player-status.cpp | 35 +++++++-------------- src/realm/realm-arcane.cpp | 12 -------- src/realm/realm-chaos.cpp | 12 -------- src/realm/realm-craft.cpp | 12 -------- src/realm/realm-crusade.cpp | 12 -------- src/realm/realm-death.cpp | 12 -------- src/realm/realm-demon.cpp | 12 -------- src/realm/realm-hex.cpp | 17 ++-------- src/realm/realm-hissatsu.cpp | 12 -------- src/realm/realm-life.cpp | 12 -------- src/realm/realm-nature.cpp | 12 -------- src/realm/realm-song.cpp | 12 -------- src/realm/realm-sorcery.cpp | 12 -------- src/realm/realm-trump.cpp | 12 -------- src/spell-realm/spells-hex.cpp | 4 +-- src/spell/spell-info.cpp | 6 ++-- src/spell/spells-util.h | 12 +++----- src/window/display-sub-windows.cpp | 8 ++--- src/wizard/wizard-spoiler.cpp | 4 +-- 24 files changed, 95 insertions(+), 220 deletions(-) diff --git a/src/cmd-action/cmd-hissatsu.cpp b/src/cmd-action/cmd-hissatsu.cpp index efd2e45a69..fb28e156d7 100644 --- a/src/cmd-action/cmd-hissatsu.cpp +++ b/src/cmd-action/cmd-hissatsu.cpp @@ -243,8 +243,8 @@ static int get_hissatsu_power(PlayerType *player_ptr, SPELL_IDX *sn) } /* Dump the spell --(-- */ - const auto spell_name = exe_spell(player_ptr, REALM_HISSATSU, i, SpellProcessType::NAME); - psi_desc.append(format(" %-18s%2d %3d", spell_name->data(), spell.slevel, spell.smana)); + const auto &spell_name = PlayerRealm::get_spell_name(REALM_HISSATSU, i); + psi_desc.append(format(" %-18s%2d %3d", spell_name.data(), spell.slevel, spell.smana)); prt(psi_desc, y + (line % 17) + (line >= 17), x + (line / 17) * 30); prt("", y + (line % 17) + (line >= 17) + 1, x + (line / 17) * 30); } @@ -406,8 +406,8 @@ void do_cmd_gain_hissatsu(PlayerType *player_ptr) player_ptr->spell_learned1 |= (1UL << i); player_ptr->spell_worked1 |= (1UL << i); - const auto spell_name = exe_spell(player_ptr, REALM_HISSATSU, i, SpellProcessType::NAME); - msg_format(_("%sの技を覚えた。", "You have learned the special attack of %s."), spell_name->data()); + const auto &spell_name = PlayerRealm::get_spell_name(REALM_HISSATSU, i); + msg_format(_("%sの技を覚えた。", "You have learned the special attack of %s."), spell_name.data()); int j; for (j = 0; j < 64; j++) { /* Stop at the first empty space */ diff --git a/src/cmd-action/cmd-spell.cpp b/src/cmd-action/cmd-spell.cpp index 56cc034b80..3fd6514275 100644 --- a/src/cmd-action/cmd-spell.cpp +++ b/src/cmd-action/cmd-spell.cpp @@ -669,8 +669,8 @@ void do_cmd_browse(PlayerType *player_ptr) term_erase(14, 12); term_erase(14, 11); - const auto spell_desc = exe_spell(player_ptr, use_realm, spell, SpellProcessType::DESCRIPTION); - display_wrap_around(*spell_desc, 62, 11, 15); + const auto &spell_desc = PlayerRealm::get_spell_description(use_realm, spell); + display_wrap_around(spell_desc, 62, 11, 15); } screen_load(); } @@ -852,17 +852,17 @@ void do_cmd_study(PlayerType *player_ptr) if (learned) { auto max_exp = PlayerSkill::spell_exp_at((spell < 32) ? PlayerSkillRank::MASTER : PlayerSkillRank::EXPERT); const auto old_exp = player_ptr->spell_exp[spell]; - const auto realm = increment ? player_ptr->realm2 : player_ptr->realm1; - const auto spell_name = exe_spell(player_ptr, realm, spell % 32, SpellProcessType::NAME); + const auto &realm = increment ? pr.realm2() : pr.realm1(); + const auto &spell_name = realm.get_spell_name(spell % 32); if (old_exp >= max_exp) { msg_format(_("その%sは完全に使いこなせるので学ぶ必要はない。", "You don't need to study this %s anymore."), spell_category.data()); return; } #ifdef JP - if (!input_check(format("%sの%sをさらに学びます。よろしいですか?", spell_name->data(), spell_category.data()))) + if (!input_check(format("%sの%sをさらに学びます。よろしいですか?", spell_name.data(), spell_category.data()))) #else - if (!input_check(format("You will study a %s of %s again. Are you sure? ", spell_category.data(), spell_name->data()))) + if (!input_check(format("You will study a %s of %s again. Are you sure? ", spell_category.data(), spell_name.data()))) #endif { return; @@ -870,7 +870,7 @@ void do_cmd_study(PlayerType *player_ptr) auto new_rank = PlayerSkill(player_ptr).gain_spell_skill_exp_over_learning(spell); auto new_rank_str = PlayerSkill::skill_rank_str(new_rank); - msg_format(_("%sの熟練度が%sに上がった。", "Your proficiency of %s is now %s rank."), spell_name->data(), new_rank_str); + msg_format(_("%sの熟練度が%sに上がった。", "Your proficiency of %s is now %s rank."), spell_name.data(), new_rank_str); } else { /* Find the next open entry in "player_ptr->spell_order[]" */ int i; @@ -885,16 +885,16 @@ void do_cmd_study(PlayerType *player_ptr) player_ptr->spell_order[i++] = spell; /* Mention the result */ - const auto realm = increment ? player_ptr->realm2 : player_ptr->realm1; - const auto spell_name = exe_spell(player_ptr, realm, spell % 32, SpellProcessType::NAME); + const auto &realm = increment ? pr.realm2() : pr.realm1(); + const auto &spell_name = realm.get_spell_name(spell % 32); #ifdef JP if (mp_ptr->spell_book == ItemKindType::MUSIC_BOOK) { - msg_format("%sを学んだ。", spell_name->data()); + msg_format("%sを学んだ。", spell_name.data()); } else { - msg_format("%sの%sを学んだ。", spell_name->data(), spell_category.data()); + msg_format("%sの%sを学んだ。", spell_name.data(), spell_category.data()); } #else - msg_format("You have learned the %s of %s.", spell_category.data(), spell_name->data()); + msg_format("You have learned the %s of %s.", spell_category.data(), spell_name.data()); #endif } diff --git a/src/knowledge/knowledge-experiences.cpp b/src/knowledge/knowledge-experiences.cpp index fa2dd49e2e..ca6a3a6c75 100644 --- a/src/knowledge/knowledge-experiences.cpp +++ b/src/knowledge/knowledge-experiences.cpp @@ -95,8 +95,8 @@ void do_cmd_knowledge_spell_exp(PlayerType *player_ptr) } SUB_EXP spell_exp = player_ptr->spell_exp[i]; auto skill_rank = PlayerSkill::spell_skill_rank(spell_exp); - const auto spell_name = exe_spell(player_ptr, player_ptr->realm1, i, SpellProcessType::NAME); - fprintf(fff, "%-25s ", spell_name->data()); + const auto &spell_name = pr.realm1().get_spell_name(i); + fprintf(fff, "%-25s ", spell_name.data()); if (pr.realm1().equals(REALM_HISSATSU)) { if (show_actual_value) { fprintf(fff, "----/---- "); @@ -132,8 +132,8 @@ void do_cmd_knowledge_spell_exp(PlayerType *player_ptr) SUB_EXP spell_exp = player_ptr->spell_exp[i + 32]; auto skill_rank = PlayerSkill::spell_skill_rank(spell_exp); - const auto spell_name = exe_spell(player_ptr, player_ptr->realm2, i, SpellProcessType::NAME); - fprintf(fff, "%-25s ", spell_name->data()); + const auto spell_name = pr.realm2().get_spell_name(i); + fprintf(fff, "%-25s ", spell_name.data()); if (show_actual_value) { fprintf(fff, "%4d/%4d ", spell_exp, PlayerSkill::spell_exp_at(PlayerSkillRank::MASTER)); } diff --git a/src/player/player-realm.cpp b/src/player/player-realm.cpp index 1999152d71..3cb754d22c 100644 --- a/src/player/player-realm.cpp +++ b/src/player/player-realm.cpp @@ -5,6 +5,7 @@ #include "realm/realm-types.h" #include "system/angband-exceptions.h" #include "system/player-type-definition.h" +#include "system/spell-info-list.h" #include "util/enum-converter.h" namespace { @@ -110,6 +111,36 @@ const magic_type &PlayerRealm::get_spell_info(int realm, int spell_id, std::opti THROW_EXCEPTION(std::invalid_argument, format("Invalid realm: %d", realm)); } +const std::string &PlayerRealm::get_spell_name(int realm, int spell_id) +{ + if (spell_id < 0 || 32 <= spell_id) { + THROW_EXCEPTION(std::invalid_argument, format("Invalid spell id: %d", spell_id)); + } + + const auto realm_enum = i2enum(realm); + if (!MAGIC_REALM_RANGE.contains(realm_enum) && !TECHNIC_REALM_RANGE.contains(realm_enum)) { + THROW_EXCEPTION(std::invalid_argument, format("Invalid realm: %d", realm)); + } + + const auto &spell_info = SpellInfoList::get_instance().spell_list[realm]; + return spell_info[spell_id].name; +} + +const std::string &PlayerRealm::get_spell_description(int realm, int spell_id) +{ + if (spell_id < 0 || 32 <= spell_id) { + THROW_EXCEPTION(std::invalid_argument, format("Invalid spell id: %d", spell_id)); + } + + const auto realm_enum = i2enum(realm); + if (!MAGIC_REALM_RANGE.contains(realm_enum) && !TECHNIC_REALM_RANGE.contains(realm_enum)) { + THROW_EXCEPTION(std::invalid_argument, format("Invalid realm: %d", realm)); + } + + const auto &spell_info = SpellInfoList::get_instance().spell_list[realm]; + return spell_info[spell_id].description; +} + ItemKindType PlayerRealm::get_book(int realm) { const auto it = realm_books.find(i2enum(realm)); @@ -167,6 +198,16 @@ const magic_type &PlayerRealm::Realm::get_spell_info(int spell_id) const return PlayerRealm::get_spell_info(this->realm_, spell_id); } +const std::string &PlayerRealm::Realm::get_spell_name(int spell_id) const +{ + return PlayerRealm::get_spell_name(this->realm_, spell_id); +} + +const std::string &PlayerRealm::Realm::get_spell_description(int spell_id) const +{ + return PlayerRealm::get_spell_description(this->realm_, spell_id); +} + ItemKindType PlayerRealm::Realm::get_book() const { return PlayerRealm::get_book(this->realm_); diff --git a/src/player/player-realm.h b/src/player/player-realm.h index 5e02731c8c..8c3295f37c 100644 --- a/src/player/player-realm.h +++ b/src/player/player-realm.h @@ -20,6 +20,8 @@ class PlayerRealm { static const LocalizedString &get_name(int realm); static const magic_type &get_spell_info(int realm, int spell_id, std::optional pclass = std::nullopt); + static const std::string &get_spell_name(int realm, int spell_id); + static const std::string &get_spell_description(int realm, int spell_id); static ItemKindType get_book(int realm); static RealmChoices get_realm1_choices(PlayerClassType pclass); static RealmChoices get_realm2_choices(PlayerClassType pclass); @@ -29,6 +31,8 @@ class PlayerRealm { Realm(int realm); const LocalizedString &get_name() const; const magic_type &get_spell_info(int spell_id) const; + const std::string &get_spell_name(int spell_id) const; + const std::string &get_spell_description(int spell_id) const; ItemKindType get_book() const; bool is_available() const; bool is_good_attribute() const; diff --git a/src/player/player-status.cpp b/src/player/player-status.cpp index 627bd1b325..53b13c56a0 100644 --- a/src/player/player-status.cpp +++ b/src/player/player-status.cpp @@ -567,28 +567,23 @@ static void update_num_of_spells(PlayerType *player_ptr) continue; } - int16_t which; if (j < 32) { set_bits(player_ptr->spell_forgotten1, (1UL << j)); - which = player_ptr->realm1; } else { set_bits(player_ptr->spell_forgotten2, (1UL << (j - 32))); - which = player_ptr->realm2; } if (j < 32) { reset_bits(player_ptr->spell_learned1, (1UL << j)); - which = player_ptr->realm1; } else { reset_bits(player_ptr->spell_learned2, (1UL << (j - 32))); - which = player_ptr->realm2; } - const auto spell_name = exe_spell(player_ptr, which, j % 32, SpellProcessType::NAME); + const auto &spell_name = realm.get_spell_name(j % 32); #ifdef JP - msg_format("%sの%sを忘れてしまった。", spell_name->data(), spell_category.data()); + msg_format("%sの%sを忘れてしまった。", spell_name.data(), spell_category.data()); #else - msg_format("You have forgotten the %s of %s.", spell_category.data(), spell_name->data()); + msg_format("You have forgotten the %s of %s.", spell_category.data(), spell_name.data()); #endif player_ptr->new_spells++; } @@ -612,28 +607,24 @@ static void update_num_of_spells(PlayerType *player_ptr) continue; } - int16_t which; if (j < 32) { set_bits(player_ptr->spell_forgotten1, (1UL << j)); - which = player_ptr->realm1; } else { set_bits(player_ptr->spell_forgotten2, (1UL << (j - 32))); - which = player_ptr->realm2; } if (j < 32) { reset_bits(player_ptr->spell_learned1, (1UL << j)); - which = player_ptr->realm1; } else { reset_bits(player_ptr->spell_learned2, (1UL << (j - 32))); - which = player_ptr->realm2; } - const auto spell_name = exe_spell(player_ptr, which, j % 32, SpellProcessType::NAME); + const auto &realm = (j < 32) ? pr.realm1() : pr.realm2(); + const auto &spell_name = realm.get_spell_name(j % 32); #ifdef JP - msg_format("%sの%sを忘れてしまった。", spell_name->data(), spell_category.data()); + msg_format("%sの%sを忘れてしまった。", spell_name.data(), spell_category.data()); #else - msg_format("You have forgotten the %s of %s.", spell_category.data(), spell_name->data()); + msg_format("You have forgotten the %s of %s.", spell_category.data(), spell_name.data()); #endif player_ptr->new_spells++; } @@ -663,28 +654,24 @@ static void update_num_of_spells(PlayerType *player_ptr) continue; } - int16_t which; if (j < 32) { reset_bits(player_ptr->spell_forgotten1, (1UL << j)); - which = player_ptr->realm1; } else { reset_bits(player_ptr->spell_forgotten2, (1UL << (j - 32))); - which = player_ptr->realm2; } if (j < 32) { set_bits(player_ptr->spell_learned1, (1UL << j)); - which = player_ptr->realm1; + } else { set_bits(player_ptr->spell_learned2, (1UL << (j - 32))); - which = player_ptr->realm2; } - const auto spell_name = exe_spell(player_ptr, which, j % 32, SpellProcessType::NAME); + const auto &spell_name = realm.get_spell_name(j % 32); #ifdef JP - msg_format("%sの%sを思い出した。", spell_name->data(), spell_category.data()); + msg_format("%sの%sを思い出した。", spell_name.data(), spell_category.data()); #else - msg_format("You have remembered the %s of %s.", spell_category.data(), spell_name->data()); + msg_format("You have remembered the %s of %s.", spell_category.data(), spell_name.data()); #endif player_ptr->new_spells--; } diff --git a/src/realm/realm-arcane.cpp b/src/realm/realm-arcane.cpp index ceacb34340..7b71c59912 100644 --- a/src/realm/realm-arcane.cpp +++ b/src/realm/realm-arcane.cpp @@ -23,7 +23,6 @@ #include "status/element-resistance.h" #include "status/sight-setter.h" #include "system/player-type-definition.h" -#include "system/spell-info-list.h" #include "target/target-getter.h" #include "util/dice.h" #include "view/display-messages.h" @@ -37,23 +36,12 @@ */ std::optional do_arcane_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_ARCANE]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { const Dice dice(3 + (plev - 1) / 5, 3); diff --git a/src/realm/realm-chaos.cpp b/src/realm/realm-chaos.cpp index feee044823..3165f4ea41 100644 --- a/src/realm/realm-chaos.cpp +++ b/src/realm/realm-chaos.cpp @@ -23,7 +23,6 @@ #include "status/shape-changer.h" #include "system/player-type-definition.h" #include "system/redrawing-flags-updater.h" -#include "system/spell-info-list.h" #include "target/target-getter.h" #include "util/dice.h" #include "view/display-messages.h" @@ -37,23 +36,12 @@ */ std::optional do_chaos_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_CHAOS]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { const Dice dice(3 + ((plev - 1) / 5), 4); diff --git a/src/realm/realm-craft.cpp b/src/realm/realm-craft.cpp index 8e58c65b09..c329da44f2 100644 --- a/src/realm/realm-craft.cpp +++ b/src/realm/realm-craft.cpp @@ -19,7 +19,6 @@ #include "status/element-resistance.h" #include "status/sight-setter.h" #include "system/player-type-definition.h" -#include "system/spell-info-list.h" #include "view/display-messages.h" /*! @@ -30,22 +29,11 @@ */ std::optional do_craft_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_CRAFT]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { int base = 100; diff --git a/src/realm/realm-crusade.cpp b/src/realm/realm-crusade.cpp index bace35563d..f1ac9ef38e 100644 --- a/src/realm/realm-crusade.cpp +++ b/src/realm/realm-crusade.cpp @@ -28,7 +28,6 @@ #include "status/buff-setter.h" #include "status/sight-setter.h" #include "system/player-type-definition.h" -#include "system/spell-info-list.h" #include "target/target-getter.h" #include "util/dice.h" #include "view/display-messages.h" @@ -43,23 +42,12 @@ */ std::optional do_crusade_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_CRUSADE]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { const Dice dice(3 + (plev - 1) / 5, 4); diff --git a/src/realm/realm-death.cpp b/src/realm/realm-death.cpp index 0480a2ff8a..e39993fb45 100644 --- a/src/realm/realm-death.cpp +++ b/src/realm/realm-death.cpp @@ -26,7 +26,6 @@ #include "status/experience.h" #include "status/shape-changer.h" #include "system/player-type-definition.h" -#include "system/spell-info-list.h" #include "target/target-getter.h" #include "util/dice.h" @@ -39,23 +38,12 @@ */ std::optional do_death_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_DEATH]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { POSITION rad = DETECT_RAD_DEFAULT; diff --git a/src/realm/realm-demon.cpp b/src/realm/realm-demon.cpp index 484725ecca..75d838397f 100644 --- a/src/realm/realm-demon.cpp +++ b/src/realm/realm-demon.cpp @@ -26,7 +26,6 @@ #include "status/sight-setter.h" #include "status/temporary-resistance.h" #include "system/player-type-definition.h" -#include "system/spell-info-list.h" #include "target/target-getter.h" #include "util/dice.h" #include "view/display-messages.h" @@ -40,23 +39,12 @@ */ std::optional do_daemon_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_DAEMON]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { const Dice dice(3 + (plev - 1) / 5, 4); diff --git a/src/realm/realm-hex.cpp b/src/realm/realm-hex.cpp index 8da1e15995..400e18f14d 100644 --- a/src/realm/realm-hex.cpp +++ b/src/realm/realm-hex.cpp @@ -26,6 +26,7 @@ #include "object/item-tester-hooker.h" #include "object/item-use-flags.h" #include "player/attack-defense-types.h" +#include "player/player-realm.h" #include "player/player-skill.h" #include "player/player-status.h" #include "spell-kind/magic-item-recharger.h" @@ -43,7 +44,6 @@ #include "system/item-entity.h" #include "system/player-type-definition.h" #include "system/redrawing-flags-updater.h" -#include "system/spell-info-list.h" #include "target/grid-selector.h" #include "target/target-getter.h" #include "term/screen-processor.h" @@ -64,8 +64,6 @@ */ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type spell, SpellProcessType mode) { - auto name = mode == SpellProcessType::NAME; - auto description = mode == SpellProcessType::DESCRIPTION; auto info = mode == SpellProcessType::INFO; auto cast = mode == SpellProcessType::CAST; auto continuation = mode == SpellProcessType::CONTNUATION; @@ -73,15 +71,6 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s auto should_continue = true; int power; - auto &list = SpellInfoList::get_instance().spell_list[REALM_HEX]; - - if (name) { - return list[spell].name; - } - if (description) { - return list[spell].description; - } - switch (spell) { /*** 1st book (0-7) ***/ case HEX_BLESS: @@ -561,8 +550,8 @@ std::optional do_hex_spell(PlayerType *player_ptr, spell_hex_type s } if (!flag) { - const auto spell_name = exe_spell(player_ptr, REALM_HEX, HEX_RESTORE, SpellProcessType::NAME); - msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%s^'."), spell_name->data()); + const auto &spell_name = PlayerRealm::get_spell_name(REALM_HEX, HEX_RESTORE); + msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%s^'."), spell_name.data()); SpellHex spell_hex(player_ptr); spell_hex.reset_casting_flag(HEX_RESTORE); if (!spell_hex.is_spelling_any()) { diff --git a/src/realm/realm-hissatsu.cpp b/src/realm/realm-hissatsu.cpp index f6d91edd22..7627e1b01c 100644 --- a/src/realm/realm-hissatsu.cpp +++ b/src/realm/realm-hissatsu.cpp @@ -46,7 +46,6 @@ #include "system/monster-race-info.h" #include "system/player-type-definition.h" #include "system/redrawing-flags-updater.h" -#include "system/spell-info-list.h" #include "target/grid-selector.h" #include "target/projection-path-calculator.h" #include "target/target-getter.h" @@ -65,21 +64,10 @@ */ std::optional do_hissatsu_spell(PlayerType *player_ptr, SPELL_IDX spell_id, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool cast = mode == SpellProcessType::CAST; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_HISSATSU]; - - if (name) { - return list[spell_id].name; - } - if (desc) { - return list[spell_id].description; - } - switch (spell_id) { case 0: if (cast) { diff --git a/src/realm/realm-life.cpp b/src/realm/realm-life.cpp index ea3632d7f8..f9ebb4b1fe 100644 --- a/src/realm/realm-life.cpp +++ b/src/realm/realm-life.cpp @@ -22,7 +22,6 @@ #include "status/temporary-resistance.h" #include "system/floor-type-definition.h" #include "system/player-type-definition.h" -#include "system/spell-info-list.h" #include "target/target-getter.h" #include "util/dice.h" @@ -35,23 +34,12 @@ */ std::optional do_life_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_LIFE]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { const Dice dice(2, 10); diff --git a/src/realm/realm-nature.cpp b/src/realm/realm-nature.cpp index 547e7f2d79..e12f004741 100644 --- a/src/realm/realm-nature.cpp +++ b/src/realm/realm-nature.cpp @@ -38,7 +38,6 @@ #include "sv-definition/sv-food-types.h" #include "system/item-entity.h" #include "system/player-type-definition.h" -#include "system/spell-info-list.h" #include "target/target-getter.h" #include "util/dice.h" #include "view/display-messages.h" @@ -52,23 +51,12 @@ */ std::optional do_nature_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_NATURE]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { POSITION rad = DETECT_RAD_DEFAULT; diff --git a/src/realm/realm-song.cpp b/src/realm/realm-song.cpp index 4159f7c996..d1e57e84be 100644 --- a/src/realm/realm-song.cpp +++ b/src/realm/realm-song.cpp @@ -23,7 +23,6 @@ #include "status/experience.h" #include "system/player-type-definition.h" #include "system/redrawing-flags-updater.h" -#include "system/spell-info-list.h" #include "target/target-getter.h" #include "timed-effect/timed-effects.h" #include "util/dice.h" @@ -61,8 +60,6 @@ static void start_singing(PlayerType *player_ptr, SPELL_IDX spell, int32_t song) */ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; bool fail = mode == SpellProcessType::FAIL; @@ -72,15 +69,6 @@ std::optional do_music_spell(PlayerType *player_ptr, SPELL_IDX spel DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_MUSIC]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: /* Stop singing before start another */ diff --git a/src/realm/realm-sorcery.cpp b/src/realm/realm-sorcery.cpp index b953716017..b1ff0358b9 100644 --- a/src/realm/realm-sorcery.cpp +++ b/src/realm/realm-sorcery.cpp @@ -23,7 +23,6 @@ #include "status/buff-setter.h" #include "status/sight-setter.h" #include "system/player-type-definition.h" -#include "system/spell-info-list.h" #include "target/target-getter.h" #include "util/dice.h" #include "view/display-messages.h" @@ -37,23 +36,12 @@ */ std::optional do_sorcery_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_SORCERY]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { POSITION rad = DETECT_RAD_DEFAULT; diff --git a/src/realm/realm-trump.cpp b/src/realm/realm-trump.cpp index 3b7ac13183..6329733317 100644 --- a/src/realm/realm-trump.cpp +++ b/src/realm/realm-trump.cpp @@ -23,7 +23,6 @@ #include "spell/summon-types.h" #include "status/sight-setter.h" #include "system/player-type-definition.h" -#include "system/spell-info-list.h" #include "target/target-checker.h" #include "target/target-getter.h" #include "target/target-setter.h" @@ -39,8 +38,6 @@ */ std::optional do_trump_spell(PlayerType *player_ptr, SPELL_IDX spell, SpellProcessType mode) { - bool name = mode == SpellProcessType::NAME; - bool desc = mode == SpellProcessType::DESCRIPTION; bool info = mode == SpellProcessType::INFO; bool cast = mode == SpellProcessType::CAST; bool fail = mode == SpellProcessType::FAIL; @@ -48,15 +45,6 @@ std::optional do_trump_spell(PlayerType *player_ptr, SPELL_IDX spel DIRECTION dir; PLAYER_LEVEL plev = player_ptr->lev; - auto &list = SpellInfoList::get_instance().spell_list[REALM_TRUMP]; - - if (name) { - return list[spell].name; - } - if (desc) { - return list[spell].description; - } - switch (spell) { case 0: { POSITION range = 10; diff --git a/src/spell-realm/spells-hex.cpp b/src/spell-realm/spells-hex.cpp index 9b7f73650f..49b64f5a20 100644 --- a/src/spell-realm/spells-hex.cpp +++ b/src/spell-realm/spells-hex.cpp @@ -170,8 +170,8 @@ void SpellHex::display_casting_spells_list() prt(_(" 名前", " Name"), y, x + 5); for (auto spell : this->casting_spells) { term_erase(x, y + n + 1); - const auto spell_name = exe_spell(this->player_ptr, REALM_HEX, spell, SpellProcessType::NAME); - put_str(format("%c) %s", I2A(n), spell_name->data()), y + n + 1, x + 2); + const auto &spell_name = PlayerRealm::get_spell_name(REALM_HEX, spell); + put_str(format("%c) %s", I2A(n), spell_name.data()), y + n + 1, x + 2); n++; } } diff --git a/src/spell/spell-info.cpp b/src/spell/spell-info.cpp index 2f2e4262a2..2e7719d549 100644 --- a/src/spell/spell-info.cpp +++ b/src/spell/spell-info.cpp @@ -326,11 +326,11 @@ void print_spells(PlayerType *player_ptr, SPELL_IDX target_spell_id, const SPELL line_attr = TERM_L_GREEN; } - const auto spell_name = exe_spell(player_ptr, use_realm, spell_id, SpellProcessType::NAME); + const auto &spell_name = PlayerRealm::get_spell_name(use_realm, spell_id); if (use_realm == REALM_HISSATSU) { - out_val.append(format("%-25s %2d %4d", spell_name->data(), spell.slevel, need_mana)); + out_val.append(format("%-25s %2d %4d", spell_name.data(), spell.slevel, need_mana)); } else { - out_val.append(format("%-25s%c%-4s %2d %4d %3d%% %s", spell_name->data(), (max ? '!' : ' '), ryakuji, spell.slevel, + out_val.append(format("%-25s%c%-4s %2d %4d %3d%% %s", spell_name.data(), (max ? '!' : ' '), ryakuji, spell.slevel, need_mana, spell_chance(player_ptr, spell_id, use_realm), comment)); } diff --git a/src/spell/spells-util.h b/src/spell/spells-util.h index 0cc2c0685d..5ceb3b7ac4 100644 --- a/src/spell/spells-util.h +++ b/src/spell/spells-util.h @@ -5,13 +5,11 @@ #define DETECT_RAD_ALL 255 enum class SpellProcessType { - NAME = 0, - DESCRIPTION = 1, - INFO = 2, - CAST = 3, - FAIL = 4, - STOP = 5, - CONTNUATION = 6 + INFO, + CAST, + FAIL, + STOP, + CONTNUATION, }; enum spell_operation { diff --git a/src/window/display-sub-windows.cpp b/src/window/display-sub-windows.cpp index e2f6df5ecb..392c236a4d 100644 --- a/src/window/display-sub-windows.cpp +++ b/src/window/display-sub-windows.cpp @@ -828,10 +828,10 @@ static void display_spell_list(PlayerType *player_ptr) for (int i = 0; i < 32; i++) { byte a = TERM_WHITE; - const auto realm = (j < 1) ? player_ptr->realm1 : player_ptr->realm2; - const auto &spell = PlayerRealm::get_spell_info(realm, i % 32); - const auto spell_name = exe_spell(player_ptr, realm, i % 32, SpellProcessType::NAME); - auto name = spell_name->data(); + const auto &realm = (j < 1) ? pr.realm1() : pr.realm2(); + const auto &spell = realm.get_spell_info(i); + const auto &spell_name = realm.get_spell_name(i % 32); + auto name = spell_name.data(); if (spell.slevel >= 99) { name = _("(判読不能)", "(illegible)"); diff --git a/src/wizard/wizard-spoiler.cpp b/src/wizard/wizard-spoiler.cpp index d908ef01b8..b3b941e93b 100644 --- a/src/wizard/wizard-spoiler.cpp +++ b/src/wizard/wizard-spoiler.cpp @@ -219,8 +219,8 @@ static SpoilerOutputResultType spoil_player_spell() spoil_out("Name Lv Cst Dif Exp\n"); for (SPELL_IDX i = 0; i < 32; i++) { const auto &spell = PlayerRealm::get_spell_info(realm, i, pclass); - const auto spell_name = exe_spell(&dummy_p, realm, i, SpellProcessType::NAME); - spoil_out(format("%-24s %2d %3d %3d %3d\n", spell_name->data(), spell.slevel, spell.smana, spell.sfail, spell.sexp)); + const auto &spell_name = PlayerRealm::get_spell_name(realm, i); + spoil_out(format("%-24s %2d %3d %3d %3d\n", spell_name.data(), spell.slevel, spell.smana, spell.sfail, spell.sexp)); } spoil_out("\n"); } From 88d7c9fa6c01dfae69165481e808a02cac7a63dd Mon Sep 17 00:00:00 2001 From: Habu Date: Wed, 3 Jul 2024 21:21:26 +0900 Subject: [PATCH 15/16] =?UTF-8?q?[Refactor]=20SpellInfoList=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=B9=E3=81=AE=E3=82=AB=E3=83=97=E3=82=BB=E3=83=AB?= =?UTF-8?q?=E5=8C=96=E3=82=92=E4=BF=83=E9=80=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SpellInfoListのデータメンバ spell_info のアクセルレベルをprivateにし、 get_spell_info メソッド経由で情報を取得するようにして実装のカプセル化を 促進する。 --- src/info-reader/spell-reader.cpp | 7 +++---- src/info-reader/spell-reader.h | 6 +++--- src/main/info-initializer.cpp | 8 +++++--- src/player/player-realm.cpp | 8 ++++---- src/system/spell-info-list.cpp | 15 +++++++++++++-- src/system/spell-info-list.h | 17 +++++++++++------ 6 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/info-reader/spell-reader.cpp b/src/info-reader/spell-reader.cpp index a512084bc6..de92e964a1 100644 --- a/src/info-reader/spell-reader.cpp +++ b/src/info-reader/spell-reader.cpp @@ -104,10 +104,10 @@ static errr set_book_data(const nlohmann::json &spell_data, std::vector> &spell_list) { int realm_id; if (auto err = set_realm(spell_data, realm_id)) { @@ -115,8 +115,7 @@ errr parse_spell_info(nlohmann::json &spell_data, angband_header *) return err; } - auto &spell_info_list = SpellInfoList::get_instance(); - auto &realm_spell_list = spell_info_list.spell_list[realm_id]; + auto &realm_spell_list = spell_list[realm_id]; if (auto err = set_book_data(spell_data, realm_spell_list)) { msg_format(_("呪文詳細読込失敗。ID: '%d'。", "Failed to load spell data. ID: '%d'."), error_idx); diff --git a/src/info-reader/spell-reader.h b/src/info-reader/spell-reader.h index 1b7cc2ba27..de9797aed7 100644 --- a/src/info-reader/spell-reader.h +++ b/src/info-reader/spell-reader.h @@ -2,7 +2,7 @@ #include "external-lib/include-json.h" #include "system/angband.h" -#include +#include -struct angband_header; -errr parse_spell_info(nlohmann::json &spell_data, angband_header *head); +class SpellInfo; +errr parse_spell_info(nlohmann::json &spell_data, std::vector> &spell_list); diff --git a/src/main/info-initializer.cpp b/src/main/info-initializer.cpp index efe7603e68..c7d6f8fe22 100644 --- a/src/main/info-initializer.cpp +++ b/src/main/info-initializer.cpp @@ -17,7 +17,6 @@ #include "info-reader/magic-reader.h" #include "info-reader/race-reader.h" #include "info-reader/skill-reader.h" -#include "info-reader/spell-reader.h" #include "info-reader/vault-reader.h" #include "io/files-util.h" #include "io/uid-checker.h" @@ -241,8 +240,11 @@ void init_spell_info() { init_header(&spells_header); auto &spell_info_list = SpellInfoList::get_instance(); - spell_info_list.initiallize(); - init_json("SpellDefinitions.jsonc", "realms", spells_header, spell_info_list, parse_spell_info); + spell_info_list.initialize(); + auto parser = [&spell_info_list](nlohmann::json &spell_data, angband_header *) { + return spell_info_list.parse(spell_data); + }; + init_json("SpellDefinitions.jsonc", "realms", spells_header, spell_info_list, parser); } /*! diff --git a/src/player/player-realm.cpp b/src/player/player-realm.cpp index 3cb754d22c..7d4fc971b1 100644 --- a/src/player/player-realm.cpp +++ b/src/player/player-realm.cpp @@ -122,8 +122,8 @@ const std::string &PlayerRealm::get_spell_name(int realm, int spell_id) THROW_EXCEPTION(std::invalid_argument, format("Invalid realm: %d", realm)); } - const auto &spell_info = SpellInfoList::get_instance().spell_list[realm]; - return spell_info[spell_id].name; + const auto &spell_info = SpellInfoList::get_instance().get_spell_info(realm, spell_id); + return spell_info.name; } const std::string &PlayerRealm::get_spell_description(int realm, int spell_id) @@ -137,8 +137,8 @@ const std::string &PlayerRealm::get_spell_description(int realm, int spell_id) THROW_EXCEPTION(std::invalid_argument, format("Invalid realm: %d", realm)); } - const auto &spell_info = SpellInfoList::get_instance().spell_list[realm]; - return spell_info[spell_id].description; + const auto &spell_info = SpellInfoList::get_instance().get_spell_info(realm, spell_id); + return spell_info.description; } ItemKindType PlayerRealm::get_book(int realm) diff --git a/src/system/spell-info-list.cpp b/src/system/spell-info-list.cpp index b42ae6ba89..d729f0314e 100644 --- a/src/system/spell-info-list.cpp +++ b/src/system/spell-info-list.cpp @@ -1,10 +1,11 @@ #include "system/spell-info-list.h" +#include "info-reader/spell-reader.h" #include "realm/realm-types.h" #include SpellInfoList SpellInfoList::instance{}; -void SpellInfoList::initiallize() +void SpellInfoList::initialize() { this->spell_list.assign(magic_realm_type::REALM_MAX, std::vector(SPELLS_IN_REALM)); } @@ -14,7 +15,7 @@ SpellInfoList &SpellInfoList::get_instance() return instance; } -std::optional SpellInfoList::get_spell_id(int realm_id, std::string_view spell_tag) +std::optional SpellInfoList::get_spell_id(int realm_id, std::string_view spell_tag) const { const auto &realm = this->spell_list[realm_id]; const auto result = std::find_if(realm.begin(), realm.end(), [spell_tag](auto &spell_info) { @@ -26,3 +27,13 @@ std::optional SpellInfoList::get_spell_id(int realm_id, std::string_view } return (*result).idx; } + +const SpellInfo &SpellInfoList::get_spell_info(int realm_id, int spell_id) const +{ + return this->spell_list[realm_id][spell_id]; +} + +errr SpellInfoList::parse(nlohmann::json &spell_data) +{ + return parse_spell_info(spell_data, this->spell_list); +} diff --git a/src/system/spell-info-list.h b/src/system/spell-info-list.h index 87c51b41f5..ac9a1d39df 100644 --- a/src/system/spell-info-list.h +++ b/src/system/spell-info-list.h @@ -1,9 +1,11 @@ #pragma once -#include "realm/realm-types.h" +#include "external-lib/include-json.h" #include "system/angband.h" -#include "util/flag-group.h" -#include +#include +#include +#include +#include #include constexpr int SPELLS_IN_REALM = 32; @@ -43,15 +45,18 @@ class SpellInfoList { SpellInfoList &operator=(SpellInfoList &&) = delete; ~SpellInfoList() = default; - void initiallize(); + void initialize(); + errr parse(nlohmann::json &spell_data); static SpellInfoList &get_instance(); - std::vector> spell_list{}; - std::optional get_spell_id(int realm, std::string_view spell_tag); + std::optional get_spell_id(int realm, std::string_view spell_tag) const; + const SpellInfo &get_spell_info(int realm, int spell_id) const; private: SpellInfoList() = default; static SpellInfoList instance; + + std::vector> spell_list{}; }; From 902c4a76a2a11ced1050dffd3bb78cdf26fc0635 Mon Sep 17 00:00:00 2001 From: Habu Date: Wed, 3 Jul 2024 22:10:59 +0900 Subject: [PATCH 16/16] =?UTF-8?q?[Refactor]=20=E9=A0=98=E5=9F=9F=E3=81=AE?= =?UTF-8?q?=E8=AA=AC=E6=98=8E=E3=81=AE=E5=8F=96=E5=BE=97=E5=87=A6=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 領域の説明の取得で、通常の魔法領域と歌・武芸・呪術が同じ配列上に詰めて 配置されているため technic2magic というマクロで無理やり要素番号を計算 して取得している。 これをやめ、まず魔法領域と歌・武芸・呪術で配列を分け、取得はPlayerRealm クラスにget_explanationとget_subinfoを実装しこのメンバ関数によって行う ように修正する。 --- src/birth/birth-explanations-table.cpp | 9 +++++-- src/birth/birth-explanations-table.h | 6 +++-- src/birth/birth-select-realm.cpp | 8 +++--- src/knowledge/knowledge-self.cpp | 4 +-- src/player/player-realm.cpp | 37 ++++++++++++++++++++++++++ src/player/player-realm.h | 6 +++++ src/realm/realm-names-table.h | 1 - 7 files changed, 60 insertions(+), 11 deletions(-) diff --git a/src/birth/birth-explanations-table.cpp b/src/birth/birth-explanations-table.cpp index faa3092f58..223bc0bdcf 100644 --- a/src/birth/birth-explanations-table.cpp +++ b/src/birth/birth-explanations-table.cpp @@ -252,7 +252,7 @@ const std::vector personality_explanations = { }; /*! 魔法領域の詳細解説メッセージテーブル */ -const std::vector realm_explanations = { +const std::vector magic_explanations = { _("生命は回復能力に優れた魔法です。治療や防御、感知魔法が多く含まれていますが、攻撃呪文もわずかに持っています。特に高レベルの呪文にはアンデッドを塵に帰す力をあると言われています。", "Life magic is very good for healing; it relies mostly on healing, protection and detection spells. Also life magic has a few attack spells as well. It's said that some high level spells of life magic can disintegrate Undead monsters into ash."), @@ -282,7 +282,9 @@ const std::vector realm_explanations = { _("破邪は「正義」の魔法です。直接敵を傷つける魔法が多く含まれ、特に邪悪な敵に対する力は恐るべきものがあります。しかし、善良な敵にはあまり効果がありません。", "Crusade is a magic of 'Justice'. It includes damage spells, which are greatly effective against foul and evil monsters, but have poor effects against good monsters."), +}; +const std::vector technic_explanations = { _("歌集は、歌によって効果を発揮する魔法です。魔法と同様、使った時に効果のあるものと、歌い続けることによって持続して効果を発揮するものがあります。後者の場合は、MPの続く限り効果を発揮することができますが、同時に歌える歌は1つだけという制限もあります。", "Music magic works through the caster singing songs. There are two types of songs; one which shows effects instantly and another which shows effects continuously until SP runs out. The latter type has a limit: only one song can be sung at a time."), @@ -294,7 +296,7 @@ const std::vector realm_explanations = { }; /*! 魔法領域の簡易解説メッセージテーブル */ -const std::vector realm_subinfo = { +const std::vector magic_subinfo = { _("感知と防御と回復に優れています", "Good at detection and healing."), _("攻撃はできませんが非常に便利です", "Utility and protective spells."), _("感知と防御に優れています", "Good at detection and defence."), @@ -305,6 +307,9 @@ const std::vector realm_subinfo = { _("直接戦闘の補助に優れています", "Support for melee fighting."), _("攻撃と防御の両面に優れています", "Good at both offence and defence."), _("邪悪な怪物に対する攻撃に優れています", "Destroys evil creatures."), +}; + +const std::vector technic_subinfo = { _("様々な魔法効果を持った歌を歌います", "Songs with magical effects."), _("打撃攻撃に特殊能力を付加します", "Special abilities for melee."), _("敵を邪魔しつつ復讐を狙います", "Good at obstacle and revenge."), diff --git a/src/birth/birth-explanations-table.h b/src/birth/birth-explanations-table.h index 29d47f1ccd..112f14c8c6 100644 --- a/src/birth/birth-explanations-table.h +++ b/src/birth/birth-explanations-table.h @@ -6,5 +6,7 @@ extern const std::vector race_explanations; extern const std::vector class_explanations; extern const std::vector personality_explanations; -extern const std::vector realm_explanations; -extern const std::vector realm_subinfo; +extern const std::vector magic_explanations; +extern const std::vector technic_explanations; +extern const std::vector magic_subinfo; +extern const std::vector technic_subinfo; diff --git a/src/birth/birth-select-realm.cpp b/src/birth/birth-select-realm.cpp index 3765b5bacf..0909bed5a7 100644 --- a/src/birth/birth-select-realm.cpp +++ b/src/birth/birth-select-realm.cpp @@ -1,5 +1,4 @@ #include "birth/birth-select-realm.h" -#include "birth/birth-explanations-table.h" #include "birth/birth-util.h" #include "core/asking-player.h" #include "io/input-key-acceptor.h" @@ -91,12 +90,13 @@ static void move_birth_realm_cursor(birth_realm_type *birth_realm_ptr) if (birth_realm_ptr->cs == birth_realm_ptr->n) { birth_realm_ptr->cur = format("%c%c %s", '*', birth_realm_ptr->p2, _("ランダム", "Random")); } else { - const auto &realm_name = PlayerRealm::get_name(birth_realm_ptr->picks[birth_realm_ptr->cs]); + const auto realm = birth_realm_ptr->picks[birth_realm_ptr->cs]; + const auto &realm_name = PlayerRealm::get_name(realm); birth_realm_ptr->cur = format("%c%c %s", birth_realm_ptr->sym[birth_realm_ptr->cs], birth_realm_ptr->p2, realm_name.data()); c_put_str(TERM_L_BLUE, realm_name, 3, 40); prt(_("の特徴", ": Characteristic"), 3, 40 + realm_name->length()); - prt(realm_subinfo[technic2magic(birth_realm_ptr->picks[birth_realm_ptr->cs]) - 1], 4, 40); + prt(PlayerRealm::get_subinfo(realm), 4, 40); } c_put_str(TERM_YELLOW, birth_realm_ptr->cur, 12 + (birth_realm_ptr->cs / 5), 2 + 15 * (birth_realm_ptr->cs % 5)); @@ -255,7 +255,7 @@ static std::optional process_choose_realm(PlayerType *player_p } cleanup_realm_selection_window(); - display_wrap_around(realm_explanations[technic2magic(*selected_realm) - 1], 74, 12, 3); + display_wrap_around(PlayerRealm::get_explanation(*selected_realm), 74, 12, 3); if (check_realm_selection(player_ptr, choices.count())) { return selected_realm; diff --git a/src/knowledge/knowledge-self.cpp b/src/knowledge/knowledge-self.cpp index 529c0c6b9c..bc84753882 100644 --- a/src/knowledge/knowledge-self.cpp +++ b/src/knowledge/knowledge-self.cpp @@ -85,13 +85,13 @@ static void dump_yourself(PlayerType *player_ptr, FILE *fff) PlayerRealm pr(player_ptr); if (pr.realm1().is_available()) { fprintf(fff, _("魔法: %s\n", "Realm: %s\n"), pr.realm1().get_name().data()); - dump_explanation(realm_explanations[technic2magic(player_ptr->realm1) - 1], fff); + dump_explanation(pr.realm1().get_explanation(), fff); } fprintf(fff, "\n"); if (pr.realm2().is_available()) { fprintf(fff, _("魔法: %s\n", "Realm: %s\n"), pr.realm2().get_name().data()); - dump_explanation(realm_explanations[technic2magic(player_ptr->realm2) - 1], fff); + dump_explanation(pr.realm2().get_explanation(), fff); } } diff --git a/src/player/player-realm.cpp b/src/player/player-realm.cpp index 7d4fc971b1..79ea45675b 100644 --- a/src/player/player-realm.cpp +++ b/src/player/player-realm.cpp @@ -1,4 +1,5 @@ #include "player/player-realm.h" +#include "birth/birth-explanations-table.h" #include "locale/localized-string.h" #include "object/tval-types.h" #include "player-info/class-info.h" @@ -90,6 +91,32 @@ const LocalizedString &PlayerRealm::get_name(int realm) return it->second; } +std::string_view PlayerRealm::get_explanation(int realm) +{ + const auto realm_enum = i2enum(realm); + if (MAGIC_REALM_RANGE.contains(realm_enum)) { + return magic_explanations[realm - 1]; + } + if (TECHNIC_REALM_RANGE.contains(realm_enum)) { + return technic_explanations[realm - MIN_TECHNIC]; + } + + THROW_EXCEPTION(std::invalid_argument, format("Invalid realm: %d", realm)); +} + +std::string_view PlayerRealm::get_subinfo(int realm) +{ + const auto realm_enum = i2enum(realm); + if (MAGIC_REALM_RANGE.contains(realm_enum)) { + return magic_subinfo[realm - 1]; + } + if (TECHNIC_REALM_RANGE.contains(realm_enum)) { + return technic_subinfo[realm - MIN_TECHNIC]; + } + + THROW_EXCEPTION(std::invalid_argument, format("Invalid realm: %d", realm)); +} + const magic_type &PlayerRealm::get_spell_info(int realm, int spell_id, std::optional pclass) { if (spell_id < 0 || 32 <= spell_id) { @@ -193,6 +220,16 @@ const LocalizedString &PlayerRealm::Realm::get_name() const return PlayerRealm::get_name(this->realm_); } +std::string_view PlayerRealm::Realm::get_explanation() const +{ + return PlayerRealm::get_explanation(this->realm_); +} + +std::string_view PlayerRealm::Realm::get_subinfo() const +{ + return PlayerRealm::get_subinfo(this->realm_); +} + const magic_type &PlayerRealm::Realm::get_spell_info(int spell_id) const { return PlayerRealm::get_spell_info(this->realm_, spell_id); diff --git a/src/player/player-realm.h b/src/player/player-realm.h index 8c3295f37c..ae61539664 100644 --- a/src/player/player-realm.h +++ b/src/player/player-realm.h @@ -5,6 +5,8 @@ #include "util/flag-group.h" #include #include +#include +#include #include using RealmChoices = FlagGroup; @@ -19,6 +21,8 @@ class PlayerRealm { PlayerRealm(PlayerType *player_ptr); static const LocalizedString &get_name(int realm); + static std::string_view get_explanation(int realm); + static std::string_view get_subinfo(int realm); static const magic_type &get_spell_info(int realm, int spell_id, std::optional pclass = std::nullopt); static const std::string &get_spell_name(int realm, int spell_id); static const std::string &get_spell_description(int realm, int spell_id); @@ -30,6 +34,8 @@ class PlayerRealm { public: Realm(int realm); const LocalizedString &get_name() const; + std::string_view get_explanation() const; + std::string_view get_subinfo() const; const magic_type &get_spell_info(int spell_id) const; const std::string &get_spell_name(int spell_id) const; const std::string &get_spell_description(int spell_id) const; diff --git a/src/realm/realm-names-table.h b/src/realm/realm-names-table.h index 3ed7afa022..ae640f18c0 100644 --- a/src/realm/realm-names-table.h +++ b/src/realm/realm-names-table.h @@ -18,4 +18,3 @@ constexpr auto VALID_REALM = std::ssize(MAGIC_REALM_RANGE) + std::ssize(TECHNIC_ enum class ItemKindType : short; #define tval2realm(A) (i2enum((A)-ItemKindType::LIFE_BOOK + 1)) -#define technic2magic(A) (is_magic(A) ? (A) : (A)-MIN_TECHNIC + 1 + MAX_MAGIC)