Tg patch branch to master (#192)
* code nitpicking * Midnight oil More like 6am oil. Still having issues with actually eating anyone. * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * missed commit * Noms * specific release doesn't work * Tg modernization patch (#115) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * port from cactus did * fix format error * Update preferences.dm unfuck * Revert "port from cactus did" * unfuck * more sprite work * vore * disabled roundstart xenos for now * admin QOL needs callback porting, TBD * Mentor system initial port I'm sure I've missed a fuckton of shit * test merge * Jesus tits did this finally fix compile issues? * Tg modern (#149) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * Tg modernization patch (#115) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * port from cactus did * fix format error * Update preferences.dm unfuck * Revert "port from cactus did" * unfuck * more sprite work * vore * disabled roundstart xenos for now * test merge * Jesus tits did this finally fix compile issues? * Initial test compiles. hooray. * Admin ticket fixes * I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum * who list wip also ahelps are broken again. fuck if I know why * discord bot basics * maybe tickets work now & bot framework done * ahelp callback readd * Mentor system, Tickets, and discord (#151) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * Tg modernization patch (#115) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * port from cactus did * fix format error * Update preferences.dm unfuck * Revert "port from cactus did" * unfuck * more sprite work * vore * disabled roundstart xenos for now * admin QOL needs callback porting, TBD * Mentor system initial port I'm sure I've missed a fuckton of shit * test merge * Jesus tits did this finally fix compile issues? * Initial test compiles. hooray. * Admin ticket fixes * I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum * who list wip also ahelps are broken again. fuck if I know why * discord bot basics * maybe tickets work now & bot framework done * ahelp callback readd * vore tweaks * progress * dirtier fix than a korean hooker in the 60s * The release your hooker will always fake * you could save that hookers number but wouldn't you rather just vore the hooker instead * Save system is literal black magic * great googly moogly it's all gone to shit * We May 2015 save code now * fiddling with digestion code now * fuck if I know anymore. I'm going to bed * OWN UP YOUR OWN DIGESTION * UNREGULATED GUTS ARE NON COMPLIANT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * BELLIES MUST COMPLY WITH USER OWNERSHIP * Removed debug messages * Unneeded verb additions * file change tweaks * WATCH YOUR SPACING, DRIVER * Changelog and devourment for some mobs. Because I knew people were gunna ask. NO YOU CANNOT EAT THE FUCKING LEGION * Vore code sync (#157) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Escape and Devourable For the normies who play here yet complain about it. * Things that should be committed * unneeded files * Sizeray works now * tweaks and bed time going * IT WORKS mostly Need to get multiple guts and saving working tho * save tweaks * item hotfix * gut examine message * damifino * save system works also ensured some mobs have vore controls, so silicons can't even remotely do vore things. * code nitpicking * Midnight oil More like 6am oil. Still having issues with actually eating anyone. * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * missed commit * Noms * specific release doesn't work * Tg modernization patch (#115) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * port from cactus did * fix format error * Update preferences.dm unfuck * Revert "port from cactus did" * unfuck * more sprite work * vore * disabled roundstart xenos for now * admin QOL needs callback porting, TBD * Mentor system initial port I'm sure I've missed a fuckton of shit * test merge * Jesus tits did this finally fix compile issues? * Initial test compiles. hooray. * Admin ticket fixes * I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum * who list wip also ahelps are broken again. fuck if I know why * discord bot basics * maybe tickets work now & bot framework done * ahelp callback readd * vore tweaks * progress * dirtier fix than a korean hooker in the 60s * The release your hooker will always fake * you could save that hookers number but wouldn't you rather just vore the hooker instead * Save system is literal black magic * great googly moogly it's all gone to shit * We May 2015 save code now * fiddling with digestion code now * fuck if I know anymore. I'm going to bed * OWN UP YOUR OWN DIGESTION * UNREGULATED GUTS ARE NON COMPLIANT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * BELLIES MUST COMPLY WITH USER OWNERSHIP * Removed debug messages * Unneeded verb additions * file change tweaks * WATCH YOUR SPACING, DRIVER * Changelog and devourment for some mobs. Because I knew people were gunna ask. NO YOU CANNOT EAT THE FUCKING LEGION * title screen change from Crow's PR. * More of Crow's title screen stuff * mode tweaks.... again * gamemode voting in lobby via TalkingCactus disabled ashwalkers as roundstart Verk's species tweak paralax starts disabled by default * LOOC * index sync problem (#158) * digifix * things * furry races.dm * actually deletes species_types * maps * tgui and stuff * Sounds * icon updates * Defines and helpers * global vars and on click * controllers * datums * game folder * fixes invisible flan mobs * some modules * dropbomb verb enhanced * moar * moar * moar * even more again * and finally these for modules * Some compile tweaks * silly dme get updated you scrub * compiles cleanly now * various open PR fixes from TG as of 0800 Texas Standard Time * also fancy cryopods before I forget again * headslug gold core fix * edgy code of the modernization (#164) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Escape and Devourable For the normies who play here yet complain about it. * Things that should be committed * unneeded files * Sizeray works now * tweaks and bed time going * IT WORKS mostly Need to get multiple guts and saving working tho * save tweaks * item hotfix * gut examine message * damifino * save system works also ensured some mobs have vore controls, so silicons can't even remotely do vore things. * code nitpicking * Midnight oil More like 6am oil. Still having issues with actually eating anyone. * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * missed commit * Noms * specific release doesn't work * Tg modernization patch (#115) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * port from cactus did * fix format error * Update preferences.dm unfuck * Revert "port from cactus did" * unfuck * more sprite work * vore * disabled roundstart xenos for now * admin QOL needs callback porting, TBD * Mentor system initial port I'm sure I've missed a fuckton of shit * test merge * Jesus tits did this finally fix compile issues? * Initial test compiles. hooray. * Admin ticket fixes * I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum * who list wip also ahelps are broken again. fuck if I know why * discord bot basics * maybe tickets work now & bot framework done * ahelp callback readd * vore tweaks * progress * Small fixes for dogborgs and sprite accessories: -Ported the hidden snippets of the dogborg code. -Reset module now resets pixel offset and icon directory again. (broke shit when reseting from dogborg) -Medihound belly fixed. -Husky body marking tweaked to not overlap arms in side view. -Added husky ears that are basically wolf ears that use secondary color instead. * dirtier fix than a korean hooker in the 60s * The release your hooker will always fake * you could save that hookers number but wouldn't you rather just vore the hooker instead * Save system is literal black magic * great googly moogly it's all gone to shit * We May 2015 save code now * fiddling with digestion code now * fuck if I know anymore. I'm going to bed * OWN UP YOUR OWN DIGESTION * UNREGULATED GUTS ARE NON COMPLIANT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * BELLIES MUST COMPLY WITH USER OWNERSHIP * Removed debug messages * Unneeded verb additions * file change tweaks * WATCH YOUR SPACING, DRIVER * Changelog and devourment for some mobs. Because I knew people were gunna ask. NO YOU CANNOT EAT THE FUCKING LEGION * title screen change from Crow's PR. * More of Crow's title screen stuff * mode tweaks.... again * gamemode voting in lobby via TalkingCactus disabled ashwalkers as roundstart Verk's species tweak paralax starts disabled by default * LOOC * index sync problem (#158) * digifix * things * furry races.dm * actually deletes species_types * maps * tgui and stuff * Sounds * icon updates * Defines and helpers * global vars and on click * controllers * datums * game folder * fixes invisible flan mobs * some modules * dropbomb verb enhanced * moar * moar * moar * even more again * and finally these for modules * Some compile tweaks * silly dme get updated you scrub * compiles cleanly now * various open PR fixes from TG as of 0800 Texas Standard Time * also fancy cryopods before I forget again * headslug gold core fix * some species and DNA tweaks * Digest already damn you * suddenly sound and resist works. wtf * Minor tweaks, cryopod noise change * Vore tested working, species working * Merge test onto bleeding edgy (#165) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Escape and Devourable For the normies who play here yet complain about it. * Things that should be committed * unneeded files * Sizeray works now * tweaks and bed time going * IT WORKS mostly Need to get multiple guts and saving working tho * save tweaks * item hotfix * gut examine message * damifino * save system works also ensured some mobs have vore controls, so silicons can't even remotely do vore things. * code nitpicking * Midnight oil More like 6am oil. Still having issues with actually eating anyone. * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * missed commit * Noms * specific release doesn't work * Tg modernization patch (#115) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * port from cactus did * fix format error * Update preferences.dm unfuck * Revert "port from cactus did" * unfuck * more sprite work * vore * disabled roundstart xenos for now * admin QOL needs callback porting, TBD * Mentor system initial port I'm sure I've missed a fuckton of shit * test merge * Jesus tits did this finally fix compile issues? * Initial test compiles. hooray. * Admin ticket fixes * I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum * who list wip also ahelps are broken again. fuck if I know why * discord bot basics * maybe tickets work now & bot framework done * ahelp callback readd * vore tweaks * progress * Small fixes for dogborgs and sprite accessories: -Ported the hidden snippets of the dogborg code. -Reset module now resets pixel offset and icon directory again. (broke shit when reseting from dogborg) -Medihound belly fixed. -Husky body marking tweaked to not overlap arms in side view. -Added husky ears that are basically wolf ears that use secondary color instead. * dirtier fix than a korean hooker in the 60s * The release your hooker will always fake * you could save that hookers number but wouldn't you rather just vore the hooker instead * Save system is literal black magic * great googly moogly it's all gone to shit * We May 2015 save code now * fiddling with digestion code now * fuck if I know anymore. I'm going to bed * OWN UP YOUR OWN DIGESTION * UNREGULATED GUTS ARE NON COMPLIANT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * BELLIES MUST COMPLY WITH USER OWNERSHIP * Removed debug messages * Unneeded verb additions * file change tweaks * WATCH YOUR SPACING, DRIVER * Changelog and devourment for some mobs. Because I knew people were gunna ask. NO YOU CANNOT EAT THE FUCKING LEGION * title screen change from Crow's PR. * More of Crow's title screen stuff * mode tweaks.... again * gamemode voting in lobby via TalkingCactus disabled ashwalkers as roundstart Verk's species tweak paralax starts disabled by default * LOOC * index sync problem (#158) * digifix * things * furry races.dm * actually deletes species_types * maps * tgui and stuff * Sounds * icon updates * Defines and helpers * global vars and on click * controllers * datums * game folder * fixes invisible flan mobs * some modules * dropbomb verb enhanced * moar * moar * moar * even more again * and finally these for modules * Some compile tweaks * silly dme get updated you scrub * compiles cleanly now * various open PR fixes from TG as of 0800 Texas Standard Time * also fancy cryopods before I forget again * headslug gold core fix * some species and DNA tweaks * Digest already damn you * suddenly sound and resist works. wtf * Minor tweaks, cryopod noise change * Vore tested working, species working * travis map updates * updates * pool's closed due to lag * datum pools are closed too * Initializing new pool's closed * Pool's closed and initializing shit is done * sprite updates * chattering is okay to do now. * bleeblin edgy 1/23 (#166) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Escape and Devourable For the normies who play here yet complain about it. * Things that should be committed * unneeded files * Sizeray works now * tweaks and bed time going * IT WORKS mostly Need to get multiple guts and saving working tho * save tweaks * item hotfix * gut examine message * damifino * save system works also ensured some mobs have vore controls, so silicons can't even remotely do vore things. * code nitpicking * Midnight oil More like 6am oil. Still having issues with actually eating anyone. * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * missed commit * Noms * specific release doesn't work * Tg modernization patch (#115) * sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Subsystem 12/21 Most Recent TG subsystem folder * globalvars 12/21 Tossed out the flavor_misc and parallax files * Onclick 12/21 as well as .dme updates * _defines 12/21 ommited old _MC.dm * _HELPERS 12/21 Preserved snowflake placement of furry sprites * _defeines/genetics reapplied narkism holdover for snowflake races. * Oops forgot mutant colors * modules porting 12/21 + Sounds/icons Admin, Client and most of mob life files ommitted * enviroment file * Admin optimizations ahelp log system kept * Mob ports 12/21 Flavor text preserved * datums ported 12/21 * Game ported 12/21 * batch of duplicate fixes/dogborg work Dogborgs need to be modernized to refractored borg standards. * moar fixes * Maps and futher compile fixes * port from cactus did * fix format error * Update preferences.dm unfuck * Revert "port from cactus did" * unfuck * more sprite work * vore * disabled roundstart xenos for now * admin QOL needs callback porting, TBD * Mentor system initial port I'm sure I've missed a fuckton of shit * test merge * Jesus tits did this finally fix compile issues? * Initial test compiles. hooray. * Admin ticket fixes * I'll give you a bad argument you piece of shit dream maker I fucking swear on my mum * who list wip also ahelps are broken again. fuck if I know why * discord bot basics * maybe tickets work now & bot framework done * ahelp callback readd * vore tweaks * progress * Small fixes for dogborgs and sprite accessories: -Ported the hidden snippets of the dogborg code. -Reset module now resets pixel offset and icon directory again. (broke shit when reseting from dogborg) -Medihound belly fixed. -Husky body marking tweaked to not overlap arms in side view. -Added husky ears that are basically wolf ears that use secondary color instead. * dirtier fix than a korean hooker in the 60s * The release your hooker will always fake * you could save that hookers number but wouldn't you rather just vore the hooker instead * Save system is literal black magic * great googly moogly it's all gone to shit * We May 2015 save code now * fiddling with digestion code now * fuck if I know anymore. I'm going to bed * OWN UP YOUR OWN DIGESTION * UNREGULATED GUTS ARE NON COMPLIANT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * BELLIES MUST COMPLY WITH USER OWNERSHIP * Removed debug messages * Unneeded verb additions * file change tweaks * WATCH YOUR SPACING, DRIVER * Changelog and devourment for some mobs. Because I knew people were gunna ask. NO YOU CANNOT EAT THE FUCKING LEGION * title screen change from Crow's PR. * More of Crow's title screen stuff * mode tweaks.... again * gamemode voting in lobby via TalkingCactus disabled ashwalkers as roundstart Verk's species tweak paralax starts disabled by default * LOOC * index sync problem (#158) * digifix * things * furry races.dm * actually deletes species_types * maps * tgui and stuff * Sounds * icon updates * Defines and helpers * global vars and on click * controllers * datums * game folder * fixes invisible flan mobs * some modules * dropbomb verb enhanced * moar * moar * moar * even more again * and finally these for modules * Some compile tweaks * silly dme get updated you scrub * compiles cleanly now * various open PR fixes from TG as of 0800 Texas Standard Time * also fancy cryopods before I forget again * headslug gold core fix * some species and DNA tweaks * Digest already damn you * suddenly sound and resist works. wtf * Minor tweaks, cryopod noise change * Vore tested working, species working * travis map updates * updates * pool's closed due to lag * datum pools are closed too * Initializing new pool's closed * Pool's closed and initializing shit is done * sprite updates * chattering is okay to do now. * Update .travis.yml * Update .travis.yml * Update .travis.yml * Revert "Modern modern" * Revert "Revert "Modern modern"" * fix it fix it fix it fix it * fixes title screen - thanks crow * Riding code reverted * possible tgui fix? * who the fuck even knows if this is the problem * adds moths and sharks (no colors yet, not greyscaled) adds LOOC back * "fixes" missing items in some machinery. * slight tweaks to abductor spawns borer event enabled (max 1) * Update .travis.yml * fixes shuttle purchase from comms * fixes and QoL * Polymorphing all is dangerous too * re-fixes ahelp ticket system again * metagaming check proving to be spamlicious * Fixes not being able to see devoured mob poses * fix for vehicle buckling * ahelp timer runtime fix (#178) * controller and game updates 1/29 * Defines, helpers, datums 1/29 * world.dm updates * modules/admin tweaks * everything in modules not a mob * modules/mob fixes and such No more PAIs ventcrawling * icons, maps, tools, etc. * compiler fixes * round type vote fixed * hardsuit cargo pack * reduce ion and electric storm chance * perms access for travis * fix helmet to the suit removes CE from crate * changelog * fuck * perms for travis... again * Update tgstation.dme * Update tgstation.dme * Donation race * redpanda * red panda * size play work * Size chemical basics Needs testing/refining * some fixing ports before I just fucking ported it anyway * It's been a fucking week. * commiting moar changes because github * admins.txt lol * icons * defines and such * globalvars and onclick * Controllers * datums * game folder * oh look, HoG is back * modules pt 1 * client things * more modules * everything not mob code * some mob stuff * more mob things * silicon mobs * ayylims and monkeys * human updates * huh * housekeeping is fired. * last minute fixes * more last minute things * human parts double check'd * more paper * Icons are fixed * double check of thermal protection code. (#191)
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/cult = list()
|
||||
var/list/cult_objectives = list()
|
||||
|
||||
/proc/iscultist(mob/living/M)
|
||||
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult)
|
||||
return istype(M) && M.has_antag_datum(/datum/antagonist/cultist, TRUE)
|
||||
|
||||
/proc/is_sacrifice_target(datum/mind/mind)
|
||||
if(ticker.mode.name == "cult")
|
||||
@@ -14,25 +14,20 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/is_convertable_to_cult(datum/mind/mind)
|
||||
if(!istype(mind))
|
||||
/proc/is_convertable_to_cult(mob/living/M)
|
||||
if(!istype(M))
|
||||
return 0
|
||||
if(istype(mind.current, /mob/living/carbon/human) && (mind.assigned_role in list("Captain", "Chaplain")))
|
||||
return 0
|
||||
if(isloyal(mind.current))
|
||||
return 0
|
||||
if(issilicon(mind.current) || isbot(mind.current) || isdrone(mind.current))
|
||||
return 0 //can't convert machines, that's ratvar's thing
|
||||
if(isguardian(mind.current))
|
||||
var/mob/living/simple_animal/hostile/guardian/G = mind.current
|
||||
if(!iscultist(G.summoner))
|
||||
return 0 //can't convert it unless the owner is converted
|
||||
if(is_sacrifice_target(mind))
|
||||
return 0
|
||||
if(mind.enslaved_to)
|
||||
return 0
|
||||
if(is_servant_of_ratvar(mind.current))
|
||||
if(M.mind)
|
||||
if(ishuman(M) && (M.mind.assigned_role in list("Captain", "Chaplain")))
|
||||
return 0
|
||||
if(is_sacrifice_target(M.mind))
|
||||
return 0
|
||||
if(M.mind.enslaved_to && !iscultist(M.mind.enslaved_to))
|
||||
return 0
|
||||
else
|
||||
return 0
|
||||
if(M.isloyal() || issilicon(M) || isbot(M) || isdrone(M) || is_servant_of_ratvar(M))
|
||||
return 0 //can't convert machines, shielded, or ratvar's dogs
|
||||
return 1
|
||||
|
||||
/datum/game_mode/cult
|
||||
@@ -46,21 +41,20 @@
|
||||
recommended_enemies = 2
|
||||
enemy_minimum_age = 14
|
||||
|
||||
announce_span = "cult"
|
||||
announce_text = "Some crew members are trying to start a cult to Nar-Sie!\n\
|
||||
<span class='cult'>Cultists</span>: Carry out Nar-Sie's will.\n\
|
||||
<span class='notice'>Crew</span>: Prevent the cult from expanding and drive it out."
|
||||
|
||||
var/finished = 0
|
||||
var/eldergod = 1 //for the summon god objective
|
||||
|
||||
var/acolytes_needed = 10 //for the survive objective
|
||||
var/acolytes_needed = 5 //for the survive objective
|
||||
var/acolytes_survived = 0
|
||||
|
||||
var/datum/mind/sacrifice_target = null//The target to be sacrificed
|
||||
var/list/cultists_to_cult = list() //the cultists we'll convert
|
||||
|
||||
|
||||
/datum/game_mode/cult/announce()
|
||||
world << "<B>The current game mode is - Cult!</B>"
|
||||
world << "<B>Some crewmembers are attempting to start a cult!<BR>\nCultists - sacrifice your target and summon Nar-Sie at all costs. Convert crewmembers to your cause by using the convert rune, or sacrifice them and turn them into constructs. Remember - there is no you, there is only the cult.<BR>\nPersonnel - Do not let the cult succeed in its mission. Forced consumption of holy water will convert a cultist back to a Nanotrasen-sanctioned faith.</B>"
|
||||
|
||||
|
||||
/datum/game_mode/cult/pre_setup()
|
||||
cult_objectives += "sacrifice"
|
||||
cult_objectives += "eldergod"
|
||||
@@ -144,9 +138,7 @@
|
||||
var/list/slots = list(
|
||||
"backpack" = slot_in_backpack,
|
||||
"left pocket" = slot_l_store,
|
||||
"right pocket" = slot_r_store,
|
||||
"left hand" = slot_l_hand,
|
||||
"right hand" = slot_r_hand,
|
||||
"right pocket" = slot_r_store
|
||||
)
|
||||
|
||||
var/T = new item_path(mob)
|
||||
@@ -157,7 +149,6 @@
|
||||
return 0
|
||||
else
|
||||
mob << "<span class='danger'>You have a [item_name] in your [where]."
|
||||
mob.update_icons()
|
||||
if(where == "backpack")
|
||||
var/obj/item/weapon/storage/B = mob.back
|
||||
B.orient2hud(mob)
|
||||
@@ -167,43 +158,21 @@
|
||||
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun) //BASE
|
||||
if (!istype(cult_mind))
|
||||
return 0
|
||||
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
|
||||
if(cult_mind.current.gain_antag_datum(/datum/antagonist/cultist))
|
||||
if(stun)
|
||||
cult_mind.current.Paralyse(5)
|
||||
cult += cult_mind
|
||||
cult_mind.current.faction |= "cult"
|
||||
cult_mind.current.verbs += /mob/living/proc/cult_help
|
||||
var/datum/action/innate/cultcomm/C = new()
|
||||
C.Grant(cult_mind.current)
|
||||
update_cult_icons_added(cult_mind)
|
||||
cult_mind.current.attack_log += "\[[time_stamp()]\] <span class='danger'>Has been converted to the cult!</span>"
|
||||
if(jobban_isbanned(cult_mind.current, ROLE_CULTIST))
|
||||
replace_jobbaned_player(cult_mind.current, ROLE_CULTIST, ROLE_CULTIST)
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/cult/add_cultist(datum/mind/cult_mind, stun) //INHERIT
|
||||
if (!..(cult_mind))
|
||||
return
|
||||
memorize_cult_objectives(cult_mind)
|
||||
|
||||
return 1
|
||||
|
||||
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1, stun)
|
||||
if(cult_mind in cult)
|
||||
cult -= cult_mind
|
||||
cult_mind.current.faction -= "cult"
|
||||
cult_mind.current.verbs -= /mob/living/proc/cult_help
|
||||
for(var/datum/action/innate/cultcomm/C in cult_mind.current.actions)
|
||||
qdel(C)
|
||||
if(cult_mind.current)
|
||||
var/datum/antagonist/cultist/cult_datum = cult_mind.current.has_antag_datum(/datum/antagonist/cultist, TRUE)
|
||||
if(!cult_datum)
|
||||
return FALSE
|
||||
cult_datum.silent_update = show_message
|
||||
cult_datum.on_remove()
|
||||
if(stun)
|
||||
cult_mind.current.Paralyse(5)
|
||||
cult_mind.current << "<span class='userdanger'>An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.</span>"
|
||||
cult_mind.memory = ""
|
||||
update_cult_icons_removed(cult_mind)
|
||||
cult_mind.current.attack_log += "\[[time_stamp()]\] <span class='danger'>Has renounced the cult!</span>"
|
||||
if(show_message)
|
||||
for(var/mob/M in viewers(cult_mind.current))
|
||||
M << "<span class='big'>[cult_mind.current] looks like they just reverted to their old faith!</span>"
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
|
||||
var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
|
||||
@@ -214,12 +183,14 @@
|
||||
var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
|
||||
culthud.leave_hud(cult_mind.current)
|
||||
set_antag_hud(cult_mind.current, null)
|
||||
|
||||
/datum/game_mode/cult/proc/get_unconvertables()
|
||||
var/list/ucs = list()
|
||||
for(var/mob/living/carbon/human/player in player_list)
|
||||
if(player.mind && !is_convertable_to_cult(player.mind))
|
||||
if(player.mind && !is_convertable_to_cult(player) && !(player.mind in cultists_to_cult))
|
||||
ucs += player.mind
|
||||
return ucs
|
||||
|
||||
/datum/game_mode/cult/proc/check_cult_victory()
|
||||
var/cult_fail = 0
|
||||
if(cult_objectives.Find("survive"))
|
||||
@@ -266,9 +237,11 @@
|
||||
if(!check_survive())
|
||||
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='greenannounce'>Success!</span>"
|
||||
feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
|
||||
ticker.news_report = CULT_ESCAPE
|
||||
else
|
||||
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='boldannounce'>Fail.</span>"
|
||||
feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
|
||||
ticker.news_report = CULT_FAILURE
|
||||
if("sacrifice")
|
||||
if(sacrifice_target)
|
||||
if(sacrifice_target in sacrificed)
|
||||
@@ -284,9 +257,12 @@
|
||||
if(!eldergod)
|
||||
explanation = "Summon Nar-Sie. <span class='greenannounce'>Success!</span>"
|
||||
feedback_add_details("cult_objective","cult_narsie|SUCCESS")
|
||||
ticker.news_report = CULT_SUMMON
|
||||
else
|
||||
explanation = "Summon Nar-Sie. <span class='boldannounce'>Fail.</span>"
|
||||
feedback_add_details("cult_objective","cult_narsie|FAIL")
|
||||
ticker.news_report = CULT_FAILURE
|
||||
|
||||
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
|
||||
world << text
|
||||
..()
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
name = "Communion"
|
||||
button_icon_state = "cult_comms"
|
||||
background_icon_state = "bg_demon"
|
||||
buttontooltipstyle = "cult"
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS
|
||||
|
||||
/datum/action/innate/cultcomm/IsAvailable()
|
||||
@@ -29,9 +30,9 @@
|
||||
if(!user)
|
||||
return
|
||||
if(!ishuman(user))
|
||||
user.say(message)
|
||||
user.say(html_decode(message))
|
||||
else
|
||||
user.whisper(message)
|
||||
user.whisper(html_decode(message))
|
||||
var/my_message = "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [user]:</b> [message]</span>"
|
||||
for(var/mob/M in mob_list)
|
||||
if(iscultist(M))
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
item_state = "cultblade"
|
||||
flags = CONDUCT
|
||||
sharpness = IS_SHARP
|
||||
w_class = 4
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 30
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
@@ -15,7 +15,7 @@
|
||||
/obj/item/weapon/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
if(!iscultist(user))
|
||||
user.Weaken(5)
|
||||
user.unEquip(src, 1)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.visible_message("<span class='warning'>A powerful force shoves [user] away from [target]!</span>", \
|
||||
"<span class='cultlarge'>\"You shouldn't play with sharp things. You'll poke someone's eye out.\"</span>")
|
||||
if(ishuman(user))
|
||||
@@ -38,14 +38,14 @@
|
||||
user << "<span class='userdanger'>A horrible force yanks at your arm!</span>"
|
||||
user.emote("scream")
|
||||
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
|
||||
user.unEquip(src)
|
||||
user.dropItemToGround(src)
|
||||
|
||||
/obj/item/weapon/melee/cultblade/dagger
|
||||
name = "sacrificial dagger"
|
||||
desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "render"
|
||||
w_class = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 15
|
||||
throwforce = 25
|
||||
embed_chance = 75
|
||||
@@ -73,7 +73,7 @@
|
||||
desc = "A torn, dust-caked hood. Strange letters line the inside."
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS
|
||||
flags_cover = HEADCOVERSEYES
|
||||
armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0)
|
||||
armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0, fire = 10, acid = 10)
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
|
||||
heat_protection = HEAD
|
||||
@@ -86,7 +86,7 @@
|
||||
item_state = "cultrobes"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
cold_protection = CHEST|GROIN|LEGS|ARMS
|
||||
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
|
||||
@@ -113,7 +113,7 @@
|
||||
item_state = "magus"
|
||||
desc = "A helm worn by the followers of Nar-Sie."
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES
|
||||
armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0)
|
||||
armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0, fire = 10, acid = 10)
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
|
||||
/obj/item/clothing/suit/magusred
|
||||
@@ -123,7 +123,7 @@
|
||||
item_state = "magusred"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/cult
|
||||
@@ -131,7 +131,7 @@
|
||||
desc = "A heavily-armored helmet worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
|
||||
icon_state = "cult_helmet"
|
||||
item_state = "cult_helmet"
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 40, acid = 75)
|
||||
brightness_on = 0
|
||||
actions_types = list()
|
||||
|
||||
@@ -140,9 +140,9 @@
|
||||
icon_state = "cult_armor"
|
||||
item_state = "cult_armor"
|
||||
desc = "A heavily-armored exosuit worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
|
||||
w_class = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/internals/)
|
||||
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 40, acid = 75)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult
|
||||
|
||||
/obj/item/weapon/sharpener/cult
|
||||
@@ -158,21 +158,19 @@
|
||||
desc = "Empowered garb which creates a powerful shield around the user."
|
||||
icon_state = "cult_armor"
|
||||
item_state = "cult_armor"
|
||||
w_class = 4
|
||||
armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30)
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30, fire = 50, acid = 60)
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
var/current_charges = 3
|
||||
hooded = 1
|
||||
hoodtype = /obj/item/clothing/head/cult_hoodie
|
||||
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie
|
||||
|
||||
/obj/item/clothing/head/cult_hoodie
|
||||
/obj/item/clothing/head/hooded/cult_hoodie
|
||||
name = "empowered cultist armor"
|
||||
desc = "Empowered garb which creates a powerful shield around the user."
|
||||
icon_state = "cult_hoodalt"
|
||||
armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30)
|
||||
armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30, fire = 50, acid = 50)
|
||||
body_parts_covered = HEAD
|
||||
flags = NODROP
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/equipped(mob/living/user, slot)
|
||||
@@ -181,21 +179,21 @@
|
||||
if(!is_servant_of_ratvar(user))
|
||||
user << "<span class='cultlarge'>\"I wouldn't advise that.\"</span>"
|
||||
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
|
||||
user.unEquip(src, 1)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.Dizzy(30)
|
||||
user.Weaken(5)
|
||||
else
|
||||
user << "<span class='cultlarge'>\"Putting on things you don't own is bad, you know.\"</span>"
|
||||
user << "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>"
|
||||
user << "<span class='userdanger'>The armor squeezes at your body!</span>"
|
||||
user.emote("scream")
|
||||
user.adjustBruteLoss(25)
|
||||
user.unEquip(src, 1)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/hit_reaction(mob/living/carbon/human/owner, attack_text, isinhands)
|
||||
if(current_charges)
|
||||
owner.visible_message("<span class='danger'>\The [attack_text] is deflected in a burst of blood-red sparks!</span>")
|
||||
current_charges--
|
||||
PoolOrNew(/obj/effect/overlay/temp/cult/sparks, get_turf(owner))
|
||||
new /obj/effect/overlay/temp/cult/sparks(get_turf(owner))
|
||||
if(!current_charges)
|
||||
owner.visible_message("<span class='danger'>The runed shield around [owner] suddenly disappears!</span>")
|
||||
owner.update_inv_wear_suit()
|
||||
@@ -215,19 +213,17 @@
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100)
|
||||
armor = list(melee = -50, bullet = -50, laser = -100,energy = -50, bomb = -50, bio = -50, rad = -50, fire = 0, acid = 0)
|
||||
slowdown = -1
|
||||
hooded = 1
|
||||
hoodtype = /obj/item/clothing/head/berserkerhood
|
||||
hoodtype = /obj/item/clothing/head/hooded/berserkerhood
|
||||
|
||||
/obj/item/clothing/head/berserkerhood
|
||||
/obj/item/clothing/head/hooded/berserkerhood
|
||||
name = "flagellant's robes"
|
||||
desc = "Blood-soaked garb infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
|
||||
icon_state = "culthood"
|
||||
body_parts_covered = HEAD
|
||||
flags = NODROP
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100)
|
||||
armor = list(melee = -50, bullet = -50, laser = -50, energy = -50, bomb = -50, bio = -50, rad = -50, fire = 0, acid = 0)
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot)
|
||||
..()
|
||||
@@ -235,15 +231,15 @@
|
||||
if(!is_servant_of_ratvar(user))
|
||||
user << "<span class='cultlarge'>\"I wouldn't advise that.\"</span>"
|
||||
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
|
||||
user.unEquip(src, 1)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.Dizzy(30)
|
||||
user.Weaken(5)
|
||||
else
|
||||
user << "<span class='cultlarge'>\"Putting on things you don't own is bad, you know.\"</span>"
|
||||
user << "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>"
|
||||
user << "<span class='userdanger'>The robes squeeze at your body!</span>"
|
||||
user.emote("scream")
|
||||
user.adjustBruteLoss(25)
|
||||
user.unEquip(src, 1)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
|
||||
/obj/item/clothing/glasses/night/cultblind
|
||||
desc = "May nar-sie guide you through the darkness and shield you from the light."
|
||||
@@ -257,14 +253,14 @@
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
user << "<span class='cultlarge'>\"You want to be blind, do you?\"</span>"
|
||||
user.unEquip(src, 1)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.Dizzy(30)
|
||||
user.Weaken(5)
|
||||
user.blind_eyes(30)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
|
||||
name = "flask of unholy water"
|
||||
desc = "Toxic to nonbelievers; this water renews and reinvigorates the faithful of nar'sie."
|
||||
desc = "Toxic to nonbelievers; reinvigorating to the faithful - this flask may be sipped or thrown."
|
||||
icon_state = "holyflask"
|
||||
color = "#333333"
|
||||
list_reagents = list("unholywater" = 40)
|
||||
@@ -278,7 +274,7 @@
|
||||
|
||||
/obj/item/device/shuttle_curse/attack_self(mob/user)
|
||||
if(!iscultist(user))
|
||||
user.unEquip(src, 1)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.Weaken(5)
|
||||
user << "<span class='warning'>A powerful force shoves you away from [src]!</span>"
|
||||
return
|
||||
@@ -286,7 +282,7 @@
|
||||
user << "<span class='notice'>We have exhausted our ability to curse the shuttle.</span>"
|
||||
return
|
||||
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
|
||||
var/cursetime = 1500
|
||||
var/cursetime = 1800
|
||||
var/timer = SSshuttle.emergency.timeLeft(1) + cursetime
|
||||
SSshuttle.emergency.setTimer(timer)
|
||||
user << "<span class='danger'>You shatter the orb! A dark essence spirals into the air, then disappears.</span>"
|
||||
@@ -295,12 +291,12 @@
|
||||
sleep(20)
|
||||
var/global/list/curses
|
||||
if(!curses)
|
||||
curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by two minutes.",
|
||||
"The shuttle's navigation programming was replaced by a file containing two words, IT COMES. The shuttle will be delayed by two minutes.",
|
||||
"The shuttle's custodian tore out his guts and began painting strange shapes on the floor. The shuttle will be delayed by two minutes.",
|
||||
"A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh. The shuttle will be delayed by two minutes.",
|
||||
"A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine. The shuttle will be delayed by two minutes.",
|
||||
"The shuttle dispatcher was found dead with bloody symbols carved into their flesh. The shuttle will be delayed by two minutes.")
|
||||
curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by three minutes.",
|
||||
"The shuttle's navigation programming was replaced by a file containing two words, IT COMES. The shuttle will be delayed by three minutes.",
|
||||
"The shuttle's custodian tore out his guts and began painting strange shapes on the floor. The shuttle will be delayed by three minutes.",
|
||||
"A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh. The shuttle will be delayed by three minutes.",
|
||||
"A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine. The shuttle will be delayed by three minutes.",
|
||||
"The shuttle dispatcher was found dead with bloody symbols carved into their flesh. The shuttle will be delayed by three minutes.")
|
||||
var/message = pick_n_take(curses)
|
||||
priority_announce("[message]", "System Failure", 'sound/misc/notice1.ogg')
|
||||
curselimit++
|
||||
@@ -310,7 +306,7 @@
|
||||
desc = "This relic teleports you forward a medium distance."
|
||||
icon = 'icons/obj/cult.dmi'
|
||||
icon_state ="shifter"
|
||||
var/uses = 2
|
||||
var/uses = 4
|
||||
|
||||
/obj/item/device/cult_shift/examine(mob/user)
|
||||
..()
|
||||
@@ -331,9 +327,9 @@
|
||||
user << "<span class='warning'>\The [src] is dull and unmoving in your hands.</span>"
|
||||
return
|
||||
if(!iscultist(user))
|
||||
user.unEquip(src, 1)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
step(src, pick(alldirs))
|
||||
user << "<span class='warning'>\The [src] flickers out of your hands, too eager to move!</span>"
|
||||
user << "<span class='warning'>\The [src] flickers out of your hands, your connection to this dimension is too strong!</span>"
|
||||
return
|
||||
|
||||
var/mob/living/carbon/C = user
|
||||
@@ -345,16 +341,67 @@
|
||||
if(uses <= 0)
|
||||
icon_state ="shifter_drained"
|
||||
playsound(mobloc, "sparks", 50, 1)
|
||||
PoolOrNew(/obj/effect/overlay/temp/cult/phase/out, list(mobloc, C.dir))
|
||||
new /obj/effect/overlay/temp/dir_setting/cult/phase/out(mobloc, C.dir)
|
||||
|
||||
var/atom/movable/pulled = handle_teleport_grab(destination, C)
|
||||
C.forceMove(destination)
|
||||
if(pulled)
|
||||
C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
|
||||
|
||||
PoolOrNew(/obj/effect/overlay/temp/cult/phase, list(destination, C.dir))
|
||||
new /obj/effect/overlay/temp/dir_setting/cult/phase(destination, C.dir)
|
||||
playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(destination, "sparks", 50, 1)
|
||||
|
||||
else
|
||||
C << "<span class='danger'>The veil cannot be torn here!</span>"
|
||||
|
||||
/obj/item/device/flashlight/flare/culttorch
|
||||
name = "void torch"
|
||||
desc = "Used by veteran cultists to instantly transport items to their needful bretheren."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
brightness_on = 1
|
||||
icon_state = "torch-on"
|
||||
item_state = "torch-on"
|
||||
color = "#ff0000"
|
||||
on_damage = 15
|
||||
slot_flags = null
|
||||
on = 1
|
||||
var/charges = 3
|
||||
|
||||
/obj/item/device/flashlight/flare/culttorch/afterattack(atom/movable/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
if(istype(A, /obj/item))
|
||||
|
||||
var/list/cultists = list()
|
||||
for(var/datum/mind/M in ticker.mode.cult)
|
||||
if(M.current && M.current.stat != DEAD)
|
||||
cultists |= M.current
|
||||
var/mob/living/cultist_to_receive = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in (cultists - user)
|
||||
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
|
||||
return
|
||||
if(!cultist_to_receive)
|
||||
user << "<span class='cultitalic'>You require a destination!</span>"
|
||||
log_game("Void torch failed - no target")
|
||||
return
|
||||
if(cultist_to_receive.stat == DEAD)
|
||||
user << "<span class='cultitalic'>[cultist_to_receive] has died!</span>"
|
||||
log_game("Void torch failed - target died")
|
||||
return
|
||||
if(!iscultist(cultist_to_receive))
|
||||
user << "<span class='cultitalic'>[cultist_to_receive] is not a follower of the Geometer!</span>"
|
||||
log_game("Void torch failed - target was deconverted")
|
||||
return
|
||||
user << "<span class='cultitalic'>You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!"
|
||||
cultist_to_receive.put_in_hands(A)
|
||||
charges--
|
||||
user << "\The [src] now has [charges] charge\s."
|
||||
if(charges == 0)
|
||||
qdel(src)
|
||||
|
||||
else
|
||||
..()
|
||||
user << "<span class='warning'>\The [src] can only transport items!</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -1,18 +1,37 @@
|
||||
/obj/structure/cult
|
||||
/obj/structure/destructible/cult
|
||||
density = 1
|
||||
anchored = 1
|
||||
icon = 'icons/obj/cult.dmi'
|
||||
var/cooldowntime = 0
|
||||
var/health = 100
|
||||
var/maxhealth = 100
|
||||
break_sound = 'sound/hallucinations/veryfar_noise.ogg'
|
||||
debris = list(/obj/item/stack/sheet/runed_metal = 1)
|
||||
|
||||
/obj/structure/cult/examine(mob/user)
|
||||
/obj/structure/destructible/cult/examine(mob/user)
|
||||
..()
|
||||
user << "<span class='notice'>\The [src] is [anchored ? "":"not "]secured to the floor.</span>"
|
||||
if(iscultist(user) && cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
if((iscultist(user) || isobserver(user)) && cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is too weak, [p_they()] will be ready to use again in [getETA()].</span>"
|
||||
|
||||
/obj/structure/cult/attackby(obj/I, mob/user, params)
|
||||
/obj/structure/destructible/cult/examine_status(mob/user)
|
||||
if(iscultist(user) || isobserver(user))
|
||||
var/t_It = p_they(TRUE)
|
||||
var/t_is = p_are()
|
||||
return "<span class='cult'>[t_It] [t_is] at <b>[round(obj_integrity * 100 / max_integrity)]%</b> stability.</span>"
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/M)
|
||||
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
|
||||
if(obj_integrity < max_integrity)
|
||||
obj_integrity = min(max_integrity, obj_integrity + 5)
|
||||
Beam(M, icon_state="sendbeam", time=4)
|
||||
M.visible_message("<span class='danger'>[M] repairs \the <b>[src]</b>.</span>", \
|
||||
"<span class='cult'>You repair <b>[src]</b>, leaving [p_they()] at <b>[round(obj_integrity * 100 / max_integrity)]%</b> stability.</span>")
|
||||
else
|
||||
M << "<span class='cult'>You cannot repair [src], as [p_they()] [p_are()] undamaged!</span>"
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/structure/destructible/cult/attackby(obj/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
|
||||
anchored = !anchored
|
||||
user << "<span class='notice'>You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.</span>"
|
||||
@@ -23,7 +42,14 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/cult/proc/getETA()
|
||||
/obj/structure/destructible/cult/ratvar_act()
|
||||
if(take_damage(rand(25, 50), BURN) && src) //if we still exist
|
||||
var/previouscolor = color
|
||||
color = "#FAE48C"
|
||||
animate(src, color = previouscolor, time = 8)
|
||||
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
|
||||
|
||||
/obj/structure/destructible/cult/proc/getETA()
|
||||
var/time = (cooldowntime - world.time)/600
|
||||
var/eta = "[round(time, 1)] minutes"
|
||||
if(time <= 1)
|
||||
@@ -31,12 +57,13 @@
|
||||
eta = "[round(time, 1)] seconds"
|
||||
return eta
|
||||
|
||||
/obj/structure/cult/talisman
|
||||
/obj/structure/destructible/cult/talisman
|
||||
name = "altar"
|
||||
desc = "A bloodstained altar dedicated to Nar-Sie."
|
||||
icon_state = "talismanaltar"
|
||||
break_message = "<span class='warning'>The altar shatters, leaving only the wailing of the damned!</span>"
|
||||
|
||||
/obj/structure/cult/talisman/attack_hand(mob/living/user)
|
||||
/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>"
|
||||
return
|
||||
@@ -61,13 +88,14 @@
|
||||
user << "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with an [N]!</span>"
|
||||
|
||||
|
||||
/obj/structure/cult/forge
|
||||
/obj/structure/destructible/cult/forge
|
||||
name = "daemon forge"
|
||||
desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie."
|
||||
icon_state = "forge"
|
||||
luminosity = 3
|
||||
break_message = "<span class='warning'>The force breaks apart into shards with a howling scream!</span>"
|
||||
|
||||
/obj/structure/cult/forge/attack_hand(mob/living/user)
|
||||
/obj/structure/destructible/cult/forge/attack_hand(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>The heat radiating from [src] pushes you back.</span>"
|
||||
return
|
||||
@@ -99,25 +127,27 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
/turf/open/floor/plating/lava,
|
||||
/turf/open/chasm))
|
||||
|
||||
/obj/structure/cult/pylon
|
||||
/obj/structure/destructible/cult/pylon
|
||||
name = "pylon"
|
||||
desc = "A floating crystal that slowly heals those faithful to Nar'Sie."
|
||||
icon_state = "pylon"
|
||||
luminosity = 5
|
||||
break_sound = 'sound/effects/Glassbr2.ogg'
|
||||
break_message = "<span class='warning'>The blood-red crystal falls to the floor and shatters!</span>"
|
||||
var/heal_delay = 25
|
||||
var/last_heal = 0
|
||||
var/corrupt_delay = 50
|
||||
var/last_corrupt = 0
|
||||
|
||||
/obj/structure/cult/pylon/New()
|
||||
/obj/structure/destructible/cult/pylon/New()
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
..()
|
||||
|
||||
/obj/structure/cult/pylon/Destroy()
|
||||
/obj/structure/destructible/cult/pylon/Destroy()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
return ..()
|
||||
|
||||
/obj/structure/cult/pylon/process()
|
||||
/obj/structure/destructible/cult/pylon/process()
|
||||
if(!anchored)
|
||||
return
|
||||
if(last_heal <= world.time)
|
||||
@@ -125,7 +155,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
for(var/mob/living/L in range(5, src))
|
||||
if(iscultist(L) || isshade(L) || isconstruct(L))
|
||||
if(L.health != L.maxHealth)
|
||||
PoolOrNew(/obj/effect/overlay/temp/heal, list(get_turf(src), "#960000"))
|
||||
new /obj/effect/overlay/temp/heal(get_turf(src), "#960000")
|
||||
if(ishuman(L))
|
||||
L.adjustBruteLoss(-1, 0)
|
||||
L.adjustFireLoss(-1, 0)
|
||||
@@ -155,19 +185,20 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
else
|
||||
var/turf/open/floor/engine/cult/F = safepick(cultturfs)
|
||||
if(F)
|
||||
PoolOrNew(/obj/effect/overlay/temp/cult/turf/open/floor, F)
|
||||
new /obj/effect/overlay/temp/cult/turf/floor(F)
|
||||
else
|
||||
// Are we in space or something? No cult turfs or
|
||||
// convertable turfs?
|
||||
last_corrupt = world.time + corrupt_delay*2
|
||||
|
||||
/obj/structure/cult/tome
|
||||
/obj/structure/destructible/cult/tome
|
||||
name = "archives"
|
||||
desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl."
|
||||
icon_state = "tomealtar"
|
||||
luminosity = 1
|
||||
break_message = "<span class='warning'>The books and tomes of the archives burn into ash as the desk shatters!</span>"
|
||||
|
||||
/obj/structure/cult/tome/attack_hand(mob/living/user)
|
||||
/obj/structure/destructible/cult/tome/attack_hand(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>All of these books seem to be gibberish.</span>"
|
||||
return
|
||||
@@ -177,19 +208,21 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
if(cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
return
|
||||
var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Shifter")
|
||||
var/pickedtype
|
||||
var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Walker Set")
|
||||
var/list/pickedtype = list()
|
||||
switch(choice)
|
||||
if("Supply Talisman")
|
||||
pickedtype = /obj/item/weapon/paper/talisman/supply/weak
|
||||
pickedtype += /obj/item/weapon/paper/talisman/supply/weak
|
||||
if("Shuttle Curse")
|
||||
pickedtype = /obj/item/device/shuttle_curse
|
||||
if("Veil Shifter")
|
||||
pickedtype = /obj/item/device/cult_shift
|
||||
if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
pickedtype += /obj/item/device/shuttle_curse
|
||||
if("Veil Walker Set")
|
||||
pickedtype += /obj/item/device/cult_shift
|
||||
pickedtype += /obj/item/device/flashlight/flare/culttorch
|
||||
if(src && !qdeleted(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
cooldowntime = world.time + 2400
|
||||
var/obj/item/N = new pickedtype(get_turf(src))
|
||||
user << "<span class='cultitalic'>You summon [N] from the archives!</span>"
|
||||
for(var/N in pickedtype)
|
||||
var/obj/item/D = new N(get_turf(src))
|
||||
user << "<span class='cultitalic'>You summon [D] from the archives!</span>"
|
||||
|
||||
/obj/effect/gateway
|
||||
name = "gateway"
|
||||
@@ -197,5 +230,4 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
icon = 'icons/obj/cult.dmi'
|
||||
icon_state = "hole"
|
||||
density = 1
|
||||
unacidable = 1
|
||||
anchored = 1
|
||||
|
||||
@@ -11,7 +11,7 @@ This file contains the arcane tome files.
|
||||
icon_state ="tome"
|
||||
throw_speed = 2
|
||||
throw_range = 5
|
||||
w_class = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/weapon/tome/examine(mob/user)
|
||||
..()
|
||||
@@ -34,7 +34,7 @@ This file contains the arcane tome files.
|
||||
M.reagents.add_reagent("unholywater",holy2unholy)
|
||||
add_logs(user, M, "smacked", src, " removing the holy water from them")
|
||||
return
|
||||
M.take_organ_damage(0, 15) //Used to be a random between 5 and 20
|
||||
M.take_bodypart_damage(0, 15) //Used to be a random between 5 and 20
|
||||
playsound(M, 'sound/weapons/sear.ogg', 50, 1)
|
||||
M.visible_message("<span class='danger'>[user] strikes [M] with the arcane tome!</span>", \
|
||||
"<span class='userdanger'>[user] strikes you with the tome, searing your flesh!</span>")
|
||||
@@ -67,20 +67,15 @@ This file contains the arcane tome files.
|
||||
invoking it and choosing which talisman you desire, the paper will be converted, after some delay into a talisman.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Teleport</b></font><br>This rune is unique in that it requires a keyword before the scribing can begin. When invoked, it will find any other Teleport runes; \
|
||||
If any are found, the user can choose which rune to send to. Upon activation, the rune teleports everything above it to the selected rune.<br><br>"
|
||||
If any are found, the user can choose which rune to send to. Upon activation, the rune teleports everything above it to the selected rune, provided the selected rune is unblocked.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Convert</b></font><br>This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \
|
||||
To do this, simply place the crew member upon the rune and invoke it. This rune requires one invoker to use. If the target to be converted is mindshield-implanted or a certain assignment, they will \
|
||||
be unable to be converted. People the Geometer wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.<br> \
|
||||
Successful conversions will produce a tome for the new cultist.<br><br>"
|
||||
text += "<font color='red'><b>Offer</b></font><br><b>This rune is necessary to achieve your goals.</b> Placing a noncultist above it will convert them if it can and sacrifice them otherwise. \
|
||||
It requires two invokers to convert a target and three to sacrifice a living target or the sacrifice target.<br>\
|
||||
Successful conversions will produce a tome for the new cultist, in addition to healing them.<br> \
|
||||
Successful sacrifices will please the Geometer, can complete your objective if it sacrificed the sacrifice target, and will attempt to place the target into a soulstone.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Sacrifice</b></font><br><b>This rune is necessary to achieve your goals.</b> Simply place any dead creature upon the rune and invoke it (this will not \
|
||||
target cultists!). If this creature has a mind, a soulstone will be created and the creature's soul transported to it. Sacrificing the dead can be done alone, but sacrificing living crew <b>or your cult's target</b> will require 3 cultists. \
|
||||
Soulstones used on construct shells will move that soul into a powerful construct of your choice.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Raise Dead</b></font><br>This rune requires two corpses. To perform the ritual, place the corpse you wish to revive onto \
|
||||
the rune and the offering body adjacent to it. When the rune is invoked, the body to be sacrificed will turn to dust, the life force flowing into the revival target. Assuming the target is not moved \
|
||||
within a few seconds, they will be brought back to life, healed of all ailments.<br><br>"
|
||||
text += "<font color='red'><b>Raise Dead</b></font><br>This rune requires the corpse of a cultist placed upon the rune, and one person sacrificed for each revival you wish to do.\
|
||||
Provided there are remaining revivals from those sacrificed, invoking the rune will revive the cultist placed upon it.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Electromagnetic Disruption</b></font><br>Robotic lifeforms have time and time again been the downfall of fledgling cults. This rune may allow you to gain the upper \
|
||||
hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location. The size of the EMP will grow significantly for each additional adjacent cultist when the \
|
||||
@@ -91,16 +86,18 @@ This file contains the arcane tome files.
|
||||
The body will also take constant damage while in this form, and may even die. The user's spirit will contain their consciousness, and will allow them to freely wander the station as a ghost. This may \
|
||||
also be used to commune with the dead.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Form Barrier</b></font><br>While simple, this rune serves an important purpose in defense and hindering passage. When invoked, the \
|
||||
rune will draw a small amount of life force from the user and make the space above the rune completely dense, rendering it impassable to all but the most complex means. The rune may be invoked again to \
|
||||
undo this effect and allow passage again.<br><br>"
|
||||
text += "<font color='red'><b>Form Barrier</b></font><br>While simple, this rune serves an important purpose in defense and hindering passage. When invoked, the rune will draw a small amount of blood from the user \
|
||||
and make the space above the rune completely dense, rendering it impassable for about a minute and a half. This effect will spread to other nearby Barrier Runes. \
|
||||
The rune may be invoked again to undo this effect and allow passage again.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Summon Cultist</b></font><br>This rune allows the cult to free other cultists with ease. When invoked, it will allow the user to summon a single cultist to the rune from \
|
||||
any location. It requires two invokers, and will damage each invoker slightly.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Blood Boil</b></font><br>When invoked, this rune will do a massive amount of damage to all non-cultist viewers, but it will also emit a small explosion upon invocation. \
|
||||
text += "<font color='red'><b>Blood Boil</b></font><br>When invoked, this rune will rapidly do a massive amount of damage to all non-cultist viewers, but it will also emit a burst of flame once it finishes. \
|
||||
It requires three invokers.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Drain Life</b></font><br>This rune will drain the life of every living creature above the rune, healing the invoker for each creature drained by it.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Manifest Spirit</b></font><br>This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and the Geometer. \
|
||||
However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \
|
||||
multiple spirits with one rune, but you will rapidly take damage in doing so.<br><br>"
|
||||
@@ -111,7 +108,7 @@ This file contains the arcane tome files.
|
||||
|
||||
text += "<font color='red'><b>Talisman of Teleportation</b></font><br>The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Talisman of Construction</b></font><br>This talisman is the main way of creating construct shells. To use it, one must strike 30 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to recieve a soul to occupy it.<br><br>"
|
||||
text += "<font color='red'><b>Talisman of Construction</b></font><br>This talisman is the main way of creating construct shells. To use it, one must strike 25 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to recieve a soul to occupy it.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Talisman of Tome Summoning</b></font><br>This talisman will produce a single tome at your feet.<br><br>"
|
||||
|
||||
@@ -174,15 +171,8 @@ This file contains the arcane tome files.
|
||||
var/list/shields = list()
|
||||
var/area/A = get_area(src)
|
||||
|
||||
if(locate(/obj/effect/rune) in Turf)
|
||||
user << "<span class='cult'>There is already a rune here.</span>"
|
||||
if(!check_rune_turf(Turf, user))
|
||||
return
|
||||
|
||||
if(Turf.z != ZLEVEL_STATION && Turf.z != ZLEVEL_MINING)
|
||||
user << "<span class='warning'>The veil is not weak enough here."
|
||||
return
|
||||
if(istype(A, /area/shuttle))
|
||||
user << "<span class='warning'>Interference from hyperspace engines disrupts the Geometer's power on shuttles.</span>"
|
||||
for(var/T in subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
|
||||
var/obj/effect/rune/R = T
|
||||
if(initial(R.cultist_name))
|
||||
@@ -190,10 +180,7 @@ This file contains the arcane tome files.
|
||||
if(!possible_runes.len)
|
||||
return
|
||||
entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in possible_runes
|
||||
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
|
||||
return
|
||||
if(istype(Turf, /turf/open/space))
|
||||
user << "<span class='warning'>You cannot scribe runes in space!</span>"
|
||||
if(!src || qdeleted(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user))
|
||||
return
|
||||
for(var/T in typesof(/obj/effect/rune))
|
||||
var/obj/effect/rune/R = T
|
||||
@@ -208,10 +195,8 @@ This file contains the arcane tome files.
|
||||
if(!rune_to_scribe)
|
||||
return
|
||||
Turf = get_turf(user) //we may have moved. adjust as needed...
|
||||
if(locate(/obj/effect/rune) in Turf)
|
||||
user << "<span class='cult'>There is already a rune here.</span>"
|
||||
return
|
||||
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
|
||||
A = get_area(src)
|
||||
if(!src || qdeleted(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user))
|
||||
return
|
||||
if(ispath(rune_to_scribe, /obj/effect/rune/narsie))
|
||||
if(ticker.mode.name == "cult")
|
||||
@@ -219,50 +204,69 @@ This file contains the arcane tome files.
|
||||
if(!("eldergod" in cult_mode.cult_objectives))
|
||||
user << "<span class='warning'>Nar-Sie does not wish to be summoned!</span>"
|
||||
return
|
||||
else if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
|
||||
if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
|
||||
user << "<span class='warning'>The sacrifice is not complete. The portal would lack the power to open if you tried!</span>"
|
||||
return
|
||||
else if(!cult_mode.eldergod)
|
||||
if(!cult_mode.eldergod)
|
||||
user << "<span class='cultlarge'>\"I am already here. There is no need to try to summon me now.\"</span>"
|
||||
return
|
||||
var/locname = initial(A.name)
|
||||
if(loc.z && loc.z != ZLEVEL_STATION)
|
||||
user << "<span class='warning'>The Geometer is not interested \
|
||||
in lesser locations; the station is the prize!</span>"
|
||||
if((loc.z && loc.z != ZLEVEL_STATION) || !A.blob_allowed)
|
||||
user << "<span class='warning'>The Geometer is not interested in lesser locations; the station is the prize!</span>"
|
||||
return
|
||||
var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No")
|
||||
if(confirm_final == "No")
|
||||
user << "<span class='cult'>You decide to prepare further before scribing the rune.</span>"
|
||||
return
|
||||
priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
|
||||
Turf = get_turf(user)
|
||||
A = get_area(src)
|
||||
if(!check_rune_turf(Turf, user) || (loc.z && loc.z != ZLEVEL_STATION)|| !A.blob_allowed)
|
||||
return
|
||||
priority_announce("Figments from an eldritch god are being summoned by [user] into [A.map_name] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
|
||||
for(var/B in spiral_range_turfs(1, user, 1))
|
||||
var/turf/T = B
|
||||
var/obj/machinery/shield/N = new(T)
|
||||
N.name = "sanguine barrier"
|
||||
N.desc = "A potent shield summoned by cultists to defend their rites."
|
||||
N.icon_state = "shield-red"
|
||||
N.health = 60
|
||||
shields |= N
|
||||
var/obj/structure/emergency_shield/sanguine/N = new(B)
|
||||
shields += N
|
||||
else
|
||||
user << "<span class='warning'>Nar-Sie does not wish to be summoned!</span>"
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] cuts open their arm and begins writing in their own blood!</span>", \
|
||||
"<span class='cult'>You slice open your arm and begin drawing a sigil of the Geometer.</span>")
|
||||
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm"))
|
||||
user.visible_message("<span class='warning'>[user] [user.blood_volume ? "cuts open their arm and begins writing in their own blood":"begins sketching out a strange design"]!</span>", \
|
||||
"<span class='cult'>You [user.blood_volume ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.</span>")
|
||||
if(user.blood_volume)
|
||||
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm"))
|
||||
if(!do_after(user, initial(rune_to_scribe.scribe_delay), target = get_turf(user)))
|
||||
for(var/V in shields)
|
||||
var/obj/machinery/shield/S = V
|
||||
var/obj/structure/emergency_shield/sanguine/S = V
|
||||
if(S && !qdeleted(S))
|
||||
qdel(S)
|
||||
return
|
||||
if(locate(/obj/effect/rune) in Turf)
|
||||
user << "<span class='cult'>There is already a rune here.</span>"
|
||||
if(!check_rune_turf(Turf, user))
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] creates a strange circle in their own blood.</span>", \
|
||||
user.visible_message("<span class='warning'>[user] creates a strange circle[user.blood_volume ? " in their own blood":""].</span>", \
|
||||
"<span class='cult'>You finish drawing the arcane markings of the Geometer.</span>")
|
||||
for(var/V in shields)
|
||||
var/obj/machinery/shield/S = V
|
||||
var/obj/structure/emergency_shield/S = V
|
||||
if(S && !qdeleted(S))
|
||||
qdel(S)
|
||||
new rune_to_scribe(Turf, chosen_keyword)
|
||||
user << "<span class='cult'>The [lowertext(initial(rune_to_scribe.cultist_name))] rune [initial(rune_to_scribe.cultist_desc)]</span>"
|
||||
var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword)
|
||||
user << "<span class='cult'>The [lowertext(R.cultist_name)] rune [R.cultist_desc]</span>"
|
||||
feedback_add_details("cult_runes_scribed", R.cultist_name)
|
||||
|
||||
/obj/item/weapon/tome/proc/check_rune_turf(turf/T, mob/user)
|
||||
var/area/A = get_area(T)
|
||||
|
||||
if(isspaceturf(T))
|
||||
user << "<span class='warning'>You cannot scribe runes in space!</span>"
|
||||
return FALSE
|
||||
|
||||
if(locate(/obj/effect/rune) in T)
|
||||
user << "<span class='cult'>There is already a rune here.</span>"
|
||||
return FALSE
|
||||
|
||||
if(T.z != ZLEVEL_STATION && T.z != ZLEVEL_MINING)
|
||||
user << "<span class='warning'>The veil is not weak enough here."
|
||||
return FALSE
|
||||
|
||||
if(istype(A, /area/shuttle))
|
||||
user << "<span class='warning'>Interference from hyperspace engines disrupts the Geometer's power on shuttles.</span>"
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
+374
-274
@@ -1,4 +1,4 @@
|
||||
/var/list/sacrificed = list()
|
||||
/var/list/sacrificed = list() //a mixed list of minds and mobs
|
||||
var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
|
||||
|
||||
/*
|
||||
@@ -21,12 +21,13 @@ To draw a rune, use an arcane tome.
|
||||
anchored = 1
|
||||
icon = 'icons/obj/rune.dmi'
|
||||
icon_state = "1"
|
||||
unacidable = 1
|
||||
layer = ABOVE_NORMAL_TURF_LAYER
|
||||
color = rgb(255,0,0)
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
layer = LOW_OBJ_LAYER
|
||||
color = "#FF0000"
|
||||
|
||||
var/invocation = "Aiy ele-mayo!" //This is said by cultists when the rune is invoked.
|
||||
var/req_cultists = 1 //The amount of cultists required around the rune to invoke it. If only 1, any cultist can invoke it.
|
||||
var/req_cultists_text //if we have a description override for required cultists to invoke
|
||||
var/rune_in_use = 0 // Used for some runes, this is for when you want a rune to not be usable when in use.
|
||||
|
||||
var/scribe_delay = 50 //how long the rune takes to create
|
||||
@@ -48,7 +49,7 @@ To draw a rune, use an arcane tome.
|
||||
if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects
|
||||
user << "<b>Name:</b> [cultist_name]"
|
||||
user << "<b>Effects:</b> [capitalize(cultist_desc)]"
|
||||
user << "<b>Required Acolytes:</b> [req_cultists]"
|
||||
user << "<b>Required Acolytes:</b> [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]"
|
||||
if(req_keyword && keyword)
|
||||
user << "<b>Keyword:</b> [keyword]"
|
||||
|
||||
@@ -106,8 +107,8 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
var/list/invokers = list() //people eligible to invoke the rune
|
||||
var/list/chanters = list() //people who will actually chant the rune when passed to invoke()
|
||||
if(user)
|
||||
chanters |= user
|
||||
invokers |= user
|
||||
chanters += user
|
||||
invokers += user
|
||||
if(req_cultists > 1 || allow_excess_invokers)
|
||||
for(var/mob/living/L in range(1, src))
|
||||
if(iscultist(L))
|
||||
@@ -119,16 +120,17 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
continue
|
||||
if(L.stat)
|
||||
continue
|
||||
invokers |= L
|
||||
invokers += L
|
||||
if(invokers.len >= req_cultists)
|
||||
invokers -= user
|
||||
if(allow_excess_invokers)
|
||||
chanters |= invokers
|
||||
chanters += invokers
|
||||
else
|
||||
invokers -= user
|
||||
shuffle(invokers)
|
||||
for(var/i in 0 to req_cultists)
|
||||
for(var/i in 1 to req_cultists)
|
||||
var/L = pick_n_take(invokers)
|
||||
chanters |= L
|
||||
if(L)
|
||||
chanters += L
|
||||
return chanters
|
||||
|
||||
/obj/effect/rune/proc/invoke(var/list/invokers)
|
||||
@@ -137,6 +139,9 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
L.say(invocation)
|
||||
do_invoke_glow()
|
||||
|
||||
/obj/effect/rune/proc/do_invoke_glow()
|
||||
var/oldtransform = transform
|
||||
spawn(0) //animate is a delay, we want to avoid being delayed
|
||||
animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out
|
||||
@@ -147,8 +152,10 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
visible_message("<span class='warning'>The markings pulse with a \
|
||||
small flash of red light, then fall dark.</span>")
|
||||
spawn(0) //animate is a delay, we want to avoid being delayed
|
||||
animate(src, color = rgb(255, 0, 0), time = 0)
|
||||
animate(src, color = initial(color), time = 5)
|
||||
var/oldcolor = color
|
||||
color = rgb(255, 0, 0)
|
||||
animate(src, color = oldcolor, time = 5)
|
||||
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5)
|
||||
|
||||
//Malformed Rune: This forms if a rune is not drawn correctly. Invoking it does nothing but hurt the user.
|
||||
/obj/effect/rune/malformed
|
||||
@@ -158,7 +165,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
|
||||
/obj/effect/rune/malformed/New()
|
||||
..()
|
||||
icon_state = "[rand(1,6)]"
|
||||
icon_state = "[rand(1,7)]"
|
||||
color = rgb(rand(0,255), rand(0,255), rand(0,255))
|
||||
|
||||
/obj/effect/rune/malformed/invoke(var/list/invokers)
|
||||
@@ -175,13 +182,19 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
return N
|
||||
return 0
|
||||
|
||||
/mob/proc/bible_check() //The bible, if held, might protect against certain things
|
||||
var/obj/item/weapon/storage/book/bible/B = locate() in src
|
||||
if(is_holding(B))
|
||||
return B
|
||||
return 0
|
||||
|
||||
//Rite of Binding: A paper on top of the rune to a talisman.
|
||||
/obj/effect/rune/imbue
|
||||
cultist_name = "Create Talisman"
|
||||
cultist_desc = "transforms paper into powerful magic talismans."
|
||||
invocation = "H'drak v'loso, mir'kanas verbot!"
|
||||
icon_state = "3"
|
||||
color = rgb(0, 0, 255)
|
||||
color = "#0000FF"
|
||||
|
||||
/obj/effect/rune/imbue/invoke(var/list/invokers)
|
||||
var/mob/living/user = invokers[1] //the first invoker is always the user
|
||||
@@ -258,18 +271,10 @@ var/list/teleport_runes = list()
|
||||
var/mob/living/user = invokers[1] //the first invoker is always the user
|
||||
var/list/potential_runes = list()
|
||||
var/list/teleportnames = list()
|
||||
var/list/duplicaterunecount = list()
|
||||
for(var/R in teleport_runes)
|
||||
var/obj/effect/rune/teleport/T = R
|
||||
var/resultkey = T.listkey
|
||||
if(resultkey in teleportnames)
|
||||
duplicaterunecount[resultkey]++
|
||||
resultkey = "[resultkey] ([duplicaterunecount[resultkey]])"
|
||||
else
|
||||
teleportnames.Add(resultkey)
|
||||
duplicaterunecount[resultkey] = 1
|
||||
if(T != src && (T.z <= ZLEVEL_SPACEMAX))
|
||||
potential_runes[resultkey] = T
|
||||
potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
|
||||
|
||||
if(!potential_runes.len)
|
||||
user << "<span class='warning'>There are no valid runes to teleport to!</span>"
|
||||
@@ -290,6 +295,11 @@ var/list/teleport_runes = list()
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/target = get_turf(actual_selected_rune)
|
||||
if(is_blocked_turf(target, TRUE))
|
||||
user << "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>"
|
||||
fail_invoke()
|
||||
return
|
||||
var/movedsomething = 0
|
||||
var/moveuserlater = 0
|
||||
for(var/atom/movable/A in T)
|
||||
@@ -299,158 +309,136 @@ var/list/teleport_runes = list()
|
||||
continue
|
||||
if(!A.anchored)
|
||||
movedsomething = 1
|
||||
A.forceMove(get_turf(actual_selected_rune))
|
||||
A.forceMove(target)
|
||||
if(movedsomething)
|
||||
..()
|
||||
visible_message("<span class='warning'>There is a sharp crack of inrushing air, and everything above the rune disappears!</span>")
|
||||
user << "<span class='cult'>You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].</span>"
|
||||
if(moveuserlater)
|
||||
user.forceMove(get_turf(actual_selected_rune))
|
||||
user.forceMove(target)
|
||||
else
|
||||
fail_invoke()
|
||||
|
||||
|
||||
//Rite of Enlightenment: Converts a normal crewmember to the cult.
|
||||
//Rite of Offering: Converts or sacrifices a target.
|
||||
/obj/effect/rune/convert
|
||||
cultist_name = "Convert"
|
||||
cultist_desc = "converts a normal crewmember on top of it to the cult. Does not work on mindshield-implanted crew."
|
||||
cultist_name = "Offer"
|
||||
cultist_desc = "offers a noncultist above it to Nar-Sie, either converting them or sacrificing them."
|
||||
req_cultists_text = "2 for conversion, 3 for living sacrifices and sacrifice targets."
|
||||
invocation = "Mah'weyh pleggh at e'ntrath!"
|
||||
icon_state = "3"
|
||||
color = rgb(200, 0, 0)
|
||||
color = "#FFFFFF"
|
||||
req_cultists = 1
|
||||
allow_excess_invokers = 1
|
||||
rune_in_use = FALSE
|
||||
|
||||
/obj/effect/rune/convert/do_invoke_glow()
|
||||
return
|
||||
|
||||
/obj/effect/rune/convert/invoke(var/list/invokers)
|
||||
var/list/convertees = list()
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/mob/living/M in T)
|
||||
if(M.stat != DEAD && !iscultist(M) && is_convertable_to_cult(M.mind))
|
||||
convertees |= M
|
||||
else if(is_sacrifice_target(M.mind))
|
||||
for(var/C in invokers)
|
||||
C << "<span class='cultlarge'>\"I desire this one for myself. <i>SACRIFICE THEM!</i>\"</span>"
|
||||
else if(is_servant_of_ratvar(M))
|
||||
M.visible_message("<span class='warning'>[M]'s eyes glow a defiant yellow!</span>", \
|
||||
"<span class='cultlarge'>\"Stop resisting. You <i>will</i> be mi-\"</span> <span class='large_brass'>\"Give up and you will feel pain unlike anything you've ever felt!\"</span>")
|
||||
M.Weaken(4)
|
||||
if(!convertees.len)
|
||||
fail_invoke()
|
||||
log_game("Convert rune failed - no eligible convertees")
|
||||
return
|
||||
var/mob/living/new_cultist = pick(convertees)
|
||||
if(new_cultist.null_rod_check())
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Something is shielding [new_cultist]'s mind!</span>"
|
||||
fail_invoke()
|
||||
log_game("Convert rune failed - convertee had null rod")
|
||||
return
|
||||
..()
|
||||
new_cultist.visible_message("<span class='warning'>[new_cultist] writhes in pain as the markings below them glow a bloody red!</span>", \
|
||||
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
|
||||
ticker.mode.add_cultist(new_cultist.mind, 1)
|
||||
new /obj/item/weapon/tome(get_turf(src))
|
||||
new_cultist.mind.special_role = "Cultist"
|
||||
new_cultist << "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
|
||||
and something evil takes root.</b></span>"
|
||||
new_cultist << "<span class='cultitalic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
|
||||
</b></span>"
|
||||
|
||||
//Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body.
|
||||
/obj/effect/rune/sacrifice
|
||||
cultist_name = "Sacrifice"
|
||||
cultist_desc = "sacrifices a crew member to the Geometer. May place them into a soul shard if their spirit remains in their body."
|
||||
icon_state = "3"
|
||||
allow_excess_invokers = 1
|
||||
invocation = "Barhah hra zar'garis!"
|
||||
color = rgb(255, 255, 255)
|
||||
rune_in_use = 0
|
||||
|
||||
/obj/effect/rune/sacrifice/New()
|
||||
..()
|
||||
icon_state = "[rand(1,6)]"
|
||||
|
||||
/obj/effect/rune/sacrifice/invoke(var/list/invokers)
|
||||
if(rune_in_use)
|
||||
return
|
||||
rune_in_use = 1
|
||||
var/mob/living/user = invokers[1] //the first invoker is always the user
|
||||
var/list/myriad_targets = list()
|
||||
var/turf/T = get_turf(src)
|
||||
var/list/possible_targets = list()
|
||||
for(var/mob/living/M in T.contents)
|
||||
if(M.mind)
|
||||
if(M.mind in sacrificed)
|
||||
continue
|
||||
for(var/mob/living/M in T)
|
||||
if(!iscultist(M))
|
||||
possible_targets.Add(M)
|
||||
var/mob/offering
|
||||
if(possible_targets.len > 1) //If there's more than one target, allow choice
|
||||
offering = input(user, "Choose an offering to sacrifice.", "Unholy Tribute") as null|anything in possible_targets
|
||||
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
|
||||
return
|
||||
else if(possible_targets.len) //Otherwise, if there's a target at all, pick the only one
|
||||
offering = possible_targets[possible_targets.len]
|
||||
if(!offering)
|
||||
rune_in_use = 0
|
||||
return
|
||||
/*var/obj/item/weapon/nullrod/N = offering.null_rod_check()
|
||||
if(N)
|
||||
user << "<span class='warning'>Something is blocking the Geometer's magic!</span>"
|
||||
log_game("Sacrifice rune failed - target has \a [N]!")
|
||||
myriad_targets |= M
|
||||
if(!myriad_targets.len)
|
||||
fail_invoke()
|
||||
rune_in_use = 0
|
||||
return*/
|
||||
if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD) || is_sacrifice_target(offering.mind)) //Requires three people to sacrifice living targets
|
||||
if(invokers.len < 3)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='cultitalic'>[offering] is too greatly linked to the world! You need three acolytes!</span>"
|
||||
fail_invoke()
|
||||
log_game("Sacrifice rune failed - not enough acolytes and target is living")
|
||||
rune_in_use = 0
|
||||
return
|
||||
log_game("Offer rune failed - no eligible targets")
|
||||
return
|
||||
rune_in_use = TRUE
|
||||
visible_message("<span class='warning'>[src] pulses blood red!</span>")
|
||||
color = rgb(126, 23, 23)
|
||||
..()
|
||||
sac(invokers, offering)
|
||||
color = initial(color)
|
||||
var/oldcolor = color
|
||||
color = "#7D1717"
|
||||
var/mob/living/L = pick(myriad_targets)
|
||||
var/is_clock = is_servant_of_ratvar(L)
|
||||
var/is_convertable = is_convertable_to_cult(L)
|
||||
if(L.stat != DEAD && (is_clock || is_convertable))
|
||||
invocation = "Mah'weyh pleggh at e'ntrath!"
|
||||
..()
|
||||
if(is_clock)
|
||||
L.visible_message("<span class='warning'>[L]'s eyes glow a defiant yellow!</span>", \
|
||||
"<span class='cultlarge'>\"Stop resisting. You <i>will</i> be mi-\"</span>\n\
|
||||
<span class='large_brass'>\"Give up and you will feel pain unlike anything you've ever felt!\"</span>")
|
||||
L.Weaken(4)
|
||||
else if(is_convertable)
|
||||
do_convert(L, invokers)
|
||||
else
|
||||
invocation = "Barhah hra zar'garis!"
|
||||
..()
|
||||
do_sacrifice(L, invokers)
|
||||
animate(src, color = oldcolor, time = 5)
|
||||
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5)
|
||||
rune_in_use = FALSE
|
||||
|
||||
/obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T)
|
||||
var/sacrifice_fulfilled
|
||||
if(T)
|
||||
if(istype(T, /mob/living/simple_animal/pet/dog))
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
L << "<span class='cultlarge'>\"Even I have standards, such as they are!\"</span>"
|
||||
if(L.reagents)
|
||||
L.reagents.add_reagent("hell_water", 2)
|
||||
if(T.mind)
|
||||
sacrificed.Add(T.mind)
|
||||
if(is_sacrifice_target(T.mind))
|
||||
sacrifice_fulfilled = 1
|
||||
PoolOrNew(/obj/effect/overlay/temp/cult/sac, src.loc)
|
||||
/obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers)
|
||||
if(invokers.len < 2)
|
||||
for(var/M in invokers)
|
||||
if(sacrifice_fulfilled)
|
||||
M << "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>"
|
||||
else
|
||||
if(ishuman(T) || isrobot(T))
|
||||
M << "<span class='cultlarge'>\"I accept this sacrifice.\"</span>"
|
||||
else
|
||||
M << "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>"
|
||||
if(T.mind)
|
||||
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
|
||||
stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
|
||||
if(!stone.transfer_soul("FORCE", T, usr)) //If it cannot be added
|
||||
qdel(stone)
|
||||
if(stone)
|
||||
stone.invisibility = 0
|
||||
if(!T)
|
||||
rune_in_use = 0
|
||||
return
|
||||
if(isrobot(T))
|
||||
playsound(T, 'sound/magic/Disable_Tech.ogg', 100, 1)
|
||||
T.dust() //To prevent the MMI from remaining
|
||||
M << "<span class='warning'>You need more invokers to convert [convertee]!</span>"
|
||||
log_game("Offer rune failed - tried conversion with one invoker")
|
||||
return 0
|
||||
if(convertee.null_rod_check())
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Something is shielding [convertee]'s mind!</span>"
|
||||
log_game("Offer rune failed - convertee had null rod")
|
||||
return 0
|
||||
var/brutedamage = convertee.getBruteLoss()
|
||||
var/burndamage = convertee.getFireLoss()
|
||||
if(brutedamage || burndamage)
|
||||
convertee.adjustBruteLoss(-(brutedamage * 0.75))
|
||||
convertee.adjustFireLoss(-(burndamage * 0.75))
|
||||
convertee.visible_message("<span class='warning'>[convertee] writhes in pain \
|
||||
[brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!</span>", \
|
||||
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
|
||||
ticker.mode.add_cultist(convertee.mind, 1)
|
||||
new /obj/item/weapon/tome(get_turf(src))
|
||||
convertee.mind.special_role = "Cultist"
|
||||
convertee << "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
|
||||
and something evil takes root.</b></span>"
|
||||
convertee << "<span class='cultitalic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
|
||||
</b></span>"
|
||||
return 1
|
||||
|
||||
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
|
||||
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='cultitalic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>"
|
||||
log_game("Offer rune failed - not enough acolytes and target is living or sac target")
|
||||
return FALSE
|
||||
var/sacrifice_fulfilled = FALSE
|
||||
|
||||
if(sacrificial.mind)
|
||||
sacrificed += sacrificial.mind
|
||||
if(is_sacrifice_target(sacrificial.mind))
|
||||
sacrifice_fulfilled = TRUE
|
||||
else
|
||||
sacrificed += sacrificial
|
||||
|
||||
new /obj/effect/overlay/temp/cult/sac(get_turf(src))
|
||||
for(var/M in invokers)
|
||||
if(sacrifice_fulfilled)
|
||||
M << "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>"
|
||||
else
|
||||
playsound(T, 'sound/magic/Disintegrate.ogg', 100, 1)
|
||||
T.gib()
|
||||
rune_in_use = 0
|
||||
if(ishuman(sacrificial) || iscyborg(sacrificial))
|
||||
M << "<span class='cultlarge'>\"I accept this sacrifice.\"</span>"
|
||||
else
|
||||
M << "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>"
|
||||
|
||||
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
|
||||
if(sacrificial.mind)
|
||||
stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
|
||||
stone.transfer_soul("FORCE", sacrificial, usr)
|
||||
stone.invisibility = 0
|
||||
|
||||
if(sacrificial)
|
||||
if(iscyborg(sacrificial))
|
||||
playsound(sacrificial, 'sound/magic/Disable_Tech.ogg', 100, 1)
|
||||
sacrificial.dust() //To prevent the MMI from remaining
|
||||
else
|
||||
playsound(sacrificial, 'sound/magic/Disintegrate.ogg', 100, 1)
|
||||
sacrificial.gib()
|
||||
return TRUE
|
||||
|
||||
//Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station.
|
||||
/obj/effect/rune/narsie
|
||||
@@ -459,13 +447,14 @@ var/list/teleport_runes = list()
|
||||
invocation = "TOK-LYR RQA-NAP G'OLT-ULOFT!!"
|
||||
req_cultists = 9
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
color = rgb(125,23,23)
|
||||
color = "#7D1717"
|
||||
icon_state = "rune_large"
|
||||
pixel_x = -32 //So the big ol' 96x96 sprite shows up right
|
||||
pixel_y = -32
|
||||
scribe_delay = 450 //how long the rune takes to create
|
||||
scribe_damage = 40.1 //how much damage you take doing it
|
||||
var/used
|
||||
var/ignore_gamemode = FALSE
|
||||
|
||||
/obj/effect/rune/narsie/New()
|
||||
. = ..()
|
||||
@@ -483,28 +472,35 @@ var/list/teleport_runes = list()
|
||||
return
|
||||
if(z != ZLEVEL_STATION)
|
||||
return
|
||||
|
||||
var/datum/game_mode/cult/cult_mode
|
||||
|
||||
if(ticker.mode.name == "cult")
|
||||
var/datum/game_mode/cult/cult_mode = ticker.mode
|
||||
if(!cult_mode.eldergod)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Nar-Sie is already on this plane!</span>"
|
||||
log_game("Summon Nar-Sie rune failed - already summoned")
|
||||
return
|
||||
//BEGIN THE SUMMONING
|
||||
used = 1
|
||||
..()
|
||||
world << 'sound/effects/dimensional_rend.ogg' //There used to be a message for this but every time it was changed it got edgier so I removed it
|
||||
var/turf/T = get_turf(src)
|
||||
sleep(40)
|
||||
if(src)
|
||||
color = rgb(255, 0, 0)
|
||||
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
|
||||
cult_mode.eldergod = 0
|
||||
else
|
||||
cult_mode = ticker.mode
|
||||
|
||||
if(!cult_mode && !ignore_gamemode)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Nar-Sie does not respond!</span>"
|
||||
fail_invoke()
|
||||
log_game("Summon Nar-Sie rune failed - gametype is not cult")
|
||||
return
|
||||
|
||||
if(locate(/obj/singularity/narsie) in poi_list)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Nar-Sie is already on this plane!</span>"
|
||||
log_game("Summon Nar-Sie rune failed - already summoned")
|
||||
return
|
||||
//BEGIN THE SUMMONING
|
||||
used = 1
|
||||
..()
|
||||
send_to_playing_players('sound/effects/dimensional_rend.ogg') //There used to be a message for this but every time it was changed it got edgier so I removed it
|
||||
var/turf/T = get_turf(src)
|
||||
sleep(40)
|
||||
if(src)
|
||||
color = "#FF0000"
|
||||
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
|
||||
if(cult_mode)
|
||||
cult_mode.eldergod = 0
|
||||
|
||||
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
|
||||
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
|
||||
@@ -521,46 +517,47 @@ var/list/teleport_runes = list()
|
||||
..()
|
||||
return
|
||||
|
||||
//Rite of Resurrection: Requires two corpses. Revives one and gibs the other.
|
||||
//Rite of Resurrection: Requires the corpse of a cultist and that there have been less revives than the number of people sacrificed
|
||||
/obj/effect/rune/raise_dead
|
||||
cultist_name = "Raise Dead"
|
||||
cultist_desc = "requires two corpses, one on the rune and one adjacent to the rune. The one on the rune is brought to life, the other is turned to ash."
|
||||
cultist_desc = "requires the corpse of a cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be revived."
|
||||
invocation = null //Depends on the name of the user - see below
|
||||
icon_state = "1"
|
||||
color = rgb(200, 0, 0)
|
||||
color = "#C80000"
|
||||
var/static/revives_used = 0
|
||||
|
||||
/obj/effect/rune/raise_dead/examine(mob/user)
|
||||
..()
|
||||
if(iscultist(user) || user.stat == DEAD)
|
||||
var/revive_number = 0
|
||||
if(sacrificed.len)
|
||||
revive_number = sacrificed.len - revives_used
|
||||
user << "<b>Revives Remaining:</b> [revive_number]"
|
||||
|
||||
/obj/effect/rune/raise_dead/invoke(var/list/invokers)
|
||||
var/turf/T = get_turf(src)
|
||||
var/mob/living/mob_to_sacrifice
|
||||
var/mob/living/mob_to_revive
|
||||
var/list/potential_sacrifice_mobs = list()
|
||||
var/list/potential_revive_mobs = list()
|
||||
var/mob/living/user = invokers[1]
|
||||
if(rune_in_use)
|
||||
return
|
||||
for(var/mob/living/M in orange(1,T))
|
||||
if(M.stat == DEAD && !iscultist(M))
|
||||
potential_sacrifice_mobs |= M
|
||||
if(!potential_sacrifice_mobs.len)
|
||||
user << "<span class='cultitalic'>There are no eligible sacrifices nearby!</span>"
|
||||
log_game("Raise Dead rune failed - no catalyst corpses")
|
||||
fail_invoke()
|
||||
return
|
||||
for(var/mob/living/M in T.contents)
|
||||
if(M.stat == DEAD)
|
||||
if(iscultist(M) && M.stat == DEAD)
|
||||
potential_revive_mobs |= M
|
||||
if(!potential_revive_mobs.len)
|
||||
user << "<span class='cultitalic'>There is no eligible revival target on the rune!</span>"
|
||||
user << "<span class='cultitalic'>There are no dead cultists on the rune!</span>"
|
||||
log_game("Raise Dead rune failed - no corpses to revive")
|
||||
fail_invoke()
|
||||
return
|
||||
mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs
|
||||
if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, 1))
|
||||
if(!sacrificed.len || sacrificed.len <= revives_used)
|
||||
user << "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>"
|
||||
fail_invoke()
|
||||
return
|
||||
mob_to_revive = input(user, "Choose a corpse to revive.", "Corpse to Revive") as null|anything in potential_revive_mobs
|
||||
if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, 1))
|
||||
return
|
||||
if(!validness_checks(mob_to_revive, user, 0))
|
||||
if(potential_revive_mobs.len > 1)
|
||||
mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs
|
||||
else
|
||||
mob_to_revive = potential_revive_mobs[1]
|
||||
if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_revive, user))
|
||||
return
|
||||
rune_in_use = 1
|
||||
if(user.name == "Herbert West")
|
||||
@@ -568,27 +565,15 @@ var/list/teleport_runes = list()
|
||||
else
|
||||
user.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
|
||||
..()
|
||||
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice]'s body rises into the air, connected to [mob_to_revive] by a glowing tendril!</span>")
|
||||
mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=20)
|
||||
sleep(20)
|
||||
if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src))
|
||||
rune_in_use = 0
|
||||
return
|
||||
if(!mob_to_revive || mob_to_revive.stat != DEAD)
|
||||
visible_message("<span class='warning'>The glowing tendril snaps against the rune with a shocking crack.</span>")
|
||||
rune_in_use = 0
|
||||
fail_invoke()
|
||||
return
|
||||
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice] disintegrates into a pile of bones.</span>")
|
||||
mob_to_sacrifice.dust()
|
||||
revives_used++
|
||||
mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it!
|
||||
mob_to_revive.grab_ghost()
|
||||
mob_to_revive << "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>"
|
||||
mob_to_revive.visible_message("<span class='warning'>[mob_to_revive] draws in a huge breath, red light shining from their eyes.</span>", \
|
||||
mob_to_revive.visible_message("<span class='warning'>[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.</span>", \
|
||||
"<span class='cultlarge'>You awaken suddenly from the void. You're alive!</span>")
|
||||
rune_in_use = 0
|
||||
|
||||
/obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user, saccing)
|
||||
/obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!user)
|
||||
return 0
|
||||
@@ -597,28 +582,28 @@ var/list/teleport_runes = list()
|
||||
if(!target_mob)
|
||||
fail_invoke()
|
||||
return 0
|
||||
if(saccing)
|
||||
if(!in_range(target_mob, src))
|
||||
user << "<span class='cultitalic'>The sacrificial target has been moved!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - catalyst corpse moved")
|
||||
return 0
|
||||
if(target_mob.stat != DEAD)
|
||||
user << "<span class='cultitalic'>The sacrificial target must be dead!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - catalyst corpse is not dead")
|
||||
return 0
|
||||
else if(!(target_mob in T.contents))
|
||||
user << "<span class='cultitalic'>The corpse to revive has been moved!</span>"
|
||||
if(!(target_mob in T.contents))
|
||||
user << "<span class='cultitalic'>The cultist to revive has been moved!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - revival target moved")
|
||||
return 0
|
||||
var/mob/dead/observer/ghost = target_mob.get_ghost(TRUE)
|
||||
if(!ghost && (!target_mob.mind || !target_mob.mind.active))
|
||||
user << "<span class='cultitalic'>The corpse to revive has no spirit!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - revival target has no ghost")
|
||||
return 0
|
||||
if(!sacrificed.len || sacrificed.len <= revives_used)
|
||||
user << "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - too few sacrificed")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/effect/rune/raise_dead/fail_invoke()
|
||||
..()
|
||||
for(var/mob/living/M in range(1,src))
|
||||
if(M.stat == DEAD)
|
||||
if(iscultist(M) && M.stat == DEAD)
|
||||
M.visible_message("<span class='warning'>[M] twitches.</span>")
|
||||
|
||||
|
||||
@@ -629,7 +614,7 @@ var/list/teleport_runes = list()
|
||||
invocation = "Ta'gh fara'qha fel d'amar det!"
|
||||
icon_state = "5"
|
||||
allow_excess_invokers = 1
|
||||
color = rgb(77, 148, 255)
|
||||
color = "#4D94FF"
|
||||
|
||||
/obj/effect/rune/emp/invoke(var/list/invokers)
|
||||
var/turf/E = get_turf(src)
|
||||
@@ -658,8 +643,8 @@ var/list/teleport_runes = list()
|
||||
cultist_name = "Astral Communion"
|
||||
cultist_desc = "severs the link between one's spirit and body. This effect is taxing and one's physical body will take damage while this is active."
|
||||
invocation = "Fwe'sh mah erl nyag r'ya!"
|
||||
icon_state = "6"
|
||||
color = rgb(126, 23, 23)
|
||||
icon_state = "7"
|
||||
color = "#7D1717"
|
||||
rune_in_use = 0 //One at a time, please!
|
||||
construct_invoke = 0
|
||||
var/mob/living/affecting = null
|
||||
@@ -675,7 +660,7 @@ var/list/teleport_runes = list()
|
||||
log_game("Astral Communion rune failed - more than one user")
|
||||
return list()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!user in T.contents)
|
||||
if(!(user in T))
|
||||
user << "<span class='cultitalic'>You must be standing on top of [src]!</span>"
|
||||
log_game("Astral Communion rune failed - user not standing on rune")
|
||||
return list()
|
||||
@@ -687,7 +672,7 @@ var/list/teleport_runes = list()
|
||||
var/turf/T = get_turf(src)
|
||||
rune_in_use = 1
|
||||
affecting = user
|
||||
user.color = "#7e1717"
|
||||
user.color = "#7D1717"
|
||||
user.visible_message("<span class='warning'>[user] freezes statue-still, glowing an unearthly red.</span>", \
|
||||
"<span class='cult'>You see what lies beyond. All is revealed. While this is a wondrous experience, your physical form will waste away in this state. Hurry...</span>")
|
||||
user.ghostize(1)
|
||||
@@ -697,13 +682,13 @@ var/list/teleport_runes = list()
|
||||
affecting = null //In case it's assigned to a number or something
|
||||
rune_in_use = 0
|
||||
return
|
||||
affecting.apply_damage(1, BRUTE)
|
||||
if(!(user in T.contents))
|
||||
user.visible_message("<span class='warning'>A spectral tendril wraps around [user] and pulls them back to the rune!</span>")
|
||||
Beam(user,icon_state="drainbeam",icon='icons/effects/effects.dmi',time=2)
|
||||
affecting.apply_damage(0.1, BRUTE)
|
||||
if(!(user in T))
|
||||
user.visible_message("<span class='warning'>A spectral tendril wraps around [user] and pulls [user.p_them()] back to the rune!</span>")
|
||||
Beam(user,icon_state="drainbeam",time=2)
|
||||
user.forceMove(get_turf(src)) //NO ESCAPE :^)
|
||||
if(user.key)
|
||||
user.visible_message("<span class='warning'>[user] slowly relaxes, the glow around them dimming.</span>", \
|
||||
user.visible_message("<span class='warning'>[user] slowly relaxes, the glow around [user.p_them()] dimming.</span>", \
|
||||
"<span class='danger'>You are re-united with your physical form. [src] releases its hold over you.</span>")
|
||||
user.color = initial(user.color)
|
||||
user.Weaken(3)
|
||||
@@ -711,53 +696,101 @@ var/list/teleport_runes = list()
|
||||
affecting = null
|
||||
return
|
||||
if(user.stat == UNCONSCIOUS)
|
||||
if(prob(10))
|
||||
if(prob(1))
|
||||
var/mob/dead/observer/G = user.get_ghost()
|
||||
if(G)
|
||||
G << "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>"
|
||||
G << "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>"
|
||||
if(user.stat == DEAD)
|
||||
user.color = initial(user.color)
|
||||
rune_in_use = 0
|
||||
affecting = null
|
||||
var/mob/dead/observer/G = user.get_ghost()
|
||||
if(G)
|
||||
G << "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>"
|
||||
G << "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>"
|
||||
return
|
||||
sleep(10)
|
||||
sleep(1)
|
||||
rune_in_use = 0
|
||||
|
||||
|
||||
var/list/wall_runes = list()
|
||||
//Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo.
|
||||
/obj/effect/rune/wall
|
||||
cultist_name = "Form Barrier"
|
||||
cultist_desc = "when invoked, makes an invisible wall to block passage. Can be invoked again to reverse this."
|
||||
cultist_desc = "when invoked, makes a temporary invisible wall to block passage. Can be invoked again to reverse this."
|
||||
invocation = "Khari'd! Eske'te tannin!"
|
||||
icon_state = "1"
|
||||
color = rgb(255, 0, 0)
|
||||
color = "#C80000"
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
var/density_timer
|
||||
var/recharging = FALSE
|
||||
|
||||
/obj/effect/rune/wall/New()
|
||||
..()
|
||||
wall_runes += src
|
||||
|
||||
/obj/effect/rune/wall/examine(mob/user)
|
||||
..()
|
||||
if(density)
|
||||
user << "<span class='cultitalic'>There is a barely perceptible shimmering of the air above [src].</span>"
|
||||
|
||||
/obj/effect/rune/wall/Destroy()
|
||||
density = 0
|
||||
wall_runes -= src
|
||||
air_update_turf(1)
|
||||
return ..()
|
||||
|
||||
/obj/effect/rune/wall/BlockSuperconductivity()
|
||||
return density
|
||||
|
||||
/obj/effect/rune/wall/invoke(var/list/invokers)
|
||||
if(recharging)
|
||||
return
|
||||
var/mob/living/user = invokers[1]
|
||||
..()
|
||||
density = !density
|
||||
user.visible_message("<span class='warning'>[user] [iscarbon(user) ? "places their hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
|
||||
"<span class='cultitalic'>You channel your life energy into [src], [density ? "preventing" : "allowing"] passage above it.</span>")
|
||||
update_state()
|
||||
if(density)
|
||||
spread_density()
|
||||
user.visible_message("<span class='warning'>[user] [iscarbon(user) ? "places [user.p_their()] hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
|
||||
"<span class='cultitalic'>You channel your life energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.apply_damage(2, BRUTE, pick("l_arm", "r_arm"))
|
||||
|
||||
/obj/effect/rune/wall/proc/spread_density()
|
||||
for(var/R in wall_runes)
|
||||
var/obj/effect/rune/wall/W = R
|
||||
if(W.z == z && get_dist(src, W) <= 2 && !W.density && !W.recharging)
|
||||
W.density = TRUE
|
||||
W.update_state()
|
||||
W.spread_density()
|
||||
density_timer = addtimer(CALLBACK(src, .proc/lose_density), 900, TIMER_STOPPABLE)
|
||||
|
||||
/obj/effect/rune/wall/proc/lose_density()
|
||||
if(density)
|
||||
recharging = TRUE
|
||||
density = FALSE
|
||||
update_state()
|
||||
var/oldcolor = color
|
||||
add_atom_colour("#696969", FIXED_COLOUR_PRIORITY)
|
||||
animate(src, color = oldcolor, time = 50, easing = EASE_IN)
|
||||
addtimer(CALLBACK(src, .proc/recharge), 50)
|
||||
|
||||
/obj/effect/rune/wall/proc/recharge()
|
||||
recharging = FALSE
|
||||
add_atom_colour("#C80000", FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/obj/effect/rune/wall/proc/update_state()
|
||||
deltimer(density_timer)
|
||||
air_update_turf(1)
|
||||
if(density)
|
||||
var/image/I = image(layer = ABOVE_MOB_LAYER, icon = 'icons/effects/effects.dmi', icon_state = "barriershimmer")
|
||||
I.appearance_flags = RESET_COLOR
|
||||
I.alpha = 60
|
||||
I.color = "#701414"
|
||||
overlays += I
|
||||
add_overlay(I)
|
||||
add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY)
|
||||
else
|
||||
overlays.Cut()
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.apply_damage(2, BRUTE, pick("l_arm", "r_arm"))
|
||||
|
||||
cut_overlays()
|
||||
add_atom_colour("#C80000", FIXED_COLOUR_PRIORITY)
|
||||
|
||||
//Rite of Joined Souls: Summons a single cultist.
|
||||
/obj/effect/rune/summon
|
||||
@@ -767,7 +800,7 @@ var/list/teleport_runes = list()
|
||||
req_cultists = 2
|
||||
allow_excess_invokers = 1
|
||||
icon_state = "5"
|
||||
color = rgb(0, 255, 0)
|
||||
color = "#00FF00"
|
||||
|
||||
/obj/effect/rune/summon/invoke(var/list/invokers)
|
||||
var/mob/living/user = invokers[1]
|
||||
@@ -809,35 +842,105 @@ var/list/teleport_runes = list()
|
||||
//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
|
||||
/obj/effect/rune/blood_boil
|
||||
cultist_name = "Boil Blood"
|
||||
cultist_desc = "boils the blood of non-believers who can see the rune, dealing extreme amounts of damage. Requires 3 invokers."
|
||||
cultist_desc = "boils the blood of non-believers who can see the rune, rapidly dealing extreme amounts of damage. Requires 3 invokers."
|
||||
invocation = "Dedo ol'btoh!"
|
||||
icon_state = "4"
|
||||
color = rgb(200, 0, 0)
|
||||
color = "#C80000"
|
||||
req_cultists = 3
|
||||
construct_invoke = 0
|
||||
var/tick_damage = 25
|
||||
rune_in_use = FALSE
|
||||
|
||||
/obj/effect/rune/blood_boil/do_invoke_glow()
|
||||
return
|
||||
|
||||
/obj/effect/rune/blood_boil/invoke(var/list/invokers)
|
||||
if(rune_in_use)
|
||||
return
|
||||
..()
|
||||
rune_in_use = TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
visible_message("<span class='warning'>[src] briefly bubbles before exploding!</span>")
|
||||
for(var/mob/living/carbon/C in viewers(T))
|
||||
if(!iscultist(C))
|
||||
var/obj/item/weapon/nullrod/N = C.null_rod_check()
|
||||
if(N)
|
||||
C << "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>"
|
||||
continue
|
||||
C << "<span class='cultlarge'>Your blood boils in your veins!</span>"
|
||||
C.take_overall_damage(45,45)
|
||||
C.Stun(7)
|
||||
if(is_servant_of_ratvar(C))
|
||||
C << "<span class='userdanger'>You feel unholy darkness dimming the Justiciar's light!</span>"
|
||||
C.adjustStaminaLoss(30)
|
||||
visible_message("<span class='warning'>[src] turns a bright, glowing orange!</span>")
|
||||
SetLuminosity(6)
|
||||
color = "#FC9B54"
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
L.apply_damage(15, BRUTE, pick("l_arm", "r_arm"))
|
||||
L.apply_damage(10, BRUTE, pick("l_arm", "r_arm"))
|
||||
L << "<span class='cultitalic'>[src] saps your strength!</span>"
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(!iscultist(L) && L.blood_volume)
|
||||
var/obj/item/weapon/nullrod/N = L.null_rod_check()
|
||||
if(N)
|
||||
L << "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>"
|
||||
continue
|
||||
L << "<span class='cultlarge'>Your blood boils in your veins!</span>"
|
||||
if(is_servant_of_ratvar(L))
|
||||
L << "<span class='userdanger'>You feel an unholy darkness dimming the Justiciar's light!</span>"
|
||||
animate(src, color = "#FCB56D", time = 4)
|
||||
sleep(4)
|
||||
if(!src)
|
||||
return
|
||||
do_area_burn(T, 0.5)
|
||||
animate(src, color = "#FFDF80", time = 5)
|
||||
sleep(5)
|
||||
if(!src)
|
||||
return
|
||||
do_area_burn(T, 1)
|
||||
animate(src, color = "#FFFDF4", time = 6)
|
||||
sleep(6)
|
||||
if(!src)
|
||||
return
|
||||
do_area_burn(T, 1.5)
|
||||
new /obj/effect/hotspot(T)
|
||||
qdel(src)
|
||||
explosion(T, -1, 0, 1, 5)
|
||||
|
||||
/obj/effect/rune/blood_boil/proc/do_area_burn(turf/T, multiplier)
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(!iscultist(L) && L.blood_volume)
|
||||
var/obj/item/weapon/nullrod/N = L.null_rod_check()
|
||||
if(N)
|
||||
continue
|
||||
L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier)
|
||||
if(is_servant_of_ratvar(L))
|
||||
L.adjustStaminaLoss(tick_damage*0.5)
|
||||
|
||||
|
||||
//Deals brute damage to all targets on the rune and heals the invoker for each target drained.
|
||||
/obj/effect/rune/leeching
|
||||
cultist_name = "Drain Life"
|
||||
cultist_desc = "drains the life of all targets on the rune, restoring life to the user."
|
||||
invocation = "Yu'gular faras desdae. Umathar uf'kal thenar!"
|
||||
icon_state = "3"
|
||||
color = "#9F1C34"
|
||||
|
||||
/obj/effect/rune/leeching/can_invoke(mob/living/user)
|
||||
if(world.time <= user.next_move)
|
||||
return list()
|
||||
var/turf/T = get_turf(src)
|
||||
var/list/potential_targets = list()
|
||||
for(var/mob/living/carbon/M in T.contents - user)
|
||||
if(M.stat != DEAD)
|
||||
potential_targets += M
|
||||
if(!potential_targets.len)
|
||||
user << "<span class='cultitalic'>There must be at least one valid target on the rune!</span>"
|
||||
log_game("Leeching rune failed - no valid targets")
|
||||
return list()
|
||||
return ..()
|
||||
|
||||
/obj/effect/rune/leeching/invoke(var/list/invokers)
|
||||
var/mob/living/user = invokers[1]
|
||||
user.changeNext_move(CLICK_CD_CLICK_ABILITY)
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/mob/living/carbon/M in T.contents - user)
|
||||
if(M.stat != DEAD)
|
||||
var/drained_amount = rand(10,20)
|
||||
M.apply_damage(drained_amount, BRUTE, "chest")
|
||||
user.adjustBruteLoss(-drained_amount)
|
||||
M << "<span class='cultitalic'>You feel extremely weak.</span>"
|
||||
user.Beam(T,icon_state="drainbeam",time=5)
|
||||
user.visible_message("<span class='warning'>Blood flows from the rune into [user]!</span>", \
|
||||
"<span class='cult'>Blood flows into you, healing your wounds and revitalizing your spirit.</span>")
|
||||
|
||||
|
||||
//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
|
||||
@@ -847,7 +950,7 @@ var/list/teleport_runes = list()
|
||||
invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
|
||||
icon_state = "6"
|
||||
construct_invoke = 0
|
||||
color = rgb(200, 0, 0)
|
||||
color = "#C80000"
|
||||
|
||||
/obj/effect/rune/manifest/New(loc)
|
||||
..()
|
||||
@@ -883,17 +986,14 @@ var/list/teleport_runes = list()
|
||||
..()
|
||||
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a man.</span>")
|
||||
user << "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>"
|
||||
var/obj/machinery/shield/N = new(get_turf(src))
|
||||
N.name = "Invoker's Shield"
|
||||
N.desc = "A weak shield summoned by cultists to protect them while they carry out delicate rituals"
|
||||
N.color = "red"
|
||||
N.health = 20
|
||||
N.mouse_opacity = 0
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/emergency_shield/invoker/N = new(T)
|
||||
|
||||
new_human.key = ghost_to_spawn.key
|
||||
ticker.mode.add_cultist(new_human.mind, 0)
|
||||
new_human << "<span class='cultitalic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs.</b></span>"
|
||||
|
||||
while(user in get_turf(src))
|
||||
while(user in T)
|
||||
if(user.stat)
|
||||
break
|
||||
user.apply_damage(0.1, BRUTE)
|
||||
@@ -904,5 +1004,5 @@ var/list/teleport_runes = list()
|
||||
new_human.visible_message("<span class='warning'>[new_human] suddenly dissolves into bones and ashes.</span>", \
|
||||
"<span class='cultlarge'>Your link to the world fades. Your form breaks apart.</span>")
|
||||
for(var/obj/I in new_human)
|
||||
new_human.unEquip(I)
|
||||
new_human.dropItemToGround(I)
|
||||
new_human.dust()
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
dat += "Please choose the chant to be imbued into the fabric of reality.<BR>"
|
||||
dat += "<HR>"
|
||||
dat += "<A href='?src=\ref[src];rune=newtome'>N'ath reth sh'yro eth d'raggathnor!</A> - Summons an arcane tome, used to scribe runes and communicate with other cultists.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=metal'>Bar'tea eas!</A> - Provides 5 runed metal.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=teleport'>Sas'so c'arta forbici!</A> - Allows you to move to a selected teleportation rune.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=emp'>Ta'gh fara'qha fel d'amar det!</A> - Allows you to destroy technology in a short range.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=runestun'>Fuu ma'jin!</A> - Allows you to stun a person by attacking them with the talisman.<BR>"
|
||||
@@ -76,6 +77,12 @@
|
||||
if("newtome")
|
||||
var/obj/item/weapon/tome/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
if("metal")
|
||||
if(istype(src, /obj/item/weapon/paper/talisman/supply/weak))
|
||||
usr.visible_message("<span class='cultitalic'>Lesser supply talismans lack the strength to materialize runed metal!</span>")
|
||||
return
|
||||
var/obj/item/stack/sheet/runed_metal/R = new(usr,5)
|
||||
usr.put_in_hands(R)
|
||||
if("teleport")
|
||||
var/obj/item/weapon/paper/talisman/teleport/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
@@ -102,6 +109,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/weak
|
||||
cultist_name = "Lesser Supply Talisman"
|
||||
uses = 2
|
||||
|
||||
//Rite of Translocation: Same as rune
|
||||
@@ -115,17 +123,9 @@
|
||||
/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
|
||||
var/list/potential_runes = list()
|
||||
var/list/teleportnames = list()
|
||||
var/list/duplicaterunecount = list()
|
||||
for(var/R in teleport_runes)
|
||||
var/obj/effect/rune/teleport/T = R
|
||||
var/resultkey = T.listkey
|
||||
if(resultkey in teleportnames)
|
||||
duplicaterunecount[resultkey]++
|
||||
resultkey = "[resultkey] ([duplicaterunecount[resultkey]])"
|
||||
else
|
||||
teleportnames.Add(resultkey)
|
||||
duplicaterunecount[resultkey] = 1
|
||||
potential_runes[resultkey] = T
|
||||
potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
|
||||
|
||||
if(!potential_runes.len)
|
||||
user << "<span class='warning'>There are no valid runes to teleport to!</span>"
|
||||
@@ -139,11 +139,15 @@
|
||||
|
||||
var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked
|
||||
var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
|
||||
if(!actual_selected_rune)
|
||||
if(!src || qdeleted(src) || !user || !user.is_holding(src) || user.incapacitated() || !actual_selected_rune)
|
||||
return ..(user, 0)
|
||||
user.visible_message("<span class='warning'>Dust flows from [user]'s hand, and they disappear in a flash of red light!</span>", \
|
||||
var/turf/target = get_turf(actual_selected_rune)
|
||||
if(is_blocked_turf(target, TRUE))
|
||||
user << "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>"
|
||||
return ..(user, 0)
|
||||
user.visible_message("<span class='warning'>Dust flows from [user]'s hand, and [user.p_they()] disappear in a flash of red light!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman and find yourself somewhere else!</span>")
|
||||
user.forceMove(get_turf(actual_selected_rune))
|
||||
user.forceMove(target)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -245,7 +249,7 @@
|
||||
else
|
||||
target.Weaken(10)
|
||||
target.Stun(10)
|
||||
target.flash_eyes(1,1)
|
||||
target.flash_act(1,1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = target
|
||||
S.emp_act(1)
|
||||
@@ -308,16 +312,17 @@
|
||||
target << "<span class='userdanger'>You see a brief but horrible vision of Ratvar, rusted and scrapped, being torn apart.</span>"
|
||||
target.emote("scream")
|
||||
target.confused = max(0, target.confused + 3)
|
||||
target.flash_eyes()
|
||||
target.flash_act()
|
||||
qdel(src)
|
||||
|
||||
|
||||
//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets.
|
||||
//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets, or converts plasteel into runed metal up to 25 times
|
||||
/obj/item/weapon/paper/talisman/construction
|
||||
cultist_name = "Talisman of Construction"
|
||||
cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell"
|
||||
invocation = "Ethra p'ni dedol!"
|
||||
color = "#000000" // black
|
||||
uses = 25
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user)
|
||||
if(iscultist(user))
|
||||
@@ -328,27 +333,34 @@
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack(obj/M,mob/living/user)
|
||||
if(iscultist(user))
|
||||
user << "<span class='cultitalic'>This talisman will only work on a stack of metal sheets!</span>"
|
||||
user << "<span class='cultitalic'>This talisman will only work on a stack of metal or plasteel sheets!</span>"
|
||||
log_game("Construct talisman failed - not a valid target")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
|
||||
..()
|
||||
if(proximity_flag && iscultist(user))
|
||||
var/turf/T = get_turf(target)
|
||||
if(istype(target, /obj/item/stack/sheet/metal))
|
||||
var/turf/T = get_turf(target)
|
||||
if(target.use(25))
|
||||
new /obj/structure/constructshell(T)
|
||||
user << "<span class='warning'>The talisman clings to the metal and twists it into a construct shell!</span>"
|
||||
user << sound('sound/effects/magic.ogg',0,1,25)
|
||||
invoke(user, 1)
|
||||
qdel(src)
|
||||
if(istype(target, /obj/item/stack/sheet/plasteel))
|
||||
var/quantity = target.amount
|
||||
var/turf/T = get_turf(target)
|
||||
else
|
||||
user << "<span class='warning'>You need more metal to produce a construct shell!</span>"
|
||||
else if(istype(target, /obj/item/stack/sheet/plasteel))
|
||||
var/quantity = min(target.amount, uses)
|
||||
uses -= quantity
|
||||
new /obj/item/stack/sheet/runed_metal(T,quantity)
|
||||
target.use(quantity)
|
||||
user << "<span class='warning'>The talisman clings to the plasteel, transforming it into runed metal!</span>"
|
||||
user << sound('sound/effects/magic.ogg',0,1,25)
|
||||
qdel(src)
|
||||
invoke(user, 1)
|
||||
if(uses <= 0)
|
||||
qdel(src)
|
||||
else
|
||||
user << "<span class='warning'>The talisman must be used on metal or plasteel!</span>"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user