summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2012-04-07 20:47:47 +0200
committerBardur Arantsson <bardur@scientician.net>2012-04-07 20:47:47 +0200
commit5ea970c82ba3119ca3a5ee68037aee7cdda6dfa3 (patch)
tree0ea4395ab8fe0cf0f6ff480228a3fb0964926fd7
parent23ead090b5c135702eb8b178d8c74cb347815c29 (diff)
Lua: Moved mimicry to C
-rw-r--r--lib/core/init.lua1
-rw-r--r--lib/core/mimc_aux.lua96
-rw-r--r--lib/mods/theme/core/init.lua1
-rw-r--r--lib/mods/theme/core/mimc_aux.lua96
-rw-r--r--lib/mods/theme/scpt/init.lua3
-rw-r--r--lib/mods/theme/scpt/mimic.lua419
-rw-r--r--lib/scpt/init.lua3
-rw-r--r--lib/scpt/mimic.lua419
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/cmd6.c4
-rw-r--r--src/cmd7.c2
-rw-r--r--src/defines.h1
-rw-r--r--src/externs.h11
-rw-r--r--src/files.c2
-rw-r--r--src/mimic.c684
-rw-r--r--src/object1.c4
-rw-r--r--src/object2.c8
-rw-r--r--src/randart.c3
-rw-r--r--src/types.h26
-rw-r--r--src/util.pkg5
-rw-r--r--src/xtra1.c14
-rw-r--r--src/xtra2.c11
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
diff --git a/src/cmd6.c b/src/cmd6.c
index 67fad8e2..15790ca4 100644
--- a/src/cmd6.c
+++ b/src/cmd6.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);
diff --git a/src/cmd7.c b/src/cmd7.c
index aca14dcd..f174e96a 100644
--- a/src/cmd7.c
+++ b/src/cmd7.c
@@ -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;
-}