diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 1e4d92890254..3fd54d4968f8 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -9300,7 +9300,6 @@ /area/centcom/testchamber) "aug" = ( /obj/structure/table/wood, -/obj/item/twohanded/pitchfork/demonic/ascended, /obj/item/melee/powerfist, /turf/open/floor/wood, /area/centcom/testchamber) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 1f04f5d9454f..c868613d2b59 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -40,8 +40,6 @@ #define ui_lingchemdisplay "WEST,CENTER-1:15" #define ui_lingstingdisplay "WEST:6,CENTER-3:11" -#define ui_devilsouldisplay "WEST:6,CENTER-1:15" - //Lower center, persistent menu #define ui_sstore1 "CENTER-5:10,SOUTH:5" #define ui_id "CENTER-4:12,SOUTH:5" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index cd7cf7f0478c..6099733e7c06 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -107,8 +107,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isalienqueen(A) (istype(A, /mob/living/carbon/alien/humanoid/royal/queen)) -#define isdevil(A) (istype(A, /mob/living/carbon/true_devil)) - //Silicon mobs #define issilicon(A) (istype(A, /mob/living/silicon)) @@ -162,7 +160,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define issupplypod(A) (istype(A, /obj/structure/closet/supplypod)) GLOBAL_LIST_INIT(shoefootmob, typecacheof(list( - /mob/living/carbon/human/, + /mob/living/carbon/human, /mob/living/simple_animal/cow, /mob/living/simple_animal/hostile/cat_butcherer, /mob/living/simple_animal/hostile/faithless, @@ -176,7 +174,6 @@ GLOBAL_LIST_INIT(shoefootmob, typecacheof(list( /mob/living/simple_animal/hostile/retaliate/spaceman, /mob/living/simple_animal/hostile/retaliate/nanotrasenpeace, /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/carbon/true_devil, ))) GLOBAL_LIST_INIT(clawfootmob, typecacheof(list( diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index b333b7f18059..541fe9e9253c 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -12,7 +12,6 @@ #define LANGUAGE_APHASIA "aphasia" #define LANGUAGE_CULTIST "cultist" #define LANGUAGE_CURATOR "curator" -#define LANGUAGE_DEVIL "devil" #define LANGUAGE_GLAND "gland" #define LANGUAGE_HAT "hat" #define LANGUAGE_HIGH "high" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a1b8fa4e6387..e6b4b612f86b 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -98,7 +98,6 @@ #define MONKEY_BODYPART "monkey" #define ALIEN_BODYPART "alien" #define LARVA_BODYPART "larva" -#define DEVIL_BODYPART "devil" /*see __DEFINES/inventory.dm for bodypart bitflag defines*/ //Reagent Metabolization flags, defines the type of reagents that affect this mob diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index d835e5a0fea7..b19919dd92d3 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -26,7 +26,6 @@ #define ROLE_MONKEY "Monkey" #define ROLE_ABDUCTOR "Abductor" #define ROLE_REVENANT "Revenant" -#define ROLE_DEVIL "Devil" #define ROLE_SERVANT_OF_RATVAR "Servant of Ratvar" #define ROLE_BROTHER "Blood Brother" #define ROLE_BRAINWASHED "Brainwashed Victim" @@ -84,7 +83,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_MONKEY = /datum/antagonist/monkey, ROLE_ABDUCTOR = /datum/antagonist/abductor, ROLE_REVENANT = /datum/antagonist/revenant, - ROLE_DEVIL = /datum/antagonist/devil, ROLE_SERVANT_OF_RATVAR = /datum/antagonist/clockcult, ROLE_BROTHER = /datum/antagonist/brother, ROLE_BRAINWASHED = /datum/antagonist/brainwashed, diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 63edf6f14ef0..cb8e7bc9a13b 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -270,6 +270,9 @@ ///This mob can't use vehicles #define TRAIT_NOVEHICLE "no_vehicle" +///Trait given to a mob's mind to indicate they can't be revived due to otherworldly events. +#define TRAIT_HELLBOUND "hellbound" + /// This person is crying #define TRAIT_CRYING "crying" /// This human wants to see the color of their glasses, for some reason diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 4d29da2282aa..ba35d123cd95 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -334,8 +334,6 @@ Turf and target are separate in case you want to teleport some distance from a t moblist.Add(M) for(var/mob/living/simple_animal/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/true_devil/M in sortmob) - moblist.Add(M) return moblist // Format a power value in W, kW, MW, or GW. diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index bc5434c47fbe..d4dc642ce440 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(tdome2) GLOBAL_LIST_EMPTY(tdomeobserve) GLOBAL_LIST_EMPTY(tdomeadmin) GLOBAL_LIST_EMPTY(prisonwarped) //list of players already warped -GLOBAL_LIST_EMPTY(blobstart) //stationloving objects, blobs, santa, respawning devils +GLOBAL_LIST_EMPTY(blobstart) //stationloving objects, blobs, santa GLOBAL_LIST_EMPTY(secequipment) //sec equipment lockers that scale with the number of sec players GLOBAL_LIST_EMPTY(deathsquadspawn) GLOBAL_LIST_EMPTY(emergencyresponseteamspawn) diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm deleted file mode 100644 index 3e4b39832322..000000000000 --- a/code/_onclick/hud/devil.dm +++ /dev/null @@ -1,60 +0,0 @@ - -//Soul counter is stored with the humans, it does weird when you place it here apparently... - - -/datum/hud/devil/New(mob/owner) - ..() - var/atom/movable/screen/using - - using = new /atom/movable/screen/drop() - using.icon = ui_style - using.screen_loc = ui_drone_drop - static_inventory += using - - pull_icon = new /atom/movable/screen/pull() - pull_icon.icon = ui_style - pull_icon.update_icon(mymob) - pull_icon.screen_loc = ui_drone_pull - static_inventory += pull_icon - - build_hand_slots() - - using = new /atom/movable/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.icon_state = "swap_1_m" - using.screen_loc = ui_swaphand_position(owner,1) - using.layer = HUD_LAYER - using.plane = HUD_PLANE - static_inventory += using - - using = new /atom/movable/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.icon_state = "swap_2" - using.screen_loc = ui_swaphand_position(owner,2) - using.layer = HUD_LAYER - using.plane = HUD_PLANE - static_inventory += using - - zone_select = new /atom/movable/screen/zone_sel() - zone_select.icon = ui_style - zone_select.update_icon(mymob) - - devilsouldisplay = new /atom/movable/screen/devil/soul_counter - infodisplay += devilsouldisplay - - -/datum/hud/devil/persistent_inventory_update() - if(!mymob) - return - var/mob/living/carbon/true_devil/D = mymob - - if(hud_version != HUD_STYLE_NOHUD) - for(var/obj/item/I in D.held_items) - I.screen_loc = ui_hand_position(D.get_held_index_of_item(I)) - D.client.screen += I - else - for(var/obj/item/I in D.held_items) - I.screen_loc = null - D.client.screen -= I diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 3dcce9b09a83..224670e59e75 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -31,8 +31,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/alien_plasma_display var/atom/movable/screen/alien_queen_finder - var/atom/movable/screen/devil/soul_counter/devilsouldisplay - var/atom/movable/screen/action_intent var/atom/movable/screen/zone_select var/atom/movable/screen/pull_icon @@ -114,7 +112,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( healths = null stamina = null healthdoll = null - devilsouldisplay = null blobpwrdisplay = null alien_plasma_display = null alien_queen_finder = null diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index a887012f4cb6..ac1739c7aa5e 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -33,35 +33,6 @@ var/mob/living/carbon/human/H = usr H.quick_equip() -/atom/movable/screen/devil - invisibility = INVISIBILITY_ABSTRACT - -/atom/movable/screen/devil/soul_counter - icon = 'icons/mob/screen_gen.dmi' - name = "souls owned" - icon_state = "Devil-6" - screen_loc = ui_devilsouldisplay - -/atom/movable/screen/devil/soul_counter/proc/update_counter(souls) - invisibility = 0 - maptext = ANTAG_MAPTEXT(souls, COLOR_RED) - 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" - -/atom/movable/screen/devil/soul_counter/proc/clear() - invisibility = INVISIBILITY_ABSTRACT - /atom/movable/screen/ling/sting name = "current sting" screen_loc = ui_lingstingdisplay @@ -292,9 +263,6 @@ pull_icon.screen_loc = ui_above_intent static_inventory += pull_icon - devilsouldisplay = new /atom/movable/screen/devil/soul_counter - infodisplay += devilsouldisplay - zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.update_icon(mymob) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 45aa05ea2801..8cdf6039e574 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -202,13 +202,6 @@ /atom/proc/attack_drone(mob/living/simple_animal/drone/user) attack_hand(user) //defaults to attack_hand. Override it when you don't want drones to do same stuff as humans. -/* - True Devil -*/ - -/mob/living/carbon/true_devil/UnarmedAttack(atom/A, proximity) - A.attack_hand(src) - /* Brain */ diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 5597f8f573f5..a2f4441aa580 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -1,4 +1,3 @@ -#define LAW_DEVIL "devil" #define LAW_ZEROTH "zeroth" #define LAW_INHERENT "inherent" #define LAW_SUPPLIED "supplied" @@ -15,7 +14,6 @@ var/list/ion = list() var/list/hacked = list() var/mob/living/silicon/owner - var/list/devillaws = list() var/id = DEFAULT_AI_LAWID /datum/ai_laws/proc/lawid_to_type(lawid) @@ -487,8 +485,6 @@ /datum/ai_laws/proc/get_law_amount(groups) var/law_amount = 0 - if(devillaws && (LAW_DEVIL in groups)) - law_amount++ if(zeroth && (LAW_ZEROTH in groups)) law_amount++ if(ion.len && (LAW_ION in groups)) @@ -504,9 +500,6 @@ law_amount++ return law_amount -/datum/ai_laws/proc/set_law_sixsixsix(laws) - devillaws = laws - /datum/ai_laws/proc/set_zeroth_law(law, law_borg = null) zeroth = law if(law_borg) //Making it possible for slaved borgs to see a different law 0 than their AI. --NEO @@ -643,10 +636,6 @@ zeroth = null zeroth_borg = null -/datum/ai_laws/proc/clear_law_sixsixsix(force) - if(force || !is_devil(owner)) - devillaws = null - /datum/ai_laws/proc/associate(mob/living/silicon/M) if(!owner) owner = M @@ -654,10 +643,6 @@ /datum/ai_laws/proc/get_law_list(include_zeroth = 0, show_numbers = 1) var/list/data = list() - if (include_zeroth && devillaws && devillaws.len) - for(var/i in devillaws) - data += "[show_numbers ? "666:" : ""] [i]" - if (include_zeroth && zeroth) data += "[show_numbers ? "0:" : ""] [zeroth]" diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d99069f8125a..4ed8b69605fe 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -706,9 +706,6 @@ add_antag_datum(head) special_role = ROLE_REV_HEAD -/datum/mind/proc/owns_soul() - return soulOwner == src - /datum/mind/proc/transfer_martial_arts(mob/living/new_character) if(!ishuman(new_character)) return diff --git a/code/datums/soullink.dm b/code/datums/soullink.dm deleted file mode 100644 index de73a8e74c6d..000000000000 --- a/code/datums/soullink.dm +++ /dev/null @@ -1,160 +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) - -//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) - - -///////////////// -// 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) diff --git a/code/game/gamemodes/devil/devil agent/devil_agent.dm b/code/game/gamemodes/devil/devil agent/devil_agent.dm deleted file mode 100644 index c8fb62faba09..000000000000 --- a/code/game/gamemodes/devil/devil agent/devil_agent.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/game_mode/devil/devil_agents - name = "Devil Agents" - config_tag = "devil_agents" - required_players = 25 - required_enemies = 3 - recommended_enemies = 8 - reroll_friendly = 0 - - traitors_possible = 10 //hard limit on traitors if scaling is turned off - num_modifier = 4 - objective_count = 2 - - var/list/devil_target_list = list() //will update to be a child of internal affairs when bothered - var/list/devil_late_joining_list = list() - minimum_devils = 3 - - announce_text = "There are devil agents onboard the station, trying to outbid each other!\n\ - + Devils: Purchase souls and interfere with your rivals!\n\ - + Crew: Resist the lure of sin and remain pure!" - -/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 - devil_target_list[devil] = devils[i + 1] - ..() - -/datum/game_mode/devil/devil_agents/add_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(devil_target_list.len && devil_target_list[devil]) // Is a double agent - var/datum/mind/target_mind = devil_target_list[devil] - var/datum/antagonist/devil/D = target_mind.has_antag_datum(/datum/antagonist/devil) - var/datum/objective/devil/outsell/outsellobjective = new - outsellobjective.owner = devil - outsellobjective.target = target_mind - outsellobjective.update_explanation_text() - D.objectives += outsellobjective - return 1 - return 0 diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm deleted file mode 100644 index c329f724330b..000000000000 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ /dev/null @@ -1,105 +0,0 @@ -/datum/game_mode/devil - name = "devil" - config_tag = "devil" - report_type = "devil" - antag_flag = ROLE_DEVIL - false_report_weight = 1 - protected_jobs = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") - required_players = 25 - required_enemies = 1 - recommended_enemies = 4 - reroll_friendly = 1 - enemy_minimum_age = 0 - title_icon = "devil" - restricted_jobs = list("Cyborg", "AI") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician") //YOGS - added the hop and brig physician - - 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 - - announce_text = "There are devils onboard the station!\n\ - + Devils: Purchase souls and tempt the crew to sin!\n\ - + Crew: Resist the lure of sin and remain pure!" - -/datum/game_mode/devil/pre_setup() - if(CONFIG_GET(flag/protect_roles_from_antagonist)) - restricted_jobs += protected_jobs - if(CONFIG_GET(flag/protect_assistant_from_antagonist)) - restricted_jobs += "Assistant" - - var/num_devils = 1 - - var/tsc = CONFIG_GET(number/traitor_scaling_coeff) - if(tsc) - num_devils = max(minimum_devils, min( round(num_players() / (tsc * 3))+ 2 + num_modifier, round(num_players() / (tsc * 1.5)) + num_modifier)) - else - num_devils = max(minimum_devils, min(num_players(), traitors_possible)) - - for(var/j = 0, j < num_devils, j++) - if (!antag_candidates.len) - break - var/datum/mind/devil = antag_pick(antag_candidates) - devils += devil - devil.special_role = traitor_name - devil.restricted_roles = restricted_jobs - - //log_game("[key_name(devil)] has been selected as a [traitor_name]") | yogs - redundant - antag_candidates.Remove(devil) - - if(devils.len < required_enemies) - setup_error = "Not enough devil candidates" - return 0 - return 1 - - -/datum/game_mode/devil/post_setup() - for(var/datum/mind/devil in devils) - post_setup_finalize(devil) - ..() - return 1 - -/datum/game_mode/devil/generate_report() - return "Infernal creatures have been seen nearby offering great boons in exchange for souls. This is considered theft against Nanotrasen, as all employment contracts contain a lien on the \ - employee's soul. If anyone sells their soul in error, contact an attorney to overrule the sale. Be warned that if the devil purchases enough souls, a gateway to hell may open." - -/datum/game_mode/devil/proc/post_setup_finalize(datum/mind/devil) - add_devil(devil.current, ascendable = TRUE) //Devil gamemode devils are ascendable. - add_devil_objectives(devil,2) - -/proc/is_devil(mob/living/M) - return M?.mind?.has_antag_datum(/datum/antagonist/devil) - -/proc/add_devil(mob/living/L, ascendable = FALSE) - if(!L || !L.mind) - return FALSE - var/datum/antagonist/devil/devil_datum = L.mind.add_antag_datum(/datum/antagonist/devil) - devil_datum.ascendable = ascendable - return devil_datum - -/proc/remove_devil(mob/living/L) - if(!L || !L.mind) - return FALSE - var/datum/antagonist/devil_datum = L.mind.has_antag_datum(/datum/antagonist/devil) - devil_datum.on_removal() - return TRUE - -/datum/game_mode/devil/generate_credit_text() - var/list/round_credits = list() - var/len_before_addition - - round_credits += "

The Tempting Devils:

" - len_before_addition = round_credits.len - var/datum/antagonist/devil/devil_info - for(var/datum/mind/devil in devils) - devil_info = devil.has_antag_datum(/datum/antagonist/devil) - if(devil_info) // This should never fail, but better to be sure - round_credits += "

[devil_info.truename] in the form of [devil.name]

" - devil_info = null - if(len_before_addition == round_credits.len) - round_credits += list("

The devils were all utterly destroyed!

", "

The love of Space Jesus shines through!

") - round_credits += "
" - - round_credits += ..() - return round_credits diff --git a/code/game/gamemodes/devil/game_mode.dm b/code/game/gamemodes/devil/game_mode.dm deleted file mode 100644 index eca95a011310..000000000000 --- a/code/game/gamemodes/devil/game_mode.dm +++ /dev/null @@ -1,16 +0,0 @@ -/datum/game_mode - var/list/datum/mind/devils = list() - var/devil_ascended = 0 // Number of arch devils on station - -/datum/game_mode/proc/add_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) - var/datum/antagonist/devil/D = devil_mind.has_antag_datum(/datum/antagonist/devil) - for(var/i = 1 to quantity) - var/type = pick(validtypes) - var/datum/objective/devil/objective = new type(null) - objective.owner = devil_mind - D.objectives += objective - if(!istype(objective, /datum/objective/devil/buy_target)) - validtypes -= type //prevent duplicate objectives, EXCEPT for buy_target. - else - objective.find_target() diff --git a/code/game/gamemodes/devil/objectives.dm b/code/game/gamemodes/devil/objectives.dm deleted file mode 100644 index 2ded4c5f1c8f..000000000000 --- a/code/game/gamemodes/devil/objectives.dm +++ /dev/null @@ -1,121 +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/soulquantity/update_explanation_text() - explanation_text = "Purchase, and retain control over at least [target_amount] souls." - -/datum/objective/devil/soulquantity/check_completion() - if(..()) - return TRUE - var/count = 0 - var/datum/antagonist/devil/devilDatum = owner.has_antag_datum(/datum/antagonist/devil) - var/list/souls = devilDatum.soulsOwned - for(var/S in souls) //Just a sanity check. - 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/*, CONTRACT_UNWILLING*/) - 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() - if(..()) - return TRUE - var/count = 0 - var/datum/antagonist/devil/devilDatum = owner.has_antag_datum(/datum/antagonist/devil) - var/list/souls = devilDatum.soulsOwned - for(var/S in souls) - var/datum/mind/L = S - if(!L.owns_soul() && 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() - if(..()) - return TRUE - var/list/touched = get_antag_minds(/datum/antagonist/sintouched) - return touched.len >= target_amount - - -/datum/objective/devil/buy_target - explanation_text = "You shouldn't see this text. Error:DEVIL4" - -/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/New() - -/datum/objective/devil/outsell/update_explanation_text() - var/datum/antagonist/devil/opponent = target.has_antag_datum(/datum/antagonist/devil) - explanation_text = "Purchase and retain control over more souls than [opponent.truename], known to mortals as [target.name], the [target.assigned_role]." - -/datum/objective/devil/outsell/check_completion() - if(..()) - return TRUE - var/selfcount = 0 - var/datum/antagonist/devil/devilDatum = owner.has_antag_datum(/datum/antagonist/devil) - var/list/souls = devilDatum.soulsOwned - for(var/S in souls) - var/datum/mind/L = S - if(L.soulOwner == owner) - selfcount++ - var/targetcount = 0 - devilDatum = target.has_antag_datum(/datum/antagonist/devil) - souls = devilDatum.soulsOwned - for(var/S in souls) - var/datum/mind/L = S - if(L.soulOwner == target) - targetcount++ - return selfcount > targetcount diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 109fb635805a..8c0e6ff1c1f8 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -688,59 +688,6 @@ V.assigned_role = "Clown Operative" V.special_role = "Clown Operative" -////////////////////////////////////////////// -// // -// DEVIL // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/roundstart/devil - name = "Devil" - antag_flag = ROLE_DEVIL - antag_datum = /datum/antagonist/devil - restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") - required_candidates = 1 - weight = 1 - cost = 60 - flags = LONE_RULESET - requirements = list(101,101,101,101,101,101,101,101,101,101) - antag_cap = list("denominator" = 30) - minimum_players = 25 - -/datum/dynamic_ruleset/roundstart/devil/pre_execute(population) - . = ..() - var/num_devils = get_antag_cap(population) * (scaled_times + 1) - - for(var/j = 0, j < num_devils, j++) - if (!candidates.len) - break - var/mob/devil = pick_n_take(candidates) - assigned += devil.mind - devil.mind.special_role = ROLE_DEVIL - devil.mind.restricted_roles = restricted_roles - - log_game("[key_name(devil)] has been selected as a devil") - return TRUE - -/datum/dynamic_ruleset/roundstart/devil/execute() - for(var/datum/mind/devil in assigned) - add_devil(devil.current, ascendable = TRUE) - add_devil_objectives(devil,2) - return TRUE - -/datum/dynamic_ruleset/roundstart/devil/proc/add_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) - var/datum/antagonist/devil/D = devil_mind.has_antag_datum(/datum/antagonist/devil) - for(var/i = 1 to quantity) - var/type = pick(validtypes) - var/datum/objective/devil/objective = new type(null) - objective.owner = devil_mind - D.objectives += objective - if(!istype(objective, /datum/objective/devil/buy_target)) - validtypes -= type - else - objective.find_target() - ////////////////////////////////////////////// // // // MONKEY // diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index f2402efb8b25..58551454cfe6 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -329,7 +329,7 @@ GLOBAL_VAR_INIT(clones, 0) var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department) if(D) D.adjust_money(fair_market_price) - if(mob_occupant && (mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. + if(mob_occupant && (mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || (mob_occupant.mind && HAS_TRAIT(mob_occupant.mind, TRAIT_HELLBOUND))) //Autoeject corpses and suiciding dudes. connected_message("Clone Rejected: Deceased.") if(internal_radio) SPEAK("The cloning of [mob_occupant.real_name] has been \ diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index b5ca55cbf96c..538508e2d70f 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1,7 +1,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/storage/box/snappops = 2, /obj/item/toy/talking/AI = 2, - /obj/item/toy/talking/codex_gigas = 2, + /obj/item/toy/codex_gigas = 2, /obj/item/clothing/under/syndicate/tacticool = 2, /obj/item/toy/sword = 2, /obj/item/twohanded/vxtvulhammer/toy = 2, diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index f2de6d295cd9..d2bb87fc3fe6 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -627,7 +627,7 @@ if(!istype(dna)) scantemp = "Unable to locate valid genetic data." return FALSE - if(!body_only && (mob_occupant.suiciding || mob_occupant.hellbound)) + if(!body_only && (mob_occupant.suiciding || (mob_occupant.mind && HAS_TRAIT(mob_occupant.mind, TRAIT_HELLBOUND)))) scantemp = "Subject's brain is not responding to scanning stimuli." return FALSE if(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 2a2b909299ed..af7bd89d0142 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -294,7 +294,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) return INITIALIZE_HINT_QDEL //objects with the stationloving component (nuke disk) respawn here. -//also blobs that have their spawn forcemoved (running out of time when picking their spawn spot), santa and respawning devils +//also blobs that have their spawn forcemoved (running out of time when picking their spawn spot) and santa /obj/effect/landmark/blobstart name = "blobstart" icon_state = "blob_start" diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm index 2e8d62b28371..b440f4a71a8d 100644 --- a/code/game/objects/items/AI_modules.dm +++ b/code/game/objects/items/AI_modules.dm @@ -49,7 +49,7 @@ AI MODULES //Handle the lawcap if(law_datum) var/tot_laws = 0 - for(var/lawlist in list(law_datum.devillaws, law_datum.inherent, law_datum.supplied, law_datum.ion, law_datum.hacked, laws)) + for(var/lawlist in list(law_datum.inherent, law_datum.supplied, law_datum.ion, law_datum.hacked, laws)) for(var/mylaw in lawlist) if(mylaw != "") tot_laws++ diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 46ffad89b726..06d00128157f 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -586,7 +586,7 @@ if (H.suiciding) failed = span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile.") - else if (H.hellbound) + else if (H.mind && HAS_TRAIT(H.mind, TRAIT_HELLBOUND)) failed = span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul unrecoverable. Further attempts futile.") else if(total_burn >= MAX_REVIVE_FIRE_DAMAGE || total_brute >= MAX_REVIVE_BRUTE_DAMAGE) failed = span_boldnotice("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Surgical repair may allow for successful resuscitation.") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b7dbd2c8e38e..2e743275473d 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -584,6 +584,14 @@ icon_state = "reticenceprize" quiet = 1 +/obj/item/toy/codex_gigas + name = "Toy Codex Gigas" + desc = "A tool to help you write fictional devils!" + icon = 'icons/obj/library.dmi' + icon_state = "demonomicon" + lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL /obj/item/toy/talking name = "talking action figure" @@ -645,32 +653,6 @@ /obj/item/toy/talking/AI/generate_messages() return list(generate_ion_law()) -/obj/item/toy/talking/codex_gigas - name = "Toy Codex Gigas" - desc = "A tool to help you write fictional devils!" - icon = 'icons/obj/library.dmi' - icon_state = "demonomicon" - lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi' - w_class = WEIGHT_CLASS_SMALL - recharge_time = 60 - -/obj/item/toy/talking/codex_gigas/activation_message(mob/user) - user.visible_message( - span_notice("[user] presses the button on \the [src]."), - span_notice("You press the button on \the [src]."), - span_notice("You hear a soft click.")) - -/obj/item/toy/talking/codex_gigas/generate_messages() - var/datum/fakeDevil/devil = new - var/list/messages = list() - 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]]" - return messages - /obj/item/toy/talking/owl name = "owl action figure" desc = "An action figure modeled after 'The Owl', defender of justice." diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index ec890b100ebf..1e46e7db0199 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -849,64 +849,6 @@ throwforce = 23 force_wielded = 6 -/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_wielded = 6 - light_system = MOVABLE_LIGHT - light_range = 3 - light_power = 6 - light_color = LIGHT_COLOR_RED - -/obj/item/twohanded/pitchfork/demonic/greater - force = 24 - throwforce = 50 - force_wielded = 10 - -/obj/item/twohanded/pitchfork/demonic/ascended - force = 100 - throwforce = 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_suicide("[user] impales [user.p_them()]self in [user.p_their()] abdomen with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - return (BRUTELOSS) - -/obj/item/twohanded/pitchfork/demonic/pickup(mob/living/user) - . = ..() - if(isliving(user) && user.mind && user.owns_soul() && !is_devil(user)) - var/mob/living/U = user - U.visible_message(span_warning("As [U] picks [src] up, [U]'s arms briefly catch fire."), \ - span_warning("\"As you pick up [src] your arms ignite, reminding you of all your past sins.\"")) - if(ishuman(U)) - var/mob/living/carbon/human/H = U - H.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_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.owns_soul() && !is_devil(user)) - to_chat(user, "[src] burns in your hands.") - user.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) - ..() - -/obj/item/twohanded/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity || !wielded) - return - if(iswallturf(target)) - var/turf/closed/wall/W = target - user.visible_message(span_danger("[user] blasts \the [target] with \the [src]!")) - playsound(target, 'sound/magic/disintegrate.ogg', 100, 1) - W.break_wall() - W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - return - //HF blade /obj/item/twohanded/vibro_weapon diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index e6923a09f890..b641ee426890 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -407,48 +407,6 @@ new/obj/structure/fluff/empty_sleeper/syndicate(get_turf(src)) ..() -/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/datum/action/cooldown/spell/summon_friend/spell - var/datum/mind/owner - assignedrole = "SuperFriend" - -/obj/effect/mob_spawn/human/demonic_friend/Initialize(mapload, datum/mind/owner_mind, datum/action/cooldown/spell/summon_friend/summoning_spell) - . = ..() - owner = owner_mind - 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." - important_info = "Be aware that if you do not live up to [owner.name]'s expectations, 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_ATTACKORBIT, flashwindow = FALSE) - 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.fully_replace_character_name(null,"[owner.name]'s best friend") - soullink(/datum/soullink/oneway, owner.current, L) - spell.friend = L - 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() - else - to_chat(L, span_userdanger("Your owner is already dead! You will soon perish.")) - addtimer(CALLBACK(L, TYPE_PROC_REF(/mob, dust), 150)) //Give em a few seconds as a mercy. - /datum/outfit/demonic_friend name = "Demonic Friend" uniform = /obj/item/clothing/under/assistantformal diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index f02d14fe7fe4..107cbe9354cb 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -188,7 +188,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an for(var/mob/living/M in compiled) var/mob/living/mob_occupant = get_mob_or_brainmob(M) - if(mob_occupant.client && !mob_occupant.suiciding && !(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) && !mob_occupant.hellbound) + if(mob_occupant.client && !mob_occupant.suiciding && !(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) && !(mob_occupant.mind && HAS_TRAIT(mob_occupant.mind, TRAIT_HELLBOUND))) icon_state = "morgue4" // Cloneable if(mob_occupant.stat == DEAD && beeper) if(world.time > next_beep) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 94a5b4ed4d58..83f1b65b2749 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -837,22 +837,6 @@ if(!ai_number) to_chat(usr, "No AIs located" , confidential=TRUE) -/datum/admins/proc/output_all_devil_info() - var/devil_number = 0 - for(var/datum/mind/D in SSticker.mode.devils) - devil_number++ - var/datum/antagonist/devil/devil = D.has_antag_datum(/datum/antagonist/devil) - to_chat(usr, "Devil #[devil_number]:

" + devil.printdevilinfo(), confidential=TRUE) - if(!devil_number) - to_chat(usr, "No Devils located" , confidential=TRUE) - -/datum/admins/proc/output_devil_info(mob/living/M) - if(is_devil(M)) - var/datum/antagonist/devil/devil = M.mind.has_antag_datum(/datum/antagonist/devil) - to_chat(usr, devil.printdevilinfo(), confidential=TRUE) - else - to_chat(usr, "[M] is not a devil.", confidential=TRUE) - /datum/admins/proc/manage_free_slots() if(!check_rights()) return diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index da6408ac1485..25e7e21cec36 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -295,7 +295,7 @@ "Ghost and Other Roles" = list(ROLE_BRAINWASHED, ROLE_DEATHSQUAD, ROLE_DRONE, ROLE_FUGITIVE, ROLE_HOLOPARASITE, ROLE_HORROR, ROLE_LAVALAND, ROLE_MIND_TRANSFER, ROLE_POSIBRAIN, ROLE_SENTIENCE, ROLE_MOUSE, ROLE_GOLEM, ROLE_GHOSTBEACON), "Antagonist Positions" = list(ROLE_ABDUCTOR, ROLE_ALIEN, ROLE_BLOB, ROLE_BLOODSUCKER, ROLE_BROTHER, ROLE_CHANGELING, ROLE_CULTIST, - ROLE_DEVIL, ROLE_FUGITIVE, ROLE_HOLOPARASITE, ROLE_INTERNAL_AFFAIRS, ROLE_MALF, + ROLE_FUGITIVE, ROLE_HOLOPARASITE, ROLE_INTERNAL_AFFAIRS, ROLE_MALF, ROLE_MONKEY, ROLE_MONSTERHUNTER, ROLE_NINJA, ROLE_OPERATIVE, ROLE_REV, ROLE_REVENANT, ROLE_SINFULDEMON, ROLE_REV_HEAD, ROLE_SERVANT_OF_RATVAR, ROLE_SYNDICATE, diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 57f6fbf87d68..bf8211330027 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1303,12 +1303,6 @@ return output_ai_laws() - else if(href_list["admincheckdevilinfo"]) - if(!check_rights(R_ADMIN)) - return - var/mob/M = locate(href_list["admincheckdevilinfo"]) - output_devil_info(M) - else if(href_list["adminmoreinfo"]) var/mob/M = locate(href_list["adminmoreinfo"]) in GLOB.mob_list adminmoreinfo(M) diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm deleted file mode 100644 index e44f93d7628e..000000000000 --- a/code/modules/antagonists/devil/devil.dm +++ /dev/null @@ -1,601 +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 60 SECONDS - -GLOBAL_LIST_EMPTY(allDevils) -GLOBAL_LIST_INIT(lawlorify, list ( - LORE = list( - OBLIGATION_FOOD = "This devil seems to always offer its 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 annointed 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_STRIKEUNCONSCIOUS = "This devil only shows interest in those who are awake.", - BAN_HURTLIZARD = "This devil will not strike a lizardman first.", - BAN_HURTANIMAL = "This devil avoids hurting animals.", - BANISH_WATER = "To banish the devil, you must infuse its body with holy water.", - BANISH_COFFIN = "This devil will return to life if its remains are not placed within a coffin.", - BANISH_FORMALDYHIDE = "To banish the devil, you must inject its lifeless body with embalming fluid.", - BANISH_RUNES = "This devil will resurrect after death, unless its remains are within a rune.", - BANISH_CANDLES = "A large number of nearby lit candles will prevent it from resurrecting.", - BANISH_DESTRUCTION = "Its 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_STRIKEUNCONSCIOUS = "You must never strike an unconscious person.", - BAN_HURTLIZARD = "You must never harm a lizardman 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 its 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." - ) - )) - -//These are also used in the codex gigas, so let's declare them globally. -GLOBAL_LIST_INIT(devil_pre_title, list("Dark ", "Hellish ", "Fallen ", "Fiery ", "Sinful ", "Blood ", "Fluffy ")) -GLOBAL_LIST_INIT(devil_title, list("Lord ", "Prelate ", "Count ", "Viscount ", "Vizier ", "Elder ", "Adept ")) -GLOBAL_LIST_INIT(devil_syllable, list("hal", "ve", "odr", "neit", "ci", "quon", "mya", "folth", "wren", "geyr", "hil", "niet", "twou", "phi", "coa")) -GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr.")) - -/* - * Datum - */ -/datum/antagonist/devil - name = "Devil" - roundend_category = "devils" - antagpanel_category = "Devil" - job_rank = ROLE_DEVIL - antag_hud_name = "devil" - show_to_ghosts = TRUE - var/obligation - var/ban - var/bane - var/banish - var/truename - var/list/datum/mind/soulsOwned = new - var/reviveNumber = 0 - var/form = BASIC_DEVIL - var/static/list/devil_spells = typecacheof(list( - /datum/action/cooldown/spell/pointed/projectile/fireball/hellish, - /datum/action/cooldown/spell/conjure_item/summon_pitchfork, - /datum/action/cooldown/spell/conjure_item/summon_pitchfork/greater, - /datum/action/cooldown/spell/conjure_item/summon_pitchfork/ascended, - /datum/action/cooldown/spell/jaunt/infernal_jaunt, - /datum/action/cooldown/spell/aoe/sintouch, - /datum/action/cooldown/spell/aoe/sintouch/ascended, - /datum/action/cooldown/spell/pointed/summon_contract, - /datum/action/cooldown/spell/conjure_item/violin, - /datum/action/cooldown/spell/summon_dancefloor)) - var/ascendable = FALSE - -/datum/antagonist/devil/can_be_owned(datum/mind/new_owner) - . = ..() - return . && (ishuman(new_owner.current) || iscyborg(new_owner.current)) - -/datum/antagonist/devil/get_admin_commands() - . = ..() - .["Toggle ascendable"] = CALLBACK(src, PROC_REF(admin_toggle_ascendable)) - - -/datum/antagonist/devil/proc/admin_toggle_ascendable(mob/admin) - ascendable = !ascendable - message_admins("[key_name_admin(admin)] set [key_name_admin(owner)] devil ascendable to [ascendable]") - log_admin("[key_name_admin(admin)] set [key_name(owner)] devil ascendable to [ascendable])") - -/datum/antagonist/devil/admin_add(datum/mind/new_owner,mob/admin) - switch(alert(admin,"Should the devil be able to ascend",,"Yes","No","Cancel")) - if("Yes") - ascendable = TRUE - if("No") - ascendable = FALSE - else - return - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has devil'ed [key_name_admin(new_owner)]. [ascendable ? "(Ascendable)":""]") - log_admin("[key_name(admin)] has devil'ed [key_name(new_owner)]. [ascendable ? "(Ascendable)":""]") - -/datum/antagonist/devil/antag_listing_name() - return ..() + "([truename])" - -/proc/devilInfo(name) - if(GLOB.allDevils[lowertext(name)]) - return GLOB.allDevils[lowertext(name)] - else - var/datum/fakeDevil/devil = new /datum/fakeDevil(name) - GLOB.allDevils[lowertext(name)] = devil - return devil - -/proc/randomDevilName() - var/name = "" - if(prob(65)) - if(prob(35)) - name = pick(GLOB.devil_pre_title) - name += pick(GLOB.devil_title) - var/probability = 100 - name += pick(GLOB.devil_syllable) - while(prob(probability)) - name += pick(GLOB.devil_syllable) - probability -= 20 - if(prob(40)) - name += pick(GLOB.devil_suffix) - return name - -/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_STRIKEUNCONSCIOUS, 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/antagonist/devil/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_warning("You feel satiated as you received a new soul.")) - update_hud() - switch(SOULVALUE) - if(0) - to_chat(owner.current, span_warning("Your hellish powers have been restored.")) - give_appropriate_spells() - if(BLOOD_THRESHOLD) - increase_blood_lizard() - if(TRUE_THRESHOLD) - increase_true_devil() - if(ARCH_THRESHOLD) - increase_arch_devil() - -/datum/antagonist/devil/proc/remove_soul(datum/mind/soul) - if(soulsOwned.Remove(soul)) - check_regression() - to_chat(owner.current, span_warning("You feel as though a soul has slipped from your grasp.")) - update_hud() - -/datum/antagonist/devil/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) - give_appropriate_spells() - to_chat(owner.current, span_warning("As punishment for your failures, all of your powers except contract creation have been revoked.")) - -/datum/antagonist/devil/proc/regress_humanoid() - to_chat(owner.current, span_warning("Your powers weaken, have more contracts be signed to regain power.")) - if(ishuman(owner.current)) - var/mob/living/carbon/human/H = owner.current - - var/species_type = owner.current.client.prefs.read_preference(/datum/preference/choiced/species) - H.set_species(species_type, 1) - H.regenerate_icons() - give_appropriate_spells() - if(istype(owner.current.loc, /obj/effect/dummy/phased_mob)) - owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted. - form = BASIC_DEVIL - -/datum/antagonist/devil/proc/regress_blood_lizard() - var/mob/living/carbon/true_devil/D = owner.current - to_chat(D, span_warning("Your powers weaken, have more contracts be signed to regain power.")) - D.oldform.forceMove(D.drop_location()) - owner.transfer_to(D.oldform) - give_appropriate_spells() - qdel(D) - form = BLOOD_LIZARD - update_hud() - - -/datum/antagonist/devil/proc/increase_blood_lizard() - to_chat(owner.current, span_warning("You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard.")) - sleep(5 SECONDS) - if(ishuman(owner.current)) - var/mob/living/carbon/human/H = owner.current - H.set_species(/datum/species/lizard, 1) - H.underwear = "Nude" - H.undershirt = "Nude" - H.socks = "Nude" - H.dna.features["mcolor"] = "511" //A deep red - H.regenerate_icons() - else //Did the devil get hit by a staff of transmutation? - owner.current.color = "#501010" - give_appropriate_spells() - form = BLOOD_LIZARD - - - -/datum/antagonist/devil/proc/increase_true_devil() - to_chat(owner.current, span_warning("You feel as though your current form is about to shed. You will soon turn into a true devil.")) - sleep(5 SECONDS) - var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc) - A.faction |= "hell" - owner.current.forceMove(A) - A.oldform = owner.current - owner.transfer_to(A) - A.set_name() - give_appropriate_spells() - form = TRUE_DEVIL - update_hud() - -/datum/antagonist/devil/proc/increase_arch_devil() - if(!ascendable) - return - var/mob/living/carbon/true_devil/D = owner.current - to_chat(D, span_warning("You feel as though your form is about to ascend.")) - sleep(5 SECONDS) - if(!D) - return - D.visible_message(span_warning("[D]'s skin begins to erupt with spikes."), \ - span_warning("Your flesh begins creating a shield around yourself.")) - sleep(10 SECONDS) - if(!D) - return - D.visible_message(span_warning("The horns on [D]'s head slowly grow and elongate."), \ - span_warning("Your body continues to mutate. Your telepathic abilities grow.")) - sleep(9 SECONDS) - if(!D) - return - D.visible_message(span_warning("[D]'s body begins to violently stretch and contort."), \ - span_warning("You begin to rend apart the final barriers to ultimate power.")) - sleep(4 SECONDS) - if(!D) - return - to_chat(D, "Yes!") - sleep(1 SECONDS) - if(!D) - return - to_chat(D, "[span_big("YES!!")]") - sleep(1 SECONDS) - if(!D) - return - to_chat(D, "[span_reallybig("YE--")]") - sleep(0.1 SECONDS) - if(!D) - return - send_to_playing_players("\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"") - sound_to_playing_players('sound/hallucinations/veryfar_noise.ogg') - give_appropriate_spells() - D.convert_to_archdevil() - if(istype(D.loc, /obj/effect/dummy/phased_mob)) - D.forceMove(get_turf(D))//Fixes dying while jaunted leaving you permajaunted. - var/area/A = get_area(owner.current) - if(A) - notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, action=NOTIFY_ATTACK) - sleep(5 SECONDS) - if(!SSticker.mode.devil_ascended) - SSshuttle.emergency.request(null, set_coefficient = 0.3) - SSticker.mode.devil_ascended++ - form = ARCH_DEVIL - -/datum/antagonist/devil/proc/remove_spells() - for(var/datum/action/cooldown/spell/spells in owner.current.actions) - if(is_type_in_typecache(spells, devil_spells)) - spells.Remove(owner.current) - -/datum/antagonist/devil/proc/give_summon_contract() - var/datum/action/cooldown/spell/pointed/summon_contract/summon_contract = new(owner.current) - summon_contract.Grant(owner.current) - if(obligation == OBLIGATION_FIDDLE) - var/datum/action/cooldown/spell/conjure_item/violin/violin = new(owner.current) - violin.Grant(owner.current) - else if(obligation == OBLIGATION_DANCEOFF) - var/datum/action/cooldown/spell/summon_dancefloor/dance_floor = new(owner.current) - dance_floor.Grant(owner.current) - -/datum/antagonist/devil/proc/give_appropriate_spells() - remove_spells() - give_summon_contract() - if(SOULVALUE >= ARCH_THRESHOLD && ascendable) - give_arch_spells() - else if(SOULVALUE >= TRUE_THRESHOLD) - give_true_spells() - else if(SOULVALUE >= BLOOD_THRESHOLD) - give_blood_spells() - else if(SOULVALUE >= 0) - give_base_spells() - -/datum/antagonist/devil/proc/give_base_spells() - var/datum/action/cooldown/spell/pointed/projectile/fireball/hellish/fireball = new(owner.current) - fireball.Grant(owner.current) - - var/datum/action/cooldown/spell/conjure_item/summon_pitchfork/pitchfork = new(owner.current) - pitchfork.Grant(owner.current) - -/datum/antagonist/devil/proc/give_blood_spells() - var/datum/action/cooldown/spell/conjure_item/summon_pitchfork/pitchfork = new(owner.current) - pitchfork.Grant(owner.current) - - var/datum/action/cooldown/spell/pointed/projectile/fireball/hellish/fireball = new(owner.current) - fireball.Grant(owner.current) - - var/datum/action/cooldown/spell/jaunt/infernal_jaunt/jaunt = new(owner.current) - jaunt.Grant(owner.current) - -/datum/antagonist/devil/proc/give_true_spells() - var/datum/action/cooldown/spell/conjure_item/summon_pitchfork/greater/better_pitchfork = new(owner.current) - better_pitchfork.Grant(owner.current) - - var/datum/action/cooldown/spell/pointed/projectile/fireball/hellish/fireball = new(owner.current) - fireball.Grant(owner.current) - - var/datum/action/cooldown/spell/jaunt/infernal_jaunt/jaunt = new(owner.current) - jaunt.Grant(owner.current) - - var/datum/action/cooldown/spell/aoe/sintouch/sintouch = new(owner.current) - sintouch.Grant(owner.current) - -/datum/antagonist/devil/proc/give_arch_spells() - var/datum/action/cooldown/spell/conjure_item/summon_pitchfork/ascended/betterer_pitchfork = new(owner.current) - betterer_pitchfork.Grant(owner.current) - - var/datum/action/cooldown/spell/aoe/sintouch/ascended/better_sintouch = new(owner.current) - better_sintouch.Grant(owner.current) - -/datum/antagonist/devil/proc/beginResurrectionCheck(mob/living/body) - if(SOULVALUE>0) - to_chat(owner.current, span_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. Remain in your body.")) - sleep(DEVILRESURRECTTIME) - if (!body || body.stat == DEAD) - if(SOULVALUE>0) - if(check_banishment(body)) - to_chat(owner.current, span_userdanger("Unfortunately, the mortals have finished a ritual that prevents your resurrection.")) - return -1 - else - to_chat(owner.current, span_userdanger("WE LIVE AGAIN!")) - return hellish_resurrection(body) - else - to_chat(owner.current, span_userdanger("Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.")) - return -1 - else - to_chat(owner.current, span_danger(" You seem to have resurrected without your hellish powers.")) - else - to_chat(owner.current, span_userdanger("Your hellish powers are too weak to resurrect yourself.")) - -/datum/antagonist/devil/proc/check_banishment(mob/living/body) - switch(banish) - if(BANISH_WATER) - if(iscarbon(body)) - var/mob/living/carbon/H = body - return H.reagents.has_reagent(/datum/reagent/water/holywater) - return 0 - if(BANISH_COFFIN) - return (body && istype(body.loc, /obj/structure/closet/crate/coffin)) - if(BANISH_FORMALDYHIDE) - if(iscarbon(body)) - var/mob/living/carbon/H = body - return H.reagents.has_reagent(/datum/reagent/toxin/formaldehyde) - return 0 - if(BANISH_RUNES) - if(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(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(body) - return 0 - return 1 - if(BANISH_FUNERAL_GARB) - if(ishuman(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/antagonist/devil/proc/hellish_resurrection(mob/living/body) - message_admins("[key_name_admin(owner)] (true name is: [truename]) is resurrecting using hellish energy.") - 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(body) - body.revive(TRUE, TRUE) //Adminrevive also recovers organs, preventing someone from resurrecting without a heart. - if(istype(body.loc, /obj/effect/dummy/phased_mob)) - 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(1,0) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body. - if(body.stat == DEAD) - create_new_body() - else - create_new_body() - check_regression() - -/datum/antagonist/devil/proc/create_new_body() - if(GLOB.blobstart.len > 0) - var/turf/targetturf = get_turf(pick(GLOB.blobstart)) - var/mob/currentMob = owner.current - if(!currentMob) - currentMob = owner.get_ghost() - if(!currentMob) - message_admins("[key_name_admin(owner)]'s devil resurrection failed due to client logoff. Aborting.") - return -1 - if(currentMob.mind != owner) - message_admins("[key_name_admin(owner)]'s devil resurrection failed due to becoming a new mob. Aborting.") - return -1 - currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1) - var/mob/living/carbon/human/H = owner.current - H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), ITEM_SLOT_ICLOTHING) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), ITEM_SLOT_FEET) - H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), ITEM_SLOT_HANDS) - H.equip_to_slot_or_del(new /obj/item/pen(H), ITEM_SLOT_LPOCKET) - if(SOULVALUE >= BLOOD_THRESHOLD) - H.set_species(/datum/species/lizard, 1) - H.underwear = "Nude" - H.undershirt = "Nude" - H.socks = "Nude" - H.dna.features["mcolor"] = "511" - H.regenerate_icons() - if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough. - var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf) - A.faction |= "hell" - H.forceMove(A) - A.oldform = H - owner.transfer_to(A, TRUE) - A.set_name() - if(SOULVALUE >= ARCH_THRESHOLD && ascendable) - A.convert_to_archdevil() - give_appropriate_spells() - update_hud() - else - CRASH("Unable to find a blobstart landmark for hellish resurrection") - - -/datum/antagonist/devil/proc/update_hud() - if(iscarbon(owner.current)) - var/mob/living/C = owner.current - if(C.hud_used && C.hud_used.devilsouldisplay) - C.hud_used.devilsouldisplay.update_counter(SOULVALUE) - -/datum/antagonist/devil/greet() - to_chat(owner.current, span_warning("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.")) - to_chat(owner.current, span_warning("However, your infernal form is not without weaknesses.")) - to_chat(owner.current, "You may not use violence to coerce someone into selling their soul.") - to_chat(owner.current, "You may not directly and knowingly physically harm a devil, other than yourself.") - to_chat(owner.current, GLOB.lawlorify[LAW][bane]) - to_chat(owner.current, GLOB.lawlorify[LAW][ban]) - to_chat(owner.current, GLOB.lawlorify[LAW][obligation]) - to_chat(owner.current, GLOB.lawlorify[LAW][banish]) - to_chat(owner.current, "[span_warning("Remember, the crew can research your weaknesses if they find out your devil name.")]
") - .=..() - -/datum/antagonist/devil/on_gain() - truename = randomDevilName() - ban = randomdevilban() - bane = randomdevilbane() - obligation = randomdevilobligation() - banish = randomdevilbanish() - GLOB.allDevils[lowertext(truename)] = src - - antag_memory += "Your devilic true name is [truename]
[GLOB.lawlorify[LAW][ban]]
You may not use violence to coerce someone into selling their soul.
You may not directly and knowingly physically harm a devil, other than yourself.
[GLOB.lawlorify[LAW][bane]]
[GLOB.lawlorify[LAW][obligation]]
[GLOB.lawlorify[LAW][banish]]
" - if(issilicon(owner.current)) - var/mob/living/silicon/robot_devil = owner.current - var/laws = list("You may not use violence to coerce someone into selling their soul.", "You may not directly and knowingly physically harm a devil, other than yourself.", GLOB.lawlorify[LAW][ban], GLOB.lawlorify[LAW][obligation], "Accomplish your objectives at all costs.") - robot_devil.set_law_sixsixsix(laws) - handle_clown_mutation(owner.current, "Your infernal nature has allowed you to overcome your clownishness.") - return ..() - -/datum/antagonist/devil/on_removal() - to_chat(owner.current, span_userdanger("Your infernal link has been severed! You are no longer a devil!")) - . = ..() - -/datum/antagonist/devil/apply_innate_effects(mob/living/mob_override) - give_appropriate_spells() - owner.current.grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_DEVIL) - update_hud() - .=..() - -/datum/antagonist/devil/remove_innate_effects(mob/living/mob_override) - for(var/datum/action/cooldown/spell/spells in owner.current.actions) - if(is_type_in_typecache(spells, devil_spells)) - spells.Remove(owner.current) - owner.current.remove_all_languages(LANGUAGE_DEVIL) - .=..() - -/datum/antagonist/devil/proc/printdevilinfo() - var/list/parts = list() - parts += "The devil's true name is: [truename]" - parts += "The devil's bans were:" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]" - return parts.Join("
") - -/datum/antagonist/devil/roundend_report() - var/list/parts = list() - parts += printplayer(owner) - parts += printdevilinfo() - parts += printobjectives(objectives) - return parts.Join("
") - -//A simple super light weight datum for the codex gigas. -/datum/fakeDevil - var/truename - var/bane - var/obligation - var/ban - var/banish - var/ascendable - -/datum/fakeDevil/New(name = randomDevilName()) - truename = name - bane = randomdevilbane() - obligation = randomdevilobligation() - ban = randomdevilban() - banish = randomdevilbanish() - ascendable = prob(25) - -/datum/antagonist/devil/get_preview_icon() - var/icon/devil_icon = icon('icons/effects/64x64.dmi', "devil") - - devil_icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE) - - return devil_icon diff --git a/code/modules/antagonists/devil/devil_helpers.dm b/code/modules/antagonists/devil/devil_helpers.dm deleted file mode 100644 index ddcabde7d293..000000000000 --- a/code/modules/antagonists/devil/devil_helpers.dm +++ /dev/null @@ -1,38 +0,0 @@ -/mob/living/proc/check_devil_bane_multiplier(obj/item/weapon, mob/living/attacker) - var/datum/antagonist/devil/devilInfo = mind.has_antag_datum(/datum/antagonist/devil) - switch(devilInfo.bane) - if(BANE_WHITECLOTHES) - if(ishuman(attacker)) - 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 - var/static/list/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/det = 1, - /obj/item/clothing/under/suit_jacket/white = 0.5, - /obj/item/clothing/under/burial = 1 - ) - if(U && whiteness[U.type]) - src.visible_message(span_warning("[src] seems to have been harmed by the purity of [attacker]'s clothes."), span_notice("Unsullied white clothing is disrupting your form.")) - return whiteness[U.type] + 1 - if(BANE_TOOLBOX) - if(istype(weapon, /obj/item/storage/toolbox)) - src.visible_message(span_warning("The [weapon] seems unusually robust this time."), span_notice("The [weapon] is your unmaking!")) - return 2.5 // Will take four hits with a normal toolbox to crit. - if(BANE_HARVEST) - if(istype(weapon, /obj/item/reagent_containers/food/snacks/grown/)) - visible_message(span_warning("The spirits of the harvest aid in the exorcism."), span_notice("The harvest spirits are harming you.")) - Paralyze(40) - qdel(weapon) - return 2 - return 1 \ No newline at end of file diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm deleted file mode 100644 index 84d6303a0e58..000000000000 --- a/code/modules/antagonists/devil/imp/imp.dm +++ /dev/null @@ -1,76 +0,0 @@ -//////////////////The Monster - -/mob/living/simple_animal/imp - name = "imp" - real_name = "imp" - unique_name = TRUE - 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" - mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) - speed = 1 - a_intent = INTENT_HARM - stop_automated_movement = 1 - status_flags = CANPUSH - attack_sound = 'sound/magic/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 = ENVIRONMENT_SMASH_STRUCTURES - obj_damage = 40 - melee_damage_lower = 10 - melee_damage_upper = 15 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - var/boost = 0 - bloodcrawl = BLOODCRAWL_EAT - var/list/consumed_mobs = list() - var/playstyle_string = "You are an imp, a mischievous 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." - -/mob/living/simple_animal/imp/Initialize(mapload) - ..() - boost = world.time + 30 - -/mob/living/simple_animal/imp/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - if(boostThis is [icon2html(src, user)] [src]!") - - //Left hand items - for(var/obj/item/I in held_items) - if(!(I.item_flags & ABSTRACT)) - . += "It is holding [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]." - - //Braindead - if(!client && stat != DEAD) - . += "The devil seems to be in deep contemplation." - - //Damaged - if(stat == DEAD) - . += span_deadsay("The hellfire seems to have been extinguished, for now at least.") - else if(health < (maxHealth/10)) - . += span_warning("You can see hellfire inside its gaping wounds.") - else if(health < (maxHealth/2)) - . += span_warning("You can see hellfire inside its wounds.") - . += "" - -/mob/living/carbon/true_devil/IsAdvancedToolUser() - return 1 - -/mob/living/carbon/true_devil/resist_buckle() - if(buckled) - buckled.user_unbuckle_mob(src,src) - visible_message(span_warning("[src] easily breaks out of [p_their()] handcuffs!"), \ - span_notice("With just a thought your handcuffs fall off.")) - -/mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) - if(incapacitated()) - to_chat(src, span_warning("You can't do that right now!")) - return FALSE - if(be_close && !in_range(M, src)) - to_chat(src, span_warning("You are too far away!")) - return FALSE - return TRUE - -/mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) - return 666 - -/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) - if(mind && has_bane(BANE_LIGHT)) - return ..() //flashes don't stop devils UNLESS it's their bane. - -/mob/living/carbon/true_devil/soundbang_act() - return 0 - -/mob/living/carbon/true_devil/get_ear_protection() - return 2 - - -/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 && length(I.attack_verb)) - 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_danger("[attack_message]"), - span_userdanger("[attack_message]"), null, COMBAT_MESSAGE_RANGE) - return TRUE - -/mob/living/carbon/true_devil/singularity_act() - if(ascended) - return 0 - return ..() - -//ATTACK GHOST IGNORING PARENT RETURN VALUE -/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 - var/datum/antagonist/imp/A = new() - S.mind.add_antag_datum(A) - to_chat(S, S.playstyle_string) - else - return ..() - -/mob/living/carbon/true_devil/can_be_revived() - return 1 - -/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_danger("[M] has punched [src]!"), \ - span_userdanger("[M] has punched [src]!")) - adjustBruteLoss(damage) - log_combat(M, src, "attacked") - updatehealth() - if (INTENT_DISARM) - if (!(mobility_flags & MOBILITY_STAND) && !ascended) //No stealing the arch devil's pitchfork. - if (prob(5)) - Unconscious(40) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - log_combat(M, src, "pushed") - visible_message(span_danger("[M] has pushed down [src]!"), \ - span_userdanger("[M] has pushed down [src]!")) - else - if (prob(25)) - dropItemToGround(get_active_held_item()) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message(span_danger("[M] has disarmed [src]!"), \ - span_userdanger("[M] has disarmed [src]!")) - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message(span_danger("[M] has attempted to disarm [src]!")) - -/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 (EXPLODE_DEVASTATE) - b_loss = 500 - if (EXPLODE_HEAVY) - b_loss = 150 - if (EXPLODE_LIGHT) - b_loss = 30 - if(has_bane(BANE_LIGHT)) - b_loss *=2 - adjustBruteLoss(b_loss) - return ..() - - -/mob/living/carbon/true_devil/update_body() //we don't use the bodyparts layer for devils. - return - -/mob/living/carbon/true_devil/update_body_parts() - return - -/mob/living/carbon/true_devil/update_damage_overlays() //devils don't have damage overlays. - return diff --git a/code/modules/antagonists/devil/true_devil/inventory.dm b/code/modules/antagonists/devil/true_devil/inventory.dm deleted file mode 100644 index a3d0dbdf582b..000000000000 --- a/code/modules/antagonists/devil/true_devil/inventory.dm +++ /dev/null @@ -1,48 +0,0 @@ -/mob/living/carbon/true_devil/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - if(..()) - update_inv_hands() - return 1 - return 0 - -/mob/living/carbon/true_devil/update_inv_hands() - //TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_overlay should use the down sprite when facing down, left, or right, and the up sprite when facing up. - remove_overlay(DEVIL_HANDS_LAYER) - var/list/hands_overlays = list() - var/obj/item/l_hand = get_item_for_held_index(1) //hardcoded 2-hands only, for now. - var/obj/item/r_hand = get_item_for_held_index(2) - - if(r_hand) - var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) - - hands_overlays += r_hand_overlay - - if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - r_hand.layer = ABOVE_HUD_LAYER - r_hand.plane = ABOVE_HUD_PLANE - r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) - client.screen |= r_hand - - if(l_hand) - var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) - - hands_overlays += l_hand_overlay - - if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - l_hand.layer = ABOVE_HUD_LAYER - l_hand.plane = ABOVE_HUD_PLANE - l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) - client.screen |= l_hand - if(hands_overlays.len) - devil_overlays[DEVIL_HANDS_LAYER] = hands_overlays - apply_overlay(DEVIL_HANDS_LAYER) - -/mob/living/carbon/true_devil/remove_overlay(cache_index) - var/I = devil_overlays[cache_index] - if(I) - cut_overlay(I) - devil_overlays[cache_index] = null - - -/mob/living/carbon/true_devil/apply_overlay(cache_index) - if((. = devil_overlays[cache_index])) - add_overlay(.) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm index 253a644b265b..af3cb2300c23 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm @@ -371,7 +371,7 @@ while(penance_sources[P]) switch(P) if(PENANCE_SOUL) - owner.hellbound = TRUE + ADD_TRAIT(owner.mind, TRAIT_HELLBOUND, MAGIC_TRAIT) to_chat(owner, span_velvet("You feel a peculiar emptiness...")) if(PENANCE_LIMB) var/obj/item/bodypart/BP diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index b6e9e8ca6ba2..2191b1084fe2 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -237,7 +237,6 @@ if(1) //Dust T.visible_message(span_userdanger("[user] turns to dust!")) - user.hellbound = TRUE user.dust() if(2) //Death diff --git a/code/modules/events/devil.dm b/code/modules/events/devil.dm deleted file mode 100644 index ae01b40b8726..000000000000 --- a/code/modules/events/devil.dm +++ /dev/null @@ -1,58 +0,0 @@ -/datum/round_event_control/devil - name = "Create Devil" - typepath = /datum/round_event/ghost_role/devil - max_occurrences = 0 - -/datum/round_event/ghost_role/devil - var/success_spawn = 0 - role_name = "devil" - fakeable = FALSE - -/datum/round_event/ghost_role/devil/kill() - if(!success_spawn && control) - control.occurrences-- - return ..() - -/datum/round_event/ghost_role/devil/spawn_role() - //selecting a spawn_loc - if(!SSjob.latejoin_trackers.len) - return MAP_ERROR - - //selecting a candidate player - var/list/candidates = get_candidates(ROLE_DEVIL, null, ROLE_DEVIL) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected_candidate = pick_n_take(candidates) - var/key = selected_candidate.key - - var/datum/mind/Mind = create_devil_mind(key) - Mind.active = 1 - - var/mob/living/carbon/human/devil = create_event_devil() - Mind.transfer_to(devil) - add_devil(devil, ascendable = FALSE) - - spawned_mobs += devil - message_admins("[ADMIN_LOOKUPFLW(devil)] has been made into a devil by an event.") - log_game("[key_name(devil)] was spawned as a devil by an event.") - var/datum/job/jobdatum = SSjob.GetJob("Assistant") - devil.job = jobdatum.title - jobdatum.equip(devil) - return SUCCESSFUL_SPAWN - - -/proc/create_event_devil(spawn_loc) - var/mob/living/carbon/human/new_devil = new(spawn_loc) - if(!spawn_loc) - SSjob.SendToLateJoin(new_devil) - new_devil.randomize_human_appearance(~(RANDOMIZE_SPECIES)) - new_devil.dna.update_dna_identity() - return new_devil - -/proc/create_devil_mind(key) - var/datum/mind/Mind = new /datum/mind(key) - Mind.assigned_role = ROLE_DEVIL - Mind.special_role = ROLE_DEVIL - SSticker.mode.devils |= Mind - return Mind diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 5f4f22638b21..093154f88d12 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -80,10 +80,7 @@ break else if(M.ckey == ckey && M.stat == DEAD && !M.suiciding) - make_podman = 1 - if(isliving(M)) - var/mob/living/L = M - make_podman = !L.hellbound + make_podman = !M.mind || !HAS_TRAIT(M.mind, TRAIT_HELLBOUND) break else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key for(var/mob/M in GLOB.player_list) @@ -92,10 +89,7 @@ var/mob/dead/observer/O = M if(!O.can_reenter_corpse) break - make_podman = 1 - if(isliving(M)) - var/mob/living/L = M - make_podman = !L.hellbound + make_podman = !M.mind || !HAS_TRAIT(M.mind, TRAIT_HELLBOUND) ckey_holder = M.ckey break diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index 7394c38f8656..617ead6b238a 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -56,7 +56,6 @@ /obj/item/instrument/violin/golden name = "golden violin" - desc = "A golden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" icon_state = "golden_violin" item_state = "golden_violin" resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index df21c35cf346..4bb4822a8dce 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -14,91 +14,5 @@ throw_range = 10 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF author = "Forces beyond your comprehension" - unique = 1 + unique = TRUE title = "the Codex Gigas" - var/inUse = 0 - var/currentName = "" - var/currentSection = PRE_TITLE - -/obj/item/book/codex_gigas/attack_self(mob/user) - if(!user.can_read(src)) - return FALSE - if(inUse) - to_chat(user, span_notice("Someone else is reading it.")) - if(ishuman(user)) - var/mob/living/carbon/human/U = user - if(U.check_acedia()) - to_chat(user, span_notice("None of this matters, why are you reading this? You put [title] down.")) - return - user.visible_message("[user] opens [title] and begins reading intently.") - ask_name(user) - - -/obj/item/book/codex_gigas/proc/perform_research(mob/user, devilName) - if(!devilName) - user.visible_message("[user] closes [title] without looking anything up.") - return - inUse = TRUE - var/speed = 300 - var/correctness = 85 - if(ishuman(user)) - var/mob/living/carbon/human/U = user - if(U.job in list("Curator")) // the curator is both faster, and more accurate than normal crew members at research - speed = 100 - correctness = 100 - correctness -= U.getOrganLoss(ORGAN_SLOT_BRAIN) * 0.5 //Brain damage makes researching hard. - speed += U.getOrganLoss(ORGAN_SLOT_BRAIN) * 3 - if(do_after(user, speed, user, FALSE)) - var/usedName = devilName - if(!prob(correctness)) - usedName += "x" - var/datum/antagonist/devil/devil = devilInfo(usedName) - display_devil(devil, user, usedName) - sleep(1 SECONDS) - onclose(user, "book") - inUse = FALSE - -/obj/item/book/codex_gigas/proc/display_devil(datum/antagonist/devil/devil, mob/reader, devilName) - reader << browse("Information on [devilName]


[GLOB.lawlorify[LORE][devil.ban]]
[GLOB.lawlorify[LORE][devil.bane]]
[GLOB.lawlorify[LORE][devil.obligation]]
[GLOB.lawlorify[LORE][devil.banish]]
[devil.ascendable?"This devil may ascend given enough souls.":""]", "window=book[window_size != null ? ";size=[window_size]" : ""]") - -/obj/item/book/codex_gigas/proc/ask_name(mob/reader) - ui_interact(reader) - -/obj/item/book/codex_gigas/ui_act(action, params) - if(..()) - return - if(!action) - return FALSE - if(action == "search") - SStgui.close_uis(src) - addtimer(CALLBACK(src, PROC_REF(perform_research), usr, currentName), 0) - currentName = "" - currentSection = PRE_TITLE - return FALSE - else - currentName += action - var/oldSection = currentSection - if(GLOB.devil_pre_title.Find(action)) - currentSection = TITLE - else if(GLOB.devil_title.Find(action)) - currentSection = SYLLABLE - else if(GLOB.devil_syllable.Find(action)) - if (currentSection>=SYLLABLE) - currentSection = MULTIPLE_SYLLABLE - else - currentSection = SYLLABLE - else if(GLOB.devil_suffix.Find(action)) - currentSection = SUFFIX - return currentSection != oldSection - -/obj/item/book/codex_gigas/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "CodexGigas", name) - ui.open() - -/obj/item/book/codex_gigas/ui_data(mob/user) - var/list/data = list() - data["name"]=currentName - data["currentSection"]=currentSection - return data diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index bffb99518ef1..5aa1f14d17e1 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -128,7 +128,7 @@ return FALSE if(iscarbon(M)) // disallowed carbons - if(isalien(M) || isdevil(M)) + if(isalien(M)) return FALSE var/mob/living/carbon/target = M // gotta have a head to be implanted (no changelings or sentient plants) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 340f9918a803..b775bef7405c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -973,7 +973,7 @@ return 0 /mob/living/carbon/proc/can_defib(careAboutGhost = TRUE) //yogs start - if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK)) //can't revive + if(suiciding || (mind && HAS_TRAIT(mind, TRAIT_HELLBOUND)) || HAS_TRAIT(src, TRAIT_HUSK)) //can't revive return FALSE if((world.time - timeofdeath) > DEFIB_TIME_LIMIT) //too late return FALSE diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 735b2bd1daf1..ea4a17a52164 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -69,8 +69,6 @@ if(SSticker.HasRoundStarted()) SSblackbox.ReportDeath(src) log_game("[key_name(src)] has died (BRUTE: [src.getBruteLoss()], BURN: [src.getFireLoss()], TOX: [src.getToxLoss()], OXY: [src.getOxyLoss()], CLONE: [src.getCloneLoss()]) ([AREACOORD(src)])") - if(is_devil(src)) - INVOKE_ASYNC(is_devil(src), TYPE_PROC_REF(/datum/antagonist/devil, beginResurrectionCheck), src) if(is_hivemember(src)) remove_hivemember(src) if(is_hivehost(src)) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 7cab6025738b..74153e87e87f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -147,8 +147,8 @@ appears_dead = 1 if(suiciding) . += span_warning("[t_He] appear[p_s()] to have committed suicide... there is no hope of recovery.") - if(hellbound) - . += span_warning("[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible.") + if(mind && HAS_TRAIT(mind, TRAIT_HELLBOUND)) + . += span_warning("[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible.") . += "" if(getorgan(/obj/item/organ/brain) && !key && !get_ghost()) . += span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed...") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 646cc121d617..661ae8e6b5c9 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -873,11 +873,6 @@ dna.remove_mutation(HM.name) ..() -/mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker) - . = ..() - if (dna && dna.species) - . += dna.species.check_species_weakness(weapon, attacker) - /mob/living/carbon/human/is_literate() return TRUE diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 4a628826135a..5471c77b6101 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1305,7 +1305,7 @@ GLOBAL_LIST_EMPTY(features_by_species) return FALSE /datum/species/proc/check_species_weakness(obj/item, mob/living/attacker) - return 0 //This is not a boolean, it's the multiplier for the damage that the user takes from the item.It is added onto the check_weakness value of the mob, and then the force of the item is multiplied by this value + return 1 //This is not a boolean, it's the multiplier for the damage that the user takes from the item. //////// //LIFE// @@ -1792,7 +1792,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if((I.item_flags & SURGICAL_TOOL) && user.a_intent == INTENT_HELP && (H.mobility_flags & ~MOBILITY_STAND) && (LAZYLEN(H.surgeries) > 0)) Iwound_bonus = CANT_WOUND - var/weakness = H.check_weakness(I, user) + var/weakness = check_species_weakness(I, user) H.send_item_attack_message(I, user, hit_area, affecting) diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index 100698775049..56ef1779acf6 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -29,9 +29,9 @@ return ..() /datum/species/fly/check_species_weakness(obj/item/weapon, mob/living/attacker) + . = ..() if(istype(weapon, /obj/item/melee/flyswatter)) - return 29 //Flyswatters deal 30x damage to flypeople. - return 0 + return 30 //Flyswatters deal 30x damage to flypeople. /datum/species/fly/get_species_description() return "With no official documentation or knowledge of the origin of \ diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 94be5b849179..02503ed52351 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -847,7 +847,7 @@ /obj/structure/cloth_pile/proc/revive() if(QDELETED(src) || QDELETED(cloth_golem)) //QDELETED also checks for null, so if no cloth golem is set this won't runtime return - if(cloth_golem.suiciding || cloth_golem.hellbound) + if(cloth_golem.suiciding || (cloth_golem.mind && HAS_TRAIT(cloth_golem.mind, TRAIT_HELLBOUND))) QDEL_NULL(cloth_golem) return @@ -1475,7 +1475,7 @@ /obj/structure/wax_pile/proc/revive() if(QDELETED(src) || QDELETED(wax_golem)) //QDELETED also checks for null, so if no wax golem is set this won't runtime return - if(wax_golem.suiciding || wax_golem.hellbound) + if(wax_golem.suiciding || (wax_golem.mind && HAS_TRAIT(wax_golem.mind, TRAIT_HELLBOUND))) QDEL_NULL(wax_golem) return diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index 6cb4531ecc4d..81b40806e16b 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -62,9 +62,9 @@ return ..() /datum/species/moth/check_species_weakness(obj/item/weapon, mob/living/attacker) + . = ..() if(istype(weapon, /obj/item/melee/flyswatter)) - return 9 //flyswatters deal 10x damage to moths - return 0 + return 10 //flyswatters deal 10x damage to moths /datum/species/moth/space_move(mob/living/carbon/human/H) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 47c8929b4137..7db262f43ba7 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -58,10 +58,9 @@ C.ignite_mob() /datum/species/vampire/check_species_weakness(obj/item/weapon, mob/living/attacker) + . = ..() if(istype(weapon, /obj/item/nullrod/whip)) - return TRUE //Whips deal 2x damage to vampires. Vampire killer. - - return FALSE + return 2 //Whips deal 2x damage to vampires. Vampire killer. /datum/species/vampire/get_species_description() return "A classy Vampire! They descend upon Space Station Thirteen Every year to spook the crew! \"Bleeg!!\"" diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 20b2af928b14..09f2c2444a76 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -84,13 +84,6 @@ GLOBAL_VAR_INIT(permadeath, FALSE) if (client) client.move_delay = initial(client.move_delay) - - for(var/s in ownedSoullinks) - var/datum/soullink/S = s - S.ownerDies(gibbed) - for(var/s in sharedSoullinks) - var/datum/soullink/S = s - S.sharerDies(gibbed) if(GLOB.permadeath) ghostize(FALSE) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9495468a8bb0..573c3a3e9107 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1001,33 +1001,6 @@ /mob/living/carbon/alien/update_stamina() return -/mob/living/proc/owns_soul() - if(mind) - return mind.soulOwner == mind - return TRUE - -/mob/living/proc/return_soul() - hellbound = 0 - if(mind) - var/datum/antagonist/devil/devilInfo = mind.soulOwner.has_antag_datum(/datum/antagonist/devil) - if(devilInfo)//Not sure how this could be null, but let's just try anyway. - devilInfo.remove_soul(mind) - mind.soulOwner = mind - -/mob/living/proc/has_bane(banetype) - var/datum/antagonist/devil/devilInfo = is_devil(src) - return devilInfo && banetype == devilInfo.bane - -/mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker) - if(mind && mind.has_antag_datum(/datum/antagonist/devil)) - return check_devil_bane_multiplier(weapon, attacker) - return 1 //This is not a boolean, it's the multiplier for the damage the weapon does. - -/mob/living/proc/check_acedia() - if(mind && mind.has_objective(/datum/objective/sintouched/acedia)) - return TRUE - return FALSE - /mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, quickstart = TRUE) stop_pulling() . = ..() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index ec5c79be96c7..3b4d2afe553d 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -84,8 +84,6 @@ var/list/guaranteed_butcher_results = null //these will always be yielded from butchering var/butcher_difficulty = 0 //effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier - var/hellbound = 0 //People who've signed infernal contracts are unrevivable. - var/list/weather_immunities = list() var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index b41b16d05d35..0ae0bcb20dcd 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -914,7 +914,7 @@ return disconnect_shell() //If the AI is controlling a borg, force the player back to core! if(!mind) - to_chat(user, span_warning("No intelligence patterns detected.") ) + to_chat(user, span_warning("No intelligence patterns detected.")) return ShutOffDoomsdayDevice() builtInCamera.toggle_cam(user) @@ -1083,7 +1083,7 @@ return else if(mind) - soullink(/datum/soullink/sharedbody, src, target) + RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(disconnect_shell)) deployed_shell = target target.deploy_init(src) mind.transfer_to(target) @@ -1121,6 +1121,7 @@ if(deployed_shell) //Forcibly call back AI in event of things such as damage, EMP or power loss. to_chat(src, span_danger("Your remote connection has been reset!")) deployed_shell.undeploy() + UnregisterSignal(deployed_shell, COMSIG_LIVING_DEATH) deployed_shell = null diag_hud_set_deployed() diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 954ae2ba4f09..072951056bf8 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -13,11 +13,6 @@ addtimer(CALLBACK(src, PROC_REF(show_laws)), 0) last_lawchange_announce = world.time -/mob/living/silicon/proc/set_law_sixsixsix(law, announce = TRUE) - laws_sanity_check() - laws.set_law_sixsixsix(law) - post_lawchange(announce) - /mob/living/silicon/proc/set_zeroth_law(law, law_borg, announce = TRUE) laws_sanity_check() laws.set_zeroth_law(law, law_borg) @@ -87,8 +82,3 @@ laws_sanity_check() laws.clear_zeroth_law(force) post_lawchange(announce) - -/mob/living/silicon/proc/clear_law_sixsixsix(force, announce = TRUE) - laws_sanity_check() - laws.clear_law_sixsixsix(force) - post_lawchange(announce) diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 7df37e83522b..acaafc892088 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -43,12 +43,6 @@ var/datum/ai_laws/master = connected_ai ? connected_ai.laws : null var/temp if (master) - laws.devillaws.len = master.devillaws.len - for (var/index = 1, index <= master.devillaws.len, index++) - temp = master.devillaws[index] - if (length(temp) > 0) - laws.devillaws[index] = temp - laws.ion.len = master.ion.len for (var/index = 1, index <= master.ion.len, index++) temp = master.ion[index] diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b647ec5ffff2..d8c76a2c7860 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -33,8 +33,6 @@ var/lawcheck[1] var/ioncheck[1] var/hackedcheck[1] - var/devillawcheck[5] - var/sensors_on = 0 var/med_hud = DATA_HUD_MEDICAL_ADVANCED //Determines the med hud to use var/sec_hud = DATA_HUD_SECURITY_ADVANCED //Determines the sec hud to use @@ -198,16 +196,6 @@ hackedcheck[L] = "Yes" checklaws() - if (href_list["lawdevil"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite - var/L = text2num(href_list["lawdevil"]) - switch(devillawcheck[L]) - if ("Yes") - devillawcheck[L] = "No" - if ("No") - devillawcheck[L] = "Yes" - checklaws() - - if (href_list["laws"]) // With how my law selection code works, I changed statelaws from a verb to a proc, and call it through my law selection panel. --NeoFite statelaws() @@ -223,12 +211,6 @@ var/number = 1 sleep(1 SECONDS) - if (laws.devillaws && laws.devillaws.len) - for(var/index = 1, index <= laws.devillaws.len, index++) - if (force || devillawcheck[index] == "Yes") - say("[radiomod] 666. [laws.devillaws[index]]") - sleep(1 SECONDS) - if (laws.zeroth) if (force || lawcheck[1] == "Yes") @@ -275,12 +257,6 @@ var/list = "Which laws do you want to include when stating them for the crew?

" - if (laws.devillaws && laws.devillaws.len) - for(var/index = 1, index <= laws.devillaws.len, index++) - if (!devillawcheck[index]) - devillawcheck[index] = "No" - list += {"[devillawcheck[index]] 666: [laws.devillaws[index]]
"} - if (laws.zeroth) if (!lawcheck[1]) lawcheck[1] = "No" //Given Law 0's usual nature, it defaults to NOT getting reported. --NeoFite @@ -431,9 +407,6 @@ .=..() .+= "" .+= "

Current Silicon Laws:

" - if (laws.devillaws && laws.devillaws.len) - for(var/index = 1, index <= laws.devillaws.len, index++) - .+= "[laws.devillaws[index]]" if (laws.zeroth) .+= "0: [laws.zeroth]" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 376c0c77ebb8..81480e09b101 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -67,8 +67,6 @@ if(suiciding) O.set_suicide(suiciding) - if(hellbound) - O.hellbound = hellbound O.a_intent = INTENT_HARM //keep viruses? @@ -244,8 +242,6 @@ if(suiciding) O.set_suicide(suiciding) - if(hellbound) - O.hellbound = hellbound //keep viruses? if (tr_flags & TR_KEEPVIRUS) diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm deleted file mode 100644 index f8e59ab8369a..000000000000 --- a/code/modules/paperwork/contract.dm +++ /dev/null @@ -1,302 +0,0 @@ -/* For employment contracts and infernal contracts */ - -/obj/item/paper/contract - throw_range = 3 - throw_speed = 3 - var/signed = FALSE - var/datum/mind/target - item_flags = NOBLUDGEON - -/obj/item/paper/contract/proc/update_text() - return - -/obj/item/paper/contract/update_icon() - return - -/obj/item/paper/contract/infernal - var/contractType = 0 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - var/datum/mind/owner - var/datum/antagonist/devil/devil_datum - icon_state = "paper_onfire" - -/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 - var/cooldown = FALSE - -/obj/item/paper/contract/infernal/knowledge - name = "paper- contract for knowledge" - contractType = CONTRACT_KNOWLEDGE - -/obj/item/paper/contract/infernal/friend - name = "paper- contract for a friend" - contractType = CONTRACT_FRIEND - -/obj/item/paper/contract/infernal/unwilling - name = "paper- infernal contract" - contractType = CONTRACT_UNWILLING - -/obj/item/paper/contract/infernal/New(atom/loc, mob/living/nTarget, datum/mind/nOwner) - ..() - owner = nOwner - devil_datum = owner.has_antag_datum(/datum/antagonist/devil) - target = nTarget - update_text() - -/obj/item/paper/contract/infernal/suicide_act(mob/user) - if(signed && (user == target.current) && ishuman(user)) - var/mob/living/carbon/human/H = user - H.say("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!", forced = "infernal contract suicide") - H.visible_message(span_suicide("[H] holds up a contract claiming [user.p_their()] soul, then immediately catches fire. It looks like [user.p_theyre()] trying to commit suicide!")) - H.adjust_fire_stacks(20) - H.ignite_mob() - return(FIRELOSS) - return ..() - -/obj/item/paper/contract/infernal/update_text() - info = "This shouldn't be seen. Error DEVIL:6" - -/obj/item/paper/contract/infernal/power/update_text(signature = "____________", blood = 0) - info = "
Contract for infernal power



I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.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.


Signed, " - if(blood) - info += "[signature]" - else - info += "[signature]" - -/obj/item/paper/contract/infernal/wealth/update_text(signature = "____________", blood = 0) - info = "
Contract for unlimited wealth



I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.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.


Signed, " - if(blood) - info += "[signature]" - else - info += "[signature]" - -/obj/item/paper/contract/infernal/prestige/update_text(signature = "____________", blood = 0) - info = "
Contract for prestige



I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.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.


Signed, " - if(blood) - info += "[signature]" - else - info += "[signature]" - -/obj/item/paper/contract/infernal/magic/update_text(signature = "____________", blood = 0) - info = "
Contract for magic



I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.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.


Signed, " - if(blood) - info += "[signature]" - else - info += "[signature]" - -/obj/item/paper/contract/infernal/revive/update_text(signature = "____________", blood = 0) - info = "
Contract for resurrection



I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.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.


Signed, " - if(blood) - info += "[signature]" - else - info += "[signature]" - -/obj/item/paper/contract/infernal/knowledge/update_text(signature = "____________", blood = 0) - info = "
Contract for knowledge



I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.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.


Signed, " - if(blood) - info += "[signature]" - else - info += "[signature]" - -/obj/item/paper/contract/infernal/friend/update_text(signature = "____________", blood = 0) - info = "
Contract for a friend



I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for a friend. 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.


Signed, " - if(blood) - info += "[signature]" - else - info += "[signature]" - -/obj/item/paper/contract/infernal/unwilling/update_text(signature = "____________", blood = 0) - info = "
Contract for slave



I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [devil_datum.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.


Signed, " - if(blood) - info += "[signature]" - else - info += "[signature]" - -/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_notice("You stamp the paper with your rubber stamp, however the ink ignites as you release the stamp.")) - else if(P.is_hot()) - user.visible_message(span_danger("[user] brings [P] next to [src], but [src] does not catch fire!"), span_danger("[src] refuses to ignite!")) - else - return ..() - -/obj/item/paper/contract/infernal/attack(mob/M, mob/living/user) - add_fingerprint(user) - if(M == user && target == M?.mind?.soulOwner != owner && attempt_signature(user, 1)) - user.visible_message(span_danger("[user] slices [user.p_their()] wrist with [src], and scrawls [user.p_their()] name in blood."), span_danger("You slice your wrist open and scrawl your name in blood.")) - user.blood_volume = max(user.blood_volume - 25, 0) //devil blood cost quartered from 100 because otherwise people with the blood deficiency trait fucking die - 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_notice("You don't know how to read or write.")) - return 0 - if(user.mind != target) - to_chat(user, span_notice("Your signature simply slides off the sheet, it seems this contract is not meant for you to sign.")) - return 0 - if(user.mind.soulOwner != user.mind) //fixes a really, really stupid bug where you could sell souls you didnt have to multiple devils, scamming them. - to_chat(user, span_notice("You do not own a soul to sell.")) - return 0 - if(signed) - to_chat(user, span_notice("This contract has already been signed. It may not be signed again.")) - return 0 - if(HAS_TRAIT(user, TRAIT_DUMB)) - to_chat(user, span_notice("You quickly scrawl 'your name' on the contract.")) - signIncorrectly() - return 0 - if (contractType == CONTRACT_REVIVE) - to_chat(user, span_notice("You are already alive, this contract would do nothing.")) - return 0 - else - to_chat(user, span_notice("You quickly scrawl your name on the contract")) - if(fulfillContract(target.current, blood)<=0) - to_chat(user, span_notice("But it seemed to have no effect, perhaps even Hell itself cannot grant this boon?")) - return 1 - - - -/obj/item/paper/contract/infernal/revive/attack(mob/M, mob/living/user) - if (target == M.mind && M.stat == DEAD && M.mind.soulOwner == M.mind) - if (cooldown) - to_chat(user, span_notice("Give [M] a chance to think through the contract, don't rush [M.p_them()].")) - return 0 - cooldown = TRUE - var/mob/living/carbon/human/H = M - var/mob/dead/observer/ghost = H.get_ghost() - var/response = "No" - if(ghost) - ghost.notify_cloning("A devil has offered you revival, at the cost of your soul.",'sound/effects/genetics.ogg', H) - response = tgalert(ghost, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No", "Never for this round", 0, 200) - if(!ghost) - return //handle logouts that happen whilst the alert is waiting for a response. - else - response = tgalert(target.current, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No", "Never for this round", 0, 200) - if(response == "Yes") - H.revive(1,0) - log_combat(user, H, "infernally revived via contract") - user.visible_message(span_notice("With a sudden blaze, [H] stands back up.")) - H.fakefire() - fulfillContract(H, 1)//Revival contracts are always signed in blood - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, fakefireextinguish)), 5, TIMER_UNIQUE) - addtimer(CALLBACK(src, "resetcooldown"), 300, TIMER_UNIQUE) - else - ..() - -/obj/item/paper/contract/infernal/revive/proc/resetcooldown() - cooldown = FALSE - - -/obj/item/paper/contract/infernal/proc/fulfillContract(mob/living/carbon/human/user = target.current, blood = FALSE) - signed = TRUE - if(user.mind.soulOwner != user.mind) //They already sold their soul to someone else? - var/datum/antagonist/devil/ownerDevilInfo = user.mind.soulOwner.has_antag_datum(/datum/antagonist/devil) - ownerDevilInfo.remove_soul(user.mind) //Then they lose their claim. - user.mind.soulOwner = owner - user.hellbound = contractType - user.mind.damnation_type = contractType - var/datum/antagonist/devil/devilInfo = owner.has_antag_datum(/datum/antagonist/devil) - devilInfo.add_soul(user.mind) - update_text(user.real_name, blood) - to_chat(user, span_notice("A profound emptiness washes over you as you lose ownership of your soul.")) - to_chat(user, span_userdanger("This does NOT make you an antagonist if you were not already.")) - return TRUE - -/obj/item/paper/contract/infernal/proc/signIncorrectly(mob/living/carbon/human/user = target.current, blood = FALSE) - signed = 1 - update_text("your name", blood) - -/obj/item/paper/contract/infernal/power/fulfillContract(mob/living/carbon/human/user = target.current, blood = FALSE) - if(!user.dna) - return -1 - user.dna.add_mutation(HULK) - var/obj/item/organ/regenerative_core/organ = new /obj/item/organ/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 - var/datum/action/cooldown/spell/summon_wealth/money = new(user) - money.Grant(user) - return ..() - -/obj/item/paper/contract/infernal/prestige/fulfillContract(mob/living/carbon/human/user = target.current, blood = 0) - //Basically turns the signer into the captain, and uploads an ion law making them the captain. - 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.originalassignment = "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.originalassignment = "Captain" - id.update_label() - if(worn) - if(istype(worn, /obj/item/pda)) - var/obj/item/pda/PDA = worn - PDA.id = id - id.forceMove(worn) - else if(istype(worn, /obj/item/storage/wallet)) - var/obj/item/storage/wallet/W = worn - W.front_id = id - id.forceMove(worn) - worn.update_icon() - var/datum/round_event/ion_storm/add_law_only/ion = new() - ion.announceEvent = -1 - ion.ionMessage = "[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 - var/datum/action/cooldown/spell/conjure_item/spellpacket/spell_packet = new(user) - spell_packet.Grant(user) - - var/datum/action/cooldown/spell/aoe/knock/all_access = new(user) - all_access.Grant(user) - return ..() - -/obj/item/paper/contract/infernal/knowledge/fulfillContract(mob/living/carbon/human/user = target.current, blood = 0) - if(!istype(user) || !user.mind) - return -1 - user.dna.add_mutation(XRAY) - var/datum/action/cooldown/spell/view_range/view_range = new(user) - view_range.Grant(user) - return ..() - -/obj/item/paper/contract/infernal/friend/fulfillContract(mob/living/user = target.current, blood = 0) - if(!istype(user) || !user.mind) - return -1 - var/datum/action/cooldown/spell/summon_friend/friend = new(user) - friend.Grant(user) - return ..() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 3733cfb818f1..11baab180fb9 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -186,15 +186,10 @@ return else if(istype(O, /obj/item/paper) || istype(O, /obj/item/paper_bundle)) if(copier_empty()) - if(istype(O, /obj/item/paper/contract/infernal)) - to_chat(user, span_warning("[src] smokes, smelling of brimstone!")) - resistance_flags |= FLAMMABLE - fire_act() - else - if(!user.temporarilyRemoveItemFromInventory(O)) - return - copy = O - do_insertion(O, user) + if(!user.temporarilyRemoveItemFromInventory(O)) + return + copy = O + do_insertion(O, user) else to_chat(user, span_warning("There is already something in [src]!")) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 175a73c951ce..5c1d289bd54a 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -60,7 +60,7 @@ /obj/item/projectile/magic/resurrection/on_hit(mob/living/carbon/target) . = ..() if(isliving(target)) - if(target.hellbound) + if(target.mind && HAS_TRAIT(target.mind, TRAIT_HELLBOUND)) return BULLET_ACT_BLOCK if(iscarbon(target)) var/mob/living/carbon/C = target diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 775bb016161e..f54bf34e74e2 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -914,7 +914,7 @@ M.visible_message(span_warning("[M]'s body shivers slightly, maybe the dose wasn't enough...")) return ..() if(M.stat == DEAD) - if(M.suiciding || M.hellbound || ismegafauna(M)) //they are never coming back + if(M.suiciding || (M.mind && HAS_TRAIT(M.mind, TRAIT_HELLBOUND)) || ismegafauna(M)) //they are never coming back M.visible_message(span_warning("[M]'s body does not react...")) return if(iscarbon(M) && (M.getBruteLoss() + M.getFireLoss() >= 100 || HAS_TRAIT(M, TRAIT_HUSK))) //body is too damaged to be revived diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 82bcbc93e72e..65bf2fc6f1e3 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -999,12 +999,6 @@ C.blood_volume += 0.5 ..() -/datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - if(M.has_bane(BANE_IRON)) //If the target is weak to cold iron, then poison them. - if(holder && holder.chem_temp < 100) // COLD iron. - M.reagents.add_reagent(/datum/reagent/toxin, reac_volume) - ..() - /datum/reagent/gold name = "Gold" description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." @@ -1020,8 +1014,6 @@ taste_description = "expensive yet reasonable metal" /datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - if(M.has_bane(BANE_SILVER)) - M.reagents.add_reagent(/datum/reagent/toxin, reac_volume) if(ishuman(M) && is_sinfuldemon(M) && prob(80)) //sinful demons have a lesser reaction to silver M.reagents.add_reagent(/datum/reagent/toxin, reac_volume) ..() diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm deleted file mode 100644 index fa10bbc0f116..000000000000 --- a/code/modules/spells/spell_types/devil.dm +++ /dev/null @@ -1,263 +0,0 @@ -/datum/action/cooldown/spell/conjure_item/summon_pitchfork - name = "Summon Pitchfork" - desc = "A devil's weapon of choice. Use this to summon/unsummon your pitchfork." - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "pitchfork" - background_icon_state = "bg_demon" - - school = SCHOOL_CONJURATION - invocation_type = INVOCATION_NONE - - item_type = /obj/item/twohanded/pitchfork/demonic - cooldown_time = 15 SECONDS - spell_requirements = NONE - -/datum/action/cooldown/spell/conjure_item/summon_pitchfork/greater - item_type = /obj/item/twohanded/pitchfork/demonic/greater - -/datum/action/cooldown/spell/conjure_item/summon_pitchfork/ascended - item_type = /obj/item/twohanded/pitchfork/demonic/ascended - -/datum/action/cooldown/spell/conjure_item/violin - name = "Summon golden violin" - desc = "A devil's instrument of choice. \n\ - Use this to summon/unsummon your golden violin." - button_icon_state = "golden_violin" - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - background_icon_state = "bg_demon" - - invocation = "I aint have this much fun since Georgia." - invocation_type = INVOCATION_WHISPER - - item_type = /obj/item/instrument/violin/golden - -/datum/action/cooldown/spell/pointed/summon_contract - name = "Summon infernal contract" - desc = "Skip making a contract by hand, just do it by magic." - button_icon_state = "spell_default" - background_icon_state = "bg_demon" - - school = SCHOOL_CONJURATION - invocation = "Just sign on the dotted line." - invocation_type = INVOCATION_WHISPER - - cast_range = 5 - cooldown_time = 15 SECONDS - spell_requirements = NONE - -/datum/action/cooldown/spell/pointed/summon_contract/InterceptClickOn(mob/living/user, params, atom/target) - . = ..() - if(!.) - return FALSE - if(!iscarbon(target)) - return FALSE - var/mob/living/carbon/carbon_target = target - if(!carbon_target.mind) - to_chat(user, span_notice("[carbon_target] seems to not be sentient. \ - You cannot summon a contract for [carbon_target.p_them()].")) - return FALSE - if(carbon_target.stat == DEAD) - if(carbon_target.dropItemToGround(carbon_target.get_active_held_item())) - var/obj/item/paper/contract/infernal/revive/contract = new(owner.loc, carbon_target.mind, owner.mind) - user.put_in_hands(contract) - return TRUE - return FALSE - - var/obj/item/paper/contract/infernal/contract // = new(user.loc, C.mind, contractType, user.mind) - var/contractTypeName = tgui_input_list(owner, "What type of contract?", "Devilish", list("Power", "Wealth", "Prestige", "Magic", "Knowledge", "Friendship")) - switch(contractTypeName) - if("Power") - contract = new /obj/item/paper/contract/infernal/power(carbon_target.loc, carbon_target.mind, owner.mind) - if("Wealth") - contract = new /obj/item/paper/contract/infernal/wealth(carbon_target.loc, carbon_target.mind, owner.mind) - if("Prestige") - contract = new /obj/item/paper/contract/infernal/prestige(carbon_target.loc, carbon_target.mind, owner.mind) - if("Magic") - contract = new /obj/item/paper/contract/infernal/magic(carbon_target.loc, carbon_target.mind, owner.mind) - if("Knowledge") - contract = new /obj/item/paper/contract/infernal/knowledge(carbon_target.loc, carbon_target.mind, owner.mind) - if("Friendship") - contract = new /obj/item/paper/contract/infernal/friend(carbon_target.loc, carbon_target.mind, owner.mind) - carbon_target.put_in_hands(contract) - - return TRUE - -/datum/action/cooldown/spell/pointed/projectile/fireball/hellish - name = "Hellfire" - desc = "This spell launches hellfire at the target." - background_icon_state = "bg_demon" - - school = SCHOOL_EVOCATION - invocation = "Your very soul will catch fire!" - invocation_type = INVOCATION_SHOUT - - cooldown_time = 6 SECONDS - cast_range = 2 - spell_requirements = NONE - - projectile_type = /obj/item/projectile/magic/fireball/infernal - -/datum/action/cooldown/spell/jaunt/infernal_jaunt - name = "Infernal Jaunt" - desc = "Use hellfire to phase out of existence." - button_icon_state = "jaunt" - background_icon_state = "bg_demon" - - cooldown_time = 20 SECONDS - spell_requirements = NONE - -/datum/action/cooldown/spell/jaunt/infernal_jaunt/cast(mob/living/user) - . = ..() - if(!.) - return FALSE - if(istype(user)) - if(is_jaunting(user)) - if(valid_location(user)) - to_chat(user, span_warning("You are now phasing in.")) - if(do_mob(user,user,150)) - if(valid_location(user)) - user.infernalphasein() - else - to_chat(user, span_warning("You are no longer near a potential signer.")) - - else - to_chat(user, span_warning("You can only re-appear near a potential signer.")) - return ..() - else - user.notransform = TRUE - user.fakefire() - to_chat(src, span_warning("You begin to phase back into sinful flames.")) - if(do_mob(user,user,150)) - user.infernalphaseout() - else - to_chat(user, span_warning("You must remain still while exiting.")) - user.notransform = FALSE - user.fakefireextinguish() - return - - return TRUE - -/datum/action/cooldown/spell/jaunt/infernal_jaunt/proc/valid_location(mob/living/user = usr) - if(istype(get_area(user), /area/shuttle/)) // Can always phase in in a shuttle. - return TRUE - else - for(var/mob/living/C in orange(2, get_turf(user))) //Can also phase in when nearby a potential buyer. - if (C.owns_soul()) - return TRUE - return FALSE - -/mob/living/proc/infernalphaseout() - dust_animation() - spawn_dust() - visible_message(span_warning("[src] disappears in a flashfire!")) - playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1) - var/obj/effect/dummy/phased_mob/holder = new /obj/effect/dummy/phased_mob(loc) - extinguish_mob() - forceMove(holder) - holder = holder - notransform = FALSE - fakefireextinguish() - -/mob/living/proc/infernalphasein() - if(notransform) - to_chat(src, span_warning("You're too busy to jaunt in.")) - return FALSE - fakefire() - forceMove(drop_location()) - client.eye = src - visible_message(span_warning("[src] appears in a fiery blaze!")) - playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) - addtimer(CALLBACK(src, PROC_REF(fakefireextinguish)), 15, TIMER_UNIQUE) - -/datum/action/cooldown/spell/aoe/sintouch - name = "Sin Touch" - desc = "Subtly encourage someone to sin." - button_icon = 'icons/mob/actions/actions_cult.dmi' - button_icon_state = "sintouch" - background_icon_state = "bg_demon" - - invocation = "TASTE SIN AND INDULGE!!" - invocation_type = INVOCATION_SHOUT - - cooldown_time = 3 MINUTES - aoe_radius = 2 - max_targets = 3 - spell_requirements = NONE - -/datum/action/cooldown/spell/aoe/sintouch/ascended - name = "Greater Sin Touch" - cooldown_time = 10 SECONDS - aoe_radius = 7 - max_targets = 10 - -/datum/action/cooldown/spell/aoe/sintouch/cast_on_thing_in_aoe(atom/target, atom/caster) - if(!iscarbon(target)) - return - var/mob/living/carbon/target_carbon = target - if(!target_carbon.mind) - return - if(target_carbon.mind.has_antag_datum(/datum/antagonist/sintouched)) - return - if(target_carbon.anti_magic_check(FALSE, TRUE)) - return - target_carbon.mind.add_antag_datum(/datum/antagonist/sintouched) - target_carbon.Paralyze(40 SECONDS) - -/datum/action/cooldown/spell/summon_dancefloor - name = "Summon Dancefloor" - desc = "When what a Devil really needs is funk." - - school = SCHOOL_CONJURATION - - cooldown_time = 5 SECONDS //so the smoke can't be spammed - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "funk" - background_icon_state = "bg_demon" - spell_requirements = NONE - - var/list/dancefloor_turfs - var/list/dancefloor_turfs_types - var/dancefloor_exists = FALSE - var/datum/effect_system/fluid_spread/smoke/transparent/dancefloor_devil/smoke - - -/datum/action/cooldown/spell/summon_dancefloor/cast(mob/living/carbon/user) - . = ..() - if(!.) - return FALSE - LAZYINITLIST(dancefloor_turfs) - LAZYINITLIST(dancefloor_turfs_types) - - if(!smoke) - smoke = new() - smoke.set_up(0, location = 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], flags = CHANGETURF_INHERIT_AIR) - else - var/list/funky_turfs = RANGE_TURFS(1, user) - for(var/turf/closed/solid in funky_turfs) - to_chat(user, span_warning("You're too close to a wall.")) - 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/open/floor/light/colour_cycle/dancefloor_a : /turf/open/floor/light/colour_cycle/dancefloor_b, flags = CHANGETURF_INHERIT_AIR) - i++ - - return TRUE - -/datum/effect_system/fluid_spread/smoke/transparent/dancefloor_devil - effect_type = /obj/effect/particle_effect/fluid/smoke/transparent/dancefloor_devil - -/obj/effect/particle_effect/fluid/smoke/transparent/dancefloor_devil - lifetime = 2 diff --git a/code/modules/spells/spell_types/devil_boons.dm b/code/modules/spells/spell_types/devil_boons.dm deleted file mode 100644 index cb19f261841f..000000000000 --- a/code/modules/spells/spell_types/devil_boons.dm +++ /dev/null @@ -1,82 +0,0 @@ -/datum/action/cooldown/spell/summon_wealth - name = "Summon wealth" - desc = "The reward for selling your soul." - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "moneybag" - - school = SCHOOL_CONJURATION - invocation_type = INVOCATION_NONE - - cooldown_time = 10 SECONDS - spell_requirements = NONE - -/datum/action/cooldown/spell/summon_wealth/cast(mob/living/carbon/user) - . = ..() - if(!.) - return FALSE - if(user.dropItemToGround(user.get_active_held_item())) - var/obj/item = pick( - new /obj/item/coin/gold(user.drop_location()), - new /obj/item/coin/diamond(user.drop_location()), - new /obj/item/coin/silver(user.drop_location()), - new /obj/item/clothing/accessory/medal/gold(user.drop_location()), - new /obj/item/stack/sheet/mineral/gold(user.drop_location()), - new /obj/item/stack/sheet/mineral/silver(user.drop_location()), - new /obj/item/stack/sheet/mineral/diamond(user.drop_location()), - new /obj/item/holochip(user.drop_location(), 1000)) - user.put_in_hands(item) - - return TRUE - -/datum/action/cooldown/spell/view_range - name = "Distant vision" - desc = "The reward for selling your soul." - button_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "camera_jump" - - invocation_type = INVOCATION_NONE - - cooldown_time = 5 SECONDS - spell_requirements = NONE - var/ranges = list(7,8,9,10) - -/datum/action/cooldown/spell/view_range/cast(mob/living/C) - . = ..() - if(!.) - return FALSE - C.client?.view_size.setTo(tgui_input_list(C, "Select view range:", "Range", ranges)) - - return TRUE - -/datum/action/cooldown/spell/summon_friend - name = "Summon Friend" - desc = "The reward for selling your soul." - button_icon = 'icons/mob/actions/actions_spells.dmi' - button_icon_state = "sacredflame" - - invocation_type = INVOCATION_NONE - - cooldown_time = 5 SECONDS - spell_requirements = NONE - var/mob/living/friend - var/obj/effect/mob_spawn/human/demonic_friend/friendShell - -/datum/action/cooldown/spell/summon_friend/cast(mob/living/C) - . = ..() - if(!.) - return FALSE - if(!QDELETED(friend)) - to_chat(friend, span_userdanger("Your master has deemed you a poor friend. Your durance in hell will now resume.")) - friend.dust(TRUE) - qdel(friendShell) - return - if(!QDELETED(friendShell)) - qdel(friendShell) - return - var/mob/living/L = C - friendShell = new /obj/effect/mob_spawn/human/demonic_friend(L.loc, L.mind, src) - - return TRUE - -/datum/action/cooldown/spell/conjure_item/spellpacket/robeless - spell_requirements = NONE diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index c0438b2fca00..db3415074738 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -20,7 +20,7 @@ return FALSE if(target.stat != DEAD) return FALSE - if(target.suiciding || target.hellbound || HAS_TRAIT(target, TRAIT_HUSK)) + if(target.suiciding || (target.mind && HAS_TRAIT(target.mind, TRAIT_HELLBOUND)) || HAS_TRAIT(target, TRAIT_HUSK)) return FALSE var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) if(!B) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 4c91f7f05811..d07b763ad803 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -273,11 +273,6 @@ max_damage = 500 animal_origin = ALIEN_BODYPART -/obj/item/bodypart/head/devil - dismemberable = 0 - max_damage = 5000 - animal_origin = DEVIL_BODYPART - /obj/item/bodypart/head/larva icon = 'icons/mob/animal_parts.dmi' icon_state = "larva_head" diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 199aeffaae44..c1604dabf593 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -41,11 +41,6 @@ max_damage = 500 animal_origin = ALIEN_BODYPART -/obj/item/bodypart/chest/devil - dismemberable = 0 - max_damage = 5000 - animal_origin = DEVIL_BODYPART - /obj/item/bodypart/chest/larva icon = 'icons/mob/animal_parts.dmi' icon_state = "larva_chest" @@ -144,12 +139,6 @@ dismemberable = FALSE can_be_disabled = FALSE -/obj/item/bodypart/l_arm/devil - max_damage = 5000 - animal_origin = DEVIL_BODYPART - dismemberable = FALSE - can_be_disabled = FALSE - /obj/item/bodypart/r_arm name = "right arm" desc = "Over 87% of humans are right handed. That figure is much lower \ @@ -239,12 +228,6 @@ dismemberable = FALSE can_be_disabled = FALSE -/obj/item/bodypart/r_arm/devil - max_damage = 5000 - animal_origin = DEVIL_BODYPART - dismemberable = FALSE - can_be_disabled = FALSE - /obj/item/bodypart/l_leg name = "left leg" desc = "Some athletes prefer to tie their left shoelaces first for good \ @@ -326,11 +309,6 @@ dismemberable = FALSE can_be_disabled = FALSE -/obj/item/bodypart/l_leg/devil - max_damage = 5000 - animal_origin = DEVIL_BODYPART - dismemberable = FALSE - can_be_disabled = FALSE /obj/item/bodypart/r_leg name = "right leg" @@ -414,9 +392,3 @@ animal_origin = ALIEN_BODYPART dismemberable = FALSE can_be_disabled = FALSE - -/obj/item/bodypart/r_leg/devil - max_damage = 5000 - animal_origin = DEVIL_BODYPART - dismemberable = FALSE - can_be_disabled = FALSE diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index f0ac4ec518ed..fa8f315fe4aa 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -13,7 +13,7 @@ /datum/surgery_step/dissection, /datum/surgery_step/close) possible_locs = list(BODY_ZONE_CHEST) - target_mobtypes = list(/mob/living) //Feel free to dissect devils but they're magic. + target_mobtypes = list(/mob/living) replaced_by = /datum/surgery/experimental_dissection/adv requires_tech = FALSE var/value_multiplier = 1 diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index d551eb117b5b..ecc056612dde 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -189,15 +189,7 @@ for(var/V in listeners) var/mob/living/L = V - var/datum/antagonist/devil/devilinfo = is_devil(L) - if(devilinfo && findtext(message, devilinfo.truename)) - var/start = findtext(message, devilinfo.truename) - listeners = list(L) //Devil names are unique. - 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, 1, start) + copytext(message, start + length(devilinfo.truename)) - break - else if(findtext(message, L.real_name, 1, length(L.real_name) + 1)) + if(findtext(message, L.real_name, 1, length(L.real_name) + 1)) specific_listeners += L //focus on those with the specified name //Cut out the name so it doesn't trigger commands found_string = L.real_name @@ -387,13 +379,7 @@ cooldown = COOLDOWN_MEME for(var/V in listeners) var/mob/living/L = V - var/text = "" - if(is_devil(L)) - var/datum/antagonist/devil/devilinfo = is_devil(L) - text = devilinfo.truename - else - text = L.real_name - addtimer(CALLBACK(L, /atom/movable/proc/say, text), 5 * i) + addtimer(CALLBACK(L, /atom/movable/proc/say, L.real_name), 5 * i) i++ //SAY MY NAME diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 8cc452f225d2..171b975ab107 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/devil.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/devil.ts deleted file mode 100644 index 9ddd1e7763cc..000000000000 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/devil.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Antagonist, Category } from "../base"; -import { multiline } from "common/string"; - -export const DEVIL_MECHANICAL_DESCRIPTION - = multiline` - Make deals with crew members to slowly accrue power, but be wary of revealing your weaknesses. - As you collect more contracts, your disguise will fall away, and the mortals will grow desperate in their pursuit to banish you. - `; - - -const Devil: Antagonist = { - key: "devil", - name: "Devil", - description: [ - multiline` - The Fallen Angel, Lucifer, is a fine friend to those down on fortune, and you are one of his many agents. - While you can take several forms, you don one of a corporate worker to infiltrate a pit of despondency. - The poor souls have little to live for; temptation should prove simple. - `, - DEVIL_MECHANICAL_DESCRIPTION, - ], - category: Category.Roundstart, - priority: -1, -}; - -export default Devil; diff --git a/yogstation.dme b/yogstation.dme index 1d4632a51ae4..0f26dcba9c93 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -280,7 +280,6 @@ #include "code\_onclick\hud\blobbernauthud.dm" #include "code\_onclick\hud\constructs.dm" #include "code\_onclick\hud\credits.dm" -#include "code\_onclick\hud\devil.dm" #include "code\_onclick\hud\drones.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\generic_dextrous.dm" @@ -437,7 +436,6 @@ #include "code\datums\ruins.dm" #include "code\datums\saymode.dm" #include "code\datums\shuttles.dm" -#include "code\datums\soullink.dm" #include "code\datums\spawners_menu.dm" #include "code\datums\verbs.dm" #include "code\datums\view.dm" @@ -805,10 +803,6 @@ #include "code\game\gamemodes\clown_ops\clown_weapons.dm" #include "code\game\gamemodes\clown_ops\honkmother.dm" #include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\devil\devil_game_mode.dm" -#include "code\game\gamemodes\devil\game_mode.dm" -#include "code\game\gamemodes\devil\objectives.dm" -#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" #include "code\game\gamemodes\dynamic\dynamic.dm" #include "code\game\gamemodes\dynamic\dynamic_hijacking.dm" #include "code\game\gamemodes\dynamic\dynamic_logging.dm" @@ -1735,13 +1729,6 @@ #include "code\modules\antagonists\demon\sins\greed.dm" #include "code\modules\antagonists\demon\sins\pride.dm" #include "code\modules\antagonists\demon\sins\wrath.dm" -#include "code\modules\antagonists\devil\devil.dm" -#include "code\modules\antagonists\devil\devil_helpers.dm" -#include "code\modules\antagonists\devil\imp\imp.dm" -#include "code\modules\antagonists\devil\sintouched\objectives.dm" -#include "code\modules\antagonists\devil\sintouched\sintouched.dm" -#include "code\modules\antagonists\devil\true_devil\_true_devil.dm" -#include "code\modules\antagonists\devil\true_devil\inventory.dm" #include "code\modules\antagonists\disease\disease_abilities.dm" #include "code\modules\antagonists\disease\disease_datum.dm" #include "code\modules\antagonists\disease\disease_disease.dm" @@ -2194,7 +2181,6 @@ #include "code\modules\events\communications_blackout.dm" #include "code\modules\events\creep_awakening.dm" #include "code\modules\events\darkspawn.dm" -#include "code\modules\events\devil.dm" #include "code\modules\events\disease_outbreak.dm" #include "code\modules\events\dust.dm" #include "code\modules\events\electrical_storm.dm" @@ -3018,7 +3004,6 @@ #include "code\modules\NTNet\services\_service.dm" #include "code\modules\paperwork\carbonpaper.dm" #include "code\modules\paperwork\clipboard.dm" -#include "code\modules\paperwork\contract.dm" #include "code\modules\paperwork\faxmachine.dm" #include "code\modules\paperwork\filingcabinet.dm" #include "code\modules\paperwork\folders.dm" @@ -3419,8 +3404,6 @@ #include "code\modules\shuttle\shuttle_creation\shuttle_creator_overlay.dm" #include "code\modules\shuttle\shuttle_creation\shuttle_upgrades.dm" #include "code\modules\spells\spell.dm" -#include "code\modules\spells\spell_types\devil.dm" -#include "code\modules\spells\spell_types\devil_boons.dm" #include "code\modules\spells\spell_types\hivemind.dm" #include "code\modules\spells\spell_types\madness_curse.dm" #include "code\modules\spells\spell_types\right_and_wrong.dm" diff --git a/yogstation/code/_globalvars/lists/maintenance_loot.dm b/yogstation/code/_globalvars/lists/maintenance_loot.dm index 3267bbec6c9d..54ca8dbd2614 100644 --- a/yogstation/code/_globalvars/lists/maintenance_loot.dm +++ b/yogstation/code/_globalvars/lists/maintenance_loot.dm @@ -427,7 +427,7 @@ GLOBAL_LIST_INIT(maintenance_loot_traditional,list( /obj/item/twohanded/vxtvulhammer/toy = W_RARE, /obj/item/toy/syndicateballoon = W_RARE, /obj/item/toy/talking/AI = W_RARE, - /obj/item/toy/talking/codex_gigas = W_RARE, + /obj/item/toy/codex_gigas = W_RARE, /obj/item/toy/talking/griffin = W_RARE, /obj/item/toy/talking/owl = W_RARE, /obj/item/toy/toy_dagger = W_RARE,