diff options
-rw-r--r-- | lib/core/init.lua | 1 | ||||
-rw-r--r-- | lib/core/mimc_aux.lua | 96 | ||||
-rw-r--r-- | lib/mods/theme/core/init.lua | 1 | ||||
-rw-r--r-- | lib/mods/theme/core/mimc_aux.lua | 96 | ||||
-rw-r--r-- | lib/mods/theme/scpt/init.lua | 3 | ||||
-rw-r--r-- | lib/mods/theme/scpt/mimic.lua | 419 | ||||
-rw-r--r-- | lib/scpt/init.lua | 3 | ||||
-rw-r--r-- | lib/scpt/mimic.lua | 419 | ||||
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/cmd6.c | 4 | ||||
-rw-r--r-- | src/cmd7.c | 2 | ||||
-rw-r--r-- | src/defines.h | 1 | ||||
-rw-r--r-- | src/externs.h | 11 | ||||
-rw-r--r-- | src/files.c | 2 | ||||
-rw-r--r-- | src/mimic.c | 684 | ||||
-rw-r--r-- | src/object1.c | 4 | ||||
-rw-r--r-- | src/object2.c | 8 | ||||
-rw-r--r-- | src/randart.c | 3 | ||||
-rw-r--r-- | src/types.h | 26 | ||||
-rw-r--r-- | src/util.pkg | 5 | ||||
-rw-r--r-- | src/xtra1.c | 14 | ||||
-rw-r--r-- | src/xtra2.c | 11 |
22 files changed, 739 insertions, 1076 deletions
diff --git a/lib/core/init.lua b/lib/core/init.lua index 3db34076..9d0c01a3 100644 --- a/lib/core/init.lua +++ b/lib/core/init.lua @@ -17,7 +17,6 @@ tome_dofile_anywhere(ANGBAND_DIR_CORE, "monsters.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "building.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "dungeon.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "s_aux.lua") -tome_dofile_anywhere(ANGBAND_DIR_CORE, "mimc_aux.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "quests.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "gods.lua") diff --git a/lib/core/mimc_aux.lua b/lib/core/mimc_aux.lua deleted file mode 100644 index cea1f4dc..00000000 --- a/lib/core/mimc_aux.lua +++ /dev/null @@ -1,96 +0,0 @@ --- Mimic shapes helper file - -__mimics = {} -__mimics_max = 1 -__mimics_names = {} - -function add_mimic_shape(t) - assert(t.name, "no mimic name") - assert(t.desc, "no mimic desc") - assert(t.calc, "no mimic calc") - assert(t.level, "no mimic level") - assert(t.duration, "no mimic duration") - - if not t.limit then t.limit = 0 end - - if not t.obj_name then - t.obj_name = t.name - end - - t.show_name = '['..t.name..']' - - -- if it needs hooks, add them - if t.hooks then - add_hooks(t.hooks) - end - - -- Add it in a name to index hash table - __mimics_names[t.name] = __mimics_max - - __mimics[__mimics_max] = t - __mimics_max = __mimics_max + 1 -end - -function resolve_mimic_name(name) - if __mimics_names[name] then - return __mimics_names[name] - else - return -1 - end -end - -function find_random_mimic_shape(level, limit, realm) - local mimic, tries - - tries = 1000 - while tries > 0 do - tries = tries - 1 - mimic = rand_range(1, __mimics_max - 1) - if (not realm) or (__mimics[mimic].realm == realm) then - if limit >= __mimics[mimic].limit then - if (rand_int(__mimics[mimic].level * 3) < level) and (__mimics[mimic].rarity < 100) and (magik(100 - __mimics[mimic].rarity) == TRUE) then - break - end - end - end - end - if tries > 0 then - return mimic - else - return resolve_mimic_name("Abomination") - end -end - -function get_mimic_info(mimic, info) - if not __mimics[mimic] then return 0 end - return __mimics[mimic][info] -end - -function get_mimic_rand_dur(mimic) - return rand_range(__mimics[mimic].duration[1], __mimics[mimic].duration[2]) -end - -function calc_mimic(mimic) - return __mimics[mimic].calc() -end - -function calc_mimic_power(mimic) - if __mimics[mimic].power then __mimics[mimic].power() end -end - ---- Here comes the only vital shape - -add_mimic_shape -{ - ["name"] = "Abomination", - ["obj_name"] = "Abominable Cloak", - ["desc"] = "Abominations are failed experiments of powerful wizards.", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {20, 100}, - ["calc"] = function () - apply_flags(TR1_SPEED + TR1_STR + TR1_INT + TR1_WIS + TR1_DEX + TR1_CON + TR1_CHR, 0, 0, 0, 0, 0, -10) - player.xtra_f3 = bor(player.xtra_f3, TR3_AGGRAVATE) - end, -} diff --git a/lib/mods/theme/core/init.lua b/lib/mods/theme/core/init.lua index 3db34076..9d0c01a3 100644 --- a/lib/mods/theme/core/init.lua +++ b/lib/mods/theme/core/init.lua @@ -17,7 +17,6 @@ tome_dofile_anywhere(ANGBAND_DIR_CORE, "monsters.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "building.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "dungeon.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "s_aux.lua") -tome_dofile_anywhere(ANGBAND_DIR_CORE, "mimc_aux.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "quests.lua") tome_dofile_anywhere(ANGBAND_DIR_CORE, "gods.lua") diff --git a/lib/mods/theme/core/mimc_aux.lua b/lib/mods/theme/core/mimc_aux.lua deleted file mode 100644 index cea1f4dc..00000000 --- a/lib/mods/theme/core/mimc_aux.lua +++ /dev/null @@ -1,96 +0,0 @@ --- Mimic shapes helper file - -__mimics = {} -__mimics_max = 1 -__mimics_names = {} - -function add_mimic_shape(t) - assert(t.name, "no mimic name") - assert(t.desc, "no mimic desc") - assert(t.calc, "no mimic calc") - assert(t.level, "no mimic level") - assert(t.duration, "no mimic duration") - - if not t.limit then t.limit = 0 end - - if not t.obj_name then - t.obj_name = t.name - end - - t.show_name = '['..t.name..']' - - -- if it needs hooks, add them - if t.hooks then - add_hooks(t.hooks) - end - - -- Add it in a name to index hash table - __mimics_names[t.name] = __mimics_max - - __mimics[__mimics_max] = t - __mimics_max = __mimics_max + 1 -end - -function resolve_mimic_name(name) - if __mimics_names[name] then - return __mimics_names[name] - else - return -1 - end -end - -function find_random_mimic_shape(level, limit, realm) - local mimic, tries - - tries = 1000 - while tries > 0 do - tries = tries - 1 - mimic = rand_range(1, __mimics_max - 1) - if (not realm) or (__mimics[mimic].realm == realm) then - if limit >= __mimics[mimic].limit then - if (rand_int(__mimics[mimic].level * 3) < level) and (__mimics[mimic].rarity < 100) and (magik(100 - __mimics[mimic].rarity) == TRUE) then - break - end - end - end - end - if tries > 0 then - return mimic - else - return resolve_mimic_name("Abomination") - end -end - -function get_mimic_info(mimic, info) - if not __mimics[mimic] then return 0 end - return __mimics[mimic][info] -end - -function get_mimic_rand_dur(mimic) - return rand_range(__mimics[mimic].duration[1], __mimics[mimic].duration[2]) -end - -function calc_mimic(mimic) - return __mimics[mimic].calc() -end - -function calc_mimic_power(mimic) - if __mimics[mimic].power then __mimics[mimic].power() end -end - ---- Here comes the only vital shape - -add_mimic_shape -{ - ["name"] = "Abomination", - ["obj_name"] = "Abominable Cloak", - ["desc"] = "Abominations are failed experiments of powerful wizards.", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {20, 100}, - ["calc"] = function () - apply_flags(TR1_SPEED + TR1_STR + TR1_INT + TR1_WIS + TR1_DEX + TR1_CON + TR1_CHR, 0, 0, 0, 0, 0, -10) - player.xtra_f3 = bor(player.xtra_f3, TR3_AGGRAVATE) - end, -} diff --git a/lib/mods/theme/scpt/init.lua b/lib/mods/theme/scpt/init.lua index 7a229abd..063ca21b 100644 --- a/lib/mods/theme/scpt/init.lua +++ b/lib/mods/theme/scpt/init.lua @@ -11,9 +11,6 @@ tome_dofile("help.lua") -- let the store specific stuff happen! tome_dofile("stores.lua") --- Add the mimic shapes -tome_dofile("mimic.lua") - -- Add the mkey activations tome_dofile("mkeys.lua") diff --git a/lib/mods/theme/scpt/mimic.lua b/lib/mods/theme/scpt/mimic.lua deleted file mode 100644 index f38f70f7..00000000 --- a/lib/mods/theme/scpt/mimic.lua +++ /dev/null @@ -1,419 +0,0 @@ --- Define the various possible mimic shapes - --- Nature shapes -add_mimic_shape -{ - ["name"] = "Mouse", - ["obj_name"] = "Mouse Fur", - ["desc"] = "Mice are small, fast and very stealthy", - ["realm"] = "nature", - ["level"] = 1, - ["rarity"] = 10, - ["duration"] = {20, 40}, - ["calc"] = function () - -- Mice run! - player.pspeed = player.pspeed + 5 + (player.mimic_level / 7) - - -- They can crtawl under your armor to hit you ;) - player.to_h = player.to_h + 10 + (player.mimic_level / 5) - player.dis_to_h = player.dis_to_h + 10 + (player.mimic_level / 5) - - -- But they are not very powerfull - player.to_d = player.to_d / 5 - player.dis_to_d = player.dis_to_d / 5 - - -- But they are stealthy - player.skill_stl = player.skill_stl + 10 + (player.mimic_level / 5) - - -- Stat mods - player.modify_stat(A_STR, -5) - player.modify_stat(A_DEX, 3) - player.modify_stat(A_CON, 1) - - end, - ["power"] = function() - if player.mimic_level >= 30 then - player.add_power(POWER_INVISIBILITY) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Eagle", - ["obj_name"] = "Feathered Cloak", - ["desc"] = "Eagles are master of the air, good hunters with excellent vision.", - ["realm"] = "nature", - ["level"] = 10, - ["rarity"] = 30, - ["duration"] = {10, 50}, - ["calc"] = function () - player.ffall = TRUE - player.pspeed = player.pspeed + 2 + (player.mimic_level / 6) - - player.modify_stat(A_STR, -3) - player.modify_stat(A_DEX, 2 + (player.mimic_level / 15)) - player.modify_stat(A_CON, 4 + (player.mimic_level / 20)) - player.modify_stat(A_INT, -1) - player.modify_stat(A_WIS, 1) - player.modify_stat(A_CHR, -1) - - if player.mimic_level >= 20 then - player.xtra_f4 = bor(player.xtra_f4, TR4_FLY) - player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS) - end - if player.mimic_level >= 25 then - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - end - if player.mimic_level >= 30 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_ELEC) - end - if player.mimic_level >= 30 then - player.xtra_f3 = bor(player.xtra_f3, TR3_SH_ELEC) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Wolf", - ["obj_name"] = "Wolf Pelt", - ["desc"] = "Wolves are masters of movement, strong and have excellent eyesight.", - ["realm"] = "nature", - ["level"] = 20, - ["rarity"] = 40, - ["duration"] = {10, 50}, - ["calc"] = function () - player.modify_stat(A_STR, 2 + (player.mimic_level / 20)) - player.modify_stat(A_DEX, 3 + (player.mimic_level / 20)) - player.modify_stat(A_INT, -3) - player.modify_stat(A_CHR, -2) - - player.pspeed = player.pspeed + 10 + (player.mimic_level / 5) - - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_FEAR) - - if player.mimic_level >= 10 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_COLD) - end - if player.mimic_level >= 15 then - player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS) - end - if player.mimic_level >= 30 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK) - end - if player.mimic_level >= 35 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CONF) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Spider", - ["obj_name"] = "Spider Web", - ["desc"] = "Spiders are clever and become good climbers.", - ["realm"] = "nature", - ["level"] = 25, - ["rarity"] = 50, - ["duration"] = {10, 50}, - ["calc"] = function () - player.modify_stat(A_STR, -4) - player.modify_stat(A_DEX, 1 + (player.mimic_level / 8)) - player.modify_stat(A_INT, 1 + (player.mimic_level / 5)) - player.modify_stat(A_WIS, 1 + (player.mimic_level / 5)) - player.modify_stat(A_CON, -5) - player.modify_stat(A_CHR, -10) - - player.pspeed = player.pspeed + 5 - - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_FEAR) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK) - - if player.mimic_level >= 40 then - player.xtra_f4 = bor(player.xtra_f4, TR4_CLIMB) - end - - end, - ["power"] = function() - if player.mimic_level >= 25 then - player.add_power(POWER_WEB) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Elder Ent", - ["obj_name"] = "Entish Bark", - ["desc"] = "Ents are powerful tree-like beings dating from the dawn of time.", - ["realm"] = "nature", - ["level"] = 40, - ["rarity"] = 60, - ["duration"] = {10, 30}, - ["limit"] = TRUE, - ["calc"] = function () - player.pspeed = player.pspeed - 5 - (player.mimic_level / 10) - - player.to_a = player.to_a + 10 + player.mimic_level - player.dis_to_a = player.dis_to_a + 10 + player.mimic_level - - player.modify_stat(A_STR, player.mimic_level / 5) - player.modify_stat(A_INT, - (player.mimic_level / 7)) - player.modify_stat(A_WIS, - (player.mimic_level / 7)) - player.modify_stat(A_DEX, -4) - player.modify_stat(A_CON, player.mimic_level / 5) - player.modify_stat(A_CHR, -7) - - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_COLD) - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_SENS_FIRE) - end, - ["power"] = function () - player.add_power(PWR_GROW_TREE) - end, -} - -add_mimic_shape -{ - ["name"] = "Vapour", - ["obj_name"] = "Cloak of Mist", - ["desc"] = "A sentient cloud, darting around", - ["realm"] = "nature", - ["level"] = 15, - ["rarity"] = 10, - ["duration"] = {10, 40}, - ["calc"] = function () - - player.pspeed = player.pspeed + 5 - - --Try to hit a cloud! - player.to_a = player.to_a + 40 + player.mimic_level - player.dis_to_a = player.dis_to_a + 40 + player.mimic_level - - --Try to hit WITH a cloud! - player.to_h = player.to_h - 40 - player.dis_to_h = player.dis_to_h -40 - - -- Stat mods - player.modify_stat(A_STR, -4) - player.modify_stat(A_DEX, 5) - player.modify_stat(A_CON, -4) - player.modify_stat(A_CHR, -10) - - -- But they are stealthy - player.skill_stl = player.skill_stl + 10 + (player.mimic_level / 5) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_SHARDS) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_COLD) - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_SENS_FIRE) - player.xtra_f3 = bor(player.xtra_f3, TR3_FEATHER) - end, -} - -add_mimic_shape -{ - ["name"] = "Serpent", - ["obj_name"] = "Snakeskin Cloak", - ["desc"] = "Serpents are fast, lethal predators.", - ["realm"] = "nature", - ["level"] = 30, - ["rarity"] = 25, - ["duration"] = {15, 20}, - ["calc"] = function () - player.pspeed = player.pspeed + 10 + (player.mimic_level / 6) - player.to_a = player.to_a + 3 + (player.mimic_level / 8) - player.dis_to_a = player.dis_to_a + 3 + (player.mimic_level / 8) - - player.modify_stat(A_STR, player.mimic_level / 8) - player.modify_stat(A_INT, -6) - player.modify_stat(A_WIS, -6) - player.modify_stat(A_DEX, -4) - player.modify_stat(A_CON, player.mimic_level / 7) - player.modify_stat(A_CHR, -6) - - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - if player.mimic_level >= 25 then - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Mumak", - ["obj_name"] = "Mumak Hide", - ["desc"] = "A giant, elaphantine form.", - ["realm"] = "nature", - ["level"] = 40, - ["rarity"] = 40, - ["duration"] = {15, 20}, - ["calc"] = function () - player.pspeed = player.pspeed - 5 - (player.mimic_level / 10) - player.to_a = player.to_a + 10 + (player.mimic_level / 6) - player.dis_to_a = player.dis_to_a + 10 + (player.mimic_level / 6) - player.to_d = player.to_d + 5 + ((player.mimic_level * 2) / 3) - player.dis_to_d = player.dis_to_d + 5 + ((player.mimic_level * 2) / 3) - - player.modify_stat(A_STR, player.mimic_level / 4) - player.modify_stat(A_INT, -8) - player.modify_stat(A_WIS, -4) - player.modify_stat(A_DEX, -5) - player.modify_stat(A_CON, player.mimic_level / 3) - player.modify_stat(A_CHR, -10) - - if player.mimic_level >= 10 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_FEAR) - end - if player.mimic_level >= 25 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CONF) - end - if player.mimic_level >= 30 then - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - end - if player.mimic_level >= 35 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_NEXUS) - end - end, -} - ---------- Extra shapes ----------- - --- For Beornings -add_mimic_shape -{ - ["name"] = "Bear", - ["desc"] = "A fierce, terrible bear.", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {50, 200}, - ["limit"] = TRUE, - ["calc"] = function () - player.pspeed = player.pspeed - 5 + (player.mimic_level / 5) - - player.to_a = player.to_a + 5 + ((player.mimic_level * 2) / 3) - player.dis_to_a = player.dis_to_a + 5 + ((player.mimic_level * 2) / 3) - - player.modify_stat(A_STR, player.mimic_level / 11) - player.modify_stat(A_INT, player.mimic_level / 11) - player.modify_stat(A_WIS, player.mimic_level / 11) - player.modify_stat(A_DEX, -1) - player.modify_stat(A_CON, player.mimic_level / 11) - player.modify_stat(A_CHR, -10) - - if player.mimic_level >= 10 then - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - end - if player.mimic_level >= 20 then - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - end - if player.mimic_level >= 30 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CONF) - end - if player.mimic_level >= 35 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_NEXUS) - end - - -- activate the skill - skill(SKILL_BEAR).hidden = FALSE - end, -} - --- For balrog corruptions -add_mimic_shape -{ - ["name"] = "Balrog", - ["desc"] = "A corrupted maia.", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {30, 70}, - ["limit"] = TRUE, - ["calc"] = function () - player.modify_stat(A_STR, 5 + player.mimic_level / 5) - player.modify_stat(A_INT, player.mimic_level / 10) - player.modify_stat(A_WIS, - ( 5 + player.mimic_level / 10)) - player.modify_stat(A_DEX, player.mimic_level / 10) - player.modify_stat(A_CON, 5 + player.mimic_level / 5) - player.modify_stat(A_CHR, - ( 5 + player.mimic_level / 10)) - - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ACID) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ELEC) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CHAOS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_HOLD_LIFE) - player.xtra_f3 = bor(player.xtra_f3, TR3_FEATHER) - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - player.xtra_f3 = bor(player.xtra_f3, TR3_SH_FIRE) - player.xtra_f3 = bor(player.xtra_f3, TR3_LITE1) - return 1 - end, -} - --- For avatar spell -add_mimic_shape -{ - ["name"] = "Maia", - ["desc"] = "A near god-like being.", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {30, 70}, - ["limit"] = TRUE, - ["calc"] = function () - player.modify_stat(A_STR, 5 + player.mimic_level / 5) - player.modify_stat(A_INT, 5 + player.mimic_level / 5) - player.modify_stat(A_WIS, 5 + player.mimic_level / 5) - player.modify_stat(A_DEX, 5 + player.mimic_level / 5) - player.modify_stat(A_CON, 5 + player.mimic_level / 5) - player.modify_stat(A_CHR, 5 + player.mimic_level / 5) - - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ELEC) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ACID) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_COLD) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_LITE) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CHAOS) - player.xtra_f2 = bor(player.xtra_f2, TR2_HOLD_LIFE) - player.xtra_f3 = bor(player.xtra_f3, TR3_FEATHER) - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - return 2 - end, -} - --- For Geomancy -add_mimic_shape -{ - ["name"] = "Fire Elem.", - ["desc"] = "A towering column of flames", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {10, 10}, - ["limit"] = TRUE, - ["calc"] = function () - player.modify_stat(A_STR, 5 + (player.mimic_level / 5)) - player.modify_stat(A_DEX, 5 + (player.mimic_level / 5)) - player.modify_stat(A_WIS, -5 - (player.mimic_level / 5)) - - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE) - -- was immune to poison in the 3.0.0 version - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f3 = bor(player.xtra_f3, TR3_SH_FIRE) - player.xtra_f3 = bor(player.xtra_f3, TR3_LITE1) - return 0 - end, -} diff --git a/lib/scpt/init.lua b/lib/scpt/init.lua index d0512c76..3b461d19 100644 --- a/lib/scpt/init.lua +++ b/lib/scpt/init.lua @@ -11,9 +11,6 @@ tome_dofile("help.lua") -- let the store specific stuff happen! tome_dofile("stores.lua") --- Add the mimic shapes -tome_dofile("mimic.lua") - -- Add the mkey activations tome_dofile("mkeys.lua") diff --git a/lib/scpt/mimic.lua b/lib/scpt/mimic.lua deleted file mode 100644 index 6529f35c..00000000 --- a/lib/scpt/mimic.lua +++ /dev/null @@ -1,419 +0,0 @@ --- Define the various possible mimic shapes - --- Nature shapes -add_mimic_shape -{ - ["name"] = "Mouse", - ["obj_name"] = "Mouse Fur", - ["desc"] = "Mice are small, fast and very stealthy", - ["realm"] = "nature", - ["level"] = 1, - ["rarity"] = 10, - ["duration"] = {20, 40}, - ["calc"] = function () - -- Mice run! - player.pspeed = player.pspeed + 5 + (player.mimic_level / 7) - - -- They can crtawl under your armor to hit you ;) - player.to_h = player.to_h + 10 + (player.mimic_level / 5) - player.dis_to_h = player.dis_to_h + 10 + (player.mimic_level / 5) - - -- But they are not very powerfull - player.to_d = player.to_d / 5 - player.dis_to_d = player.dis_to_d / 5 - - -- But they are stealthy - player.skill_stl = player.skill_stl + 10 + (player.mimic_level / 5) - - -- Stat mods - player.modify_stat(A_STR, -5) - player.modify_stat(A_DEX, 3) - player.modify_stat(A_CON, 1) - - end, - ["power"] = function() - if player.mimic_level >= 30 then - player.add_power(POWER_INVISIBILITY) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Eagle", - ["obj_name"] = "Feathers Cloak", - ["desc"] = "Eagles are master of the air, good hunters with excellent vision.", - ["realm"] = "nature", - ["level"] = 10, - ["rarity"] = 30, - ["duration"] = {10, 50}, - ["calc"] = function () - player.ffall = TRUE - player.pspeed = player.pspeed + 2 + (player.mimic_level / 6) - - player.modify_stat(A_STR, -3) - player.modify_stat(A_DEX, 2 + (player.mimic_level / 15)) - player.modify_stat(A_CON, 4 + (player.mimic_level / 20)) - player.modify_stat(A_INT, -1) - player.modify_stat(A_WIS, 1) - player.modify_stat(A_CHR, -1) - - if player.mimic_level >= 20 then - player.xtra_f4 = bor(player.xtra_f4, TR4_FLY) - player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS) - end - if player.mimic_level >= 25 then - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - end - if player.mimic_level >= 30 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_ELEC) - end - if player.mimic_level >= 30 then - player.xtra_f3 = bor(player.xtra_f3, TR3_SH_ELEC) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Wolf", - ["obj_name"] = "Wolf Pelt", - ["desc"] = "Wolves are masters of movement, strong and have excellent eyesight.", - ["realm"] = "nature", - ["level"] = 20, - ["rarity"] = 40, - ["duration"] = {10, 50}, - ["calc"] = function () - player.modify_stat(A_STR, 2 + (player.mimic_level / 20)) - player.modify_stat(A_DEX, 3 + (player.mimic_level / 20)) - player.modify_stat(A_INT, -3) - player.modify_stat(A_CHR, -2) - - player.pspeed = player.pspeed + 10 + (player.mimic_level / 5) - - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_FEAR) - - if player.mimic_level >= 10 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_COLD) - end - if player.mimic_level >= 15 then - player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS) - end - if player.mimic_level >= 30 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK) - end - if player.mimic_level >= 35 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CONF) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Spider", - ["obj_name"] = "Spider Web", - ["desc"] = "Spiders are clever and become good climbers.", - ["realm"] = "nature", - ["level"] = 25, - ["rarity"] = 50, - ["duration"] = {10, 50}, - ["calc"] = function () - player.modify_stat(A_STR, -4) - player.modify_stat(A_DEX, 1 + (player.mimic_level / 8)) - player.modify_stat(A_INT, 1 + (player.mimic_level / 5)) - player.modify_stat(A_WIS, 1 + (player.mimic_level / 5)) - player.modify_stat(A_CON, -5) - player.modify_stat(A_CHR, -10) - - player.pspeed = player.pspeed + 5 - - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_FEAR) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK) - - if player.mimic_level >= 40 then - player.xtra_f4 = bor(player.xtra_f4, TR4_CLIMB) - end - - end, - ["power"] = function() - if player.mimic_level >= 25 then - player.add_power(POWER_WEB) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Elder Ent", - ["obj_name"] = "Entish Bark", - ["desc"] = "Ents are powerful tree-like beings dating from the dawn of time.", - ["realm"] = "nature", - ["level"] = 40, - ["rarity"] = 60, - ["duration"] = {10, 30}, - ["limit"] = TRUE, - ["calc"] = function () - player.pspeed = player.pspeed - 5 - (player.mimic_level / 10) - - player.to_a = player.to_a + 10 + player.mimic_level - player.dis_to_a = player.dis_to_a + 10 + player.mimic_level - - player.modify_stat(A_STR, player.mimic_level / 5) - player.modify_stat(A_INT, - (player.mimic_level / 7)) - player.modify_stat(A_WIS, - (player.mimic_level / 7)) - player.modify_stat(A_DEX, -4) - player.modify_stat(A_CON, player.mimic_level / 5) - player.modify_stat(A_CHR, -7) - - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_COLD) - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_SENS_FIRE) - end, - ["power"] = function () - player.add_power(PWR_GROW_TREE) - end, -} - -add_mimic_shape -{ - ["name"] = "Vapour", - ["obj_name"] = "Cloak of Mist", - ["desc"] = "A sentient cloud, darting around", - ["realm"] = "nature", - ["level"] = 15, - ["rarity"] = 10, - ["duration"] = {10, 40}, - ["calc"] = function () - - player.pspeed = player.pspeed + 5 - - --Try to hit a cloud! - player.to_a = player.to_a + 40 + player.mimic_level - player.dis_to_a = player.dis_to_a + 40 + player.mimic_level - - --Try to hit WITH a cloud! - player.to_h = player.to_h - 40 - player.dis_to_h = player.dis_to_h -40 - - -- Stat mods - player.modify_stat(A_STR, -4) - player.modify_stat(A_DEX, 5) - player.modify_stat(A_CON, -4) - player.modify_stat(A_CHR, -10) - - -- But they are stealthy - player.skill_stl = player.skill_stl + 10 + (player.mimic_level / 5) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_SHARDS) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_COLD) - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_SENS_FIRE) - player.xtra_f3 = bor(player.xtra_f3, TR3_FEATHER) - end, -} - -add_mimic_shape -{ - ["name"] = "Serpent", - ["obj_name"] = "Snakeskin Cloak", - ["desc"] = "Serpents are fast, lethal predators.", - ["realm"] = "nature", - ["level"] = 30, - ["rarity"] = 25, - ["duration"] = {15, 20}, - ["calc"] = function () - player.pspeed = player.pspeed + 10 + (player.mimic_level / 6) - player.to_a = player.to_a + 3 + (player.mimic_level / 8) - player.dis_to_a = player.dis_to_a + 3 + (player.mimic_level / 8) - - player.modify_stat(A_STR, player.mimic_level / 8) - player.modify_stat(A_INT, -6) - player.modify_stat(A_WIS, -6) - player.modify_stat(A_DEX, -4) - player.modify_stat(A_CON, player.mimic_level / 7) - player.modify_stat(A_CHR, -6) - - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - if player.mimic_level >= 25 then - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - end - end, -} - -add_mimic_shape -{ - ["name"] = "Mumak", - ["obj_name"] = "Mumak Hide", - ["desc"] = "A giant, elaphantine form.", - ["realm"] = "nature", - ["level"] = 40, - ["rarity"] = 40, - ["duration"] = {15, 20}, - ["calc"] = function () - player.pspeed = player.pspeed - 5 - (player.mimic_level / 10) - player.to_a = player.to_a + 10 + (player.mimic_level / 6) - player.dis_to_a = player.dis_to_a + 10 + (player.mimic_level / 6) - player.to_d = player.to_d + 5 + ((player.mimic_level * 2) / 3) - player.dis_to_d = player.dis_to_d + 5 + ((player.mimic_level * 2) / 3) - - player.modify_stat(A_STR, player.mimic_level / 4) - player.modify_stat(A_INT, -8) - player.modify_stat(A_WIS, -4) - player.modify_stat(A_DEX, -5) - player.modify_stat(A_CON, player.mimic_level / 3) - player.modify_stat(A_CHR, -10) - - if player.mimic_level >= 10 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_FEAR) - end - if player.mimic_level >= 25 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CONF) - end - if player.mimic_level >= 30 then - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - end - if player.mimic_level >= 35 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_NEXUS) - end - end, -} - ---------- Extra shapes ----------- - --- For Beornings -add_mimic_shape -{ - ["name"] = "Bear", - ["desc"] = "A fierce, terrible bear.", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {50, 200}, - ["limit"] = TRUE, - ["calc"] = function () - player.pspeed = player.pspeed - 5 + (player.mimic_level / 5) - - player.to_a = player.to_a + 5 + ((player.mimic_level * 2) / 3) - player.dis_to_a = player.dis_to_a + 5 + ((player.mimic_level * 2) / 3) - - player.modify_stat(A_STR, player.mimic_level / 11) - player.modify_stat(A_INT, player.mimic_level / 11) - player.modify_stat(A_WIS, player.mimic_level / 11) - player.modify_stat(A_DEX, -1) - player.modify_stat(A_CON, player.mimic_level / 11) - player.modify_stat(A_CHR, -10) - - if player.mimic_level >= 10 then - player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT) - end - if player.mimic_level >= 20 then - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - end - if player.mimic_level >= 30 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CONF) - end - if player.mimic_level >= 35 then - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_NEXUS) - end - - -- activate the skill - skill(SKILL_BEAR).hidden = FALSE - end, -} - --- For balrog corruptions -add_mimic_shape -{ - ["name"] = "Balrog", - ["desc"] = "A corrupted maia.", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {30, 70}, - ["limit"] = TRUE, - ["calc"] = function () - player.modify_stat(A_STR, 5 + player.mimic_level / 5) - player.modify_stat(A_INT, player.mimic_level / 10) - player.modify_stat(A_WIS, - ( 5 + player.mimic_level / 10)) - player.modify_stat(A_DEX, player.mimic_level / 10) - player.modify_stat(A_CON, 5 + player.mimic_level / 5) - player.modify_stat(A_CHR, - ( 5 + player.mimic_level / 10)) - - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ACID) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ELEC) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CHAOS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_HOLD_LIFE) - player.xtra_f3 = bor(player.xtra_f3, TR3_FEATHER) - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - player.xtra_f3 = bor(player.xtra_f3, TR3_SH_FIRE) - player.xtra_f3 = bor(player.xtra_f3, TR3_LITE1) - return 1 - end, -} - --- For avatar spell -add_mimic_shape -{ - ["name"] = "Maia", - ["desc"] = "A near god-like being.", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {30, 70}, - ["limit"] = TRUE, - ["calc"] = function () - player.modify_stat(A_STR, 5 + player.mimic_level / 5) - player.modify_stat(A_INT, 5 + player.mimic_level / 5) - player.modify_stat(A_WIS, 5 + player.mimic_level / 5) - player.modify_stat(A_DEX, 5 + player.mimic_level / 5) - player.modify_stat(A_CON, 5 + player.mimic_level / 5) - player.modify_stat(A_CHR, 5 + player.mimic_level / 5) - - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ELEC) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ACID) - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_COLD) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_LITE) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK) - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CHAOS) - player.xtra_f2 = bor(player.xtra_f2, TR2_HOLD_LIFE) - player.xtra_f3 = bor(player.xtra_f3, TR3_FEATHER) - player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN) - return 2 - end, -} - --- For Geomancy -add_mimic_shape -{ - ["name"] = "Fire Elem.", - ["desc"] = "A towering column of flames", - ["realm"] = nil, - ["level"] = 1, - ["rarity"] = 101, - ["duration"] = {10, 10}, - ["limit"] = TRUE, - ["calc"] = function () - player.modify_stat(A_STR, 5 + (player.mimic_level / 5)) - player.modify_stat(A_DEX, 5 + (player.mimic_level / 5)) - player.modify_stat(A_WIS, -5 - (player.mimic_level / 5)) - - player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE) - -- was immune to poison in the 3.0.0 version - player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS) - player.xtra_f3 = bor(player.xtra_f3, TR3_SH_FIRE) - player.xtra_f3 = bor(player.xtra_f3, TR3_LITE1) - return 0 - end, -} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d610e193..c2ed88a3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,7 +9,7 @@ SET(SRCS object1.c object2.c randart.c squeltch.c traps.c monster1.c monster2.c monster3.c xtra1.c xtra2.c skills.c powers.c gods.c - spells1.c spells2.c corrupt.c + spells1.c spells2.c corrupt.c mimic.c status.c files.c notes.c loadsave.c cmd1.c cmd2.c cmd3.c cmd4.c cmd5.c cmd6.c cmd7.c help.c @@ -2389,9 +2389,7 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) { if (!p_ptr->mimic_form) { - s32b time; - - call_lua("get_mimic_rand_dur", "(d)", "d", pval2, &time); + s32b time = get_mimic_random_duration(pval2); set_mimic(time, pval2, (p_ptr->lev * 2) / 3); @@ -735,7 +735,7 @@ static int get_mimic_chance(int mimic) { s32b chance; - call_lua("get_mimic_info", "(d,s)", "d", mimic, "level", &chance); + chance = get_mimic_level(mimic); chance *= 3; chance -= get_skill_scale(SKILL_MIMICRY, 150); diff --git a/src/defines.h b/src/defines.h index 1e36119f..f716e326 100644 --- a/src/defines.h +++ b/src/defines.h @@ -223,6 +223,7 @@ /* Mimicry */ #define MAX_MIMIC_POWERS 5 +#define MIMIC_FORMS_MAX 14 /* Symbiosis */ #define MAX_SYMBIOTIC_POWERS 9 diff --git a/src/externs.h b/src/externs.h index d53ba409..fd6802d8 100644 --- a/src/externs.h +++ b/src/externs.h @@ -1521,6 +1521,16 @@ extern int get_keymap_mode(); /* main.c */ extern bool_ private_check_user_directory(cptr dirpath); +/* mimic.c */ +extern s16b resolve_mimic_name(cptr name); +extern s16b find_random_mimic_shape(byte level, bool_ limit); +extern cptr get_mimic_name(s16b mf_idx); +extern cptr get_mimic_object_name(s16b mf_idx); +extern byte get_mimic_level(s16b mf_idx); +extern s32b get_mimic_random_duration(s16b mf_idx); +extern byte calc_mimic(); +extern void calc_mimic_power(); + /* xtra1.c */ extern void fix_message(void); extern void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a); @@ -1545,7 +1555,6 @@ extern void fate_desc(char *desc, int fate); extern void dump_fates(FILE *OutFile); /* xtra2.c */ -extern int resolve_mimic_name(cptr name); extern void do_rebirth(void); extern cptr get_subrace_title(int racem); extern void set_subrace_title(int racem, cptr name); diff --git a/src/files.c b/src/files.c index 96ee66a9..4e1a1984 100644 --- a/src/files.c +++ b/src/files.c @@ -2644,7 +2644,7 @@ errr file_character(cptr name, bool_ full) if (p_ptr->tim_mimic) { - call_lua("get_mimic_info", "(d,s)", "s", p_ptr->mimic_form, "name", &mimic); + mimic = get_mimic_name(p_ptr->mimic_form); fprintf(fff, "\n You %s disguised as a %s.", (death ? "were" : "are"), mimic); } } diff --git a/src/mimic.c b/src/mimic.c new file mode 100644 index 00000000..6d241500 --- /dev/null +++ b/src/mimic.c @@ -0,0 +1,684 @@ +#include "angband.h" +#include <assert.h> + +static s32b abomination_calc() +{ + apply_flags(TR1_SPEED + TR1_STR + TR1_INT + TR1_WIS + TR1_DEX + TR1_CON + TR1_CHR, 0, 0, 0, 0, 0, -10, 0, 0, 0, 0); + p_ptr->xtra_f3 |= TR3_AGGRAVATE; + + return 0; +} + +static s32b mouse_calc() +{ + /* Mice run! */ + p_ptr->pspeed += 5 + (p_ptr->mimic_level / 7); + + /* They can crawl under your armor to hit you ;) */ + p_ptr->to_h = p_ptr->to_h + 10 + (p_ptr->mimic_level / 5); + p_ptr->dis_to_h = p_ptr->dis_to_h + 10 + (p_ptr->mimic_level / 5); + + /* But they are not very powerfull */ + p_ptr->to_d = p_ptr->to_d / 5; + p_ptr->dis_to_d = p_ptr->dis_to_d / 5; + + /* But they are stealthy */ + p_ptr->skill_stl = p_ptr->skill_stl + 10 + (p_ptr->mimic_level / 5); + + /* Stat mods */ + p_ptr->stat_add[A_STR] += -5; + p_ptr->stat_add[A_DEX] += 3; + p_ptr->stat_add[A_CON] += 1; + + return 0; +} + +static void mouse_power() +{ + if (p_ptr->mimic_level >= 30) + { + p_ptr->powers[POWER_INVISIBILITY] = TRUE; + } +} + +static s32b eagle_calc() +{ + p_ptr->ffall = TRUE; + p_ptr->pspeed = p_ptr->pspeed + 2 + (p_ptr->mimic_level / 6); + + p_ptr->stat_add[A_STR] += -3; + p_ptr->stat_add[A_DEX] += 2 + (p_ptr->mimic_level / 15); + p_ptr->stat_add[A_CON] += 4 + (p_ptr->mimic_level / 20); + p_ptr->stat_add[A_INT] += -1; + p_ptr->stat_add[A_WIS] += 1; + p_ptr->stat_add[A_CHR] += -1; + + if (p_ptr->mimic_level >= 20) + { + p_ptr->xtra_f4 |= TR4_FLY; + p_ptr->xtra_f3 |= TR3_SEE_INVIS; + } + + if (p_ptr->mimic_level >= 25) + { + p_ptr->xtra_f2 |= TR2_FREE_ACT; + } + + if (p_ptr->mimic_level >= 30) + { + p_ptr->xtra_f2 |= TR2_RES_ELEC; + } + + if (p_ptr->mimic_level >= 35) + { + p_ptr->xtra_f3 |= TR3_SH_ELEC; + } + + return 0; +} + +static s32b wolf_calc() +{ + p_ptr->stat_add[A_STR] += 2 + (p_ptr->mimic_level / 20); + p_ptr->stat_add[A_DEX] += 3 + (p_ptr->mimic_level / 20); + p_ptr->stat_add[A_INT] += -3; + p_ptr->stat_add[A_CHR] += -2; + + p_ptr->pspeed = p_ptr->pspeed + 10 + (p_ptr->mimic_level / 5); + + p_ptr->xtra_f2 |= TR2_FREE_ACT; + p_ptr->xtra_f2 |= TR2_RES_FEAR; + + if (p_ptr->mimic_level >= 10) + { + p_ptr->xtra_f2 |= TR2_RES_COLD; + } + + if (p_ptr->mimic_level >= 15) + { + p_ptr->xtra_f3 |= TR3_SEE_INVIS; + } + + if (p_ptr->mimic_level >= 30) + { + p_ptr->xtra_f2 |= TR2_RES_DARK; + } + + if (p_ptr->mimic_level >= 35) + { + p_ptr->xtra_f2 |= TR2_RES_CONF; + } + + return 0; +} + +static s32b spider_calc() +{ + p_ptr->stat_add[A_STR] += -4; + p_ptr->stat_add[A_DEX] += 1 + (p_ptr->mimic_level / 8); + p_ptr->stat_add[A_INT] += 1 + (p_ptr->mimic_level / 5); + p_ptr->stat_add[A_WIS] += 1 + (p_ptr->mimic_level / 5); + p_ptr->stat_add[A_CON] += -5; + p_ptr->stat_add[A_CHR] += -10; + + p_ptr->pspeed = p_ptr->pspeed + 5; + + p_ptr->xtra_f2 |= TR2_RES_POIS; + p_ptr->xtra_f2 |= TR2_RES_FEAR; + p_ptr->xtra_f2 |= TR2_RES_DARK; + + if (p_ptr->mimic_level >= 40) + { + p_ptr->xtra_f4 |= TR4_CLIMB; + } + + return 0; +} + +static void spider_power() +{ + if (p_ptr->mimic_level >= 25) + { + p_ptr->powers[POWER_WEB] = TRUE; + } +} + +static s32b ent_calc() +{ + p_ptr->pspeed = p_ptr->pspeed - 5 - (p_ptr->mimic_level / 10); + + p_ptr->to_a = p_ptr->to_a + 10 + p_ptr->mimic_level; + p_ptr->dis_to_a = p_ptr->dis_to_a + 10 + p_ptr->mimic_level; + + p_ptr->stat_add[A_STR] += p_ptr->mimic_level / 5; + p_ptr->stat_add[A_INT] += - (p_ptr->mimic_level / 7); + p_ptr->stat_add[A_WIS] += - (p_ptr->mimic_level / 7); + p_ptr->stat_add[A_DEX] += -4; + p_ptr->stat_add[A_CON] += p_ptr->mimic_level / 5; + p_ptr->stat_add[A_CHR] += -7; + + p_ptr->xtra_f2 |= TR2_RES_POIS; + p_ptr->xtra_f2 |= TR2_RES_COLD; + p_ptr->xtra_f2 |= TR2_FREE_ACT; + p_ptr->xtra_f3 |= TR3_REGEN; + p_ptr->xtra_f3 |= TR3_SEE_INVIS; + p_ptr->xtra_f2 |= TR2_SENS_FIRE; + + return 0; +} + +static void ent_power() +{ + p_ptr->powers[PWR_GROW_TREE] = TRUE; +} + +static s32b vapour_calc() +{ + p_ptr->pspeed = p_ptr->pspeed + 5; + + /* Try to hit a cloud! */ + p_ptr->to_a = p_ptr->to_a + 40 + p_ptr->mimic_level; + p_ptr->dis_to_a = p_ptr->dis_to_a + 40 + p_ptr->mimic_level; + + /* Try to hit WITH a cloud! */ + p_ptr->to_h = p_ptr->to_h - 40; + p_ptr->dis_to_h = p_ptr->dis_to_h - 40; + + /* Stat mods */ + p_ptr->stat_add[A_STR] += -4; + p_ptr->stat_add[A_DEX] += 5; + p_ptr->stat_add[A_CON] += -4; + p_ptr->stat_add[A_CHR] += -10; + + /* But they are stealthy */ + p_ptr->skill_stl = p_ptr->skill_stl + 10 + (p_ptr->mimic_level / 5); + p_ptr->xtra_f2 |= TR2_RES_POIS; + p_ptr->xtra_f2 |= TR2_RES_SHARDS; + p_ptr->xtra_f2 |= TR2_IM_COLD; + p_ptr->xtra_f2 |= TR2_FREE_ACT; + p_ptr->xtra_f3 |= TR3_REGEN; + p_ptr->xtra_f3 |= TR3_SEE_INVIS; + p_ptr->xtra_f2 |= TR2_SENS_FIRE; + p_ptr->xtra_f3 |= TR3_FEATHER; + + return 0; +} + +static s32b serpent_calc() +{ + p_ptr->pspeed = p_ptr->pspeed + 10 + (p_ptr->mimic_level / 6); + + p_ptr->to_a = p_ptr->to_a + 3 + (p_ptr->mimic_level / 8); + p_ptr->dis_to_a = p_ptr->dis_to_a + 3 + (p_ptr->mimic_level / 8); + + p_ptr->stat_add[A_STR] += p_ptr->mimic_level / 8; + p_ptr->stat_add[A_INT] += -6; + p_ptr->stat_add[A_WIS] += -6; + p_ptr->stat_add[A_DEX] += -4; + p_ptr->stat_add[A_CON] += p_ptr->mimic_level / 7; + p_ptr->stat_add[A_CHR] += -6; + + p_ptr->xtra_f2 |= TR2_RES_POIS; + if (p_ptr->mimic_level >= 25) + { + p_ptr->xtra_f2 |= TR2_FREE_ACT; + } + + return 0; +} + +static s32b mumak_calc() +{ + p_ptr->pspeed = p_ptr->pspeed - 5 - (p_ptr->mimic_level / 10); + + p_ptr->to_a = p_ptr->to_a + 10 + (p_ptr->mimic_level / 6); + p_ptr->dis_to_a = p_ptr->dis_to_a + 10 + (p_ptr->mimic_level / 6); + p_ptr->to_d = p_ptr->to_d + 5 + ((p_ptr->mimic_level * 2) / 3); + p_ptr->dis_to_d = p_ptr->dis_to_d + 5 + ((p_ptr->mimic_level * 2) / 3); + + p_ptr->stat_add[A_STR] += p_ptr->mimic_level / 4; + p_ptr->stat_add[A_INT] += -8; + p_ptr->stat_add[A_WIS] += -4; + p_ptr->stat_add[A_DEX] += -5; + p_ptr->stat_add[A_CON] += p_ptr->mimic_level / 3; + p_ptr->stat_add[A_CHR] += -10; + + if (p_ptr->mimic_level >= 10) + { + p_ptr->xtra_f2 |= TR2_RES_FEAR; + } + + if (p_ptr->mimic_level >= 25) + { + p_ptr->xtra_f2 |= TR2_RES_CONF; + } + + if (p_ptr->mimic_level >= 30) + { + p_ptr->xtra_f2 |= TR2_FREE_ACT; + } + + if (p_ptr->mimic_level >= 35) + { + p_ptr->xtra_f2 |= TR2_RES_NEXUS; + } + + return 0; +} + +static s32b bear_calc() +{ + p_ptr->pspeed = p_ptr->pspeed - 5 + (p_ptr->mimic_level / 5); + + p_ptr->to_a = p_ptr->to_a + 5 + ((p_ptr->mimic_level * 2) / 3); + p_ptr->dis_to_a = p_ptr->dis_to_a + 5 + ((p_ptr->mimic_level * 2) / 3); + + p_ptr->stat_add[A_STR] += p_ptr->mimic_level / 11; + p_ptr->stat_add[A_INT] += p_ptr->mimic_level / 11; + p_ptr->stat_add[A_WIS] += p_ptr->mimic_level / 11; + p_ptr->stat_add[A_DEX] += -1; + p_ptr->stat_add[A_CON] += p_ptr->mimic_level / 11; + p_ptr->stat_add[A_CHR] += -10; + + if (p_ptr->mimic_level >= 10) + { + p_ptr->xtra_f2 |= TR2_FREE_ACT; + } + + if (p_ptr->mimic_level >= 20) + { + p_ptr->xtra_f3 |= TR3_REGEN; + } + + if (p_ptr->mimic_level >= 30) + { + p_ptr->xtra_f2 |= TR2_RES_CONF; + } + + if (p_ptr->mimic_level >= 35) + { + p_ptr->xtra_f2 |= TR2_RES_NEXUS; + } + + /* activate the skill */ + s_info[SKILL_BEAR].hidden = FALSE; + + return 0; +} + +static s32b balrog_calc() +{ + p_ptr->stat_add[A_STR] += 5 + p_ptr->mimic_level / 5; + p_ptr->stat_add[A_INT] += p_ptr->mimic_level / 10; + p_ptr->stat_add[A_WIS] += - ( 5 + p_ptr->mimic_level / 10); + p_ptr->stat_add[A_DEX] += p_ptr->mimic_level / 10; + p_ptr->stat_add[A_CON] += 5 + p_ptr->mimic_level / 5; + p_ptr->stat_add[A_CHR] += - ( 5 + p_ptr->mimic_level / 10); + + p_ptr->xtra_f2 |= TR2_IM_ACID; + p_ptr->xtra_f2 |= TR2_IM_FIRE; + p_ptr->xtra_f2 |= TR2_IM_ELEC; + p_ptr->xtra_f2 |= TR2_RES_DARK; + p_ptr->xtra_f2 |= TR2_RES_CHAOS; + p_ptr->xtra_f2 |= TR2_RES_POIS; + p_ptr->xtra_f2 |= TR2_HOLD_LIFE; + p_ptr->xtra_f3 |= TR3_FEATHER; + p_ptr->xtra_f3 |= TR3_REGEN; + p_ptr->xtra_f3 |= TR3_SH_FIRE; + p_ptr->xtra_f3 |= TR3_LITE1; + + return 1; /* Adds a blow */ +} + +static s32b maia_calc() +{ + p_ptr->stat_add[A_STR] += 5 + p_ptr->mimic_level / 5; + p_ptr->stat_add[A_INT] += 5 + p_ptr->mimic_level / 5; + p_ptr->stat_add[A_WIS] += 5 + p_ptr->mimic_level / 5; + p_ptr->stat_add[A_DEX] += 5 + p_ptr->mimic_level / 5; + p_ptr->stat_add[A_CON] += 5 + p_ptr->mimic_level / 5; + p_ptr->stat_add[A_CHR] += 5 + p_ptr->mimic_level / 5; + + p_ptr->xtra_f2 |= TR2_IM_FIRE; + p_ptr->xtra_f2 |= TR2_IM_ELEC; + p_ptr->xtra_f2 |= TR2_IM_ACID; + p_ptr->xtra_f2 |= TR2_IM_COLD; + p_ptr->xtra_f2 |= TR2_RES_POIS; + p_ptr->xtra_f2 |= TR2_RES_LITE; + p_ptr->xtra_f2 |= TR2_RES_DARK; + p_ptr->xtra_f2 |= TR2_RES_CHAOS; + p_ptr->xtra_f2 |= TR2_HOLD_LIFE; + p_ptr->xtra_f3 |= TR3_FEATHER; + p_ptr->xtra_f3 |= TR3_REGEN; + + return 2; /* Add two blows */ +} + +static s32b fire_elemental_calc() +{ + p_ptr->stat_add[A_STR] += 5 + (p_ptr->mimic_level / 5); + p_ptr->stat_add[A_DEX] += 5 + (p_ptr->mimic_level / 5); + p_ptr->stat_add[A_WIS] += -5 - (p_ptr->mimic_level / 5); + + p_ptr->xtra_f2 |= TR2_IM_FIRE; + p_ptr->xtra_f2 |= TR2_RES_POIS; + p_ptr->xtra_f3 |= TR3_SH_FIRE; + p_ptr->xtra_f3 |= TR3_LITE1; + + return 0; +} + +/* + * Mimicry forms + */ +mimic_form_type mimic_forms[MIMIC_FORMS_MAX] = +{ + { /* 0 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Abomination", /* MUST be at index 0! */ + "Abominable Cloak", + "Abominations are failed experiments of powerful wizards.", + NULL /* no realm */, + FALSE, + 1, 101, {20, 100}, + abomination_calc, + NULL, + }, + + /* + * Nature forms + */ + + { /* 1 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Mouse", + "Mouse Fur", + "Mice are small, fast and very stealthy", + "nature", + FALSE, + 1, 10, {20, 40}, + mouse_calc, + mouse_power, + }, + + { /* 2 */ + { MODULE_TOME, -1 }, + "Eagle", + "Feathers Cloak", + "Eagles are master of the air, good hunters with excellent vision.", + "nature", + FALSE, + 10, 30, {10, 50}, + eagle_calc, + NULL, + }, + + { /* 3 */ + { MODULE_THEME, -1 }, + "Eagle", + "Feathered Cloak", + "Eagles are master of the air, good hunters with excellent vision.", + "nature", + FALSE, + 10, 30, {10, 50}, + eagle_calc, + NULL, + }, + + { /* 4 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Wolf", + "Wolf Pelt", + "Wolves are masters of movement, strong and have excellent eyesight.", + "nature", + FALSE, + 20, 40, {10, 50}, + wolf_calc, + NULL, + }, + + { /* 5 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Spider", + "Spider Web", + "Spiders are clever and become good climbers.", + "nature", + FALSE, + 25, 50, {10, 50}, + spider_calc, + spider_power, + }, + + { /* 6 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Elder Ent", + "Entish Bark", + "Ents are powerful tree-like beings dating from the dawn of time.", + "nature", + TRUE, + 40, 60, {10, 30}, + ent_calc, + ent_power, + }, + + { /* 7 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Vapour", + "Cloak of Mist", + "A sentient cloud, darting around", + "nature", + FALSE, + 15, 10, {10, 40}, + vapour_calc, + NULL, + }, + + { /* 8 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Serpent", + "Snakeskin Cloak", + "Serpents are fast, lethal predators.", + "nature", + FALSE, + 30, 25, {15, 20}, + serpent_calc, + NULL, + }, + + { /* 9 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Mumak", + "Mumak Hide", + "A giant, elaphantine form.", + "nature", + FALSE, + 40, 40, {15, 20}, + mumak_calc, + NULL, + }, + + /* + * Extra shapes + */ + + { /* 10 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Bear", + NULL, + "A fierce, terrible bear.", + NULL /* no realm */, + TRUE, + 1, 101, {50, 200}, + bear_calc, + NULL, + }, + + { /* 11 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Balrog", + NULL, + "A corrupted maia.", + NULL /* no realm */, + TRUE, + 1, 101, {30, 70}, + balrog_calc, + NULL, + }, + + { /* 12 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Maia", + NULL, + "A near god-like being.", + NULL /* no realm */, + TRUE, + 1, 101, {30, 70}, + maia_calc, + NULL, + }, + + { /* 13 */ + { MODULE_TOME, MODULE_THEME, -1 }, + "Fire Elem.", + NULL, + "A towering column of flames", + NULL /* no realm */, + TRUE, + 1, 101, {10, 10}, + fire_elemental_calc, + NULL, + }, + +}; + +/* + * Is the mimicry form enabled for the current module? + */ +static bool_ mimic_form_enabled(mimic_form_type *f) +{ + int i; + + for (i = 0; f->modules[i] >= 0; i++) + { + if (f->modules[i] == game_module_idx) + { + return TRUE; + } + } + + return FALSE; +} + +/* + * Get a mimic form by index + */ +static mimic_form_type *get_mimic_form(int mf_idx) +{ + assert(mf_idx >= 0); + assert(mf_idx < MIMIC_FORMS_MAX); + return &mimic_forms[mf_idx]; +} + +/* + * Find a mimic by name + */ +s16b resolve_mimic_name(cptr name) +{ + s16b i; + + for (i = 0; i < MIMIC_FORMS_MAX; i++) + { + mimic_form_type *mf_ptr = get_mimic_form(i); + if (mimic_form_enabled(mf_ptr) && streq(mf_ptr->name, name)) + { + return i; + } + } + + return -1; +} + +/* + * Find a random mimic form + */ +s16b find_random_mimic_shape(byte level, bool_ limit) +{ + int tries = 1000; + + while (tries > 0) + { + int mf_idx = 0; + mimic_form_type *mf_ptr = NULL; + + tries = tries - 1; + + mf_idx = rand_int(MIMIC_FORMS_MAX); + mf_ptr = get_mimic_form(mf_idx); + + if (mimic_form_enabled(mf_ptr)) + { + if (limit >= mf_ptr->limit) + { + if ((rand_int(mf_ptr->level * 3) < level) && + (mf_ptr->rarity < 100) && + (magik(100 - mf_ptr->rarity))) + { + return mf_idx; + } + } + } + } + /* Abomination */ + return 0; +} + +/* + * Get mimic name + */ +cptr get_mimic_name(s16b mf_idx) +{ + return get_mimic_form(mf_idx)->name; +} + +/* + * Get mimic object name + */ +cptr get_mimic_object_name(s16b mf_idx) +{ + return get_mimic_form(mf_idx)->obj_name; +} + +/* + * Get mimic object level + */ +byte get_mimic_level(s16b mf_idx) +{ + return get_mimic_form(mf_idx)->level; +} + +/* + * Get a random duration for the given mimic form + */ +s32b get_mimic_random_duration(s16b mf_idx) +{ + mimic_form_type *mf_ptr = get_mimic_form(mf_idx); + return rand_range(mf_ptr->duration.min, mf_ptr->duration.max); +} + +/* + * Calculate bonuses for player's current mimic form + */ +byte calc_mimic() +{ + mimic_form_type *mf_ptr = get_mimic_form(p_ptr->mimic_form); + return mf_ptr->calc(); +} + +/* + * Calculate powers for player's current mimic form + */ +void calc_mimic_power() +{ + mimic_form_type *mf_ptr = get_mimic_form(p_ptr->mimic_form); + return mf_ptr->power(); +} diff --git a/src/object1.c b/src/object1.c index fef7fb85..857deb2c 100644 --- a/src/object1.c +++ b/src/object1.c @@ -1509,7 +1509,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) } else { - call_lua("get_mimic_info", "(d,s)", "s", o_ptr->pval2, "name", &modstr); + modstr = get_mimic_name(o_ptr->pval2); } if (((plain_descriptions) && (aware)) || o_ptr->ident & IDENT_STOREB) basenm = "& Potion~"; @@ -1540,7 +1540,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) show_armour = TRUE; if (o_ptr->sval == SV_MIMIC_CLOAK) { - call_lua("get_mimic_info", "(d,s)", "s", o_ptr->pval2, "obj_name", &modstr); + modstr = get_mimic_object_name(o_ptr->pval2); } break; } diff --git a/src/object2.c b/src/object2.c index 98afb815..75fc7fa8 100644 --- a/src/object2.c +++ b/src/object2.c @@ -2761,9 +2761,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) o_ptr->pval = randint(4); /* No cursed elven cloaks...? */ else if (o_ptr->sval == SV_MIMIC_CLOAK) { - s32b mimic; - - call_lua("find_random_mimic_shape", "(d,d)", "d", level, TRUE, &mimic); + s32b mimic = find_random_mimic_shape(level, TRUE); o_ptr->pval2 = mimic; } break; @@ -3437,9 +3435,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) case TV_POTION2: if (o_ptr->sval == SV_POTION2_MIMIC) { - s32b mimic; - - call_lua("find_random_mimic_shape", "(d,d)", "d", level, FALSE, &mimic); + s32b mimic = find_random_mimic_shape(level, FALSE); o_ptr->pval2 = mimic; } break; diff --git a/src/randart.c b/src/randart.c index 298ee83a..580fa144 100644 --- a/src/randart.c +++ b/src/randart.c @@ -388,8 +388,7 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) /* HACKS for ToME */ if (o_ptr->tval == TV_CLOAK && o_ptr->sval == SV_MIMIC_CLOAK) { - s32b mimic; - call_lua("find_random_mimic_shape", "(d,d)", "d", 127, TRUE, &mimic); + s32b mimic = find_random_mimic_shape(127, TRUE); o_ptr->pval2 = mimic; } else if (f5 & TR5_SPELL_CONTAIN) diff --git a/src/types.h b/src/types.h index df2c4f40..040a0149 100644 --- a/src/types.h +++ b/src/types.h @@ -2602,3 +2602,29 @@ struct corruption_type void (*gain_callback)(); /* callback to invoke when gained */ s16b power; /* index of granted power if >= 0, ignored otherwise */ }; + +/** + * Mimicry forms + */ +typedef struct mimic_duration_type mimic_duration_type; +struct mimic_duration_type +{ + s16b min; + s16b max; +}; + +typedef struct mimic_form_type mimic_form_type; +struct mimic_form_type +{ + int modules[3]; /* Modules where this mimicry form is available; terminated with a -1 entry */ + cptr name; /* Name of mimicry form */ + cptr obj_name; /* Object mimicry form name */ + cptr desc; /* Description */ + cptr realm; /* Realm of mimicry */ + bool_ limit; /* If true, the form is not available except through special means */ + byte level; + byte rarity; + mimic_duration_type duration; + s32b (*calc)(); /* Callback to calculate bonuses; return number of blows to add */ + void (*power)(); /* Callback to calculate powers */ +}; diff --git a/src/util.pkg b/src/util.pkg index d00dcb76..0be3cb8b 100644 --- a/src/util.pkg +++ b/src/util.pkg @@ -2474,3 +2474,8 @@ extern bool drop_text_left(byte c, cptr s, int y, int o); extern bool drop_text_right(byte c, cptr s, int y, int o); extern void quest_library_gen_hook(); + +/** + * Mimicry + */ +extern s16b resolve_mimic_name(cptr name); diff --git a/src/xtra1.c b/src/xtra1.c index 66f5ddd7..09315ed3 100644 --- a/src/xtra1.c +++ b/src/xtra1.c @@ -249,7 +249,7 @@ static void prt_title(void) /* Mimic shape */ if (p_ptr->mimic_form) { - call_lua("get_mimic_info", "(d,s)", "s", p_ptr->mimic_form, "show_name", &p); + p = get_mimic_name(p_ptr->mimic_form); } /* Wizard */ @@ -1592,7 +1592,9 @@ static void calc_powers(void) } } else if (p_ptr->mimic_form) - call_lua("calc_mimic_power", "(d)", "", p_ptr->mimic_form); + { + calc_mimic_power(); + } /* Add in class powers */ for (i = 0; i < 4; i++) @@ -2262,14 +2264,6 @@ void calc_body_bonus() } -byte calc_mimic() -{ - s32b blow = 0; - - call_lua("calc_mimic", "(d)", "d", p_ptr->mimic_form, &blow); - return blow; -} - /* Returns the number of extra blows based on abilities. */ static int get_extra_blows_ability() { /* Count bonus abilities */ diff --git a/src/xtra2.c b/src/xtra2.c index a3ae9881..7fae3fbf 100644 --- a/src/xtra2.c +++ b/src/xtra2.c @@ -6061,14 +6061,3 @@ void do_rebirth() lite_spot(p_ptr->py, p_ptr->px); } - -/* - * Quick mimic name to index function - */ -int resolve_mimic_name(cptr name) -{ - s32b idx; - - call_lua("resolve_mimic_name", "(s)", "d", name, &idx); - return idx; -} |