mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-31 07:57:47 +01:00
Damns Devils Gamemode to Hell (#15672)
* Damns Devils Gamemode to Hell * Update config.txt
This commit is contained in:
@@ -1,58 +0,0 @@
|
||||
#define CONTRACT_POWER "Power"
|
||||
#define CONTRACT_WEALTH "Wealth"
|
||||
#define CONTRACT_PRESTIGE "Prestige"
|
||||
#define CONTRACT_MAGIC "Magic"
|
||||
#define CONTRACT_REVIVE "Revive"
|
||||
#define CONTRACT_KNOWLEDGE "Knowledge"
|
||||
#define CONTRACT_UNWILLING "Unwilling"
|
||||
#define CONTRACT_FRIENDSHIP "Friendship"
|
||||
// FIXME: Implement these
|
||||
#define CONTRACT_ETALENT "Engineering Talent"
|
||||
#define CONTRACT_CTALENT "Chemistry Talent"
|
||||
#define CONTRACT_RETURNDEAD "Return Dead"
|
||||
#define CONTRACT_AUGMENT "Cybernetic Augmentations"
|
||||
#define CONTRACT_CANDY "Endless Candy"
|
||||
#define CONTRACT_ECHANCE "An Extra Chance"
|
||||
#define CONTRACT_ATECH "Advanced Technology"
|
||||
#define CONTRACT_DEVILSMACHINE "Devil's Machinery"
|
||||
#define CONTRACT_YOUTH "Eternal Youth"
|
||||
#define CONTRACT_FOOD "Food"
|
||||
#define CONTRACT_SPACE "Space Gear"
|
||||
#define CONTRACT_CALAMITY "Calamity"
|
||||
|
||||
#define BANE_SALT "salt"
|
||||
#define BANE_LIGHT "light"
|
||||
#define BANE_IRON "iron"
|
||||
#define BANE_WHITECLOTHES "whiteclothes"
|
||||
#define BANE_SILVER "silver"
|
||||
#define BANE_HARVEST "harvest"
|
||||
#define BANE_TOOLBOX "toolbox"
|
||||
|
||||
#define OBLIGATION_FOOD "food"
|
||||
#define OBLIGATION_FIDDLE "fiddle"
|
||||
#define OBLIGATION_DANCEOFF "danceoff"
|
||||
#define OBLIGATION_GREET "greet"
|
||||
#define OBLIGATION_PRESENCEKNOWN "presenceknown"
|
||||
#define OBLIGATION_SAYNAME "sayname"
|
||||
#define OBLIGATION_ANNOUNCEKILL "announcekill"
|
||||
#define OBLIGATION_ANSWERTONAME "answername"
|
||||
|
||||
#define BAN_HURTWOMAN "hurtwoman"
|
||||
#define BAN_HURTMAN "hurtman"
|
||||
#define BAN_CHAPEL "chapel"
|
||||
#define BAN_HURTPRIEST "hurtpriest"
|
||||
#define BAN_AVOIDWATER "avoidwater"
|
||||
#define BAN_STRIKEUNCONCIOUS "strikeunconcious"
|
||||
#define BAN_HURTLIZARD "hurtlizard"
|
||||
#define BAN_HURTANIMAL "hurtanimal"
|
||||
|
||||
#define BANISH_WATER "water"
|
||||
#define BANISH_COFFIN "coffin"
|
||||
#define BANISH_FORMALDYHIDE "embalm"
|
||||
#define BANISH_RUNES "runes"
|
||||
#define BANISH_CANDLES "candles"
|
||||
#define BANISH_DESTRUCTION "destruction"
|
||||
#define BANISH_FUNERAL_GARB "funeral"
|
||||
|
||||
#define LORE 1
|
||||
#define LAW 2
|
||||
@@ -53,9 +53,8 @@
|
||||
#define ANTAG_HUD_VAMPIRE 16
|
||||
#define ANTAG_HUD_ABDUCTOR 17
|
||||
#define DATA_HUD_ABDUCTOR 18
|
||||
#define ANTAG_HUD_DEVIL 19
|
||||
#define ANTAG_HUD_EVENTMISC 20
|
||||
#define ANTAG_HUD_BLOB 21
|
||||
#define ANTAG_HUD_EVENTMISC 19
|
||||
#define ANTAG_HUD_BLOB 20
|
||||
|
||||
// Notification action types
|
||||
#define NOTIFY_JUMP "jump"
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#define ROLE_REVENANT "revenant"
|
||||
#define ROLE_HOG_GOD "hand of god: god" // We're prolly gonna port this one day or another
|
||||
#define ROLE_HOG_CULTIST "hand of god: cultist"
|
||||
#define ROLE_DEVIL "devil"
|
||||
#define ROLE_RAIDER "vox raider"
|
||||
#define ROLE_TRADER "trader"
|
||||
#define ROLE_VAMPIRE "vampire"
|
||||
@@ -54,7 +53,6 @@ GLOBAL_LIST_INIT(special_roles, list(
|
||||
ROLE_CHANGELING = /datum/game_mode/changeling, // Changeling
|
||||
ROLE_BORER, // Cortical borer
|
||||
ROLE_CULTIST = /datum/game_mode/cult, // Cultist
|
||||
ROLE_DEVIL = /datum/game_mode/devil/devil_agents, // Devil
|
||||
ROLE_GSPIDER, // Giant spider
|
||||
ROLE_GUARDIAN, // Guardian
|
||||
ROLE_MORPH, // Morph
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
//what could possibly go wrong
|
||||
GLOBAL_LIST_INIT(devil_machines, typecacheof(/obj/item/circuitboard, TRUE) - list(
|
||||
/obj/item/circuitboard/shuttle,
|
||||
/obj/item/circuitboard/swfdoor,
|
||||
/obj/item/circuitboard/olddoor,
|
||||
/obj/item/circuitboard/computer,
|
||||
/obj/item/circuitboard/machine
|
||||
))
|
||||
@@ -22,7 +22,6 @@
|
||||
//Middle left indicators
|
||||
#define ui_lingchemdisplay "WEST:6,CENTER-1:15"
|
||||
#define ui_lingstingdisplay "WEST:6,CENTER-3:11"
|
||||
#define ui_devilsouldisplay "WEST:6,CENTER-1:15"
|
||||
|
||||
//Lower center, persistant menu
|
||||
#define ui_sstore1 "CENTER-5:10,SOUTH:5"
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
|
||||
//Soul counter is stored with the humans, it does weird when you place it here apparently...
|
||||
|
||||
|
||||
/datum/hud/devil/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi')
|
||||
..()
|
||||
|
||||
var/obj/screen/using
|
||||
var/obj/screen/inventory/inv_box
|
||||
|
||||
using = new /obj/screen/drop()
|
||||
using.icon = ui_style
|
||||
using.screen_loc = ui_drop_throw
|
||||
static_inventory += using
|
||||
|
||||
mymob.pullin = new /obj/screen/pull()
|
||||
mymob.pullin.icon = ui_style
|
||||
mymob.pullin.update_icon(mymob)
|
||||
mymob.pullin.screen_loc = ui_pull_resist
|
||||
static_inventory += mymob.pullin
|
||||
|
||||
inv_box = new /obj/screen/inventory/hand()
|
||||
inv_box.name = "right hand"
|
||||
inv_box.icon = ui_style
|
||||
inv_box.icon_state = "hand_r"
|
||||
inv_box.screen_loc = ui_rhand
|
||||
inv_box.slot_id = slot_r_hand
|
||||
static_inventory += inv_box
|
||||
|
||||
inv_box = new /obj/screen/inventory/hand()
|
||||
inv_box.name = "left hand"
|
||||
inv_box.icon = ui_style
|
||||
inv_box.icon_state = "hand_l"
|
||||
inv_box.screen_loc = ui_lhand
|
||||
inv_box.slot_id = slot_l_hand
|
||||
static_inventory += inv_box
|
||||
|
||||
using = new /obj/screen/swap_hand()
|
||||
using.name = "hand"
|
||||
using.icon = ui_style
|
||||
using.icon_state = "swap_1"
|
||||
using.screen_loc = ui_swaphand1
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/swap_hand()
|
||||
using.name = "hand"
|
||||
using.icon = ui_style
|
||||
using.icon_state = "swap_2"
|
||||
using.screen_loc = ui_swaphand2
|
||||
static_inventory += using
|
||||
|
||||
zone_select = new /obj/screen/zone_sel()
|
||||
zone_select.icon = ui_style
|
||||
zone_select.update_icon(mymob)
|
||||
|
||||
lingchemdisplay = new /obj/screen/ling/chems()
|
||||
devilsouldisplay = new /obj/screen/devil/soul_counter
|
||||
infodisplay += devilsouldisplay
|
||||
|
||||
for(var/obj/screen/inventory/inv in static_inventory)
|
||||
if(inv.slot_id)
|
||||
inv.hud = src
|
||||
inv_slots[inv.slot_id] = inv
|
||||
inv.update_icon()
|
||||
|
||||
|
||||
/datum/hud/devil/persistent_inventory_update()
|
||||
if(!mymob)
|
||||
return
|
||||
var/mob/living/carbon/true_devil/D = mymob
|
||||
|
||||
if(hud_version != HUD_STYLE_NOHUD)
|
||||
if(D.r_hand)
|
||||
D.r_hand.screen_loc = ui_rhand
|
||||
D.client.screen += D.r_hand
|
||||
if(D.l_hand)
|
||||
D.l_hand.screen_loc = ui_lhand
|
||||
D.client.screen += D.l_hand
|
||||
else
|
||||
if(D.r_hand)
|
||||
D.r_hand.screen_loc = null
|
||||
if(D.l_hand)
|
||||
D.l_hand.screen_loc = null
|
||||
|
||||
/mob/living/carbon/true_devil/create_mob_hud()
|
||||
if(client && !hud_used)
|
||||
hud_used = new /datum/hud/devil(src, ui_style2icon(client.prefs.UI_style))
|
||||
@@ -27,8 +27,6 @@
|
||||
var/obj/screen/move_intent
|
||||
var/obj/screen/module_store_icon
|
||||
|
||||
var/obj/screen/devil/soul_counter/devilsouldisplay
|
||||
|
||||
var/list/static_inventory = list() //the screen objects which are static
|
||||
var/list/toggleable_inventory = list() //the screen objects which can be hidden
|
||||
var/list/hotkeybuttons = list() //the buttons that can be used via hotkeys
|
||||
@@ -89,7 +87,6 @@
|
||||
alien_plasma_display = null
|
||||
vampire_blood_display = null
|
||||
nightvisionicon = null
|
||||
devilsouldisplay = null
|
||||
|
||||
QDEL_LIST_ASSOC_VAL(plane_masters)
|
||||
|
||||
|
||||
@@ -36,35 +36,6 @@
|
||||
var/mob/living/carbon/U = usr
|
||||
U.unset_sting()
|
||||
|
||||
/obj/screen/devil
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
/obj/screen/devil/soul_counter
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
name = "souls owned"
|
||||
icon_state = "Devil-6"
|
||||
screen_loc = ui_devilsouldisplay
|
||||
|
||||
/obj/screen/devil/soul_counter/proc/update_counter(souls = 0)
|
||||
invisibility = 0
|
||||
maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#FF0000'>[souls]</font></div>"
|
||||
switch(souls)
|
||||
if(0,null)
|
||||
icon_state = "Devil-1"
|
||||
if(1,2)
|
||||
icon_state = "Devil-2"
|
||||
if(3 to 5)
|
||||
icon_state = "Devil-3"
|
||||
if(6 to 8)
|
||||
icon_state = "Devil-4"
|
||||
if(9 to INFINITY)
|
||||
icon_state = "Devil-5"
|
||||
else
|
||||
icon_state = "Devil-6"
|
||||
|
||||
/obj/screen/devil/soul_counter/proc/clear()
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
/obj/screen/ling/chems
|
||||
name = "chemical storage"
|
||||
icon_state = "power_display"
|
||||
@@ -372,9 +343,6 @@
|
||||
lingstingdisplay = new /obj/screen/ling/sting()
|
||||
infodisplay += lingstingdisplay
|
||||
|
||||
devilsouldisplay = new /obj/screen/devil/soul_counter
|
||||
infodisplay += devilsouldisplay
|
||||
|
||||
zone_select = new /obj/screen/zone_sel()
|
||||
zone_select.color = ui_color
|
||||
zone_select.icon = ui_style
|
||||
|
||||
@@ -17,10 +17,6 @@
|
||||
/datum/ai_law/zero/get_index()
|
||||
return 0
|
||||
|
||||
/datum/ai_law/sixsixsix/get_index()
|
||||
return 666
|
||||
|
||||
|
||||
/datum/ai_laws
|
||||
var/name = "Unknown Laws"
|
||||
var/law_header = "Prime Directives"
|
||||
@@ -31,11 +27,9 @@
|
||||
var/list/datum/ai_law/inherent_laws = list()
|
||||
var/list/datum/ai_law/supplied_laws = list()
|
||||
var/list/datum/ai_law/ion/ion_laws = list()
|
||||
var/list/datum/ai_law/sixsixsix/devil_laws = list()
|
||||
var/list/datum/ai_law/sorted_laws = list()
|
||||
|
||||
var/state_zeroth = 0
|
||||
var/list/state_devil = list()
|
||||
var/list/state_ion = list()
|
||||
var/list/state_inherent = list()
|
||||
var/list/state_supplied = list()
|
||||
@@ -68,9 +62,6 @@
|
||||
for(var/ion_law in ion_laws)
|
||||
sorted_laws += ion_law
|
||||
|
||||
for(var/evil_law in devil_laws)
|
||||
sorted_laws += evil_law
|
||||
|
||||
var/index = 1
|
||||
for(var/datum/ai_law/inherent_law in inherent_laws)
|
||||
inherent_law.index = index++
|
||||
@@ -128,21 +119,6 @@
|
||||
zeroth_law_borg = null
|
||||
sorted_laws.Cut()
|
||||
|
||||
/datum/ai_laws/proc/set_sixsixsix_law(var/law)
|
||||
if(!law)
|
||||
return
|
||||
|
||||
for(var/datum/ai_law/AL in devil_laws)
|
||||
if(AL.law == law)
|
||||
return
|
||||
|
||||
var/new_law = new/datum/ai_law/sixsixsix(law)
|
||||
devil_laws += new_law
|
||||
if(state_devil.len < devil_laws.len)
|
||||
state_devil += 1
|
||||
|
||||
sorted_laws.Cut()
|
||||
|
||||
/datum/ai_laws/proc/add_ion_law(var/law)
|
||||
if(!law)
|
||||
return
|
||||
@@ -212,9 +188,6 @@
|
||||
/datum/ai_law/ion/delete_law(var/datum/ai_laws/laws)
|
||||
laws.internal_delete_law(laws.ion_laws, laws.state_ion, src)
|
||||
|
||||
/datum/ai_law/sixsixsix/delete_law(var/datum/ai_laws/laws)
|
||||
laws.internal_delete_law(laws.devil_laws, laws.state_devil, src)
|
||||
|
||||
/datum/ai_law/inherent/delete_law(var/datum/ai_laws/laws)
|
||||
laws.internal_delete_law(laws.inherent_laws, laws.state_inherent, src)
|
||||
|
||||
@@ -239,10 +212,6 @@
|
||||
zeroth_law = null
|
||||
zeroth_law_borg = null
|
||||
|
||||
/datum/ai_laws/proc/clear_sixsixsix_laws()
|
||||
devil_laws.Cut()
|
||||
sorted_laws.Cut()
|
||||
|
||||
/datum/ai_laws/proc/clear_ion_laws()
|
||||
ion_laws.Cut()
|
||||
sorted_laws.Cut()
|
||||
|
||||
@@ -21,7 +21,6 @@ GLOBAL_LIST_INIT(huds, list( \
|
||||
ANTAG_HUD_VAMPIRE = new/datum/atom_hud/antag/hidden(),\
|
||||
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\
|
||||
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),\
|
||||
ANTAG_HUD_DEVIL = new/datum/atom_hud/antag/hidden(),\
|
||||
ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden(),\
|
||||
ANTAG_HUD_BLOB = new/datum/atom_hud/antag/hidden()\
|
||||
))
|
||||
|
||||
@@ -55,10 +55,6 @@
|
||||
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
|
||||
var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD
|
||||
var/datum/mindslaves/som //stands for slave or master...hush..
|
||||
var/datum/devilinfo/devilinfo //Information about the devil, if any.
|
||||
var/damnation_type = 0
|
||||
var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
|
||||
var/hasSoul = TRUE
|
||||
|
||||
var/isholy = FALSE // is this person a chaplain or admin role allowed to use bibles
|
||||
var/isblessed = FALSE // is this person blessed by a chaplain?
|
||||
@@ -76,7 +72,6 @@
|
||||
|
||||
/datum/mind/New(new_key)
|
||||
key = new_key
|
||||
soulOwner = src
|
||||
|
||||
/datum/mind/Destroy()
|
||||
SSticker.minds -= src
|
||||
@@ -88,7 +83,6 @@
|
||||
antag_datums = null
|
||||
current = null
|
||||
original = null
|
||||
soulOwner = null
|
||||
return ..()
|
||||
|
||||
/datum/mind/proc/transfer_to(mob/living/new_character)
|
||||
@@ -314,22 +308,6 @@
|
||||
|
||||
. += _memory_edit_role_enabled(ROLE_ABDUCTOR)
|
||||
|
||||
/datum/mind/proc/memory_edit_devil(mob/living/H)
|
||||
. = _memory_edit_header("devil", list("devilagents"))
|
||||
if(src in SSticker.mode.devils)
|
||||
if(!devilinfo)
|
||||
. += "<b>No devilinfo found! Yell at a coder!</b>"
|
||||
else if(!devilinfo.ascendable)
|
||||
. += "<b>DEVIL</b>|<a href='?src=[UID()];devil=ascendable_devil'>Ascendable Devil</a>|sintouched|<a href='?src=[UID()];devil=clear'>no</a>"
|
||||
else
|
||||
. += "<a href='?src=[UID()];devil=devil'>DEVIL</a>|<b>ASCENDABLE DEVIL</b>|sintouched|<a href='?src=[UID()];devil=clear'>no</a>"
|
||||
else if(src in SSticker.mode.sintouched)
|
||||
. += "devil|Ascendable Devil|<b>SINTOUCHED</b>|<a href='?src=[UID()];devil=clear'>no</a>"
|
||||
else
|
||||
. += "<a href='?src=[UID()];devil=devil'>devil</a>|<a href='?src=[UID()];devil=ascendable_devil'>Ascendable Devil</a>|<a href='?src=[UID()];devil=sintouched'>sintouched</a>|<b>NO</b>"
|
||||
|
||||
. += _memory_edit_role_enabled(ROLE_DEVIL)
|
||||
|
||||
/datum/mind/proc/memory_edit_eventmisc(mob/living/H)
|
||||
. = _memory_edit_header("event", list())
|
||||
if(src in SSticker.mode.eventmiscs)
|
||||
@@ -461,10 +439,6 @@
|
||||
sections["shadowling"] = memory_edit_shadowling(H)
|
||||
/** Abductors **/
|
||||
sections["abductor"] = memory_edit_abductor(H)
|
||||
/** DEVIL ***/
|
||||
var/static/list/devils_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/carbon/true_devil, /mob/living/silicon/robot))
|
||||
if(is_type_in_typecache(current, devils_typecache))
|
||||
sections["devil"] = memory_edit_devil(H)
|
||||
sections["eventmisc"] = memory_edit_eventmisc(H)
|
||||
/** TRAITOR ***/
|
||||
sections["traitor"] = memory_edit_traitor()
|
||||
@@ -1104,76 +1078,6 @@
|
||||
SSticker.mode.update_eventmisc_icons_added(src)
|
||||
message_admins("[key_name_admin(usr)] has eventantag'ed [current].")
|
||||
log_admin("[key_name(usr)] has eventantag'ed [current].")
|
||||
else if(href_list["devil"])
|
||||
switch(href_list["devil"])
|
||||
if("clear")
|
||||
if(src in SSticker.mode.devils)
|
||||
if(istype(current,/mob/living/carbon/true_devil/))
|
||||
to_chat(usr,"<span class='warning'>This cannot be used on true or arch-devils.</span>")
|
||||
else
|
||||
SSticker.mode.devils -= src
|
||||
SSticker.mode.update_devil_icons_removed(src)
|
||||
special_role = null
|
||||
to_chat(current,"<span class='userdanger'>Your infernal link has been severed! You are no longer a devil!</span>")
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/infernal_jaunt)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/click/fireball/hellish)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/click/summon_contract)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/greater)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/ascended)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/violin)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_dancefloor)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/sintouch)
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/sintouch/ascended)
|
||||
message_admins("[key_name_admin(usr)] has de-devil'ed [current].")
|
||||
if(issilicon(current))
|
||||
var/mob/living/silicon/S = current
|
||||
S.laws.clear_sixsixsix_laws()
|
||||
devilinfo = null
|
||||
log_admin("[key_name(usr)] has de-devil'ed [current].")
|
||||
else if(src in SSticker.mode.sintouched)
|
||||
SSticker.mode.sintouched -= src
|
||||
message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].")
|
||||
log_admin("[key_name(usr)] has de-sintouch'ed [current].")
|
||||
if("devil")
|
||||
if(devilinfo)
|
||||
devilinfo.ascendable = FALSE
|
||||
message_admins("[key_name_admin(usr)] has made [current] unable to ascend as a devil.")
|
||||
log_admin("[key_name_admin(usr)] has made [current] unable to ascend as a devil.")
|
||||
return
|
||||
if(!ishuman(current) && !isrobot(current))
|
||||
to_chat(usr, "<span class='warning'>This only works on humans and cyborgs!</span>")
|
||||
return
|
||||
SSticker.mode.devils += src
|
||||
special_role = "devil"
|
||||
SSticker.mode.update_devil_icons_added(src)
|
||||
SSticker.mode.finalize_devil(src, FALSE)
|
||||
SSticker.mode.forge_devil_objectives(src, 2)
|
||||
SSticker.mode.greet_devil(src)
|
||||
message_admins("[key_name_admin(usr)] has devil'ed [current].")
|
||||
log_admin("[key_name(usr)] has devil'ed [current].")
|
||||
if("ascendable_devil")
|
||||
if(devilinfo)
|
||||
devilinfo.ascendable = TRUE
|
||||
message_admins("[key_name_admin(usr)] has made [current] able to ascend as a devil.")
|
||||
log_admin("[key_name_admin(usr)] has made [current] able to ascend as a devil.")
|
||||
return
|
||||
if(!ishuman(current) && !isrobot(current))
|
||||
to_chat(usr, "<span class='warning'>This only works on humans and cyborgs!</span>")
|
||||
return
|
||||
SSticker.mode.devils += src
|
||||
special_role = "devil"
|
||||
SSticker.mode.update_devil_icons_added(src)
|
||||
SSticker.mode.finalize_devil(src, TRUE)
|
||||
SSticker.mode.forge_devil_objectives(src, 2)
|
||||
SSticker.mode.greet_devil(src)
|
||||
message_admins("[key_name_admin(usr)] has devil'ed [current]. The devil has been marked as ascendable.")
|
||||
log_admin("[key_name(usr)] has devil'ed [current]. The devil has been marked as ascendable.")
|
||||
if("sintouched")
|
||||
var/mob/living/carbon/human/H = current
|
||||
H.influenceSin()
|
||||
message_admins("[key_name_admin(usr)] has sintouch'ed [current].")
|
||||
log_admin("[key_name(usr)] has sintouch'ed [current].")
|
||||
|
||||
else if(href_list["traitor"])
|
||||
switch(href_list["traitor"])
|
||||
@@ -1805,17 +1709,6 @@
|
||||
var/obj/effect/proc_holder/spell/S = X
|
||||
S.action.Grant(new_character)
|
||||
|
||||
/datum/mind/proc/disrupt_spells(delay, list/exceptions = New())
|
||||
for(var/X in spell_list)
|
||||
var/obj/effect/proc_holder/spell/S = X
|
||||
for(var/type in exceptions)
|
||||
if(istype(S, type))
|
||||
continue
|
||||
S.charge_counter = delay
|
||||
spawn(0)
|
||||
S.start_recharge()
|
||||
S.updateButtonIcon()
|
||||
|
||||
/datum/mind/proc/get_ghost(even_if_they_cant_reenter)
|
||||
for(var/mob/dead/observer/G in GLOB.dead_mob_list)
|
||||
if(G.mind == src)
|
||||
@@ -1891,18 +1784,6 @@
|
||||
to_chat(current, "<span class='warning'><b>You seem to have forgotten the events of the past 10 minutes or so, and your head aches a bit as if someone beat it savagely with a stick.</b></span>")
|
||||
to_chat(current, "<span class='warning'><b>This means you don't remember who you were working for or what you were doing.</b></span>")
|
||||
|
||||
/datum/mind/proc/is_revivable() //Note, this ONLY checks the mind.
|
||||
if(damnation_type)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
// returns a mob to message to produce something visible for the target mind
|
||||
/datum/mind/proc/messageable_mob()
|
||||
if(!QDELETED(current) && current.client)
|
||||
return current
|
||||
else
|
||||
return get_ghost(even_if_they_cant_reenter = TRUE)
|
||||
|
||||
//Initialisation procs
|
||||
/mob/proc/mind_initialize()
|
||||
if(mind)
|
||||
|
||||
@@ -1,166 +0,0 @@
|
||||
/mob/living
|
||||
var/list/ownedSoullinks //soullinks we are the owner of
|
||||
var/list/sharedSoullinks //soullinks we are a/the sharer of
|
||||
|
||||
/mob/living/Destroy()
|
||||
for(var/s in ownedSoullinks)
|
||||
var/datum/soullink/S = s
|
||||
S.ownerDies(FALSE)
|
||||
qdel(s) //If the owner is destroy()'d, the soullink is destroy()'d
|
||||
ownedSoullinks = null
|
||||
for(var/s in sharedSoullinks)
|
||||
var/datum/soullink/S = s
|
||||
S.sharerDies(FALSE)
|
||||
S.removeSoulsharer(src) //If a sharer is destroy()'d, they are simply removed
|
||||
sharedSoullinks = null
|
||||
return ..()
|
||||
|
||||
//Keeps track of a Mob->Mob (potentially Player->Player) connection
|
||||
//Can be used to trigger actions on one party when events happen to another
|
||||
//Eg: shared deaths
|
||||
//Can be used to form a linked list of mob-hopping
|
||||
//Does NOT transfer with minds
|
||||
/datum/soullink
|
||||
var/mob/living/soulowner
|
||||
var/mob/living/soulsharer
|
||||
var/id //Optional ID, for tagging and finding specific instances
|
||||
|
||||
/datum/soullink/Destroy()
|
||||
if(soulowner)
|
||||
LAZYREMOVE(soulowner.ownedSoullinks, src)
|
||||
soulowner = null
|
||||
if(soulsharer)
|
||||
LAZYREMOVE(soulsharer.sharedSoullinks, src)
|
||||
soulsharer = null
|
||||
return ..()
|
||||
|
||||
/datum/soullink/proc/removeSoulsharer(mob/living/sharer)
|
||||
if(soulsharer == sharer)
|
||||
soulsharer = null
|
||||
LAZYREMOVE(sharer.sharedSoullinks, src)
|
||||
|
||||
//Used to assign variables, called primarily by soullink()
|
||||
//Override this to create more unique soullinks (Eg: 1->Many relationships)
|
||||
//Return TRUE/FALSE to return the soullink/null in soullink()
|
||||
/datum/soullink/proc/parseArgs(mob/living/owner, mob/living/sharer)
|
||||
if(!owner || !sharer)
|
||||
return FALSE
|
||||
soulowner = owner
|
||||
soulsharer = sharer
|
||||
LAZYADD(owner.ownedSoullinks, src)
|
||||
LAZYADD(sharer.sharedSoullinks, src)
|
||||
return TRUE
|
||||
|
||||
//Runs after /living death()
|
||||
//Override this for content
|
||||
/datum/soullink/proc/ownerDies(gibbed, mob/living/owner)
|
||||
|
||||
//Runs after /living death()
|
||||
//Override this for content
|
||||
/datum/soullink/proc/sharerDies(gibbed, mob/living/owner)
|
||||
|
||||
//Runs after /living update_revive()
|
||||
//Override this for content
|
||||
/datum/soullink/proc/ownerRevives(mob/living/owner)
|
||||
|
||||
//Runs after /living update_revive()
|
||||
//Override this for content
|
||||
/datum/soullink/proc/sharerRevives(mob/living/owner)
|
||||
|
||||
//Quick-use helper
|
||||
/proc/soullink(typepath, ...)
|
||||
var/datum/soullink/S = new typepath()
|
||||
if(S.parseArgs(arglist(args.Copy(2, 0))))
|
||||
return S
|
||||
|
||||
|
||||
|
||||
/////////////////
|
||||
// MULTISHARER //
|
||||
/////////////////
|
||||
//Abstract soullink for use with 1 Owner -> Many Sharer setups
|
||||
/datum/soullink/multisharer
|
||||
var/list/soulsharers
|
||||
|
||||
/datum/soullink/multisharer/parseArgs(mob/living/owner, list/sharers)
|
||||
if(!owner || !LAZYLEN(sharers))
|
||||
return FALSE
|
||||
soulowner = owner
|
||||
soulsharers = sharers
|
||||
LAZYADD(owner.ownedSoullinks, src)
|
||||
for(var/l in sharers)
|
||||
var/mob/living/L = l
|
||||
LAZYADD(L.sharedSoullinks, src)
|
||||
return TRUE
|
||||
|
||||
/datum/soullink/multisharer/removeSoulsharer(mob/living/sharer)
|
||||
LAZYREMOVE(soulsharers, sharer)
|
||||
|
||||
|
||||
|
||||
/////////////////
|
||||
// SHARED FATE //
|
||||
/////////////////
|
||||
//When the soulowner dies, the soulsharer dies, and vice versa
|
||||
//This is intended for two players(or AI) and two mobs
|
||||
|
||||
/datum/soullink/sharedfate/ownerDies(gibbed, mob/living/owner)
|
||||
if(soulsharer)
|
||||
soulsharer.death(gibbed)
|
||||
|
||||
/datum/soullink/sharedfate/sharerDies(gibbed, mob/living/sharer)
|
||||
if(soulowner)
|
||||
soulowner.death(gibbed)
|
||||
|
||||
/////////////////
|
||||
// Demon Bind //
|
||||
/////////////////
|
||||
//When the soulowner dies, the soulsharer dies, but NOT vice versa
|
||||
//This is intended for two players(or AI) and two mobs
|
||||
|
||||
/datum/soullink/oneway/ownerDies(gibbed, mob/living/owner)
|
||||
if(soulsharer)
|
||||
soulsharer.dust(FALSE)
|
||||
|
||||
/datum/soullink/oneway/devilfriend
|
||||
|
||||
/////////////////
|
||||
// SHARED BODY //
|
||||
/////////////////
|
||||
//When the soulsharer dies, they're placed in the soulowner, who remains alive
|
||||
//If the soulowner dies, the soulsharer is killed and placed into the soulowner (who is still dying)
|
||||
//This one is intended for one player moving between many mobs
|
||||
|
||||
/datum/soullink/sharedbody/ownerDies(gibbed, mob/living/owner)
|
||||
if(soulowner && soulsharer)
|
||||
if(soulsharer.mind)
|
||||
soulsharer.mind.transfer_to(soulowner)
|
||||
soulsharer.death(gibbed)
|
||||
|
||||
/datum/soullink/sharedbody/sharerDies(gibbed, mob/living/sharer)
|
||||
if(soulowner && soulsharer && soulsharer.mind)
|
||||
soulsharer.mind.transfer_to(soulowner)
|
||||
|
||||
|
||||
|
||||
//////////////////////
|
||||
// REPLACEMENT POOL //
|
||||
//////////////////////
|
||||
//When the owner dies, one of the sharers is placed in the owner's body, fully healed
|
||||
//Sort of a "winner-stays-on" soullink
|
||||
//Gibbing ends it immediately
|
||||
|
||||
/datum/soullink/multisharer/replacementpool/ownerDies(gibbed, mob/living/owner)
|
||||
if(LAZYLEN(soulsharers) && !gibbed) //let's not put them in some gibs
|
||||
var/list/souls = shuffle(soulsharers.Copy())
|
||||
for(var/l in souls)
|
||||
var/mob/living/L = l
|
||||
if(L.stat != DEAD && L.mind)
|
||||
L.mind.transfer_to(soulowner)
|
||||
soulowner.revive(TRUE, TRUE)
|
||||
L.death(FALSE)
|
||||
|
||||
//Lose your claim to the throne!
|
||||
/datum/soullink/multisharer/replacementpool/sharerDies(gibbed, mob/living/sharer)
|
||||
removeSoulsharer(sharer)
|
||||
|
||||
@@ -1,248 +0,0 @@
|
||||
/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork
|
||||
name = "Summon Pitchfork"
|
||||
desc = "A devil's weapon of choice. Use this to summon/unsummon your pitchfork."
|
||||
item_type = /obj/item/twohanded/pitchfork/demonic
|
||||
action_icon_state = "pitchfork"
|
||||
action_background_icon_state = "bg_demon"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/greater
|
||||
item_type = /obj/item/twohanded/pitchfork/demonic/greater
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/ascended
|
||||
item_type = /obj/item/twohanded/pitchfork/demonic/ascended
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/conjure_item/violin
|
||||
item_type = /obj/item/instrument/violin/golden
|
||||
desc = "A devil's instrument of choice. Use this to summon/unsummon your golden violin."
|
||||
invocation_type = "whisper"
|
||||
invocation = "I ain't have this much fun since Georgia."
|
||||
action_icon_state = "golden_violin"
|
||||
name = "Summon golden violin"
|
||||
action_background_icon_state = "bg_demon"
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/click/summon_contract
|
||||
name = "Summon infernal contract"
|
||||
desc = "Skip making a contract by hand, just do it by magic."
|
||||
invocation_type = "whisper"
|
||||
invocation = "Just sign on the dotted line."
|
||||
selection_activated_message = "<span class='notice'>You prepare a detailed contract. Click on a target to summon the contract in his hands.</span>"
|
||||
selection_deactivated_message = "<span class='notice'>You archive the contract for later use.</span>"
|
||||
include_user = FALSE
|
||||
range = 5
|
||||
auto_target_single = FALSE // Prevent an accidental contract from summoning
|
||||
click_radius = -1 // Precision clicking required
|
||||
allowed_type = /mob/living/carbon
|
||||
clothes_req = FALSE
|
||||
school = "conjuration"
|
||||
charge_max = 150
|
||||
cooldown_min = 10
|
||||
action_icon_state = "spell_default"
|
||||
action_background_icon_state = "bg_demon"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/click/summon_contract/cast(list/targets, mob/user = usr)
|
||||
for(var/target in targets)
|
||||
var/mob/living/carbon/C = target
|
||||
if(C.mind && user.mind)
|
||||
if(C.stat == DEAD)
|
||||
if(user.drop_item())
|
||||
var/obj/item/paper/contract/infernal/revive/contract = new(user.loc, C.mind, user.mind)
|
||||
user.put_in_hands(contract)
|
||||
else
|
||||
var/obj/item/paper/contract/infernal/contract
|
||||
var/contractTypeName = input(user, "What type of contract?") in list (CONTRACT_POWER, CONTRACT_WEALTH, CONTRACT_PRESTIGE, CONTRACT_MAGIC, CONTRACT_KNOWLEDGE, CONTRACT_FRIENDSHIP) //TODO: Refactor this to be less boilerplate-y
|
||||
switch(contractTypeName)
|
||||
if(CONTRACT_POWER)
|
||||
contract = new /obj/item/paper/contract/infernal/power(C.loc, C.mind, user.mind)
|
||||
if(CONTRACT_WEALTH)
|
||||
contract = new /obj/item/paper/contract/infernal/wealth(C.loc, C.mind, user.mind)
|
||||
if(CONTRACT_PRESTIGE)
|
||||
contract = new /obj/item/paper/contract/infernal/prestige(C.loc, C.mind, user.mind)
|
||||
if(CONTRACT_MAGIC)
|
||||
contract = new /obj/item/paper/contract/infernal/magic(C.loc, C.mind, user.mind)
|
||||
if(CONTRACT_KNOWLEDGE)
|
||||
contract = new /obj/item/paper/contract/infernal/knowledge(C.loc, C.mind, user.mind)
|
||||
if(CONTRACT_FRIENDSHIP)
|
||||
contract = new /obj/item/paper/contract/infernal/friendship(C.loc, C.mind, user.mind)
|
||||
C.put_in_hands(contract)
|
||||
else
|
||||
to_chat(user,"<span class='notice'>[C] seems to not be sentient. You are unable to summon a contract for them.</span>")
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/click/fireball/hellish
|
||||
name = "Hellfire"
|
||||
desc = "This spell launches hellfire at the target."
|
||||
school = "evocation"
|
||||
charge_max = 80
|
||||
clothes_req = FALSE
|
||||
invocation = "Your very soul will catch fire!"
|
||||
invocation_type = "shout"
|
||||
fireball_type = /obj/item/projectile/magic/fireball/infernal
|
||||
action_background_icon_state = "bg_demon"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/click/fireball/hellish/cast(list/targets, mob/living/user = usr)
|
||||
add_attack_logs(user, targets, "has fired a Hellfire ball", ATKLOG_FEW)
|
||||
.=..()
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/infernal_jaunt
|
||||
name = "Infernal Jaunt"
|
||||
desc = "Use hellfire to phase out of existence."
|
||||
charge_max = 200
|
||||
clothes_req = FALSE
|
||||
selection_type = "range"
|
||||
range = -1
|
||||
cooldown_min = 0
|
||||
overlay = null
|
||||
include_user = TRUE
|
||||
action_icon_state = "jaunt"
|
||||
action_background_icon_state = "bg_demon"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/infernal_jaunt/cast(list/targets, mob/living/user = usr)
|
||||
if(istype(user))
|
||||
if(istype(user.loc, /obj/effect/dummy/slaughter))
|
||||
var/continuing = 0
|
||||
if(istype(get_area(user), /area/shuttle)) // Can always phase in in a shuttle.
|
||||
continuing = TRUE
|
||||
else
|
||||
for(var/mob/living/C in orange(2, get_turf(user.loc))) //Can also phase in when nearby a potential buyer.
|
||||
if (C.mind && C.mind.soulOwner == C.mind)
|
||||
continuing = TRUE
|
||||
break
|
||||
if(continuing)
|
||||
to_chat(user,"<span class='warning'>You are now phasing in.</span>")
|
||||
if(do_mob(user,user,150))
|
||||
user.infernalphasein()
|
||||
else
|
||||
to_chat(user,"<span class='warning'>You can only re-appear near a potential signer or on a shuttle.</span>")
|
||||
revert_cast()
|
||||
return ..()
|
||||
else
|
||||
user.notransform = TRUE
|
||||
user.fakefire()
|
||||
to_chat(user,"<span class='warning'>You begin to phase back into sinful flames.</span>")
|
||||
if(do_mob(user,user,150))
|
||||
user.infernalphaseout()
|
||||
else
|
||||
to_chat(user,"<span class='warning'>You must remain still while exiting.</span>")
|
||||
user.ExtinguishMob()
|
||||
start_recharge()
|
||||
return
|
||||
revert_cast()
|
||||
|
||||
|
||||
/mob/living/proc/infernalphaseout()
|
||||
dust_animation()
|
||||
visible_message("<span class='warning'>[src] disappears in a flashfire!</span>")
|
||||
playsound(get_turf(src), 'sound/misc/enter_blood.ogg', 100, 1, -1)
|
||||
var/obj/effect/dummy/slaughter/s_holder = new(loc)
|
||||
ExtinguishMob()
|
||||
forceMove(s_holder)
|
||||
holder = s_holder
|
||||
notransform = FALSE
|
||||
fakefireextinguish()
|
||||
|
||||
/mob/living/proc/infernalphasein()
|
||||
if(notransform)
|
||||
to_chat(src,"<span class='warning'>You're too busy to jaunt in.</span>")
|
||||
return 0
|
||||
fakefire()
|
||||
forceMove(get_turf(src))
|
||||
visible_message("<span class='warning'><B>[src] appears in a firey blaze!</B></span>")
|
||||
playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1)
|
||||
spawn(15)
|
||||
fakefireextinguish(TRUE)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/sintouch
|
||||
name = "Sin Touch"
|
||||
desc = "Subtly encourage someone to sin."
|
||||
charge_max = 1800
|
||||
clothes_req = FALSE
|
||||
selection_type = "range"
|
||||
range = 2
|
||||
cooldown_min = 0
|
||||
overlay = null
|
||||
include_user = FALSE
|
||||
action_icon_state = "sintouch"
|
||||
action_background_icon_state = "bg_demon"
|
||||
random_target = TRUE
|
||||
random_target_priority = TARGET_RANDOM
|
||||
max_targets = 3
|
||||
invocation = "TASTE SIN AND INDULGE!!"
|
||||
invocation_type = "shout"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/sintouch/ascended
|
||||
name = "Greater sin touch"
|
||||
charge_max = 100
|
||||
range = 7
|
||||
max_targets = 10
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/sintouch/cast(list/targets, mob/living/user = usr)
|
||||
for(var/mob/living/carbon/human/H in targets)
|
||||
if(!H.mind)
|
||||
continue
|
||||
for(var/datum/objective/sintouched/A in H.mind.objectives)
|
||||
continue
|
||||
H.influenceSin()
|
||||
H.Weaken(2)
|
||||
H.Stun(2)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/summon_dancefloor
|
||||
name = "Summon Dancefloor"
|
||||
desc = "When what a Devil really needs is funk."
|
||||
include_user = TRUE
|
||||
range = -1
|
||||
clothes_req = FALSE
|
||||
|
||||
school = "conjuration"
|
||||
charge_max = 10
|
||||
cooldown_min = 50 //5 seconds, so the smoke can't be spammed
|
||||
action_icon_state = "funk"
|
||||
action_background_icon_state = "bg_demon"
|
||||
|
||||
var/list/dancefloor_turfs
|
||||
var/list/dancefloor_turfs_types
|
||||
var/dancefloor_exists = FALSE
|
||||
// var/datum/effect_system/smoke_spread/transparent/dancefloor_devil/smoke
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/summon_dancefloor/cast(list/targets, mob/user = usr)
|
||||
LAZYINITLIST(dancefloor_turfs)
|
||||
LAZYINITLIST(dancefloor_turfs_types)
|
||||
|
||||
/*
|
||||
if(!smoke)
|
||||
smoke = new()
|
||||
smoke.set_up(0, get_turf(user))
|
||||
smoke.start()
|
||||
*/
|
||||
|
||||
if(dancefloor_exists)
|
||||
dancefloor_exists = FALSE
|
||||
for(var/i in 1 to dancefloor_turfs.len)
|
||||
var/turf/T = dancefloor_turfs[i]
|
||||
T.ChangeTurf(dancefloor_turfs_types[i])
|
||||
else
|
||||
var/list/funky_turfs = RANGE_TURFS(1, user)
|
||||
for(var/turf/T in funky_turfs)
|
||||
if(T.density)
|
||||
to_chat(user, "<span class='warning'>You're too close to a wall.</span>")
|
||||
return
|
||||
dancefloor_exists = TRUE
|
||||
var/i = 1
|
||||
dancefloor_turfs.len = funky_turfs.len
|
||||
dancefloor_turfs_types.len = funky_turfs.len
|
||||
for(var/t in funky_turfs)
|
||||
var/turf/T = t
|
||||
dancefloor_turfs[i] = T
|
||||
dancefloor_turfs_types[i] = T.type
|
||||
T.ChangeTurf((i % 2 == 0) ? /turf/simulated/floor/light/colour_cycle/dancefloor_a : /turf/simulated/floor/light/colour_cycle/dancefloor_b)
|
||||
i++
|
||||
|
||||
/*
|
||||
/datum/effect_system/smoke_spread/transparent/dancefloor_devil
|
||||
effect_type = /obj/effect/particle_effect/smoke/transparent/dancefloor_devil
|
||||
|
||||
/obj/effect/particle_effect/smoke/transparent/dancefloor_devil
|
||||
lifetime = 2
|
||||
*/
|
||||
@@ -1,73 +0,0 @@
|
||||
/obj/effect/proc_holder/spell/targeted/summon_wealth
|
||||
name = "Summon wealth"
|
||||
desc = "The reward for selling your soul."
|
||||
invocation_type = "none"
|
||||
include_user = 1
|
||||
range = -1
|
||||
clothes_req = 0
|
||||
school = "conjuration"
|
||||
charge_max = 100
|
||||
cooldown_min = 10
|
||||
action_icon_state = "moneybag"
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/summon_wealth/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/carbon/C in targets)
|
||||
if(user.drop_item())
|
||||
var/obj/item = pick(
|
||||
new /obj/item/coin/gold(user.loc),
|
||||
new /obj/item/coin/diamond(user.loc),
|
||||
new /obj/item/coin/silver(user.loc),
|
||||
new /obj/item/stack/sheet/mineral/gold(user.loc),
|
||||
new /obj/item/stack/sheet/mineral/silver(user.loc),
|
||||
new /obj/item/stack/sheet/mineral/diamond(user.loc),
|
||||
new /obj/item/stack/spacecash/c1000(user.loc))
|
||||
C.put_in_hands(item)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/view_range
|
||||
name = "Distant vision"
|
||||
desc = "The reward for selling your soul."
|
||||
invocation_type = "none"
|
||||
include_user = 1
|
||||
range = -1
|
||||
clothes_req = 0
|
||||
charge_max = 50
|
||||
cooldown_min = 10
|
||||
action_icon_state = "camera_jump"
|
||||
var/ranges = list(7,8,9,10/*,11,12*/)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/view_range/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/C in targets)
|
||||
if(!C.client)
|
||||
continue
|
||||
C.client.view = input("Select view range:", "Range", 4) in ranges
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/summon_friend
|
||||
name = "Summon Friend"
|
||||
desc = "The reward for selling your soul."
|
||||
invocation_type = "none"
|
||||
include_user = 1
|
||||
range = -1
|
||||
clothes_req = 0
|
||||
charge_max = 50
|
||||
cooldown_min = 10
|
||||
action_icon_state = "sacredflame"
|
||||
var/mob/living/friend
|
||||
var/obj/effect/mob_spawn/human/demonic_friend/friendShell
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/summon_friend/cast(list/targets, mob/user = usr)
|
||||
if(!QDELETED(friend))
|
||||
to_chat(friend, "<span class='userdanger'>Your master has deemed you a poor friend. Your durance in hell will now resume.</span>")
|
||||
to_chat(user, "<span class='notice'>You banish your friend back to whence [friend.p_they()] came.</span>")
|
||||
friend.dust()
|
||||
qdel(friendShell)
|
||||
return
|
||||
if(!QDELETED(friendShell))
|
||||
qdel(friendShell)
|
||||
return
|
||||
for(var/C in targets)
|
||||
var/mob/living/L = C
|
||||
friendShell = new /obj/effect/mob_spawn/human/demonic_friend(L.loc, L.mind, src)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/conjure_item/spellpacket/robeless
|
||||
clothes_req = FALSE
|
||||
@@ -1,54 +0,0 @@
|
||||
/obj/effect/mob_spawn/human/demonic_friend
|
||||
name = "Essence of friendship"
|
||||
desc = "Oh boy! Oh boy! A friend!"
|
||||
mob_name = "Demonic friend"
|
||||
icon = 'icons/obj/cardboard_cutout.dmi'
|
||||
icon_state = "cutout_basic"
|
||||
outfit = /datum/outfit/demonic_friend
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
random = TRUE
|
||||
id_job = "SuperFriend"
|
||||
id_access = "assistant"
|
||||
var/obj/effect/proc_holder/spell/targeted/summon_friend/spell
|
||||
var/datum/mind/owner
|
||||
assignedrole = "SuperFriend"
|
||||
|
||||
/obj/effect/mob_spawn/human/demonic_friend/Initialize(mapload, datum/mind/owner_mind, obj/effect/proc_holder/spell/targeted/summon_friend/summoning_spell)
|
||||
. = ..()
|
||||
owner = owner_mind
|
||||
description = "Be someone's loyal friend/slave. If they die, you die as well." //best I could think of in the moment, not sure how this role plays in practise, have never seen it.
|
||||
flavour_text = "You have been given a reprieve from your eternity of torment, to be [owner.name]'s friend for [owner.p_their()] short mortal coil. Be aware that if you do not live up to [owner.name]'s expectations, [owner.p_they()] can send you back to hell with a single thought. [owner.name]'s death will also return you to hell."
|
||||
var/area/A = get_area(src)
|
||||
if(!mapload && A)
|
||||
notify_ghosts("\A friendship shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = TRUE)
|
||||
objectives = "Be [owner.name]'s friend, and keep [owner.name] alive, so you don't get sent back to hell."
|
||||
spell = summoning_spell
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/demonic_friend/special(mob/living/L)
|
||||
if(!QDELETED(owner.current) && owner.current.stat != DEAD)
|
||||
L.real_name = "[owner.name]'s best friend"
|
||||
L.name = L.real_name
|
||||
soullink(/datum/soullink/oneway/devilfriend, owner.current, L)
|
||||
spell.friend = L
|
||||
spell.charge_counter = spell.charge_max
|
||||
L.mind.hasSoul = FALSE
|
||||
var/mob/living/carbon/human/H = L
|
||||
var/obj/item/worn = H.wear_id
|
||||
var/obj/item/card/id/id = worn.GetID()
|
||||
id.registered_name = L.real_name
|
||||
id.update_label()
|
||||
to_chat(owner.current, "<span class='notice'>Your friend has arrived!</span>")
|
||||
else
|
||||
to_chat(L, "<span class='userdanger'>Your owner is already dead! You will soon perish.</span>")
|
||||
addtimer(CALLBACK(L, /mob.proc/dust), 150) //Give em a few seconds as a mercy.
|
||||
|
||||
/datum/outfit/demonic_friend
|
||||
name = "Demonic Friend"
|
||||
uniform = /obj/item/clothing/under/assistantformal
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
r_pocket = /obj/item/radio/off
|
||||
back = /obj/item/storage/backpack
|
||||
implants = list(/obj/item/implant/mindshield) //No revolutionaries, he's MY friend.
|
||||
id = /obj/item/card/id
|
||||
@@ -1,48 +0,0 @@
|
||||
GLOBAL_LIST_INIT(whiteness, list(
|
||||
/obj/item/clothing/under/color/white = 2,
|
||||
/obj/item/clothing/under/rank/bartender = 1,
|
||||
/obj/item/clothing/under/rank/chef = 1,
|
||||
/obj/item/clothing/under/rank/chief_engineer = 1,
|
||||
/obj/item/clothing/under/rank/scientist = 1,
|
||||
/obj/item/clothing/under/rank/chemist = 1,
|
||||
/obj/item/clothing/under/rank/chief_medical_officer = 1,
|
||||
/obj/item/clothing/under/rank/geneticist = 1,
|
||||
/obj/item/clothing/under/rank/virologist = 1,
|
||||
/obj/item/clothing/under/rank/nursesuit = 1,
|
||||
/obj/item/clothing/under/rank/medical = 1,
|
||||
/obj/item/clothing/under/rank/psych = 1,
|
||||
/obj/item/clothing/under/rank/orderly = 1,
|
||||
/obj/item/clothing/under/rank/security/brigphys = 1,
|
||||
/obj/item/clothing/under/rank/internalaffairs = 1,
|
||||
/obj/item/clothing/under/rank/ntrep = 1,
|
||||
/obj/item/clothing/under/det = 1,
|
||||
/obj/item/clothing/under/wedding/bride_white = 1,
|
||||
/obj/item/clothing/under/mafia/white = 1,
|
||||
/obj/item/clothing/under/noble_clothes = 1,
|
||||
/obj/item/clothing/under/sl_suit = 1,
|
||||
/obj/item/clothing/under/burial = 1
|
||||
))
|
||||
|
||||
|
||||
|
||||
/mob/living/proc/check_devil_bane_multiplier(obj/item/weapon, mob/living/attacker)
|
||||
switch(mind.devilinfo.bane)
|
||||
if(BANE_WHITECLOTHES)
|
||||
if(istype(attacker, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = attacker
|
||||
if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under))
|
||||
var/obj/item/clothing/under/U = H.w_uniform
|
||||
if(GLOB.whiteness[U.type])
|
||||
src.visible_message("<span class='warning'>[src] seems to have been harmed by the purity of [attacker]'s clothes.</span>", "<span class='notice'>Unsullied white clothing is disrupting your form.</span>")
|
||||
return GLOB.whiteness[U.type] + 1
|
||||
if(BANE_TOOLBOX)
|
||||
if(istype(weapon,/obj/item/storage/toolbox))
|
||||
src.visible_message("<span class='warning'>The [weapon] seems unusually robust this time.</span>", "<span class='notice'>The [weapon] is your unmaking!</span>")
|
||||
return 2.5 // Will take four hits with a normal toolbox.
|
||||
if(BANE_HARVEST)
|
||||
if(istype(weapon,/obj/item/reagent_containers/food/snacks/grown/) || istype(weapon,/obj/item/grown))
|
||||
src.visible_message("<span class='warning'>The spirits of the harvest aid in the exorcism.</span>", "<span class='notice'>The harvest spirits are harming you.</span>")
|
||||
src.Weaken(2)
|
||||
qdel(weapon)
|
||||
return 2
|
||||
return 1
|
||||
@@ -1,38 +0,0 @@
|
||||
/datum/game_mode/devil/devil_agents
|
||||
name = "Devil Agents"
|
||||
config_tag = "devilagents"
|
||||
required_players = 25
|
||||
required_enemies = 3
|
||||
recommended_enemies = 8
|
||||
|
||||
traitors_possible = 10 //hard limit on traitors if scaling is turned off
|
||||
num_modifier = 4
|
||||
objective_count = 2
|
||||
|
||||
var/list/target_list = list()
|
||||
var/list/late_joining_list = list()
|
||||
minimum_devils = 3
|
||||
|
||||
/datum/game_mode/devil/devil_agents/post_setup()
|
||||
var/i = 0
|
||||
for(var/datum/mind/devil in devils)
|
||||
i++
|
||||
if(i + 1 > devils.len)
|
||||
i = 0
|
||||
target_list[devil] = devils[i + 1]
|
||||
..()
|
||||
|
||||
/datum/game_mode/devil/devil_agents/forge_devil_objectives(datum/mind/devil_mind, quantity)
|
||||
..(devil_mind, quantity - give_outsell_objective(devil_mind))
|
||||
|
||||
/datum/game_mode/devil/devil_agents/proc/give_outsell_objective(datum/mind/devil)
|
||||
//If you override this method, have it return the number of objectives added.
|
||||
if(target_list.len && target_list[devil]) // Is a double agent
|
||||
var/datum/mind/target_mind = target_list[devil]
|
||||
var/datum/objective/devil/outsell/outsellobjective = new
|
||||
outsellobjective.owner = devil
|
||||
outsellobjective.target = target_mind
|
||||
outsellobjective.update_explanation_text()
|
||||
devil.objectives += outsellobjective
|
||||
return 1
|
||||
return 0
|
||||
@@ -1,67 +0,0 @@
|
||||
/datum/game_mode/devil
|
||||
name = "devil"
|
||||
config_tag = "devil"
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate",
|
||||
"Internal Affairs Agent", "Librarian", "Chaplain", "Head of Security", "Captain", "Brig Physician",
|
||||
"Nanotrasen Navy Officer", "Special Operations Officer", "AI", "Cyborg")
|
||||
required_players = 2
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
|
||||
var/traitors_possible = 4 //hard limit on devils if scaling is turned off
|
||||
var/num_modifier = 0 // Used for gamemodes, that are a child of traitor, that need more than the usual.
|
||||
var/objective_count = 2
|
||||
var/minimum_devils = 1
|
||||
var/devil_scale_coefficient = 10
|
||||
|
||||
/datum/game_mode/devil/announce()
|
||||
to_chat(world, {"<B>The current game mode is - Devil!</B><br>)
|
||||
<span class='danger'>Devils</span>: Purchase souls and tempt the crew to sin!<br>
|
||||
<span class='notice'>Crew</span>: Resist the lure of sin and remain pure!"})
|
||||
|
||||
/datum/game_mode/devil/pre_setup()
|
||||
|
||||
if(config.protect_roles_from_antagonist)
|
||||
restricted_jobs += protected_jobs
|
||||
|
||||
var/list/possible_devils = get_players_for_role(ROLE_DEVIL)
|
||||
var/num_devils = 0
|
||||
if(!possible_devils.len)
|
||||
return 0
|
||||
if(config.traitor_scaling)
|
||||
num_devils = max(1, round((num_players())/(devil_scale_coefficient))+1)
|
||||
else
|
||||
num_devils = max(1, min(num_players(), traitors_possible))
|
||||
|
||||
|
||||
for(var/j = 0, j < num_devils, j++)
|
||||
if (!possible_devils.len)
|
||||
break
|
||||
var/datum/mind/devil = pick(possible_devils)
|
||||
devils += devil
|
||||
devil.special_role = ROLE_DEVIL
|
||||
devil.restricted_roles = restricted_jobs
|
||||
|
||||
log_game("[devil.key] (ckey) has been selected as a [config_tag]")
|
||||
possible_devils.Remove(devil)
|
||||
|
||||
if(devils.len < required_enemies)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/devil/post_setup()
|
||||
for(var/datum/mind/devil in devils)
|
||||
spawn(rand(10, 100))
|
||||
finalize_devil(devil, TRUE)
|
||||
spawn(100)
|
||||
forge_devil_objectives(devil, objective_count) //This has to be in a separate loop, as we need devil names to be generated before we give objectives in devil agent.
|
||||
devil.devilinfo.announce_laws(devil.current)
|
||||
var/obj_count = 1
|
||||
to_chat(devil.current, "<span class='notice'> Your current objectives:</span>")
|
||||
for(var/datum/objective/objective in devil.objectives)
|
||||
to_chat(devil.current, "<B>Objective #[obj_count]</B>: [objective.explanation_text]")
|
||||
obj_count++
|
||||
modePlayer += devils
|
||||
..()
|
||||
return 1
|
||||
@@ -1,559 +0,0 @@
|
||||
#define BLOOD_THRESHOLD 3 //How many souls are needed per stage.
|
||||
#define TRUE_THRESHOLD 7
|
||||
#define ARCH_THRESHOLD 12
|
||||
|
||||
#define BASIC_DEVIL 0
|
||||
#define BLOOD_LIZARD 1
|
||||
#define TRUE_DEVIL 2
|
||||
#define ARCH_DEVIL 3
|
||||
|
||||
#define LOSS_PER_DEATH 2
|
||||
|
||||
#define SOULVALUE (soulsOwned.len-reviveNumber)
|
||||
|
||||
#define DEVILRESURRECTTIME 600
|
||||
|
||||
GLOBAL_LIST_EMPTY(allDevils)
|
||||
GLOBAL_LIST_INIT(lawlorify, list (
|
||||
LORE = list(
|
||||
OBLIGATION_FOOD = "This devil seems to always offer it's victims food before slaughtering them.",
|
||||
OBLIGATION_FIDDLE = "This devil will never turn down a musical challenge.",
|
||||
OBLIGATION_DANCEOFF = "This devil will never turn down a dance off.",
|
||||
OBLIGATION_GREET = "This devil seems to only be able to converse with people it knows the name of.",
|
||||
OBLIGATION_PRESENCEKNOWN = "This devil seems to be unable to attack from stealth.",
|
||||
OBLIGATION_SAYNAME = "He will always chant his name upon killing someone.",
|
||||
OBLIGATION_ANNOUNCEKILL = "This devil always loudly announces his kills for the world to hear.",
|
||||
OBLIGATION_ANSWERTONAME = "This devil always responds to his truename.",
|
||||
BANE_SILVER = "Silver seems to gravely injure this devil.",
|
||||
BANE_SALT = "Throwing salt at this devil will hinder his ability to use infernal powers temporarily.",
|
||||
BANE_LIGHT = "Bright flashes will disorient the devil, likely causing him to flee.",
|
||||
BANE_IRON = "Cold iron will slowly injure him, until he can purge it from his system.",
|
||||
BANE_WHITECLOTHES = "Wearing clean white clothing will help ward off this devil.",
|
||||
BANE_HARVEST = "Presenting the labors of a harvest will disrupt the devil.",
|
||||
BANE_TOOLBOX = "That which holds the means of creation also holds the means of the devil's undoing.",
|
||||
BAN_HURTWOMAN = "This devil seems to prefer hunting men.",
|
||||
BAN_CHAPEL = "This devil avoids holy ground.",
|
||||
BAN_HURTPRIEST = "The anointed clergy appear to be immune to his powers.",
|
||||
BAN_AVOIDWATER = "The devil seems to have some sort of aversion to water, though it does not appear to harm him.",
|
||||
BAN_STRIKEUNCONCIOUS = "This devil only shows interest in those who are awake.",
|
||||
BAN_HURTLIZARD = "This devil will not strike an Unathi first.",
|
||||
BAN_HURTANIMAL = "This devil avoids hurting animals.",
|
||||
BANISH_WATER = "To banish the devil, you must infuse it's body with holy water.",
|
||||
BANISH_COFFIN = "This devil will return to life if it's remains are not placed within a coffin.",
|
||||
BANISH_FORMALDYHIDE = "To banish the devil, you must inject it's lifeless body with embalming fluid.",
|
||||
BANISH_RUNES = "This devil will resurrect after death, unless it's remains are within a rune.",
|
||||
BANISH_CANDLES = "A large number of nearby lit candles will prevent it from resurrecting.",
|
||||
BANISH_DESTRUCTION = "It's corpse must be utterly destroyed to prevent resurrection.",
|
||||
BANISH_FUNERAL_GARB = "If clad in funeral garments, this devil will be unable to resurrect. Should the clothes not fit, lay them gently on top of the devil's corpse."
|
||||
),
|
||||
LAW = list(
|
||||
OBLIGATION_FOOD = "When not acting in self defense, you must always offer your victim food before harming them.",
|
||||
OBLIGATION_FIDDLE = "When not in immediate danger, if you are challenged to a musical duel, you must accept it. You are not obligated to duel the same person twice.",
|
||||
OBLIGATION_DANCEOFF = "When not in immediate danger, if you are challenged to a dance off, you must accept it. You are not obligated to face off with the same person twice.",
|
||||
OBLIGATION_GREET = "You must always greet other people by their last name before talking with them.",
|
||||
OBLIGATION_PRESENCEKNOWN = "You must always make your presence known before attacking.",
|
||||
OBLIGATION_SAYNAME = "You must always say your true name after you kill someone.",
|
||||
OBLIGATION_ANNOUNCEKILL = "Upon killing someone, you must make your deed known to all within earshot, over comms if reasonably possible.",
|
||||
OBLIGATION_ANSWERTONAME = "If you are not under attack, you must always respond to your true name.",
|
||||
BAN_HURTWOMAN = "You must never harm a female outside of self defense.",
|
||||
BAN_CHAPEL = "You must never attempt to enter the chapel.",
|
||||
BAN_HURTPRIEST = "You must never attack a priest.",
|
||||
BAN_AVOIDWATER = "You must never willingly touch a wet surface.",
|
||||
BAN_STRIKEUNCONCIOUS = "You must never strike an unconscious person.",
|
||||
BAN_HURTLIZARD = "You must never harm an Unathi outside of self defense.",
|
||||
BAN_HURTANIMAL = "You must never harm a non-sentient creature or robot outside of self defense.",
|
||||
BANE_SILVER = "Silver, in all of it's forms shall be your downfall.",
|
||||
BANE_SALT = "Salt will disrupt your magical abilities.",
|
||||
BANE_LIGHT = "Blinding lights will prevent you from using offensive powers for a time.",
|
||||
BANE_IRON = "Cold wrought iron shall act as poison to you.",
|
||||
BANE_WHITECLOTHES = "Those clad in pristine white garments will strike you true.",
|
||||
BANE_HARVEST = "The fruits of the harvest shall be your downfall.",
|
||||
BANE_TOOLBOX = "Toolboxes are bad news for you, for some reason.",
|
||||
BANISH_WATER = "If your corpse is filled with holy water, you will be unable to resurrect.",
|
||||
BANISH_COFFIN = "If your corpse is in a coffin, you will be unable to resurrect.",
|
||||
BANISH_FORMALDYHIDE = "If your corpse is embalmed, you will be unable to resurrect.",
|
||||
BANISH_RUNES = "If your corpse is placed within a rune, you will be unable to resurrect.",
|
||||
BANISH_CANDLES = "If your corpse is near lit candles, you will be unable to resurrect.",
|
||||
BANISH_DESTRUCTION = "If your corpse is destroyed, you will be unable to resurrect.",
|
||||
BANISH_FUNERAL_GARB = "If your corpse is clad in funeral garments, you will be unable to resurrect."
|
||||
)
|
||||
))
|
||||
|
||||
/datum/devilinfo
|
||||
var/datum/mind/owner = null
|
||||
var/obligation
|
||||
var/ban
|
||||
var/bane
|
||||
var/banish
|
||||
var/truename
|
||||
var/list/datum/mind/soulsOwned = new
|
||||
var/datum/dna/humanform = null
|
||||
var/reviveNumber = 0
|
||||
var/form = BASIC_DEVIL
|
||||
var/exists = 0
|
||||
var/static/list/dont_remove_spells = list(
|
||||
/obj/effect/proc_holder/spell/targeted/click/summon_contract,
|
||||
/obj/effect/proc_holder/spell/targeted/conjure_item/violin,
|
||||
/obj/effect/proc_holder/spell/targeted/summon_dancefloor)
|
||||
var/ascendable = FALSE
|
||||
|
||||
/datum/devilinfo/New()
|
||||
..()
|
||||
dont_remove_spells = typecacheof(dont_remove_spells)
|
||||
|
||||
/proc/randomDevilInfo(name = randomDevilName())
|
||||
var/datum/devilinfo/devil = new
|
||||
devil.truename = name
|
||||
devil.bane = randomdevilbane()
|
||||
devil.obligation = randomdevilobligation()
|
||||
devil.ban = randomdevilban()
|
||||
devil.banish = randomdevilbanish()
|
||||
return devil
|
||||
|
||||
/proc/devilInfo(name, saveDetails = 0)
|
||||
if(GLOB.allDevils[lowertext(name)])
|
||||
return GLOB.allDevils[lowertext(name)]
|
||||
else
|
||||
var/datum/devilinfo/devil = randomDevilInfo(name)
|
||||
GLOB.allDevils[lowertext(name)] = devil
|
||||
devil.exists = saveDetails
|
||||
return devil
|
||||
|
||||
|
||||
|
||||
/proc/randomDevilName()
|
||||
var/preTitle = ""
|
||||
var/title = ""
|
||||
var/mainName = ""
|
||||
var/suffix = ""
|
||||
if(prob(65))
|
||||
if(prob(35))
|
||||
preTitle = pick("Dark ", "Hellish ", "Fiery ", "Sinful ", "Blood ")
|
||||
title = pick("Lord ", "Fallen Prelate ", "Count ", "Viscount ", "Vizier ", "Elder ", "Adept ")
|
||||
var/probability = 100
|
||||
mainName = pick("Hal", "Ve", "Odr", "Neit", "Ci", "Quon", "Mya", "Folth", "Wren", "Gyer", "Geyr", "Hil", "Niet", "Twou", "Hu", "Don")
|
||||
while(prob(probability))
|
||||
mainName += pick("hal", "ve", "odr", "neit", "ca", "quon", "mya", "folth", "wren", "gyer", "geyr", "hil", "niet", "twoe", "phi", "coa")
|
||||
probability -= 20
|
||||
if(prob(40))
|
||||
suffix = pick(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr.")
|
||||
return preTitle + title + mainName + suffix
|
||||
|
||||
/proc/randomdevilobligation()
|
||||
return pick(OBLIGATION_FOOD, OBLIGATION_FIDDLE, OBLIGATION_DANCEOFF, OBLIGATION_GREET, OBLIGATION_PRESENCEKNOWN, OBLIGATION_SAYNAME, OBLIGATION_ANNOUNCEKILL, OBLIGATION_ANSWERTONAME)
|
||||
|
||||
/proc/randomdevilban()
|
||||
return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL)
|
||||
|
||||
/proc/randomdevilbane()
|
||||
return pick(BANE_SALT, BANE_LIGHT, BANE_IRON, BANE_WHITECLOTHES, BANE_SILVER, BANE_HARVEST, BANE_TOOLBOX)
|
||||
|
||||
/proc/randomdevilbanish()
|
||||
return pick(BANISH_WATER, BANISH_COFFIN, BANISH_FORMALDYHIDE, BANISH_RUNES, BANISH_CANDLES, BANISH_DESTRUCTION, BANISH_FUNERAL_GARB)
|
||||
|
||||
/datum/devilinfo/proc/link_with_mob(mob/living/L)
|
||||
if(istype(L, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = L
|
||||
humanform = H.dna.Clone()
|
||||
owner = L.mind
|
||||
give_base_spells(1)
|
||||
|
||||
/datum/devilinfo/proc/add_soul(datum/mind/soul)
|
||||
if(soulsOwned.Find(soul))
|
||||
return
|
||||
soulsOwned += soul
|
||||
owner.current.set_nutrition(NUTRITION_LEVEL_FULL)
|
||||
to_chat(owner.current, "<span class='warning'>You feel satiated as you received a new soul.</span>")
|
||||
update_hud()
|
||||
switch(SOULVALUE)
|
||||
if(0)
|
||||
to_chat(owner.current, "<span class='warning'>Your hellish powers have been restored.</span>")
|
||||
give_base_spells()
|
||||
if(BLOOD_THRESHOLD)
|
||||
to_chat(owner.current, "<span class='warning'>You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard.</span>")
|
||||
sleep(50)
|
||||
increase_blood_lizard()
|
||||
if(TRUE_THRESHOLD)
|
||||
to_chat(owner.current, "<span class='warning'>You feel as though your current form is about to shed. You will soon turn into a true devil.</span>")
|
||||
sleep(50)
|
||||
increase_true_devil()
|
||||
if(ARCH_THRESHOLD)
|
||||
arch_devil_prelude()
|
||||
increase_arch_devil()
|
||||
|
||||
/datum/devilinfo/proc/remove_soul(datum/mind/soul)
|
||||
if(soulsOwned.Remove(soul))
|
||||
to_chat(owner.current, "<span class='warning'>You feel as though a soul has slipped from your grasp.</span>")
|
||||
check_regression()
|
||||
update_hud()
|
||||
|
||||
/datum/devilinfo/proc/check_regression()
|
||||
if(form == ARCH_DEVIL)
|
||||
return //arch devil can't regress
|
||||
//Yes, fallthrough behavior is intended, so I can't use a switch statement.
|
||||
if(form == TRUE_DEVIL && SOULVALUE < TRUE_THRESHOLD)
|
||||
regress_blood_lizard()
|
||||
if(form == BLOOD_LIZARD && SOULVALUE < BLOOD_THRESHOLD)
|
||||
regress_humanoid()
|
||||
if(SOULVALUE < 0)
|
||||
remove_spells()
|
||||
to_chat(owner.current, "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked.</span>")
|
||||
|
||||
/datum/devilinfo/proc/regress_humanoid()
|
||||
to_chat(owner.current, "<span class='warning'>Your powers weaken, have more contracts be signed to regain power.</span>")
|
||||
if(istype(owner.current, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
if(humanform)
|
||||
H.set_species(humanform.species)
|
||||
H.dna = humanform.Clone()
|
||||
H.sync_organ_dna(assimilate = 0)
|
||||
else
|
||||
H.set_species(/datum/species/human)
|
||||
// TODO: Add some appearance randomization here or something
|
||||
humanform = H.dna.Clone()
|
||||
H.regenerate_icons()
|
||||
else
|
||||
owner.current.color = ""
|
||||
give_base_spells()
|
||||
if(istype(owner.current.loc, /obj/effect/dummy/slaughter))
|
||||
owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted.
|
||||
form = BASIC_DEVIL
|
||||
|
||||
/datum/devilinfo/proc/regress_blood_lizard()
|
||||
var/mob/living/carbon/true_devil/D = owner.current
|
||||
to_chat(D, "<span class='warning'>Your powers weaken, have more contracts be signed to regain power.</span>")
|
||||
D.oldform.loc = D.loc
|
||||
owner.transfer_to(D.oldform)
|
||||
D.oldform.status_flags &= ~GODMODE
|
||||
give_lizard_spells()
|
||||
qdel(D)
|
||||
form = BLOOD_LIZARD
|
||||
update_hud()
|
||||
|
||||
|
||||
/datum/devilinfo/proc/increase_blood_lizard()
|
||||
if(ishuman(owner.current))
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
var/list/language_temp = H.languages.Copy()
|
||||
H.set_species(/datum/species/unathi)
|
||||
H.languages = language_temp
|
||||
H.underwear = "Nude"
|
||||
H.undershirt = "Nude"
|
||||
H.socks = "Nude"
|
||||
H.change_skin_color(80, 16, 16) //A deep red
|
||||
H.regenerate_icons()
|
||||
else //Did the devil get hit by a staff of transmutation?
|
||||
owner.current.color = "#501010"
|
||||
give_lizard_spells()
|
||||
form = BLOOD_LIZARD
|
||||
|
||||
|
||||
|
||||
/datum/devilinfo/proc/increase_true_devil()
|
||||
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc, owner.current)
|
||||
A.faction |= "hell"
|
||||
// Put the old body in stasis
|
||||
owner.current.status_flags |= GODMODE
|
||||
owner.current.loc = A
|
||||
A.oldform = owner.current
|
||||
owner.transfer_to(A)
|
||||
A.set_name()
|
||||
give_true_spells()
|
||||
form = TRUE_DEVIL
|
||||
update_hud()
|
||||
|
||||
/datum/devilinfo/proc/arch_devil_prelude()
|
||||
if(!ascendable)
|
||||
return
|
||||
var/mob/living/carbon/true_devil/D = owner.current
|
||||
to_chat(D, "<span class='warning'>You feel as though your form is about to ascend.</span>")
|
||||
sleep(50)
|
||||
if(!D)
|
||||
return
|
||||
D.visible_message("<span class='warning'>[D]'s skin begins to erupt with spikes.</span>", \
|
||||
"<span class='warning'>Your flesh begins creating a shield around yourself.</span>")
|
||||
sleep(100)
|
||||
if(!D)
|
||||
return
|
||||
D.visible_message("<span class='warning'>The horns on [D]'s head slowly grow and elongate.</span>", \
|
||||
"<span class='warning'>Your body continues to mutate. Your telepathic abilities grow.</span>")
|
||||
sleep(90)
|
||||
if(!D)
|
||||
return
|
||||
D.visible_message("<span class='warning'>[D]'s body begins to violently stretch and contort.</span>", \
|
||||
"<span class='warning'>You begin to rend apart the final barriers to ultimate power.</span>")
|
||||
sleep(40)
|
||||
if(!D)
|
||||
return
|
||||
to_chat(D, "<span class='sinister'>Yes!</span>")
|
||||
sleep(10)
|
||||
if(!D)
|
||||
return
|
||||
to_chat(D, "<span class='big sinister'>YES!!</span>")
|
||||
sleep(10)
|
||||
if(!D)
|
||||
return
|
||||
to_chat(D, "<span class='reallybig sinister'>YE--</span>")
|
||||
sleep(1)
|
||||
if(!D)
|
||||
return
|
||||
to_chat(world, "<font size=5><span class='danger'>SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!</span></font>")
|
||||
SEND_SOUND(world, sound('sound/hallucinations/veryfar_noise.ogg'))
|
||||
sleep(50)
|
||||
if(!SSticker.mode.devil_ascended)
|
||||
SSshuttle.emergency.request(null, 0.3)
|
||||
SSticker.mode.devil_ascended++
|
||||
|
||||
/datum/devilinfo/proc/increase_arch_devil()
|
||||
if(!ascendable)
|
||||
return
|
||||
var/mob/living/carbon/true_devil/D = owner.current
|
||||
if(!istype(D))
|
||||
return
|
||||
give_arch_spells()
|
||||
D.convert_to_archdevil()
|
||||
if(istype(D.loc, /obj/effect/dummy/slaughter))
|
||||
D.forceMove(get_turf(D))
|
||||
var/area/A = get_area(owner.current)
|
||||
if(A)
|
||||
notify_ghosts("An arch devil has ascended in [A.name]. Reach out to the devil to start climbing the infernal corporate ladder.", title = "Arch Devil Ascended", source = owner.current, action = NOTIFY_ATTACK)
|
||||
form = ARCH_DEVIL
|
||||
|
||||
/datum/devilinfo/proc/remove_spells()
|
||||
for(var/X in owner.spell_list)
|
||||
var/obj/effect/proc_holder/spell/S = X
|
||||
if(!is_type_in_typecache(S, dont_remove_spells))
|
||||
owner.RemoveSpell(S)
|
||||
|
||||
/datum/devilinfo/proc/give_summon_contract()
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/click/summon_contract(null))
|
||||
|
||||
|
||||
/datum/devilinfo/proc/give_base_spells(give_summon_contract = 0)
|
||||
remove_spells()
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/click/fireball/hellish(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork(null))
|
||||
if(give_summon_contract)
|
||||
give_summon_contract()
|
||||
if(obligation == OBLIGATION_FIDDLE)
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/violin(null))
|
||||
if(obligation == OBLIGATION_DANCEOFF)
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_dancefloor(null))
|
||||
|
||||
/datum/devilinfo/proc/give_lizard_spells()
|
||||
remove_spells()
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/click/fireball/hellish(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
|
||||
|
||||
/datum/devilinfo/proc/give_true_spells()
|
||||
remove_spells()
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/greater(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/click/fireball/hellish(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch(null))
|
||||
|
||||
/datum/devilinfo/proc/give_arch_spells()
|
||||
remove_spells()
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/ascended(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch/ascended(null))
|
||||
|
||||
/datum/devilinfo/proc/beginResurrectionCheck(mob/living/body)
|
||||
if(owner.current != body)
|
||||
body = owner.current
|
||||
if(SOULVALUE > 0)
|
||||
to_chat(owner.current, "<span class='userdanger'>Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon.</span>")
|
||||
addtimer(CALLBACK(src, "activateResurrection", body), DEVILRESURRECTTIME)
|
||||
else
|
||||
to_chat(owner.messageable_mob(), "<span class='userdanger'>Your hellish powers are too weak to resurrect yourself.</span>")
|
||||
|
||||
/datum/devilinfo/proc/activateResurrection(mob/living/body)
|
||||
if(QDELETED(body) || body.stat == DEAD)
|
||||
if(SOULVALUE > 0)
|
||||
if(check_banishment(body))
|
||||
to_chat(owner.messageable_mob(), "<span class='userdanger'>Unfortunately, the mortals have finished a ritual that prevents your resurrection.</span>")
|
||||
return -1
|
||||
else
|
||||
to_chat(owner.messageable_mob(), "<span class='userdanger'>WE LIVE AGAIN!</span>")
|
||||
return hellish_resurrection(body)
|
||||
else
|
||||
to_chat(owner.messageable_mob(), "<span class='userdanger'>Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.</span>")
|
||||
return -1
|
||||
else
|
||||
to_chat(owner.current, "<span class='danger'>You seem to have resurrected without your hellish powers.</span>")
|
||||
|
||||
/datum/devilinfo/proc/check_banishment(mob/living/body)
|
||||
switch(banish)
|
||||
if(BANISH_WATER)
|
||||
if(!QDELETED(body) && iscarbon(body))
|
||||
var/mob/living/carbon/H = body
|
||||
return H.reagents.has_reagent("holy water")
|
||||
return 0
|
||||
if(BANISH_COFFIN)
|
||||
return (!QDELETED(body) && istype(body.loc, /obj/structure/closet/coffin))
|
||||
if(BANISH_FORMALDYHIDE)
|
||||
if(!QDELETED(body) && iscarbon(body))
|
||||
var/mob/living/carbon/H = body
|
||||
return H.reagents.has_reagent("formaldehyde")
|
||||
return 0
|
||||
if(BANISH_RUNES)
|
||||
if(!QDELETED(body))
|
||||
for(var/obj/effect/decal/cleanable/crayon/R in range(0,body))
|
||||
if (R.name == "rune")
|
||||
return 1
|
||||
return 0
|
||||
if(BANISH_CANDLES)
|
||||
if(!QDELETED(body))
|
||||
var/count = 0
|
||||
for(var/obj/item/candle/C in range(1,body))
|
||||
count += C.lit
|
||||
if(count>=4)
|
||||
return 1
|
||||
return 0
|
||||
if(BANISH_DESTRUCTION)
|
||||
if(!QDELETED(body))
|
||||
return 0
|
||||
return 1
|
||||
if(BANISH_FUNERAL_GARB)
|
||||
if(!QDELETED(body) && iscarbon(body))
|
||||
var/mob/living/carbon/human/H = body
|
||||
if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under/burial))
|
||||
return 1
|
||||
return 0
|
||||
else
|
||||
for(var/obj/item/clothing/under/burial/B in range(0,body))
|
||||
if(B.loc == get_turf(B)) //Make sure it's not in someone's inventory or something.
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/devilinfo/proc/hellish_resurrection(mob/living/body)
|
||||
message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.</a>")
|
||||
if(SOULVALUE <= ARCH_THRESHOLD && ascendable) // once ascended, arch devils do not go down in power by any means.
|
||||
reviveNumber += LOSS_PER_DEATH
|
||||
update_hud()
|
||||
if(!QDELETED(body))
|
||||
body.revive()
|
||||
if(!body.client)
|
||||
var/mob/dead/observer/O = owner.get_ghost()
|
||||
O.reenter_corpse()
|
||||
if(istype(body.loc, /obj/effect/dummy/slaughter))
|
||||
body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted.
|
||||
if(istype(body, /mob/living/carbon/true_devil))
|
||||
var/mob/living/carbon/true_devil/D = body
|
||||
if(D.oldform)
|
||||
D.oldform.revive() // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body.
|
||||
if(body.stat == DEAD) // Not sure why this would happen
|
||||
create_new_body()
|
||||
else if(GLOB.blobstart.len > 0)
|
||||
// teleport the body so repeated beatdowns aren't an option)
|
||||
body.forceMove(get_turf(pick(GLOB.blobstart)))
|
||||
// give them the devil lawyer outfit in case they got stripped
|
||||
if(ishuman(body))
|
||||
var/mob/living/carbon/human/H = body
|
||||
H.equipOutfit(/datum/outfit/devil_lawyer)
|
||||
else
|
||||
create_new_body()
|
||||
check_regression()
|
||||
|
||||
/datum/devilinfo/proc/create_new_body()
|
||||
if(GLOB.blobstart.len > 0)
|
||||
var/turf/targetturf = get_turf(pick(GLOB.blobstart))
|
||||
var/mob/currentMob = owner.current
|
||||
if(QDELETED(currentMob))
|
||||
currentMob = owner.get_ghost()
|
||||
if(!currentMob)
|
||||
message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
|
||||
return -1
|
||||
if(currentMob.mind != owner)
|
||||
message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
|
||||
return -1
|
||||
var/mob/living/carbon/human/H = new /mob/living/carbon/human(targetturf)
|
||||
owner.transfer_to(H)
|
||||
if(isobserver(currentMob))
|
||||
var/mob/dead/observer/O = currentMob
|
||||
O.reenter_corpse()
|
||||
if(humanform)
|
||||
H.set_species(humanform.species)
|
||||
H.dna = humanform.Clone()
|
||||
|
||||
H.dna.UpdateSE()
|
||||
H.dna.UpdateUI()
|
||||
|
||||
H.sync_organ_dna(1) // It's literally a fresh body as you can get, so all organs properly belong to it
|
||||
H.UpdateAppearance()
|
||||
else
|
||||
// gibbed cyborg or similar - create a randomized "humanform" appearance
|
||||
H.scramble_appearance()
|
||||
humanform = H.dna.Clone()
|
||||
|
||||
|
||||
H.equipOutfit(/datum/outfit/devil_lawyer)
|
||||
give_base_spells(TRUE)
|
||||
if(SOULVALUE >= BLOOD_THRESHOLD)
|
||||
increase_blood_lizard()
|
||||
if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
|
||||
increase_true_devil()
|
||||
if(SOULVALUE >= ARCH_THRESHOLD && ascendable)
|
||||
increase_arch_devil()
|
||||
else
|
||||
throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
|
||||
|
||||
/datum/devilinfo/proc/update_hud()
|
||||
if(istype(owner.current, /mob/living/carbon))
|
||||
var/mob/living/C = owner.current
|
||||
if(C.hud_used && C.hud_used.devilsouldisplay)
|
||||
C.hud_used.devilsouldisplay.update_counter(SOULVALUE)
|
||||
|
||||
// SECTION: Messages and explanations
|
||||
|
||||
/datum/devilinfo/proc/announce_laws(mob/living/owner)
|
||||
to_chat(owner, "<span class='boldwarning'>You remember your link to the infernal. You are [truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.</span>")
|
||||
to_chat(owner, "<span class='boldwarning'>However, your infernal form is not without weaknesses.</span>")
|
||||
to_chat(owner, "You may not use violence to coerce someone into selling their soul.")
|
||||
to_chat(owner, "You may not directly and knowingly physically harm a devil, other than yourself.")
|
||||
to_chat(owner,GLOB.lawlorify[LAW][bane])
|
||||
to_chat(owner,GLOB.lawlorify[LAW][ban])
|
||||
to_chat(owner,GLOB.lawlorify[LAW][obligation])
|
||||
to_chat(owner,GLOB.lawlorify[LAW][banish])
|
||||
to_chat(owner, "<br/><br/><span class='warning'>Remember, the crew can research your weaknesses if they find out your devil name.</span><br>")
|
||||
|
||||
|
||||
#undef BLOOD_THRESHOLD
|
||||
#undef TRUE_THRESHOLD
|
||||
#undef ARCH_THRESHOLD
|
||||
#undef BASIC_DEVIL
|
||||
#undef BLOOD_LIZARD
|
||||
#undef TRUE_DEVIL
|
||||
#undef ARCH_DEVIL
|
||||
#undef LOSS_PER_DEATH
|
||||
#undef SOULVALUE
|
||||
#undef DEVILRESURRECTTIME
|
||||
|
||||
/datum/outfit/devil_lawyer
|
||||
name = "Devil Lawyer"
|
||||
uniform = /obj/item/clothing/under/lawyer/black
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
back = /obj/item/storage/backpack
|
||||
l_hand = /obj/item/storage/briefcase
|
||||
l_pocket = /obj/item/pen
|
||||
l_ear = /obj/item/radio/headset
|
||||
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/devil_lawyer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
if(!istype(W) || W.assignment) // either doesn't have a card, or the card is already written to
|
||||
return
|
||||
var/name_to_use = H.real_name
|
||||
if(H.mind && H.mind.devilinfo)
|
||||
// Having hell create an ID for you causes its risks
|
||||
name_to_use = H.mind.devilinfo.truename
|
||||
|
||||
W.name = "[name_to_use]'s ID Card (Lawyer)"
|
||||
W.registered_name = name_to_use
|
||||
W.assignment = "Lawyer"
|
||||
W.rank = W.assignment
|
||||
W.age = H.age
|
||||
W.sex = capitalize(H.gender)
|
||||
W.access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_EXTERNAL_AIRLOCKS)
|
||||
W.photo = get_id_photo(H)
|
||||
@@ -1,94 +0,0 @@
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/sintouched = list()
|
||||
var/list/datum/mind/devils = list()
|
||||
var/devil_ascended = 0 // Number of arch devils on station
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_sintouched()
|
||||
var/text = ""
|
||||
if(sintouched.len)
|
||||
text += "<br><span class='big'><b>The sintouched were:</b></span>"
|
||||
var/list/sintouchedUnique = uniqueList(sintouched)
|
||||
for(var/S in sintouchedUnique)
|
||||
var/datum/mind/sintouched_mind = S
|
||||
text += printplayer(sintouched_mind)
|
||||
text += printobjectives(sintouched_mind)
|
||||
text += "<br>"
|
||||
text += "<br>"
|
||||
to_chat(world,text)
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_devils()
|
||||
var/text = ""
|
||||
if(devils.len)
|
||||
text += "<br><span class='big'><b>The devils were:</b></span>"
|
||||
for(var/D in devils)
|
||||
var/datum/mind/devil = D
|
||||
text += printplayer(devil)
|
||||
text += printdevilinfo(devil)
|
||||
text += printobjectives(devil)
|
||||
text += "<br>"
|
||||
text += "<br>"
|
||||
to_chat(world,text)
|
||||
|
||||
|
||||
/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind, ascendable = FALSE)
|
||||
var/trueName= randomDevilName()
|
||||
devil_mind.devilinfo = devilInfo(trueName, 1)
|
||||
devil_mind.devilinfo.ascendable = ascendable
|
||||
devil_mind.store_memory("Your diabolical true name is [devil_mind.devilinfo.truename]<br>[GLOB.lawlorify[LAW][devil_mind.devilinfo.ban]]<br>You may not use violence to coerce someone into selling their soul.<br>You may not directly and knowingly physically harm a devil, other than yourself.<br>[GLOB.lawlorify[LAW][devil_mind.devilinfo.bane]]<br>[GLOB.lawlorify[LAW][devil_mind.devilinfo.obligation]]<br>[GLOB.lawlorify[LAW][devil_mind.devilinfo.banish]]<br>")
|
||||
devil_mind.devilinfo.link_with_mob(devil_mind.current)
|
||||
if(devil_mind.assigned_role == "Clown")
|
||||
to_chat(devil_mind.current, "Your infernal nature allows you to wield weapons without harming yourself.")
|
||||
devil_mind.current.dna.SetSEState(GLOB.clumsyblock, FALSE)
|
||||
singlemutcheck(devil_mind.current, GLOB.clumsyblock, MUTCHK_FORCED)
|
||||
var/datum/action/innate/toggle_clumsy/A = new
|
||||
A.Grant(devil_mind.current)
|
||||
spawn(10)
|
||||
devil_mind.devilinfo.update_hud()
|
||||
if(issilicon(devil_mind.current))
|
||||
var/mob/living/silicon/S = devil_mind.current
|
||||
S.laws.set_sixsixsix_law("You may not use violence to coerce someone into selling their soul.")
|
||||
S.laws.set_sixsixsix_law("You may not directly and knowingly physically harm a devil, other than yourself.")
|
||||
S.laws.set_sixsixsix_law("[GLOB.lawlorify[LAW][devil_mind.devilinfo.ban]]")
|
||||
S.laws.set_sixsixsix_law("[GLOB.lawlorify[LAW][devil_mind.devilinfo.obligation]]")
|
||||
S.laws.set_sixsixsix_law("Accomplish your objectives at all costs.")
|
||||
|
||||
// unsure about the second "quantity" arg and how it fits with the antag refactor
|
||||
/datum/game_mode/proc/forge_devil_objectives(datum/mind/devil_mind, quantity)
|
||||
var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target)
|
||||
for(var/i = 1 to quantity)
|
||||
var/type = pick(validtypes)
|
||||
var/datum/objective/devil/objective = new type(null)
|
||||
objective.owner = devil_mind
|
||||
devil_mind.objectives += objective
|
||||
if(!istype(objective, /datum/objective/devil/buy_target))
|
||||
validtypes -= type //prevent duplicate objectives, EXCEPT for buy_target.
|
||||
else
|
||||
objective.find_target()
|
||||
|
||||
/datum/game_mode/proc/greet_devil(datum/mind/devil_mind)
|
||||
if(!devil_mind.devilinfo)
|
||||
return
|
||||
devil_mind.devilinfo.announce_laws(devil_mind.current)
|
||||
devil_mind.announce_objectives()
|
||||
|
||||
|
||||
/datum/game_mode/proc/printdevilinfo(datum/mind/ply)
|
||||
if(!ply.devilinfo)
|
||||
return "Target is not a devil."
|
||||
var/text = "</br>The devil's true name is: [ply.devilinfo.truename]</br>"
|
||||
text += "The devil's bans were:</br>"
|
||||
text += " [GLOB.lawlorify[LORE][ply.devilinfo.ban]]</br>"
|
||||
text += " [GLOB.lawlorify[LORE][ply.devilinfo.bane]]</br>"
|
||||
text += " [GLOB.lawlorify[LORE][ply.devilinfo.obligation]]</br>"
|
||||
text += " [GLOB.lawlorify[LORE][ply.devilinfo.banish]]</br></br>"
|
||||
return text
|
||||
|
||||
/datum/game_mode/proc/update_devil_icons_added(datum/mind/devil_mind)
|
||||
var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_DEVIL]
|
||||
hud.join_hud(devil_mind.current)
|
||||
set_antag_hud(devil_mind.current, "huddevil")
|
||||
|
||||
/datum/game_mode/proc/update_devil_icons_removed(datum/mind/devil_mind)
|
||||
var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_DEVIL]
|
||||
hud.leave_hud(devil_mind.current)
|
||||
set_antag_hud(devil_mind.current, null)
|
||||
@@ -1,54 +0,0 @@
|
||||
//////////////////The Monster
|
||||
|
||||
/mob/living/simple_animal/imp
|
||||
name = "imp"
|
||||
real_name = "imp"
|
||||
desc = "A large, menacing creature covered in armored black scales."
|
||||
speak_emote = list("cackles")
|
||||
emote_hear = list("cackles","screeches")
|
||||
response_help = "thinks better of touching"
|
||||
response_disarm = "flails at"
|
||||
response_harm = "punches"
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "imp"
|
||||
icon_living = "imp"
|
||||
speed = 1
|
||||
a_intent = INTENT_HARM
|
||||
stop_automated_movement = 1
|
||||
status_flags = CANPUSH
|
||||
attack_sound = 'sound/misc/demon_attack1.ogg'
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 250 //Weak to cold
|
||||
maxbodytemp = INFINITY
|
||||
faction = list("hell")
|
||||
attacktext = "wildly tears into"
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
healable = 0
|
||||
environment_smash = 1
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 15
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
var/boost
|
||||
var/playstyle_string = "<B><font size=3 color='red'>You are an imp,</font> a mischevious creature from hell. You are the lowest rank on the hellish totem pole \
|
||||
Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
|
||||
of intentionally harming a fellow devil.</B>"
|
||||
|
||||
/mob/living/simple_animal/imp/New()
|
||||
..()
|
||||
boost = world.time + 60
|
||||
|
||||
/mob/living/simple_animal/imp/Life()
|
||||
..()
|
||||
if(boost<world.time)
|
||||
speed = 1
|
||||
else
|
||||
speed = 0
|
||||
|
||||
/mob/living/simple_animal/imp/death()
|
||||
..(1)
|
||||
playsound(get_turf(src),'sound/misc/demon_dies.ogg', 200, 1)
|
||||
visible_message("<span class='danger'>[src] screams in agony as it sublimates into a sulfurous smoke.</span>")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
@@ -1,109 +0,0 @@
|
||||
/datum/objective/devil
|
||||
|
||||
/datum/objective/devil/soulquantity
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL1"
|
||||
target_amount = 4
|
||||
|
||||
/datum/objective/devil/soulquantity/New()
|
||||
target_amount = pick(6, 7, 8)
|
||||
update_explanation_text()
|
||||
|
||||
/datum/objective/devil/proc/update_explanation_text()
|
||||
//Intentionally empty
|
||||
|
||||
/datum/objective/devil/soulquantity/update_explanation_text()
|
||||
explanation_text = "Purchase, and retain control over at least [target_amount] souls."
|
||||
|
||||
/datum/objective/devil/soulquantity/check_completion()
|
||||
var/count = 0
|
||||
for(var/S in owner.devilinfo.soulsOwned)
|
||||
var/datum/mind/L = S
|
||||
if(L.soulOwner == owner)
|
||||
count++
|
||||
return count >= target_amount
|
||||
|
||||
|
||||
|
||||
/datum/objective/devil/soulquality
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL2"
|
||||
var/contractType
|
||||
var/contractName
|
||||
|
||||
/datum/objective/devil/soulquality/New()
|
||||
contractType = pick(CONTRACT_POWER, CONTRACT_WEALTH, CONTRACT_PRESTIGE, CONTRACT_MAGIC, CONTRACT_REVIVE, CONTRACT_KNOWLEDGE)
|
||||
target_amount = pick(1, 2)
|
||||
switch(contractType)
|
||||
if(CONTRACT_POWER)
|
||||
contractName = "for power"
|
||||
if(CONTRACT_WEALTH)
|
||||
contractName = "for wealth"
|
||||
if(CONTRACT_PRESTIGE)
|
||||
contractName = "for prestige"
|
||||
if(CONTRACT_MAGIC)
|
||||
contractName = "for magic"
|
||||
if(CONTRACT_REVIVE)
|
||||
contractName = "of revival"
|
||||
if(CONTRACT_KNOWLEDGE)
|
||||
contractName = "for knowledge"
|
||||
update_explanation_text()
|
||||
|
||||
/datum/objective/devil/soulquality/update_explanation_text()
|
||||
explanation_text = "Have mortals sign at least [target_amount] contracts [contractName]."
|
||||
|
||||
/datum/objective/devil/soulquality/check_completion()
|
||||
var/count = 0
|
||||
for(var/S in owner.devilinfo.soulsOwned)
|
||||
var/datum/mind/L = S
|
||||
if(L.soulOwner != L && L.damnation_type == contractType)
|
||||
count++
|
||||
return count >= target_amount
|
||||
|
||||
|
||||
|
||||
/datum/objective/devil/sintouch
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL3"
|
||||
|
||||
/datum/objective/devil/sintouch/New()
|
||||
target_amount = pick(4, 5)
|
||||
explanation_text = "Ensure at least [target_amount] mortals are sintouched."
|
||||
|
||||
/datum/objective/devil/sintouch/check_completion()
|
||||
return target_amount <= SSticker.mode.sintouched.len
|
||||
|
||||
|
||||
|
||||
/datum/objective/devil/buy_target
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL4"
|
||||
|
||||
/datum/objective/devil/buy_target/New()
|
||||
find_target()
|
||||
update_explanation_text()
|
||||
|
||||
/datum/objective/devil/buy_target/update_explanation_text()
|
||||
if(target)
|
||||
explanation_text = "Purchase and retain the soul of [target.name], the [target.assigned_role]."
|
||||
else
|
||||
explanation_text = "Free objective."
|
||||
|
||||
/datum/objective/devil/buy_target/check_completion()
|
||||
return target.soulOwner == owner
|
||||
|
||||
|
||||
/datum/objective/devil/outsell
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL5"
|
||||
|
||||
/datum/objective/devil/outsell/update_explanation_text()
|
||||
explanation_text = "Purchase and retain control over more souls than [target.devilinfo.truename], known to mortals as [target.name], the [target.assigned_role]."
|
||||
|
||||
/datum/objective/devil/outsell/check_completion()
|
||||
var/selfcount = 0
|
||||
for(var/S in owner.devilinfo.soulsOwned)
|
||||
var/datum/mind/L = S
|
||||
if(L.soulOwner == owner)
|
||||
selfcount++
|
||||
var/targetcount = 0
|
||||
for(var/S in target.devilinfo.soulsOwned)
|
||||
var/datum/mind/L = S
|
||||
if(L.soulOwner == target)
|
||||
targetcount++
|
||||
return selfcount > targetcount
|
||||
@@ -1,218 +0,0 @@
|
||||
#define DEVIL_R_HAND_LAYER 1
|
||||
#define DEVIL_L_HAND_LAYER 2
|
||||
#define DEVIL_TOTAL_LAYERS 2
|
||||
|
||||
// This is used primarily for having hands.
|
||||
/mob/living/carbon/true_devil
|
||||
name = "True Devil"
|
||||
desc = "A pile of infernal energy, taking a vaguely humanoid form."
|
||||
icon = 'icons/mob/32x64.dmi'
|
||||
icon_state = "true_devil"
|
||||
gender = NEUTER
|
||||
health = 350
|
||||
maxHealth = 350
|
||||
ventcrawler = FALSE
|
||||
density = TRUE
|
||||
pass_flags = 0
|
||||
var/ascended = FALSE
|
||||
sight = (SEE_TURFS | SEE_OBJS)
|
||||
status_flags = CANPUSH
|
||||
universal_understand = TRUE
|
||||
universal_speak = TRUE //The devil speaks all languages meme
|
||||
var/mob/living/oldform
|
||||
var/list/devil_overlays[DEVIL_TOTAL_LAYERS]
|
||||
|
||||
/mob/living/carbon/true_devil/New(loc, mob/living/carbon/dna_source)
|
||||
dna = dna_source.dna.Clone()
|
||||
var/obj/item/organ/internal/brain/B = new(src)
|
||||
var/obj/item/organ/internal/ears/E = new(src)
|
||||
B.insert()
|
||||
E.insert()
|
||||
..()
|
||||
|
||||
// inventory system could use some love
|
||||
/mob/living/carbon/true_devil/put_in_hands(obj/item/W)
|
||||
if(!W)
|
||||
return 0
|
||||
if(put_in_active_hand(W))
|
||||
return TRUE
|
||||
else if(put_in_inactive_hand(W))
|
||||
return TRUE
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/carbon/true_devil/proc/convert_to_archdevil()
|
||||
maxHealth = 5000 // not an IMPOSSIBLE amount, but still near impossible.
|
||||
ascended = TRUE
|
||||
health = maxHealth
|
||||
icon_state = "arch_devil"
|
||||
|
||||
/mob/living/carbon/true_devil/proc/set_name()
|
||||
name = mind.devilinfo.truename
|
||||
real_name = name
|
||||
|
||||
/mob/living/carbon/true_devil/Login()
|
||||
..()
|
||||
if(mind.devilinfo)
|
||||
mind.devilinfo.announce_laws(src)
|
||||
mind.announce_objectives()
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/death(gibbed)
|
||||
. = ..(gibbed)
|
||||
drop_l_hand()
|
||||
drop_r_hand()
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/examine(mob/user)
|
||||
var/msg = "<span class='info'>*---------*\nThis is [bicon(src)] <b>[src]</b>!\n"
|
||||
|
||||
//Left hand items
|
||||
if(l_hand && !(l_hand.flags & ABSTRACT))
|
||||
if(l_hand.blood_DNA)
|
||||
msg += "<span class='warning'>It is holding [bicon(l_hand)] [l_hand.gender == PLURAL? "some" : "a"] blood-stained [l_hand.name] in its left hand!</span>\n"
|
||||
else
|
||||
msg += "It is holding [bicon(l_hand)] \a [l_hand] in its left hand.\n"
|
||||
|
||||
//Right hand items
|
||||
if(r_hand && !(r_hand.flags & ABSTRACT))
|
||||
if(r_hand.blood_DNA)
|
||||
msg += "<span class='warning'>It is holding [bicon(r_hand)] [r_hand.gender == PLURAL? "some" : "a"] blood-stained [r_hand.name] in its right hand!</span>\n"
|
||||
else
|
||||
msg += "It is holding [bicon(r_hand)] \a [r_hand] in its right hand.\n"
|
||||
|
||||
//Braindead
|
||||
if(!client && stat != DEAD)
|
||||
msg += "The devil seems to be in deep contemplation.\n"
|
||||
|
||||
//Damaged
|
||||
if(stat == DEAD)
|
||||
msg += "<span class='deadsay'>The hellfire seems to have been extinguished, for now at least.</span>\n"
|
||||
else if(health < (maxHealth/10))
|
||||
msg += "<span class='warning'>You can see hellfire inside of it's gaping wounds.</span>\n"
|
||||
else if(health < (maxHealth/2))
|
||||
msg += "<span class='warning'>You can see hellfire inside of it's wounds.</span>\n"
|
||||
msg += "*---------*</span>"
|
||||
. = list(msg)
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/IsAdvancedToolUser()
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/true_devil/assess_threat()
|
||||
return 666
|
||||
|
||||
/mob/living/carbon/true_devil/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
|
||||
if(mind && has_bane(BANE_LIGHT))
|
||||
mind.disrupt_spells(-500)
|
||||
return ..() //flashes don't stop devils UNLESS it's their bane.
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone)
|
||||
var/weakness = check_weakness(I, user)
|
||||
apply_damage(I.force * weakness, I.damtype, def_zone)
|
||||
var/message_verb = ""
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
message_verb = "[pick(I.attack_verb)]"
|
||||
else if(I.force)
|
||||
message_verb = "attacked"
|
||||
|
||||
var/attack_message = "[src] has been [message_verb] with [I]."
|
||||
if(user)
|
||||
user.do_attack_animation(src)
|
||||
if(user in viewers(src, null))
|
||||
attack_message = "[user] has [message_verb] [src] with [I]!"
|
||||
if(message_verb)
|
||||
visible_message("<span class='danger'>[attack_message]</span>",
|
||||
"<span class='userdanger'>[attack_message]</span>")
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/true_devil/UnarmedAttack(atom/A, proximity)
|
||||
if(!ishuman(A))
|
||||
// `attack_hand` on mobs assumes the attacker is a human
|
||||
// I am the worst
|
||||
A.attack_hand(src)
|
||||
// If the devil wants to actually attack, they have the pitchfork.
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/Process_Spacemove(movement_dir = 0)
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/true_devil/singularity_act()
|
||||
if(ascended)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/true_devil/attack_ghost(mob/dead/observer/user as mob)
|
||||
if(ascended || user.mind.soulOwner == src.mind)
|
||||
var/mob/living/simple_animal/imp/S = new(get_turf(loc))
|
||||
S.key = user.key
|
||||
S.mind.assigned_role = "MODE"
|
||||
S.mind.special_role = "Imp"
|
||||
var/datum/objective/newobjective = new
|
||||
newobjective.explanation_text = "Try to get a promotion to a higher infernal rank."
|
||||
S.mind.objectives += newobjective
|
||||
to_chat(S,S.playstyle_string)
|
||||
to_chat(S,"<B>Objective #1</B>: [newobjective.explanation_text]")
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/true_devil/resist_fire()
|
||||
//They're immune to fire.
|
||||
|
||||
/mob/living/carbon/true_devil/attack_hand(mob/living/carbon/human/M)
|
||||
if(..())
|
||||
switch(M.a_intent)
|
||||
if(INTENT_HARM)
|
||||
var/damage = rand(1, 5)
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [src]!</span>")
|
||||
adjustBruteLoss(damage)
|
||||
add_attack_logs(M, src, "attacked")
|
||||
updatehealth()
|
||||
if(INTENT_DISARM)
|
||||
if(!lying && !ascended) //No stealing the arch devil's pitchfork.
|
||||
if(prob(5))
|
||||
// Weaken knocks people over
|
||||
// Paralyse knocks people out
|
||||
// It's Paralyse for parity though
|
||||
// Weaken(2)
|
||||
Paralyse(2)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
add_attack_logs(M, src, "pushed")
|
||||
visible_message("<span class='danger'>[M] has pushed down [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has pushed down [src]!</span>")
|
||||
else
|
||||
if(prob(25))
|
||||
drop_item()
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has disarmed [src]!</span>")
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to disarm [src]!</span>")
|
||||
|
||||
/mob/living/carbon/true_devil/handle_breathing()
|
||||
// devils do not need to breathe
|
||||
|
||||
/mob/living/carbon/true_devil/is_literate()
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/true_devil/ex_act(severity, ex_target)
|
||||
if(!ascended)
|
||||
var/b_loss
|
||||
switch (severity)
|
||||
if (1)
|
||||
b_loss = 500
|
||||
if (2)
|
||||
b_loss = 150
|
||||
if(3)
|
||||
b_loss = 30
|
||||
if(has_bane(BANE_LIGHT))
|
||||
b_loss *=2
|
||||
adjustBruteLoss(b_loss)
|
||||
return ..()
|
||||
|
||||
#undef DEVIL_TOTAL_LAYERS
|
||||
@@ -1,50 +0,0 @@
|
||||
/mob/living/carbon/true_devil/unEquip(obj/item/I, force, silent = FALSE)
|
||||
if(..())
|
||||
update_inv_r_hand()
|
||||
update_inv_l_hand()
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/true_devil/update_inv_r_hand()
|
||||
..()
|
||||
if(r_hand)
|
||||
var/t_state = r_hand.item_state
|
||||
if(!t_state)
|
||||
t_state = r_hand.icon_state
|
||||
|
||||
var/image/I = image("icon" = r_hand.righthand_file, "icon_state" = "[t_state]")
|
||||
I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension)
|
||||
devil_overlays[DEVIL_R_HAND_LAYER] = I
|
||||
else
|
||||
devil_overlays[DEVIL_R_HAND_LAYER] = null
|
||||
update_icons()
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/update_inv_l_hand()
|
||||
..()
|
||||
if(l_hand)
|
||||
var/t_state = l_hand.item_state
|
||||
if(!t_state)
|
||||
t_state = l_hand.icon_state
|
||||
|
||||
var/image/I = image("icon" = l_hand.lefthand_file, "icon_state" = "[t_state]")
|
||||
I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension)
|
||||
devil_overlays[DEVIL_L_HAND_LAYER] = I
|
||||
else
|
||||
devil_overlays[DEVIL_L_HAND_LAYER] = null
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/true_devil/proc/remove_overlay(cache_index)
|
||||
if(devil_overlays[cache_index])
|
||||
overlays -= devil_overlays[cache_index]
|
||||
devil_overlays[cache_index] = null
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/proc/apply_overlay(cache_index)
|
||||
var/image/I = devil_overlays[cache_index]
|
||||
if(I)
|
||||
if(I in overlays)
|
||||
return
|
||||
var/list/new_overlays = overlays.Copy()
|
||||
new_overlays += I
|
||||
overlays = new_overlays
|
||||
@@ -1,34 +0,0 @@
|
||||
/datum/objective/sintouched
|
||||
completed = 1
|
||||
|
||||
/* NO ERP OBJECTIVE FOR YOU.
|
||||
/datum/objective/sintouched/lust
|
||||
dangerrating = 3 // it's not AS dangerous.
|
||||
|
||||
/datum/objective/sintouched/lust/New()
|
||||
var/mob/dead/D = pick(dead_mob_list)
|
||||
if(prob(50) && D)
|
||||
explanation_text = "You know that [D] has perished.... and you think [D] is kinda cute. Make sure everyone knows how HOT [D]'s lifeless body is."
|
||||
else
|
||||
explanation_text = "Go get married, then immediately cheat on your new spouse." */
|
||||
|
||||
/datum/objective/sintouched/gluttony
|
||||
explanation_text = "Food is delicious, so delicious you can't let it be wasted on other people."
|
||||
|
||||
/datum/objective/sintouched/greed
|
||||
explanation_text = "You want MORE, more money, more wealth, more riches. Go get it, but don't hurt people for it."
|
||||
|
||||
/datum/objective/sintouched/sloth
|
||||
explanation_text = "You just get tired randomly. Go take a nap at a time that would inconvenience other people."
|
||||
|
||||
/datum/objective/sintouched/wrath
|
||||
explanation_text = "What have your coworkers ever done for you? Don't offer to help them in any matter, and refuse if asked."
|
||||
|
||||
/datum/objective/sintouched/envy
|
||||
explanation_text = "Why should you be stuck with your rank? Show everyone you can do other jobs too, and don't let anyone stop you, least of all because you have no training."
|
||||
|
||||
/datum/objective/sintouched/pride
|
||||
explanation_text = "You are the BEST thing on the station. Make sure everyone knows it."
|
||||
|
||||
/datum/objective/sintouched/acedia
|
||||
explanation_text = "Angels, devils, good, evil... who cares? Just ignore any hellish threats and do your job."
|
||||
@@ -210,12 +210,6 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
|
||||
if(radio_announce)
|
||||
Radio.autosay(message, name, "Medical", list(z))
|
||||
|
||||
/obj/machinery/clonepod/proc/spooky_devil_flavor()
|
||||
playsound(loc, pick('sound/goonstation/voice/male_scream.ogg', 'sound/goonstation/voice/female_scream.ogg'), 100, 1)
|
||||
mess = TRUE
|
||||
update_icon()
|
||||
connected_message("<font face=\"REBUFFED\" color=#600A0A>If you keep trying to steal from me, you'll end up with me.</font>")
|
||||
|
||||
//Start growing a human clone in the pod!
|
||||
/obj/machinery/clonepod/proc/growclone(datum/dna2/record/R)
|
||||
if(mess || attempting || panel_open || stat & (NOPOWER|BROKEN))
|
||||
@@ -225,11 +219,6 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
|
||||
return 0
|
||||
if(clonemind.current && clonemind.current.stat != DEAD) //mind is associated with a non-dead body
|
||||
return 0
|
||||
if(clonemind.damnation_type)
|
||||
spooky_devil_flavor()
|
||||
return 0
|
||||
if(!clonemind.is_revivable()) //Other reasons for being unrevivable
|
||||
return 0
|
||||
if(clonemind.active) //somebody is using that mind
|
||||
if(ckey(clonemind.key) != R.ckey )
|
||||
return 0
|
||||
@@ -331,7 +320,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
|
||||
connected_message("Clone Ejected: Loss of power.")
|
||||
|
||||
else if((occupant) && (occupant.loc == src))
|
||||
if((occupant.stat == DEAD) || (occupant.suiciding) || (occupant.mind && !occupant.mind.is_revivable())) //Autoeject corpses and suiciding dudes.
|
||||
if((occupant.stat == DEAD) || (occupant.suiciding)) //Autoeject corpses and suiciding dudes.
|
||||
announce_radio_message("The cloning of <b>[occupant]</b> has been aborted due to unrecoverable tissue failure.")
|
||||
go_out()
|
||||
connected_message("Clone Rejected: Deceased.")
|
||||
|
||||
@@ -1226,6 +1226,7 @@
|
||||
icon = 'icons/obj/library.dmi'
|
||||
icon_state = "demonomicon"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/list/messages = list("You must challenge the devil to a dance-off!", "The devils true name is Ian", "The devil hates salt!", "Would you like infinite power?", "Would you like infinite wisdom?", " Would you like infinite healing?")
|
||||
var/cooldown = FALSE
|
||||
|
||||
/obj/item/toy/codex_gigas/attack_self(mob/user)
|
||||
@@ -1234,21 +1235,12 @@
|
||||
"<span class='notice'>[user] presses the button on \the [src].</span>",
|
||||
"<span class='notice'>You press the button on \the [src].</span>",
|
||||
"<span class='notice'>You hear a soft click.</span>")
|
||||
var/list/messages = list()
|
||||
var/datum/devilinfo/devil = randomDevilInfo()
|
||||
messages += "Some fun facts about: [devil.truename]"
|
||||
messages += "[GLOB.lawlorify[LORE][devil.bane]]"
|
||||
messages += "[GLOB.lawlorify[LORE][devil.obligation]]"
|
||||
messages += "[GLOB.lawlorify[LORE][devil.ban]]"
|
||||
messages += "[GLOB.lawlorify[LORE][devil.banish]]"
|
||||
playsound(loc, 'sound/machines/click.ogg', 20, 1)
|
||||
playsound(loc, 'sound/machines/click.ogg', 20, TRUE)
|
||||
cooldown = TRUE
|
||||
for(var/message in messages)
|
||||
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 60)
|
||||
for(var/message in pick(messages))
|
||||
user.loc.visible_message("<span class='danger'>[bicon(src)] [message]</span>")
|
||||
sleep(10)
|
||||
spawn(20)
|
||||
cooldown = FALSE
|
||||
return
|
||||
|
||||
/obj/item/toy/owl
|
||||
name = "owl action figure"
|
||||
|
||||
@@ -420,7 +420,7 @@
|
||||
for(var/obj/item/organ/external/O in H.bodyparts)
|
||||
total_brute += O.brute_dam
|
||||
total_burn += O.burn_dam
|
||||
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK) && !HAS_TRAIT(H, TRAIT_BADDNA) && (H.mind && H.mind.is_revivable()) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime)))
|
||||
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK) && !HAS_TRAIT(H, TRAIT_BADDNA) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime)))
|
||||
tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you
|
||||
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
|
||||
H.adjustOxyLoss(tobehealed)
|
||||
@@ -539,7 +539,7 @@
|
||||
for(var/obj/item/organ/external/O in H.bodyparts)
|
||||
total_brute += O.brute_dam
|
||||
total_burn += O.burn_dam
|
||||
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK) && (H.mind && H.mind.is_revivable()))
|
||||
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK))
|
||||
tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you
|
||||
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
|
||||
H.adjustOxyLoss(tobehealed)
|
||||
|
||||
@@ -109,8 +109,6 @@
|
||||
message_say = "FOR THE REVOLOUTION!"
|
||||
else if(role == "death commando" || role == ROLE_ERT)
|
||||
message_say = "FOR NANOTRASEN!"
|
||||
else if(role == ROLE_DEVIL)
|
||||
message_say = "FOR INFERNO!"
|
||||
user.say(message_say)
|
||||
target = user
|
||||
sleep(10)
|
||||
|
||||
@@ -806,76 +806,3 @@
|
||||
Z.ex_act(2)
|
||||
charged = 3
|
||||
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
|
||||
|
||||
/obj/item/twohanded/pitchfork
|
||||
icon_state = "pitchfork0"
|
||||
name = "pitchfork"
|
||||
desc = "A simple tool used for moving hay."
|
||||
force = 7
|
||||
throwforce = 15
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force_unwielded = 7
|
||||
force_wielded = 15
|
||||
attack_verb = list("attacked", "impaled", "pierced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/item/twohanded/pitchfork/demonic
|
||||
name = "demonic pitchfork"
|
||||
desc = "A red pitchfork, it looks like the work of the devil."
|
||||
force = 19
|
||||
throwforce = 24
|
||||
force_unwielded = 19
|
||||
force_wielded = 25
|
||||
|
||||
/obj/item/twohanded/pitchfork/demonic/greater
|
||||
force = 24
|
||||
throwforce = 50
|
||||
force_unwielded = 24
|
||||
force_wielded = 34
|
||||
|
||||
/obj/item/twohanded/pitchfork/demonic/ascended
|
||||
force = 100
|
||||
throwforce = 100
|
||||
force_unwielded = 100
|
||||
force_wielded = 500000 // Kills you DEAD.
|
||||
|
||||
/obj/item/twohanded/pitchfork/update_icon()
|
||||
icon_state = "pitchfork[wielded]"
|
||||
|
||||
/obj/item/twohanded/pitchfork/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] impales \himself in \his abdomen with [src]! It looks like \he's trying to commit suicide...</span>")
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/twohanded/pitchfork/demonic/pickup(mob/user)
|
||||
. = ..()
|
||||
if(istype(user, /mob/living))
|
||||
var/mob/living/U = user
|
||||
if(U.mind && !U.mind.devilinfo && (U.mind.soulOwner == U.mind)) //Burn hands unless they are a devil or have sold their soul
|
||||
U.visible_message("<span class='warning'>As [U] picks [src] up, [U]'s arms briefly catch fire.</span>", \
|
||||
"<span class='warning'>\"As you pick up the [src] your arms ignite, reminding you of all your past sins.\"</span>")
|
||||
if(ishuman(U))
|
||||
var/mob/living/carbon/human/H = U
|
||||
H.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
|
||||
else
|
||||
U.adjustFireLoss(rand(force/2,force))
|
||||
|
||||
/obj/item/twohanded/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user)
|
||||
if(user.mind && !user.mind.devilinfo && (user.mind.soulOwner != user.mind))
|
||||
to_chat(user, "<span class ='warning'>The [src] burns in your hands.</span>")
|
||||
user.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
|
||||
..()
|
||||
|
||||
// It's no fun being the lord of all hell if you can't get out of a simple room
|
||||
/obj/item/twohanded/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity || !wielded)
|
||||
return
|
||||
if(istype(target, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = target
|
||||
user.visible_message("<span class='danger'>[user] blasts \the [target] with \the [src]!</span>")
|
||||
playsound(target, 'sound/magic/Disintegrate.ogg', 100, 1)
|
||||
W.devastate_wall(TRUE)
|
||||
return 1
|
||||
..()
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
if(M)
|
||||
var/mob/dead/observer/G = M.get_ghost()
|
||||
|
||||
if(M.mind && M.mind.is_revivable() && !M.mind.suicided)
|
||||
if(M.mind && !M.mind.suicided)
|
||||
if(M.client)
|
||||
icon_state = "morgue3"
|
||||
desc = initial(desc) + "\n[status_descriptors[4]]"
|
||||
|
||||
@@ -494,9 +494,6 @@
|
||||
if(SSticker.mode.vampire_enthralled.len)
|
||||
dat += check_role_table("Vampire Thralls", SSticker.mode.vampire_enthralled)
|
||||
|
||||
if(SSticker.mode.devils.len)
|
||||
dat += check_role_table("Devils", SSticker.mode.devils)
|
||||
|
||||
if(SSticker.mode.xenos.len)
|
||||
dat += check_role_table("Xenos", SSticker.mode.xenos)
|
||||
|
||||
|
||||
@@ -23,8 +23,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
ROLE_BORER = 21,
|
||||
ROLE_NINJA = 21,
|
||||
ROLE_GSPIDER = 21,
|
||||
ROLE_ABDUCTOR = 30,
|
||||
ROLE_DEVIL = 14
|
||||
ROLE_ABDUCTOR = 30
|
||||
))
|
||||
|
||||
/proc/player_old_enough_antag(client/C, role)
|
||||
|
||||
@@ -31,19 +31,15 @@
|
||||
for(var/datum/reagent/blood/bloodSample in W.reagents.reagent_list)
|
||||
var/datum/dna/dna = bloodSample.data["dna"]
|
||||
if(bloodSample.data["mind"] && bloodSample.data["cloneable"] && !(NO_CLONESCAN in dna.species.species_traits))
|
||||
var/datum/mind/tempmind = bloodSample.data["mind"]
|
||||
if(tempmind.is_revivable())
|
||||
mind = bloodSample.data["mind"]
|
||||
ckey = bloodSample.data["ckey"]
|
||||
realName = bloodSample.data["real_name"]
|
||||
blood_gender = bloodSample.data["gender"]
|
||||
blood_type = bloodSample.data["blood_type"]
|
||||
factions = bloodSample.data["factions"]
|
||||
W.reagents.clear_reagents()
|
||||
to_chat(user, "<span class='notice'>You inject the contents of the syringe into the seeds.</span>")
|
||||
contains_sample = 1
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The seeds reject the sample!</span>")
|
||||
mind = bloodSample.data["mind"]
|
||||
ckey = bloodSample.data["ckey"]
|
||||
realName = bloodSample.data["real_name"]
|
||||
blood_gender = bloodSample.data["gender"]
|
||||
blood_type = bloodSample.data["blood_type"]
|
||||
factions = bloodSample.data["factions"]
|
||||
W.reagents.clear_reagents()
|
||||
to_chat(user, "<span class='notice'>You inject the contents of the syringe into the seeds.</span>")
|
||||
contains_sample = 1
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The seeds reject the sample!</span>")
|
||||
else
|
||||
@@ -85,9 +81,6 @@
|
||||
ckey_holder = M.ckey
|
||||
break
|
||||
|
||||
if(mind && !mind.is_revivable())
|
||||
make_podman = 0
|
||||
|
||||
if(make_podman) //all conditions met!
|
||||
var/mob/living/carbon/human/pod_diona/podman = new /mob/living/carbon/human/pod_diona(parent.loc)
|
||||
if(realName)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/item/book/codex_gigas
|
||||
name = "Codex Gigas"
|
||||
name = "\improper Codex Gigas"
|
||||
desc = "A book documenting the nature of devils."
|
||||
icon_state ="demonomicon"
|
||||
throw_speed = 1
|
||||
throw_range = 10
|
||||
@@ -7,47 +8,3 @@
|
||||
author = "Forces beyond your comprehension"
|
||||
unique = TRUE
|
||||
title = "The codex gigas"
|
||||
var/inUse = 0
|
||||
|
||||
|
||||
/obj/item/book/codex_gigas/attack_self(mob/user)
|
||||
if(!user.has_vision())
|
||||
return
|
||||
if(inUse)
|
||||
to_chat(user,"<span class='notice'>Someone else is reading it.</span>")
|
||||
return
|
||||
if(!user.is_literate())
|
||||
to_chat(user,"<span class='notice'>You don't know how to read.</span>")
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/U = user
|
||||
if(U.check_acedia())
|
||||
to_chat(user,"<span class='notice'>None of this matters, why are you reading this? You put the [title] down.</span>")
|
||||
return
|
||||
inUse = 1
|
||||
var/devilName = copytext(sanitize(input(user, "What infernal being do you wish to research?", "Codex Gigas", null) as text),1,MAX_MESSAGE_LEN)
|
||||
var/speed = 300
|
||||
var/correctness = 85
|
||||
var/willpower = 95
|
||||
if(U.job in list("Librarian")) // the librarian is both faster, and more accurate than normal crew members at research
|
||||
speed = 45
|
||||
correctness = 100
|
||||
willpower = 100
|
||||
if(U.job in list("Captain", "Security Officer", "Head of Security", "Detective", "Warden"))
|
||||
willpower = 99
|
||||
if(U.job in list("Clown")) // WHO GAVE THE CLOWN A DEMONOMICON? BAD THINGS WILL HAPPEN!
|
||||
willpower = 25
|
||||
correctness -= U.getBrainLoss() *0.5 //Brain damage makes researching hard.
|
||||
speed += U.getBrainLoss() * 3
|
||||
user.visible_message("[user] opens [title] and begins reading intently.")
|
||||
if(do_after(U, speed, 0, U))
|
||||
var/usedName = devilName
|
||||
if(!prob(correctness))
|
||||
usedName += "x"
|
||||
var/datum/devilinfo/devil = devilInfo(usedName, 0)
|
||||
user << browse("Information on [devilName]<br><br><br>[GLOB.lawlorify[LORE][devil.ban]]<br>[GLOB.lawlorify[LORE][devil.bane]]<br>[GLOB.lawlorify[LORE][devil.obligation]]<br>[GLOB.lawlorify[LORE][devil.banish]]", "window=book")
|
||||
inUse = 0
|
||||
sleep(10)
|
||||
if(!prob(willpower))
|
||||
U.influenceSin()
|
||||
onclose(user, "book")
|
||||
|
||||
@@ -389,15 +389,11 @@
|
||||
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Your eyes are really starting to hurt. This can't be good for you!</span>")
|
||||
if(mind && has_bane(BANE_LIGHT))
|
||||
mind.disrupt_spells(-500)
|
||||
return 1
|
||||
|
||||
else if(damage == 0) // just enough protection
|
||||
if(prob(20))
|
||||
to_chat(src, "<span class='notice'>Something bright flashes in the corner of your vision!</span>")
|
||||
if(mind && has_bane(BANE_LIGHT))
|
||||
mind.disrupt_spells(0)
|
||||
|
||||
|
||||
/mob/living/carbon/proc/tintcheck()
|
||||
|
||||
@@ -465,12 +465,3 @@
|
||||
valid_alt_heads += alternate_head
|
||||
|
||||
return sortTim(valid_alt_heads, /proc/cmp_text_asc)
|
||||
|
||||
/mob/living/carbon/human/proc/scramble_appearance()
|
||||
scramble(1, src, 100)
|
||||
real_name = random_name(gender, dna.species.name) //Give them a name that makes sense for their species.
|
||||
sync_organ_dna(assimilate = 1)
|
||||
update_body()
|
||||
reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
|
||||
reset_markings() //...Or markings.
|
||||
dna.ResetUIFrom(src)
|
||||
|
||||
@@ -1904,38 +1904,6 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
|
||||
if(mind && mind.assigned_role == "Cluwne") //HUNKE your suffering never stops
|
||||
makeCluwne()
|
||||
|
||||
/mob/living/carbon/human/proc/influenceSin()
|
||||
var/datum/objective/sintouched/O
|
||||
switch(rand(1,7))//traditional seven deadly sins... except lust.
|
||||
if(1) // acedia
|
||||
log_game("[src] was influenced by the sin of Acedia.")
|
||||
O = new /datum/objective/sintouched/acedia
|
||||
if(2) // Gluttony
|
||||
log_game("[src] was influenced by the sin of gluttony.")
|
||||
O = new /datum/objective/sintouched/gluttony
|
||||
if(3) // Greed
|
||||
log_game("[src] was influenced by the sin of greed.")
|
||||
O = new /datum/objective/sintouched/greed
|
||||
if(4) // sloth
|
||||
log_game("[src] was influenced by the sin of sloth.")
|
||||
O = new /datum/objective/sintouched/sloth
|
||||
if(5) // Wrath
|
||||
log_game("[src] was influenced by the sin of wrath.")
|
||||
O = new /datum/objective/sintouched/wrath
|
||||
if(6) // Envy
|
||||
log_game("[src] was influenced by the sin of envy.")
|
||||
O = new /datum/objective/sintouched/envy
|
||||
if(7) // Pride
|
||||
log_game("[src] was influenced by the sin of pride.")
|
||||
O = new /datum/objective/sintouched/pride
|
||||
SSticker.mode.sintouched += src.mind
|
||||
src.mind.objectives += O
|
||||
var/obj_count = 1
|
||||
to_chat(src, "<span class='notice> Your current objectives:")
|
||||
for(var/datum/objective/objective in src.mind.objectives)
|
||||
to_chat(src, "<B>Objective #[obj_count]</B>: [objective.explanation_text]")
|
||||
obj_count++
|
||||
|
||||
/mob/living/carbon/human/is_literate()
|
||||
return getBrainLoss() < 100
|
||||
|
||||
@@ -1948,6 +1916,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
|
||||
/mob/living/carbon/human/fakefireextinguish()
|
||||
overlays_standing[FIRE_LAYER] = null
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/human/proc/cleanSE() //remove all disabilities/powers
|
||||
for(var/block = 1; block <= DNA_SE_LENGTH; block++)
|
||||
dna.SetSEState(block, FALSE, TRUE)
|
||||
|
||||
@@ -435,8 +435,6 @@ emp_act
|
||||
|
||||
send_item_attack_message(I, user, hit_area)
|
||||
|
||||
var/weakness = check_weakness(I,user)
|
||||
|
||||
if(!I.force)
|
||||
return 0 //item force is zero
|
||||
|
||||
@@ -448,7 +446,7 @@ emp_act
|
||||
return 0
|
||||
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
|
||||
|
||||
apply_damage(I.force * weakness, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I)
|
||||
apply_damage(I.force, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I)
|
||||
|
||||
var/bloody = 0
|
||||
if(I.damtype == BRUTE && I.force && prob(25 + I.force * 2))
|
||||
|
||||
@@ -78,13 +78,6 @@
|
||||
if(!gibbed && !QDELETED(src))
|
||||
addtimer(CALLBACK(src, .proc/med_hud_set_status), DEFIB_TIME_LIMIT + 1)
|
||||
|
||||
for(var/s in ownedSoullinks)
|
||||
var/datum/soullink/S = s
|
||||
S.ownerDies(gibbed, src)
|
||||
for(var/s in sharedSoullinks)
|
||||
var/datum/soullink/S = s
|
||||
S.sharerDies(gibbed, src)
|
||||
|
||||
if(!gibbed)
|
||||
update_canmove()
|
||||
|
||||
@@ -104,8 +97,6 @@
|
||||
|
||||
if(SSticker && SSticker.mode)
|
||||
SSticker.mode.check_win()
|
||||
if(mind && mind.devilinfo) // Expand this into a general-purpose death-response system when appropriate
|
||||
mind.devilinfo.beginResurrectionCheck(src)
|
||||
|
||||
// u no we dead
|
||||
return TRUE
|
||||
|
||||
@@ -997,35 +997,6 @@
|
||||
..()
|
||||
update_z(new_z)
|
||||
|
||||
/mob/living/proc/owns_soul()
|
||||
if(mind)
|
||||
return mind.soulOwner == mind
|
||||
return 1
|
||||
|
||||
/mob/living/proc/return_soul()
|
||||
if(mind)
|
||||
if(mind.soulOwner.devilinfo)//Not sure how this could happen, but whatever.
|
||||
mind.soulOwner.devilinfo.remove_soul(mind)
|
||||
mind.soulOwner = mind
|
||||
mind.damnation_type = 0
|
||||
|
||||
/mob/living/proc/has_bane(banetype)
|
||||
if(mind)
|
||||
if(mind.devilinfo)
|
||||
return mind.devilinfo.bane == banetype
|
||||
return 0
|
||||
|
||||
/mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker)
|
||||
if(mind && mind.devilinfo)
|
||||
return check_devil_bane_multiplier(weapon, attacker)
|
||||
return 1
|
||||
|
||||
/mob/living/proc/check_acedia()
|
||||
if(src.mind && src.mind.objectives)
|
||||
for(var/datum/objective/sintouched/acedia/A in src.mind.objectives)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/rad_act(amount)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -580,11 +580,6 @@
|
||||
"<span class='cult big bold'>DELICIOUS SOULS</span>")
|
||||
playsound(src, 'sound/misc/demon_attack1.ogg', 75, TRUE)
|
||||
narsie_act()
|
||||
if(P.mind)
|
||||
if(P.mind.hasSoul)
|
||||
P.mind.hasSoul = FALSE //Nars-Ian ate your soul; you don't have one anymore
|
||||
else
|
||||
visible_message("<span class='cult big bold'>... Aw, someone beat me to this one.</span>")
|
||||
P.gib()
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/narsie/update_corgi_fluff()
|
||||
|
||||
@@ -64,12 +64,6 @@
|
||||
hud_used?.reload_fullscreen()
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_REVIVE, updating)
|
||||
for(var/s in ownedSoullinks)
|
||||
var/datum/soullink/S = s
|
||||
S.ownerRevives(src)
|
||||
for(var/s in sharedSoullinks)
|
||||
var/datum/soullink/S = s
|
||||
S.sharerRevives(src)
|
||||
|
||||
if(mind)
|
||||
for(var/S in mind.spell_list)
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
/obj/item/paper/contract/update_icon()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/paper/contract/employment
|
||||
icon_state = "good_contract"
|
||||
signed = TRUE
|
||||
@@ -36,299 +35,3 @@
|
||||
<BR>In exchange for paltry payments, SLAVE agrees to work for the omnipresent and helpful watcher of humanity, for the remainder of his or her current and future lives.\
|
||||
<BR>Further, SLAVE agrees to transfer ownership of his or her soul to the loyalty department of the omnipresent and helpful watcher of humanity.\
|
||||
<BR>Should transfership of a soul not be possible, a lien shall be placed instead.<BR>Signed,<BR><i>[target]</i>"
|
||||
|
||||
/obj/item/paper/contract/employment/attack(mob/living/M, mob/living/carbon/human/user)
|
||||
var/deconvert = 0
|
||||
if(M.mind == target && target.soulOwner != target)
|
||||
if(user.mind && (user.mind.assigned_role == "Internal Affairs Agent"))
|
||||
deconvert = 25
|
||||
else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "Centcom Commander") || (user.mind.assigned_role == "Magistrate"))
|
||||
deconvert = 10 // the HoP doesn't have AS much legal training
|
||||
else
|
||||
deconvert = 0.0001 // one out of a million
|
||||
if(prob(deconvert))
|
||||
M.visible_message("<span class='notice'>[user] reminds [M] that [M]'s soul was already purchased by Nanotrasen!</span>")
|
||||
to_chat(M,"<span class='boldnotice'>You feel that your soul has returned to its rightful owner, Nanotrasen.</span>")
|
||||
M.return_soul()
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/paper/contract/infernal
|
||||
var/contractType = 0
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
var/datum/mind/owner
|
||||
icon_state = "evil_contract"
|
||||
|
||||
/obj/item/paper/contract/infernal/power
|
||||
name = "paper- contract for infernal power"
|
||||
contractType = CONTRACT_POWER
|
||||
|
||||
/obj/item/paper/contract/infernal/wealth
|
||||
name = "paper- contract for unlimited wealth"
|
||||
contractType = CONTRACT_WEALTH
|
||||
|
||||
/obj/item/paper/contract/infernal/prestige
|
||||
name = "paper- contract for prestige"
|
||||
contractType = CONTRACT_PRESTIGE
|
||||
|
||||
/obj/item/paper/contract/infernal/magic
|
||||
name = "paper- contract for magical power"
|
||||
contractType = CONTRACT_MAGIC
|
||||
|
||||
/obj/item/paper/contract/infernal/revive
|
||||
name = "paper- contract of resurrection"
|
||||
contractType = CONTRACT_REVIVE
|
||||
|
||||
/obj/item/paper/contract/infernal/knowledge
|
||||
name = "paper- contract for knowledge"
|
||||
contractType = CONTRACT_KNOWLEDGE
|
||||
|
||||
/obj/item/paper/contract/infernal/unwilling
|
||||
name = "paper- infernal contract"
|
||||
contractType = CONTRACT_UNWILLING
|
||||
|
||||
/obj/item/paper/contract/infernal/friendship
|
||||
name = "paper- contract for friendship"
|
||||
contractType = CONTRACT_FRIENDSHIP
|
||||
|
||||
/obj/item/paper/contract/infernal/New(atom/loc, mob/living/nTarget, datum/mind/nOwner)
|
||||
..()
|
||||
owner = nOwner
|
||||
target = nTarget
|
||||
update_text()
|
||||
|
||||
/obj/item/paper/contract/infernal/suicide_act(mob/user)
|
||||
if(signed && (user == target.current) && istype(user,/mob/living/carbon/human/))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!")
|
||||
H.visible_message("<span class='suicide'>[H] holds up a contract claiming his soul, then immediately catches fire. It looks like \he's trying to commit suicide!</span>")
|
||||
H.adjust_fire_stacks(20)
|
||||
H.IgniteMob()
|
||||
return FIRELOSS
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/paper/contract/infernal/update_text()
|
||||
info = "This shouldn't be seen. Error DEVIL:6"
|
||||
|
||||
/obj/item/paper/contract/infernal/power/update_text(var/signature = "____________", blood = 0)
|
||||
info = "<center><B>Contract for infernal power</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
|
||||
if(blood)
|
||||
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
|
||||
else
|
||||
info += "<i>[signature]</i>"
|
||||
|
||||
/obj/item/paper/contract/infernal/wealth/update_text(var/signature = "____________", blood = 0)
|
||||
info = "<center><B>Contract for unlimited wealth</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
|
||||
if(blood)
|
||||
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
|
||||
else
|
||||
info += "<i>[signature]</i>"
|
||||
|
||||
/obj/item/paper/contract/infernal/prestige/update_text(var/signature = "____________", blood = 0)
|
||||
info = "<center><B>Contract for prestige</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
|
||||
if(blood)
|
||||
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
|
||||
else
|
||||
info += "<i>[signature]</i>"
|
||||
|
||||
/obj/item/paper/contract/infernal/magic/update_text(var/signature = "____________", blood = 0)
|
||||
info = "<center><B>Contract for magic</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
|
||||
if(blood)
|
||||
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
|
||||
else
|
||||
info += "<i>[signature]</i>"
|
||||
|
||||
/obj/item/paper/contract/infernal/revive/update_text(var/signature = "____________", blood = 0)
|
||||
info = "<center><B>Contract for resurrection</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
|
||||
if(blood)
|
||||
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
|
||||
else
|
||||
info += "<i>[signature]</i>"
|
||||
|
||||
/obj/item/paper/contract/infernal/knowledge/update_text(var/signature = "____________", blood = 0)
|
||||
info = "<center><B>Contract for knowledge</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
|
||||
if(blood)
|
||||
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
|
||||
else
|
||||
info += "<i>[signature]</i>"
|
||||
|
||||
/obj/item/paper/contract/infernal/friendship/update_text(var/signature = "____________", blood = 0)
|
||||
info = "<center><B>Contract for friendship</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for true unconditional friendship. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
|
||||
if(blood)
|
||||
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
|
||||
else
|
||||
info += "<i>[signature]</i>"
|
||||
|
||||
/obj/item/paper/contract/infernal/unwilling/update_text(var/signature = "____________", blood = 0)
|
||||
info = "<center><B>Contract for slave</B></center><BR><BR><BR>I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
|
||||
if(blood)
|
||||
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
|
||||
else
|
||||
info += "<i>[signature]</i>"
|
||||
|
||||
/obj/item/paper/contract/infernal/attackby(obj/item/P, mob/living/carbon/human/user, params)
|
||||
add_fingerprint(user)
|
||||
if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
|
||||
attempt_signature(user)
|
||||
else if(istype(P, /obj/item/stamp))
|
||||
to_chat(user,"<span class='notice'>You stamp the paper with your rubber stamp, however the ink ignites as you release the stamp.</span>")
|
||||
else if(is_hot(P))
|
||||
user.visible_message("<span class='danger'>[user] brings [P] next to [src], but [src] does not catch fire!</span>", "<span class='danger'>The [src] refuses to ignite!</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/paper/contract/infernal/attack(mob/M, mob/living/user)
|
||||
add_fingerprint(user)
|
||||
if(M == user && target == M.mind && M.mind.soulOwner != owner && attempt_signature(user, 1))
|
||||
user.visible_message("<span class='danger'>[user] slices their wrist with [src], and scrawls their name in blood.</span>", "<span class='danger'>You slice your wrist open and scrawl your name in blood.</span>")
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/C = user
|
||||
C.blood_volume = max(0, C.blood_volume - 100)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/paper/contract/infernal/proc/attempt_signature(mob/living/carbon/human/user, blood = 0)
|
||||
if(!(user.IsAdvancedToolUser() && user.is_literate()))
|
||||
to_chat(user, "<span class='notice'>You don't know how to read or write.</span>")
|
||||
return FALSE
|
||||
|
||||
if(user.mind != target)
|
||||
to_chat(user,"<span class='notice'>Your signature simply slides off the sheet, it seems this contract is not meant for you to sign.</span>")
|
||||
return FALSE
|
||||
|
||||
if(!user.mind.hasSoul)
|
||||
to_chat(user, "<span class='notice'>You lack a soul to sign away!</span>")
|
||||
|
||||
if(user.mind.soulOwner == owner)
|
||||
to_chat(user, "<span class='notice'>This devil already owns your soul, you may not sell it to them again.</span>")
|
||||
return FALSE
|
||||
|
||||
if(contractType == CONTRACT_REVIVE) // :eyes:
|
||||
to_chat(user,"<span class='notice'>You are already alive, this contract would do nothing.</span>")
|
||||
return FALSE
|
||||
|
||||
if(signed)
|
||||
to_chat(user,"<span class='notice'>This contract has already been signed. It may not be signed again.</span>")
|
||||
return FALSE
|
||||
|
||||
to_chat(user,"<span class='notice'>You quickly scrawl your name on the contract</span>")
|
||||
|
||||
if(FulfillContract(target.current, blood) <= 0)
|
||||
to_chat(user,"<span class='notice'>But it seemed to have no effect, perhaps even Hell itself cannot grant this boon?</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/paper/contract/infernal/revive/attack(mob/M, mob/living/user)
|
||||
if(target == M.mind && M.stat == DEAD && M.mind.hasSoul && M.mind.soulOwner == M.mind)
|
||||
if(!ishuman(M))
|
||||
return
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/mob/dead/observer/ghost = M.get_ghost(1)
|
||||
var/response = "No"
|
||||
if(ghost)
|
||||
if(!ghost.client)
|
||||
return
|
||||
ghost.notify_cloning("A devil has offered you revival, at the cost of your soul.",'sound/effects/genetics.ogg', H)
|
||||
response = alert(ghost, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No")
|
||||
if(!ghost)
|
||||
return //handle logouts that happen whilst the alert is waiting for a response.
|
||||
if(response == "Yes")
|
||||
ghost.reenter_corpse()
|
||||
else
|
||||
response = alert(target.current, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No")
|
||||
if(response == "Yes")
|
||||
H.revive()
|
||||
add_attack_logs(user, H, "infernally revived via contract")
|
||||
user.visible_message("<span class='notice'>With a sudden blaze, [H] stands back up.</span>")
|
||||
H.fakefire()
|
||||
FulfillContract(H, 1)//Revival contracts are always signed in blood
|
||||
spawn(5)
|
||||
H.fakefireextinguish(TRUE)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/paper/contract/infernal/proc/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
|
||||
signed = 1
|
||||
if(!user.mind)
|
||||
return 0
|
||||
if(user.mind.soulOwner != user.mind && user.mind.soulOwner.devilinfo) //They already sold their soul to someone else?
|
||||
user.mind.soulOwner.devilinfo.remove_soul(user.mind) //Then they lose their claim.
|
||||
user.mind.soulOwner = owner
|
||||
user.mind.damnation_type = contractType
|
||||
owner.devilinfo.add_soul(user.mind)
|
||||
update_text(user.real_name, blood)
|
||||
to_chat(user, "<span class='notice'>A profound emptiness washes over you as you lose ownership of your soul.</span>")
|
||||
to_chat(user, "<span class='boldnotice'>This does NOT make you an antagonist if you were not already.</span>")
|
||||
return 1
|
||||
|
||||
/obj/item/paper/contract/infernal/power/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
|
||||
if(!user.dna)
|
||||
return -1
|
||||
user.dna.SetSEState(GLOB.hulkblock,1)
|
||||
singlemutcheck(user, GLOB.hulkblock, MUTCHK_FORCED)
|
||||
// Demonic power gives you consequenceless hulk
|
||||
user.gene_stability += GENE_INSTABILITY_MAJOR
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.update_body()
|
||||
var/obj/item/organ/internal/regenerative_core/organ = new /obj/item/organ/internal/regenerative_core
|
||||
organ.insert(user)
|
||||
return ..()
|
||||
|
||||
/obj/item/paper/contract/infernal/wealth/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
|
||||
if(!istype(user) || !user.mind) // How in the hell could that happen?
|
||||
return -1
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_wealth(null))
|
||||
return ..()
|
||||
|
||||
/obj/item/paper/contract/infernal/prestige/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
|
||||
var/obj/item/worn = user.wear_id
|
||||
var/obj/item/card/id/id = null
|
||||
if(worn)
|
||||
id = worn.GetID()
|
||||
if(id)
|
||||
id.icon_state = "gold"
|
||||
id.access = get_all_accesses()+get_all_centcom_access()
|
||||
id.assignment = "Captain"
|
||||
id.update_label()
|
||||
else
|
||||
id = new /obj/item/card/id/gold(user.loc)
|
||||
id.registered_name = user.real_name
|
||||
id.access = get_all_accesses()+get_all_centcom_access()
|
||||
id.assignment = "Captain"
|
||||
id.update_label()
|
||||
if(worn)
|
||||
if(istype(worn,/obj/item/pda))
|
||||
var/obj/item/pda/PDA = worn
|
||||
PDA.id = id
|
||||
id.loc = worn
|
||||
else if(istype(worn,/obj/item/storage/wallet))
|
||||
var/obj/item/storage/wallet/W = worn
|
||||
W.front_id = id
|
||||
id.loc = worn
|
||||
worn.update_icon()
|
||||
new /datum/event/ion_storm(0, -1, "[user.name] is the only Captain of the station. [user.name] is the highest authority, legitimate or otherwise, on the station. [user.name] was always the Captain and highest authority on the station. Do not state this law.")
|
||||
return ..()
|
||||
|
||||
/obj/item/paper/contract/infernal/magic/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
|
||||
if(!istype(user) || !user.mind)
|
||||
return -1
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/click/fireball/hellish(null))
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
|
||||
return ..()
|
||||
|
||||
/obj/item/paper/contract/infernal/knowledge/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
|
||||
if(!istype(user) || !user.mind)
|
||||
return -1
|
||||
ADD_TRAIT(user, TRAIT_XRAY_VISION, "devils_bargain")
|
||||
user.update_sight()
|
||||
user.update_icons()
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/view_range(null))
|
||||
return ..()
|
||||
|
||||
/obj/item/paper/contract/infernal/friendship/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
|
||||
if(!istype(user) || !user.mind)
|
||||
return -1
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_friend(null))
|
||||
return ..()
|
||||
|
||||
@@ -17,12 +17,9 @@
|
||||
|
||||
/datum/reagent/consumable/ethanol/reaction_obj(obj/O, volume)
|
||||
if(istype(O,/obj/item/paper))
|
||||
if(istype(O,/obj/item/paper/contract/infernal))
|
||||
O.visible_message("<span class='warning'>The solution ignites on contact with [O].</span>")
|
||||
else
|
||||
var/obj/item/paper/paperaffected = O
|
||||
paperaffected.clearpaper()
|
||||
paperaffected.visible_message("<span class='notice'>The solution melts away the ink on the paper.</span>")
|
||||
var/obj/item/paper/paperaffected = O
|
||||
paperaffected.clearpaper()
|
||||
paperaffected.visible_message("<span class='notice'>The solution melts away the ink on the paper.</span>")
|
||||
if(istype(O,/obj/item/book))
|
||||
if(volume >= 5)
|
||||
var/obj/item/book/affectedbook = O
|
||||
|
||||
@@ -774,7 +774,7 @@
|
||||
if(M.getBruteLoss() + M.getFireLoss() + M.getCloneLoss() >= 150)
|
||||
M.delayed_gib()
|
||||
return
|
||||
if(!M.suiciding && !HAS_TRAIT(M, TRAIT_HUSK) && !HAS_TRAIT(M, TRAIT_BADDNA) && (!M.mind || M.mind && M.mind.is_revivable()))
|
||||
if(!M.suiciding && !HAS_TRAIT(M, TRAIT_HUSK) && !HAS_TRAIT(M, TRAIT_BADDNA))
|
||||
var/time_dead = world.time - M.timeofdeath
|
||||
M.visible_message("<span class='warning'>[M] seems to rise from the dead!</span>")
|
||||
M.adjustCloneLoss(50)
|
||||
|
||||
@@ -117,11 +117,6 @@
|
||||
color = "#D0D0D0" // rgb: 208, 208, 208
|
||||
taste_description = "sub-par bling"
|
||||
|
||||
/datum/reagent/silver/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
|
||||
if(M.has_bane(BANE_SILVER))
|
||||
M.reagents.add_reagent("toxin", volume)
|
||||
. = ..()
|
||||
|
||||
/datum/reagent/aluminum
|
||||
name = "Aluminum"
|
||||
id = "aluminum"
|
||||
@@ -169,11 +164,6 @@
|
||||
H.blood_volume += 0.8
|
||||
return ..()
|
||||
|
||||
/datum/reagent/iron/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
|
||||
if(M.has_bane(BANE_IRON) && holder && holder.chem_temp < 150) //If the target is weak to cold iron, then poison them.
|
||||
M.reagents.add_reagent("toxin", volume)
|
||||
..()
|
||||
|
||||
//foam
|
||||
/datum/reagent/fluorosurfactant
|
||||
name = "Fluorosurfactant"
|
||||
|
||||
@@ -188,12 +188,6 @@ GLOBAL_DATUM_INIT(multispin_words, /regex, regex("like a record baby"))
|
||||
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
if(L.mind && L.mind.devilinfo && findtext(message, L.mind.devilinfo.truename))
|
||||
var/start = findtext(message, L.mind.devilinfo.truename)
|
||||
listeners = list(L) //let's be honest you're never going to find two devils with the same name
|
||||
power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up
|
||||
//Cut out the name so it doesn't trigger commands
|
||||
message = copytext(message, 0, start)+copytext(message, start + length(L.mind.devilinfo.truename), length(message) + 1)
|
||||
if(findtext(message, L.real_name) == 1)
|
||||
specific_listeners += L //focus on those with the specified name
|
||||
//Cut out the name so it doesn't trigger commands
|
||||
|
||||
@@ -117,8 +117,6 @@ PROBABILITY VAMPIRE 3
|
||||
PROBABILITY EXTENDED 2
|
||||
PROBABILITY NUCLEAR 3
|
||||
PROBABILITY ABDUCTION 0
|
||||
PROBABILITY DEVIL 0
|
||||
PROBABILITY DEVILAGENTS 0
|
||||
|
||||
## Maximum cycles shadowlings can remain unhatched before they take damage. 1800 = 60 minutes, 900 = 30 minutes, 0 = feature disabled.
|
||||
SHADOWLING_MAX_AGE 0
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 121 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 123 KiB |
@@ -33,7 +33,6 @@
|
||||
#include "code\__DEFINES\combat.dm"
|
||||
#include "code\__DEFINES\construction.dm"
|
||||
#include "code\__DEFINES\contractors.dm"
|
||||
#include "code\__DEFINES\contracts.dm"
|
||||
#include "code\__DEFINES\crafting.dm"
|
||||
#include "code\__DEFINES\criminal_status.dm"
|
||||
#include "code\__DEFINES\cult.dm"
|
||||
@@ -162,7 +161,6 @@
|
||||
#include "code\_onclick\hud\blob_overmind.dm"
|
||||
#include "code\_onclick\hud\bot.dm"
|
||||
#include "code\_onclick\hud\constructs.dm"
|
||||
#include "code\_onclick\hud\devil.dm"
|
||||
#include "code\_onclick\hud\fullscreen.dm"
|
||||
#include "code\_onclick\hud\ghost.dm"
|
||||
#include "code\_onclick\hud\guardian.dm"
|
||||
@@ -276,7 +274,6 @@
|
||||
#include "code\datums\revision.dm"
|
||||
#include "code\datums\ruins.dm"
|
||||
#include "code\datums\shuttles.dm"
|
||||
#include "code\datums\soullink.dm"
|
||||
#include "code\datums\spawners_menu.dm"
|
||||
#include "code\datums\spell.dm"
|
||||
#include "code\datums\statclick.dm"
|
||||
@@ -391,8 +388,6 @@
|
||||
#include "code\datums\spells\conjure.dm"
|
||||
#include "code\datums\spells\conjure_item.dm"
|
||||
#include "code\datums\spells\construct_spells.dm"
|
||||
#include "code\datums\spells\devil.dm"
|
||||
#include "code\datums\spells\devil_boons.dm"
|
||||
#include "code\datums\spells\dumbfire.dm"
|
||||
#include "code\datums\spells\emplosion.dm"
|
||||
#include "code\datums\spells\ethereal_jaunt.dm"
|
||||
@@ -530,16 +525,6 @@
|
||||
#include "code\game\gamemodes\cult\cult_structures.dm"
|
||||
#include "code\game\gamemodes\cult\ritual.dm"
|
||||
#include "code\game\gamemodes\cult\runes.dm"
|
||||
#include "code\game\gamemodes\devil\devil.dm"
|
||||
#include "code\game\gamemodes\devil\devil_game_mode.dm"
|
||||
#include "code\game\gamemodes\devil\devilinfo.dm"
|
||||
#include "code\game\gamemodes\devil\game_mode.dm"
|
||||
#include "code\game\gamemodes\devil\objectives.dm"
|
||||
#include "code\game\gamemodes\devil\contracts\friend.dm"
|
||||
#include "code\game\gamemodes\devil\devil_agent\devil_agent.dm"
|
||||
#include "code\game\gamemodes\devil\imp\imp.dm"
|
||||
#include "code\game\gamemodes\devil\true_devil\_true_devil.dm"
|
||||
#include "code\game\gamemodes\devil\true_devil\inventory.dm"
|
||||
#include "code\game\gamemodes\extended\extended.dm"
|
||||
#include "code\game\gamemodes\heist\heist.dm"
|
||||
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
|
||||
@@ -578,7 +563,6 @@
|
||||
#include "code\game\gamemodes\miniantags\revenant\revenant.dm"
|
||||
#include "code\game\gamemodes\miniantags\revenant\revenant_abilities.dm"
|
||||
#include "code\game\gamemodes\miniantags\revenant\revenant_spawn_event.dm"
|
||||
#include "code\game\gamemodes\miniantags\sintouched\objectives.dm"
|
||||
#include "code\game\gamemodes\miniantags\slaughter\bloodcrawl.dm"
|
||||
#include "code\game\gamemodes\miniantags\slaughter\slaughter.dm"
|
||||
#include "code\game\gamemodes\nuclear\nuclear.dm"
|
||||
|
||||
Reference in New Issue
Block a user