diff options
author | Bardur Arantsson <bardur@scientician.net> | 2010-01-08 20:28:34 +0100 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2010-01-08 23:46:06 +0100 |
commit | 6aa48afdd57d03314fdf4be6c9da911c32277c84 (patch) | |
tree | 2dc401f9aae2dc6736d2fc3811c8f8099d3eabe6 /lib/core/crpt_aux.lua |
Import tome-2.3.5.
Diffstat (limited to 'lib/core/crpt_aux.lua')
-rw-r--r-- | lib/core/crpt_aux.lua | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/lib/core/crpt_aux.lua b/lib/core/crpt_aux.lua new file mode 100644 index 00000000..e4f16e2a --- /dev/null +++ b/lib/core/crpt_aux.lua @@ -0,0 +1,243 @@ +-- Core functions for corruptions + +__corruptions = {} +__corruptions_max = 0 +__corruptions_callbacks_max = 0 + +-- Get the corruption +function player.corruption(c, set) + if set then + player.corruptions_aux[c + 1] = set + player.redraw = bor(player.redraw, PR_BASIC) + player.update = bor(player.update, PU_BONUS, PU_TORCH, PU_BODY, PU_POWERS) + if (set == TRUE) and (__corruptions[c].gain) then + __corruptions[c].gain() + end + if (set == FALSE) and (__corruptions[c].lose) then + __corruptions[c].lose() + end + else + return player.corruptions_aux[c + 1] + end +end + +-- Test if we have that corruption +-- We must: +-- 1) have it or be willing to get it +-- 2) have all its dependancies +-- 3) have none of its opposing corruptions +-- 4) pass the possible tests +function test_depend_corrupt(corrupt, can_gain) + local i, c + + if not can_gain then can_gain = FALSE end + + if can_gain == TRUE then + if (player.corruption(corrupt) ~= FALSE) then + return FALSE + end + else + if (player.corruption(corrupt) ~= TRUE) then + return FALSE + end + end + + for c, i in __corruptions[corrupt].depends do + if test_depend_corrupt(c) ~= TRUE then + return FALSE + end + end + + for c, i in __corruptions[corrupt].oppose do + if test_depend_corrupt(c) ~= FALSE then + return FALSE + end + end + + -- are we even allowed to get it? + if __corruptions[corrupt].can_gain and (not __corruptions[corrupt].can_gain()) then + return FALSE + end + + return TRUE +end + +-- Gain a new corruption +function gain_corruption(group) + local i, max + local pos = {} + + -- Get the list of all possible ones + max = 0 + for i = 0, __corruptions_max - 1 do + if __corruptions[i].group == group and test_depend_corrupt(i, TRUE) == TRUE and __corruptions[i].random == TRUE and __corruptions[i].allow() then + pos[max] = i + max = max + 1 + end + end + + -- Ok now get one of them + if (max > 0) then + local ret = rand_int(max) + + player.corruption(pos[ret], TRUE) + cmsg_print(TERM_L_RED, __corruptions[pos[ret]].get_text) + + return pos[ret] + else + return -1 + end +end + +-- Lose an existing corruption +function lose_corruption() + local i, max + local pos = {} + + -- Get the list of all possible ones + max = 0 + for i = 0, __corruptions_max - 1 do + if test_depend_corrupt(i) == TRUE and __corruptions[i].removable == TRUE then + pos[max] = i + max = max + 1 + end + end + + -- Ok now get one of them + if (max > 0) then + local ret = rand_int(max) + + player.corruption(pos[ret], FALSE) + cmsg_print(TERM_L_RED, __corruptions[pos[ret]].lose_text) + + -- Ok now lets see if it broke some dependancies + for i = 0, max - 1 do + if player.corruption(pos[i]) ~= test_depend_corrupt(pos[i]) then + player.corruption(pos[i], FALSE) + cmsg_print(TERM_L_RED, __corruptions[pos[i]].lose_text) + end + end + + return pos[ret] + else + return -1 + end +end + +-- Lose all corruptions (for e.g. Potion of New Life) +function lose_all_corruptions() + local i; + for i = 0, __corruptions_max - 1 do + lose_corruption() + end + return -1 +end + +-- Creates a new corruption +function add_corruption(c) + assert(c.color, "No corruption color") + assert(c.name, "No corruption name") + assert(c.get_text, "No corruption get_text") + assert(c.lose_text, "No corruption lose_text") + assert(c.desc, "No corruption desc") + assert(c.hooks, "Nothing to do for corruption") + if not c.random then c.random = TRUE end + if not c.removable then c.removable = TRUE end + if not c.allow then c.allow = function() return not nil end end + + if c.depends == nil then c.depends = {} end + if c.oppose == nil then c.oppose = {} end + + -- We must make sure the other ones opposes too + local o, i + for o, i in c.oppose do + __corruptions[o].oppose[__corruptions_max] = TRUE + end + + local index, h + for index, h in c.hooks do + add_hook_script(index, "__lua__corrupt_callback"..__corruptions_callbacks_max, "__lua__corrupt_callback"..__corruptions_callbacks_max) + setglobal("__lua__corrupt_callback"..__corruptions_callbacks_max, + function (...) + if test_depend_corrupt(%__corruptions_max) == TRUE then + return call(%h, arg) + end + end + ) + __corruptions_callbacks_max = __corruptions_callbacks_max + 1 + end + + if type(c.desc) == "table" then + local new_desc = "" + for index, h in c.desc do + new_desc = new_desc..h.."\n" + end + c.desc = new_desc + end + + __corruptions[__corruptions_max] = c + __corruptions_max = __corruptions_max + 1 + return (__corruptions_max - 1) +end + + + +---------- Corruption spoiler generator ----------- +function corruption_spoiler_generate() + make_temp_file() + print_hook( +[[~~~~~01|Corruptions (Spoiler) +~~~~~02|Spoilers|Corruptions +#####R=== ToME Corruptions Spoiler === + +Sometimes adventurers become exposed to the dark powers of Morgoth. If they +are unable to resist these powers, they become corrupted. Corruptions can +change their physical or mental abilities, some of which can be good, and +some bad. Most corruptions will affect you permanently, although some only +operate when they are activated (whether by player choice or as a random +event). You can check which corruptions you have in the knowledge screen 6 +(accessed through the '~' menu) or in a character dump. + +#####GGaining and (not) losing corruptions +There are several ways that you can become corrupted. + +You can become corrupted by quaffing a Potion of Corruption or by drinking +from a Fountain of Corruption. Also some strange items can be activated +for corruption. + +Corruptions are permanent. Once you have one, you have it for life. + +]]) + local i, e + for i = 0, __corruptions_max - 1 do + print_hook("[[[[[B"..__corruptions[i].name.."]\n") + print_hook(__corruptions[i].desc) + print_hook("[[[[[GGain message: "..__corruptions[i].get_text.."]\n") + if __corruptions[i].removable == TRUE then + print_hook("[[[[[RLose message: "..__corruptions[i].lose_text.."]\n") + else + print_hook("It is not removable.\n") + end + + local ok + ok = nil + for e, _ in __corruptions[i].depends do ok = not nil end + if ok then + print_hook("It depends on:\n") + for e, _ in __corruptions[i].depends do + print_hook(" "..__corruptions[e].name.."\n") + end + end + ok = nil + for e, _ in __corruptions[i].oppose do ok = not nil end + if ok then + print_hook("It is opposed to:\n") + for e, _ in __corruptions[i].oppose do + print_hook(" "..__corruptions[e].name.."\n") + end + end + print_hook("\n\n") + end + close_temp_file() + msg_print("File created as: "..get_temp_name()) +end |