[message]"))
- to_chat(user, span_notice("I send the message to my target."))
- log_directed_talk(user, L, message, LOG_SAY, "abductor whisper")
-
-
-/obj/item/firing_pin/abductor
- name = "alien firing pin"
- icon_state = "firing_pin_ayy"
- desc = "This firing pin is slimy and warm; you can swear you feel it \
- constantly trying to mentally probe you."
- fail_message = "\
- Firing error, please contact Command."
-
-/obj/item/firing_pin/abductor/pin_auth(mob/living/user)
- . = isabductor(user)
-
-/obj/item/gun/energy/alien
- name = "alien pistol"
- desc = ""
- ammo_type = list(/obj/item/ammo_casing/energy/declone)
- pin = /obj/item/firing_pin/abductor
- icon_state = "alienpistol"
- item_state = "alienpistol"
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL
-
-/obj/item/gun/energy/shrink_ray
- name = "shrink ray blaster"
- desc = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \
- That or it's just space magic. Either way, it shrinks stuff."
- ammo_type = list(/obj/item/ammo_casing/energy/shrink)
- item_state = "shrink_ray"
- icon_state = "shrink_ray"
- fire_delay = 30
- selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them)
-
-/obj/item/paper/guides/antag/abductor
- name = "Dissection Guide"
- icon_state = "alienpaper_words"
- info = {"Dissection for Dummies
-
-
- 1.Acquire fresh specimen.
- 2.Put the specimen on operating table.
- 3.Apply surgical drapes, preparing for experimental dissection.
- 4.Apply scalpel to specimen's torso.
- 5.Clamp bleeders on specimen's torso with a hemostat.
- 6.Retract skin of specimen's torso with a retractor.
- 7.Apply scalpel again to specimen's torso.
- 8.Search through the specimen's torso with my hands to remove any superfluous organs.
- 9.Insert replacement gland (Retrieve one from gland storage).
- 10.Consider dressing the specimen back to not disturb the habitat.
- 11.Put the specimen in the experiment machinery.
- 12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
- 13.You will receive one supply credit, and the subject will be counted towards my quota.
-
-Congratulations! You are now trained for invasive xenobiology research!"}
-
-/obj/item/paper/guides/antag/abductor/update_icon()
- return
-
-/obj/item/paper/guides/antag/abductor/AltClick()
- return //otherwise it would fold into a paperplane.
-
-#define BATON_STUN 0
-#define BATON_SLEEP 1
-#define BATON_CUFF 2
-#define BATON_PROBE 3
-#define BATON_MODES 4
-
-/obj/item/abductor/baton
- name = "advanced baton"
- desc = ""
- var/mode = BATON_STUN
- icon_state = "wonderprodStun"
- item_state = "wonderprod"
- slot_flags = ITEM_SLOT_BELT
- force = 7
- w_class = WEIGHT_CLASS_NORMAL
- actions_types = list(/datum/action/item_action/toggle_mode)
-
-/obj/item/abductor/baton/proc/toggle(mob/living/user=usr)
- mode = (mode+1)%BATON_MODES
- var/txt
- switch(mode)
- if(BATON_STUN)
- txt = "stunning"
- if(BATON_SLEEP)
- txt = "sleep inducement"
- if(BATON_CUFF)
- txt = "restraining"
- if(BATON_PROBE)
- txt = "probing"
-
- to_chat(usr, span_notice("I switch the baton to [txt] mode."))
- update_icon()
-
-/obj/item/abductor/baton/update_icon()
- switch(mode)
- if(BATON_STUN)
- icon_state = "wonderprodStun"
- item_state = "wonderprodStun"
- if(BATON_SLEEP)
- icon_state = "wonderprodSleep"
- item_state = "wonderprodSleep"
- if(BATON_CUFF)
- icon_state = "wonderprodCuff"
- item_state = "wonderprodCuff"
- if(BATON_PROBE)
- icon_state = "wonderprodProbe"
- item_state = "wonderprodProbe"
-
-/obj/item/abductor/baton/attack(mob/target, mob/living/user)
- if(!AbductorCheck(user))
- return
-
- if(iscyborg(target))
- ..()
- return
-
- if(!isliving(target))
- return
-
- var/mob/living/L = target
-
- user.do_attack_animation(L)
-
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
- playsound(H, 'sound/blank.ogg', 50, TRUE)
- return FALSE
-
- switch (mode)
- if(BATON_STUN)
- StunAttack(L,user)
- if(BATON_SLEEP)
- SleepAttack(L,user)
- if(BATON_CUFF)
- CuffAttack(L,user)
- if(BATON_PROBE)
- ProbeAttack(L,user)
-
-/obj/item/abductor/baton/attack_self(mob/living/user)
- toggle(user)
-
-/obj/item/abductor/baton/proc/StunAttack(mob/living/L,mob/living/user)
-
- L.lastattacker = user.real_name
- L.lastattackerckey = user.ckey
-
- L.Paralyze(140)
- L.apply_effect(EFFECT_STUTTER, 7)
- SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
-
- L.visible_message(span_danger("[user] has stunned [L] with [src]!"), \
- span_danger("[user] has stunned you with [src]!"))
- playsound(src, 'sound/blank.ogg', 50, TRUE, -1)
-
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- H.forcesay(GLOB.hit_appends)
-
- log_combat(user, L, "stunned")
-
-/obj/item/abductor/baton/proc/SleepAttack(mob/living/L,mob/living/user)
- if(L.incapacitated(TRUE, TRUE))
- if(L.anti_magic_check(FALSE, FALSE, TRUE))
- to_chat(user, span_warning("The specimen's tinfoil protection is interfering with the sleep inducement!"))
- L.visible_message(span_danger("[user] tried to induced sleep in [L] with [src], but [L.p_their()] tinfoil protection [L.p_them()]!"), \
- span_danger("I feel a strange wave of heavy drowsiness wash over you, but my tinfoil protection deflects most of it!"))
- L.drowsyness += 2
- return
- L.visible_message(span_danger("[user] has induced sleep in [L] with [src]!"), \
- span_danger("I suddenly feel very drowsy!"))
- playsound(src, 'sound/blank.ogg', 50, TRUE, -1)
- L.Sleeping(1200)
- log_combat(user, L, "put to sleep")
- else
- if(L.anti_magic_check(FALSE, FALSE, TRUE, 0))
- to_chat(user, span_warning("The specimen's tinfoil protection is completely blocking our sleep inducement methods!"))
- L.visible_message(span_danger("[user] tried to induce sleep in [L] with [src], but [L.p_their()] tinfoil protection completely protected [L.p_them()]!"), \
- span_danger("Any sense of drowsiness is quickly diminished as my tinfoil protection deflects the effects!"))
- return
- L.drowsyness += 1
- to_chat(user, span_warning("Sleep inducement works fully only on stunned specimens! "))
- L.visible_message(span_danger("[user] tried to induce sleep in [L] with [src]!"), \
- span_danger("I suddenly feel drowsy!"))
-
-/obj/item/abductor/baton/proc/CuffAttack(mob/living/L,mob/living/user)
- if(!iscarbon(L))
- return
- var/mob/living/carbon/C = L
- if(!C.handcuffed)
- if(C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())
- playsound(src, 'sound/blank.ogg', 30, TRUE, -2)
- C.visible_message(span_danger("[user] begins restraining [C] with [src]!"), \
- span_danger("[user] begins shaping an energy field around my hands!"))
- if(do_mob(user, C, 30) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore()))
- if(!C.handcuffed)
- C.handcuffed = new /obj/item/restraints/handcuffs/energy/used(C)
- C.update_handcuffed()
- to_chat(user, span_notice("I restrain [C]."))
- log_combat(user, C, "handcuffed")
- else
- to_chat(user, span_warning("I fail to restrain [C]."))
- else
- to_chat(user, span_warning("[C] doesn't have two hands..."))
-
-/obj/item/abductor/baton/proc/ProbeAttack(mob/living/L,mob/living/user)
- L.visible_message(span_danger("[user] probes [L] with [src]!"), \
- span_danger("[user] probes you!"))
-
- var/species = span_warning("Unknown species")
- var/helptext = span_warning("Species unsuitable for experiments.")
-
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- species = span_notice("[H.dna.species.name]")
- if(L.mind && L.mind.has_antag_datum(/datum/antagonist/changeling))
- species = span_warning("Changeling lifeform")
- var/obj/item/organ/heart/gland/temp = locate() in H.internal_organs
- if(temp)
- helptext = span_warning("Experimental gland detected!")
- else
- if (L.getorganslot(ORGAN_SLOT_HEART))
- helptext = span_notice("Subject suitable for experiments.")
- else
- helptext = span_warning("Subject unsuitable for experiments.")
-
- to_chat(user, "Probing result:[species]")
- to_chat(user, "[helptext]")
-
-/obj/item/restraints/handcuffs/energy
- name = "hard-light energy field"
- desc = ""
- icon_state = "cuff" // Needs sprite
- lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
- breakouttime = 450
- trashtype = /obj/item/restraints/handcuffs/energy/used
- flags_1 = NONE
-
-/obj/item/restraints/handcuffs/energy/used
- item_flags = DROPDEL
-
-/obj/item/restraints/handcuffs/energy/used/dropped(mob/user)
- user.visible_message(span_danger("[user]'s [name] breaks in a discharge of energy!"), \
- span_danger("[user]'s [name] breaks in a discharge of energy!"))
- var/datum/effect_system/spark_spread/S = new
- S.set_up(4,0,user.loc)
- S.start()
- . = ..()
-
-/obj/item/abductor/baton/examine(mob/user)
- . = ..()
- switch(mode)
- if(BATON_STUN)
- . += span_warning("The baton is in stun mode.")
- if(BATON_SLEEP)
- . += span_warning("The baton is in sleep inducement mode.")
- if(BATON_CUFF)
- . += span_warning("The baton is in restraining mode.")
- if(BATON_PROBE)
- . += span_warning("The baton is in probing mode.")
-
-/obj/item/radio/headset/abductor
- name = "alien headset"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- icon_state = "abductor_headset"
- item_state = "abductor_headset"
- keyslot2 = new /obj/item/encryptionkey/heads/captain
-
-/obj/item/radio/headset/abductor/Initialize(mapload)
- . = ..()
- make_syndie()
-
-/obj/item/radio/headset/abductor/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_HEAD))
-
-/obj/item/radio/headset/abductor/attackby(obj/item/W, mob/user, params)
- if(W.tool_behaviour == TOOL_SCREWDRIVER)
- return // Stops humans from disassembling abductor headsets.
- return ..()
-
-/obj/item/abductor_machine_beacon
- name = "machine beacon"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- icon_state = "beacon"
- w_class = WEIGHT_CLASS_TINY
- var/obj/machinery/spawned_machine
-
-/obj/item/abductor_machine_beacon/attack_self(mob/user)
- ..()
- user.visible_message(span_notice("[user] places down [src] and activates it."), span_notice("I place down [src] and activate it."))
- user.dropItemToGround(src)
- playsound(src, 'sound/blank.ogg', 50)
- addtimer(CALLBACK(src, PROC_REF(try_spawn_machine)), 30)
-
-/obj/item/abductor_machine_beacon/proc/try_spawn_machine()
- var/viable = FALSE
- if(isfloorturf(loc))
- var/turf/T = loc
- viable = TRUE
- for(var/obj/thing in T.contents)
- if(thing.density || ismachinery(thing) || isstructure(thing))
- viable = FALSE
- if(viable)
- playsound(src, 'sound/blank.ogg', 50, TRUE)
- var/new_machine = new spawned_machine(loc)
- visible_message(span_notice("[new_machine] warps on top of the beacon!"))
- qdel(src)
- else
- playsound(src, 'sound/blank.ogg', 50)
-
-/obj/item/abductor_machine_beacon/chem_dispenser
- name = "beacon - Reagent Synthesizer"
- spawned_machine = /obj/machinery/chem_dispenser/abductor
-
-/obj/item/scalpel/alien
- name = "alien scalpel"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- toolspeed = 0.25
-
-/obj/item/hemostat/alien
- name = "alien hemostat"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- toolspeed = 0.25
-
-/obj/item/retractor/alien
- name = "alien retractor"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- toolspeed = 0.25
-
-/obj/item/circular_saw/alien
- name = "alien saw"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- toolspeed = 0.25
-
-/obj/item/surgicaldrill/alien
- name = "alien drill"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- toolspeed = 0.25
-
-/obj/item/cautery/alien
- name = "alien cautery"
- desc = "Why would bloodless aliens have a tool to stop bleeding? \
- Unless..."
- icon = 'icons/obj/abductor.dmi'
- toolspeed = 0.25
-
-/obj/item/clothing/head/helmet/abductor
- name = "agent headgear"
- desc = ""
- icon_state = "alienhelmet"
- item_state = "alienhelmet"
- blockTracking = TRUE
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
-
-// Operating Table / Beds / Lockers
-
-/obj/structure/bed/abductor
- name = "resting contraption"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- buildstacktype = /obj/item/stack/sheet/mineral/abductor
- icon_state = "bed"
-
-/obj/structure/table_frame/abductor
- name = "alien table frame"
- desc = ""
- icon_state = "alien_frame"
- framestack = /obj/item/stack/sheet/mineral/abductor
- framestackamount = 1
-
-/obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_WRENCH)
- to_chat(user, span_notice("I start disassembling [src]..."))
- I.play_tool_sound(src)
- if(I.use_tool(src, user, 30))
- playsound(src, 'sound/blank.ogg', 50, TRUE)
- for(var/i = 1, i <= framestackamount, i++)
- new framestack(get_turf(src))
- qdel(src)
- return
- if(istype(I, /obj/item/stack/sheet/mineral/abductor))
- var/obj/item/stack/sheet/P = I
- if(P.get_amount() < 1)
- to_chat(user, span_warning("I need one alien alloy sheet to do this!"))
- return
- to_chat(user, span_notice("I start adding [P] to [src]..."))
- if(do_after(user, 50, target = src))
- P.use(1)
- new /obj/structure/table/abductor(src.loc)
- qdel(src)
- return
- if(istype(I, /obj/item/stack/sheet/mineral/silver))
- var/obj/item/stack/sheet/P = I
- if(P.get_amount() < 1)
- to_chat(user, span_warning("I need one sheet of silver to do this!"))
- return
- to_chat(user, span_notice("I start adding [P] to [src]..."))
- if(do_after(user, 50, target = src))
- P.use(1)
- new /obj/structure/table/optable/abductor(src.loc)
- qdel(src)
-
-/obj/structure/table/abductor
- name = "alien table"
- desc = ""
- icon = 'icons/obj/smooth_structures/alien_table.dmi'
- icon_state = "alien_table"
- buildstack = /obj/item/stack/sheet/mineral/abductor
- framestack = /obj/item/stack/sheet/mineral/abductor
- buildstackamount = 1
- framestackamount = 1
- canSmoothWith = null
- frame = /obj/structure/table_frame/abductor
-
-/obj/structure/table/optable/abductor
- name = "alien operating table"
- desc = ""
- frame = /obj/structure/table_frame/abductor
- buildstack = /obj/item/stack/sheet/mineral/silver
- framestack = /obj/item/stack/sheet/mineral/abductor
- buildstackamount = 1
- framestackamount = 1
- icon = 'icons/obj/abductor.dmi'
- icon_state = "bed"
- can_buckle = 1
-
- var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico)
-
-/obj/structure/table/optable/abductor/Crossed(atom/movable/AM)
- . = ..()
- if(iscarbon(AM))
- START_PROCESSING(SSobj, src)
- to_chat(AM, span_danger("I feel a series of tiny pricks!"))
-
-/obj/structure/table/optable/abductor/process()
- . = PROCESS_KILL
- for(var/mob/living/carbon/C in get_turf(src))
- . = TRUE
- for(var/chemical in injected_reagents)
- if(C.reagents.get_reagent_amount(chemical) < 1)
- C.reagents.add_reagent(chemical, 1)
-
-/obj/structure/table/optable/abductor/Destroy()
- STOP_PROCESSING(SSobj, src)
- . = ..()
-
-/obj/structure/closet/abductor
- name = "alien locker"
- desc = ""
- icon_state = "abductor"
- icon_door = "abductor"
- can_weld_shut = FALSE
- material_drop = /obj/item/stack/sheet/mineral/abductor
-
-/obj/structure/door_assembly/door_assembly_abductor
- name = "alien airlock assembly"
- icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi'
- base_name = "alien airlock"
- overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi'
- airlock_type = /obj/machinery/door/airlock/abductor
- material_type = /obj/item/stack/sheet/mineral/abductor
- noglass = TRUE
-
-/obj/item/clothing/under/abductor
- desc = ""
- name = "alien jumpsuit"
- icon = 'icons/obj/clothing/under/syndicate.dmi'
- icon_state = "abductor"
- item_state = "bl_suit"
- mob_overlay_icon = 'icons/mob/clothing/under/syndicate.dmi'
- armor = list("blunt" = 0, "slash" = 0, "stab" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
- can_adjust = 0
diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
deleted file mode 100644
index 2381dc2013c..00000000000
--- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
+++ /dev/null
@@ -1,56 +0,0 @@
-/datum/outfit/abductor
- name = "Abductor Basic"
- uniform = /obj/item/clothing/under/abductor
- shoes = /obj/item/clothing/shoes/combat
- back = /obj/item/storage/backpack
- ears = /obj/item/radio/headset/abductor
-
-/datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number)
- var/datum/antagonist/abductor/A = H.mind.has_antag_datum(/datum/antagonist/abductor)
- if(!team_number && A)
- team_number = A.team.team_number
- if(!team_number)
- team_number = 1
-
- var/obj/machinery/abductor/console/console = get_abductor_console(team_number)
- if(console)
- var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
- if(V)
- console.AddVest(V)
- ADD_TRAIT(V, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)
-
- var/obj/item/storage/backpack/B = locate() in H
- if(B)
- for(var/obj/item/abductor/gizmo/G in B.contents)
- console.AddGizmo(G)
-
-/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- ..()
- if(!visualsOnly)
- link_to_console(H)
-
-
-/datum/outfit/abductor/agent
- name = "Abductor Agent"
- head = /obj/item/clothing/head/helmet/abductor
- suit = /obj/item/clothing/suit/armor/abductor/vest
- suit_store = /obj/item/abductor/baton
- belt = /obj/item/storage/belt/military/abductor/full
-
- backpack_contents = list(
- /obj/item/gun/energy/alien = 1,
- /obj/item/abductor/silencer = 1
- )
-
-/datum/outfit/abductor/scientist
- name = "Abductor Scientist"
-
- backpack_contents = list(
- /obj/item/abductor/gizmo = 1
- )
-
-/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- ..()
- if(!visualsOnly)
- var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H)
- beamplant.implant(H)
diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
deleted file mode 100644
index e14527a39aa..00000000000
--- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/* RETARDED
-/datum/surgery_step/extract_organ
- name = "remove heart"
- accept_hand = 1
- time = 32
- var/obj/item/organ/IC = null
- var/list/organ_types = list(/obj/item/organ/heart)
-
-/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- for(var/atom/A in target.internal_organs)
- if(A.type in organ_types)
- IC = A
- break
- user.visible_message(span_notice("[user] starts to remove [target]'s organs."), span_notice("I start to remove [target]'s organs..."))
-
-/datum/surgery_step/extract_organ/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(IC)
- user.visible_message(span_notice("[user] pulls [IC] out of [target]'s [target_zone]!"), span_notice("I pull [IC] out of [target]'s [target_zone]."))
- user.put_in_hands(IC)
- IC.Remove(target)
- return 1
- else
- to_chat(user, span_warning("I don't find anything in [target]'s [target_zone]!"))
- return 1
-
-/datum/surgery_step/gland_insert
- name = "insert gland"
- implements = list(/obj/item/organ/heart/gland = 100)
- time = 32
-
-/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message(span_notice("[user] starts to insert [tool] into [target]."), span_notice("I start to insert [tool] into [target]..."))
-
-/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message(span_notice("[user] inserts [tool] into [target]."), span_notice("I insert [tool] into [target]."))
- user.temporarilyRemoveItemFromInventory(tool, TRUE)
- var/obj/item/organ/heart/gland/gland = tool
- gland.Insert(target, 2)
- return 1
-*/
diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm
deleted file mode 100644
index e271efa3ccd..00000000000
--- a/code/modules/antagonists/abductor/equipment/gland.dm
+++ /dev/null
@@ -1,109 +0,0 @@
-/obj/item/organ/heart/gland
- name = "fleshy mass"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- icon_state = "gland"
- status = ORGAN_ROBOTIC
- beating = TRUE
- var/true_name = "baseline placebo referencer"
- var/cooldown_low = 300
- var/cooldown_high = 300
- var/next_activation = 0
- var/uses // -1 For infinite
- var/human_only = FALSE
- var/active = FALSE
-
- var/mind_control_uses = 1
- var/mind_control_duration = 1800
- var/active_mind_control = FALSE
-
-/obj/item/organ/heart/gland/Initialize()
- . = ..()
- icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral"))
-
-/obj/item/organ/heart/gland/examine(mob/user)
- . = ..()
- if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user))
- . += span_notice("It is \a [true_name].")
-
-/obj/item/organ/heart/gland/proc/ownerCheck()
- if(ishuman(owner))
- return TRUE
- if(!human_only && iscarbon(owner))
- return TRUE
- return FALSE
-
-/obj/item/organ/heart/gland/proc/Start()
- active = 1
- next_activation = world.time + rand(cooldown_low,cooldown_high)
-
-/obj/item/organ/heart/gland/proc/update_gland_hud()
- if(!owner)
- return
- var/image/holder = owner.hud_list[GLAND_HUD]
- var/icon/I = icon(owner.icon, owner.icon_state, owner.dir)
- holder.pixel_y = I.Height() - world.icon_size
- if(active_mind_control)
- holder.icon_state = "hudgland_active"
- else if(mind_control_uses)
- holder.icon_state = "hudgland_ready"
- else
- holder.icon_state = "hudgland_spent"
-
-/obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user)
- if(!ownerCheck() || !mind_control_uses || active_mind_control)
- return FALSE
- mind_control_uses--
- to_chat(owner, span_danger("I suddenly feel an irresistible compulsion to follow an order..."))
- to_chat(owner, span_mind_control("[command]"))
- active_mind_control = TRUE
- message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]")
- update_gland_hud()
- var/atom/movable/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /atom/movable/screen/alert/mind_control)
- mind_alert.command = command
- addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration)
- return TRUE
-
-/obj/item/organ/heart/gland/proc/clear_mind_control()
- if(!ownerCheck() || !active_mind_control)
- return FALSE
- to_chat(owner, span_danger("I feel the compulsion fade, and you completely forget about your previous orders."))
- owner.clear_alert("mind_control")
- active_mind_control = FALSE
- return TRUE
-
-/obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = 0)
- active = 0
- if(initial(uses) == 1)
- uses = initial(uses)
- var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
- hud.remove_from_hud(owner)
- clear_mind_control()
- ..()
-
-/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0)
- ..()
- if(special != 2 && uses) // Special 2 means abductor surgery
- Start()
- var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
- hud.add_to_hud(owner)
- update_gland_hud()
-
-/obj/item/organ/heart/gland/on_life()
- if(!beating)
- // alien glands are immune to stopping.
- beating = TRUE
- if(!active)
- return
- if(!ownerCheck())
- active = 0
- return
- if(next_activation <= world.time)
- activate()
- uses--
- next_activation = world.time + rand(cooldown_low,cooldown_high)
- if(!uses)
- active = 0
-
-/obj/item/organ/heart/gland/proc/activate()
- return
diff --git a/code/modules/antagonists/abductor/equipment/glands/access.dm b/code/modules/antagonists/abductor/equipment/glands/access.dm
deleted file mode 100644
index 42b534dbd9a..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/access.dm
+++ /dev/null
@@ -1,19 +0,0 @@
-/obj/item/organ/heart/gland/access
- true_name = "anagraphic electro-scrambler"
- cooldown_low = 600
- cooldown_high = 1200
- uses = 1
- icon_state = "mindshock"
- mind_control_uses = 3
- mind_control_duration = 900
-
-/obj/item/organ/heart/gland/access/activate()
- to_chat(owner, span_notice("I feel like a VIP for some reason."))
- RegisterSignal(owner, COMSIG_MOB_ALLOWED, PROC_REF(free_access))
-
-/obj/item/organ/heart/gland/access/proc/free_access(datum/source, obj/O)
- return TRUE
-
-/obj/item/organ/heart/gland/access/Remove(mob/living/carbon/M, special = 0)
- UnregisterSignal(owner, COMSIG_MOB_ALLOWED)
- ..()
diff --git a/code/modules/antagonists/abductor/equipment/glands/blood.dm b/code/modules/antagonists/abductor/equipment/glands/blood.dm
deleted file mode 100644
index f40896c0df0..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/blood.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/obj/item/organ/heart/gland/blood
- true_name = "pseudonuclear hemo-destabilizer"
- cooldown_low = 1200
- cooldown_high = 1800
- uses = -1
- icon_state = "egg"
- lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
- mind_control_uses = 3
- mind_control_duration = 1500
-
-/obj/item/organ/heart/gland/blood/activate()
- if(!ishuman(owner) || !owner.dna.species)
- return
- var/mob/living/carbon/human/H = owner
- var/datum/species/species = H.dna.species
- to_chat(H, span_warning("I feel your blood heat up for a moment."))
- species.exotic_blood = get_random_reagent_id()
diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm
deleted file mode 100644
index b651b45f6d1..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/chem.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/obj/item/organ/heart/gland/chem
- true_name = "intrinsic pharma-provider"
- cooldown_low = 50
- cooldown_high = 50
- uses = -1
- icon_state = "viral"
- mind_control_uses = 3
- mind_control_duration = 1200
- var/list/possible_reagents = list()
-
-/obj/item/organ/heart/gland/chem/Initialize()
- . = ..()
- for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin))
- possible_reagents += R
-
-/obj/item/organ/heart/gland/chem/activate()
- var/chem_to_add = pick(possible_reagents)
- owner.reagents.add_reagent(chem_to_add, 2)
- owner.adjustToxLoss(-5, TRUE, TRUE)
- ..()
diff --git a/code/modules/antagonists/abductor/equipment/glands/egg.dm b/code/modules/antagonists/abductor/equipment/glands/egg.dm
deleted file mode 100644
index 5943e1c8c71..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/egg.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/obj/item/organ/heart/gland/egg
- true_name = "roe/enzymatic synthesizer"
- cooldown_low = 300
- cooldown_high = 400
- uses = -1
- icon_state = "egg"
- lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
- mind_control_uses = 2
- mind_control_duration = 1800
-
-/obj/item/organ/heart/gland/egg/activate()
- owner.visible_message(span_alertalien("[owner] [pick(EGG_LAYING_MESSAGES)]"))
- var/turf/T = owner.drop_location()
- new /obj/item/reagent_containers/food/snacks/egg/gland(T)
diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm
deleted file mode 100644
index 6100ccc2b06..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/electric.dm
+++ /dev/null
@@ -1,26 +0,0 @@
-/obj/item/organ/heart/gland/electric
- true_name = "electron accumulator/discharger"
- cooldown_low = 800
- cooldown_high = 1200
- icon_state = "species"
- uses = -1
- mind_control_uses = 2
- mind_control_duration = 900
-
-/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0)
- ..()
- ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
-
-/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
- REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
- ..()
-
-/obj/item/organ/heart/gland/electric/activate()
- owner.visible_message(span_danger("[owner]'s skin starts emitting electric arcs!"),\
- span_warning("I feel electric energy building up inside you!"))
- playsound(get_turf(owner), "sparks", 100, TRUE, -1)
- addtimer(CALLBACK(src, PROC_REF(zap)), rand(30, 100))
-
-/obj/item/organ/heart/gland/electric/proc/zap()
- tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN)
- playsound(get_turf(owner), 'sound/blank.ogg', 50, TRUE)
diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm
deleted file mode 100644
index e8f3d140c1f..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/heal.dm
+++ /dev/null
@@ -1,178 +0,0 @@
-/obj/item/organ/heart/gland/heal
- true_name = "organic replicator"
- cooldown_low = 200
- cooldown_high = 400
- uses = -1
- human_only = TRUE
- icon_state = "health"
- mind_control_uses = 3
- mind_control_duration = 3000
-
-/obj/item/organ/heart/gland/heal/activate()
- if(!(owner.mob_biotypes & MOB_ORGANIC))
- return
-
- for(var/organ in owner.internal_organs)
- if(istype(organ, /obj/item/organ/cyberimp))
- reject_implant(organ)
- return
-
- var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER)
- if((!liver/* && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)*/) || (liver && ((liver.damage > (liver.maxHealth / 2)) || (istype(liver, /obj/item/organ/liver/cybernetic)))))
- replace_liver(liver)
- return
-
- var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS)
- if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && (istype(lungs, /obj/item/organ/lungs/cybernetic))))
- replace_lungs(lungs)
- return
-
- var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES)
- if(!eyes || (eyes && ((HAS_TRAIT_FROM(owner, TRAIT_NEARSIGHT, EYE_DAMAGE)) || (HAS_TRAIT_FROM(owner, TRAIT_BLIND, EYE_DAMAGE)) || (istype(eyes, /obj/item/organ/eyes/robotic)))))
- replace_eyes(eyes)
- return
-
- var/obj/item/bodypart/limb
- var/list/limb_list = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
- for(var/zone in limb_list)
- limb = owner.get_bodypart(zone)
- if(!limb)
- replace_limb(zone)
- return
- if((limb.get_damage() >= (limb.max_damage / 2)) || (limb.status == BODYPART_ROBOTIC))
- replace_limb(zone, limb)
- return
-
- if(owner.getToxLoss() > 40)
- replace_blood()
- return
- var/tox_amount = 0
- for(var/datum/reagent/toxin/T in owner.reagents.reagent_list)
- tox_amount += owner.reagents.get_reagent_amount(T.type)
- if(tox_amount > 10)
- replace_blood()
- return
- if(owner.blood_volume < BLOOD_VOLUME_OKAY)
- owner.blood_volume = BLOOD_VOLUME_NORMAL
- to_chat(owner, span_warning("I feel my blood pulsing within you."))
- return
-
- var/obj/item/bodypart/chest/chest = owner.get_bodypart(BODY_ZONE_CHEST)
- if((chest.get_damage() >= (chest.max_damage / 4)) || (chest.status == BODYPART_ROBOTIC))
- replace_chest(chest)
- return
-
-/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/organ/cyberimp/implant)
- owner.visible_message(span_warning("[owner] vomits up his [implant.name]!"), span_danger("I suddenly vomit up my [implant.name]!"))
- owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
- implant.Remove(owner)
- implant.forceMove(owner.drop_location())
-
-/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver)
- if(liver)
- owner.visible_message(span_warning("[owner] vomits up his [liver.name]!"), span_danger("I suddenly vomit up my [liver.name]!"))
- owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
- liver.Remove(owner)
- liver.forceMove(owner.drop_location())
- else
- to_chat(owner, span_warning("I feel a weird rumble in my bowels..."))
-
- var/liver_type = /obj/item/organ/liver
- if(owner?.dna?.species?.organs[ORGAN_SLOT_LIVER])
- liver_type = owner.dna.species.organs[ORGAN_SLOT_LIVER]
- var/obj/item/organ/liver/new_liver = new liver_type()
- new_liver.Insert(owner)
-
-/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs)
- if(lungs)
- owner.visible_message(span_warning("[owner] vomits up his [lungs.name]!"), span_danger("I suddenly vomit up my [lungs.name]!"))
- owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
- lungs.Remove(owner)
- lungs.forceMove(owner.drop_location())
- else
- to_chat(owner, span_warning("I feel a weird rumble inside my chest..."))
-
- var/lung_type = /obj/item/organ/lungs
- if(owner.dna.species && owner.dna.species.mutantlungs)
- lung_type = owner.dna.species.mutantlungs
- var/obj/item/organ/lungs/new_lungs = new lung_type()
- new_lungs.Insert(owner)
-
-/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes)
- if(eyes)
- owner.visible_message(span_warning("[owner]'s [eyes.name] fall out of their sockets!"), span_danger("My [eyes.name] fall out of their sockets!"))
- playsound(owner, 'sound/blank.ogg', 50, TRUE)
- eyes.Remove(owner)
- eyes.forceMove(owner.drop_location())
- else
- to_chat(owner, span_warning("I feel a weird rumble behind my eye sockets..."))
-
- addtimer(CALLBACK(src, PROC_REF(finish_replace_eyes)), rand(100, 200))
-
-/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes()
- var/eye_type = /obj/item/organ/eyes
- if(owner.dna.species && owner.dna.species.organs[ORGAN_SLOT_EYES])
- eye_type = owner.dna.species.organs[ORGAN_SLOT_EYES]
- var/obj/item/organ/eyes/new_eyes = new eye_type()
- new_eyes.Insert(owner)
- owner.visible_message(span_warning("A pair of new eyes suddenly inflates into [owner]'s eye sockets!"), span_danger("A pair of new eyes suddenly inflates into my eye sockets!"))
-
-/obj/item/organ/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb)
- if(limb)
- owner.visible_message(span_warning("[owner]'s [limb.name] suddenly detaches from [owner.p_their()] body!"), span_danger("My [limb.name] suddenly detaches from my body!"))
- playsound(owner, "desceration", 50, TRUE, -1)
- limb.drop_limb()
- else
- to_chat(owner, span_warning("I feel a weird tingle in my [parse_zone(body_zone)]... even if you don't have one."))
-
- addtimer(CALLBACK(src, PROC_REF(finish_replace_limb), body_zone), rand(150, 300))
-
-/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone)
- owner.visible_message(span_warning("With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!"),
- span_danger("With a loud snap, my [parse_zone(body_zone)] rapidly grows back from my body!"),
- span_warning("My hear a loud snap."))
- playsound(owner, 'sound/blank.ogg', 50, TRUE)
- owner.regenerate_limb(body_zone)
-
-/obj/item/organ/heart/gland/heal/proc/replace_blood()
- owner.visible_message(span_warning("[owner] starts vomiting huge amounts of blood!"), span_danger("I suddenly start vomiting huge amounts of blood!"))
- keep_replacing_blood()
-
-/obj/item/organ/heart/gland/heal/proc/keep_replacing_blood()
- var/keep_going = FALSE
- owner.vomit(0, TRUE, FALSE, 3, FALSE, FALSE, FALSE, TRUE)
- owner.Stun(15)
- owner.adjustToxLoss(-15, TRUE, TRUE)
-
- owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20)
- if(owner.blood_volume < BLOOD_VOLUME_NORMAL)
- keep_going = TRUE
-
- if(owner.getToxLoss())
- keep_going = TRUE
- for(var/datum/reagent/toxin/R in owner.reagents.reagent_list)
- owner.reagents.remove_reagent(R.type, 4)
- if(owner.reagents.has_reagent(R.type))
- keep_going = TRUE
- if(keep_going)
- addtimer(CALLBACK(src, PROC_REF(keep_replacing_blood)), 30)
-
-/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest)
- if(chest.status == BODYPART_ROBOTIC)
- owner.visible_message(span_warning("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!"), span_danger("My [chest.name] rapidly expels its mechanical components, replacing them with flesh!"))
- playsound(owner, 'sound/blank.ogg', 50, TRUE)
- var/list/dirs = GLOB.alldirs.Copy()
- for(var/i in 1 to 3)
- var/obj/effect/decal/cleanable/robot_debris/debris = new(get_turf(owner))
- debris.streak(dirs)
- else
- owner.visible_message(span_warning("[owner]'s [chest.name] sheds off its damaged flesh, rapidly replacing it!"), span_warning("My [chest.name] sheds off its damaged flesh, rapidly replacing it!"))
- playsound(owner, 'sound/blank.ogg', 50, TRUE)
- var/list/dirs = GLOB.alldirs.Copy()
- for(var/i in 1 to 3)
- var/obj/effect/decal/cleanable/blood/gibs/gibs = new(get_turf(owner))
- gibs.streak(dirs)
-
- var/obj/item/bodypart/chest/new_chest = new(null)
- new_chest.replace_limb(owner, TRUE)
- qdel(chest)
diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm
deleted file mode 100644
index 381db2dc868..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm
+++ /dev/null
@@ -1,64 +0,0 @@
-/obj/item/organ/heart/gland/mindshock
- true_name = "neural crosstalk uninhibitor"
- cooldown_low = 400
- cooldown_high = 700
- uses = -1
- icon_state = "mindshock"
- mind_control_uses = 1
- mind_control_duration = 6000
- var/list/mob/living/carbon/human/broadcasted_mobs = list()
-
-/obj/item/organ/heart/gland/mindshock/activate()
- to_chat(owner, span_notice("I get a headache."))
-
- var/turf/T = get_turf(owner)
- for(var/mob/living/carbon/H in orange(4,T))
- if(H == owner)
- continue
- switch(pick(1,3))
- if(1)
- to_chat(H, span_danger("I hear a loud buzz in your head, silencing your thoughts!"))
- H.Stun(50)
- if(2)
- to_chat(H, span_warning("I hear an annoying buzz in your head."))
- H.confused += 15
- H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160)
- if(3)
- H.hallucination += 60
-
-/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user)
- if(!ownerCheck() || !mind_control_uses || active_mind_control)
- return FALSE
- mind_control_uses--
- for(var/mob/M in oview(7, owner))
- if(!ishuman(M))
- continue
- var/mob/living/carbon/human/H = M
- if(H.stat)
- continue
-
- broadcasted_mobs += H
- to_chat(H, span_danger("I suddenly feel an irresistible compulsion to follow an order..."))
- to_chat(H, span_mind_control("[command]"))
-
- message_admins("[key_name(user)] broadcasted an abductor mind control message from [key_name(owner)] to [key_name(H)]: [command]")
-
- var/atom/movable/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /atom/movable/screen/alert/mind_control)
- mind_alert.command = command
-
- if(LAZYLEN(broadcasted_mobs))
- active_mind_control = TRUE
- addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration)
-
- update_gland_hud()
- return TRUE
-
-/obj/item/organ/heart/gland/mindshock/clear_mind_control()
- if(!active_mind_control || !LAZYLEN(broadcasted_mobs))
- return FALSE
- for(var/M in broadcasted_mobs)
- var/mob/living/carbon/human/H = M
- to_chat(H, span_danger("I feel the compulsion fade, and you completely forget about your previous orders."))
- H.clear_alert("mind_control")
- active_mind_control = FALSE
- return TRUE
diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm
deleted file mode 100644
index 136d55fc92a..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/obj/item/organ/heart/gland/plasma
- true_name = "effluvium sanguine-synonym emitter"
- cooldown_low = 1200
- cooldown_high = 1800
- icon_state = "slime"
- uses = -1
- mind_control_uses = 1
- mind_control_duration = 800
-
-/obj/item/organ/heart/gland/plasma/activate()
- to_chat(owner, span_warning("I feel bloated."))
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), owner, span_danger("A massive stomachache overcomes you.")), 150)
- addtimer(CALLBACK(src, PROC_REF(vomit_plasma)), 200)
-
-/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
- if(!owner)
- return
- owner.visible_message(span_danger("[owner] vomits a cloud of plasma!"))
- var/turf/open/T = get_turf(owner)
- if(istype(T))
- T.atmos_spawn_air("plasma=50;TEMP=[T20C]")
- owner.vomit()
diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm
deleted file mode 100644
index d6a9152f4ca..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/quantum.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-/obj/item/organ/heart/gland/quantum
- true_name = "quantic de-observation matrix"
- cooldown_low = 150
- cooldown_high = 150
- uses = -1
- icon_state = "emp"
- mind_control_uses = 2
- mind_control_duration = 1200
- var/mob/living/carbon/entangled_mob
-
-/obj/item/organ/heart/gland/quantum/activate()
- if(entangled_mob)
- return
- for(var/mob/M in oview(owner, 7))
- if(!iscarbon(M))
- continue
- entangled_mob = M
- addtimer(CALLBACK(src, PROC_REF(quantum_swap)), rand(600, 2400))
- return
-
-/obj/item/organ/heart/gland/quantum/proc/quantum_swap()
- if(QDELETED(entangled_mob))
- entangled_mob = null
- return
- var/turf/T = get_turf(owner)
- do_teleport(owner, get_turf(entangled_mob),null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM)
- do_teleport(entangled_mob, T,null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM)
- to_chat(owner, span_warning("I suddenly find myself somewhere else!"))
- to_chat(entangled_mob, span_warning("I suddenly find myself somewhere else!"))
- if(!active_mind_control) //Do not reset entangled mob while mind control is active
- entangled_mob = null
-
-/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user)
- if(..())
- if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD))
- to_chat(entangled_mob, span_danger("I suddenly feel an irresistible compulsion to follow an order..."))
- to_chat(entangled_mob, span_mind_control("[command]"))
- var/atom/movable/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /atom/movable/screen/alert/mind_control)
- mind_alert.command = command
- message_admins("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]")
- update_gland_hud()
-
-/obj/item/organ/heart/gland/quantum/clear_mind_control()
- if(active_mind_control)
- to_chat(entangled_mob, span_danger("I feel the compulsion fade, and you completely forget about your previous orders."))
- entangled_mob.clear_alert("mind_control")
- ..()
diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm
deleted file mode 100644
index c2ab03ea100..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/slime.dm
+++ /dev/null
@@ -1,21 +0,0 @@
-/obj/item/organ/heart/gland/slime
- true_name = "gastric animation galvanizer"
- cooldown_low = 600
- cooldown_high = 1200
- uses = -1
- icon_state = "slime"
- mind_control_uses = 1
- mind_control_duration = 2400
-
-/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0)
- ..()
- owner.faction |= "slime"
- owner.grant_language(/datum/language/slime)
-
-/obj/item/organ/heart/gland/slime/activate()
- to_chat(owner, span_warning("I feel nauseated!"))
- owner.vomit(20)
-
- var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey")
- Slime.Friends = list(owner)
- Slime.Leader = owner
diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm
deleted file mode 100644
index ee4d5ed5b12..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/spider.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/obj/item/organ/heart/gland/spiderman
- true_name = "araneae cloister accelerator"
- cooldown_low = 450
- cooldown_high = 900
- uses = -1
- icon_state = "spider"
- mind_control_uses = 2
- mind_control_duration = 2400
-
-/obj/item/organ/heart/gland/spiderman/activate()
- to_chat(owner, span_warning("I feel something crawling in your skin."))
- owner.faction |= "spiders"
- var/obj/structure/spider/spiderling/S = new(owner.drop_location())
- S.directive = "Protect your nest inside [owner.real_name]."
diff --git a/code/modules/antagonists/abductor/equipment/glands/transform.dm b/code/modules/antagonists/abductor/equipment/glands/transform.dm
deleted file mode 100644
index 544c9f0f5b5..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/transform.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/obj/item/organ/heart/gland/transform
- true_name = "anthropmorphic transmorphosizer"
- cooldown_low = 900
- cooldown_high = 1800
- uses = -1
- human_only = TRUE
- icon_state = "species"
- mind_control_uses = 7
- mind_control_duration = 300
-
-/obj/item/organ/heart/gland/transform/activate()
- to_chat(owner, span_notice("I feel unlike myself."))
- randomize_human(owner)
- var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly))
- owner.set_species(species)
diff --git a/code/modules/antagonists/abductor/equipment/glands/trauma.dm b/code/modules/antagonists/abductor/equipment/glands/trauma.dm
deleted file mode 100644
index 5a4b38ac895..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/trauma.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/obj/item/organ/heart/gland/trauma
- true_name = "white matter randomiser"
- cooldown_low = 800
- cooldown_high = 1200
- uses = 5
- icon_state = "emp"
- mind_control_uses = 3
- mind_control_duration = 1800
-
-/obj/item/organ/heart/gland/trauma/activate()
- to_chat(owner, span_warning("I feel a spike of pain in your head."))
- if(prob(33))
- owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
- else
- if(prob(20))
- owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
- else
- owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
diff --git a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm
deleted file mode 100644
index ca263e837b9..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-/obj/item/organ/heart/gland/ventcrawling
- true_name = "pliant cartilage enabler"
- cooldown_low = 1800
- cooldown_high = 2400
- uses = 1
- icon_state = "vent"
- mind_control_uses = 4
- mind_control_duration = 1800
-
-/obj/item/organ/heart/gland/ventcrawling/activate()
- to_chat(owner, span_notice("I feel very stretchy."))
- owner.ventcrawler = VENTCRAWLER_ALWAYS
diff --git a/code/modules/antagonists/abductor/equipment/glands/viral.dm b/code/modules/antagonists/abductor/equipment/glands/viral.dm
deleted file mode 100644
index 66fe5ccf9cd..00000000000
--- a/code/modules/antagonists/abductor/equipment/glands/viral.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-/obj/item/organ/heart/gland/viral
- true_name = "contamination incubator"
- cooldown_low = 1800
- cooldown_high = 2400
- uses = 1
- icon_state = "viral"
- mind_control_uses = 1
- mind_control_duration = 1800
-
-/obj/item/organ/heart/gland/viral/activate()
- to_chat(owner, span_warning("I feel sick."))
- var/datum/disease/advance/A = random_virus(pick(2,6),6)
- A.carrier = TRUE
- owner.ForceContractDisease(A, FALSE, TRUE)
-
-/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level)
- if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
- max_symptoms = VIRUS_SYMPTOM_LIMIT
- var/datum/disease/advance/A = new /datum/disease/advance()
- var/list/datum/symptom/possible_symptoms = list()
- for(var/symptom in subtypesof(/datum/symptom))
- var/datum/symptom/S = symptom
- if(initial(S.level) > max_level)
- continue
- if(initial(S.level) <= 0) //unobtainable symptoms
- continue
- possible_symptoms += S
- for(var/i in 1 to max_symptoms)
- var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms)
- if(chosen_symptom)
- var/datum/symptom/S = new chosen_symptom
- A.symptoms += S
- A.Refresh() //just in case someone already made and named the same disease
- return A
diff --git a/code/modules/antagonists/abductor/ice_abductor.dm b/code/modules/antagonists/abductor/ice_abductor.dm
deleted file mode 100644
index d1b829297ca..00000000000
--- a/code/modules/antagonists/abductor/ice_abductor.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-/obj/structure/fluff/iced_abductor ///Unless more non-machine ayy structures made, it will stay in fluff.
- name = "Mysterious Block of Ice"
- desc = ""
- icon = 'icons/effects/freeze.dmi'
- icon_state = "ice_ayy"
- density = TRUE
- deconstructible = FALSE
-
-/obj/structure/fluff/iced_abductor/Destroy()
- var/turf/T = get_turf(src)
- new /obj/effect/mob_spawn/human/abductor(T)
- . = ..()
diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm
deleted file mode 100644
index 5c0878017d2..00000000000
--- a/code/modules/antagonists/abductor/machinery/camera.dm
+++ /dev/null
@@ -1,139 +0,0 @@
-/obj/machinery/computer/camera_advanced/abductor
- name = "Human Observation Console"
- var/team_number = 0
- networks = list("ss13", "abductor")
- var/datum/action/innate/teleport_in/tele_in_action = new
- var/datum/action/innate/teleport_out/tele_out_action = new
- var/datum/action/innate/teleport_self/tele_self_action = new
- var/datum/action/innate/vest_mode_swap/vest_mode_action = new
- var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new
- var/datum/action/innate/set_droppoint/set_droppoint_action = new
- var/obj/machinery/abductor/console/console
- lock_override = TRUE
-
- icon = 'icons/obj/abductor.dmi'
- icon_state = "camera"
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
-
-/obj/machinery/computer/camera_advanced/abductor/CreateEye()
- ..()
- eyeobj.visible_icon = TRUE
- eyeobj.icon = 'icons/mob/cameramob.dmi'
- eyeobj.icon_state = "abductor_camera"
- eyeobj.invisibility = INVISIBILITY_OBSERVER
-
-/obj/machinery/computer/camera_advanced/abductor/GrantActions(mob/living/carbon/user)
- ..()
-
- if(tele_in_action)
- tele_in_action.target = console.pad
- tele_in_action.Grant(user)
- actions += tele_in_action
-
- if(tele_out_action)
- tele_out_action.target = console
- tele_out_action.Grant(user)
- actions += tele_out_action
-
- if(tele_self_action)
- tele_self_action.target = console.pad
- tele_self_action.Grant(user)
- actions += tele_self_action
-
- if(vest_mode_action)
- vest_mode_action.target = console
- vest_mode_action.Grant(user)
- actions += vest_mode_action
-
- if(vest_disguise_action)
- vest_disguise_action.target = console
- vest_disguise_action.Grant(user)
- actions += vest_disguise_action
-
- if(set_droppoint_action)
- set_droppoint_action.target = console
- set_droppoint_action.Grant(user)
- actions += set_droppoint_action
-
-/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H)
- return HAS_TRAIT(H, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)
-
-/datum/action/innate/teleport_in
- name = "Send To"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "beam_down"
-
-/datum/action/innate/teleport_in/Activate()
- if(!target || !iscarbon(owner))
- return
- var/mob/living/carbon/human/C = owner
- var/mob/camera/aiEye/remote/remote_eye = C.remote_control
- var/obj/machinery/abductor/pad/P = target
-
- if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
- P.PadToLoc(remote_eye.loc)
-
-/datum/action/innate/teleport_out
- name = "Retrieve"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "beam_up"
-
-/datum/action/innate/teleport_out/Activate()
- if(!target || !iscarbon(owner))
- return
- var/obj/machinery/abductor/console/console = target
-
- console.TeleporterRetrieve()
-
-/datum/action/innate/teleport_self
- name = "Send Self"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "beam_down"
-
-/datum/action/innate/teleport_self/Activate()
- if(!target || !iscarbon(owner))
- return
- var/mob/living/carbon/human/C = owner
- var/mob/camera/aiEye/remote/remote_eye = C.remote_control
- var/obj/machinery/abductor/pad/P = target
-
- if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
- P.MobToLoc(remote_eye.loc,C)
-
-/datum/action/innate/vest_mode_swap
- name = "Switch Vest Mode"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "vest_mode"
-
-/datum/action/innate/vest_mode_swap/Activate()
- if(!target || !iscarbon(owner))
- return
- var/obj/machinery/abductor/console/console = target
- console.FlipVest()
-
-
-/datum/action/innate/vest_disguise_swap
- name = "Switch Vest Disguise"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "vest_disguise"
-
-/datum/action/innate/vest_disguise_swap/Activate()
- if(!target || !iscarbon(owner))
- return
- var/obj/machinery/abductor/console/console = target
- console.SelectDisguise(remote=1)
-
-/datum/action/innate/set_droppoint
- name = "Set Experiment Release Point"
- icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "set_drop"
-
-/datum/action/innate/set_droppoint/Activate()
- if(!target || !iscarbon(owner))
- return
-
- var/mob/living/carbon/human/C = owner
- var/mob/camera/aiEye/remote/remote_eye = C.remote_control
-
- var/obj/machinery/abductor/console/console = target
- console.SetDroppoint(remote_eye.loc,owner)
diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm
deleted file mode 100644
index 09b4c2adb70..00000000000
--- a/code/modules/antagonists/abductor/machinery/console.dm
+++ /dev/null
@@ -1,248 +0,0 @@
-/proc/get_abductor_console(team_number)
- for(var/obj/machinery/abductor/console/C in GLOB.machines)
- if(C.team_number == team_number)
- return C
-
-//Common
-
-/obj/machinery/abductor
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- var/team_number = 0
-
-//Console
-
-/obj/machinery/abductor/console
- name = "abductor console"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- icon_state = "console"
- density = TRUE
- var/obj/item/abductor/gizmo/gizmo
- var/obj/item/clothing/suit/armor/abductor/vest/vest
- var/obj/machinery/abductor/experiment/experiment
- var/obj/machinery/abductor/pad/pad
- var/obj/machinery/computer/camera_advanced/abductor/camera
- var/list/datum/icon_snapshot/disguises = list()
-
-/obj/machinery/abductor/console/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- if(!HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) && !HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING))
- to_chat(user, span_warning("I start mashing alien buttons at random!"))
- if(do_after(user,100, target = src))
- TeleporterSend()
- return
- user.set_machine(src)
- var/dat = ""
- dat += " Abductsoft 3000
"
-
- if(experiment)
- var/points = experiment.points
- var/credits = experiment.credits
- dat += "Collected Samples : [points]
"
- dat += "Gear Credits: [credits]
"
- dat += "Transfer data in exchange for supplies:
"
- dat += "Advanced Baton (2 Credits)
"
- dat += "Mental Interface Device (2 Credits)
"
- dat += "Reagent Synthesizer (2 Credits)
"
- dat += "Shrink Ray Blaster (2 Credits)
"
- dat += "Agent Helmet
"
- dat += "Agent Vest
"
- dat += "Radio Silencer
"
- dat += "Science Tool
"
- dat += "Superlingual Matrix
"
- else
- dat += "NO EXPERIMENT MACHINE DETECTED
"
-
- if(pad)
- dat += span_bad("Emergency Teleporter System.")
- dat += span_bad("Consider using primary observation console first.")
- dat += "Activate Teleporter
"
- if(gizmo && gizmo.marked)
- dat += "Retrieve Mark
"
- else
- dat += "Retrieve Mark
"
- else
- dat += "NO TELEPAD DETECTED"
-
- if(vest)
- dat += " Agent Vest Mode
"
- var/mode = vest.mode
- if(mode == VEST_STEALTH)
- dat += "Combat"
- dat += span_linkoff("Stealth")
- else
- dat += span_linkoff("Combat")
- dat += "Stealth"
-
- dat+="
"
- dat += "Select Agent Vest Disguise
"
- dat += "[HAS_TRAIT_FROM(vest, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "Unlock" : "Lock"] Vest
"
- else
- dat += span_bad("NO AGENT VEST DETECTED")
- var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
- popup.set_content(dat)
- popup.open()
-
-/obj/machinery/abductor/console/Topic(href, href_list)
- if(..())
- return
-
- usr.set_machine(src)
- if(href_list["teleporter_send"])
- TeleporterSend()
- else if(href_list["teleporter_retrieve"])
- TeleporterRetrieve()
- else if(href_list["flip_vest"])
- FlipVest()
- else if(href_list["toggle_vest"])
- if(vest)
- vest.toggle_nodrop()
- else if(href_list["select_disguise"])
- SelectDisguise()
- else if(href_list["dispense"])
- switch(href_list["dispense"])
- if("baton")
- Dispense(/obj/item/abductor/baton,cost=2)
- if("helmet")
- Dispense(/obj/item/clothing/head/helmet/abductor)
- if("silencer")
- Dispense(/obj/item/abductor/silencer)
- if("tool")
- Dispense(/obj/item/abductor/gizmo)
- if("vest")
- Dispense(/obj/item/clothing/suit/armor/abductor/vest)
- if("mind_device")
- Dispense(/obj/item/abductor/mind_device,cost=2)
- if("chem_dispenser")
- Dispense(/obj/item/abductor_machine_beacon/chem_dispenser,cost=2)
- if("tongue")
- Dispense(/obj/item/organ/tongue/abductor)
- if("shrink_ray")
- Dispense(/obj/item/gun/energy/shrink_ray,cost=2)
- updateUsrDialog()
-
-/obj/machinery/abductor/console/proc/TeleporterRetrieve()
- if(pad && gizmo && gizmo.marked)
- pad.Retrieve(gizmo.marked)
-
-/obj/machinery/abductor/console/proc/TeleporterSend()
-// if(pad)
-// pad.Send()
-
-/obj/machinery/abductor/console/proc/FlipVest()
- if(vest)
- vest.flip_mode()
-
-/obj/machinery/abductor/console/proc/SelectDisguise(remote = FALSE)
- var/list/disguises2 = list()
- for(var/name in disguises)
- var/datum/icon_snapshot/snap = disguises[name]
- var/image/dummy = image(snap.icon, src, snap.icon_state)
- dummy.overlays = snap.overlays
- disguises2[name] = dummy
-
- var/entry_name
- if(remote)
- entry_name = show_radial_menu(usr, camera.eyeobj, disguises2, tooltips = TRUE)
- else
- entry_name = show_radial_menu(usr, src, disguises2, require_near = TRUE, tooltips = TRUE)
-
- var/datum/icon_snapshot/chosen = disguises[entry_name]
- if(chosen && vest && (remote || in_range(usr,src)))
- vest.SetDisguise(chosen)
-
-/obj/machinery/abductor/console/proc/SetDroppoint(turf/open/location,user)
- if(!istype(location))
- to_chat(user, span_warning("That place is not safe for the specimen."))
- return
-
- if(pad)
- pad.teleport_target = location
- to_chat(user, span_notice("Location marked as test subject release point."))
-
-
-/obj/machinery/abductor/console/Initialize(mapload)
- ..()
- return INITIALIZE_HINT_LATELOAD
-
-/obj/machinery/abductor/console/LateInitialize()
- if(!team_number)
- return
-
- for(var/obj/machinery/abductor/pad/p in GLOB.machines)
- if(p.team_number == team_number)
- pad = p
- break
-
- for(var/obj/machinery/abductor/experiment/e in GLOB.machines)
- if(e.team_number == team_number)
- experiment = e
- e.console = src
-
- for(var/obj/machinery/computer/camera_advanced/abductor/c in GLOB.machines)
- if(c.team_number == team_number)
- camera = c
- c.console = src
-
-/obj/machinery/abductor/console/proc/AddSnapshot(mob/living/carbon/human/target)
- if(target.anti_magic_check(FALSE, FALSE, TRUE, 0))
- say("Subject wearing specialized protective tinfoil gear, unable to get a proper scan!")
- return
- var/datum/icon_snapshot/entry = new
- entry.name = target.name
- entry.icon = target.icon
- entry.icon_state = target.icon_state
- entry.overlays = target.get_overlays_copy(list(HANDS_LAYER)) //ugh
- //Update old disguise instead of adding new one
- if(disguises[entry.name])
- disguises[entry.name] = entry
- return
- disguises[entry.name] = entry
-
-/obj/machinery/abductor/console/proc/AddGizmo(obj/item/abductor/gizmo/G)
- if(G == gizmo && G.console == src)
- return FALSE
-
- if(G.console)
- G.console.gizmo = null
-
- gizmo = G
- G.console = src
- return TRUE
-
-/obj/machinery/abductor/console/proc/AddVest(obj/item/clothing/suit/armor/abductor/vest/V)
- if(vest == V)
- return FALSE
-
- for(var/obj/machinery/abductor/console/C in GLOB.machines)
- if(C.vest == V)
- C.vest = null
- break
-
- vest = V
- return TRUE
-
-/obj/machinery/abductor/console/attackby(obj/O, mob/user, params)
- if(istype(O, /obj/item/abductor/gizmo) && AddGizmo(O))
- to_chat(user, span_notice("I link the tool to the console."))
- else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O))
- to_chat(user, span_notice("I link the vest to the console."))
- else
- return ..()
-
-
-
-/obj/machinery/abductor/console/proc/Dispense(item,cost=1)
- if(experiment && experiment.credits >= cost)
- experiment.credits -=cost
- say("Incoming supply!")
- var/drop_location = loc
- if(pad)
- flick("alien-pad", pad)
- drop_location = pad.loc
- new item(drop_location)
-
- else
- say("Insufficent data!")
diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm
deleted file mode 100644
index 01633d64e72..00000000000
--- a/code/modules/antagonists/abductor/machinery/dispenser.dm
+++ /dev/null
@@ -1,84 +0,0 @@
-/obj/machinery/abductor/gland_dispenser
- name = "replacement organ storage"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- icon_state = "dispenser"
- density = TRUE
- var/list/gland_types
- var/list/gland_colors
- var/list/amounts
-
-/obj/machinery/abductor/gland_dispenser/proc/random_color()
- //TODO : replace with presets or spectrum
- return rgb(rand(0,255),rand(0,255),rand(0,255))
-
-/obj/machinery/abductor/gland_dispenser/Initialize()
- . = ..()
- gland_types = subtypesof(/obj/item/organ/heart/gland)
- gland_types = shuffle(gland_types)
- gland_colors = new/list(gland_types.len)
- amounts = new/list(gland_types.len)
- for(var/i=1,i<=gland_types.len,i++)
- gland_colors[i] = random_color()
- amounts[i] = rand(1,5)
-
-/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- if(!isabductor(user))
- return
- user.set_machine(src)
- var/box_css = {"
- "}
- var/dat = ""
- var/item_count = 0
- for(var/i=1,i<=gland_colors.len,i++)
- item_count++
- var/g_color = gland_colors[i]
- var/amount = amounts[i]
- dat += "[amount]"
- if(item_count == 4) // Four boxes per line
- dat +=""
- item_count = 0
- var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200)
- popup.add_head_content(box_css)
- popup.set_content(dat)
- popup.open()
- return
-
-/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/organ/heart/gland))
- if(!user.transferItemToLoc(W, src))
- return
- for(var/i=1,i<=gland_colors.len,i++)
- if(gland_types[i] == W.type)
- amounts[i]++
- else
- return ..()
-
-/obj/machinery/abductor/gland_dispenser/Topic(href, href_list)
- if(..())
- return
- usr.set_machine(src)
-
- if(href_list["dispense"])
- Dispense(text2num(href_list["dispense"]))
- updateUsrDialog()
-
-/obj/machinery/abductor/gland_dispenser/proc/Dispense(count)
- if(amounts[count]>0)
- amounts[count]--
- var/T = gland_types[count]
- new T(get_turf(src))
diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm
deleted file mode 100644
index dd82b6d3a5d..00000000000
--- a/code/modules/antagonists/abductor/machinery/experiment.dm
+++ /dev/null
@@ -1,218 +0,0 @@
-/obj/machinery/abductor/experiment
- name = "experimentation machine"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- icon_state = "experiment-open"
- density = FALSE
- state_open = TRUE
- var/points = 0
- var/credits = 0
- var/list/history
- var/list/abductee_minds
- var/flash = " - || - "
- var/obj/machinery/abductor/console/console
- var/message_cooldown = 0
- var/breakout_time = 450
-
-/obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user)
- var/mob/living/L = user
- if(user.stat || (isliving(user) && (!(L.mobility_flags & MOBILITY_STAND) || !(L.mobility_flags & MOBILITY_UI))) || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target))
- return
- if(isabductor(target))
- return
- close_machine(target)
-
-/obj/machinery/abductor/experiment/attack_hand(mob/user)
- . = ..()
- if(.)
- return
-
- experimentUI(user)
-
-/obj/machinery/abductor/experiment/open_machine()
- if(!state_open && !panel_open)
- ..()
-
-/obj/machinery/abductor/experiment/close_machine(mob/target)
- for(var/A in loc)
- if(isabductor(A))
- return
- if(state_open && !panel_open)
- ..(target)
-
-/obj/machinery/abductor/experiment/relaymove(mob/user)
- if(user.stat != CONSCIOUS)
- return
- if(message_cooldown <= world.time)
- message_cooldown = world.time + 50
- to_chat(user, span_warning("[src]'s door won't budge!"))
-
-/obj/machinery/abductor/experiment/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
- user.visible_message(span_notice("I see [user] kicking against the door of [src]!"), \
- span_notice("I lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \
- span_hear("I hear a metallic creaking from [src]."))
- if(do_after(user,(breakout_time), target = src))
- if(!user || user.stat != CONSCIOUS || user.loc != src || state_open)
- return
- user.visible_message(span_warning("[user] successfully broke out of [src]!"), \
- span_notice("I successfully break out of [src]!"))
- open_machine()
-
-/obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H)
- var/icon/photo = null
- var/g = (H.gender == FEMALE) ? "f" : "m"
- if(H.dna.species.use_skintones)
- photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]")
- else
- photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]")
- photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY)
-
- var/icon/eyes
- if(EYECOLOR in H.dna.species.species_traits)
- eyes = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes")
- eyes.Blend("#[H.eye_color]", ICON_MULTIPLY)
-
- if(eyes)
- photo.Blend(eyes, ICON_OVERLAY)
-
- var/icon/splat = icon("icon" = 'icons/mob/dam_mob.dmi',"icon_state" = "chest30")
- photo.Blend(splat,ICON_OVERLAY)
-
- return photo
-
-/obj/machinery/abductor/experiment/proc/experimentUI(mob/user)
- var/dat
- dat += " Experiment
"
- if(occupant)
- var/obj/item/photo/P = new
- P.picture = new
- P.picture.picture_image = icon(dissection_icon(occupant), dir = SOUTH)
- user << browse_rsc(P.picture.picture_image, "dissection_img")
- dat += ""
- dat += " " //Avert your eyes
- dat += " | "
- dat += "Probe "
- dat += "Dissect "
- dat += "Analyze "
- dat += " |
"
- else
- dat += span_linkoff("Experiment ")
-
- if(!occupant)
- dat += "Machine Unoccupied
"
- else
- dat += "Subject Status :
"
- dat += "[occupant.name] => "
- var/mob/living/mob_occupant = occupant
- switch(mob_occupant.stat)
- if(CONSCIOUS)
- dat += span_good("Conscious")
- if(UNCONSCIOUS)
- dat += span_average("Unconscious")
- else // DEAD
- dat += span_bad("Deceased")
- dat += "
"
- dat += "[flash]"
- dat += "
"
- dat += "Scan"
- dat += "Close" : "open=1'>Open"]"
- var/datum/browser/popup = new(user, "experiment", "Probing Console", 300, 300)
- popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
- popup.set_content(dat)
- popup.open()
-
-/obj/machinery/abductor/experiment/Topic(href, href_list)
- if(..() || usr == occupant)
- return
- usr.set_machine(src)
- if(href_list["refresh"])
- updateUsrDialog()
- return
- if(href_list["open"])
- open_machine()
- return
- if(href_list["close"])
- close_machine()
- return
- if(occupant)
- var/mob/living/mob_occupant = occupant
- if(mob_occupant.stat != DEAD)
- if(href_list["experiment"])
- flash = Experiment(occupant,href_list["experiment"],usr)
- updateUsrDialog()
- add_fingerprint(usr)
-
-/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type,mob/user)
- LAZYINITLIST(history)
- var/mob/living/carbon/human/H = occupant
-
- var/datum/antagonist/abductor/user_abductor = user.mind.has_antag_datum(/datum/antagonist/abductor)
- if(!user_abductor)
- return span_bad("Authorization failure. Contact mothership immidiately.")
-
- var/point_reward = 0
- if(H in history)
- return span_bad("Specimen already in database.")
- if(H.stat == DEAD)
- say("Specimen deceased - please provide fresh sample.")
- return span_bad("Specimen deceased.")
- var/obj/item/organ/heart/gland/GlandTest = locate() in H.internal_organs
- if(!GlandTest)
- say("Experimental dissection not detected!")
- return span_bad("No glands detected!")
- if(H.mind != null && H.ckey != null)
- LAZYINITLIST(abductee_minds)
- LAZYADD(history, H)
- LAZYADD(abductee_minds, H.mind)
- say("Processing specimen...")
- sleep(5)
- switch(text2num(type))
- if(1)
- to_chat(H, span_warning("I feel violated."))
- if(2)
- to_chat(H, span_warning("I feel myself being sliced apart and put back together."))
- if(3)
- to_chat(H, span_warning("I feel intensely watched."))
- sleep(5)
- user_abductor.team.abductees += H.mind
- H.mind.add_antag_datum(/datum/antagonist/abductee)
-
- for(var/obj/item/organ/heart/gland/G in H.internal_organs)
- G.Start()
- point_reward++
- if(point_reward > 0)
- open_machine()
- SendBack(H)
- playsound(src.loc, 'sound/blank.ogg', 50, TRUE)
- points += point_reward
- credits += point_reward
- return span_good("Experiment successful! [point_reward] new data-points collected.")
- else
- playsound(src.loc, 'sound/blank.ogg', 50, TRUE)
- return span_bad("Experiment failed! No replacement organ detected.")
- else
- say("Brain activity nonexistent - disposing sample...")
- open_machine()
- SendBack(H)
- return span_bad("Specimen braindead - disposed.")
- return span_bad("ERROR")
-
-
-/obj/machinery/abductor/experiment/proc/SendBack(mob/living/carbon/human/H)
- H.Sleeping(160)
- H.uncuff()
- if(console && console.pad && console.pad.teleport_target)
- H.forceMove(console.pad.teleport_target)
- return
- //Area not chosen / It's not safe area - teleport to arrivals
- SSjob.SendToLateJoin(H, FALSE)
- return
-
-
-/obj/machinery/abductor/experiment/update_icon()
- if(state_open)
- icon_state = "experiment-open"
- else
- icon_state = "experiment"
diff --git a/code/modules/antagonists/abductor/machinery/pad.dm b/code/modules/antagonists/abductor/machinery/pad.dm
deleted file mode 100644
index 20c838b6f41..00000000000
--- a/code/modules/antagonists/abductor/machinery/pad.dm
+++ /dev/null
@@ -1,56 +0,0 @@
-/obj/machinery/abductor/pad
- name = "Alien Telepad"
- desc = ""
- icon = 'icons/obj/abductor.dmi'
- icon_state = "alien-pad-idle"
- var/turf/teleport_target
-
-/obj/machinery/abductor/pad/proc/Warp(mob/living/target)
- if(!target.buckled)
- target.forceMove(get_turf(src))
-
-/obj/machinery/abductor/pad/proc/Send()
- if(teleport_target == null)
- teleport_target = GLOB.teleportlocs[pick(GLOB.teleportlocs)]
- flick("alien-pad", src)
- for(var/mob/living/target in loc)
- target.forceMove(teleport_target)
- new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
- to_chat(target, span_warning("The instability of the warp leaves you disoriented!"))
- target.Stun(60)
-
-/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target)
- flick("alien-pad", src)
- new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
- Warp(target)
-
-/obj/machinery/abductor/pad/proc/doMobToLoc(place, atom/movable/target)
- flick("alien-pad", src)
- target.forceMove(place)
- new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
-
-/obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target)
- new /obj/effect/temp_visual/teleport_abductor(place)
- addtimer(CALLBACK(src, PROC_REF(doMobToLoc), place, target), 80)
-
-/obj/machinery/abductor/pad/proc/doPadToLoc(place)
- flick("alien-pad", src)
- for(var/mob/living/target in get_turf(src))
- target.forceMove(place)
- new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
-
-/obj/machinery/abductor/pad/proc/PadToLoc(place)
- new /obj/effect/temp_visual/teleport_abductor(place)
- addtimer(CALLBACK(src, PROC_REF(doPadToLoc), place), 80)
-
-/obj/effect/temp_visual/teleport_abductor
- name = "Huh"
- icon = 'icons/obj/abductor.dmi'
- icon_state = "teleport"
- duration = 80
-
-/obj/effect/temp_visual/teleport_abductor/Initialize()
- . = ..()
- var/datum/effect_system/spark_spread/S = new
- S.set_up(10,0,loc)
- S.start()
diff --git a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm
index b767897907b..8480ef237da 100644
--- a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm
+++ b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm
@@ -21,7 +21,7 @@
return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob
/datum/blobstrain/reagent/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag)
- if(damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser")
+ if((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser")
empulse(B.loc, 1, 3) //less than screen range, so you can stand out of range to avoid it
/datum/reagent/blob/electromagnetic_web
diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm
index 2550bf19679..07c4406ab9e 100644
--- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm
+++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm
@@ -10,7 +10,7 @@
reagent = /datum/reagent/blob/energized_jelly
/datum/blobstrain/reagent/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
- if((damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10))
+ if(((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10))
do_sparks(rand(2, 4), FALSE, B)
return ..()
diff --git a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm
index 82210a75235..2ac444bd453 100644
--- a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm
+++ b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm
@@ -13,12 +13,12 @@
reagent = /datum/reagent/blob/pressurized_slime
/datum/blobstrain/reagent/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
- if((damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN)
+ if(((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN)
extinguisharea(B, damage)
return ..()
/datum/blobstrain/reagent/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag)
- if(damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser")
+ if((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser")
B.visible_message(span_boldwarning("The blob ruptures, spraying the area with liquid!"))
extinguisharea(B, 50)
diff --git a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm
index df3ed9413cc..71dc559ccaa 100644
--- a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm
+++ b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm
@@ -15,7 +15,7 @@
B.forceMove(T)
/datum/blobstrain/reagent/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
- if((damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
+ if(((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
var/list/blobstopick = list()
for(var/obj/structure/blob/OB in orange(1, B))
if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blobstrain.type == B.overmind.blobstrain.type)
diff --git a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm
index b7942ea93f6..a24c712d1d3 100644
--- a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm
+++ b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm
@@ -12,7 +12,7 @@
reagent = /datum/reagent/blob/synchronous_mesh
/datum/blobstrain/reagent/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
- if(damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage
+ if((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage
var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //if it doesn't have the same chemical or is a core or node, don't split damage to it
diff --git a/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm b/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm
index 27b74533d9e..0b29762d3b4 100644
--- a/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm
+++ b/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm
@@ -12,7 +12,7 @@
reagent = /datum/reagent/blob/zombifying_pods
/datum/blobstrain/reagent/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
- if((damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
+ if(((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
B.visible_message(span_warning("A spore floats free of the blob!"))
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
BS.overmind = B.overmind
diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm
index 7822a28117b..cf3d618dcc1 100644
--- a/code/modules/antagonists/blob/overmind.dm
+++ b/code/modules/antagonists/blob/overmind.dm
@@ -127,7 +127,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
if(!T || !is_station_level(T.z))
continue
- if(L in GLOB.overminds || (L.pass_flags & PASSBLOB))
+ if((L in GLOB.overminds) || (L.pass_flags & PASSBLOB))
continue
var/area/Ablob = get_area(T)
diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm
index c2c8196322d..a7b32cec736 100644
--- a/code/modules/antagonists/blob/structures/_blob.dm
+++ b/code/modules/antagonists/blob/structures/_blob.dm
@@ -299,7 +299,6 @@
/obj/structure/blob/proc/change_to(type, controller)
if(!ispath(type))
CRASH("change_to(): invalid type for blob")
- return
var/obj/structure/blob/B = new type(src.loc, controller)
B.creation_action()
B.update_icon()
diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm
deleted file mode 100644
index 43b2ce43a11..00000000000
--- a/code/modules/antagonists/changeling/powers/headcrab.dm
+++ /dev/null
@@ -1,43 +0,0 @@
-/datum/action/changeling/headcrab
- name = "Last Resort"
- desc = ""
- helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us."
- button_icon_state = "last_resort"
- chemical_cost = 20
- dna_cost = 1
- req_human = 1
-
-/datum/action/changeling/headcrab/sting_action(mob/user)
- set waitfor = FALSE
- if(alert("Are we sure we wish to kill ourself and create a headslug?",,"Yes", "No") == "No")
- return
- ..()
- var/datum/mind/M = user.mind
- var/list/organs = user.getorganszone(BODY_ZONE_HEAD, TRUE)
-
- for(var/obj/item/organ/I in organs)
- I.Remove(user, 1)
-
- explosion(get_turf(user), 0, 0, 2, 0, TRUE)
- for(var/mob/living/carbon/human/H in range(2,user))
- var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
- to_chat(H, span_danger("I are blinded by a shower of blood!"))
- H.Stun(20)
- H.blur_eyes(20)
- eyes?.applyOrganDamage(5)
- H.confused += 3
- for(var/mob/living/silicon/S in range(2,user))
- to_chat(S, span_danger("My sensors are disabled by a shower of blood!"))
- S.Paralyze(60)
- var/turf = get_turf(user)
- user.gib()
- . = TRUE
- sleep(5) // So it's not killed in explosion
- var/mob/living/simple_animal/hostile/headcrab/crab = new(turf)
- for(var/obj/item/organ/I in organs)
- I.forceMove(crab)
- crab.origin = M
- if(crab.origin)
- crab.origin.active = 1
- crab.origin.transfer_to(crab)
- to_chat(crab, span_warning("I burst out of the remains of my former body in a shower of gore!"))
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index aeaf3343793..e43f2af72a1 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -182,10 +182,6 @@
var/obj/structure/table/T = target
T.deconstruct(FALSE)
- else if(istype(target, /obj/machinery/computer))
- var/obj/machinery/computer/C = target
- C.attack_alien(user) //muh copypasta
-
else if(istype(target, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = target
diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm
index a3a14a36b7e..d5aaf6dc01e 100644
--- a/code/modules/antagonists/changeling/powers/panacea.dm
+++ b/code/modules/antagonists/changeling/powers/panacea.dm
@@ -12,7 +12,6 @@
to_chat(user, span_notice("We cleanse impurities from our form."))
..()
var/list/bad_organs = list(
- user.getorgan(/obj/item/organ/body_egg),
user.getorgan(/obj/item/organ/zombie_infection))
for(var/o in bad_organs)
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 032196e425e..4e0c6067cec 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -537,7 +537,6 @@
/obj/item/restraints/handcuffs/energy/cult //For the shackling spell
name = "shadow shackles"
desc = ""
- trashtype = /obj/item/restraints/handcuffs/energy/used
item_flags = DROPDEL
/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user)
diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm
index e4d953f563d..096a4813e13 100644
--- a/code/modules/antagonists/cult/cult_comms.dm
+++ b/code/modules/antagonists/cult/cult_comms.dm
@@ -342,7 +342,7 @@
to_chat(owner, span_cultbold("The cult has already designated a target!"))
return
if(cooldown>world.time)
- to_chat(owner, span_cultbold("I aren't ready to place another blood mark yet!"))
+ to_chat(owner, span_cultbold("I'm not ready to place another blood mark yet!"))
return
target = owner.orbiting?.parent || get_turf(owner)
if(!target)
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 8681afc3b62..b5be1727f26 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -71,7 +71,7 @@ Runes can either be invoked by one's self or with many different cultists. Each
if(.)
return
if(!iscultist(user))
- to_chat(user, span_warning("I aren't able to understand the words of [src]."))
+ to_chat(user, span_warning("I'm not able to understand the words of [src]."))
return
var/list/invokers = can_invoke(user)
if(invokers.len >= req_cultists)
@@ -1008,17 +1008,9 @@ structure_check() searches for nearby cultist structures required for the invoca
if(11 to 20)
var/datum/round_event_control/radiation_storm/RS = new()
RS.runEvent()
- if(21 to 30)
+ if(21 to 50)
var/datum/round_event_control/brand_intelligence/BI = new()
BI.runEvent()
- if(31 to 40)
- var/datum/round_event_control/immovable_rod/R = new()
- R.runEvent()
- R.runEvent()
- R.runEvent()
- if(41 to 50)
- var/datum/round_event_control/meteor_wave/MW = new()
- MW.runEvent()
if(51 to 60)
var/datum/round_event_control/spider_infestation/SI = new()
SI.runEvent()
diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm
deleted file mode 100644
index 370db73c2f1..00000000000
--- a/code/modules/antagonists/disease/disease_event.dm
+++ /dev/null
@@ -1,26 +0,0 @@
-
-/datum/round_event_control/sentient_disease
- name = "Spawn Sentient Disease"
- typepath = /datum/round_event/ghost_role/sentient_disease
- weight = 7
- max_occurrences = 1
- min_players = 5
-
-
-/datum/round_event/ghost_role/sentient_disease
- role_name = "sentient disease"
-
-/datum/round_event/ghost_role/sentient_disease/spawn_role()
- var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
- if(!candidates.len)
- return NOT_ENOUGH_PLAYERS
-
- var/mob/dead/observer/selected = pick_n_take(candidates)
-
- var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center())
- virus.key = selected.key
- INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name))
- message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by an event.")
- log_game("[key_name(virus)] was spawned as a sentient disease by an event.")
- spawned_mobs += virus
- return SUCCESSFUL_SPAWN
diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm
deleted file mode 100644
index 4c186916131..00000000000
--- a/code/modules/antagonists/morph/morph.dm
+++ /dev/null
@@ -1,245 +0,0 @@
-#define MORPH_COOLDOWN 50
-
-/mob/living/simple_animal/hostile/morph
- name = "morph"
- real_name = "morph"
- desc = ""
- speak_emote = list("gurgles")
- emote_hear = list("gurgles")
- icon = 'icons/mob/animal.dmi'
- icon_state = "morph"
- icon_living = "morph"
- icon_dead = "morph_dead"
- speed = 2
- a_intent = INTENT_HARM
- stop_automated_movement = 1
- status_flags = CANPUSH
- pass_flags = PASSTABLE
- ventcrawler = VENTCRAWLER_ALWAYS
- 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 = 0
- maxHealth = 150
- health = 150
- healable = 0
- obj_damage = 50
- melee_damage_lower = 20
- melee_damage_upper = 20
- see_in_dark = 8
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- vision_range = 1 // Only attack when target is close
- wander = FALSE
- attack_verb_continuous = "glomps"
- attack_verb_simple = "glomp"
- attack_sound = 'sound/blank.ogg'
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2)
-
- var/morphed = FALSE
- var/melee_damage_disguised = 0
- var/eat_while_disguised = FALSE
- var/atom/movable/form = null
- var/morph_time = 0
- var/static/list/blacklist_typecache = typecacheof(list(
- /atom/movable/screen,
- /obj/singularity,
- /mob/living/simple_animal/hostile/morph,
- /obj/effect))
-
- var/playstyle_string = "I are a morph, an abomination of science created primarily with changeling cells. \
- You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \
- observers, and can only be performed once every five seconds. While morphed, you move faster, but do \
- less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \
- You can attack any item or dead creature to consume it - creatures will restore my health. \
- Finally, you can restore myself to my original form while morphed by shift-clicking myself."
-
-/mob/living/simple_animal/hostile/morph/examine(mob/user)
- if(morphed)
- . = form.examine(user)
- if(get_dist(user,src)<=3)
- . += span_warning("It doesn't look quite right...")
- else
- . = ..()
-
-/mob/living/simple_animal/hostile/morph/med_hud_set_health()
- if(morphed && !isliving(form))
- var/image/holder = hud_list[HEALTH_HUD]
- holder.icon_state = null
- return //we hide medical hud while morphed
- ..()
-
-/mob/living/simple_animal/hostile/morph/med_hud_set_status()
- if(morphed && !isliving(form))
- var/image/holder = hud_list[STATUS_HUD]
- holder.icon_state = null
- return //we hide medical hud while morphed
- ..()
-
-/mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) // make it into property/proc ? not sure if worth it
- return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A))
-
-/mob/living/simple_animal/hostile/morph/proc/eat(atom/movable/A)
- if(morphed && !eat_while_disguised)
- to_chat(src, span_warning("I can not eat anything while you are disguised!"))
- return FALSE
- if(A && A.loc != src)
- visible_message(span_warning("[src] swallows [A] whole!"))
- A.forceMove(src)
- return TRUE
- return FALSE
-
-/mob/living/simple_animal/hostile/morph/ShiftClickOn(atom/movable/A)
- if(morph_time <= world.time && !stat)
- if(A == src)
- restore()
- return
- if(istype(A) && allowed(A))
- assume(A)
- else
- to_chat(src, span_warning("My chameleon skin is still repairing itself!"))
- ..()
-
-/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target)
- if(morphed)
- to_chat(src, span_warning("I must restore to my original form first!"))
- return
- morphed = TRUE
- form = target
-
- visible_message(span_warning("[src] suddenly twists and changes shape, becoming a copy of [target]!"), \
- span_notice("I twist my body and assume the form of [target]."))
- appearance = target.appearance
- copy_overlays(target)
- alpha = max(alpha, 150) //fucking chameleons
- transform = initial(transform)
- pixel_y = initial(pixel_y)
- pixel_x = initial(pixel_x)
-
- //Morphed is weaker
- melee_damage_lower = melee_damage_disguised
- melee_damage_upper = melee_damage_disguised
- set_varspeed(0)
-
- morph_time = world.time + MORPH_COOLDOWN
- med_hud_set_health()
- med_hud_set_status() //we're an object honest
- return
-
-/mob/living/simple_animal/hostile/morph/proc/restore()
- if(!morphed)
- to_chat(src, span_warning("You're already in my normal form!"))
- return
- morphed = FALSE
- form = null
- alpha = initial(alpha)
- color = initial(color)
- animate_movement = SLIDE_STEPS
- maptext = null
-
- visible_message(span_warning("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!"), \
- span_notice("I reform to my normal body."))
- name = initial(name)
- icon = initial(icon)
- icon_state = initial(icon_state)
- cut_overlays()
-
- //Baseline stats
- melee_damage_lower = initial(melee_damage_lower)
- melee_damage_upper = initial(melee_damage_upper)
- set_varspeed(initial(speed))
-
- morph_time = world.time + MORPH_COOLDOWN
- med_hud_set_health()
- med_hud_set_status() //we are not an object
-
-/mob/living/simple_animal/hostile/morph/death(gibbed)
- if(morphed)
- visible_message(span_warning("[src] twists and dissolves into a pile of green flesh!"), \
- span_danger("My skin ruptures! Your flesh breaks apart! No disguise can ward off de--"))
- restore()
- barf_contents()
- ..()
-
-/mob/living/simple_animal/hostile/morph/proc/barf_contents()
- for(var/atom/movable/AM in src)
- AM.forceMove(loc)
- if(prob(90))
- step(AM, pick(GLOB.alldirs))
-
-/mob/living/simple_animal/hostile/morph/wabbajack_act(mob/living/new_mob)
- barf_contents()
- . = ..()
-
-/mob/living/simple_animal/hostile/morph/Aggro() // automated only
- ..()
- restore()
-
-/mob/living/simple_animal/hostile/morph/LoseAggro()
- vision_range = initial(vision_range)
-
-/mob/living/simple_animal/hostile/morph/AIShouldSleep(list/possible_targets)
- . = ..()
- if(.)
- var/list/things = list()
- for(var/atom/movable/A in view(src))
- if(allowed(A))
- things += A
- var/atom/movable/T = pick(things)
- assume(T)
-
-/mob/living/simple_animal/hostile/morph/can_track(mob/living/user)
- if(morphed)
- return FALSE
- return ..()
-
-/mob/living/simple_animal/hostile/morph/AttackingTarget()
- if(morphed && !melee_damage_disguised)
- to_chat(src, span_warning("I can not attack while disguised!"))
- return
- if(isliving(target)) //Eat Corpses to regen health
- var/mob/living/L = target
- if(L.stat == DEAD)
- if(do_after(src, 30, target = L))
- if(eat(L))
- adjustHealth(-50)
- return
- else if(isitem(target)) //Eat items just to be annoying
- var/obj/item/I = target
- if(!I.anchored)
- if(do_after(src, 20, target = I))
- eat(I)
- return
- return ..()
-
-//Spawn Event
-
-/datum/round_event_control/morph
- name = "Spawn Morph"
- typepath = /datum/round_event/ghost_role/morph
- weight = 0 //Admin only
- max_occurrences = 1
-
-/datum/round_event/ghost_role/morph
- minimum_required = 1
- role_name = "morphling"
-
-/datum/round_event/ghost_role/morph/spawn_role()
- var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
- if(!candidates.len)
- return NOT_ENOUGH_PLAYERS
-
- var/mob/dead/selected = pick_n_take(candidates)
-
- var/datum/mind/player_mind = new /datum/mind(selected.key)
- player_mind.active = 1
- if(!GLOB.xeno_spawn)
- return MAP_ERROR
- var/mob/living/simple_animal/hostile/morph/S = new /mob/living/simple_animal/hostile/morph(pick(GLOB.xeno_spawn))
- player_mind.transfer_to(S)
- player_mind.assigned_role = "Morph"
- player_mind.special_role = "Morph"
- player_mind.add_antag_datum(/datum/antagonist/morph)
- to_chat(S, S.playstyle_string)
- SEND_SOUND(S, sound('sound/blank.ogg'))
- message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a morph by an event.")
- log_game("[key_name(S)] was spawned as a morph by an event.")
- spawned_mobs += S
- return SUCCESSFUL_SPAWN
diff --git a/code/modules/antagonists/roguetown/roleobjs/skeleton.dm b/code/modules/antagonists/roguetown/roleobjs/skeleton.dm
index 6bae2ae0658..e86fb5a4077 100644
--- a/code/modules/antagonists/roguetown/roleobjs/skeleton.dm
+++ b/code/modules/antagonists/roguetown/roleobjs/skeleton.dm
@@ -31,22 +31,3 @@
/datum/antagonist/skeleton/roundend_report()
return
- var/traitorwin = TRUE
-
- if(objectives.len)//If the traitor had no objectives, don't need to process this.
- for(var/datum/objective/objective in objectives)
- objective.update_explanation_text()
- if(!objective.check_completion())
- traitorwin = FALSE
-
- if(traitorwin)
- //arriving gives them a tri anyway, all good
-// owner.adjust_triumphs(1)
- to_chat(owner.current, span_greentext("I've TRIUMPHED! Arcadia belongs to death!"))
- if(owner.current)
- owner.current.playsound_local(get_turf(owner.current), 'sound/misc/triumph.ogg', 100, FALSE, pressure_affected = FALSE)
- else
- to_chat(owner.current, span_redtext("I've FAILED to invade Arcadia!"))
- if(owner.current)
- owner.current.playsound_local(get_turf(owner.current), 'sound/misc/fail.ogg', 100, FALSE, pressure_affected = FALSE)
-
diff --git a/code/modules/antagonists/roguetown/villain/aspirant.dm b/code/modules/antagonists/roguetown/villain/aspirant.dm
index 464d31a88b9..4b09cc7d8ed 100644
--- a/code/modules/antagonists/roguetown/villain/aspirant.dm
+++ b/code/modules/antagonists/roguetown/villain/aspirant.dm
@@ -38,7 +38,7 @@
/datum/antagonist/prebel/can_be_owned(datum/mind/new_owner)
. = ..()
if(.)
- if(!new_owner.assigned_role in GLOB.noble_positions || !new_owner.assigned_role in GLOB.garrison_positions)
+ if(!(new_owner.assigned_role in GLOB.noble_positions) || !(new_owner.assigned_role in GLOB.garrison_positions))
return FALSE
/datum/antagonist/aspirant/on_gain()
diff --git a/code/modules/antagonists/roguetown/villain/bandit.dm b/code/modules/antagonists/roguetown/villain/bandit.dm
index 7bcd734a460..4b5ed9bac11 100644
--- a/code/modules/antagonists/roguetown/villain/bandit.dm
+++ b/code/modules/antagonists/roguetown/villain/bandit.dm
@@ -85,26 +85,3 @@
else
to_chat(world, "[the_name] was a bandit. He stole [amt] triumphs worth of loot.")
return
-
- var/traitorwin = TRUE
-
- var/count = 0
- if(objectives.len)//If the traitor had no objectives, don't need to process this.
- for(var/datum/objective/objective in objectives)
- objective.update_explanation_text()
- if(!objective.check_completion())
- traitorwin = FALSE
- count += objective.triumph_count
-
- if(!count)
- count = 1
-
- if(traitorwin)
- owner.adjust_triumphs(count)
- to_chat(owner.current, span_greentext("I've TRIUMPHED!"))
- if(owner.current)
- owner.current.playsound_local(get_turf(owner.current), 'sound/misc/triumph.ogg', 100, FALSE, pressure_affected = FALSE)
- else
- to_chat(owner.current, span_redtext("I've failed to satisfy my greed."))
- if(owner.current)
- owner.current.playsound_local(get_turf(owner.current), 'sound/misc/fail.ogg', 100, FALSE, pressure_affected = FALSE)
diff --git a/code/modules/antagonists/roguetown/villain/choosename.dm b/code/modules/antagonists/roguetown/villain/choosename.dm
index b4f18e30d7e..c0ec141de12 100644
--- a/code/modules/antagonists/roguetown/villain/choosename.dm
+++ b/code/modules/antagonists/roguetown/villain/choosename.dm
@@ -10,7 +10,7 @@
j.current_positions--
mob_timers["mirrortime"] = world.time
var/begin_time = world.time
- var/new_name = input(src, "What should your [input] name be?", "HEARTHSTONE")
+ var/new_name = input(src, "What should your [input] name be?", "DREAMKEEP")
if(world.time > begin_time + 60 SECONDS)
to_chat(src, "You waited too long.")
return
diff --git a/code/modules/antagonists/roguetown/villain/lich/phylactery.dm b/code/modules/antagonists/roguetown/villain/lich/phylactery.dm
index 820c132bae8..dc2a6a901ba 100644
--- a/code/modules/antagonists/roguetown/villain/lich/phylactery.dm
+++ b/code/modules/antagonists/roguetown/villain/lich/phylactery.dm
@@ -12,7 +12,7 @@
var/datum/antagonist/lich/possessor
/obj/item/phylactery/Initialize()
- ..()
+ . = ..()
filters += filter(type="drop_shadow", x=0, y=0, size=1, offset=2, color=rgb(rand(1,255),rand(1,255),rand(1,255)))
/obj/item/phylactery/proc/be_consumed(timer)
diff --git a/code/modules/antagonists/roguetown/villain/maniac/maniac.dm b/code/modules/antagonists/roguetown/villain/maniac/maniac.dm
index 58b86249316..bbc74420b2c 100644
--- a/code/modules/antagonists/roguetown/villain/maniac/maniac.dm
+++ b/code/modules/antagonists/roguetown/villain/maniac/maniac.dm
@@ -289,7 +289,7 @@ GLOBAL_VAR_INIT(maniac_highlander, 0) // THERE CAN ONLY BE ONE!
qdel(brain)
// Culls any living maniacs in the world apart from the victor.
-/datum/antagonist/maniac/proc/cull_competitors(var/mob/living/carbon/victor)
+/datum/antagonist/maniac/proc/cull_competitors(mob/living/carbon/victor)
for(var/mob/living/carbon/C in GLOB.carbon_list - victor)
var/datum/antagonist/maniac/competitor = C.mind?.has_antag_datum(/datum/antagonist/maniac)
if(competitor)
diff --git a/code/modules/antagonists/roguetown/villain/maniac/maniac_wonders.dm b/code/modules/antagonists/roguetown/villain/maniac/maniac_wonders.dm
index 418e2d44d22..4fd03b7ff9c 100644
--- a/code/modules/antagonists/roguetown/villain/maniac/maniac_wonders.dm
+++ b/code/modules/antagonists/roguetown/villain/maniac/maniac_wonders.dm
@@ -94,7 +94,7 @@
if(wonder_id >= 4)
if(GLOB.maniac_highlander) // Has a Maniac already TRIUMPHED?
to_chat(user, span_danger("IT WAS ALL FOR NAUGHT! I CAN'T WAKE UP!"))
- else
+ else
to_chat(user, span_userdanger("I must SUM the keys. I am WAKING up!"))
dream_master.agony(user)
for(var/mob/living/carbon/C in GLOB.carbon_list - user) // Notify any other maniacs
@@ -112,7 +112,7 @@
user.log_message("crafted [wonder_id_desc] Maniac Wonder [key_text].", LOG_GAME)
message_admins("[wonder_id_desc] Maniac Wonder [key_text] constructed. [ADMIN_JMP(src)]")
START_PROCESSING(SSobj, src)
-
+
/obj/structure/wonder/examine(mob/user)
. = ..()
if(!QDELETED(dream_master))
@@ -153,7 +153,7 @@
mark_victim(victim)
break
-/obj/structure/wonder/proc/mark_victim(var/mob/living/carbon/human/V)
+/obj/structure/wonder/proc/mark_victim(mob/living/carbon/human/V)
var/obj/item/organ/heart/H = V.getorganslot(ORGAN_SLOT_HEART)
if(H && !QDELETED(dream_master))
if(!length(H.maniacs))
diff --git a/code/modules/antagonists/roguetown/villain/vampirelord.dm b/code/modules/antagonists/roguetown/villain/vampirelord.dm
index 080f1e67d37..17a483c8b87 100644
--- a/code/modules/antagonists/roguetown/villain/vampirelord.dm
+++ b/code/modules/antagonists/roguetown/villain/vampirelord.dm
@@ -73,7 +73,7 @@ GLOBAL_LIST_EMPTY(vampire_objects)
ADD_TRAIT(owner.current, TRAIT_VAMPMANSION, "[type]")
ADD_TRAIT(owner.current, TRAIT_TOXIMMUNE, "[type]")
ADD_TRAIT(owner.current, TRAIT_STEELHEARTED, "[type]")
- owner.current.faction = list("undead")
+ owner.current.faction = list("undead")
for(var/obj/structure/fluff/traveltile/vampire/tile in GLOB.traveltiles)
tile.show_travel_tile(owner.current)
owner.current.cmode_music = 'sound/music/combat_vamp.ogg'
@@ -933,7 +933,7 @@ GLOBAL_LIST_EMPTY(vampire_objects)
/datum/objective/vampirelord/infiltrate/one/check_completion()
var/datum/game_mode/chaosmode/C = SSticker.mode
- var/list/churchjobs = list("Prophet", "Priestess", "Priest", "Priest", "Paladin", "Churchling", "Crusader", "Grandmaster", "Witcher")
+ var/list/churchjobs = list("Archpriest", "Archpriestess", "Cleric", "Wytcher Captain", "Paladin", "Churchling", "Crusader", "Grandmaster", "Wytcher")
for(var/datum/mind/V in C.vampires)
if(V.current.job in churchjobs)
return TRUE
@@ -1103,7 +1103,7 @@ GLOBAL_LIST_EMPTY(vampire_objects)
delete_after_roundstart = FALSE
/obj/effect/landmark/start/vampirelord/Initialize()
- ..()
+ . = ..()
GLOB.vlord_starts += loc
/obj/effect/landmark/start/vampirespawn
@@ -1118,7 +1118,7 @@ GLOBAL_LIST_EMPTY(vampire_objects)
delete_after_roundstart = FALSE
/obj/effect/landmark/start/vampirespawn/Initialize()
- ..()
+ . = ..()
GLOB.vspawn_starts += loc
/obj/effect/landmark/vteleport
diff --git a/code/modules/antagonists/roguetown/villain/zizocult.dm b/code/modules/antagonists/roguetown/villain/zizocult.dm
index 223d0c08547..c4860e16198 100644
--- a/code/modules/antagonists/roguetown/villain/zizocult.dm
+++ b/code/modules/antagonists/roguetown/villain/zizocult.dm
@@ -8,8 +8,8 @@ GLOBAL_LIST_EMPTY(ritualslist)
antag_hud_type = ANTAG_HUD_TRAITOR
antag_hud_name = "cultist"
confess_lines = list(
- "DEATH TO THE SUCCESSORS!",
- "PRAISE ZIZO!",
+ "DEATH TO THE SUCCESSORS!",
+ "PRAISE LEVISHTH!",
"THE GODHEAD FAVORS ME!",
)
var/islesser = TRUE
@@ -167,16 +167,16 @@ GLOBAL_LIST_EMPTY(ritualslist)
/mob/living/carbon/human/proc/praise()
set name = "Praise the Godhead!"
- set category = "ZIZO"
- audible_message("[src] praises " + span_bold("Zizo") + "!")
+ set category = "LEVISHTH"
+ audible_message("[src] praises " + span_bold("Levishth") + "!")
playsound(src.loc, 'sound/vo/cult/praise.ogg', 45, 1)
/mob/living/carbon/human/proc/communicate()
set name = "Communicate"
- set category = "ZIZO"
+ set category = "LEVISHTH"
var/datum/game_mode/chaosmode/C = SSticker.mode
- var/speak = input("What do you speak of?", "HEARTHSTONE") as text|null
+ var/speak = input("What do you speak of?", "DREAMKEEP") as text|null
if(!speak)
return
whisper("O schlet'a ty'schkotot ty'skvoro...")
@@ -213,13 +213,13 @@ GLOBAL_LIST_EMPTY(ritualslist)
testing("[G.name]")
GLOB.ritualslist[G.name] = G
-/obj/effect/decal/cleanable/sigil/proc/consume_ingredients(var/datum/ritual/R)
+/obj/effect/decal/cleanable/sigil/proc/consume_ingredients(datum/ritual/R)
for(var/atom/A in get_step(src, NORTH))
if(istype(A, R.n_req) && !ishuman(A))
playsound(src, 'sound/foley/flesh_rem2.ogg', 30)
qdel(A)
-
+
for(var/atom/A in get_step(src, SOUTH))
if(istype(A, R.s_req) && !ishuman(A))
playsound(src, 'sound/foley/flesh_rem2.ogg', 30)
@@ -229,7 +229,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
if(istype(A, R.e_req) && !ishuman(A))
playsound(src, 'sound/foley/flesh_rem2.ogg', 30)
qdel(A)
-
+
for(var/atom/A in get_step(src, WEST))
if(istype(A, R.w_req) && !ishuman(A))
playsound(src, 'sound/foley/flesh_rem2.ogg', 30)
@@ -252,10 +252,10 @@ GLOBAL_LIST_EMPTY(ritualslist)
if(path.circle == sigil_type)
rituals |= path.name
- var/ritualnameinput = input(user, "Rituals", "HEARTHSTONE") as null|anything in rituals
+ var/ritualnameinput = input(user, "Rituals", "DREAMKEEP") as null|anything in rituals
testing("ritualnameinput [ritualnameinput]")
var/datum/ritual/pickritual
-
+
pickritual = GLOB.ritualslist[ritualnameinput]
testing("pickritual [pickritual]")
@@ -264,7 +264,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
if(!pickritual)
return
-
+
var/dews = 0
if(pickritual.e_req)
@@ -318,7 +318,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
center_success = TRUE
testing("CENTER SUCCESS!")
break
-
+
var/badritualpunishment = FALSE
if(cardinal_success != TRUE)
if(badritualpunishment)
@@ -364,7 +364,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
/obj/effect/decal/cleanable/sigil/NW
icon_state = "NW"
-/turf/open/floor/proc/generateSigils(var/mob/M, var/input)
+/turf/open/floor/proc/generateSigils(mob/M, input)
var/turf/T = get_turf(M.loc)
for(var/obj/A in T)
if(istype(A, /obj/effect/decal/cleanable/sigil))
@@ -390,15 +390,15 @@ GLOBAL_LIST_EMPTY(ritualslist)
/obj/effect/decal/cleanable/sigil/SW
)
- for(var/i = 1; i <= alldirs.len; i++)
- var/turf/floor = get_step(src, alldirs[i])
+ for(var/i = 1; i <= GLOB.alldirs.len; i++)
+ var/turf/floor = get_step(src, GLOB.alldirs[i])
var/sigil = sigilsPath[i]
new sigil(floor)
/mob/living/carbon/human/proc/draw_sigil()
set name = "Draw Sigil"
- set category = "ZIZO"
+ set category = "LEVISHTH"
var/list/runes = list("Servantry", "Transmutation", "Fleshcrafting")
@@ -406,16 +406,16 @@ GLOBAL_LIST_EMPTY(ritualslist)
to_chat(src, span_danger("My hands aren't bloody enough."))
return
- var/input = input("Sigil Type", "HEARTHSTONE") as null|anything in runes
+ var/input = input("Sigil Type", "DREAMKEEP") as null|anything in runes
if(!input)
return
-
+
var/turf/open/floor/T = get_turf(src.loc)
T.generateSigils(src, input)
/mob/living/carbon/human/proc/release_minion()
set name = "Release follower"
- set category = "ZIZO"
+ set category = "LEVISHTH"
var/datum/game_mode/chaosmode/C = SSticker.mode
var/list/mob/living/carbon/human/possible = list()
@@ -425,10 +425,10 @@ GLOBAL_LIST_EMPTY(ritualslist)
var/mob/living/carbon/human/choice = input(src, "Whom do you no longer have use for?", "ROGUETOWN") as null|anything in possible
if(choice)
- var/alert = alert(src, "Are you sure?", "HEARTHSTONE", "Yes", "Cancel")
+ var/alert = alert(src, "Are you sure?", "DREAMKEEP", "Yes", "Cancel")
if(alert == "Yes")
visible_message(span_danger("[src] reaches out, ripping up [choice]'s soul!"))
- to_chat(choice, span_userdanger("I HAVE FAILED MY LEADER! I HAVE FAILED ZIZO! NOTHING ELSE BUT DEATH REMAINS FOR ME NOW!"))
+ to_chat(choice, span_userdanger("I HAVE FAILED MY LEADER! I HAVE FAILED LEVISHTH! NOTHING ELSE BUT DEATH REMAINS FOR ME NOW!"))
sleep(20)
choice.gib() // Cooler than dusting.
C.cultists -= choice.mind
@@ -439,7 +439,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
var/name = "DARK AND EVIL RITVAL"
var/circle = null // Servantry, Transmutation, Fleshcrafting
var/center_requirement = /obj/item
- // This is absolutely fucking terrible. I tried to do it with lists but it just didn't work and
+ // This is absolutely fucking terrible. I tried to do it with lists but it just didn't work and
//kept runtiming. Something something, can't access list inside a datum.
//I couldn't find a more efficient solution to do this, I'm sorry. -7
var/n_req = null
@@ -458,7 +458,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/convert
-/proc/convert(var/mob/user, var/turf/C)
+/proc/convert(mob/user, turf/C)
var/datum/game_mode/chaosmode/M = SSticker.mode
testing("NOW TESTING CONVERT")
@@ -477,7 +477,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
to_chat(user.mind, span_danger("\"The veil is too strong to support more than ten cultists.\""))
return
var/datum/antagonist/zizocultist/PR = user.mind.has_antag_datum(/datum/antagonist/zizocultist)
- var/alert = alert(H, "YOU WILL BE SHOWN THE TRUTH. DO YOU RESIST? (Resisting: 1 TRI)", "HEARTHSTONE", "Yield", "Resist")
+ var/alert = alert(H, "YOU WILL BE SHOWN THE TRUTH. DO YOU RESIST? (Resisting: 1 TRI)", "DREAMKEEP", "Yield", "Resist")
H.anchored = TRUE
if(alert == "Yield")
to_chat(H.mind, span_notice("I see the truth now! It all makes so much sense! They aren't HERETICS! They want the BEST FOR US!"))
@@ -488,7 +488,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
H.adjust_triumphs(-1)
H.visible_message(span_danger("\The [H] thrashes around, unyielding!"))
to_chat(H.mind, span_danger("\"Yield.\""))
- if(H.electrocute_act(10, src))
+ if(H.electrocute_act(10, C))
H.emote("painscream")
sleep(20)
H.anchored = FALSE
@@ -502,7 +502,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/skeletaljaunt
-/proc/skeletaljaunt(var/mob/user, var/turf/C)
+/proc/skeletaljaunt(mob/user, turf/C)
for(var/mob/living/carbon/human/H in C.contents)
if(H == user)
return
@@ -577,7 +577,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/thecall
-/proc/thecall(var/mob/user, var/turf/C)
+/proc/thecall(mob/user, turf/C)
for(var/obj/item/paper/P in C.contents)
if(!user.mind || !user.mind.do_i_know(name=P.info))
to_chat(user.mind, span_warning("I don't know anyone by that name."))
@@ -596,8 +596,8 @@ GLOBAL_LIST_EMPTY(ritualslist)
return
HL.apply_status_effect(/datum/status_effect/debuff/sleepytime)
to_chat(HL.mind, span_warning("This isn't my bed... Where am I?!"))
- HL.playsound_local(src, pick('sound/misc/jumphumans (1).ogg','sound/misc/jumphumans (2).ogg','sound/misc/jumphumans (3).ogg'), 100)
HL.forceMove(C)
+ HL.playsound_local(C, pick('sound/misc/jumphumans (1).ogg','sound/misc/jumphumans (2).ogg','sound/misc/jumphumans (3).ogg'), 100)
qdel(P)
/datum/ritual/falseappearance
@@ -612,7 +612,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/falseappearance
-/proc/falseappearance(var/mob/user, var/turf/C)
+/proc/falseappearance(mob/user, turf/C)
for(var/mob/living/carbon/human/H in C.contents)
var/datum/preferences/A = new()//Randomize appearance for the guy
var/first_names = GLOB.first_names
@@ -629,7 +629,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
name = "Pact of Unity"
circle = "Servantry"
center_requirement = /obj/item/paper
-
+
n_req = /obj/item/organ/eyes
function = /proc/pactofunity
@@ -648,7 +648,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
/obj/item/pactofunity/attack_self(mob/user)
. = ..()
- var/alert = alert(user, "Rip up the pact of unity?", "HEARTHSTONE", "RIP", "Cancel")
+ var/alert = alert(user, "Rip up the pact of unity?", "DREAMKEEP", "RIP", "Cancel")
if(alert == "RIP")
user.playsound_local(user, 'sound/foley/cloth_rip.ogg', 50)
to_chat(signed.mind, span_userdanger("I FAILED! MY LIFE DWINDLES!"))
@@ -669,7 +669,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
return
if(!H.stat)
to_chat(user, span_info("I courteously offer \the [src] to [H]."))
- if(alert(H, "Sign the pact with your blood?", "HEARTHSTONE", "Yes", "No") != "Yes")
+ if(alert(H, "Sign the pact with your blood?", "DREAMKEEP", "Yes", "No") != "Yes")
return
if(H.stat)
return
@@ -678,7 +678,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
to_chat(H, span_info("I signed the paper, hopefully I won't regret this."))
signed = H
-/proc/pactofunity(var/mob/user, var/turf/C)
+/proc/pactofunity(mob/user, turf/C)
new /obj/item/pactofunity(C)
to_chat(user.mind, span_notice("The Pact of Unity. When a person willingly signs their name on this they become my pawn. When I rip up the paper their soul is good as dead."))
@@ -691,7 +691,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/allseeingeye
-/proc/allseeingeye(var/mob/user, var/turf/C)
+/proc/allseeingeye(mob/user, turf/C)
new /obj/item/scrying/eye(C)
/datum/ritual/criminalstool
@@ -701,7 +701,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/criminalstool
-/proc/criminalstool(var/mob/user, var/turf/C)
+/proc/criminalstool(mob/user, turf/C)
new /obj/item/soap/cult(C)
to_chat(user.mind, span_notice("The Criminal's Tool. Could be useful for hiding tracks or getting rid of sigils."))
@@ -711,10 +711,10 @@ GLOBAL_LIST_EMPTY(ritualslist)
center_requirement = /obj/item/natural/worms/leech
n_req = /obj/item/paper
s_req = /obj/item/natural/feather
-
+
function = /proc/propaganda
-/proc/propaganda(var/mob/user, var/turf/C)
+/proc/propaganda(mob/user, turf/C)
new /obj/item/natural/worms/leech/propaganda(C)
to_chat(user.mind, span_notice("A leech to make their minds wrangled. They'll be in bad spirits."))
@@ -724,7 +724,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
center_requirement = /mob/living/carbon/human
w_req = /obj/item/paper
s_req = /obj/item/natural/feather
-
+
function = /proc/falseidol
/obj/effect/dummy/falseidol
@@ -737,7 +737,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
. = ..()
qdel(src)
-/proc/falseidol(var/mob/user, var/turf/C)
+/proc/falseidol(mob/user, turf/C)
for(var/mob/living/carbon/human/H in C.contents)
var/obj/effect/dummy/falseidol/idol = new(C)
var/datum/icon_snapshot/entry = new
@@ -756,14 +756,14 @@ GLOBAL_LIST_EMPTY(ritualslist)
name = "Invade Mind"
circle = "Transmutation"
center_requirement = /obj/item/natural/feather
-
+
function = /proc/invademind
-/proc/invademind(var/mob/user, var/turf/C)
+/proc/invademind(mob/user, turf/C)
for(var/obj/item/paper/P in C.contents)
var/info = ""
info = sanitize(P.info)
- var/input = stripped_input(user, "To whom do we send this message?", "HEARTHSTONE")
+ var/input = stripped_input(user, "To whom do we send this message?", "DREAMKEEP")
if(!input)
return
for(var/mob/living/carbon/human/HL in GLOB.human_list)
@@ -779,7 +779,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/summonweapons
-/proc/summonweapons(var/mob/user, var/turf/C)
+/proc/summonweapons(mob/user, turf/C)
var/datum/effect_system/spark_spread/S = new(C)
S.set_up(1, 1, C)
S.start()
@@ -806,7 +806,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/bunnylegs
-/proc/bunnylegs(var/mob/user, var/turf/C)
+/proc/bunnylegs(mob/user, turf/C)
for(var/mob/living/carbon/human/H in C.contents)
ADD_TRAIT(H, TRAIT_ZJUMP, TRAIT_GENERIC)
to_chat(H.mind, span_notice("I feel like my legs have become stronger."))
@@ -823,7 +823,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/darkeyes
-/proc/darkeyes(var/mob/user, var/turf/C)
+/proc/darkeyes(mob/user, turf/C)
for(var/mob/living/carbon/human/H in C.contents)
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
if(eyes)
@@ -845,7 +845,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/nopain
-/proc/nopain(var/mob/user, var/turf/C)
+/proc/nopain(mob/user, turf/C)
for(var/mob/living/carbon/human/H in C.contents)
ADD_TRAIT(user, TRAIT_NOPAIN, TRAIT_GENERIC)
to_chat(H.mind, span_notice("I no longer feel pain, but it has come at a terrible cost."))
@@ -869,7 +869,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/fleshform
-/proc/fleshform(var/mob/user, var/turf/C)
+/proc/fleshform(mob/user, turf/C)
for(var/mob/living/carbon/human/H in C.contents)
if(iszizocultist(H))
to_chat(H.mind, span_danger("\"I'm not letting my strongest follower become a mindless brute.\""))
@@ -880,7 +880,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
trl.forceMove(H)
trl.ckey = H.ckey
H.gib()
-
+
/datum/ritual/gutted
name = "Gutted Fish"
circle = "Fleshcrafting"
@@ -888,7 +888,7 @@ GLOBAL_LIST_EMPTY(ritualslist)
function = /proc/guttedlikeafish
-/proc/guttedlikeafish(var/mob/user, var/turf/C)
+/proc/guttedlikeafish(mob/user, turf/C)
for(var/mob/living/carbon/human/H in C.contents)
if(H.stat == DEAD)
H.take_overall_damage(500)
@@ -908,36 +908,56 @@ GLOBAL_LIST_EMPTY(ritualslist)
circle = "Fleshcrafting"
center_requirement = /mob/living/carbon/human // cult leader
- n_req = /mob/living/carbon/human // the ruler
- s_req = /mob/living/carbon/human // virgin
-
+ n_req = /mob/living/carbon/human // virgin
+ s_req = /mob/living/carbon/human // anyone
+ e_req = /mob/living/carbon/human // anyone
+ w_req = /mob/living/carbon/human // anyone
+
function = /proc/ascend
-/proc/ascend(var/mob/user, var/turf/C)
+/proc/ascend(mob/user, turf/C)
var/datum/game_mode/chaosmode/CM = SSticker.mode
for(var/mob/living/carbon/human/H in C.contents)
if(!iszizocultist(H))
return
- for(var/mob/living/carbon/human/RULER in get_step(src, NORTH))
- if(RULER != SSticker.rulermob && RULER.stat != DEAD)
- break
- RULER.gib()
- for(var/mob/living/carbon/human/VIRGIN in get_step(src, SOUTH))
+ for(var/mob/living/carbon/human/VIRGIN in get_step(C, NORTH))
if(!VIRGIN.virginity && VIRGIN.stat != DEAD)
break
VIRGIN.gib()
+ for(var/mob/living/carbon/human/SOMEDUDE in get_step(C, EAST))
+ if(SOMEDUDE.stat != DEAD)
+ break
+ SOMEDUDE.gib()
+ for(var/mob/living/carbon/human/SOMEDUDE in get_step(C, SOUTH))
+ if(SOMEDUDE.stat != DEAD)
+ break
+ SOMEDUDE.gib()
+ for(var/mob/living/carbon/human/SOMEDUDE in get_step(C, WEST))
+ if(SOMEDUDE.stat != DEAD)
+ break
+ SOMEDUDE.gib()
CM.cultascended = TRUE
addomen("ascend")
- to_chat(user.mind, span_danger("I HAVE DONE IT! I HAVE REACHED A HIGHER FORM! SOON THERE WILL BE NO GODS. ONLY MASTERS!"))
+ to_chat(user.mind, span_danger("I HAVE DONE IT! Now I will die... BUT THE REFLECTION OF -ME- AS A NEW GOD WILL RISE!!!"))
var/mob/living/trl = new /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended(C)
+ trl.name = "[user.real_name] the NEW GOD of ULTRAVIOLENCE"
trl.ckey = H.ckey
H.gib()
- to_chat(world, "\n15 minutes remain.")
for(var/mob/living/carbon/V in GLOB.human_list)
- if(V.mind in CM.cultists)
- V.add_stress(/datum/stressevent/lovezizo)
- else
+ if(!(V.mind in CM.cultists))
+ to_chat(V, span_danger("I CAN --FEEL-- SOMETHING -HORRIBLE- HAS AWAKENED...!!"))
+ V.do_freakout_scream()
V.add_stress(/datum/stressevent/hatezizo)
- CM.roundvoteend = TRUE
+ GLOB.todoverride = "night"
+ settod()
+ spawn(6000)
+ GLOB.todoverride = null
+ priority_announce("The Sun is torn from the sky!", "Terrible Omen", 'sound/misc/astratascream.ogg')
+ addomen(OMEN_SUNSTEAL)
+ for(var/mob/living/carbon/human/astrater in GLOB.human_list)
+ if(!istype(astrater.patron, /datum/patron/divine/astrata) || !length(astrater.mind?.antag_datums))
+ continue
+ to_chat(astrater, span_userdanger("You feel the pain of [astrater.patron.name]!"))
+ astrater.emote_scream()
break
diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm
deleted file mode 100644
index 759dbb71c92..00000000000
--- a/code/modules/antagonists/slaughter/slaughter.dm
+++ /dev/null
@@ -1,190 +0,0 @@
-//////////////////The Monster
-
-/mob/living/simple_animal/slaughter
- name = "slaughter demon"
- real_name = "slaughter demon"
- desc = ""
- speak_emote = list("gurgles")
- emote_hear = list("wails","screeches")
- response_help_continuous = "thinks better of touching"
- response_help_simple = "think better of touching"
- response_disarm_continuous = "flails at"
- response_disarm_simple = "flail at"
- response_harm_continuous = "punches"
- response_harm_simple = "punch"
- icon = 'icons/mob/mob.dmi'
- icon_state = "daemon"
- icon_living = "daemon"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- speed = 1
- a_intent = INTENT_HARM
- stop_automated_movement = 1
- status_flags = CANPUSH
- attack_sound = 'sound/blank.ogg'
- var/feast_sound = 'sound/blank.ogg'
- deathsound = 'sound/blank.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 = 0
- maxbodytemp = INFINITY
- faction = list("slaughter")
- attack_verb_continuous = "wildly tears into"
- attack_verb_simple = "wildly tear into"
- maxHealth = 200
- health = 200
- healable = 0
- environment_smash = ENVIRONMENT_SMASH_STRUCTURES
- obj_damage = 50
- melee_damage_lower = 30
- melee_damage_upper = 30
- see_in_dark = 8
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- bloodcrawl = BLOODCRAWL_EAT
- var/playstyle_string = "I are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \
- You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \
- Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \
- You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. "
-
- loot = list(/obj/effect/decal/cleanable/blood, \
- /obj/effect/decal/cleanable/blood/innards, \
- /obj/item/organ/heart/demon)
- del_on_death = 1
- deathmessage = "screams in anger as it collapses into a puddle of viscera!"
-
-/mob/living/simple_animal/slaughter/Initialize()
- ..()
- var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
- AddSpell(bloodspell)
- if(istype(loc, /obj/effect/dummy/phased_mob/slaughter))
- bloodspell.phased = TRUE
-
-/obj/effect/decal/cleanable/blood/innards
- name = "pile of viscera"
- desc = ""
- gender = NEUTER
- icon = 'icons/obj/surgery.dmi'
- icon_state = "innards"
- random_icon_states = null
-
-/mob/living/simple_animal/slaughter/phasein()
- . = ..()
- add_movespeed_modifier(MOVESPEED_ID_SLAUGHTER, update=TRUE, priority=100, multiplicative_slowdown=-1)
- addtimer(CALLBACK(src, PROC_REF(remove_movespeed_modifier), MOVESPEED_ID_SLAUGHTER, TRUE), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
-
-
-//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
-/obj/item/organ/heart/demon
- name = "demon heart"
- desc = ""
- icon = 'icons/obj/surgery.dmi'
- icon_state = "demon_heart-on"
- decay_factor = 0
-
-/obj/item/organ/heart/demon/update_icon()
- return //always beating visually
-
-/obj/item/organ/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target)
- if(M != user)
- return ..()
- user.visible_message(span_warning("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), \
- span_danger("An unnatural hunger consumes you. You raise [src] your mouth and devour it!"))
- playsound(user, 'sound/blank.ogg', 50, TRUE)
- for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
- if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl)
- to_chat(user, span_warning("...and you don't feel any different."))
- qdel(src)
- return
- user.visible_message(span_warning("[user]'s eyes flare a deep crimson!"), \
- span_danger("I feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!"))
- user.temporarilyRemoveItemFromInventory(src, TRUE)
- src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E
-
-/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0)
- ..()
- if(M.mind)
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null))
-
-/obj/item/organ/heart/demon/Remove(mob/living/carbon/M, special = 0)
- ..()
- if(M.mind)
- M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl)
-
-/obj/item/organ/heart/demon/Stop()
- return 0 // Always beating.
-
-/mob/living/simple_animal/slaughter/laughter
- // The laughter demon! It's everyone's best friend! It just wants to hug
- // them so much, it wants to hug everyone at once!
- name = "laughter demon"
- real_name = "laughter demon"
- desc = ""
- speak_emote = list("giggles","titters","chuckles")
- emote_hear = list("guffaws","laughs")
- response_help_continuous = "hugs"
- attack_verb_continuous = "wildly tickles"
- attack_verb_simple = "wildly tickle"
-
- attack_sound = 'sound/blank.ogg'
- feast_sound = 'sound/blank.ogg'
- deathsound = 'sound/blank.ogg'
-
- icon_state = "bowmon"
- icon_living = "bowmon"
- deathmessage = "fades out, as all of its friends are released from its \
- prison of hugs."
- loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"})
-
- // Keep the people we hug!
- var/list/consumed_mobs = list()
-
- playstyle_string = "I are a laughter \
- demon, a wonderful creature from another realm. You have a single \
- desire: To hug and tickle.
\
- You may use the \"Blood Crawl\" ability near blood pools to travel \
- through them, appearing and disappearing from the station at will. \
- Pulling a dead or unconscious mob while you enter a pool will pull \
- them in with you, allowing you to hug them and regain your health.
\
- You move quickly upon leaving a pool of blood, but the material world \
- will soon sap your strength and leave you sluggish.
\
- What makes you a little sad is that people seem to die when you tickle \
- them; but don't worry! When you die, everyone you hugged will be \
- released and fully healed, because in the end it's just a jape, \
- sibling!"
-
-/mob/living/simple_animal/slaughter/laughter/Destroy()
- release_friends()
- . = ..()
-
-/mob/living/simple_animal/slaughter/laughter/ex_act(severity)
- switch(severity)
- if(1)
- death()
- if(2)
- adjustBruteLoss(60)
- if(3)
- adjustBruteLoss(30)
-
-/mob/living/simple_animal/slaughter/laughter/proc/release_friends()
- if(!consumed_mobs)
- return
-
- for(var/mob/living/M in consumed_mobs)
- if(!M)
- continue
- var/turf/T = find_safe_turf()
- if(!T)
- T = get_turf(src)
- M.forceMove(T)
- if(M.revive(full_heal = TRUE, admin_revive = TRUE))
- M.grab_ghost(force = TRUE)
- playsound(T, feast_sound, 50, TRUE, -1)
- to_chat(M, span_clown("I leave [src]'s warm embrace, and feel ready to take on the world."))
-
-/mob/living/simple_animal/slaughter/laughter/bloodcrawl_swallow(mob/living/victim)
- if(consumed_mobs)
- // Keep their corpse so rescue is possible
- consumed_mobs += victim
- else
- // Be safe and just eject the corpse
- victim.forceMove(get_turf(victim))
- victim.exit_blood_effect()
- victim.visible_message(span_warning("[victim] falls out of the air, covered in blood, looking highly confused. And dead."))
diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm
deleted file mode 100644
index 81f1e774674..00000000000
--- a/code/modules/antagonists/slaughter/slaughter_antag.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-/datum/antagonist/slaughter
- name = "Slaughter demon"
- show_name_in_check_antagonists = TRUE
- var/objective_verb = "Kill"
- var/datum/mind/summoner
- job_rank = ROLE_ALIEN
- show_in_antagpanel = FALSE
-
-/datum/antagonist/slaughter/on_gain()
- forge_objectives()
- . = ..()
-
-/datum/antagonist/slaughter/greet()
- . = ..()
- owner.announce_objectives()
-
-/datum/antagonist/slaughter/proc/forge_objectives()
- if(summoner)
- var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate
- new_objective.owner = owner
- new_objective.target = summoner
- new_objective.explanation_text = "[objective_verb] [summoner.name], the one who summoned you."
- objectives += new_objective
- var/datum/objective/new_objective2 = new /datum/objective
- new_objective2.owner = owner
- new_objective2.explanation_text = "[objective_verb] everyone[summoner ? " else while you're at it":""]."
- objectives += new_objective2
-
-/datum/antagonist/slaughter/laughter
- name = "Laughter demon"
- objective_verb = "Hug and Tickle"
diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm
deleted file mode 100644
index ce59a2a2b11..00000000000
--- a/code/modules/antagonists/slaughter/slaughterevent.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-/datum/round_event_control/slaughter
- name = "Spawn Slaughter Demon"
- typepath = /datum/round_event/ghost_role/slaughter
- weight = 1 //Very rare
- max_occurrences = 1
- earliest_start = 1 HOURS
- min_players = 20
-
-
-
-/datum/round_event/ghost_role/slaughter
- minimum_required = 1
- role_name = "slaughter demon"
-
-/datum/round_event/ghost_role/slaughter/spawn_role()
- var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
- if(!candidates.len)
- return NOT_ENOUGH_PLAYERS
-
- var/mob/dead/selected = pick_n_take(candidates)
-
- var/datum/mind/player_mind = new /datum/mind(selected.key)
- player_mind.active = 1
-
- var/list/spawn_locs = list()
- for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list)
- if(isturf(L.loc))
- spawn_locs += L.loc
-
- if(!spawn_locs)
- message_admins("No valid spawn locations found, aborting...")
- return MAP_ERROR
-
- var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter((pick(spawn_locs)))
- var/mob/living/simple_animal/slaughter/S = new (holder)
- S.holder = holder
- player_mind.transfer_to(S)
- player_mind.assigned_role = "Slaughter Demon"
- player_mind.special_role = "Slaughter Demon"
- player_mind.add_antag_datum(/datum/antagonist/slaughter)
- to_chat(S, S.playstyle_string)
- to_chat(S, "I are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.")
- SEND_SOUND(S, 'sound/blank.ogg')
- message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a slaughter demon by an event.")
- log_game("[key_name(S)] was spawned as a slaughter demon by an event.")
- spawned_mobs += S
- return SUCCESSFUL_SPAWN
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
deleted file mode 100644
index 97aa277566e..00000000000
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ /dev/null
@@ -1,672 +0,0 @@
-////Deactivated swarmer shell////
-/obj/item/deactivated_swarmer
- name = "deactivated swarmer"
- desc = ""
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "swarmer_unactivated"
- custom_materials = list(/datum/material/iron=10000, /datum/material/glass=4000)
-
-/obj/effect/mob_spawn/swarmer
- name = "unactivated swarmer"
- desc = ""
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "swarmer_unactivated"
- density = FALSE
- anchored = FALSE
-
- mob_type = /mob/living/simple_animal/hostile/swarmer
- mob_name = "a swarmer"
- death = FALSE
- roundstart = FALSE
- flavour_text = {"
- I are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate.
- Clicking on any object will try to consume it, either deconstructing it into its components, destroying it, or integrating any materials it has into you if successful.
- Ctrl-Clicking on a mob will attempt to remove it from the area and place it in a safe environment for storage.
- Objectives:
- 1. Consume resources and replicate until there are no more resources left.
- 2. Ensure that this location is fit for invasion at a later date; do not perform actions that would render it dangerous or inhospitable.
- 3. Biological resources will be harvested at a later date; do not harm them.
- "}
-
-/obj/effect/mob_spawn/swarmer/Initialize()
- . = ..()
- var/area/A = get_area(src)
- if(A)
- notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/blank.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
-
-/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- to_chat(user, span_notice("Picking up the swarmer may cause it to activate. You should be careful about this."))
-
-/obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params)
- if(W.tool_behaviour == TOOL_SCREWDRIVER && user.used_intent.type != INTENT_HARM)
- user.visible_message(span_warning("[usr.name] deactivates [src]."),
- span_notice("After some fiddling, you find a way to disable [src]'s power source."),
- span_hear("I hear clicking."))
- new /obj/item/deactivated_swarmer(get_turf(src))
- qdel(src)
- else
- ..()
-
-////The Mob itself////
-
-/mob/living/simple_animal/hostile/swarmer
- name = "Swarmer"
- unique_name = 1
- icon = 'icons/mob/swarmer.dmi'
- desc = ""
- speak_emote = list("tones")
- initial_language_holder = /datum/language_holder/swarmer
- bubble_icon = "swarmer"
- mob_biotypes = MOB_ROBOTIC
- health = 40
- maxHealth = 40
- status_flags = CANPUSH
- icon_state = "swarmer"
- icon_living = "swarmer"
- icon_dead = "swarmer_unactivated"
- icon_gib = null
- wander = 0
- harm_intent_damage = 5
- minbodytemp = 0
- maxbodytemp = 500
- 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)
- unsuitable_atmos_damage = 0
- melee_damage_lower = 15
- melee_damage_upper = 15
- melee_damage_type = STAMINA
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
- hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD)
- obj_damage = 0
- environment_smash = ENVIRONMENT_SMASH_NONE
- attack_verb_continuous = "shocks"
- attack_verb_simple = "shock"
- attack_sound = 'sound/blank.ogg'
- friendly_verb_continuous = "pinches"
- friendly_verb_simple = "pinch"
- speed = 0
- faction = list("swarmer")
- AIStatus = AI_OFF
- pass_flags = PASSTABLE
- mob_size = MOB_SIZE_TINY
- ventcrawler = VENTCRAWLER_ALWAYS
- ranged = 1
- projectiletype = /obj/projectile/beam/disabler
- ranged_cooldown_time = 20
- projectilesound = 'sound/blank.ogg'
- loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal)
- del_on_death = 1
- deathmessage = "explodes with a sharp pop!"
- light_color = LIGHT_COLOR_CYAN
- hud_type = /datum/hud/swarmer
- speech_span = SPAN_ROBOT
- var/resources = 0 //Resource points, generated by consuming metal/glass
- var/max_resources = 100
-
-/mob/living/simple_animal/hostile/swarmer/Initialize()
- . = ..()
- verbs -= /mob/living/verb/pulled
- for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
- diag_hud.add_to_hud(src)
-
-/mob/living/simple_animal/hostile/swarmer/med_hud_set_health()
- var/image/holder = hud_list[DIAG_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]"
-
-/mob/living/simple_animal/hostile/swarmer/med_hud_set_status()
- var/image/holder = hud_list[DIAG_STAT_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- holder.icon_state = "hudstat"
-
-/mob/living/simple_animal/hostile/swarmer/Stat()
- ..()
- if(statpanel("Status"))
- stat("Resources:",resources)
-
-/mob/living/simple_animal/hostile/swarmer/emp_act()
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- if(health > 1)
- adjustHealth(health-1)
- else
- death()
-
-/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O)
- if(istype(O, /obj/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other
- return TRUE
- if(isswarmer(O))
- return TRUE
- ..()
-
-////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////
-/mob/living/simple_animal/hostile/swarmer/AttackingTarget()
- if(!isliving(target))
- return target.swarmer_act(src)
- else
- return ..()
-
-/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A)
- face_atom(A)
- if(!isturf(loc))
- return
- if(next_move > world.time)
- return
- if(!A.Adjacent(src))
- return
- A.swarmer_act(src)
-
-/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE //return TRUE/FALSE whether or not an AI swarmer should try this swarmer_act() again, NOT whether it succeeded.
-
-/obj/effect/mob_spawn/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.Integrate(src)
- return FALSE //would logically be TRUE, but we don't want AI swarmers eating player spawn chances.
-
-/obj/effect/mob_spawn/swarmer/IntegrateAmount()
- return 50
-
-/turf/closed/indestructible/swarmer_act()
- return FALSE
-
-/obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- if(resistance_flags & INDESTRUCTIBLE)
- return FALSE
- for(var/mob/living/L in contents)
- if(!issilicon(L) && !isbrain(L))
- to_chat(S, span_warning("An organism has been detected inside this object. Aborting."))
- return FALSE
- return ..()
-
-/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- return S.Integrate(src)
-
-/atom/movable/proc/IntegrateAmount()
- return 0
-
-/obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item
- if(custom_materials)
- if(custom_materials[getmaterialref(/datum/material/iron)] || custom_materials[getmaterialref(/datum/material/glass)])
- return 1
- return ..()
-
-/obj/item/gun/swarmer_act()//Stops you from eating the entire armory
- return FALSE
-
-/turf/open/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
- return FALSE
-
-/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act()
- return FALSE
-
-/obj/structure/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- if(S.AIStatus == AI_ON)
- return FALSE
- else
- return ..()
-
-/obj/effect/swarmer_act()
- return FALSE
-
-/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- qdel(src)
- return TRUE
-
-/obj/structure/flora/swarmer_act()
- return FALSE
-
-/turf/open/lava/swarmer_act()
- if(!is_safe())
- new /obj/structure/lattice/catwalk/swarmer_catwalk(src)
- return FALSE
-
-/obj/machinery/atmospherics/swarmer_act()
- return FALSE
-
-/obj/structure/disposalpipe/swarmer_act()
- return FALSE
-
-/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DismantleMachine(src)
- return TRUE
-
-/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- var/isonshuttle = istype(get_area(src), /area/shuttle)
- for(var/turf/T in range(1, src))
- var/area/A = get_area(T)
- if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle)))
- to_chat(S, span_warning("Destroying this object has the potential to cause a hull breach. Aborting."))
- S.target = null
- return FALSE
- else if(istype(A, /area/engine/supermatter))
- to_chat(S, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting."))
- S.target = null
- return FALSE
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- toggle_cam(S, 0)
- return TRUE
-
-/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("The volatile chemicals in this machine would destroy us. Aborting."))
- return FALSE
-
-/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("This device's destruction would result in the extermination of everything in the area. Aborting."))
- return FALSE
-
-/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("Searching... sensor malfunction! Target lost. Aborting."))
- return FALSE
-
-/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("Destroying this object would cause a chain reaction. Aborting."))
- return FALSE
-
-/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("Disrupting the power grid would bring no benefit to us. Aborting."))
- return FALSE
-
-/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("An inhospitable area may be created as a result of destroying this object. Aborting."))
- return FALSE
-
-/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting."))
- return FALSE
-
-/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting."))
- return FALSE
-
-/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("Disrupting the power grid would bring no benefit to us. Aborting."))
- return FALSE
-
-/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("This bluespace source will be important to us later. Aborting."))
- return FALSE
-
-/turf/closed/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- var/isonshuttle = istype(loc, /area/shuttle)
- for(var/turf/T in range(1, src))
- var/area/A = get_area(T)
- if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle)))
- to_chat(S, span_warning("Destroying this object has the potential to cause a hull breach. Aborting."))
- S.target = null
- return TRUE
- else if(istype(A, /area/engine/supermatter))
- to_chat(S, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting."))
- S.target = null
- return TRUE
- return ..()
-
-/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- var/isonshuttle = istype(get_area(src), /area/shuttle)
- for(var/turf/T in range(1, src))
- var/area/A = get_area(T)
- if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle)))
- to_chat(S, span_warning("Destroying this object has the potential to cause a hull breach. Aborting."))
- S.target = null
- return TRUE
- else if(istype(A, /area/engine/supermatter))
- to_chat(S, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting."))
- S.target = null
- return TRUE
- return ..()
-
-/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource
- to_chat(S, span_warning("This object does not contain enough materials to work with."))
- return FALSE
-
-/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("Attempting to dismantle this machine would result in an immediate counterattack. Aborting."))
- return FALSE
-
-/obj/machinery/porta_turret_cover/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("Attempting to dismantle this machine would result in an immediate counterattack. Aborting."))
- return FALSE
-
-/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisperseTarget(src)
- return TRUE
-
-/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("This biological resource is somehow resisting our bluespace transceiver. Aborting."))
- return FALSE
-
-/obj/machinery/droneDispenser/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("This object is receiving unactivated swarmer shells to help us. Aborting."))
- return FALSE
-
-/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- . = ..()
- var/turf/here = get_turf(src)
- for(var/A in here.contents)
- var/obj/structure/cable/C = A
- if(istype(C))
- to_chat(S, span_warning("Disrupting the power grid would bring no benefit to us. Aborting."))
- return FALSE
-
-/obj/item/deactivated_swarmer/IntegrateAmount()
- return 50
-
-/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("This object does not contain enough materials to work with."))
- return FALSE
-
-/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("Destroying this object would cause a catastrophic chain reaction. Aborting."))
- return FALSE
-
-/obj/machinery/field/containment/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("This object does not contain solid matter. Aborting."))
- return FALSE
-
-/obj/machinery/power/shieldwallgen/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("Destroying this object would have an unpredictable effect on structure integrity. Aborting."))
- return FALSE
-
-/obj/machinery/shieldwall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, span_warning("This object does not contain solid matter. Aborting."))
- return FALSE
-
-////END CTRL CLICK FOR SWARMERS////
-
-/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object,fabrication_cost = 0)
- if(!isturf(loc))
- to_chat(src, span_warning("This is not a suitable location for fabrication. We need more space."))
- if(resources >= fabrication_cost)
- resources -= fabrication_cost
- else
- to_chat(src, span_warning("I do not have the necessary resources to fabricate this object."))
- return
- return new fabrication_object(loc)
-
-/mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target)
- var/resource_gain = target.IntegrateAmount()
- if(resources + resource_gain > max_resources)
- to_chat(src, span_warning("We cannot hold more materials!"))
- return TRUE
- if(resource_gain)
- resources += resource_gain
- do_attack_animation(target)
- changeNext_move(CLICK_CD_MELEE)
- var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target))
- I.pixel_x = target.pixel_x
- I.pixel_y = target.pixel_y
- I.pixel_z = target.pixel_z
- if(istype(target, /obj/item/stack))
- var/obj/item/stack/S = target
- S.use(1)
- if(S.amount)
- return TRUE
- qdel(target)
- return TRUE
- else
- to_chat(src, span_warning("[target] is incompatible with our internal matter recycler."))
- return FALSE
-
-
-/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target)
- new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
- do_attack_animation(target)
- changeNext_move(CLICK_CD_MELEE)
- target.ex_act(EXPLODE_LIGHT)
-
-
-/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(mob/living/target)
- if(target == src)
- return
-
- if(!is_station_level(z) && !is_mining_level(z))
- to_chat(src, span_warning("Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area."))
- return
-
- to_chat(src, span_info("Attempting to remove this being from our presence."))
-
- if(!do_mob(src, target, 30))
- return
-
- var/turf/open/floor/F
- F = find_safe_turf(zlevels = z, extended_safety_checks = TRUE)
-
- if(!F)
- return
- // If we're getting rid of a human, slap some energy cuffs on
- // them to keep them away from us a little longer
-
- var/mob/living/carbon/human/H = target
- if(ishuman(target) && (!H.handcuffed))
- H.handcuffed = new /obj/item/restraints/handcuffs/energy/used(H)
- H.update_handcuffed()
- log_combat(src, H, "handcuffed")
-
- var/datum/effect_system/spark_spread/S = new
- S.set_up(4,0,get_turf(target))
- S.start()
- playsound(src,'sound/blank.ogg',50,TRUE)
- do_teleport(target, F, 0, channel = TELEPORT_CHANNEL_BLUESPACE)
-
-/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
- if(!(flags & SHOCK_TESLA))
- return FALSE
- return ..()
-
-/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(obj/machinery/target)
- do_attack_animation(target)
- to_chat(src, span_info("We begin to dismantle this machine. We will need to be uninterrupted."))
- var/obj/effect/temp_visual/swarmer/dismantle/D = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target))
- D.pixel_x = target.pixel_x
- D.pixel_y = target.pixel_y
- D.pixel_z = target.pixel_z
- if(do_mob(src, target, 100))
- to_chat(src, span_info("Dismantling complete."))
- var/atom/Tsec = target.drop_location()
- new /obj/item/stack/sheet/metal(Tsec, 5)
- for(var/obj/item/I in target.component_parts)
- I.forceMove(Tsec)
- var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
- N.pixel_x = target.pixel_x
- N.pixel_y = target.pixel_y
- N.pixel_z = target.pixel_z
- target.dropContents()
- if(istype(target, /obj/machinery/computer))
- var/obj/machinery/computer/C = target
- if(C.circuit)
- C.circuit.forceMove(Tsec)
- qdel(target)
-
-
-/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects
- icon = 'icons/mob/swarmer.dmi'
- layer = BELOW_MOB_LAYER
-
-/obj/effect/temp_visual/swarmer/disintegration
- icon_state = "disintegrate"
- duration = 10
-
-/obj/effect/temp_visual/swarmer/disintegration/Initialize()
- . = ..()
- playsound(loc, "sparks", 100, TRUE)
-
-/obj/effect/temp_visual/swarmer/dismantle
- icon_state = "dismantle"
- duration = 25
-
-/obj/effect/temp_visual/swarmer/integrate
- icon_state = "integrate"
- duration = 5
-
-/obj/structure/swarmer //Default swarmer effect object visual feedback
- name = "swarmer ui"
- desc = null
- gender = NEUTER
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "ui_light"
- layer = MOB_LAYER
- resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
- light_color = LIGHT_COLOR_CYAN
- max_integrity = 30
- anchored = TRUE
- var/lon_range = 1
-
-/obj/structure/swarmer/Initialize(mapload)
- . = ..()
- set_light(lon_range)
-
-/obj/structure/swarmer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
- switch(damage_type)
- if(BRUTE)
- playsound(src, 'sound/blank.ogg', 80, TRUE)
- if(BURN)
- playsound(src, 'sound/blank.ogg', 100, TRUE)
-
-/obj/structure/swarmer/emp_act()
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- qdel(src)
-
-/obj/structure/swarmer/trap
- name = "swarmer trap"
- desc = ""
- icon_state = "trap"
- max_integrity = 10
- density = FALSE
-
-/obj/structure/swarmer/trap/Crossed(atom/movable/AM)
- if(isliving(AM))
- var/mob/living/L = AM
- if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
- playsound(loc,'sound/blank.ogg',50, TRUE, -1)
- L.electrocute_act(0, src, 1, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION)
- if(iscyborg(L))
- L.Paralyze(100)
- qdel(src)
- ..()
-
-/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
- set name = "Create trap"
- set category = "Swarmer"
- set desc = ""
- if(locate(/obj/structure/swarmer/trap) in loc)
- to_chat(src, span_warning("There is already a trap here. Aborting."))
- return
- Fabricate(/obj/structure/swarmer/trap, 5)
-
-
-/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade()
- set name = "Create barricade"
- set category = "Swarmer"
- set desc = ""
- if(locate(/obj/structure/swarmer/blockade) in loc)
- to_chat(src, span_warning("There is already a blockade here. Aborting."))
- return
- if(resources < 5)
- to_chat(src, span_warning("We do not have the resources for this!"))
- return
- if(do_mob(src, src, 10))
- Fabricate(/obj/structure/swarmer/blockade, 5)
-
-
-/obj/structure/swarmer/blockade
- name = "swarmer blockade"
- desc = ""
- icon_state = "barricade"
- light_range = MINIMUM_USEFUL_LIGHT_RANGE
- max_integrity = 50
-
-/obj/structure/swarmer/blockade/CanPass(atom/movable/O)
- if(isswarmer(O))
- return TRUE
- if(istype(O, /obj/projectile/beam/disabler))
- return TRUE
-
-/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer()
- set name = "Replicate"
- set category = "Swarmer"
- set desc = ""
- to_chat(src, span_info("We are attempting to replicate ourselves. We will need to stand still until the process is complete."))
- if(resources < 50)
- to_chat(src, span_warning("We do not have the resources for this!"))
- return
- if(!isturf(loc))
- to_chat(src, span_warning("This is not a suitable location for replicating ourselves. We need more room."))
- return
- if(do_mob(src, src, 100))
- var/createtype = SwarmerTypeToCreate()
- if(createtype && Fabricate(createtype, 50))
- playsound(loc,'sound/blank.ogg',50, TRUE, -1)
-
-
-/mob/living/simple_animal/hostile/swarmer/proc/SwarmerTypeToCreate()
- return /obj/effect/mob_spawn/swarmer
-
-
-/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf()
- set name = "Self Repair"
- set category = "Swarmer"
- set desc = ""
- if(!isturf(loc))
- return
- to_chat(src, span_info("Attempting to repair damage to our body, stand by..."))
- if(do_mob(src, src, 100))
- adjustHealth(-100)
- to_chat(src, span_info("We successfully repaired ourselves."))
-
-/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight()
- if(!light_range)
- set_light(3)
- else
- set_light(0)
-
-/mob/living/simple_animal/hostile/swarmer/proc/swarmer_chat(msg)
- var/rendered = "Swarm communication - [src] [say_quote(msg)]"
- for(var/i in GLOB.mob_list)
- var/mob/M = i
- if(isswarmer(M))
- to_chat(M, rendered)
- if(isobserver(M))
- var/link = FOLLOW_LINK(M, src)
- to_chat(M, "[link] [rendered]")
-
-/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers()
- var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact")
- // TODO get swarmers their own colour rather than just boldtext
- if(message)
- swarmer_chat(message)
diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm
deleted file mode 100644
index 40e6f4ea061..00000000000
--- a/code/modules/antagonists/swarmer/swarmer_event.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-/datum/round_event_control/spawn_swarmer
- name = "Spawn Swarmer Shell"
- typepath = /datum/round_event/spawn_swarmer
- weight = 7
- max_occurrences = 1 //Only once okay fam
- earliest_start = 30 MINUTES
- min_players = 15
-
-
-/datum/round_event/spawn_swarmer
-
-/datum/round_event/spawn_swarmer/start()
- if(find_swarmer())
- return 0
- if(!GLOB.the_gateway)
- return 0
- new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway))
- if(prob(25)) //25% chance to announce it to the crew
- var/swarmer_report = span_bigbold("[command_name()] High-Priority Update")
- swarmer_report += "
Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come through."
- print_command_report(swarmer_report, announce=TRUE)
-
-/datum/round_event/spawn_swarmer/proc/find_swarmer()
- for(var/i in GLOB.mob_living_list)
- var/mob/living/L = i
- if(istype(L, /mob/living/simple_animal/hostile/swarmer) && L.client) //If there is a swarmer with an active client, we've found our swarmer
- return 1
- return 0
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index f2821cb7ffd..65909b4393a 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -110,10 +110,6 @@
name = "Spell Cards"
spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards
-/datum/spellbook_entry/rod_form
- name = "Rod Form"
- spell_type = /obj/effect/proc_holder/spell/targeted/rod_form
-
/datum/spellbook_entry/magicm
name = "Magic Missile"
spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile
@@ -392,27 +388,6 @@
if(.)
new /obj/item/paper/guides/antag/guardian/wizard(get_turf(user))
-/datum/spellbook_entry/item/bloodbottle
- name = "Bottle of Blood"
- desc = ""
- item_path = /obj/item/antag_spawner/slaughter_demon
- limit = 3
- category = "Assistance"
-
-/datum/spellbook_entry/item/hugbottle
- name = "Bottle of Tickles"
- desc = "A bottle of magically infused fun, the smell of which will \
- attract adorable extradimensional beings when broken. These beings \
- are similar to slaughter demons, but they do not permamently kill \
- their victims, instead putting them in an extradimensional hugspace, \
- to be released on the demon's death. Chaotic, but not ultimately \
- damaging. The crew's reaction to the other hand could be very \
- destructive."
- item_path = /obj/item/antag_spawner/slaughter_demon/laughter
- cost = 1 //non-destructive; it's just a jape, sibling!
- limit = 3
- category = "Assistance"
-
/datum/spellbook_entry/item/mjolnir
name = "Mjolnir"
desc = ""
@@ -614,18 +589,6 @@
if(!isnull(CT.limit))
CT.limit++
qdel(O)
- else if(istype(O, /obj/item/antag_spawner/slaughter_demon))
- to_chat(user, span_notice("On second thought, maybe summoning a demon is a bad idea. You refund your points."))
- if(istype(O, /obj/item/antag_spawner/slaughter_demon/laughter))
- uses += 1
- for(var/datum/spellbook_entry/item/hugbottle/HB in entries)
- if(!isnull(HB.limit))
- HB.limit++
- else
- uses += 2
- for(var/datum/spellbook_entry/item/bloodbottle/BB in entries)
- if(!isnull(BB.limit))
- BB.limit++
qdel(O)
/obj/item/spellbook/proc/GetCategoryHeader(category)
diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm
deleted file mode 100644
index 455164e9064..00000000000
--- a/code/modules/antagonists/xeno/xeno.dm
+++ /dev/null
@@ -1,38 +0,0 @@
-/datum/team/xeno
- name = "Aliens"
-
-//Simply lists them.
-/datum/team/xeno/roundend_report()
- var/list/parts = list()
- parts += span_header("The [name] were:")
- parts += printplayerlist(members)
- return "[parts.Join("
")]
"
-
-/datum/antagonist/xeno
- name = "Xenomorph"
- job_rank = ROLE_ALIEN
- show_in_antagpanel = FALSE
- prevent_roundtype_conversion = FALSE
- var/datum/team/xeno/xeno_team
-
-/datum/antagonist/xeno/create_team(datum/team/xeno/new_team)
- if(!new_team)
- for(var/datum/antagonist/xeno/X in GLOB.antagonists)
- if(!X.owner || !X.xeno_team)
- continue
- xeno_team = X.xeno_team
- return
- xeno_team = new
- else
- if(!istype(new_team))
- CRASH("Wrong xeno team type provided to create_team")
- xeno_team = new_team
-
-/datum/antagonist/xeno/get_team()
- return xeno_team
-
-//XENO
-/mob/living/carbon/alien/mind_initialize()
- ..()
- if(!mind.has_antag_datum(/datum/antagonist/xeno))
- mind.add_antag_datum(/datum/antagonist/xeno)
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 638b95b3dc5..98144230705 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -11,34 +11,6 @@
/turf/open/hotspot_expose(added, maxstacks, soh)
return
- var/list/air_gases = air?.gases
- if(!air_gases)
- return
-
- . = air_gases[/datum/gas/oxygen]
- var/oxy = . ? .[MOLES] : 0
- if (oxy < 0.5)
- return
- . = air_gases[/datum/gas/plasma]
- var/tox = . ? .[MOLES] : 0
- . = air_gases[/datum/gas/tritium]
- var/trit = . ? .[MOLES] : 0
- if(active_hotspot)
- if(soh)
- if(tox > 0.5 || trit > 0.5)
- if(active_hotspot.temperature < added)
- active_hotspot.temperature = added
- if(active_hotspot.volume < maxstacks)
- active_hotspot.volume = maxstacks
- return
-
- if((added > PLASMA_MINIMUM_BURN_TEMPERATURE) && (tox > 0.5 || trit > 0.5))
-
- active_hotspot = new /obj/effect/hotspot(src, maxstacks*25, added)
-
- active_hotspot.just_spawned = (current_cycle < SSair.times_fired)
- //remove just_spawned protection if no longer processing this cell
- SSair.add_to_active(src, 0)
//This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile
/obj/effect/hotspot
@@ -191,48 +163,6 @@
perform_exposure()
return
- if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1))
- qdel(src)
- return
- if(!location.air || (INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium)) || INSUFFICIENT(/datum/gas/oxygen))
- qdel(src)
- return
-
- //Not enough to burn
- if(((!location.air.gases[/datum/gas/plasma] || location.air.gases[/datum/gas/plasma][MOLES] < 0.5) && (!location.air.gases[/datum/gas/tritium] || location.air.gases[/datum/gas/tritium][MOLES] < 0.5)) || location.air.gases[/datum/gas/oxygen][MOLES] < 0.5)
- qdel(src)
- return
-
-// perform_exposure()
-
- if(bypassing)
- icon_state = "3"
- location.burn_tile()
-
- //Possible spread due to radiated heat
- if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
- var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
- for(var/t in location.atmos_adjacent_turfs)
- var/turf/open/T = t
- if(!T.active_hotspot)
- T.hotspot_expose(radiated_temperature, CELL_VOLUME/4)
-
- else
- if(volume > CELL_VOLUME*0.4)
- icon_state = "2"
- else
- icon_state = "1"
-
-// if((visual_update_tick++ % 7) == 0)
-// update_color()
-
- if(temperature > location.max_fire_temperature_sustained)
- location.max_fire_temperature_sustained = temperature
-
- if(location.heat_capacity && temperature > location.heat_capacity)
- location.to_be_destroyed = TRUE
- return TRUE
-
/obj/effect/hotspot/Destroy()
SSair.hotspots -= src
var/turf/open/T = loc
diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index a47f7fa3b9b..fe052279a64 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -85,8 +85,6 @@
/turf/temperature_expose()
return
- if(temperature > heat_capacity)
- to_be_destroyed = TRUE
/turf/proc/archive()
temperature_archived = temperature
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index db1c0f831cc..019ef019b04 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -85,7 +85,6 @@
/obj/machinery/atmospherics/components/proc/nullifyPipenet(datum/pipeline/reference)
if(!reference)
CRASH("nullifyPipenet(null) called by [type] on [COORD(src)]")
- return
var/i = parents.Find(reference)
reference.other_airs -= airs[i]
reference.other_atmosmch -= src
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 7491cf8ae75..b894ca761d2 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -112,17 +112,8 @@
if(ismonkey(occupant)) // Monkey
occupant_overlay = image(CRYOMOBS, "monkey")
- else if(isalienadult(occupant))
- if(isalienroyal(occupant)) // Queen and prae
- occupant_overlay = image(CRYOMOBS, "alienq")
- else if(isalienhunter(occupant)) // Hunter
- occupant_overlay = image(CRYOMOBS, "alienh")
- else if(isaliensentinel(occupant)) // Sentinel
- occupant_overlay = image(CRYOMOBS, "aliens")
- else // Drone or other
- occupant_overlay = image(CRYOMOBS, "aliend")
-
- else if(ishuman(occupant) || islarva(occupant) || (isanimal(occupant) && !ismegafauna(occupant))) // Mobs that are smaller than cryotube
+
+ else if(ishuman(occupant) || (isanimal(occupant) && !ismegafauna(occupant))) // Mobs that are smaller than cryotube
occupant_overlay = image(occupant.icon, occupant.icon_state)
occupant_overlay.copy_overlays(occupant)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index dc172fbc9dd..7287dbee21e 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -283,16 +283,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/can_crawl_through()
return !welded
-/obj/machinery/atmospherics/components/unary/vent_pump/attack_alien(mob/user)
- if(!welded || !(do_after(user, 20, target = src)))
- return
- user.visible_message(span_warning("[user] furiously claws at [src]!"), span_notice("I manage to clear away the stuff blocking the vent."), span_hear("I hear loud scraping noises."))
- welded = FALSE
- update_icon()
- pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir)
- pipe_vision_img.plane = ABOVE_HUD_PLANE
- playsound(loc, 'sound/blank.ogg', 100, TRUE)
-
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume
name = "large air vent"
power_channel = EQUIP
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index b5c628c297f..30315ec97f1 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -295,17 +295,6 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/can_crawl_through()
return !welded
-/obj/machinery/atmospherics/components/unary/vent_scrubber/attack_alien(mob/user)
- if(!welded || !(do_after(user, 20, target = src)))
- return
- user.visible_message(span_warning("[user] furiously claws at [src]!"), span_notice("I manage to clear away the stuff blocking the scrubber."), span_hear("I hear loud scraping noises."))
- welded = FALSE
- update_icon()
- pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir)
- pipe_vision_img.plane = ABOVE_HUD_PLANE
- playsound(loc, 'sound/blank.ogg', 100, TRUE)
-
-
/obj/machinery/atmospherics/components/unary/vent_scrubber/layer1
piping_layer = 1
icon_state = "scrub_map-1"
diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm
index e5612d67589..c3e49c91723 100644
--- a/code/modules/atmospherics/machinery/datum_pipeline.dm
+++ b/code/modules/atmospherics/machinery/datum_pipeline.dm
@@ -129,7 +129,6 @@
var/datum/pipeline/P = returnPipenet(A)
if(!P)
CRASH("null.addMember() called by [type] on [COORD(src)]")
- return
P.addMember(A, src)
diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
index 54449259256..09a8ac41669 100644
--- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
@@ -70,9 +70,9 @@
/obj/machinery/atmospherics/pipe/layer_manifold/SetInitDirections()
switch(dir)
- if(NORTH || SOUTH)
+ if(NORTH, SOUTH)
initialize_directions = NORTH|SOUTH
- if(EAST || WEST)
+ if(EAST, WEST)
initialize_directions = EAST|WEST
/obj/machinery/atmospherics/pipe/layer_manifold/isConnectable(obj/machinery/atmospherics/target, given_layer)
diff --git a/code/modules/atmospherics/multiz.dm b/code/modules/atmospherics/multiz.dm
index 45b6aad2603..b48adb6ee55 100644
--- a/code/modules/atmospherics/multiz.dm
+++ b/code/modules/atmospherics/multiz.dm
@@ -17,8 +17,8 @@
/obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion()
icon = 'icons/obj/atmos.dmi' //Just to refresh.
var/turf/T = get_turf(src)
- var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_above(T))
- var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_below(T))
+ var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(GET_TURF_ABOVE(T))
+ var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(GET_TURF_BELOW(T))
if(below)
below.pipeline_expansion() //If we've got one below us, force it to add us on facebook
if(above)
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 0b18aa467bb..46a5013abc0 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -605,7 +605,7 @@
invisibility = 0
/obj/effect/ctf/ammo/Initialize(mapload)
- ..()
+ . = ..()
QDEL_IN(src, AMMO_DROP_LIFETIME)
/obj/effect/ctf/ammo/Crossed(atom/movable/AM)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index e800eef4453..af8472be0ef 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -253,12 +253,6 @@
/obj/effect/mob_spawn/slime/equip(mob/living/simple_animal/slime/S)
S.colour = mobcolour
-/obj/effect/mob_spawn/facehugger/create(ckey) //Creates a squashed facehugger
- var/obj/item/clothing/mask/facehugger/O = new(src.loc) //variable O is a new facehugger at the location of the landmark
- O.name = src.name
- O.Die() //call the facehugger's death proc
- qdel(src)
-
/obj/effect/mob_spawn/mouse
name = "sleeper"
mob_type = /mob/living/simple_animal/mouse
diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm
index 565119a4d47..306c38fb8f7 100644
--- a/code/modules/awaymissions/mission_code/Cabin.dm
+++ b/code/modules/awaymissions/mission_code/Cabin.dm
@@ -44,7 +44,7 @@
var/active = 1
/obj/structure/firepit/Initialize()
- ..()
+ . = ..()
toggleFirepit()
/obj/structure/firepit/interact(mob/living/user)
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index c9e2fc8c8ba..523a43095c0 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -520,7 +520,6 @@
/obj/item/twohanded/fireaxe = 25,
/obj/item/organ/brain/alien = 17,
/obj/item/twohanded/dualsaber = 15,
- /obj/item/organ/heart/demon = 7,
/obj/item/gun/ballistic/automatic/c20r/unrestricted = 16,
/obj/item/gun/magic/wand/resurrection/inert = 15,
/obj/item/gun/magic/wand/resurrection = 10,
diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm
index c61cddf4650..41057c38348 100644
--- a/code/modules/awaymissions/signpost.dm
+++ b/code/modules/awaymissions/signpost.dm
@@ -39,9 +39,6 @@
/obj/structure/signpost/attack_hulk(mob/user)
return
-/obj/structure/signpost/attack_larva(mob/user)
- return interact(user)
-
/obj/structure/signpost/attack_robot(mob/user)
if (Adjacent(user))
return interact(user)
diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm
index 72fc59d085f..475b8a1bd3c 100644
--- a/code/modules/awaymissions/super_secret_room.dm
+++ b/code/modules/awaymissions/super_secret_room.dm
@@ -98,8 +98,6 @@
/obj/structure/speaking_tile/attack_hulk(mob/user)
return
-/obj/structure/speaking_tile/attack_larva(mob/user)
- return interact(user)
/obj/structure/speaking_tile/attack_ai(mob/user)
return interact(user)
diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm
index e0fdf47faf9..6391715c9f5 100644
--- a/code/modules/buildmode/submodes/basic.dm
+++ b/code/modules/buildmode/submodes/basic.dm
@@ -22,7 +22,7 @@
if(istype(object,/turf) && left_click && !alt_click && !ctrl_click)
to_chat(src, span_notice("Basic mode is only partially funcational, please use Adv. Build."))
return
- var/turf/T = object
+/* var/turf/T = object
if(isspaceturf(object))
T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
else if(isplatingturf(object))
@@ -32,7 +32,7 @@
else if(iswallturf(object))
T.PlaceOnTop(/turf/closed/wall/r_wall)
log_admin("Build Mode: [key_name(c)] built [T] at [AREACOORD(T)]")
- return
+ return */
else if(right_click)
log_admin("Build Mode: [key_name(c)] deleted [object] at [AREACOORD(object)]")
if(isturf(object))
diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm
deleted file mode 100644
index c3c4d16fe5f..00000000000
--- a/code/modules/cargo/bounties/assistant.dm
+++ /dev/null
@@ -1,204 +0,0 @@
-/datum/bounty/item/assistant/strange_object
- name = "Strange Object"
- description = "Nanotrasen has taken an interest in strange objects. Find one in maint, and ship it off to CentCom right away."
- reward = 1200
- wanted_types = list(/obj/item/relic)
-
-/datum/bounty/item/assistant/scooter
- name = "Scooter"
- description = "Nanotrasen has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up."
- reward = 1080 // the mat hoffman
- wanted_types = list(/obj/vehicle/ridden/scooter)
- include_subtypes = FALSE
-
-/datum/bounty/item/assistant/skateboard
- name = "Skateboard"
- description = "Nanotrasen has determined walking to be wasteful. Ship a skateboard to CentCom to speed operations up."
- reward = 900 // the tony hawk
- wanted_types = list(/obj/vehicle/ridden/scooter/skateboard, /obj/item/melee/skateboard)
-
-/datum/bounty/item/assistant/stunprod
- name = "Stunprod"
- description = "CentCom demands a stunprod to use against dissidents. Craft one, then ship it."
- reward = 1300
- wanted_types = list(/obj/item/melee/baton/cattleprod)
-
-/datum/bounty/item/assistant/soap
- name = "Soap"
- description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs."
- reward = 2000
- required_count = 3
- wanted_types = list(/obj/item/soap)
-
-/datum/bounty/item/assistant/spear
- name = "Spears"
- description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears."
- reward = 2000
- required_count = 5
- wanted_types = list(/obj/item/twohanded/spear)
-
-/datum/bounty/item/assistant/toolbox
- name = "Toolboxes"
- description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution."
- reward = 2000
- required_count = 6
- wanted_types = list(/obj/item/storage/toolbox)
-
-/datum/bounty/item/assistant/statue
- name = "Statue"
- description = "Central Command would like to commision an artsy statue for the lobby. Ship one out, when possible."
- reward = 2000
- wanted_types = list(/obj/structure/statue)
-
-/datum/bounty/item/assistant/clown_box
- name = "Clown Box"
- description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out."
- reward = 1500
- wanted_types = list(/obj/item/storage/box/clown)
-
-/datum/bounty/item/assistant/cheesiehonkers
- name = "Cheesie Honkers"
- description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!"
- reward = 1200
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/cheesiehonkers)
-
-/datum/bounty/item/assistant/baseball_bat
- name = "Baseball Bat"
- description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream."
- reward = 2000
- required_count = 5
- wanted_types = list(/obj/item/melee/baseball_bat)
-
-/datum/bounty/item/assistant/extendohand
- name = "Extendo-Hand"
- description = "Commander Betsy is getting old, and can't bend over to get the telescreen remote anymore. Management has requested an extendo-hand to help her out."
- reward = 2500
- wanted_types = list(/obj/item/extendohand)
-
-/datum/bounty/item/assistant/donut
- name = "Donuts"
- description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale."
- reward = 3000
- required_count = 10
- wanted_types = list(/obj/item/reagent_containers/food/snacks/donut)
-
-/datum/bounty/item/assistant/donkpocket
- name = "Donk-Pockets"
- description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentCom immediately."
- reward = 3000
- required_count = 10
- wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket)
-
-/datum/bounty/item/assistant/briefcase
- name = "Briefcase"
- description = "Central Command will be holding a business convention this year. Ship a few briefcases in support."
- reward = 2500
- required_count = 5
- wanted_types = list(/obj/item/storage/briefcase, /obj/item/storage/secure/briefcase)
-
-/datum/bounty/item/assistant/sunglasses
- name = "Sunglasses"
- description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this."
- reward = 3000
- required_count = 2
- wanted_types = list(/obj/item/clothing/glasses/sunglasses)
-
-/datum/bounty/item/assistant/monkey_hide
- name = "Monkey Hide"
- description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it."
- reward = 1500
- wanted_types = list(/obj/item/stack/sheet/animalhide/monkey)
-
-/datum/bounty/item/assistant/shard
- name = "Shards"
- description = "A killer clown has been stalking CentCom, and staff have been unable to catch her because she's not wearing shoes. Please ship some shards so that a booby trap can be constructed."
- reward = 1500
- required_count = 15
- wanted_types = list(/obj/item/shard)
-
-/datum/bounty/item/assistant/comfy_chair
- name = "Comfy Chairs"
- description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him."
- reward = 1500
- required_count = 5
- wanted_types = list(/obj/structure/chair/comfy)
-
-/datum/bounty/item/assistant/shadyjims
- name = "Shady Jim's"
- description = "There's an irate officer at CentCom demanding that he receive a box of Shady Jim's cigarettes. Please ship one. He's starting to make threats."
- reward = 500
- wanted_types = list(/obj/item/storage/fancy/cigarettes/cigpack_shadyjims)
-
-/datum/bounty/item/assistant/potted_plants
- name = "Potted Plants"
- description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants."
- reward = 2000
- required_count = 8
- wanted_types = list(/obj/item/twohanded/required/kirbyplants)
-
-/datum/bounty/item/assistant/earmuffs
- name = "Earmuffs"
- description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance."
- reward = 1000
- wanted_types = list(/obj/item/clothing/ears/earmuffs)
-
-/datum/bounty/item/assistant/handcuffs
- name = "Handcuffs"
- description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)."
- reward = 1000
- required_count = 5
- wanted_types = list(/obj/item/restraints/handcuffs)
-
-/datum/bounty/item/assistant/monkey_cubes
- name = "Monkey Cubes"
- description = "Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes."
- reward = 2000
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube)
-
-/datum/bounty/item/assistant/chainsaw
- name = "Chainsaw"
- description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please."
- reward = 2500
- wanted_types = list(/obj/item/twohanded/required/chainsaw)
-
-/datum/bounty/item/assistant/ied
- name = "IED"
- description = "Nanotrasen's maximum security prison at CentCom is undergoing personnel training. Ship a handful of IEDs to serve as a training tools."
- reward = 2000
- required_count = 3
- wanted_types = list(/obj/item/grenade/iedcasing)
-
-/datum/bounty/item/assistant/corgimeat
- name = "Raw Corgi Meat"
- description = "The Syndicate recently stole all of CentCom's Corgi meat. Ship out a replacement immediately."
- reward = 3000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi)
-
-/datum/bounty/item/assistant/corgifarming
- name = "Corgi Hides"
- description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine."
- reward = 30000 //that's a lot of dead dogs
- required_count = 12
- wanted_types = list(/obj/item/stack/sheet/animalhide/corgi)
-
-/datum/bounty/item/assistant/action_figures
- name = "Action Figures"
- description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints."
- reward = 4000
- required_count = 5
- wanted_types = list(/obj/item/toy/figure)
-
-/datum/bounty/item/assistant/tail_whip
- name = "Nine Tails whip"
- description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails."
- reward = 4000
- wanted_types = list(/obj/item/melee/chainofcommand/tailwhip)
-
-/datum/bounty/item/assistant/dead_mice
- name = "Dead Mice"
- description = "Station 14 ran out of freeze-dried mice. Ship some fresh ones so their janitor doesn't go on strike."
- reward = 5000
- required_count = 5
- wanted_types = list(/obj/item/reagent_containers/food/snacks/deadmouse)
diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm
deleted file mode 100644
index 285132a1c26..00000000000
--- a/code/modules/cargo/bounties/chef.dm
+++ /dev/null
@@ -1,131 +0,0 @@
-/datum/bounty/item/chef/birthday_cake
- name = "Birthday Cake"
- description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!"
- reward = 4000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday)
-
-/datum/bounty/item/chef/soup
- name = "Soup"
- description = "To quell the homeless uprising, Nanotrasen will be serving soup to all underpaid workers. Ship any type of soup."
- reward = 3000
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/soup)
-
-/datum/bounty/item/chef/popcorn
- name = "Popcorn Bags"
- description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion."
- reward = 3000
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn)
-
-/datum/bounty/item/chef/onionrings
- name = "Onion Rings"
- description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support."
- reward = 3000
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings)
-
-/datum/bounty/item/chef/icecreamsandwich
- name = "Ice Cream Sandwiches"
- description = "Upper management has been screaming non-stop for ice cream. Please send some."
- reward = 4000
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/icecreamsandwich)
-
-/datum/bounty/item/chef/bread
- name = "Bread"
- description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions."
- reward = 1000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread)
-
-/datum/bounty/item/chef/pie
- name = "Pie"
- description = "3.14159? No! CentCom management wants edible pie! Ship a whole one."
- reward = 3142
- wanted_types = list(/obj/item/reagent_containers/food/snacks/pie)
-
-/datum/bounty/item/chef/salad
- name = "Salad or Rice Bowls"
- description = "CentCom management is going on a health binge. Your order is to ship salad or rice bowls."
- reward = 3000
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/salad)
-
-/datum/bounty/item/chef/carrotfries
- name = "Carrot Fries"
- description = "Night sight can mean life or death! A shipment of carrot fries is the order."
- reward = 3500
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries)
-
-/datum/bounty/item/chef/superbite
- name = "Super Bite Burger"
- description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him."
- reward = 12000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/burger/superbite)
-
-/datum/bounty/item/chef/poppypretzel
- name = "Poppy Pretzel"
- description = "Central Command needs a reason to fire their HR head. Send over a poppy pretzel to force a failed drug test."
- reward = 3000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/poppypretzel)
-
-/datum/bounty/item/chef/cubancarp
- name = "Cuban Carp"
- description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom."
- reward = 8000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp)
-
-/datum/bounty/item/chef/hotdog
- name = "Hot Dog"
- description = "Nanotrasen is conducting taste tests to determine the best hot dog recipe. Ship your station's version to participate."
- reward = 8000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog)
-
-/datum/bounty/item/chef/eggplantparm
- name = "Eggplant Parmigianas"
- description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!"
- reward = 3500
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm)
-
-/datum/bounty/item/chef/muffin
- name = "Muffins"
- description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this."
- reward = 3000
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/muffin)
-
-/datum/bounty/item/chef/chawanmushi
- name = "Chawanmushi"
- description = "Nanotrasen wants to improve relations with its sister company, Japanotrasen. Ship Chawanmushi immediately."
- reward = 8000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/chawanmushi)
-
-/datum/bounty/item/chef/kebab
- name = "Kebabs"
- description = "Remove all kebab from station you are best food. Ship to CentCom to remove from the premises."
- reward = 3500
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab)
-
-/datum/bounty/item/chef/soylentgreen
- name = "Soylent Green"
- description = "CentCom has heard wonderful things about the product 'Soylent Green', and would love to try some. If you endulge them, expect a pleasant bonus."
- reward = 5000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/soylentgreen)
-
-/datum/bounty/item/chef/pancakes
- name = "Pancakes"
- description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen."
- reward = 5000
- required_count = 13
- wanted_types = list(/obj/item/reagent_containers/food/snacks/pancakes)
-
-/datum/bounty/item/chef/nuggies
- name = "Chicken Nuggets"
- description = "The vice president's son won't shut up about chicken nuggies. Would you mind shipping some?"
- reward = 4000
- required_count = 6
- wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget)
-
diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm
deleted file mode 100644
index 77687977d7f..00000000000
--- a/code/modules/cargo/bounties/engineering.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-/datum/bounty/item/engineering/gas
- name = "Full Tank of Pluoxium"
- description = "CentCom RnD is researching extra compact internals. Ship us a tank full of Pluoxium and you'll be compensated."
- reward = 7500
- wanted_types = list(/obj/item/tank)
- var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact.
- var/gas_type = /datum/gas/pluoxium
-
-/datum/bounty/item/engineering/gas/applies_to(obj/O)
- if(!..())
- return FALSE
- var/obj/item/tank/T = O
- if(!T.air_contents.gases[gas_type])
- return FALSE
- return T.air_contents.gases[gas_type][MOLES] >= moles_required
-
-/datum/bounty/item/engineering/gas/nitryl_tank
- name = "Full Tank of Nitryl"
- description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started."
- gas_type = /datum/gas/nitryl
-
-/datum/bounty/item/engineering/gas/tritium_tank
- name = "Full Tank of Tritium"
- description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium."
- gas_type = /datum/gas/tritium
-
-/datum/bounty/item/engineering/energy_ball
- name = "Contained Tesla Ball"
- description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper."
- reward = 75000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle
- wanted_types = list(/obj/singularity/energy_ball)
-
-/datum/bounty/item/engineering/energy_ball/applies_to(obj/O)
- if(!..())
- return FALSE
- var/obj/singularity/energy_ball/T = O
- return !T.miniball
diff --git a/code/modules/cargo/bounties/item.dm b/code/modules/cargo/bounties/item.dm
deleted file mode 100644
index b2586d7c5ba..00000000000
--- a/code/modules/cargo/bounties/item.dm
+++ /dev/null
@@ -1,39 +0,0 @@
-/datum/bounty/item
- var/required_count = 1
- var/shipped_count = 0
- var/list/wanted_types // Types accepted for the bounty.
- var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type.
- var/list/exclude_types // Types excluded.
-
-/datum/bounty/item/New()
- ..()
- wanted_types = typecacheof(wanted_types)
- exclude_types = typecacheof(exclude_types)
-
-/datum/bounty/item/completion_string()
- return {"[shipped_count]/[required_count]"}
-
-/datum/bounty/item/can_claim()
- return ..() && shipped_count >= required_count
-
-/datum/bounty/item/applies_to(obj/O)
- if(!include_subtypes && !(O.type in wanted_types))
- return FALSE
- if(include_subtypes && (!is_type_in_typecache(O, wanted_types) || is_type_in_typecache(O, exclude_types)))
- return FALSE
- if(O.flags_1 & HOLOGRAM_1)
- return FALSE
- return shipped_count < required_count
-
-/datum/bounty/item/ship(obj/O)
- if(!applies_to(O))
- return
- if(istype(O,/obj/item/stack))
- var/obj/item/stack/O_is_a_stack = O
- shipped_count += O_is_a_stack.amount
- else
- shipped_count += 1
-
-/datum/bounty/item/compatible_with(datum/other_bounty)
- return type != other_bounty.type
-
diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm
deleted file mode 100644
index 62c846ea96a..00000000000
--- a/code/modules/cargo/bounties/mech.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-/datum/bounty/item/mech/New()
- ..()
- description = "Upper management has requested one [name] mech be sent as soon as possible. Ship it to receive a large payment."
-
-/datum/bounty/item/mech/ship(obj/O)
- if(!applies_to(O))
- return
- if(istype(O, /obj/mecha))
- var/obj/mecha/M = O
- M.wreckage = null // So the mech doesn't explode.
- ..()
-
-/datum/bounty/item/mech/mark_high_priority(scale_reward)
- return ..(max(scale_reward * 0.7, 1.2))
-
-/datum/bounty/item/mech/ripleymkii
- name = "APLU MK-II \"Ripley\""
- reward = 13000
- wanted_types = list(/obj/mecha/working/ripley/mkii)
-
-/datum/bounty/item/mech/firefighter
- name = "APLU \"Firefighter\""
- reward = 18000
- wanted_types = list(/obj/mecha/working/ripley/firefighter)
-
-/datum/bounty/item/mech/odysseus
- name = "Odysseus"
- reward = 11000
- wanted_types = list(/obj/mecha/medical/odysseus)
-
-/datum/bounty/item/mech/gygax
- name = "Gygax"
- reward = 28000
- wanted_types = list(/obj/mecha/combat/gygax)
-
-/datum/bounty/item/mech/durand
- name = "Durand"
- reward = 20000
- wanted_types = list(/obj/mecha/combat/durand)
-
-/datum/bounty/item/mech/phazon
- name = "Phazon"
- reward = 50000
- wanted_types = list(/obj/mecha/combat/phazon)
diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm
deleted file mode 100644
index d1397759695..00000000000
--- a/code/modules/cargo/bounties/medical.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-/datum/bounty/item/medical/heart
- name = "Heart"
- description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto!"
- reward = 3000
- wanted_types = list(/obj/item/organ/heart)
-
-/datum/bounty/item/medical/lung
- name = "Lungs"
- description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded."
- reward = 10000
- required_count = 3
- wanted_types = list(/obj/item/organ/lungs)
-
-/datum/bounty/item/medical/appendix
- name = "Appendix"
- description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay."
- reward = 5000 //there are no synthetic appendixes
- wanted_types = list(/obj/item/organ/appendix)
-
-/datum/bounty/item/medical/ears
- name = "Ears"
- description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears."
- reward = 10000
- required_count = 3
- wanted_types = list(/obj/item/organ/ears)
-
-/datum/bounty/item/medical/liver
- name = "Livers"
- description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting with Third Soviet Union ambassadors. Help us out, will you?"
- reward = 10000
- required_count = 3
- wanted_types = list(/obj/item/organ/liver)
-
-/datum/bounty/item/medical/eye
- name = "Organic Eyes"
- description = "Station 5's Research Director Willem is requesting a few pairs of non-robotic eyes. Don't ask questions, just ship them."
- reward = 10000
- required_count = 3
- wanted_types = list(/obj/item/organ/eyes)
- exclude_types = list(/obj/item/organ/eyes/robotic)
-
-/datum/bounty/item/medical/tongue
- name = "Tongues"
- description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues."
- reward = 10000
- required_count = 3
- wanted_types = list(/obj/item/organ/tongue)
-
-/datum/bounty/item/medical/lizard_tail
- name = "Lizard Tail"
- description = "The Wizard Federation has made off with Nanotrasen's supply of lizard tails. While CentCom is dealing with the wizards, can the station spare a tail of their own?"
- reward = 3000
- wanted_types = list(/obj/item/organ/tail/lizard)
-
-/datum/bounty/item/medical/cat_tail
- name = "Cat Tail"
- description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?"
- reward = 3000
- wanted_types = list(/obj/item/organ/tail/cat)
diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm
deleted file mode 100644
index 1b8b46734fe..00000000000
--- a/code/modules/cargo/bounties/mining.dm
+++ /dev/null
@@ -1,51 +0,0 @@
-/datum/bounty/item/mining/goliath_steaks
- name = "Lava-Cooked Goliath Steaks"
- description = "Admiral Pavlov has gone on hunger strike ever since the canteen started serving only monkey and monkey byproducts. She is demanding lava-cooked Goliath steaks."
- reward = 5000
- required_count = 3
- wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/steak/goliath)
-
-/datum/bounty/item/mining/goliath_boat
- name = "Goliath Hide Boat"
- description = "Commander Menkov wants to participate in the annual Lavaland Regatta. He is asking your shipwrights to build the swiftest boat known to man."
- reward = 10000
- wanted_types = list(/obj/vehicle/ridden/lavaboat)
-
-/datum/bounty/item/mining/bone_oar
- name = "Bone Oars"
- description = "Commander Menkov requires oars to participate in the annual Lavaland Regatta. Ship a pair over."
- reward = 4000
- required_count = 2
- wanted_types = list(/obj/item/oar)
-
-/datum/bounty/item/mining/bone_axe
- name = "Bone Axe"
- description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement."
- reward = 7500
- wanted_types = list(/obj/item/twohanded/fireaxe/boneaxe)
-
-/datum/bounty/item/mining/bone_armor
- name = "Bone Armor"
- description = "Station 14 has volunteered their lizard crew for ballistic armor testing. Ship over some bone armor."
- reward = 5000
- wanted_types = list(/obj/item/clothing/suit/armor/bone)
-
-/datum/bounty/item/mining/skull_helmet
- name = "Skull Helmet"
- description = "Station 42's Head of Security has her birthday tomorrow! We want to suprise her with a fashionable skull helmet."
- reward = 4000
- wanted_types = list(/obj/item/clothing/head/helmet/skull)
-
-/datum/bounty/item/mining/bone_talisman
- name = "Bone Talismans"
- description = "Station 14's Research Director claims that pagan bone talismans protect their wearer. Ship them a few so they can start testing."
- reward = 7500
- required_count = 3
- wanted_types = list(/obj/item/clothing/accessory/talisman)
-
-/datum/bounty/item/mining/bone_dagger
- name = "Bone Daggers"
- description = "Central Command's canteen is undergoing budget cuts. Ship over some bone daggers so our Chef can keep working."
- reward = 5000
- required_count = 3
- wanted_types = list(/obj/item/kitchen/knife/combat/bone)
diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm
deleted file mode 100644
index 11a166548a3..00000000000
--- a/code/modules/cargo/bounties/reagent.dm
+++ /dev/null
@@ -1,258 +0,0 @@
-/datum/bounty/reagent
- var/required_volume = 10
- var/shipped_volume = 0
- var/datum/reagent/wanted_reagent
-
-/datum/bounty/reagent/completion_string()
- return {"[round(shipped_volume)]/[required_volume] Units"}
-
-/datum/bounty/reagent/can_claim()
- return ..() && shipped_volume >= required_volume
-
-/datum/bounty/reagent/applies_to(obj/O)
- if(!istype(O, /obj/item/reagent_containers))
- return FALSE
- if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type))
- return FALSE
- if(O.flags_1 & HOLOGRAM_1)
- return FALSE
- return shipped_volume < required_volume
-
-/datum/bounty/reagent/ship(obj/O)
- if(!applies_to(O))
- return
- shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type)
- if(shipped_volume > required_volume)
- shipped_volume = required_volume
-
-/datum/bounty/reagent/compatible_with(other_bounty)
- if(!istype(other_bounty, /datum/bounty/reagent))
- return TRUE
- var/datum/bounty/reagent/R = other_bounty
- return wanted_reagent.type != R.wanted_reagent.type
-
-/datum/bounty/reagent/simple_drink
- name = "Simple Drink"
- reward = 1500
-
-/datum/bounty/reagent/simple_drink/New()
- // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped.
- var/static/list/possible_reagents = list(\
- /datum/reagent/consumable/ethanol/antifreeze,\
- /datum/reagent/consumable/ethanol/andalusia,\
- /datum/reagent/consumable/tea/arnold_palmer,\
- /datum/reagent/consumable/ethanol/b52,\
- /datum/reagent/consumable/ethanol/bananahonk,\
- /datum/reagent/consumable/ethanol/beepsky_smash,\
- /datum/reagent/consumable/ethanol/between_the_sheets,\
- /datum/reagent/consumable/ethanol/bilk,\
- /datum/reagent/consumable/ethanol/black_russian,\
- /datum/reagent/consumable/ethanol/bloody_mary,\
- /datum/reagent/consumable/ethanol/brave_bull,\
- /datum/reagent/consumable/ethanol/martini,\
- /datum/reagent/consumable/ethanol/cuba_libre,\
- /datum/reagent/consumable/ethanol/eggnog,\
- /datum/reagent/consumable/ethanol/erikasurprise,\
- /datum/reagent/consumable/ethanol/ginfizz,\
- /datum/reagent/consumable/ethanol/gintonic,\
- /datum/reagent/consumable/ethanol/grappa,\
- /datum/reagent/consumable/ethanol/grog,\
- /datum/reagent/consumable/ethanol/hooch,\
- /datum/reagent/consumable/ethanol/iced_beer,\
- /datum/reagent/consumable/ethanol/irishcarbomb,\
- /datum/reagent/consumable/ethanol/manhattan,\
- /datum/reagent/consumable/ethanol/margarita,\
- /datum/reagent/consumable/ethanol/gargle_blaster,\
- /datum/reagent/consumable/ethanol/rum_coke,\
- /datum/reagent/consumable/ethanol/screwdrivercocktail,\
- /datum/reagent/consumable/ethanol/snowwhite,\
- /datum/reagent/consumable/soy_latte,\
- /datum/reagent/consumable/cafe_latte,\
- /datum/reagent/consumable/ethanol/syndicatebomb,\
- /datum/reagent/consumable/ethanol/tequila_sunrise,\
- /datum/reagent/consumable/ethanol/manly_dorf,\
- /datum/reagent/consumable/ethanol/thirteenloko,\
- /datum/reagent/consumable/triple_citrus,\
- /datum/reagent/consumable/ethanol/vodkamartini,\
- /datum/reagent/consumable/ethanol/whiskeysoda,\
- /datum/reagent/consumable/ethanol/beer/green,\
- /datum/reagent/consumable/ethanol/demonsblood,\
- /datum/reagent/consumable/ethanol/crevice_spike,\
- /datum/reagent/consumable/ethanol/singulo,\
- /datum/reagent/consumable/ethanol/whiskey_sour)
-
- var/reagent_type = pick(possible_reagents)
- wanted_reagent = new reagent_type
- name = wanted_reagent.name
- description = "CentCom is thirsty! Send a shipment of [name] to CentCom to quench the company's thirst."
- reward += rand(0, 2) * 500
-
-/datum/bounty/reagent/complex_drink
- name = "Complex Drink"
- reward = 4000
-
-/datum/bounty/reagent/complex_drink/New()
- // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped.
- var/static/list/possible_reagents = list(\
- /datum/reagent/consumable/ethanol/atomicbomb,\
- /datum/reagent/consumable/ethanol/bacchus_blessing,\
- /datum/reagent/consumable/ethanol/bastion_bourbon,\
- /datum/reagent/consumable/ethanol/booger,\
- /datum/reagent/consumable/ethanol/hippies_delight,\
- /datum/reagent/consumable/ethanol/drunkenblumpkin,\
- /datum/reagent/consumable/ethanol/fetching_fizz,\
- /datum/reagent/consumable/ethanol/goldschlager,\
- /datum/reagent/consumable/ethanol/manhattan_proj,\
- /datum/reagent/consumable/ethanol/narsour,\
- /datum/reagent/consumable/ethanol/neurotoxin,\
- /datum/reagent/consumable/ethanol/patron,\
- /datum/reagent/consumable/ethanol/quadruple_sec,\
- /datum/reagent/consumable/bluecherryshake,\
- /datum/reagent/consumable/doctor_delight,\
- /datum/reagent/consumable/ethanol/silencer,\
- /datum/reagent/consumable/ethanol/peppermint_patty,\
- /datum/reagent/consumable/ethanol/aloe,\
- /datum/reagent/consumable/pumpkin_latte)
-
- var/reagent_type = pick(possible_reagents)
- wanted_reagent = new reagent_type
- name = wanted_reagent.name
- description = "CentCom is offering a reward for talented mixologists. Ship a container of [name] to claim the prize."
- reward += rand(0, 4) * 500
-
-/datum/bounty/reagent/chemical_simple
- name = "Simple Chemical"
- reward = 4000
- required_volume = 30
-
-/datum/bounty/reagent/chemical_simple/New()
- // Chemicals that can be mixed by a single skilled Chemist.
- var/static/list/possible_reagents = list(\
- /datum/reagent/medicine/leporazine,\
- /datum/reagent/medicine/clonexadone,\
- /datum/reagent/medicine/mine_salve,\
- /datum/reagent/medicine/C2/convermol,\
- /datum/reagent/medicine/ephedrine,\
- /datum/reagent/medicine/diphenhydramine,\
- /datum/reagent/drug/space_drugs,\
- /datum/reagent/drug/crank,\
- /datum/reagent/gunpowder,\
- /datum/reagent/napalm,\
- /datum/reagent/firefighting_foam,\
- /datum/reagent/consumable/mayonnaise,\
- /datum/reagent/toxin/itching_powder,\
- /datum/reagent/toxin/cyanide,\
- /datum/reagent/toxin/heparin,\
- /datum/reagent/medicine/pen_acid,\
- /datum/reagent/medicine/atropine,\
- /datum/reagent/drug/aranesp,\
- /datum/reagent/drug/krokodil,\
- /datum/reagent/drug/methamphetamine,\
- /datum/reagent/teslium,\
- /datum/reagent/toxin/anacea,\
- /datum/reagent/pax)
-
- var/reagent_type = pick(possible_reagents)
- wanted_reagent = new reagent_type
- name = wanted_reagent.name
- description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded."
- reward += rand(0, 4) * 500 //4000 to 6000 credits
-
-/datum/bounty/reagent/chemical_complex
- name = "Rare Chemical"
- reward = 6000
- required_volume = 20
-
-/datum/bounty/reagent/chemical_complex/New()
- // Reagents that require interaction with multiple departments or are a pain to mix. Lower required_volume since acquiring 30u of some is unrealistic
- var/static/list/possible_reagents = list(\
- /datum/reagent/medicine/pyroxadone,\
- /datum/reagent/medicine/rezadone,\
- /datum/reagent/medicine/regen_jelly,\
- /datum/reagent/drug/bath_salts,\
- /datum/reagent/hair_dye,\
- /datum/reagent/consumable/honey,\
- /datum/reagent/consumable/frostoil,\
- /datum/reagent/toxin/slimejelly,\
- /datum/reagent/teslium/energized_jelly,\
- /datum/reagent/toxin/mimesbane,\
- /datum/reagent/medicine/strange_reagent,\
- /datum/reagent/nitroglycerin,\
- /datum/reagent/medicine/rezadone,\
- /datum/reagent/toxin/zombiepowder,\
- /datum/reagent/toxin/ghoulpowder,\
- /datum/reagent/mulligan)
-
- var/reagent_type = pick(possible_reagents)
- wanted_reagent = new reagent_type
- name = wanted_reagent.name
- description = "CentCom is paying premium for the chemical [name]. Ship a container of it to be rewarded."
- reward += rand(0, 5) * 750 //6000 to 9750 credits
-
-/datum/bounty/pill
- /// quantity of the pills needed, this value acts as minimum, gets randomized on new()
- var/required_ammount = 80
- /// counter for pills sent
- var/shipped_ammount = 0
- /// reagent requested
- var/datum/reagent/wanted_reagent
- /// minimum volume of chemical needed, gets randomized on new()
- var/wanted_vol = 30
-
-/datum/bounty/pill/completion_string()
- return {"[shipped_ammount]/[required_ammount] pills"}
-
-/datum/bounty/pill/can_claim()
- return ..() && shipped_ammount >= required_ammount
-
-/datum/bounty/pill/applies_to(obj/O)
- if(!istype(O, /obj/item/reagent_containers/pill))
- return FALSE
- if(O?.reagents.get_reagent_amount(wanted_reagent.type) >= wanted_vol)
- return TRUE
- return FALSE
-
-/datum/bounty/pill/ship(obj/O)
- if(!applies_to(O))
- return
- shipped_ammount += 1
- if(shipped_ammount > required_ammount)
- shipped_ammount = required_ammount
-
-/datum/bounty/pill/compatible_with(other_bounty)
- if(!istype(other_bounty, /datum/bounty/pill/simple_pill))
- return TRUE
- var/datum/bounty/pill/simple_pill/P = other_bounty
- return (wanted_reagent.type == P.wanted_reagent.type) && (wanted_vol == P.wanted_vol)
-
-/datum/bounty/pill/simple_pill
- name = "Simple Pill"
- reward = 10000
-
-/datum/bounty/pill/simple_pill/New()
- //reagent that are possible to be chem factory'd
- var/static/list/possible_reagents = list(\
- /datum/reagent/medicine/spaceacillin,\
- /datum/reagent/medicine/C2/instabitaluri,\
- /datum/reagent/medicine/pen_acid,\
- /datum/reagent/medicine/atropine,\
- /datum/reagent/medicine/cryoxadone,\
- /datum/reagent/medicine/salbutamol,\
- /datum/reagent/medicine/rhigoxane,\
- /datum/reagent/medicine/trophazole,\
- /datum/reagent/drug/methamphetamine,\
- /datum/reagent/drug/crank,\
- /datum/reagent/nitrous_oxide,\
- /datum/reagent/barbers_aid,\
- /datum/reagent/pax,\
- /datum/reagent/flash_powder,\
- /datum/reagent/phlogiston,\
- /datum/reagent/firefighting_foam)
-
- var/datum/reagent/reagent_type = pick(possible_reagents)
- wanted_reagent = new reagent_type
- name = "[wanted_reagent.name] pills"
- required_ammount += rand(1,60)
- wanted_vol += rand(1,20)
- description = "CentCom requires [required_ammount] of [name] containing at least [wanted_vol] each. Ship a container of it to be rewarded."
- reward += rand(1, 5) * 3000
diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm
deleted file mode 100644
index 33f334ac472..00000000000
--- a/code/modules/cargo/bounties/science.dm
+++ /dev/null
@@ -1,66 +0,0 @@
-/datum/bounty/item/science/boh
- name = "Bag of Holding"
- description = "Nanotrasen would make good use of high-capacity backpacks. If you have any, please ship them."
- reward = 10000
- wanted_types = list(/obj/item/storage/backpack/holding)
-
-/datum/bounty/item/science/tboh
- name = "Trash Bag of Holding"
- description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them."
- reward = 10000
- wanted_types = list(/obj/item/storage/backpack/holding)
-
-/datum/bounty/item/science/bluespace_syringe
- name = "Bluespace Syringe"
- description = "Nanotrasen would make good use of high-capacity syringes. If you have any, please ship them."
- reward = 10000
- wanted_types = list(/obj/item/reagent_containers/syringe/bluespace)
-
-/datum/bounty/item/science/bluespace_body_bag
- name = "Bluespace Body Bag"
- description = "Nanotrasen would make good use of high-capacity body bags. If you have any, please ship them."
- reward = 10000
- wanted_types = list(/obj/item/bodybag/bluespace)
-
-/datum/bounty/item/science/nightvision_goggles
- name = "Night Vision Goggles"
- description = "An electrical storm has busted all the lights at CentCom. While management is waiting for replacements, perhaps some night vision goggles can be shipped?"
- reward = 10000
- wanted_types = list(/obj/item/clothing/glasses/night, /obj/item/clothing/glasses/meson/night, /obj/item/clothing/glasses/hud/health/night, /obj/item/clothing/glasses/hud/security/night, /obj/item/clothing/glasses/hud/diagnostic/night)
-
-/datum/bounty/item/science/experimental_welding_tool
- name = "Experimental Welding Tool"
- description = "A recent accident has left most of CentCom's welding tools exploded. Ship replacements to be rewarded."
- reward = 10000
- required_count = 3
- wanted_types = list(/obj/item/weldingtool/experimental)
-
-/datum/bounty/item/science/cryostasis_beaker
- name = "Cryostasis Beaker"
- description = "Chemists at Central Command have discovered a new chemical that can only be held in cryostasis beakers. The only problem is they don't have any! Rectify this to receive payment."
- reward = 10000
- wanted_types = list(/obj/item/reagent_containers/glass/beaker/noreact)
-
-/datum/bounty/item/science/diamond_drill
- name = "Diamond Mining Drill"
- description = "Central Command is willing to pay three months salary in exchange for one diamond mining drill."
- reward = 15000
- wanted_types = list(/obj/item/pickaxe/drill/diamonddrill, /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill)
-
-/datum/bounty/item/science/floor_buffer
- name = "Floor Buffer Upgrade"
- description = "One of CentCom's janitors made a small fortune betting on carp races. Now they'd like to commission an upgrade to their floor buffer."
- reward = 10000
- wanted_types = list(/obj/item/janiupgrade)
-
-/datum/bounty/item/science/advanced_mop
- name = "Advanced Mop"
- description = "Excuse me. I'd like to request $17 for a push broom rebristling. Either that, or an advanced mop."
- reward = 10000
- wanted_types = list(/obj/item/mop/advanced)
-
-/datum/bounty/item/science/advanced_egun
- name = "Advanced Energy Gun"
- description = "With the price of rechargers on the rise, upper management is interested in purchasing guns that are self-powered. If you ship one, they'll pay."
- reward = 10000
- wanted_types = list(/obj/item/gun/energy/e_gun/nuclear)
diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm
deleted file mode 100644
index bcf7b89f3af..00000000000
--- a/code/modules/cargo/bounties/security.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-/datum/bounty/item/security/riotshotgun
- name = "Riot Shotguns"
- description = "Hooligans have boarded CentCom! Ship riot shotguns quick, or things are going to get dirty."
- reward = 5000
- required_count = 2
- wanted_types = list(/obj/item/gun/ballistic/shotgun/riot)
-
-/datum/bounty/item/security/recharger
- name = "Rechargers"
- description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped."
- reward = 2000
- required_count = 3
- wanted_types = list(/obj/machinery/recharger)
diff --git a/code/modules/cargo/bounties/slime.dm b/code/modules/cargo/bounties/slime.dm
deleted file mode 100644
index 4aa0797c700..00000000000
--- a/code/modules/cargo/bounties/slime.dm
+++ /dev/null
@@ -1,39 +0,0 @@
-/datum/bounty/item/slime
- reward = 3000
-
-/datum/bounty/item/slime/New()
- ..()
- description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it."
- reward += rand(0, 4) * 500
-
-/datum/bounty/item/slime/green
- name = "Green Slime Extract"
- wanted_types = list(/obj/item/slime_extract/green)
-
-/datum/bounty/item/slime/pink
- name = "Pink Slime Extract"
- wanted_types = list(/obj/item/slime_extract/pink)
-
-/datum/bounty/item/slime/gold
- name = "Gold Slime Extract"
- wanted_types = list(/obj/item/slime_extract/gold)
-
-/datum/bounty/item/slime/oil
- name = "Oil Slime Extract"
- wanted_types = list(/obj/item/slime_extract/oil)
-
-/datum/bounty/item/slime/black
- name = "Black Slime Extract"
- wanted_types = list(/obj/item/slime_extract/black)
-
-/datum/bounty/item/slime/lightpink
- name = "Light Pink Slime Extract"
- wanted_types = list(/obj/item/slime_extract/lightpink)
-
-/datum/bounty/item/slime/adamantine
- name = "Adamantine Slime Extract"
- wanted_types = list(/obj/item/slime_extract/adamantine)
-
-/datum/bounty/item/slime/rainbow
- name = "Rainbow Slime Extract"
- wanted_types = list(/obj/item/slime_extract/rainbow)
diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm
deleted file mode 100644
index cbbf36c6710..00000000000
--- a/code/modules/cargo/bounties/special.dm
+++ /dev/null
@@ -1,55 +0,0 @@
-/datum/bounty/item/alien_organs
- name = "Alien Organs"
- description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated."
- reward = 25000
- required_count = 3
- wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo, /obj/item/organ/liver/alien, /obj/item/organ/tongue/alien, /obj/item/organ/eyes/night_vision/alien)
-
-/datum/bounty/item/syndicate_documents
- name = "Syndicate Documents"
- description = "Intel regarding the syndicate is highly prized at CentCom. If you find syndicate documents, ship them. You could save lives."
- reward = 15000
- wanted_types = list(/obj/item/documents/syndicate, /obj/item/documents/photocopy)
-
-/datum/bounty/item/syndicate_documents/applies_to(obj/O)
- if(!..())
- return FALSE
- if(istype(O, /obj/item/documents/photocopy))
- var/obj/item/documents/photocopy/Copy = O
- return (Copy.copy_type && ispath(Copy.copy_type, /obj/item/documents/syndicate))
- return TRUE
-
-/datum/bounty/item/adamantine
- name = "Adamantine"
- description = "Nanotrasen's anomalous materials division is in desparate need for Adamantine. Send them a large shipment and we'll make it worth your while."
- reward = 35000
- required_count = 10
- wanted_types = list(/obj/item/stack/sheet/mineral/adamantine)
-
-/datum/bounty/item/trash
- name = "Trash"
- description = "Recently a group of janitors have run out of trash to clean up, without any trash Centcom wants to fire them to cut costs. Send a shipment of trash to keep them employed, and they'll give you a small compensation."
- reward = 1000
- required_count = 10
- wanted_types = list(/obj/item/trash)
-
-/datum/bounty/more_bounties
- name = "More Bounties"
- description = "Complete enough bounties and CentCom will issue new ones!"
- reward = 5 // number of bounties
- var/required_bounties = 5
-
-/datum/bounty/more_bounties/can_claim()
- return ..() && completed_bounty_count() >= required_bounties
-
-/datum/bounty/more_bounties/completion_string()
- return "[min(required_bounties, completed_bounty_count())]/[required_bounties] Bounties"
-
-/datum/bounty/more_bounties/reward_string()
- return "Up to [reward] new bounties"
-
-/datum/bounty/more_bounties/claim()
- if(can_claim())
- claimed = TRUE
- for(var/i = 0; i < reward; ++i)
- try_add_bounty(random_bounty())
diff --git a/code/modules/cargo/bounties/virus.dm b/code/modules/cargo/bounties/virus.dm
deleted file mode 100644
index 8f078a2668b..00000000000
--- a/code/modules/cargo/bounties/virus.dm
+++ /dev/null
@@ -1,81 +0,0 @@
-/datum/bounty/virus
- reward = 5000
- var/shipped = FALSE
- var/stat_value = 0
- var/stat_name = ""
-
-/datum/bounty/virus/New()
- ..()
- stat_value = rand(4, 11)
- if(rand(3) == 1)
- stat_value *= -1
- name = "Virus ([stat_name] of [stat_value])"
- description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus."
- reward += rand(0, 4) * 500
-
-/datum/bounty/virus/completion_string()
- return shipped ? "Shipped" : "Not Shipped"
-
-/datum/bounty/virus/can_claim()
- return ..() && shipped
-
-/datum/bounty/virus/applies_to(obj/O)
- if(shipped)
- return FALSE
- if(O.flags_1 & HOLOGRAM_1)
- return FALSE
- if(!istype(O, /obj/item/reagent_containers || !O.reagents || !O.reagents.reagent_list))
- return FALSE
- var/datum/reagent/blood/B = locate() in O.reagents.reagent_list
- if(!B)
- return FALSE
- for(var/V in B.get_diseases())
- if(!istype(V, /datum/disease/advance))
- continue
- if(accepts_virus(V))
- return TRUE
- return FALSE
-
-/datum/bounty/virus/ship(obj/O)
- if(!applies_to(O))
- return
- shipped = TRUE
-
-/datum/bounty/virus/compatible_with(datum/other_bounty)
- if(!istype(other_bounty, /datum/bounty/virus))
- return TRUE
- var/datum/bounty/virus/V = other_bounty
- return type != V.type || stat_value != V.stat_value
-
-
-/datum/bounty/virus/proc/accepts_virus(V)
- return TRUE
-
-/datum/bounty/virus/resistance
- stat_name = "resistance"
-
-/datum/bounty/virus/resistance/accepts_virus(V)
- var/datum/disease/advance/A = V
- return A.totalResistance() == stat_value
-
-/datum/bounty/virus/stage_speed
- stat_name = "stage speed"
-
-/datum/bounty/virus/stage_speed/accepts_virus(V)
- var/datum/disease/advance/A = V
- return A.totalStageSpeed() == stat_value
-
-/datum/bounty/virus/stealth
- stat_name = "stealth"
-
-/datum/bounty/virus/stealth/accepts_virus(V)
- var/datum/disease/advance/A = V
- return A.totalStealth() == stat_value
-
-/datum/bounty/virus/transmit
- stat_name = "transmissible"
-
-/datum/bounty/virus/transmit/accepts_virus(V)
- var/datum/disease/advance/A = V
- return A.totalTransmittable() == stat_value
-
diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm
deleted file mode 100644
index 118cd038144..00000000000
--- a/code/modules/cargo/bounty.dm
+++ /dev/null
@@ -1,180 +0,0 @@
-GLOBAL_LIST_EMPTY(bounties_list)
-
-/datum/bounty
- var/name
- var/description
- var/reward = 1000 // In credits.
- var/claimed = FALSE
- var/high_priority = FALSE
-
-// Displayed on bounty UI screen.
-/datum/bounty/proc/completion_string()
- return ""
-
-// Displayed on bounty UI screen.
-/datum/bounty/proc/reward_string()
- return "[reward] Credits"
-
-/datum/bounty/proc/can_claim()
- return !claimed
-
-// Called when the claim button is clicked. Override to provide fancy rewards.
-/datum/bounty/proc/claim()
- if(can_claim())
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(D)
- D.adjust_money(reward)
- claimed = TRUE
-
-// If an item sent in the cargo shuttle can satisfy the bounty.
-/datum/bounty/proc/applies_to(obj/O)
- return FALSE
-
-// Called when an object is shipped on the cargo shuttle.
-/datum/bounty/proc/ship(obj/O)
- return
-
-// When randomly generating the bounty list, duplicate bounties must be avoided.
-// This proc is used to determine if two bounties are duplicates, or incompatible in general.
-/datum/bounty/proc/compatible_with(other_bounty)
- return TRUE
-
-/datum/bounty/proc/mark_high_priority(scale_reward = 2)
- if(high_priority)
- return
- high_priority = TRUE
- reward = round(reward * scale_reward)
-
-// This proc is called when the shuttle docks at CentCom.
-// It handles items shipped for bounties.
-/proc/bounty_ship_item_and_contents(atom/movable/AM, dry_run=FALSE)
- if(!GLOB.bounties_list.len)
- setup_bounties()
-
- var/list/matched_one = FALSE
- for(var/thing in reverseRange(AM.GetAllContents()))
- var/matched_this = FALSE
- for(var/datum/bounty/B in GLOB.bounties_list)
- if(B.applies_to(thing))
- matched_one = TRUE
- matched_this = TRUE
- if(!dry_run)
- B.ship(thing)
- if(!dry_run && matched_this)
- qdel(thing)
- return matched_one
-
-// Returns FALSE if the bounty is incompatible with the current bounties.
-/proc/try_add_bounty(datum/bounty/new_bounty)
- if(!new_bounty || !new_bounty.name || !new_bounty.description)
- return FALSE
- for(var/i in GLOB.bounties_list)
- var/datum/bounty/B = i
- if(!B.compatible_with(new_bounty) || !new_bounty.compatible_with(B))
- return FALSE
- GLOB.bounties_list += new_bounty
- return TRUE
-
-// Returns a new bounty of random type, but does not add it to GLOB.bounties_list.
-/proc/random_bounty()
- switch(rand(1, 13))
- if(1)
- var/subtype = pick(subtypesof(/datum/bounty/item/assistant))
- return new subtype
- if(2)
- var/subtype = pick(subtypesof(/datum/bounty/item/mech))
- return new subtype
- if(3)
- var/subtype = pick(subtypesof(/datum/bounty/item/chef))
- return new subtype
- if(4)
- var/subtype = pick(subtypesof(/datum/bounty/item/security))
- return new subtype
- if(5)
- if(rand(2) == 1)
- return new /datum/bounty/reagent/simple_drink
- return new /datum/bounty/reagent/complex_drink
- if(6)
- if(rand(2) == 1)
- return new /datum/bounty/reagent/chemical_simple
- return new /datum/bounty/reagent/chemical_complex
- if(7)
- var/subtype = pick(subtypesof(/datum/bounty/virus))
- return new subtype
- if(8)
- var/subtype = pick(subtypesof(/datum/bounty/item/science))
- return new subtype
- if(9)
- var/subtype = pick(subtypesof(/datum/bounty/item/slime))
- return new subtype
- if(10)
- var/subtype = pick(subtypesof(/datum/bounty/item/engineering))
- return new subtype
- if(11)
- var/subtype = pick(subtypesof(/datum/bounty/item/mining))
- return new subtype
- if(12)
- var/subtype = pick(subtypesof(/datum/bounty/item/medical))
- return new subtype
-
-// Called lazily at startup to populate GLOB.bounties_list with random bounties.
-/proc/setup_bounties()
-
- var/pick // instead of creating it a bunch let's go ahead and toss it here, we know we're going to use it for dynamics and subtypes!
-
- /********************************Subtype Gens********************************/
- var/list/easy_add_list_subtypes = list(/datum/bounty/item/assistant = 2,
- /datum/bounty/item/mech = 1,
- /datum/bounty/item/chef = 2,
- /datum/bounty/item/security = 1,
- /datum/bounty/virus = 1,
- /datum/bounty/item/engineering = 1,
- /datum/bounty/item/mining = 2,
- /datum/bounty/item/medical = 2)
-
- for(var/the_type in easy_add_list_subtypes)
- for(var/i in 1 to easy_add_list_subtypes[the_type])
- pick = pick(subtypesof(the_type))
- try_add_bounty(new pick)
-
- /********************************Strict Type Gens********************************/
- var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1,
- /datum/bounty/reagent/complex_drink = 1,
- /datum/bounty/reagent/chemical_simple = 1,
- /datum/bounty/reagent/chemical_complex = 1,
- /datum/bounty/pill/simple_pill = 1)
-
- for(var/the_strict_type in easy_add_list_strict_types)
- for(var/i in 1 to easy_add_list_strict_types[the_strict_type])
- try_add_bounty(new the_strict_type)
-
- /********************************Dynamic Gens********************************/
-
- for(var/i in 0 to 1)
- if(prob(50))
- pick = pick(subtypesof(/datum/bounty/item/slime))
- else
- pick = pick(subtypesof(/datum/bounty/item/science))
- try_add_bounty(new pick)
-
- /********************************Cutoff for Non-Low Priority Bounties********************************/
- var/datum/bounty/B = pick(GLOB.bounties_list)
- B.mark_high_priority()
-
- /********************************Low Priority Gens********************************/
- var/list/low_priority_strict_type_list = list( /datum/bounty/item/alien_organs,
- /datum/bounty/item/syndicate_documents,
- /datum/bounty/item/adamantine,
- /datum/bounty/item/trash,
- /datum/bounty/more_bounties)
-
- for(var/low_priority_bounty in low_priority_strict_type_list)
- try_add_bounty(new low_priority_bounty)
-
-/proc/completed_bounty_count()
- var/count = 0
- for(var/i in GLOB.bounties_list)
- var/datum/bounty/B = i
- if(B.claimed)
- ++count
- return count
diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm
deleted file mode 100644
index ff869ed4686..00000000000
--- a/code/modules/cargo/bounty_console.dm
+++ /dev/null
@@ -1,96 +0,0 @@
-#define PRINTER_TIMEOUT 10
-
-
-
-/obj/machinery/computer/bounty
- name = "Nanotrasen bounty console"
- desc = ""
- icon_screen = "bounty"
- circuit = /obj/item/circuitboard/computer/bounty
- light_color = "#E2853D"//orange
- var/printer_ready = 0 //cooldown var
-
-/obj/machinery/computer/bounty/Initialize()
- . = ..()
- printer_ready = world.time + PRINTER_TIMEOUT
-
-/obj/machinery/computer/bounty/proc/print_paper()
- new /obj/item/paper/bounty_printout(loc)
-
-/obj/item/paper/bounty_printout
- name = "paper - Bounties"
-
-/obj/item/paper/bounty_printout/Initialize()
- . = ..()
- info = "Nanotrasen Cargo Bounties
"
- update_icon()
-
- for(var/datum/bounty/B in GLOB.bounties_list)
- if(B.claimed)
- continue
- info += {"[B.name]
- - Reward: [B.reward_string()]
- - Completed: [B.completion_string()]
"}
-
-/obj/machinery/computer/bounty/ui_interact(mob/user)
- . = ..()
-
- if(!GLOB.bounties_list.len)
- setup_bounties()
-
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- var/list/dat = list({"Refresh
- Print Paper
- Credits: [D.account_balance]
-
- | Name | Description | Reward | Completion | Status |
"})
- for(var/datum/bounty/B in GLOB.bounties_list)
- if(B.claimed)
- dat += ""
- else if(B.can_claim())
- dat += "
"
- else
- dat += "
"
-
- if(B.high_priority)
- dat += {"| [B.name] |
- High Priority: [B.description] |
- [B.reward_string()] | "}
- else
- dat += {"[B.name] |
- [B.description] |
- [B.reward_string()] | "}
- dat += "[B.completion_string()] | "
- if(B.claimed)
- dat += "Claimed | "
- else if(B.can_claim())
- dat += "Claim | "
- else
- dat += "Unclaimed | "
- dat += "
"
- dat += "
"
- dat = dat.Join()
- var/datum/browser/popup = new(user, "bounties", "Nanotrasen Bounties", 700, 600)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
-
-/obj/machinery/computer/bounty/Topic(href, href_list)
- if(..())
- return
-
- switch(href_list["choice"])
- if("Print")
- if(printer_ready < world.time)
- printer_ready = world.time + PRINTER_TIMEOUT
- print_paper()
-
- if("Claim")
- var/datum/bounty/B = locate(href_list["d_rec"]) in GLOB.bounties_list
- if(B)
- B.claim()
-
- if(href_list["refresh"])
- playsound(src, "terminal_type", 25, FALSE)
-
- updateUsrDialog()
diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm
index 1d7f88e6383..6fb1e45708c 100644
--- a/code/modules/cargo/centcom_podlauncher.dm
+++ b/code/modules/cargo/centcom_podlauncher.dm
@@ -499,7 +499,6 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if (isnull(A)) //If theres no supplypod bay mapped into centcom, throw an error
to_chat(holder.mob, "No /area/centcom/supplypod/loading/one (or /two or /three or /four) in the world! You can make one myself (then refresh) for now, but yell at a mapper to fix this, today!")
CRASH("No /area/centcom/supplypod/loading/one (or /two or /three or /four) has been mapped into the centcom z-level!")
- return
orderedArea = list()
if (!isemptylist(A.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values
var/startX = A.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments)
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
deleted file mode 100644
index 47a7d66ba31..00000000000
--- a/code/modules/cargo/console.dm
+++ /dev/null
@@ -1,246 +0,0 @@
-/obj/machinery/computer/cargo
- name = "supply console"
- desc = ""
- icon_screen = "supply"
- circuit = /obj/item/circuitboard/computer/cargo
- ui_x = 780
- ui_y = 750
-
- var/requestonly = FALSE
- var/contraband = FALSE
- var/self_paid = FALSE
- var/safety_warning = "For safety reasons, the automated supply shuttle \
- cannot transport live organisms, human remains, classified nuclear weaponry, \
- homing beacons or machinery housing any form of artificial intelligence."
- var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible."
- /// radio used by the console to send messages on supply channel
- var/obj/item/radio/headset/radio
- /// var that tracks message cooldown
- var/message_cooldown
-
- light_color = "#E2853D"//orange
-
-/obj/machinery/computer/cargo/request
- name = "supply request console"
- desc = ""
- icon_screen = "request"
- circuit = /obj/item/circuitboard/computer/cargo/request
- requestonly = TRUE
-
-/obj/machinery/computer/cargo/Initialize()
- . = ..()
- radio = new /obj/item/radio/headset/headset_cargo(src)
- var/obj/item/circuitboard/computer/cargo/board = circuit
- contraband = board.contraband
- if (board.obj_flags & EMAGGED)
- obj_flags |= EMAGGED
- else
- obj_flags &= ~EMAGGED
-
-/obj/machinery/computer/cargo/Destroy()
- QDEL_NULL(radio)
- ..()
-
-/obj/machinery/computer/cargo/proc/get_export_categories()
- . = EXPORT_CARGO
- if(contraband)
- . |= EXPORT_CONTRABAND
- if(obj_flags & EMAGGED)
- . |= EXPORT_EMAG
-
-/obj/machinery/computer/cargo/emag_act(mob/user)
- if(obj_flags & EMAGGED)
- return
- user.visible_message(span_warning("[user] swipes a suspicious card through [src]!"),
- span_notice("I adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband."))
-
- obj_flags |= EMAGGED
- contraband = TRUE
-
- // This also permamently sets this on the circuit board
- var/obj/item/circuitboard/computer/cargo/board = circuit
- board.contraband = TRUE
- board.obj_flags |= EMAGGED
- update_static_data(user)
-
-/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
- datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "cargo", name, ui_x, ui_y, master_ui, state)
- ui.open()
-
-/obj/machinery/computer/cargo/ui_data()
- var/list/data = list()
- data["location"] = SSshuttle.supply.getStatusText()
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(D)
- data["points"] = D.account_balance
- data["away"] = SSshuttle.supply.getDockedId() == "supply_away"
- data["self_paid"] = self_paid
- data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE
- var/message = "Remember to stamp and send back the supply manifests."
- if(SSshuttle.centcom_message)
- message = SSshuttle.centcom_message
- if(SSshuttle.supplyBlocked)
- message = blockade_warning
- data["message"] = message
- data["cart"] = list()
- for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
- data["cart"] += list(list(
- "object" = SO.pack.name,
- "cost" = SO.pack.cost,
- "id" = SO.id,
- "orderer" = SO.orderer,
- "paid" = !isnull(SO.paying_account) //paid by requester
- ))
-
- data["requests"] = list()
- for(var/datum/supply_order/SO in SSshuttle.requestlist)
- data["requests"] += list(list(
- "object" = SO.pack.name,
- "cost" = SO.pack.cost,
- "orderer" = SO.orderer,
- "reason" = SO.reason,
- "id" = SO.id
- ))
-
- return data
-
-/obj/machinery/computer/cargo/ui_static_data(mob/user)
- var/list/data = list()
- data["requestonly"] = requestonly
- data["supplies"] = list()
- for(var/pack in SSshuttle.supply_packs)
- var/datum/supply_pack/P = SSshuttle.supply_packs[pack]
- if(!data["supplies"][P.group])
- data["supplies"][P.group] = list(
- "name" = P.group,
- "packs" = list()
- )
- if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly)
- continue
- data["supplies"][P.group]["packs"] += list(list(
- "name" = P.name,
- "cost" = P.cost,
- "id" = pack,
- "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name.
- "small_item" = P.small_item,
- "access" = P.access
- ))
- return data
-
-/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui)
- if(..())
- return
- switch(action)
- if("send")
- if(!SSshuttle.supply.canMove())
- say(safety_warning)
- return
- if(SSshuttle.supplyBlocked)
- say(blockade_warning)
- return
- if(SSshuttle.supply.getDockedId() == "supply_home")
- SSshuttle.supply.export_categories = get_export_categories()
- SSshuttle.moveShuttle("supply", "supply_away", TRUE)
- say("The supply shuttle is departing.")
- investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO)
- else
- investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO)
- say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.")
- SSshuttle.moveShuttle("supply", "supply_home", TRUE)
- . = TRUE
- if("add")
- var/id = text2path(params["id"])
- var/datum/supply_pack/pack = SSshuttle.supply_packs[id]
- if(!istype(pack))
- return
- if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly)
- return
-
- var/name = "*None Provided*"
- var/rank = "*None Provided*"
- var/ckey = usr.ckey
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- name = H.get_authentification_name()
- rank = H.get_assignment(hand_first = TRUE)
- else if(issilicon(usr))
- name = usr.real_name
- rank = "Silicon"
-
- var/datum/bank_account/account
- if(self_paid && ishuman(usr))
- var/mob/living/carbon/human/H = usr
- var/obj/item/card/id/id_card = H.get_idcard(TRUE)
- if(!istype(id_card))
- say("No ID card detected.")
- return
- account = id_card.registered_account
- if(!istype(account))
- say("Invalid bank account.")
- return
-
- var/reason = ""
- if(requestonly && !self_paid)
- reason = stripped_input("Reason:", name, "")
- if(isnull(reason) || ..())
- return
-
- var/turf/T = get_turf(src)
- var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account)
- SO.generateRequisition(T)
- if(requestonly && !self_paid)
- SSshuttle.requestlist += SO
- else
- SSshuttle.shoppinglist += SO
- if(self_paid)
- say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.")
- if(requestonly && message_cooldown < world.time)
- radio.talk_into(src, "A new order has been requested.", RADIO_CHANNEL_SUPPLY)
- message_cooldown = world.time + 30 SECONDS
- . = TRUE
- if("remove")
- var/id = text2num(params["id"])
- for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
- if(SO.id == id)
- SSshuttle.shoppinglist -= SO
- . = TRUE
- break
- if("clear")
- SSshuttle.shoppinglist.Cut()
- . = TRUE
- if("approve")
- var/id = text2num(params["id"])
- for(var/datum/supply_order/SO in SSshuttle.requestlist)
- if(SO.id == id)
- SSshuttle.requestlist -= SO
- SSshuttle.shoppinglist += SO
- . = TRUE
- break
- if("deny")
- var/id = text2num(params["id"])
- for(var/datum/supply_order/SO in SSshuttle.requestlist)
- if(SO.id == id)
- SSshuttle.requestlist -= SO
- . = TRUE
- break
- if("denyall")
- SSshuttle.requestlist.Cut()
- . = TRUE
- if("toggleprivate")
- self_paid = !self_paid
- . = TRUE
- if(.)
- post_signal("supply")
-
-/obj/machinery/computer/cargo/proc/post_signal(command)
-
- var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
-
- if(!frequency)
- return
-
- var/datum/signal/status_signal = new(list("command" = command))
- frequency.post_signal(src, status_signal)
diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm
deleted file mode 100644
index 8a43e8a4a63..00000000000
--- a/code/modules/cargo/export_scanner.dm
+++ /dev/null
@@ -1,45 +0,0 @@
-/obj/item/export_scanner
- name = "export scanner"
- desc = ""
- icon = 'icons/obj/device.dmi'
- icon_state = "export_scanner"
- item_state = "radio"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
- item_flags = NOBLUDGEON
- w_class = WEIGHT_CLASS_SMALL
- siemens_coefficient = 1
- var/obj/machinery/computer/cargo/cargo_console = null
-
-/obj/item/export_scanner/examine(user)
- . = ..()
- if(!cargo_console)
- . += span_notice("[src] is not currently linked to a cargo console.")
-
-/obj/item/export_scanner/afterattack(obj/O, mob/user, proximity)
- . = ..()
- if(!istype(O) || !proximity)
- return
-
- if(istype(O, /obj/machinery/computer/cargo))
- var/obj/machinery/computer/cargo/C = O
- if(!C.requestonly)
- cargo_console = C
- to_chat(user, span_notice("Scanner linked to [C]."))
- else if(!istype(cargo_console))
- to_chat(user, span_warning("I must link [src] to a cargo console first!"))
- else
- // Before you fix it:
- // yes, checking manifests is a part of intended functionality.
-
- var/datum/export_report/ex = export_item_and_contents(O, cargo_console.get_export_categories(), dry_run=TRUE)
- var/price = 0
- for(var/x in ex.total_amount)
- price += ex.total_value[x]
-
- if(price)
- to_chat(user, span_notice("Scanned [O], value: [price] credits[O.contents.len ? " (contents included)" : ""]."))
- else
- to_chat(user, span_warning("Scanned [O], no export value."))
- if(bounty_ship_item_and_contents(O, dry_run=TRUE))
- to_chat(user, span_notice("Scanned item is eligible for one or more bounties."))
diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm
index e6fda5f6b10..897b59552f8 100644
--- a/code/modules/cargo/exports/parts.dm
+++ b/code/modules/cargo/exports/parts.dm
@@ -14,8 +14,3 @@
cost = 150
unit_name = "solar panel control board"
export_types = list(/obj/item/circuitboard/computer/solar_control)
-
-/datum/export/swarmer
- cost = 2000
- unit_name = "deactivated alien deconstruction drone"
- export_types = list(/obj/item/deactivated_swarmer)
diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm
index 1c666a4db4d..b8a490b823b 100644
--- a/code/modules/cargo/exports/sheets.dm
+++ b/code/modules/cargo/exports/sheets.dm
@@ -48,11 +48,6 @@
unit_name = "gondola hide"
export_types = list(/obj/item/stack/sheet/animalhide/gondola)
-/datum/export/stack/skin/xeno
- cost = 500
- unit_name = "alien hide"
- export_types = list(/obj/item/stack/sheet/animalhide/xeno)
-
// Common materials.
// For base materials, see materials.dm
@@ -92,10 +87,3 @@
cost = 0.2
unit_name = "cable piece"
export_types = list(/obj/item/stack/cable_coil)
-
-// Weird Stuff
-
-/datum/export/stack/abductor
- cost = 1000
- message = "of alien alloy"
- export_types = list(/obj/item/stack/sheet/mineral/abductor)
diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm
deleted file mode 100644
index 1f948723e16..00000000000
--- a/code/modules/cargo/expressconsole.dm
+++ /dev/null
@@ -1,215 +0,0 @@
-#define MAX_EMAG_ROCKETS 8
-#define BEACON_COST 500
-#define SP_LINKED 1
-#define SP_READY 2
-#define SP_LAUNCH 3
-#define SP_UNLINK 4
-#define SP_UNREADY 5
-
-/obj/machinery/computer/cargo/express
- name = "express supply console"
- desc = "This console allows the user to purchase a package \
- with 1/40th of the delivery time: made possible by NanoTrasen's new \"1500mm Orbital Railgun\".\
- All sales are near instantaneous - please choose carefully"
- icon_screen = "supply_express"
- circuit = /obj/item/circuitboard/computer/cargo/express
- ui_x = 600
- ui_y = 700
- blockade_warning = "Bluespace instability detected. Delivery impossible."
- req_access = list(ACCESS_QM)
-
- var/message
- var/printed_beacons = 0 //number of beacons printed. Used to determine beacon names.
- var/list/meme_pack_data
- var/obj/item/supplypod_beacon/beacon //the linked supplypod beacon
- var/area/landingzone = /area/quartermaster/storage //where we droppin boys
- var/podType = /obj/structure/closet/supplypod
- var/cooldown = 0 //cooldown to prevent printing supplypod beacon spam
- var/locked = TRUE //is the console locked? unlock with ID
- var/usingBeacon = FALSE //is the console in beacon mode? exists to let beacon know when a pod may come in
-
-/obj/machinery/computer/cargo/express/Initialize()
- . = ..()
- packin_up()
-
-/obj/machinery/computer/cargo/express/Destroy()
- if(beacon)
- beacon.unlink_console()
- return ..()
-
-/obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params)
- if((istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) && allowed(user))
- locked = !locked
- to_chat(user, span_notice("I [locked ? "lock" : "unlock"] the interface."))
- return
- else if(istype(W, /obj/item/disk/cargo/bluespace_pod))
- podType = /obj/structure/closet/supplypod/bluespacepod//doesnt effect circuit board, making reversal possible
- to_chat(user, span_notice("I insert the disk into [src], allowing for advanced supply delivery vehicles."))
- qdel(W)
- return TRUE
- else if(istype(W, /obj/item/supplypod_beacon))
- var/obj/item/supplypod_beacon/sb = W
- if (sb.express_console != src)
- sb.link_console(src, user)
- return TRUE
- else
- to_chat(user, span_alert("[src] is already linked to [sb]."))
- ..()
-
-/obj/machinery/computer/cargo/express/emag_act(mob/living/user)
- if(obj_flags & EMAGGED)
- return
- user.visible_message(span_warning("[user] swipes a suspicious card through [src]!"),
- span_notice("I change the routing protocols, allowing the Supply Pod to land anywhere on the station."))
- obj_flags |= EMAGGED
- // This also sets this on the circuit board
- var/obj/item/circuitboard/computer/cargo/board = circuit
- board.obj_flags |= EMAGGED
- packin_up()
-
-/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry
- meme_pack_data = list() // sorry for what?
- for(var/pack in SSshuttle.supply_packs) // our quartermaster taught us not to be ashamed of our supply packs
- var/datum/supply_pack/P = SSshuttle.supply_packs[pack] // specially since they're such a good price and all
- if(!meme_pack_data[P.group]) // yeah, I see that, your quartermaster gave you good advice
- meme_pack_data[P.group] = list( // it gets cheaper when I return it
- "name" = P.group, // mmhm
- "packs" = list() // sometimes, I return it so much, I rip the manifest
- ) // see, my quartermaster taught me a few things too
- if((P.hidden) || (P.special)) // like, how not to rip the manifest
- continue// by using someone else's crate
- if(!(obj_flags & EMAGGED) && P.contraband) // will you show me?
- continue // i'd be right happy to
- meme_pack_data[P.group]["packs"] += list(list(
- "name" = P.name,
- "cost" = P.cost,
- "id" = pack,
- "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name.
- ))
-
-/obj/machinery/computer/cargo/express/ui_interact(mob/living/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "cargo_express", name, ui_x, ui_y, master_ui, state)
- ui.open()
-
-/obj/machinery/computer/cargo/express/ui_data(mob/user)
- var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location?
- var/list/data = list()
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(D)
- data["points"] = D.account_balance
- data["locked"] = locked//swipe an ID to unlock
- data["siliconUser"] = user.has_unlimited_silicon_privilege
- data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
- data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay?
- data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
- data["canBuyBeacon"] = cooldown <= 0 && D.account_balance >= BEACON_COST
- data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary
- data["hasBeacon"] = beacon != null//is there a linked beacon?
- data["beaconName"] = beacon ? beacon.name : "No Beacon Found"
- data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons
- data["supplies"] = list()
- message = "Sales are near-instantaneous - please choose carefully."
- if(SSshuttle.supplyBlocked)
- message = blockade_warning
- if(usingBeacon && !beacon)
- message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed
- else if (usingBeacon && !canBeacon)
- message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf
- if(obj_flags & EMAGGED)
- message = "(&!#@ERROR: ROUTING_#PROTOCOL MALF(*CT#ON. $UG%ESTE@ ACT#0N: !^/PULS3-%E)ET CIR*)ITB%ARD."
- data["message"] = message
- if(!meme_pack_data)
- packin_up()
- stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]")
- data["supplies"] = meme_pack_data
- if (cooldown > 0)//cooldown used for printing beacons
- cooldown--
- return data
-
-/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui)
- switch(action)
- if("LZCargo")
- usingBeacon = FALSE
- if (beacon)
- beacon.update_status(SP_UNREADY) //ready light on beacon will turn off
- if("LZBeacon")
- usingBeacon = TRUE
- if (beacon)
- beacon.update_status(SP_READY) //turns on the beacon's ready light
- if("printBeacon")
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(D)
- if(D.adjust_money(-BEACON_COST))
- cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
- var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
- C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
- printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
- beacon.name = "Supply Pod Beacon #[printed_beacons]"
-
-
- if("add")//Generate Supply Order first
- var/id = text2path(params["id"])
- var/datum/supply_pack/pack = SSshuttle.supply_packs[id]
- if(!istype(pack))
- return
- var/name = "*None Provided*"
- var/rank = "*None Provided*"
- var/ckey = usr.ckey
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- name = H.get_authentification_name()
- rank = H.get_assignment(hand_first = TRUE)
- else if(issilicon(usr))
- name = usr.real_name
- rank = "Silicon"
- var/reason = ""
- var/list/empty_turfs
- var/datum/supply_order/SO = new(pack, name, rank, ckey, reason)
- var/points_to_check
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(D)
- points_to_check = D.account_balance
- if(!(obj_flags & EMAGGED))
- if(SO.pack.cost <= points_to_check)
- var/LZ
- if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay
- LZ = get_turf(beacon)
- beacon.update_status(SP_LAUNCH)
- else if (!usingBeacon)//find a suitable supplypod landing zone in cargobay
- landingzone = GLOB.areas_by_type[/area/quartermaster/storage]
- if (!landingzone)
- WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.")
- landingzone = get_area(src)
- for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone
- if(is_blocked_turf(T))
- continue
- LAZYADD(empty_turfs, T)
- CHECK_TICK
- if(empty_turfs && empty_turfs.len)
- LZ = pick(empty_turfs)
- if (SO.pack.cost <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call
- D.adjust_money(-SO.pack.cost)
- new /obj/effect/DPtarget(LZ, podType, SO)
- . = TRUE
- update_icon()
- else
- if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^)
- landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone
- for(var/turf/open/floor/T in landingzone.contents)
- if(is_blocked_turf(T))
- continue
- LAZYADD(empty_turfs, T)
- CHECK_TICK
- if(empty_turfs && empty_turfs.len)
- D.adjust_money(-(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS)))
-
- SO.generateRequisition(get_turf(src))
- for(var/i in 1 to MAX_EMAG_ROCKETS)
- var/LZ = pick(empty_turfs)
- LAZYREMOVE(empty_turfs, LZ)
- new /obj/effect/DPtarget(LZ, podType, SO)
- . = TRUE
- update_icon()
- CHECK_TICK
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packsrogue/_pack.dm
similarity index 100%
rename from code/modules/cargo/packs.dm
rename to code/modules/cargo/packsrogue/_pack.dm
diff --git a/code/modules/cargo/packsrogue/_rogue.dm b/code/modules/cargo/packsrogue/_rogue.dm
index 888fcb56e50..0e1b150b9ea 100644
--- a/code/modules/cargo/packsrogue/_rogue.dm
+++ b/code/modules/cargo/packsrogue/_rogue.dm
@@ -11,4 +11,4 @@
if(cost == initial(cost) && !static_cost)
var/na = max(round(cost * randomprice_factor, 1), 1)
cost = max(rand(cost-na, cost+na), 1)
-#endif
\ No newline at end of file
+#endif
diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm
deleted file mode 100644
index 192a4f93b0b..00000000000
--- a/code/modules/cargo/supplypod_beacon.dm
+++ /dev/null
@@ -1,95 +0,0 @@
-/obj/item/supplypod_beacon
- name = "Supply Pod Beacon"
- desc = ""
- icon = 'icons/obj/device.dmi'
- icon_state = "supplypod_beacon"
- item_state = "radio"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
- w_class = WEIGHT_CLASS_SMALL
- var/obj/machinery/computer/cargo/express/express_console
- var/linked = FALSE
- var/ready = FALSE
- var/launched = FALSE
-
-/obj/item/supplypod_beacon/proc/update_status(consoleStatus)
- switch(consoleStatus)
- if (SP_LINKED)
- linked = TRUE
- playsound(src,'sound/blank.ogg',50,FALSE)
- if (SP_READY)
- ready = TRUE
- if (SP_LAUNCH)
- launched = TRUE
- playsound(src,'sound/blank.ogg',50,FALSE)
- playsound(src,'sound/blank.ogg',50,FALSE)
- addtimer(CALLBACK(src, PROC_REF(endLaunch)), 33)//wait 3.3 seconds (time it takes for supplypod to land), then update icon
- if (SP_UNLINK)
- linked = FALSE
- playsound(src,'sound/blank.ogg',50,FALSE)
- if (SP_UNREADY)
- ready = FALSE
- update_icon()
-
-/obj/item/supplypod_beacon/update_icon()
- cut_overlays()
- if (launched)
- add_overlay("sp_green")
- else if (ready)
- add_overlay("sp_yellow")
- else if (linked)
- add_overlay("sp_orange")
-
-/obj/item/supplypod_beacon/proc/endLaunch()
- launched = FALSE
- update_status()
-
-/obj/item/supplypod_beacon/examine(user)
- . = ..()
- if(!express_console)
- . += span_notice("[src] is not currently linked to an Express Supply console.")
- else
- . += span_notice("Alt-click to unlink it from the Express Supply console.")
-
-/obj/item/supplypod_beacon/Destroy()
- if(express_console)
- express_console.beacon = null
- return ..()
-
-/obj/item/supplypod_beacon/proc/unlink_console()
- if(express_console)
- express_console.beacon = null
- express_console = null
- update_status(SP_UNLINK)
- update_status(SP_UNREADY)
-
-/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user)
- if (C.beacon)//if new console has a beacon, then...
- C.beacon.unlink_console()//unlink the old beacon from new console
- if (express_console)//if this beacon has an express console
- express_console.beacon = null//remove the connection the expressconsole has from beacons
- express_console = C//set the linked console var to the console
- express_console.beacon = src//out with the old in with the news
- update_status(SP_LINKED)
- if (express_console.usingBeacon)
- update_status(SP_READY)
- to_chat(user, span_notice("[src] linked to [C]."))
-
-/obj/item/supplypod_beacon/AltClick(mob/user)
- if (!user.canUseTopic(src, !issilicon(user)))
- return
- if (express_console)
- unlink_console()
- else
- to_chat(user, span_alert("There is no linked console."))
-
-/obj/item/supplypod_beacon/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/pen)) //give a tag that is visible from the linked express console
- var/new_beacon_name = stripped_input(user, "What would you like the tag to be?")
- if(!user.canUseTopic(src, BE_CLOSE))
- return
- if(new_beacon_name)
- name += " ([tag])"
- return
- else
- return ..()
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index 4aecef90f53..7923fb2a19a 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -27,50 +27,56 @@ You can set verify to TRUE if you want send() to sleep until the client has the
var/last_asset_job = 0 // Last job done.
//This proc sends the asset to the client, but only if it needs it.
-//This proc blocks(sleeps) unless verify is set to false
-/proc/send_asset(client/client, asset_name, verify = TRUE)
+//This proc blocks(sleeps)
+/proc/send_asset(client/client, asset_name)
+ if(!send_asset_internal(client, asset_name))
+ return FALSE
+ client.sending |= asset_name
+ var/job = client.browse_queue_flush()
+ if(!isnull(job) && client) // if job is null we runtimed somehow
+ client.sending -= asset_name
+ client.cache |= asset_name
+ client.completed_asset_jobs -= job
+
+//This proc doesn't
+/proc/send_asset_async(client/client, asset_name)
+ if(!send_asset_internal(client, asset_name))
+ return FALSE
+ client.cache += asset_name
+ return TRUE
+
+/proc/send_asset_internal(client/client, asset_name)
if(!istype(client))
if(ismob(client))
var/mob/M = client
if(M.client)
client = M.client
-
else
- return 0
-
+ return FALSE
else
- return 0
+ return FALSE
if(client.cache.Find(asset_name) || client.sending.Find(asset_name))
- return 0
+ return FALSE
log_asset("Sending asset [asset_name] to client [client]")
client << browse_rsc(SSassets.cache[asset_name], asset_name)
- if(!verify)
- client.cache += asset_name
- return 1
+ return TRUE // sent, but not necessarily received
- client.sending |= asset_name
- var/job = ++client.last_asset_job
-
- client << browse({"
+/client/proc/browse_queue_flush()
+ var/job = ++last_asset_job
+ var/t = 0
+ var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * sending.len) + ASSET_CACHE_SEND_TIMEOUT
+ src << browse({"
"}, "window=asset_cache_browser")
-
- var/t = 0
- var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * client.sending.len) + ASSET_CACHE_SEND_TIMEOUT
- while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic()
+ while(!completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic()
stoplag(1) // Lock up the caller until this is received.
t++
- if(client)
- client.sending -= asset_name
- client.cache |= asset_name
- client.completed_asset_jobs -= job
-
- return 1
+ return job
//This proc blocks(sleeps) unless verify is set to false
/proc/send_asset_list(client/client, list/asset_list, verify = TRUE)
@@ -136,7 +142,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
send_asset(client, file)
else
concurrent_tracker++
- send_asset(client, file, verify=FALSE)
+ send_asset_async(client, file)
stoplag(0) //queuing calls like this too quickly can cause issues in some client versions
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 234cb96680c..0d83d641113 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -94,7 +94,7 @@ GLOBAL_LIST_EMPTY(respawncounts)
log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]")
//byond bug ID:2256651
- if (asset_cache_job && asset_cache_job in completed_asset_jobs)
+ if (asset_cache_job && (asset_cache_job in completed_asset_jobs))
to_chat(src, span_danger("An error has been detected in how my client is receiving resources. Attempting to correct.... (If you keep seeing these messages you might want to close byond and reconnect)"))
src << browse("...", "window=asset_cache_browser")
@@ -1116,7 +1116,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
return FALSE
return TRUE
-/client/proc/commendsomeone(var/forced = FALSE)
+/client/proc/commendsomeone(forced = FALSE)
if(!can_commend(forced))
return
if(alert(src,"Was there a character during this round that you would like to anonymously commend?", "Commendation", "YES", "NO") != "YES")
diff --git a/code/modules/client/customizer/customizers/organ/eyes.dm b/code/modules/client/customizer/customizers/organ/eyes.dm
index eba6a3b8d12..f3d1e937bcc 100644
--- a/code/modules/client/customizer/customizers/organ/eyes.dm
+++ b/code/modules/client/customizer/customizers/organ/eyes.dm
@@ -75,12 +75,19 @@
/datum/customizer_choice/organ/eyes/humanoid
-/datum/customizer_choice/organ/eyes/elf
- organ_type = /obj/item/organ/eyes/night_vision/elf
+/datum/customizer_choice/organ/eyes/full_darksight
+ organ_type = /obj/item/organ/eyes/night_vision/full_darksight
-/datum/customizer/organ/eyes/elf
- customizer_choices = list(/datum/customizer_choice/organ/eyes/elf)
- default_choice = /datum/customizer_choice/organ/eyes/elf
+/datum/customizer/organ/eyes/full_darksight
+ customizer_choices = list(/datum/customizer_choice/organ/eyes/full_darksight)
+ default_choice = /datum/customizer_choice/organ/eyes/full_darksight
+
+/datum/customizer_choice/organ/eyes/half_darksight
+ organ_type = /obj/item/organ/eyes/half_darksight
+
+/datum/customizer/organ/eyes/half_darksight
+ customizer_choices = list(/datum/customizer_choice/organ/eyes/half_darksight)
+ default_choice = /datum/customizer_choice/organ/eyes/half_darksight
/datum/customizer/organ/eyes/moth
customizer_choices = list(/datum/customizer_choice/organ/eyes/moth)
diff --git a/code/modules/client/customizer/customizers/organ/genitals.dm b/code/modules/client/customizer/customizers/organ/genitals.dm
index 8c029f6b1d8..4879ed4dd48 100644
--- a/code/modules/client/customizer/customizers/organ/genitals.dm
+++ b/code/modules/client/customizer/customizers/organ/genitals.dm
@@ -285,8 +285,8 @@
return
var/new_size = GLOB.named_ball_sizes[named_size]
testicles_entry.organ_size = sanitize_integer(new_size, MIN_TESTICLES_SIZE, MAX_TESTICLES_SIZE, DEFAULT_TESTICLES_SIZE)
- if("virile")
- testicles_entry.virility = !testicles_entry.virility
+ if("virile")
+ testicles_entry.virility = !testicles_entry.virility
/datum/customizer/organ/testicles/external
customizer_choices = list(/datum/customizer_choice/organ/testicles/external)
diff --git a/code/modules/client/darkmode.dm b/code/modules/client/darkmode.dm
index 394484cbee6..edd3a4d7faa 100644
--- a/code/modules/client/darkmode.dm
+++ b/code/modules/client/darkmode.dm
@@ -117,4 +117,4 @@ Thanks to spacemaniac and mcdonald for help with the JS side of this.
winset(src, "asset_cache_browser", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "tooltip", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "tooltip", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
-*/
\ No newline at end of file
+*/
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index c6f6c59f1b5..b14e189c9bd 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -781,7 +781,7 @@ GLOBAL_LIST_EMPTY(chosen_names)
popup.open(FALSE)
onclose(user, "capturekeypress", src)
-/datum/preferences/proc/SetChoices(mob/user, limit = 15, list/splitJobs = list("Watchmen Captain", "Prophet", "Merchant Prince", "Archivist", "Nightmaster", "Towner", "Grenzelhoft Mercenary", "Low Life", "Prisoner", "Chieftain"), widthPerColumn = 295, height = 620) //295 620
+/datum/preferences/proc/SetChoices(mob/user, limit = 15, list/splitJobs = list("Watchmen Captain", "Archpriest", "Merchant Prince", "Archivist", "Nightmaster", "Towner", "Grenzelhoft Mercenary", "Low Life", "Prisoner", "Chieftain"), widthPerColumn = 295, height = 620) //295 620
if(!SSjob)
return
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 4b677e72d32..9a8054a42a4 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -481,7 +481,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["custom_race_name"] >> custom_race_name
if(!valid_custom_race_name(null, custom_race_name, TRUE))
custom_race_name = null
-/* useless shit from hearthstone.
+/* useless shit from hearthstone.
S["alias"] >> alias
if(!valid_alias(null, alias, TRUE))
alias = null
@@ -704,7 +704,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
#endif
-/datum/preferences/proc/validate_job_prefs(var/list/job_prefs)
+/datum/preferences/proc/validate_job_prefs(list/job_prefs)
for(var/job in job_prefs)
if(!SSjob.GetJob(job))
job_prefs -= job
diff --git a/code/modules/client/roundendmanifest.dm b/code/modules/client/roundendmanifest.dm
index 65b2d6ce3ff..b22bf01fcfb 100644
--- a/code/modules/client/roundendmanifest.dm
+++ b/code/modules/client/roundendmanifest.dm
@@ -5,4 +5,4 @@
for(var/X in GLOB.character_list)
dat += "[GLOB.character_list[X]]"
- src << browse(dat, "window=manifest;size=387x420;can_close=1")
\ No newline at end of file
+ src << browse(dat, "window=manifest;size=387x420;can_close=1")
diff --git a/code/modules/client/verbs/ping.dm b/code/modules/client/verbs/ping.dm
index 3e700542c1d..a53a58a9eed 100644
--- a/code/modules/client/verbs/ping.dm
+++ b/code/modules/client/verbs/ping.dm
@@ -20,4 +20,4 @@
/client/verb/ping()
set name = "Ping"
set category = "Options"
- winset(src, null, "command=.display_ping+[world.time+world.tick_lag*TICK_USAGE_REAL/100]")
\ No newline at end of file
+ winset(src, null, "command=.display_ping+[world.time+world.tick_lag*TICK_USAGE_REAL/100]")
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index da2dc13b135..44d4d1eac72 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -223,7 +223,7 @@
var/obj/item/clothing/I = target
I.item_state = initial(picked_item.item_state)
I.mob_overlay_icon = initial(picked_item.mob_overlay_icon)
- if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing))
+ if(istype(I, /obj/item/clothing) && istype(picked_item, /obj/item/clothing))
var/obj/item/clothing/CL = I
var/obj/item/clothing/PCL = picked_item
CL.flags_cover = initial(PCL.flags_cover)
@@ -338,7 +338,7 @@
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/suit
chameleon_action.chameleon_name = "Suit"
- chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor, /obj/item/clothing/suit/changeling), only_root_path = TRUE)
+ chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/changeling), only_root_path = TRUE)
chameleon_action.initialize_disguises()
/obj/item/clothing/suit/chameleon/emp_act(severity)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 73e94d0d8b7..dcdbdb2fc38 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -73,8 +73,8 @@
var/detail_color
var/boobed_detail = TRUE //Whether details have their own boobed sprite
-/obj/item/clothing/New()
- ..()
+/obj/item/clothing/Initialize(mapload)
+ . = ..()
if(armor_class)
has_inspect_verb = TRUE
@@ -241,6 +241,12 @@
if(user.used_intent.type != INTENT_HARM && ismoth(M))
var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new
clothing_as_food.name = name
+ if(clothing_as_food.obj_integrity <= 10)
+ to_chat(M, span_notice("There is nothing left to eat on that..."))
+ return
+ if(clothing_as_food.smeltresult) //if its a smeltable damn thing its probably metal.
+ to_chat(M, span_notice("I can't eat that."))
+ return
if(clothing_as_food.attack(M, user, def_zone))
take_damage(15, sound_effect=FALSE)
qdel(clothing_as_food)
@@ -330,13 +336,14 @@
// Frankly just rewrite armor entirely. This system just sucks. This proc in particular should probably just set a broken flag,
// and code taking into account armor should check if an armor piece is not broken.
- for(var/x in armor)
- if(armor[x] > 0)
+ var/list/armorlist = armor.getList()
+ for(var/x in armorlist)
+ if(armorlist[x] > 0)
brokemessage = TRUE
- armor[x] = 0
+ armorlist[x] = 0
if(ismob(loc) && brokemessage)
var/mob/M = loc
- to_chat(M, "ARMOR BROKEN..!")
+ to_chat(M, "ARMOR BROKEN...!")
..()
/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 75028b190cd..15c7c6bda7f 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -52,7 +52,7 @@
/obj/item/clothing/mask/gas/welding/up
/obj/item/clothing/mask/gas/welding/up/Initialize()
- ..()
+ . = ..()
visor_toggling()
// ********************************************************************
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index bc0e4e5ef6d..8afbc1adcef 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -332,4 +332,4 @@
suit = /obj/item/clothing/suit/armor/vest
suit_store = /obj/item/gun/ballistic/rifle/boltaction
r_hand = /obj/item/megaphone
- head = /obj/item/clothing/head/intern
\ No newline at end of file
+ head = /obj/item/clothing/head/intern
diff --git a/code/modules/clothing/rogueclothes/ammopouch.dm b/code/modules/clothing/rogueclothes/ammopouch.dm
index afee950a68f..a42e5d4fcd5 100644
--- a/code/modules/clothing/rogueclothes/ammopouch.dm
+++ b/code/modules/clothing/rogueclothes/ammopouch.dm
@@ -21,7 +21,7 @@
sewrepair = TRUE
/obj/item/ammopouch/attackby(obj/A, loc, params)
- if(A.type in subtypesof(/obj/item/ammo_casing/caseless/rogue))
+ if(istype(A, /obj/item/ammo_casing/caseless/rogue))
if(bullets.len < max_storage)
A.forceMove(src)
bullets += A
diff --git a/code/modules/clothing/rogueclothes/armor.dm b/code/modules/clothing/rogueclothes/armor.dm
index 0c941998790..9f60ab761bc 100644
--- a/code/modules/clothing/rogueclothes/armor.dm
+++ b/code/modules/clothing/rogueclothes/armor.dm
@@ -308,6 +308,7 @@
desc = "Half plate in bikini form, still just as protective somehow."
icon = 'modular_stonehedge/icons/armor/armor.dmi'
mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi'
+ sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi'
icon_state = "halfplatekini"
item_state = "halfplatekini"
allowed_sex = list(FEMALE)
@@ -340,6 +341,7 @@
desc = "Full plate in bikini form, full package and full exposure."
icon = 'modular_stonehedge/icons/armor/armor.dmi'
mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi'
+ sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi'
icon_state = "platekini"
allowed_sex = list(FEMALE)
armor_class = ARMOR_CLASS_HEAVY
@@ -613,6 +615,7 @@
desc = "Flexible cowhide armor. Lightweight, better than nothing. Now in tasteful bikini shape."
icon = 'modular_stonehedge/icons/armor/armor.dmi'
mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi'
+ sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi'
icon_state = "leatherkini"
item_state = "leatherkini"
allowed_sex = list(FEMALE)
@@ -631,6 +634,7 @@
desc = "Studded leather is the most durable of all hides and leathers and about as light. This one is in bikini form."
icon = 'modular_stonehedge/icons/armor/armor.dmi'
mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi'
+ sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi'
icon_state = "studleatherkini"
item_state = "studleatherkini"
allowed_sex = list(FEMALE)
@@ -649,6 +653,7 @@
desc = "A light armor of wildbeast hide. Far more durable than leather. This will not keep a person warm though..."
icon = 'modular_stonehedge/icons/armor/armor.dmi'
mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi'
+ sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi'
icon_state = "hidearmorkini"
item_state = "hidearmorkini"
allowed_sex = list(FEMALE)
@@ -940,6 +945,7 @@
to_chat(user, span_warning("The curiass feels cold and dead."))
/obj/item/clothing/suit/roguetown/armor/plate/spellslingerarmor/dropped(mob/living/user) //Remove some bugfixing stuff in exchange for stricter checks.
+ . = ..()
if(active_item)
if(user.mind.get_skill_level(/datum/skill/magic/arcane))
var/mob/living/carbon/human/H = user
diff --git a/code/modules/clothing/rogueclothes/cloaks.dm b/code/modules/clothing/rogueclothes/cloaks.dm
index 8f65481a5b7..36b6ff54deb 100644
--- a/code/modules/clothing/rogueclothes/cloaks.dm
+++ b/code/modules/clothing/rogueclothes/cloaks.dm
@@ -93,7 +93,7 @@
return
/obj/item/clothing/cloak/tabard/knight/Initialize()
- ..()
+ . = ..()
if(GLOB.lordprimary)
lordcolor(GLOB.lordprimary,GLOB.lordsecondary)
else
@@ -109,7 +109,7 @@
boobed_detail = FALSE
/obj/item/clothing/cloak/tabard/crusader/Initialize()
- ..()
+ . = ..()
update_icon()
/obj/item/clothing/cloak/tabard/crusader/attack_right(mob/user)
@@ -223,7 +223,7 @@
L.update_inv_cloak()
/obj/item/clothing/cloak/tabard/knight/guard/Initialize()
- ..()
+ . = ..()
if(GLOB.lordprimary)
lordcolor(GLOB.lordprimary,GLOB.lordsecondary)
else
@@ -337,7 +337,7 @@
L.update_inv_cloak()
/obj/item/clothing/cloak/stabard/guard/Initialize()
- ..()
+ . = ..()
if(GLOB.lordprimary)
lordcolor(GLOB.lordprimary,GLOB.lordsecondary)
else
@@ -387,7 +387,7 @@
detail_tag = "_quad"
/obj/item/clothing/cloak/stabard/mercenary/Initialize()
- ..()
+ . = ..()
detail_tag = pick("_quad", "_spl", "_box", "_dim")
color = clothing_color2hex(pick(CLOTHING_COLOR_NAMES))
detail_color = clothing_color2hex(pick(CLOTHING_COLOR_NAMES))
@@ -486,7 +486,7 @@
/obj/item/clothing/cloak/stabard/surcoat/guard/Initialize()
- ..()
+ . = ..()
if(GLOB.lordprimary)
lordcolor(GLOB.lordprimary,GLOB.lordsecondary)
else
@@ -538,7 +538,7 @@
L.update_inv_cloak()
/obj/item/clothing/cloak/lordcloak/Initialize()
- ..()
+ . = ..()
if(GLOB.lordprimary)
lordcolor(GLOB.lordprimary,GLOB.lordsecondary)
else
@@ -888,7 +888,7 @@
inhand_mod = FALSE
/obj/item/clothing/cloak/half/vet/Initialize()
- ..()
+ . = ..()
if(GLOB.lordprimary)
lordcolor(GLOB.lordprimary,GLOB.lordsecondary)
else
@@ -976,6 +976,7 @@
user.check_attunement_points()
/obj/item/clothing/neck/roguetown/blkknight/dropped(mob/living/user)
+ ..()
if(!active_item)
return
active_item = FALSE
@@ -988,7 +989,7 @@
user.change_stat("endurance", -2)
user.change_stat("speed", -2)
else
- to_chat(user, span_notice("Strange, I don't feel that power anymore.."))
+ to_chat(user, span_notice("Strange, I don't feel that power anymore..."))
armor = getArmor("blunt" = 100, "slash" = 100, "stab" = 100, "bullet" = 100, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
user.attunement_points_used -= attunement_cost
user.check_attunement_points()
@@ -1043,7 +1044,7 @@
L.update_inv_cloak()
/obj/item/clothing/cloak/stabard/guardhood/Initialize()
- ..()
+ . = ..()
if(GLOB.lordprimary)
lordcolor(GLOB.lordprimary,GLOB.lordsecondary)
else
diff --git a/code/modules/clothing/rogueclothes/feet.dm b/code/modules/clothing/rogueclothes/feet.dm
index 1cc273de7a1..d43222a48f9 100644
--- a/code/modules/clothing/rogueclothes/feet.dm
+++ b/code/modules/clothing/rogueclothes/feet.dm
@@ -268,6 +268,9 @@
name = "fur lined boots"
desc = "Leather boots lined with fur."
gender = PLURAL
+ icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/feet.dmi'
+ mob_overlay_icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi'
+ sleeved = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi'
icon_state = "furlinedboots"
item_state = "furlinedboots"
sewrepair = TRUE
@@ -277,6 +280,9 @@
name = "fur lined anklets"
desc = "Leather anklets lined with fur, foot remains bare."
gender = PLURAL
+ icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/feet.dmi'
+ mob_overlay_icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi'
+ sleeved = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi'
icon_state = "furlinedanklets"
item_state = "furlinedanklets"
sewrepair = TRUE
diff --git a/code/modules/clothing/rogueclothes/hats.dm b/code/modules/clothing/rogueclothes/hats.dm
index d7bf7dcb209..5e873a358d3 100644
--- a/code/modules/clothing/rogueclothes/hats.dm
+++ b/code/modules/clothing/rogueclothes/hats.dm
@@ -263,6 +263,7 @@
sewrepair = TRUE
/obj/item/clothing/head/roguetown/priestmask/pickup(mob/living/user)
+ ..()
if(!HAS_TRAIT(user, TRAIT_CHOSEN))
to_chat(user, "UNWORTHY HANDS TOUCH THE VISAGE, CEASE OR BE PUNISHED")
spawn(30)
@@ -278,11 +279,11 @@
/obj/item/clothing/head/roguetown/roguehood/random/Initialize()
color = pick("#544236", "#435436", "#543836", "#79763f")
- ..()
+ return ..()
/obj/item/clothing/head/roguetown/roguehood/mage/Initialize()
color = pick("#4756d8", "#759259", "#bf6f39", "#c1b144", "#b8252c")
- ..()
+ return ..()
/obj/item/clothing/head/roguetown/roguehood/AdjustClothes(mob/user)
if(loc == user)
@@ -518,7 +519,7 @@
/obj/item/clothing/head/roguetown/priesthat
name = "priest's hat"
desc = ""
- icon_state = "Prophet"
+ icon_state = "Archpriest"
//dropshrink = 0
mob_overlay_icon = 'icons/roguetown/clothing/onmob/64x64/head.dmi'
dynamic_hair_suffix = "+generic"
@@ -1963,7 +1964,7 @@
"Stripes"="stripes_decoration",
"Red Castle"="castle_red_decoration",
"White Castle"="castle_white_decoration",
- "Graggar"="graggar_decoration",
+ "Jayx"="graggar_decoration",
"Efreet"="efreet_decoration",
"Sun"="sun_decoration",
"Feathers"="feathers_decoration",
@@ -2017,7 +2018,7 @@
"Stripes"="stripes_houndecoration",
"Red Castle"="castle_red_houndecoration",
"White Castle"="castle_white_houndecoration",
- "Graggar"="graggar_houndecoration",
+ "Jayx"="graggar_houndecoration",
"Efreet"="efreet_houndecoration",
"Sun"="sun_houndecoration",
"Feathers"="feathers_houndecoration",
@@ -2071,7 +2072,7 @@
"Stripes"="stripes_bucket",
"Red Castle"="castle_red_bucket",
"White Castle"="castle_white_bucket",
- "Graggar"="graggar_bucket",
+ "Jayx"="graggar_bucket",
"Efreet"="efreet_bucket",
"Sun"="sun_bucket",
"Feathers"="feathers_bucket",
@@ -2125,7 +2126,7 @@
"Stripes"="stripes_gbucket",
"Red Castle"="castle_red_gbucket",
"White Castle"="castle_white_gbucket",
- "Graggar"="graggar_gbucket",
+ "Jayx"="graggar_gbucket",
"Efreet"="efreet_gbucket",
"Sun"="sun_gbucket",
"Feathers"="feathers_gbucket",
diff --git a/code/modules/clothing/rogueclothes/mask.dm b/code/modules/clothing/rogueclothes/mask.dm
index 8c2240a422f..9d232395023 100644
--- a/code/modules/clothing/rogueclothes/mask.dm
+++ b/code/modules/clothing/rogueclothes/mask.dm
@@ -178,10 +178,10 @@
break_sound = 'sound/foley/breaksound.ogg'
drop_sound = 'sound/foley/dropsound/gen_drop.ogg'
resistance_flags = FIRE_PROOF
- armor = list("blunt" = 10, "slash" = 40, "stab" = 40, "bullet" = 8, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- prevent_crits = null
- flags_inv = HIDEFACE
- body_parts_covered = FACE
+ armor = list("blunt" = 45, "slash" = 100, "stab" = 80, "bullet" = 20, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT)
+ flags_inv = HIDEFACE|HIDEFACIALHAIR
+ body_parts_covered = FACE|EYES|MOUTH|HEAD|HAIR
block2add = FOV_BEHIND
slot_flags = ITEM_SLOT_MASK|ITEM_SLOT_HIP
experimental_onhip = TRUE
diff --git a/code/modules/clothing/rogueclothes/npc/goblin.dm b/code/modules/clothing/rogueclothes/npc/goblin.dm
index 5e8b702fd41..0fccdca6fa7 100644
--- a/code/modules/clothing/rogueclothes/npc/goblin.dm
+++ b/code/modules/clothing/rogueclothes/npc/goblin.dm
@@ -4,7 +4,7 @@
item_state = "plate_armor"
icon = 'icons/roguetown/mob/monster/goblins.dmi'
smeltresult = /obj/item/ingot/iron
- allowed_race = list(/mob/living/carbon/human/species/goblin)
+ allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon)
body_parts_covered = CHEST|GROIN|ARMS|LEGS|VITALS
sellprice = 0
@@ -14,16 +14,26 @@
item_state = "leather_armor"
icon = 'icons/roguetown/mob/monster/goblins.dmi'
body_parts_covered = CHEST|GROIN|ARMS|VITALS
- allowed_race = list(/mob/living/carbon/human/species/goblin)
+ allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon)
sellprice = 0
-/obj/item/clothing/suit/roguetown/armor/leather/hide/goblin
+// /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin
+// name = "goblin loincloth"
+// icon_state = "cloth_armor"
+// item_state = "cloth_armor"
+// icon = 'icons/roguetown/mob/monster/goblins.dmi'
+// allowed_race = list(/datum/species/goblin)
+// armor = null
+// sellprice = 0
+
+/obj/item/clothing/under/roguetown/loincloth/goblinloin
name = "goblin loincloth"
+ desc = "smells funny."
+ icon = 'icons/roguetown/mob/monster/goblins.dmi'
+ mob_overlay_icon = 'icons/roguetown/mob/monster/goblins.dmi'
icon_state = "cloth_armor"
item_state = "cloth_armor"
- icon = 'icons/roguetown/mob/monster/goblins.dmi'
- allowed_race = list(/mob/living/carbon/human/species/goblin)
- armor = null
+ allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon)
sellprice = 0
/obj/item/clothing/head/roguetown/helmet/leather/goblin
@@ -31,7 +41,7 @@
icon_state = "leather_helm_item"
item_state = "leather_helm"
icon = 'icons/roguetown/mob/monster/goblins.dmi'
- allowed_race = list(/mob/living/carbon/human/species/goblin)
+ allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon)
sellprice = 0
/obj/item/clothing/head/roguetown/helmet/goblin
@@ -39,7 +49,7 @@
icon_state = "plate_helm_item"
item_state = "plate_helm"
icon = 'icons/roguetown/mob/monster/goblins.dmi'
- allowed_race = list(/mob/living/carbon/human/species/goblin)
+ allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon)
body_parts_covered = HEAD|EARS|HAIR|EYES
sellprice = 0
smeltresult = /obj/item/ingot/iron
diff --git a/code/modules/clothing/rogueclothes/pants.dm b/code/modules/clothing/rogueclothes/pants.dm
index 3219ca0428c..7aa9cf700f5 100644
--- a/code/modules/clothing/rogueclothes/pants.dm
+++ b/code/modules/clothing/rogueclothes/pants.dm
@@ -124,6 +124,8 @@
name = "studded skirt"
icon = 'modular_stonehedge/icons/armor/pants.dmi'
mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/pants.dmi'
+ //slightly better than normal iron chain by 10 blunt and stab.
+ armor = list("blunt" = 50, "slash" = 80, "stab" = 50, "bullet" = 10, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
desc = "Short studded skirt made of fine leather and iron."
icon_state = "studdedskirt"
genitalaccess = TRUE
diff --git a/code/modules/clothing/rogueclothes/quiver.dm b/code/modules/clothing/rogueclothes/quiver.dm
index 634b67a071d..9a61c8a79a3 100644
--- a/code/modules/clothing/rogueclothes/quiver.dm
+++ b/code/modules/clothing/rogueclothes/quiver.dm
@@ -30,7 +30,7 @@
break
/obj/item/quiver/proc/eatarrow(obj/A)
- if(A.type in subtypesof(/obj/item/ammo_casing/caseless/rogue))
+ if(istype(A, /obj/item/ammo_casing/caseless/rogue))
if(arrows.len < max_storage)
A.forceMove(src)
arrows += A
@@ -40,7 +40,7 @@
return FALSE
/obj/item/quiver/attackby(obj/A, loc, params)
- if(A.type in subtypesof(/obj/item/ammo_casing/caseless/rogue))
+ if(istype(A, /obj/item/ammo_casing/caseless/rogue))
if(arrows.len < max_storage)
A.forceMove(src)
arrows += A
@@ -80,28 +80,28 @@
icon_state = "quiver0"
/obj/item/quiver/arrows/Initialize()
- ..()
+ . = ..()
for(var/i in 1 to max_storage)
var/obj/item/ammo_casing/caseless/rogue/arrow/A = new()
arrows += A
update_icon()
/obj/item/quiver/bolts/Initialize()
- ..()
+ . = ..()
for(var/i in 1 to max_storage)
var/obj/item/ammo_casing/caseless/rogue/bolt/A = new()
arrows += A
update_icon()
/obj/item/quiver/Parrows/Initialize()
- ..()
+ . = ..()
for(var/i in 1 to max_storage)
var/obj/item/ammo_casing/caseless/rogue/arrow/poison/A = new()
arrows += A
update_icon()
/obj/item/quiver/Pbolts/Initialize()
- ..()
+ . = ..()
for(var/i in 1 to max_storage)
var/obj/item/ammo_casing/caseless/rogue/bolt/poison/A = new()
arrows += A
diff --git a/code/modules/clothing/rogueclothes/rings.dm b/code/modules/clothing/rogueclothes/rings.dm
index 7498ccdf7b7..c42c305ec9e 100644
--- a/code/modules/clothing/rogueclothes/rings.dm
+++ b/code/modules/clothing/rogueclothes/rings.dm
@@ -13,8 +13,7 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
anvilrepair = /datum/skill/craft/armorsmithing
-/obj/item/clothing/ringP /////////////////////// cast focus ring for acolytes and shit.
- parent_type = /obj/item/clothing/neck/roguetown/psicross
+/obj/item/clothing/neck/roguetown/psicross/ringP /////////////////////// cast focus ring for acolytes and shit.
name = "psi ring"
desc = "a blessed psi ring, for the religious type"
w_class = WEIGHT_CLASS_TINY
@@ -27,7 +26,7 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
anvilrepair = /datum/skill/craft/blacksmithing
-/obj/item/clothing/ring/lantern
+/obj/item/flashlight/flare/torch/lantern/ring
parent_type = /obj/item/flashlight/flare/torch/lantern // Inherits parents properties from lantern
name = "alchemist ring"
icon_state = "lanternR"
@@ -48,10 +47,10 @@
slot_flags = ITEM_SLOT_RING
resistance_flags = FIRE_PROOF | ACID_PROOF
anvilrepair = /datum/skill/craft/blacksmithing
- fuel = 9999
+ fuel = 9999
sellprice = 30
-/obj/item/clothing/ring/lantern/MiddleClick(mob/living/user, params)
+/obj/item/flashlight/flare/torch/lantern/ring/MiddleClick(mob/living/user, params)
if (!on)
on = TRUE
to_chat(user, "With a flick of the thumb, you strike a flame.")
@@ -62,30 +61,13 @@
icon_state = "ring_s"
sellprice = 33
-/obj/item/clothing/ringP /////////////////////// cast focus ring for acolytes and shit.
- parent_type = /obj/item/clothing/neck/roguetown/psicross
- name = "psi ring"
- desc = "a blessed psi ring, for the religious type"
- w_class = WEIGHT_CLASS_TINY
- icon = 'icons/roguetown/clothing/rings.dmi'
- mob_overlay_icon = 'icons/roguetown/clothing/onmob/rings.dmi'
- sleeved = 'icons/roguetown/clothing/onmob/rings.dmi'
- sleevetype = "shirt"
- icon_state = "castring"
- slot_flags = ITEM_SLOT_RING
- resistance_flags = FIRE_PROOF | ACID_PROOF
- anvilrepair = /datum/skill/craft/blacksmithing
-
-
-
/obj/item/clothing/ring/gold
name = "gold ring"
icon_state = "ring_g"
sellprice = 45
-/obj/item/clothing/ring/lantern
- parent_type = /obj/item/flashlight/flare/torch/lantern // Inherits parents properties from lantern
+/obj/item/flashlight/flare/torch/lantern/ring
name = "alchemist ring"
icon_state = "lanternR"
w_class = WEIGHT_CLASS_TINY
@@ -105,10 +87,10 @@
slot_flags = ITEM_SLOT_RING
resistance_flags = FIRE_PROOF | ACID_PROOF
anvilrepair = /datum/skill/craft/blacksmithing
- fuel = 9999
+ fuel = 9999
sellprice = 30
-/obj/item/clothing/ring/lantern/MiddleClick(mob/living/user, params)
+/obj/item/flashlight/flare/torch/lantern/ring/MiddleClick(mob/living/user, params)
if (!on)
on = TRUE
to_chat(user, "With a flick of the thumb, you strike a flame.")
@@ -249,14 +231,14 @@
attunement_cost = 5
var/active_item
infusable = FALSE
-
+
/obj/item/clothing/ring/dragon_ring/equipped(mob/living/user)
. = ..()
if(active_item)
return
else
active_item = TRUE
- to_chat(user, span_notice("Here be dragons"))
+ to_chat(user, span_notice("Here be dragons."))
user.change_stat("strength", 2)
user.change_stat("constitution", 2)
user.change_stat("endurance", 2)
@@ -265,8 +247,9 @@
return
/obj/item/clothing/ring/dragon_ring/dropped(mob/living/user)
+ ..()
if(active_item)
- to_chat(user, span_notice("Gone is thy hoard"))
+ to_chat(user, span_notice("Gone is thy hoard."))
user.change_stat("strength", -2)
user.change_stat("constitution", -2)
user.change_stat("endurance", -2)
diff --git a/code/modules/clothing/rogueclothes/robes.dm b/code/modules/clothing/rogueclothes/robes.dm
index a3db50a43e7..83b43bbda3c 100644
--- a/code/modules/clothing/rogueclothes/robes.dm
+++ b/code/modules/clothing/rogueclothes/robes.dm
@@ -1,5 +1,5 @@
/obj/item/clothing/suit/roguetown/shirt/robe
- slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_CLOAK
+ slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_SHIRT
name = "robe"
desc = ""
body_parts_covered = CHEST|GROIN|ARMS|LEGS|VITALS
@@ -274,7 +274,7 @@
icon = 'icons/roguetown/clothing/armor.dmi'
mob_overlay_icon = 'icons/roguetown/clothing/onmob/armor.dmi'
icon_state = "feldrobe"
- slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK
+ slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_SHIRT
sleeved = null
boobed = TRUE
color = null
@@ -288,7 +288,7 @@
icon = 'icons/roguetown/clothing/armor.dmi'
mob_overlay_icon = 'icons/roguetown/clothing/onmob/armor.dmi'
icon_state = "surgrobe"
- slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK
+ slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_SHIRT
sleeved = null
boobed = TRUE
color = null
diff --git a/code/modules/clothing/rogueclothes/shirts.dm b/code/modules/clothing/rogueclothes/shirts.dm
index 762dcef9c6a..9b9ca125907 100644
--- a/code/modules/clothing/rogueclothes/shirts.dm
+++ b/code/modules/clothing/rogueclothes/shirts.dm
@@ -52,7 +52,7 @@
color = CLOTHING_RED
/obj/item/clothing/suit/roguetown/shirt/undershirt/guard/Initialize()
- ..()
+ . = ..()
if(GLOB.lordprimary)
lordcolor(GLOB.lordprimary,GLOB.lordsecondary)
else
@@ -67,7 +67,7 @@
color = CLOTHING_PURPLE
/obj/item/clothing/suit/roguetown/shirt/undershirt/guardsecond/Initialize()
- ..()
+ . = ..()
if(GLOB.lordprimary)
lordcolor(GLOB.lordprimary,GLOB.lordsecondary)
else
diff --git a/code/modules/clothing/rogueclothes/wrists.dm b/code/modules/clothing/rogueclothes/wrists.dm
index a104d186762..92e02aec177 100644
--- a/code/modules/clothing/rogueclothes/wrists.dm
+++ b/code/modules/clothing/rogueclothes/wrists.dm
@@ -24,7 +24,7 @@
armor = list("blunt" = 90, "slash" = 100, "stab" = 80, "bullet" = 100, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST)
blocksound = PLATEHIT
- max_integrity = 150
+ max_integrity = 450
anvilrepair = /datum/skill/craft/armorsmithing
smeltresult = /obj/item/ingot/steel
@@ -37,7 +37,7 @@
armor = list("blunt" = 70, "slash" = 90, "stab" = 60, "bullet" = 50, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST)
blocksound = PLATEHIT
- max_integrity = 100
+ max_integrity = 200
anvilrepair = /datum/skill/craft/armorsmithing
smeltresult = /obj/item/ingot/iron
@@ -106,7 +106,7 @@
/obj/item/clothing/wrists/roguetown/hiddenblade
name = "leather bracers"
- desc = "Leather bracers worn on the wrists... With a hidden blade within."
+ desc = "Leather bracers worn on the wrists... With a contraption within."
body_parts_covered = ARMS
icon_state = "lbracers"
item_state = "lbracers"
@@ -117,7 +117,7 @@
sewrepair = TRUE
smeltresult = /obj/item/ingot/steel
var/extended = FALSE
- var/obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden/hid
+ var/obj/item/rogueweapon/huntingknife/idagger/steel/hidden/hid
/obj/item/clothing/wrists/roguetown/hiddenblade/dropped(mob/user)
. = ..()
@@ -128,14 +128,14 @@
toggleblades(user)
/obj/item/clothing/wrists/roguetown/hiddenblade/attackby(obj/A, mob/living/carbon/human/user, params)
- if(src == user.get_item_by_slot(SLOT_WRISTS) && (istype(A, /obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden) || !A)) //blade or empty hand.
+ if(src == user.get_item_by_slot(SLOT_WRISTS) && (istype(A, /obj/item/rogueweapon/huntingknife/idagger/steel/hidden) || !A)) //blade or empty hand.
toggleblades(user)
- return ..()
+ . = ..()
/obj/item/clothing/wrists/roguetown/hiddenblade/proc/toggleblades(mob/user)
if(extended)
- if(istype(user.get_active_held_item(), /obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden))
+ if(istype(user.get_active_held_item(), /obj/item/rogueweapon/huntingknife/idagger/steel/hidden))
user.dropItemToGround(hid, TRUE)
user.visible_message("A blade retracts into [user]'s bracer.", "My hidden blade retracts into my bracer.")
extended = FALSE
@@ -148,10 +148,9 @@
user.put_in_hands(hid, TRUE, FALSE, TRUE)
user.visible_message("A blade ejects out from [user]'s bracer.", "My hidden blade ejects out of my bracer.")
extended = TRUE
- ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
-
+ //ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
-/obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden
+/obj/item/rogueweapon/huntingknife/idagger/steel/hidden
name = "hidden blade"
desc = ""
embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 0, "embedded_fall_chance" = 0)
diff --git a/code/modules/clothing/shoes/implant_exile.dm b/code/modules/clothing/shoes/implant_exile.dm
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 511f44222ea..ae065407ee3 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -374,7 +374,7 @@
if(occupants.len >= max_occupants)
to_chat(user, span_warning("[src] are full!"))
return
- if(istype(target, /mob/living/simple_animal/hostile/retaliate/poison/snake) || istype(target, /mob/living/simple_animal/hostile/headcrab) || istype(target, /mob/living/carbon/alien/larva))
+ if(istype(target, /mob/living/simple_animal/hostile/retaliate/poison/snake))
occupants += target
target.forceMove(src)
to_chat(user, span_notice("[target] slithers into [src]."))
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 7194250467e..dde38853f34 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -473,15 +473,6 @@
icon_state = "gothcoat"
item_state = "gothcoat"
-/obj/item/clothing/suit/xenos
- name = "xenos suit"
- desc = ""
- icon_state = "xenos"
- item_state = "xenos_helm"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- allowed = list(/obj/item/clothing/mask/facehugger/toy)
-
/obj/item/clothing/suit/nemes
name = "pharoah tunic"
desc = ""
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 3f7004d1df0..7eefe3e10c5 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -166,7 +166,7 @@
if(!isliving(usr))
return
if(!robe_charge)
- to_chat(usr, span_warning("The robe's internal magic supply is still recharging!"))
+ to_chat(usr, span_warning("\The [src]'s internal magic supply is still recharging!"))
return
usr.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning")
@@ -177,7 +177,7 @@
src.robe_charge = FALSE
sleep(30)
src.robe_charge = TRUE
- to_chat(usr, span_notice("The robe hums, its internal magic supply restored."))
+ to_chat(usr, span_notice("\The [src] hums, its internal magic supply restored."))
//Shielded Armour
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index d028af11b4b..7c3c57dec39 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -127,8 +127,6 @@
to_chat(user, span_notice("I refill the suit's built-in extinguisher, using up the cartridge."))
qdel(E)
return
- return
- return
/obj/item/extinguisher_refill
name = "envirosuit extinguisher cartridge"
diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm
index ebf4dae2076..b7aab2255b0 100644
--- a/code/modules/detectivework/footprints_and_rag.dm
+++ b/code/modules/detectivework/footprints_and_rag.dm
@@ -38,7 +38,7 @@
C.visible_message(span_notice("[user] has touched \the [C] with \the [src]."))
log_combat(user, C, "touched", src, log_object)
- else if(istype(A) && src in user)
+ else if(istype(A) && (src in user))
user.visible_message(span_notice("[user] starts to wipe down [A] with [src]!"), span_notice("I start to wipe down [A] with [src]..."))
if(do_after(user,30, target = A))
user.visible_message(span_notice("[user] finishes wiping off [A]!"), span_notice("I finish wiping off [A]."))
diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm
index 9791f89e14f..96d9a311c8c 100644
--- a/code/modules/error_handler/error_handler.dm
+++ b/code/modules/error_handler/error_handler.dm
@@ -18,14 +18,14 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
//if we got to here without silently ending, the byond bug has been fixed.
log_world("The bug with recursion runtimes has been fixed. Please remove the snowflake check from world/Error in [__FILE__]:[__LINE__]")
return //this will never happen.
-
+
else if(copytext(E.name,1,18) == "Out of resources!")
log_world("BYOND out of memory. Restarting")
log_game("BYOND out of memory. Restarting")
TgsEndProcess()
Reboot(reason = 1)
return ..()
-
+
if (islist(stack_trace_storage))
for (var/line in splittext(E.desc, "\n"))
if (text2ascii(line) != 32)
@@ -128,7 +128,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
#ifdef UNIT_TESTS
if(GLOB.current_test)
//good day, sir
- GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]")
+ GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]", E.file, E.line)
#endif
diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm
deleted file mode 100644
index 6f239f7aa22..00000000000
--- a/code/modules/events/abductor.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-/datum/round_event_control/abductor
- name = "Abductors"
- typepath = /datum/round_event/ghost_role/abductor
- weight = 10
- max_occurrences = 1
- min_players = 20
- gamemode_blacklist = list("nuclear","wizard","revolution")
-
-/datum/round_event/ghost_role/abductor
- minimum_required = 2
- role_name = "abductor team"
- fakeable = FALSE //Nothing to fake here
-
-/datum/round_event/ghost_role/abductor/spawn_role()
- var/list/mob/dead/observer/candidates = get_candidates(ROLE_ABDUCTOR, null, ROLE_ABDUCTOR)
-
- if(candidates.len < 2)
- return NOT_ENOUGH_PLAYERS
-
- var/mob/living/carbon/human/agent = makeBody(pick_n_take(candidates))
- var/mob/living/carbon/human/scientist = makeBody(pick_n_take(candidates))
-
- var/datum/team/abductor_team/T = new
- if(T.team_number > ABDUCTOR_MAX_TEAMS)
- return MAP_ERROR
-
- log_game("[key_name(scientist)] has been selected as [T.name] abductor scientist.")
- log_game("[key_name(agent)] has been selected as [T.name] abductor agent.")
-
- scientist.mind.add_antag_datum(/datum/antagonist/abductor/scientist, T)
- agent.mind.add_antag_datum(/datum/antagonist/abductor/agent, T)
-
- spawned_mobs += list(agent, scientist)
-
- return SUCCESSFUL_SPAWN
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
deleted file mode 100644
index 26c5812b46c..00000000000
--- a/code/modules/events/alien_infestation.dm
+++ /dev/null
@@ -1,78 +0,0 @@
-/datum/round_event_control/alien_infestation
- name = "Alien Infestation"
- typepath = /datum/round_event/ghost_role/alien_infestation
- weight = 5
-
- min_players = 10
-
-/datum/round_event_control/alien_infestation/canSpawnEvent()
- . = ..()
- if(!.)
- return .
-
- for(var/mob/living/carbon/alien/A in GLOB.player_list)
- if(A.stat != DEAD)
- return FALSE
-
-/datum/round_event/ghost_role/alien_infestation
- announceWhen = 400
-
- minimum_required = 1
- role_name = "alien larva"
-
- // 50% chance of being incremented by one
- var/spawncount = 1
- fakeable = TRUE
-
-
-/datum/round_event/ghost_role/alien_infestation/setup()
- announceWhen = rand(announceWhen, announceWhen + 50)
- if(prob(50))
- spawncount++
-
-/datum/round_event/ghost_role/alien_infestation/announce(fake)
- var/living_aliens = FALSE
- for(var/mob/living/carbon/alien/A in GLOB.player_list)
- if(A.stat != DEAD)
- living_aliens = TRUE
-
- if(living_aliens || fake)
- priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/blank.ogg')
-
-
-/datum/round_event/ghost_role/alien_infestation/spawn_role()
- var/list/vents = list()
- for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines)
- if(QDELETED(temp_vent))
- continue
- if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
- var/datum/pipeline/temp_vent_parent = temp_vent.parents[1]
- if(!temp_vent_parent)
- continue//no parent vent
- //Stops Aliens getting stuck in small networks.
- //See: Security, Virology
- if(temp_vent_parent.other_atmosmch.len > 20)
- vents += temp_vent
-
- if(!vents.len)
- message_admins("An event attempted to spawn an alien but no suitable vents were found. Shutting down.")
- return MAP_ERROR
-
- var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
-
- if(!candidates.len)
- return NOT_ENOUGH_PLAYERS
-
- while(spawncount > 0 && vents.len && candidates.len)
- var/obj/vent = pick_n_take(vents)
- var/client/C = pick_n_take(candidates)
-
- var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
- new_xeno.key = C.key
-
- spawncount--
- message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by an event.")
- log_game("[key_name(new_xeno)] was spawned as an alien by an event.")
- spawned_mobs += new_xeno
-
- return SUCCESSFUL_SPAWN
diff --git a/code/modules/events/creep_awakening.dm b/code/modules/events/creep_awakening.dm
index d0269b8ddef..b8842119ba4 100644
--- a/code/modules/events/creep_awakening.dm
+++ b/code/modules/events/creep_awakening.dm
@@ -13,7 +13,7 @@
continue
if(H.stat == DEAD)
continue
- if(!SSjob.GetJob(H.mind.assigned_role) || H.mind.assigned_role in GLOB.nonhuman_positions) //only station jobs sans nonhuman roles, prevents ashwalkers trying to stalk with crewmembers they never met
+ if(!SSjob.GetJob(H.mind.assigned_role) || (H.mind.assigned_role in GLOB.nonhuman_positions)) //only station jobs sans nonhuman roles, prevents ashwalkers trying to stalk with crewmembers they never met
continue
if(H.mind.has_antag_datum(/datum/antagonist/obsessed))
continue
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
deleted file mode 100644
index eb7edcafbf8..00000000000
--- a/code/modules/events/dust.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-/datum/round_event_control/space_dust
- name = "Minor Space Dust"
- typepath = /datum/round_event/space_dust
- weight = 200
- max_occurrences = 1000
- earliest_start = 0 MINUTES
- alert_observers = FALSE
-
-/datum/round_event/space_dust
- startWhen = 1
- endWhen = 2
- fakeable = FALSE
-
-/datum/round_event/space_dust/start()
- spawn_meteors(1, GLOB.meteorsC)
-
-/datum/round_event_control/sandstorm
- name = "Sandstorm"
- typepath = /datum/round_event/sandstorm
- weight = 0
- max_occurrences = 0
- earliest_start = 0 MINUTES
-
-/datum/round_event/sandstorm
- startWhen = 1
- endWhen = 150 // ~5 min
- announceWhen = 0
- fakeable = FALSE
-
-/datum/round_event/sandstorm/tick()
- spawn_meteors(10, GLOB.meteorsC)
diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm
deleted file mode 100644
index fd7f6349ad4..00000000000
--- a/code/modules/events/fugitive_spawning.dm
+++ /dev/null
@@ -1,115 +0,0 @@
-/datum/round_event_control/fugitives
- name = "Spawn Fugitives"
- typepath = /datum/round_event/ghost_role/fugitives
- max_occurrences = 1
- min_players = 20
- earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on.
- gamemode_blacklist = list("nuclear")
-
-/datum/round_event/ghost_role/fugitives
- minimum_required = 1
- role_name = "fugitive"
- fakeable = FALSE
-
-/datum/round_event/ghost_role/fugitives/spawn_role()
- var/list/possible_spawns = list()//Some xeno spawns are in some spots that will instantly kill the refugees, like atmos
- for(var/turf/X in GLOB.xeno_spawn)
- if(istype(X.loc, /area/maintenance))
- possible_spawns += X
- if(!possible_spawns.len)
- message_admins("No valid spawn locations found, aborting...")
- return MAP_ERROR
- var/turf/landing_turf = pick(possible_spawns)
- var/list/possible_backstories = list()
- var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR)
- if(candidates.len >= 1) //solo refugees
- if(prob(30))
- possible_backstories.Add("waldo") //less common as it comes with magicks and is kind of immershun shattering
- if(candidates.len >= 4)//group refugees
- possible_backstories.Add("prisoner", "cultist", "synth")
- if(!possible_backstories.len)
- return NOT_ENOUGH_PLAYERS
-
- var/backstory = pick(possible_backstories)
- var/member_size = 3
- var/leader
- switch(backstory)
- if("synth")
- leader = pick_n_take(candidates)
- if("waldo")
- member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later
- var/list/members = list()
- var/list/spawned_mobs = list()
- if(isnull(leader))
- member_size++ //if there is no leader role, then the would be leader is a normal member of the team.
-
- for(var/i in 1 to member_size)
- members += pick_n_take(candidates)
-
- for(var/mob/dead/selected in members)
- var/mob/living/carbon/human/S = gear_fugitive(selected, landing_turf, backstory)
- spawned_mobs += S
- if(!isnull(leader))
- gear_fugitive_leader(leader, landing_turf, backstory)
-
-//after spawning
- playsound(src, 'sound/blank.ogg', 50, TRUE)
- new /obj/item/storage/toolbox/mechanical(landing_turf) //so they can actually escape maint
- addtimer(CALLBACK(src, PROC_REF(spawn_hunters)), 10 MINUTES)
- role_name = "fugitive hunter"
- return SUCCESSFUL_SPAWN
-
-/datum/round_event/ghost_role/fugitives/proc/gear_fugitive(mob/dead/selected, turf/landing_turf, backstory) //spawns normal fugitive
- var/datum/mind/player_mind = new /datum/mind(selected.key)
- player_mind.active = TRUE
- var/mob/living/carbon/human/S = new(landing_turf)
- player_mind.transfer_to(S)
- player_mind.assigned_role = "Fugitive"
- player_mind.special_role = "Fugitive"
- player_mind.add_antag_datum(/datum/antagonist/fugitive)
- var/datum/antagonist/fugitive/fugitiveantag = player_mind.has_antag_datum(/datum/antagonist/fugitive)
- INVOKE_ASYNC(fugitiveantag, TYPE_PROC_REF(/datum/antagonist/fugitive, greet), backstory) //some fugitives have a sleep on their greet, so we don't want to stop the entire antag granting proc with fluff
-
- switch(backstory)
- if("prisoner")
- S.equipOutfit(/datum/outfit/prisoner)
- if("cultist")
- S.equipOutfit(/datum/outfit/yalp_cultist)
- if("waldo")
- S.equipOutfit(/datum/outfit/waldo)
- if("synth")
- S.equipOutfit(/datum/outfit/synthetic)
- message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Fugitive by an event.")
- log_game("[key_name(S)] was spawned as a Fugitive by an event.")
- spawned_mobs += S
- return S
-
- //special spawn for one member. it can be used for a special mob or simply to give one normal member special items.
-/datum/round_event/ghost_role/fugitives/proc/gear_fugitive_leader(mob/dead/leader, turf/landing_turf, backstory)
- var/datum/mind/player_mind = new /datum/mind(leader.key)
- player_mind.active = TRUE
- //if you want to add a fugitive with a special leader in the future, make this switch with the backstory
- var/mob/living/carbon/human/S = gear_fugitive(leader, landing_turf, backstory)
- var/obj/item/choice_beacon/augments/A = new(S)
- S.put_in_hands(A)
- new /obj/item/autosurgeon(landing_turf)
-
-//security team gets called in after 10 minutes of prep to find the refugees
-/datum/round_event/ghost_role/fugitives/proc/spawn_hunters()
- var/backstory = pick("space cop", "russian", "bounty hunter")
- var/datum/map_template/shuttle/ship
- if(backstory == "space cop")
- ship = new /datum/map_template/shuttle/hunter/space_cop
- else if (backstory == "russian")
- ship = new /datum/map_template/shuttle/hunter/russian
- else
- ship = new /datum/map_template/shuttle/hunter/bounty
- var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width)
- var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height)
- var/z = SSmapping.empty_space.z_value
- var/turf/T = locate(x,y,z)
- if(!T)
- CRASH("Fugitive Hunters (Created from fugitive event) found no turf to load in")
- if(!ship.load(T))
- CRASH("Loading [backstory] ship failed!")
- priority_announce("Unidentified ship detected near the station.")
diff --git a/code/modules/events/high_priority_bounty.dm b/code/modules/events/high_priority_bounty.dm
deleted file mode 100644
index ffdcd8840b7..00000000000
--- a/code/modules/events/high_priority_bounty.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/datum/round_event_control/high_priority_bounty
- name = "High Priority Bounty"
- typepath = /datum/round_event/high_priority_bounty
- max_occurrences = 3
- weight = 20
- earliest_start = 10
-
-/datum/round_event/high_priority_bounty/announce(fake)
- priority_announce("Central Command has issued a high-priority cargo bounty. Details have been sent to all bounty consoles.", "Nanotrasen Bounty Program")
-
-/datum/round_event/high_priority_bounty/start()
- var/datum/bounty/B
- for(var/attempts = 0; attempts < 50; ++attempts)
- B = random_bounty()
- if(!B)
- continue
- B.mark_high_priority(3)
- if(try_add_bounty(B))
- break
-
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
deleted file mode 100644
index a9b99e858dd..00000000000
--- a/code/modules/events/immovable_rod.dm
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
-Immovable rod random event.
-The rod will spawn at some location outside the station, and travel in a straight line to the opposite side of the station
-Everything solid in the way will be ex_act()'d
-In my current plan for it, 'solid' will be defined as anything with density == 1
-
---NEOFite
-*/
-
-/datum/round_event_control/immovable_rod
- name = "Immovable Rod"
- typepath = /datum/round_event/immovable_rod
- min_players = 15
- max_occurrences = 5
- var/atom/special_target
-
-
-/datum/round_event_control/immovable_rod/admin_setup()
- if(!check_rights(R_FUN))
- return
-
- var/aimed = alert("Aimed at current location?","Sniperod", "Yes", "No")
- if(aimed == "Yes")
- special_target = get_turf(usr)
-
-/datum/round_event/immovable_rod
- announceWhen = 5
-
-/datum/round_event/immovable_rod/announce(fake)
- priority_announce("What the fuck was that?!", "General Alert")
-
-/datum/round_event/immovable_rod/start()
- var/datum/round_event_control/immovable_rod/C = control
- var/startside = pick(GLOB.cardinals)
- var/z = pick(SSmapping.levels_by_trait(ZTRAIT_STATION))
- var/turf/startT = spaceDebrisStartLoc(startside, z)
- var/turf/endT = spaceDebrisFinishLoc(startside, z)
- var/atom/rod = new /obj/effect/immovablerod(startT, endT, C.special_target)
- announce_to_ghosts(rod)
-
-/obj/effect/immovablerod
- name = "immovable rod"
- desc = ""
- icon = 'icons/obj/objects.dmi'
- icon_state = "immrod"
- throwforce = 100
- move_force = INFINITY
- move_resist = INFINITY
- pull_force = INFINITY
- density = TRUE
- anchored = TRUE
- flags_1 = PREVENT_CONTENTS_EXPLOSION_1
- var/mob/living/wizard
- var/z_original = 0
- var/destination
- var/notify = TRUE
- var/atom/special_target
-
-/obj/effect/immovablerod/New(atom/start, atom/end, aimed_at)
- ..()
- SSaugury.register_doom(src, 2000)
- z_original = z
- destination = end
- special_target = aimed_at
- GLOB.poi_list += src
-
- var/special_target_valid = FALSE
- if(special_target)
- var/turf/T = get_turf(special_target)
- if(T.z == z_original)
- special_target_valid = TRUE
- if(special_target_valid)
- walk_towards(src, special_target, 1)
- else if(end && end.z==z_original)
- walk_towards(src, destination, 1)
-
-/obj/effect/immovablerod/Topic(href, href_list)
- if(href_list["orbit"])
- var/mob/dead/observer/ghost = usr
- if(istype(ghost))
- ghost.ManualFollow(src)
-
-/obj/effect/immovablerod/Destroy()
- GLOB.poi_list -= src
- . = ..()
-
-/obj/effect/immovablerod/Moved()
- if((z != z_original) || (loc == destination))
- qdel(src)
- if(special_target && loc == get_turf(special_target))
- complete_trajectory()
- return ..()
-
-/obj/effect/immovablerod/proc/complete_trajectory()
- //We hit what we wanted to hit, time to go
- special_target = null
- destination = get_edge_target_turf(src, dir)
- walk(src,0)
- walk_towards(src, destination, 1)
-
-/obj/effect/immovablerod/ex_act(severity, target)
- return 0
-
-/obj/effect/immovablerod/singularity_act()
- return
-
-/obj/effect/immovablerod/singularity_pull()
- return
-
-/obj/effect/immovablerod/Bump(atom/clong)
- if(prob(10))
- playsound(src, 'sound/blank.ogg', 50, TRUE)
- audible_message(span_danger("I hear a CLANG!"))
-
- if(clong && prob(25))
- x = clong.x
- y = clong.y
-
- if(special_target && clong == special_target)
- complete_trajectory()
-
- if(isturf(clong) || isobj(clong))
- if(clong.density)
- clong.ex_act(EXPLODE_HEAVY)
-
- else if(isliving(clong))
- penetrate(clong)
- else if(istype(clong, type))
- var/obj/effect/immovablerod/other = clong
- visible_message("[src] collides with [other]!\
- ")
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(2, get_turf(src))
- smoke.start()
- qdel(src)
- qdel(other)
-
-/obj/effect/immovablerod/proc/penetrate(mob/living/L)
- L.visible_message(span_danger("[L] is penetrated by an immovable rod!") , span_danger("The rod penetrates you!") , span_danger("I hear a CLANG!"))
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- H.adjustBruteLoss(160)
- if(L && (L.density || prob(10)))
- L.ex_act(EXPLODE_HEAVY)
-
-/obj/effect/immovablerod/attack_hand(mob/living/user)
- if(ishuman(user))
- var/mob/living/carbon/human/U = user
- if(U.job in list("Research Director"))
- playsound(src, 'sound/blank.ogg', 100, TRUE)
- for(var/mob/M in urange(8, src))
- if(!M.stat)
- shake_camera(M, 2, 3)
- if(wizard)
- U.visible_message(span_boldwarning("[src] transforms into [wizard] as [U] suplexes them!"), span_warning("As you grab [src], it suddenly turns into [wizard] as you suplex them!"))
- to_chat(wizard, span_boldwarning("You're suddenly jolted out of rod-form as [U] somehow manages to grab you, slamming you into the ground!"))
- wizard.Stun(60)
- wizard.apply_damage(25, BRUTE)
- qdel(src)
- else
- U.client.give_award(/datum/award/achievement/misc/feat_of_strength, U) //rod-form wizards would probably make this a lot easier to get so keep it to regular rods only
- U.visible_message(span_boldwarning("[U] suplexes [src] into the ground!"), span_warning("I suplex [src] into the ground!"))
- new /obj/structure/festivus/anchored(drop_location())
- new /obj/effect/anomaly/flux(drop_location())
- qdel(src)
diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm
deleted file mode 100644
index 7fb00124a94..00000000000
--- a/code/modules/events/major_dust.dm
+++ /dev/null
@@ -1,19 +0,0 @@
-/datum/round_event_control/meteor_wave/major_dust
- name = "Major Space Dust"
- typepath = /datum/round_event/meteor_wave/major_dust
- weight = 8
-
-/datum/round_event/meteor_wave/major_dust
- wave_name = "space dust"
-
-/datum/round_event/meteor_wave/major_dust/announce(fake)
- var/reason = pick(
- "The station is passing through a debris cloud, expect minor damage \
- to external fittings and fixtures.",
- "Nanotrasen Superweapons Division is testing a new prototype \
- [pick("field","projection","nova","super-colliding","reactive")] \
- [pick("cannon","artillery","tank","cruiser","\[REDACTED\]")], \
- some mild debris is expected.",
- "A neighbouring station is throwing rocks at you. (Perhaps they've \
- grown tired of your messages.)")
- priority_announce(pick(reason), "Collision Alert")
diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm
deleted file mode 100644
index b5b9eeb0aaa..00000000000
--- a/code/modules/events/meateor_wave.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/datum/round_event_control/meteor_wave/meaty
- name = "Meteor Wave: Meaty"
- typepath = /datum/round_event/meteor_wave/meaty
- weight = 2
- max_occurrences = 1
-
-/datum/round_event/meteor_wave/meaty
- wave_name = "meaty"
-
-/datum/round_event/meteor_wave/meaty/announce(fake)
- priority_announce("Meaty ores have been detected on collision course with the station.", "Oh crap, get the mop.",'sound/blank.ogg')
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
deleted file mode 100644
index 503d7ce1534..00000000000
--- a/code/modules/events/meteor_wave.dm
+++ /dev/null
@@ -1,71 +0,0 @@
-// Normal strength
-
-/datum/round_event_control/meteor_wave
- name = "Meteor Wave: Normal"
- typepath = /datum/round_event/meteor_wave
- weight = 4
- min_players = 15
- max_occurrences = 3
- earliest_start = 25 MINUTES
-
-/datum/round_event/meteor_wave
- startWhen = 6
- endWhen = 66
- announceWhen = 1
- var/list/wave_type
- var/wave_name = "normal"
-
-/datum/round_event/meteor_wave/New()
- ..()
- if(!wave_type)
- determine_wave_type()
-
-/datum/round_event/meteor_wave/proc/determine_wave_type()
- if(!wave_name)
- wave_name = pickweight(list(
- "normal" = 50,
- "threatening" = 40,
- "catastrophic" = 10))
- switch(wave_name)
- if("normal")
- wave_type = GLOB.meteors_normal
- if("threatening")
- wave_type = GLOB.meteors_threatening
- if("catastrophic")
- wave_type = GLOB.meteors_catastrophic
- if("meaty")
- wave_type = GLOB.meteorsB
- if("space dust")
- wave_type = GLOB.meteorsC
- else
- WARNING("Wave name of [wave_name] not recognised.")
- kill()
-
-/datum/round_event/meteor_wave/announce(fake)
- priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/blank.ogg')
-
-/datum/round_event/meteor_wave/tick()
- if(ISMULTIPLE(activeFor, 3))
- spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm
-
-/datum/round_event_control/meteor_wave/threatening
- name = "Meteor Wave: Threatening"
- typepath = /datum/round_event/meteor_wave/threatening
- weight = 5
- min_players = 20
- max_occurrences = 3
- earliest_start = 35 MINUTES
-
-/datum/round_event/meteor_wave/threatening
- wave_name = "threatening"
-
-/datum/round_event_control/meteor_wave/catastrophic
- name = "Meteor Wave: Catastrophic"
- typepath = /datum/round_event/meteor_wave/catastrophic
- weight = 7
- min_players = 25
- max_occurrences = 3
- earliest_start = 45 MINUTES
-
-/datum/round_event/meteor_wave/catastrophic
- wave_name = "catastrophic"
diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm
deleted file mode 100644
index 5da52d6fc03..00000000000
--- a/code/modules/events/nightmare.dm
+++ /dev/null
@@ -1,43 +0,0 @@
-/datum/round_event_control/nightmare
- name = "Spawn Nightmare"
- typepath = /datum/round_event/ghost_role/nightmare
- max_occurrences = 1
- min_players = 20
-
-/datum/round_event/ghost_role/nightmare
- minimum_required = 1
- role_name = "nightmare"
- fakeable = FALSE
-
-/datum/round_event/ghost_role/nightmare/spawn_role()
- var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
- if(!candidates.len)
- return NOT_ENOUGH_PLAYERS
-
- var/mob/dead/selected = pick(candidates)
-
- var/datum/mind/player_mind = new /datum/mind(selected.key)
- player_mind.active = TRUE
-
- var/list/spawn_locs = list()
- for(var/X in GLOB.xeno_spawn)
- var/turf/T = X
- var/light_amount = T.get_lumcount()
- if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
- spawn_locs += T
-
- if(!spawn_locs.len)
- message_admins("No valid spawn locations found, aborting...")
- return MAP_ERROR
-
- var/mob/living/carbon/human/S = new ((pick(spawn_locs)))
- player_mind.transfer_to(S)
- player_mind.assigned_role = "Nightmare"
- player_mind.special_role = "Nightmare"
- player_mind.add_antag_datum(/datum/antagonist/nightmare)
- S.set_species(/datum/species/shadow/nightmare)
- playsound(S, 'sound/blank.ogg', 50, TRUE, -1)
- message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Nightmare by an event.")
- log_game("[key_name(S)] was spawned as a Nightmare by an event.")
- spawned_mobs += S
- return SUCCESSFUL_SPAWN
diff --git a/code/modules/events/rogue/_rogue.dm b/code/modules/events/rogue/_rogue.dm
index c726b5ad993..3b67056693b 100644
--- a/code/modules/events/rogue/_rogue.dm
+++ b/code/modules/events/rogue/_rogue.dm
@@ -34,7 +34,7 @@ GLOBAL_LIST_INIT(badomens, list())
var/used
switch(eventreason)
if(OMEN_ROUNDSTART)
- used = "Zizo."
+ used = "Levishth."
if(OMEN_NOLORD)
used = "The Monarch is dead! We need a new ruler."
if(OMEN_NOPRIEST)
@@ -46,7 +46,7 @@ GLOBAL_LIST_INIT(badomens, list())
if(OMEN_SKELETONSIEGE)
used = "Unwelcome visitors!"
if("ascend")
- used = "Zizo will rise once again."
+ used = "A new god is born!"
if(eventreason && used)
priority_announce(used, "Bad Omen", 'sound/misc/evilevent.ogg')
diff --git a/code/modules/events/rogue/lightsout.dm b/code/modules/events/rogue/lightsout.dm
index 4dd64ee8282..d2be6f08647 100644
--- a/code/modules/events/rogue/lightsout.dm
+++ b/code/modules/events/rogue/lightsout.dm
@@ -20,4 +20,4 @@
if(LAZYLEN(GLOB.streetlamp_list))
for(var/obj/machinery/light/roguestreet/i in GLOB.streetlamp_list)
i.lights_out()
- return
\ No newline at end of file
+ return
diff --git a/code/modules/events/rogue/vines.dm b/code/modules/events/rogue/vines.dm
index 8cac73a0874..3059c6ebaeb 100644
--- a/code/modules/events/rogue/vines.dm
+++ b/code/modules/events/rogue/vines.dm
@@ -5,4 +5,4 @@
max_occurrences = 0
min_players = 99999
req_omen = TRUE
- todreq = list("dusk", "night", "dawn", "day")
\ No newline at end of file
+ todreq = list("dusk", "night", "dawn", "day")
diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm
deleted file mode 100644
index 7cb39576f07..00000000000
--- a/code/modules/events/sentience.dm
+++ /dev/null
@@ -1,112 +0,0 @@
-GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list(
- /mob/living/simple_animal/pet,
- /mob/living/simple_animal/parrot,
- /mob/living/simple_animal/hostile/lizard,
- /mob/living/simple_animal/sloth,
- /mob/living/simple_animal/mouse/brown/Tom,
- /mob/living/simple_animal/hostile/retaliate/goat,
- /mob/living/simple_animal/chicken,
- /mob/living/simple_animal/cow,
- /mob/living/simple_animal/hostile/retaliate/bat,
- /mob/living/simple_animal/hostile/carp/cayenne,
- /mob/living/simple_animal/butterfly,
- /mob/living/simple_animal/hostile/retaliate/poison/snake,
- /mob/living/simple_animal/hostile/retaliate/goose/vomit,
- /mob/living/simple_animal/bot/mulebot,
- /mob/living/simple_animal/bot/secbot/beepsky
-)))
-
-/datum/round_event_control/sentience
- name = "Random Human-level Intelligence"
- typepath = /datum/round_event/ghost_role/sentience
- weight = 10
-
-
-/datum/round_event/ghost_role/sentience
- minimum_required = 1
- role_name = "random animal"
- var/animals = 1
- var/one = "one"
- fakeable = TRUE
-
-/datum/round_event/ghost_role/sentience/announce(fake)
- var/sentience_report = ""
-
- var/data = pick("scans from our long-range sensors", "our sophisticated probabilistic models", "our omnipotence", "the communications traffic on your station", "energy emissions we detected", "\[REDACTED\]")
- var/pets = pick("animals/bots", "bots/animals", "pets", "simple animals", "lesser lifeforms", "\[REDACTED\]")
- var/strength = pick("human", "moderate", "lizard", "security", "command", "clown", "low", "very low", "\[REDACTED\]")
-
- sentience_report += "Based on [data], we believe that [one] of the station's [pets] has developed [strength] level intelligence, and the ability to communicate."
-
- priority_announce(sentience_report,"[command_name()] Medium-Priority Update")
-
-/datum/round_event/ghost_role/sentience/spawn_role()
- var/list/mob/dead/observer/candidates
- candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
-
- // find our chosen mob to breathe life into
- // Mobs have to be simple animals, mindless, on station, and NOT holograms.
- // prioritize starter animals that people will recognise
-
-
- var/list/potential = list()
-
- var/list/hi_pri = list()
- var/list/low_pri = list()
-
- for(var/mob/living/simple_animal/L in GLOB.alive_mob_list)
- var/turf/T = get_turf(L)
- if(!T || !is_station_level(T.z))
- continue
- if((L in GLOB.player_list) || L.mind || (L.flags_1 & HOLOGRAM_1))
- continue
- if(is_type_in_typecache(L, GLOB.high_priority_sentience))
- hi_pri += L
- else
- low_pri += L
-
- shuffle_inplace(hi_pri)
- shuffle_inplace(low_pri)
-
- potential = hi_pri + low_pri
-
- if(!potential.len)
- return WAITING_FOR_SOMETHING
- if(!candidates.len)
- return NOT_ENOUGH_PLAYERS
-
- var/spawned_animals = 0
- while(spawned_animals < animals && candidates.len && potential.len)
- var/mob/living/simple_animal/SA = popleft(potential)
- var/mob/dead/observer/SG = pick_n_take(candidates)
-
- spawned_animals++
-
- SA.key = SG.key
-
- SA.grant_all_languages(TRUE)
-
- SA.sentience_act()
-
- SA.maxHealth = max(SA.maxHealth, 200)
- SA.health = SA.maxHealth
- SA.del_on_death = FALSE
-
- spawned_mobs += SA
-
- to_chat(SA, span_danger("Hello world!"))
- to_chat(SA, "Due to freak radiation and/or chemicals \
- and/or lucky chance, you have gained human level intelligence \
- and the ability to speak and understand human language!")
-
- return SUCCESSFUL_SPAWN
-
-/datum/round_event_control/sentience/all
- name = "Station-wide Human-level Intelligence"
- typepath = /datum/round_event/ghost_role/sentience/all
- weight = 0
-
-/datum/round_event/ghost_role/sentience/all
- one = "all"
- animals = INFINITY // as many as there are ghosts and animals
- // cockroach pride, station wide
diff --git a/code/modules/events/space_dragon.dm b/code/modules/events/space_dragon.dm
deleted file mode 100644
index d1315856d92..00000000000
--- a/code/modules/events/space_dragon.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-/datum/round_event_control/space_dragon
- name = "Spawn Space Dragon"
- typepath = /datum/round_event/ghost_role/space_dragon
- max_occurrences = 1
- weight = 8
- earliest_start = 70 MINUTES
- min_players = 20
-
-/datum/round_event/ghost_role/space_dragon
- minimum_required = 1
- role_name = "Space Dragon"
- announceWhen = 10
-
-/datum/round_event/ghost_role/space_dragon/announce(fake)
- priority_announce("It appears a lifeform with magical traces is approaching [station_name()], please stand-by.", "Lifesign Alert")
-
-/datum/round_event/ghost_role/space_dragon/spawn_role()
- var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
- if(!candidates.len)
- return NOT_ENOUGH_PLAYERS
-
- var/mob/dead/selected = pick(candidates)
-
- var/datum/mind/player_mind = new /datum/mind(selected.key)
- player_mind.active = TRUE
-
- var/list/spawn_locs = list()
- for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
- spawn_locs += (C.loc)
- if(!spawn_locs.len)
- message_admins("No valid spawn locations found, aborting...")
- return MAP_ERROR
-
- var/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/dragon/space_dragon/S = new ((pick(spawn_locs)))
- player_mind.transfer_to(S)
- player_mind.assigned_role = "Space Dragon"
- player_mind.special_role = "Space Dragon"
- player_mind.add_antag_datum(/datum/antagonist/space_dragon)
- playsound(S, 'sound/blank.ogg', 50, TRUE, -1)
- message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by an event.")
- log_game("[key_name(S)] was spawned as a Space Dragon by an event.")
- spawned_mobs += S
- return SUCCESSFUL_SPAWN
-
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 7fdca3bd677..a0954387c5f 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -408,9 +408,6 @@
SM.on_hit(src, user)
user_unbuckle_mob(user,user)
-/obj/structure/spacevine/attack_alien(mob/living/user)
- eat(user)
-
/datum/spacevine_controller
var/list/obj/structure/spacevine/vines
var/obj/structure/flora/roguetree/evil/tree
diff --git a/code/modules/farming/produce.dm b/code/modules/farming/produce.dm
index fc59e22fa1b..09f6dd7f5ad 100644
--- a/code/modules/farming/produce.dm
+++ b/code/modules/farming/produce.dm
@@ -211,7 +211,7 @@
seed = /obj/item/seeds/berryrogue/poison
icon_state = "berries"
tastes = list("berry" = 1)
- list_reagents = list(/datum/reagent/berrypoison = 5, /datum/reagent/consumable/nutriment = 3)
+ list_reagents = list(/datum/reagent/toxin/berrypoison = 5, /datum/reagent/consumable/nutriment = 3)
color_index = "bad"
mill_result = /obj/item/reagent_containers/powder/alch/berryp
@@ -224,7 +224,7 @@
filling_color = "#008000"
bitesize_mod = 1
foodtype = VEGETABLES
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/berrypoison = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin/berrypoison = 5)
tastes = list("sweet" = 1,"bitterness" = 1)
eat_effect = /datum/status_effect/debuff/badmeal
rotprocess = 15 MINUTES
@@ -238,7 +238,7 @@
bitesize_mod = 1
foodtype = VEGETABLES
tastes = list("sweet" = 1,"bitterness" = 1)
- list_reagents = list(/datum/reagent/drug/nicotine = 2, /datum/reagent/consumable/nutriment = 1, /datum/reagent/berrypoison = 5)
+ list_reagents = list(/datum/reagent/drug/nicotine = 2, /datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin/berrypoison = 5)
grind_results = list(/datum/reagent/drug/nicotine = 5)
eat_effect = /datum/status_effect/debuff/badmeal
rotprocess = 15 MINUTES
@@ -445,13 +445,15 @@
/obj/item/reagent_containers/food/snacks/grown/nut
name = "rocknut"
+ desc = "a nut with mild stimulant properties"
seed = /obj/item/seeds/nut
icon_state = "nut"
tastes = list("nutty" = 1)
filling_color = "#6b4d18"
- bitesize = 3
+ bitesize = 1
foodtype = FRUIT
- list_reagents = list(/datum/reagent/consumable/nutriment = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/acorn_powder = 4, /datum/reagent/drug/nicotine = 1)
+ grind_results = list(/datum/reagent/consumable/acorn_powder = 4)
/obj/item/reagent_containers/food/snacks/grown/tomato
name = "tomato"
diff --git a/code/modules/farming/tools.dm b/code/modules/farming/tools.dm
index 1a68409f0c4..9d56466764a 100644
--- a/code/modules/farming/tools.dm
+++ b/code/modules/farming/tools.dm
@@ -383,8 +383,8 @@
/obj/item/rogueweapon/sickle/scythe
force = 15
force_wielded = 25
- possible_item_intents = list(DAGGER_CUT)
- gripped_intents = list(SPEAR_BASH,DAGGER_CUT)
+ possible_item_intents = list(/datum/intent/axe/cut)
+ gripped_intents = list(/datum/intent/axe/cut,/datum/intent/axe/chop/battle/scythe,SPEAR_BASH)
name = "scythe"
desc = "A curved blade used to sow harvest."
icon_state = "scythe"
@@ -400,8 +400,13 @@
slot_flags = ITEM_SLOT_BACK
drop_sound = 'sound/foley/dropsound/wooden_drop.ogg'
smeltresult = /obj/item/ingot/iron
+ wdefense = 6
improvised = TRUE
+/datum/intent/axe/chop/battle/scythe
+ reach = 2
+ swingdelay = 5
+
/obj/item/rogueweapon/sickle/scythe/getonmobprop(tag)
. = ..()
if(tag)
diff --git a/code/modules/fightingstyles.dm b/code/modules/fightingstyles.dm
index 775edb067c3..5b716b3dcad 100644
--- a/code/modules/fightingstyles.dm
+++ b/code/modules/fightingstyles.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/proc/give_fightingstyle(var/two = FALSE)
+/mob/living/carbon/human/proc/give_fightingstyle(two = FALSE)
var/list/fightingstyles = list(
"Dirty Fighting",
"Shield Master",
@@ -17,7 +17,7 @@
var/stylechoice_two = input("Choose your second fighting style", "Available fighting styles") as anything in fightingstyles
trygivefightingstyle(stylechoice_two)
-/mob/living/carbon/human/proc/trygivefightingstyle(var/T)
+/mob/living/carbon/human/proc/trygivefightingstyle(T)
switch(T)
if("Dirty Fighting")
ADD_TRAIT(src, TRAIT_NUTCRACKER, TRAIT_GENERIC)
@@ -28,7 +28,7 @@
if("Tavern Brawler")
ADD_TRAIT(src, TRAIT_CIVILIZEDBARBARIAN, TRAIT_GENERIC)
-
+
if("Unarmed Fighting")
ADD_TRAIT(src, TRAIT_PUGILIST, TRAIT_GENERIC)
src.mind.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 3ad626d60fb..ee917e4c73f 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -261,7 +261,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
image_state = "clown"
/obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration)
- ..(loc, T)
+ . = ..(loc, T)
name = pick(GLOB.clown_names)
QDEL_IN(src,duration)
diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm
index a4148ac30e8..797b6f9ab0f 100644
--- a/code/modules/food_and_drinks/food.dm
+++ b/code/modules/food_and_drinks/food.dm
@@ -13,13 +13,14 @@
reagent_flags = INJECTABLE
resistance_flags = FLAMMABLE
destroy_sound
+ var/do_random_pixel_offset = TRUE
var/foodtype = NONE
var/last_check_time
var/in_container = FALSE //currently just stops "was bitten X times!" messages on canned food
/obj/item/reagent_containers/food/Initialize(mapload)
. = ..()
- if(!mapload)
+ if(!mapload && do_random_pixel_offset)
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index e007c9c0d4c..fb4200b75db 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -177,8 +177,6 @@
gibtype = C.gib_type
if(ismonkey(C))
typeofskin = /obj/item/stack/sheet/animalhide/monkey
- else if(isalien(C))
- typeofskin = /obj/item/stack/sheet/animalhide/xeno
var/occupant_volume
if(occupant?.reagents)
occupant_volume = occupant.reagents.total_volume
@@ -217,7 +215,7 @@
meatslab.throw_at(pick(nearby_turfs),i,3)
for (var/turfs=1 to meat_produced)
var/turf/gibturf = pick(nearby_turfs)
- if (!gibturf.density && src in view(gibturf))
+ if (!gibturf.density && (src in view(gibturf)))
new gibtype(gibturf,i,diseases)
pixel_x = initial(pixel_x) //return to its spot after shaking
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 77c64bbb8c5..f7d93402c75 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -287,7 +287,7 @@
/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * efficiency, 2)) // standard wait is 10
if(stat & (NOPOWER|BROKEN))
- if(MICROWAVE_PRE)
+ if(type == MICROWAVE_PRE)
pre_fail()
return
if(!time)
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index 3fc00ab549c..25b83a31f6d 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -221,7 +221,7 @@
unprocess()
qdel(src)
if(!bomb_active || bomb_defused)
- if(bomb_defused && bomb in src)
+ if(bomb_defused && (bomb in src))
bomb.defuse()
bomb_active = FALSE
unprocess()
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
index ddfd0d3f4f9..0068f5f5d82 100644
--- a/code/modules/goonchat/browserOutput.dm
+++ b/code/modules/goonchat/browserOutput.dm
@@ -109,7 +109,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
syncRegex()
- //do not convert to to_chat()
+ //do not convert to to_chat
SEND_TEXT(owner, "Failed to load fancy chat, reverting to old chat. Certain features won't work.")
/datum/chatOutput/proc/showChat()
diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm
deleted file mode 100644
index 99664ead04d..00000000000
--- a/code/modules/holiday/halloween.dm
+++ /dev/null
@@ -1,280 +0,0 @@
-///////////////////////////////////////
-///////////HALLOWEEN CONTENT///////////
-///////////////////////////////////////
-
-
-//spooky recipes
-
-/datum/recipe/sugarcookie/spookyskull
- reagents_list = list(/datum/reagent/consumable/flour = 5, /datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/milk = 5)
- items = list(
- /obj/item/reagent_containers/food/snacks/egg,
- )
- result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull
-
-/datum/recipe/sugarcookie/spookycoffin
- reagents_list = list(/datum/reagent/consumable/flour = 5, /datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/coffee = 5)
- items = list(
- /obj/item/reagent_containers/food/snacks/egg,
- )
- result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin
-
-//////////////////////////////
-//Spookoween trapped closets//
-//////////////////////////////
-
-#define SPOOKY_SKELETON 1
-#define ANGRY_FAITHLESS 2
-#define SCARY_BATS 3
-#define INSANE_CLOWN 4
-#define HOWLING_GHOST 5
-
-//Spookoween variables
-/obj/structure/closet
- var/trapped = 0
- var/mob/trapped_mob
-
-/obj/structure/closet/Initialize()
- . = ..()
- if(prob(30))
- set_spooky_trap()
-
-/obj/structure/closet/dump_contents()
- ..()
- trigger_spooky_trap()
-
-/obj/structure/closet/proc/set_spooky_trap()
- if(prob(0.1))
- trapped = INSANE_CLOWN
- return
- if(prob(1))
- trapped = ANGRY_FAITHLESS
- return
- if(prob(15))
- trapped = SCARY_BATS
- return
- if(prob(20))
- trapped = HOWLING_GHOST
- return
- else
- var/mob/living/carbon/human/H = new(loc)
- H.makeSkeleton()
- H.health = 1e5
- insert(H)
- trapped_mob = H
- trapped = SPOOKY_SKELETON
- return
-
-/obj/structure/closet/proc/trigger_spooky_trap()
- if(!trapped)
- return
-
- else if(trapped == SPOOKY_SKELETON)
- visible_message(span_userdanger("BOO!"))
- playsound(loc, 'sound/spookoween/girlscream.ogg', 300, TRUE)
- trapped = 0
- QDEL_IN(trapped_mob, 90)
-
- else if(trapped == HOWLING_GHOST)
- visible_message(span_userdanger("[pick("OooOOooooOOOoOoOOooooOOOOO", "BooOOooOooooOOOO", "BOO!", "WoOOoOoooOooo")]"))
- playsound(loc, 'sound/spookoween/ghosty_wind.ogg', 300, TRUE)
- new /mob/living/simple_animal/shade/howling_ghost(loc)
- trapped = 0
-
- else if(trapped == SCARY_BATS)
- visible_message(span_userdanger("Protect your hair!"))
- playsound(loc, 'sound/spookoween/bats.ogg', 300, TRUE)
- var/number = rand(1,3)
- for(var/i=0,i < number,i++)
- new /mob/living/simple_animal/hostile/retaliate/bat(loc)
- trapped = 0
-
- else if(trapped == ANGRY_FAITHLESS)
- visible_message(span_userdanger("The closet bursts open!"))
- visible_message(span_userdanger("THIS BEING RADIATES PURE EVIL! YOU BETTER RUN!!!"))
- playsound(loc, 'sound/hallucinations/wail.ogg', 300, TRUE)
- var/mob/living/simple_animal/hostile/faithless/F = new(loc)
- trapped = 0
- QDEL_IN(F, 120)
-
- else if(trapped == INSANE_CLOWN)
- visible_message(span_userdanger("..."))
- playsound(loc, 'sound/spookoween/scary_clown_appear.ogg', 300, TRUE)
- spawn_atom_to_turf(/mob/living/simple_animal/hostile/clown_insane, loc, 1, FALSE)
- trapped = 0
-
-//don't spawn in crates
-/obj/structure/closet/crate/trigger_spooky_trap()
- return
-
-/obj/structure/closet/crate/set_spooky_trap()
- return
-
-
-////////////////////
-//Spookoween Ghost//
-////////////////////
-
-/mob/living/simple_animal/shade/howling_ghost
- name = "ghost"
- real_name = "ghost"
- icon = 'icons/mob/mob.dmi'
- maxHealth = 1e6
- health = 1e6
- speak_emote = list("howls")
- emote_hear = list("wails","screeches")
- density = FALSE
- anchored = TRUE
- incorporeal_move = 1
- layer = 4
- var/timer = 0
-
-/mob/living/simple_animal/shade/howling_ghost/Initialize()
- . = ..()
- icon_state = pick("ghost","ghostian","ghostian2","ghostking","ghost1","ghost2")
- icon_living = icon_state
- status_flags |= GODMODE
- timer = rand(1,15)
-
-/mob/living/simple_animal/shade/howling_ghost/Life()
- ..()
- timer--
- if(prob(20))
- roam()
- if(timer == 0)
- spooky_ghosty()
- timer = rand(1,15)
-
-/mob/living/simple_animal/shade/howling_ghost/proc/EtherealMove(direction)
- forceMove(get_step(src, direction))
- setDir(direction)
-
-/mob/living/simple_animal/shade/howling_ghost/proc/roam()
- if(prob(80))
- var/direction = pick(NORTH,SOUTH,EAST,WEST,NORTHEAST,NORTHWEST,SOUTHEAST,SOUTHWEST)
- EtherealMove(direction)
-
-/mob/living/simple_animal/shade/howling_ghost/proc/spooky_ghosty()
- if(prob(20)) //haunt
- playsound(loc, pick('sound/spookoween/ghosty_wind.ogg','sound/spookoween/ghost_whisper.ogg','sound/spookoween/chain_rattling.ogg'), 300, TRUE)
- if(prob(10)) //flickers
- var/obj/machinery/light/L = locate(/obj/machinery/light) in view(5, src)
- if(L)
- L.flicker()
- if(prob(5)) //poltergeist
- var/obj/item/I = locate(/obj/item) in view(3, src)
- if(I)
- var/direction = pick(NORTH,SOUTH,EAST,WEST,NORTHEAST,NORTHWEST,SOUTHEAST,SOUTHWEST)
- step(I,direction)
- return
-
-/mob/living/simple_animal/shade/howling_ghost/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = 0
-
-/mob/living/simple_animal/shade/howling_ghost/CanPass(atom/movable/mover, turf/target)
- return 1
-
-
-///////////////////////////
-//Spookoween Insane Clown//
-///////////////////////////
-
-///Insane clown mob. Basically a clown that haunts you.
-/mob/living/simple_animal/hostile/clown_insane
- name = "insane clown"
- desc = "Some clowns do not manage to be accepted, and go insane. This is one of them."
- icon = 'icons/mob/clown_mobs.dmi'
- icon_state = "scary_clown"
- icon_living = "scary_clown"
- icon_dead = "scary_clown"
- icon_gib = "scary_clown"
- speak = list("...", ". . .")
- maxHealth = 1e6
- health = 1e6
- emote_see = list("silently stares")
- unsuitable_atmos_damage = 0
- var/timer
-
-/mob/living/simple_animal/hostile/clown_insane/Initialize()
- . = ..()
- status_flags |= GODMODE //Slightly easier to maintain.
-
-/mob/living/simple_animal/hostile/clown_insane/Destroy()
- timer = null
- return ..()
-
-/mob/living/simple_animal/hostile/clown_insane/ex_act()
- return
-
-///Adds a timer to call stalk() on Aggro
-/mob/living/simple_animal/hostile/clown_insane/Aggro()
- . = ..()
- timer = addtimer(CALLBACK(src, PROC_REF(stalk)), 30, TIMER_STOPPABLE|TIMER_UNIQUE)
-
-/mob/living/simple_animal/hostile/clown_insane/LoseAggro()
- . = ..()
- if(timer)
- deltimer(timer)
- timer = null
-
-///Plays scary noises and adds some timers.
-/mob/living/simple_animal/hostile/clown_insane/proc/stalk()
- var/mob/living/M = target
- if(!istype(M))
- LoseAggro()
- return
- if(M.stat == DEAD)
- playsound(M.loc, 'sound/spookoween/insane_low_laugh.ogg', 100, TRUE)
- qdel(src)
- return
- playsound(M, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, TRUE)
- timer = addtimer(CALLBACK(src, PROC_REF(stalk)), 30, TIMER_STOPPABLE|TIMER_UNIQUE)
- addtimer(CALLBACK(src, PROC_REF(teleport_to_target)), 12, TIMER_STOPPABLE|TIMER_UNIQUE)
-
-///Does what's in the name. Teleports to target.loc. Called from a timer.
-/mob/living/simple_animal/hostile/clown_insane/proc/teleport_to_target()
- if(target && isturf(target.loc)) //Hiding in lockers works to get rid of this thing.
- forceMove(target.loc)
-
-/mob/living/simple_animal/hostile/clown_insane/MoveToTarget()
- return
-
-/mob/living/simple_animal/hostile/clown_insane/AttackingTarget()
- return
-
-/mob/living/simple_animal/hostile/clown_insane/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = 0
- if(prob(5))
- playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, TRUE)
-
-/mob/living/simple_animal/hostile/clown_insane/attackby(obj/item/O, mob/user)
- if(istype(O, /obj/item/nullrod))
- if(prob(5))
- visible_message(span_notice("[src] finally found the peace it deserves. You hear honks echoing off into the distance."))
- playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, TRUE)
- qdel(src)
- else
- visible_message(span_danger("[src] seems to be resisting the effect!"))
- return
- return ..()
-
-/mob/living/simple_animal/hostile/clown_insane/handle_temperature_damage()
- return
-
-/////////////////////////
-// Spooky Uplink Items //
-/////////////////////////
-
-/datum/uplink_item/dangerous/crossbow/candy
- name = "Candy Corn Crossbow"
- desc = "A standard miniature energy crossbow that uses a hard-light projector to transform bolts into candy corn. Happy Halloween!"
- category = "Holiday"
- item = /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
- surplus = 0
-
-/datum/uplink_item/device_tools/emag/hack_o_lantern
- name = "Hack-o'-Lantern"
- desc = "An emag fitted to support the Halloween season. Candle not included."
- category = "Holiday"
- item = /obj/item/card/emag/halloween
- surplus = 0
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 2fd6087dfa8..5fd6aa2e74c 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -18,7 +18,7 @@
//if they are holding or wearing a card that has access, that works
if(check_access(H.get_active_held_item()) || src.check_access(H.wear_ring))
return TRUE
- else if(ismonkey(M) || isalienadult(M))
+ else if(ismonkey(M))
var/mob/living/carbon/george = M
//they can only hold things :(
if(check_access(george.get_active_held_item()))
diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm
index 20e17778120..87a32601e07 100644
--- a/code/modules/jobs/job_exp.dm
+++ b/code/modules/jobs/job_exp.dm
@@ -40,9 +40,10 @@ GLOBAL_PROTECT(exp_to_update)
return exp_type
/proc/job_is_xp_locked(jobtitle)
- if(!CONFIG_GET(flag/use_exp_restrictions_heads) && jobtitle in (GLOB.command_positions | list("AI")))
+ var/is_head = (jobtitle in GLOB.command_positions) || jobtitle == "AI"
+ if(!CONFIG_GET(flag/use_exp_restrictions_heads) && is_head)
return FALSE
- if(!CONFIG_GET(flag/use_exp_restrictions_other) && !(jobtitle in (GLOB.command_positions | list("AI"))))
+ if(!CONFIG_GET(flag/use_exp_restrictions_other) && !is_head)
return FALSE
return TRUE
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index adce6ea879d..52ed7c9a223 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -144,7 +144,7 @@
/datum/job/proc/special_job_check(mob/dead/new_player/player)
return TRUE
-/client/proc/job_greet(var/datum/job/greeting_job)
+/client/proc/job_greet(datum/job/greeting_job)
if(mob.job == greeting_job.title)
greeting_job.greet(mob)
diff --git a/code/modules/jobs/job_types/old/botanist.dm b/code/modules/jobs/job_types/old/botanist.dm
index 24fb902f1be..fa18abf8efa 100644
--- a/code/modules/jobs/job_types/old/botanist.dm
+++ b/code/modules/jobs/job_types/old/botanist.dm
@@ -48,4 +48,4 @@
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_EASY
paycheck_department = ACCOUNT_SRV
- display_order = JOB_DISPLAY_ORDER_BOTANIST
\ No newline at end of file
+ display_order = JOB_DISPLAY_ORDER_BOTANIST
diff --git a/code/modules/jobs/job_types/old/cargo_technician.dm b/code/modules/jobs/job_types/old/cargo_technician.dm
index 3eb1dfcfd72..fd4144716ff 100644
--- a/code/modules/jobs/job_types/old/cargo_technician.dm
+++ b/code/modules/jobs/job_types/old/cargo_technician.dm
@@ -25,5 +25,3 @@
belt = /obj/item/pda/cargo
ears = /obj/item/radio/headset/headset_cargo
uniform = /obj/item/clothing/under/rank/cargo/tech
- l_hand = /obj/item/export_scanner
-
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm
index c6219e8374d..72f2476748b 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm
@@ -39,9 +39,13 @@
//sleep(1)
//testing("[H] spawn troch")
+
+/* // This is what put the torch in adventurers' hands, causing the spam
var/obj/item/flashlight/flare/torch/T = new()
T.spark_act()
H.put_in_hands(T, forced = TRUE)
+*/
+
//framework for being able to list spells instead of individually input them
var/list/skills
var/list/roundstart_experience
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/antag/roguemage.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/antag/roguemage.dm
deleted file mode 100644
index f919361c347..00000000000
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/antag/roguemage.dm
+++ /dev/null
@@ -1,57 +0,0 @@
-/datum/advclass/roguemage //mage class - like the adventurer mage, but more evil.
- name = "Rogue Mage"
- tutorial = "Those fools at the academy laughed at you and cast you from the ivory tower of higher learning and magickal practice. No matter - you will ascend to great power one day, but first you need wealth - vast amounts of it. Show those fools in the town what REAL magic looks like."
- allowed_sexes = list(MALE, FEMALE)
- allowed_races = RACES_ALL_KINDSPLUS
- outfit = /datum/outfit/job/roguetown/bandit/roguemage
- category_tags = list(CTAG_BANDIT)
- cmode_music = 'sound/music/combat_bandit_mage.ogg'
-
-/datum/outfit/job/roguetown/bandit/roguemage/pre_equip(mob/living/carbon/human/H)
- ..()
- shoes = /obj/item/clothing/shoes/roguetown/simpleshoes
- pants = /obj/item/clothing/under/roguetown/trou/leather
- shirt = /obj/item/clothing/suit/roguetown/shirt/shortshirt
- armor = /obj/item/clothing/suit/roguetown/shirt/robe/black
- belt = /obj/item/storage/belt/rogue/leather/rope
- beltr = /obj/item/reagent_containers/glass/bottle/rogue/manapot
- backr = /obj/item/storage/backpack/rogue/satchel
- backpack_contents = list(/obj/item/needle/thorn = 1, /obj/item/natural/cloth = 1)
- mask = /obj/item/clothing/mask/rogue/facemask/steel
- neck = /obj/item/clothing/neck/roguetown/coif
- head = /obj/item/clothing/head/roguetown/helmet/leather/volfhelm
-
- r_hand = /obj/item/rogueweapon/woodstaff
- if(H.mind)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) //needs climbing to get into hideout
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 2, TRUE)
- if(H.age == AGE_OLD)
- head = /obj/item/clothing/head/roguetown/wizhat/gen
- armor = /obj/item/clothing/suit/roguetown/shirt/robe
- H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE)
- H.change_stat("speed", -1)
- H.change_stat("intelligence", 1)
- H.change_stat("perception", 1)
- H.mind.adjust_spellpoints(1)
- H.change_stat("strength", 2)
- H.change_stat("intelligence", 1)
- H.change_stat("endurance", 1)
- H.change_stat("speed",1)
- H.mind.adjust_spellpoints(4)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/learnspell)
- H.verbs |= /mob/proc/haltyell
- H.ambushable = FALSE
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/antag/sawbones.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/antag/sawbones.dm
index a3a29c6f261..0eb575508ef 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/antag/sawbones.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/antag/sawbones.dm
@@ -24,7 +24,7 @@
/obj/item/reagent_containers/glass/bottle/rogue/healthpot = 1,
/obj/item/clothing/mask/rogue/physician = 1,
/obj/item/storage/box/matches = 1, /// for carterizer and lantern.
- /obj/item/clothing/ring/lantern = 1,
+ /obj/item/flashlight/flare/torch/lantern/ring = 1,
/obj/item/storage/fancy/skit = 1,
)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 4, TRUE)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm
index da4daf36aaf..fb972f1811f 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm
@@ -40,6 +40,7 @@
H.change_stat("intelligence", -1)
H.change_stat("constitution", 2)
H.change_stat("endurance", 2)
+ H.change_stat("speed", 2)
backpack_contents = list(/obj/item/restraints/legcuffs/bola, /obj/item/restraints/legcuffs/bola, /obj/item/restraints/legcuffs/bola)
ADD_TRAIT(H, TRAIT_DEATHBYSNOOSNOO, TRAIT_GENERIC) //doubles sex damage
ADD_TRAIT(H, TRAIT_STRONGTHROW, TRAIT_GENERIC) //mighty throws, javelins etc
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm
index f17f7d5e6e5..b672d258e41 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm
@@ -70,7 +70,7 @@
H.mind.adjust_skillrank_up_to(/datum/skill/craft/traps, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/labor/fishing, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 2, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 1, TRUE)
@@ -91,6 +91,7 @@
armor = /obj/item/clothing/suit/roguetown/armor/leather/hide
H.change_stat("intelligence", -1) // The hunter is smarter, more skilled -- but not as tough.
H.change_stat("strength", 2)
+ H.change_stat("perception", 1)
H.change_stat("constitution", 2)
H.change_stat("endurance", 3)
H.dna.species.soundpack_m = new /datum/voicepack/male/warrior()
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm
index 5785844b59e..aace0fcb31d 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm
@@ -47,7 +47,7 @@
beltr = /obj/item/rogueweapon/huntingknife/idagger
H.change_stat("intelligence", 1)
H.change_stat("perception", 2)
- H.change_stat("endurance", 1)
+ H.change_stat("endurance", 2)
H.change_stat("speed", 2)
if("Skald")
H.set_blindness(0)
@@ -81,11 +81,12 @@
beltl = /obj/item/storage/belt/rogue/pouch/coins/mid
l_hand = /obj/item/rogueweapon/sword/iron
H.change_stat("constitution", 2)
- H.change_stat("strength", 1)
+ H.change_stat("strength", 2)
H.change_stat("speed", 1)
+ H.change_stat("endurance", 1)
if("Arcanist")
H.set_blindness(0)
- to_chat(H, span_warning("Some bards are can craft musical sorceries, so it makes sense some pick up actual ones. Perhaps not as good as the real deal, of course."))
+ to_chat(H, span_warning("Many bards can craft musical sorceries, so it makes sense some pick up traditional sorcery. Not quite as good as the real deal, of course."))
H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 2, TRUE)
@@ -113,7 +114,7 @@
backl = /obj/item/storage/backpack/rogue/satchel
beltl = /obj/item/storage/belt/rogue/pouch/coins/poor
beltr = /obj/item/rogueweapon/huntingknife/idagger/steel
- H.change_stat("intelligence", 1)
+ H.change_stat("intelligence", 2)
H.change_stat("perception", 2)
H.change_stat("endurance", 1)
H.change_stat("speed", 2)
@@ -165,6 +166,7 @@
ADD_TRAIT(H, TRAIT_EMPATH, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) //You have speed, use it. What musucian plays with cumbersome armor anyway?
ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC)
if(isseelie(H))
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/seelie_dust)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/summon_rat)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm
index 5b90e4582c7..33f7026c520 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm
@@ -107,14 +107,15 @@
H.change_stat("endurance", 2)
H.change_stat("speed", 1)
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_GENERIC)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_glowshroom)
// HEARTHSTONE ADD: cloistered cleric subclass (lighter armored and equipped)
if("Temple Devout")
- // Devout start without the typical cleric medium/heavy armor shtick and without much in the way of weapons or skills to use them.
+ // Devout start without the typical cleric heavy armor shtick and without much in the way of weapons or skills to use them.
// They're better with miracles and regenerate devotion passively like the Priest does, however.
H.set_blindness(0)
- to_chat(H, span_warning("You are a cloistered cleric, a devout traveller whom has engressed into distant lands to spread the word of your chosen Patron. Having secluded yourself for many years, your body has suffered... But you have gained great insight as a result!"))
+ to_chat(H, span_warning("You are a Temple cleric, a devout traveller whom has engressed into distant lands to spread the word of your chosen Patron. Having secluded yourself for many years, your body has suffered... But you have gained great insight as a result!"))
H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 5, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE)
@@ -131,6 +132,7 @@
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/guidance5e)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/churn)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/light5e)
+ ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
// HEARTHSTONE ADDITION END
armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron
@@ -152,7 +154,7 @@
cloak = /obj/item/clothing/cloak/raincloak/furcloak
shoes = /obj/item/clothing/shoes/roguetown/boots
// HEARTHSTONE ADD: cloistered devout custom outfits
- else if (classchoice == "Cloistered Devout")
+ else if (classchoice == "Temple Devout")
// do the generic stuff first then replace it w/ patron specific things... if it exists
// for reference, cloistered devouts are lightly armored/unarmored but get patron-specific stuff (if applicable) and a devo regen
head = /obj/item/clothing/head/roguetown/roguehood/black
@@ -174,12 +176,6 @@
armor = /obj/item/clothing/suit/roguetown/shirt/robe/noc
pants = /obj/item/clothing/under/roguetown/tights/black
belt = /obj/item/storage/belt/rogue/leather/black
- if (H.mind)
- H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE)
- H.mind.adjust_spellpoints(1)
- H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
-
if(/datum/patron/divine/necra)
head = /obj/item/clothing/head/roguetown/necrahood
armor = /obj/item/clothing/suit/roguetown/shirt/robe/necra
@@ -197,14 +193,20 @@
armor = /obj/item/clothing/suit/roguetown/shirt/robe/psydonrobe
if(/datum/patron/divine/eora)
armor = /obj/item/clothing/suit/roguetown/shirt/robe/eora
+ if(/datum/patron/inhumen/graggar)
+ if(H.mind)
+ H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE)
+ H.mind.adjust_spellpoints(1)
// HEARTHSTONE ADDITION END
var/datum/devotion/C = new /datum/devotion(H, H.patron)
// HEARTHSTONE ADDITION: cloistered devout devo regen & tier buff
- if (classchoice == "Cloistered Devout")
- if(H.patron?.type == /datum/patron/divine/noc)
- C.grant_spells_devout_noc(H)
- else
- C.grant_spells_devout(H)
+ if (classchoice == "Temple Devout")
+ C.grant_spells_devout(H)
+ H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE)
+ H.mind.adjust_spellpoints(1)
+ H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC)
else
C.grant_spells_cleric(H)
// HEARTHSTONE ADDITION END
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm
index da1c793e5e9..0cd61ed5ec1 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm
@@ -31,11 +31,12 @@
H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 2, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/craft/tanning, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 3, TRUE)
- H.change_stat("strength", 1)
- H.change_stat("endurance", 1)
+ H.change_stat("strength", 2)
+ H.change_stat("endurance", 2)
+ H.change_stat("intelligence", 2)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm
index e9178cd3117..5f8edc4ea80 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm
@@ -34,7 +34,6 @@
else
r_hand = /obj/item/rogueweapon/halberd
beltl = /obj/item/rogueweapon/huntingknife
-
H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE)
@@ -44,7 +43,15 @@
H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/labor/butchering, 1, TRUE)
- H.change_stat("constitution", 3) // Seven points just like Warrior. They already get a debuff racial to speed. Please do not stack it God please.
+ H.mind.adjust_skillrank_up_to(/datum/skill/labor/mining, 3, TRUE)
+
+ H.change_stat("constitution", 3) // Eight points just like Warrior. They already get a debuff racial to speed. Please do not stack it God please.
+ H.change_stat("perception", 1)
H.change_stat("strength", 2)
H.change_stat("endurance", 2)
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
+
+ H.give_fightingstyle(TRUE)
+
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/secondwind)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm
index dca7033a277..8d2551945e3 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm
@@ -150,3 +150,6 @@
//Max devotion limit - Paladins are stronger but cannot pray to gain all abilities beyond t2
C.grant_spells_templar(H)
H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray)
+ if(H.mind && H.patron?.type == /datum/patron/inhumen/graggar)
+ H.mind.adjust_spellpoints(1)
+ H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm
index 3a70b2d8a53..abaae8ffa91 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm
@@ -35,7 +35,7 @@
H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 3, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 5, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/craft/tanning, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE)
@@ -48,3 +48,4 @@
H.change_stat("endurance", 1)
H.change_stat("speed", 1)
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm
index affe70f242f..a55b442fe42 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm
@@ -7,6 +7,7 @@
outfit = /datum/outfit/job/roguetown/adventurer/mage
category_tags = list(CTAG_ADVENTURER)
cmode_music = 'sound/music/combat_bandit_mage.ogg'
+ traits_applied = list(TRAIT_USEMAGICITEM)
/datum/outfit/job/roguetown/adventurer/mage/pre_equip(mob/living/carbon/human/H)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm
index 22a408dffb8..06d1d7a001b 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm
@@ -69,7 +69,7 @@
backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/reagent_containers/glass/bottle/rogue/trekkersdelight = 1)
beltl = /obj/item/quiver/arrows
H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 2, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE)
@@ -90,7 +90,7 @@
H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 2, TRUE) //Hearthstone change.
H.change_stat("perception", 2)
H.change_stat("endurance", 1)
- H.change_stat("speed", 3)
+ H.change_stat("speed", 2)
ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC)
if(!HAS_TRAIT(H, TRAIT_NIGHT_VISION))
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm
index bd1be073fb5..3669bccf746 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm
@@ -7,7 +7,7 @@
/datum/species/elf/wood,
)
maximum_possible_slots = 2
- traits_applied = list(TRAIT_MEDIUMARMOR)
+ traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_USEMAGICITEM)
category_tags = list(CTAG_ADVENTURER)
outfit = /datum/outfit/job/roguetown/adventurer/bladesinger
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm
index 3129e33deb8..22246850797 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm
@@ -48,4 +48,4 @@
H.change_stat("intelligence", 1)
H.change_stat("speed", 2)
H.change_stat("endurance", -2)
- H.change_stat("fortune", 1)
+ H.change_stat("fortune", 3)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm
index 941b51efa5d..e5a27e96a86 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm
@@ -6,7 +6,7 @@
allowed_races = RACES_ALL_KINDSPLUS
outfit = /datum/outfit/job/roguetown/adventurer/puritan
maximum_possible_slots = 2
- traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_PERFECT_TRACKER)
+ traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_PERFECT_TRACKER, TRAIT_USEMAGICITEM)
category_tags = list(CTAG_ADVENTURER)
/datum/outfit/job/roguetown/adventurer/puritan
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm
index d98183a8093..ebd405e8a4e 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm
@@ -88,9 +88,9 @@
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, TRAIT_GENERIC)
- H.change_stat("strength", -1)
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC)
H.change_stat("perception", 2)
- H.change_stat("speed", 4)
+ H.change_stat("speed", 3)
H.change_stat("intelligence", 2)
//Assassin, nearly same as rogue but not versatile in weapon skills yet specialized in knives.
@@ -128,12 +128,13 @@
backl = /obj/item/storage/backpack/rogue/satchel
beltl = /obj/item/rogueweapon/huntingknife/idagger/steel
backr = /obj/item/gun/ballistic/revolver/grenadelauncher/crossbow
- beltr = /obj/item/quiver/Pbolts
+ beltr = /obj/item/quiver/bolts
ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //they are killers
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
- H.change_stat("perception", 1)
- H.change_stat("speed", 4)
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC)
+ H.change_stat("perception", 2)
+ H.change_stat("speed", 3)
H.change_stat("intelligence", 2)
H.visible_message(span_info("I honed my skills as an assassin through the years. My bracers have a hidden blade, and my boots have a bottle of berry poison."))
backpack_contents = list(/obj/item/lockpickring/mundane, /obj/item/rogueweapon/huntingknife/idagger/steel)
@@ -182,8 +183,10 @@
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) //if they got all the shield and parry stuff, might aswell.
ADD_TRAIT(H, TRAIT_NUTCRACKER, TRAIT_GENERIC) //extra damage to groin (dirty fighting)
ADD_TRAIT(H, TRAIT_NOSEGRAB, TRAIT_GENERIC) //funny nose grab.
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC)
H.change_stat("strength", 1)
- H.change_stat("speed", 2)
+ H.change_stat("speed", 3)
+ H.change_stat("perception", 1)
H.change_stat("intelligence", 2)
H.visible_message(span_info("I trained as a swashbuckler. I have some skills and tricks under my cape."))
@@ -215,18 +218,22 @@
beltr = /obj/item/rogueweapon/huntingknife/idagger/steel
beltl = /obj/item/rogueweapon/huntingknife/idagger/steel
backpack_contents = list(/obj/item/lockpick)
+ ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_NUTCRACKER, TRAIT_GENERIC) //extra damage to groin (dirty fighting)
ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC)
H.change_stat("strength", -1)
H.change_stat("perception", 2)
- H.change_stat("speed", 2)
+ H.change_stat("speed", 3)
H.change_stat("intelligence", 3)
H.visible_message(span_info("I’m not just a thief. I'm a master of illusion and deception. One moment, I'm a harmless vagabond. The next, I'm a blur of motion, leaving my pursuers bewildered and outwitted."))
H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn)
+ /*
if(H.mind)
H.mind.adjust_spellpoints(3)
+ */ // Brings them down to arcanist bard levels of spell-points. Lets not have them be better spellcasters than warlocks
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/fetch)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/rogue_knock)
@@ -264,9 +271,10 @@
ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC) //never queezy around death
ADD_TRAIT(H, TRAIT_SIXTHSENSE, TRAIT_GENERIC) //can hear ghosts
ADD_TRAIT(H, TRAIT_SOUL_EXAMINE, TRAIT_GENERIC) //can determine if someone has their soul.
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC)
H.change_stat("perception", 2)
H.change_stat("constitution", 1)
- H.change_stat("speed", 3)
+ H.change_stat("speed", 2)
H.change_stat("intelligence", 2)
H.visible_message(span_info("I am a conduit between the living and the dead, half in, half out, a phantom that hears the whispers of the departed and uses them for my personal gain."))
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm
index 0479396e058..e0ae2d874c9 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm
@@ -6,7 +6,6 @@
allowed_sexes = list(MALE, FEMALE)
allowed_races = RACES_ALL_KINDSPLUS
outfit = /datum/outfit/job/roguetown/adventurer/warlock
- //traits_applied = list(TRAIT_DODGEEXPERT)
category_tags = list(CTAG_ADVENTURER)
cmode_music = 'sound/music/combat_bandit_mage.ogg'
@@ -70,7 +69,8 @@
"love", //ring of soulbinding
"friendship", //Pact of the Chain
"power", //empowered eldritch blast
- "purpose" //Pact of the Star Chain
+ "purpose", //Pact of the Star Chain
+ "revenge" //give curse
)
var/boonchoice = input("What did you sell your faith for?", "Available boons") as anything in boons
@@ -89,6 +89,7 @@
H.change_stat("intelligence", 1)
H.mind.adjust_skillrank(/datum/skill/misc/reading, 2, TRUE)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/guidance5e)
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC)
if("power") //empowered eldritch blast
H.mind.RemoveSpell(/obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e/empowered)
@@ -128,6 +129,7 @@
head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet
armor = /obj/item/clothing/suit/roguetown/shirt/robe/mage
+ shoes = /obj/item/clothing/shoes/roguetown/sandals
r_hand = /obj/item/rogueweapon/woodstaff
beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
belt = /obj/item/storage/belt/rogue/leather/rope
@@ -149,18 +151,21 @@
H.visible_message(span_info("I made a deal with an archseelie from the wild."))
/datum/outfit/job/roguetown/adventurer/warlock/proc/celestialpatron(mob/living/carbon/human/H, patronchoice)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE)
- armor = /obj/item/clothing/suit/roguetown/armor/chainmail
- shirt = /obj/item/clothing/suit/roguetown/armor/gambeson
+ // armor = /obj/item/clothing/suit/roguetown/armor/chainmail
+ if(H.gender == MALE)
+ shirt = /obj/item/clothing/suit/roguetown/armor/gambeson
+ else
+ shirt = /obj/item/clothing/suit/roguetown/armor/armordress
wrists = /obj/item/clothing/wrists/roguetown/bracers/leather
- pants = /obj/item/clothing/under/roguetown/trou/leather
- shoes = /obj/item/clothing/shoes/roguetown/boots/leather
+ pants = /obj/item/clothing/under/roguetown/tights/random
+ shoes = /obj/item/clothing/shoes/roguetown/simpleshoes
beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
belt = /obj/item/storage/belt/rogue/leather
- beltl = /obj/item/rogueweapon/mace
+ r_hand = /obj/item/rogueweapon/spear
backpack_contents = list(/obj/item/rogueweapon/huntingknife)
//caster stats (must be 5 stat point total)
@@ -190,7 +195,7 @@
head = /obj/item/clothing/head/roguetown/fisherhat
shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor
cloak = /obj/item/clothing/cloak/raincloak/yellow
- gloves = /obj/item/clothing/gloves/roguetown/plate/zybantinegauntlets
+ // gloves = /obj/item/clothing/gloves/roguetown/plate/zybantinegauntlets // No plate gloves for you
wrists = /obj/item/rope
r_hand = /obj/item/rogueweapon/pitchfork
beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
@@ -314,20 +319,10 @@
gloves = /obj/item/clothing/gloves/roguetown/leather
belt = /obj/item/storage/belt/rogue/leather
shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/random
- if(prob(70))
- armor = /obj/item/clothing/suit/roguetown/armor/chainmail/hauberk
- else if(prob(50))
- armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron
- else
- armor = /obj/item/clothing/suit/roguetown/armor/plate/scale
- if(prob(20))
- mask = /obj/item/clothing/mask/rogue/facemask
- else if(prob(60))
- head = /obj/item/clothing/head/roguetown/helmet/leather
- else if(prob(20))
- head = /obj/item/clothing/head/roguetown/helmet/skullcap
- else
- head = /obj/item/clothing/head/roguetown/helmet/kettle
+ if(H.gender == MALE)
+ shirt = /obj/item/clothing/suit/roguetown/armor/gambeson
+ else
+ shirt = /obj/item/clothing/suit/roguetown/armor/armordress // Armor downgrade from hauberk to gambeson
beltl = /obj/item/rogueweapon/huntingknife
beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
@@ -349,40 +344,27 @@
H.visible_message(span_info("I made a deal with a sentient weapon."))
/datum/outfit/job/roguetown/adventurer/warlock/proc/undeadpatron(mob/living/carbon/human/H, patronchoice)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/stealing, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/climbing, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE)
- if(prob(20))
- head = /obj/item/clothing/head/roguetown/knitcap
- else
- head = null
- if(prob(10))
- cloak = /obj/item/clothing/cloak/raincloak/brown
- else
- cloak = null
- if(prob(10))
- gloves = /obj/item/clothing/gloves/roguetown/fingerless
- else
- gloves = /obj/item/clothing/gloves/roguetown/brigandinegauntlets
- armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron
- pants = /obj/item/clothing/under/roguetown/tights/vagrant
- if(prob(50))
- pants = /obj/item/clothing/under/roguetown/tights/vagrant/l
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/vagrant
- if(prob(50))
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/vagrant/l
- wrists = /obj/item/clothing/wrists/roguetown/bracers
+ cloak = /obj/item/clothing/cloak/raincloak/brown
+ gloves = /obj/item/clothing/gloves/roguetown/angle
+ armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron
+ pants = /obj/item/clothing/under/roguetown/tights/random
+ shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/random
+ wrists = /obj/item/clothing/wrists/roguetown/vambraces
neck = /obj/item/clothing/neck/roguetown/gorget
- shoes = /obj/item/clothing/shoes/roguetown/boots/armor
+ shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron
+ head = /obj/item/clothing/head/roguetown/helmet/ironpothelmet
beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
belt = /obj/item/storage/belt/rogue/leather
- beltl = /obj/item/rogueweapon/mace
- backl = /obj/item/rogueweapon/sword/iron/short
-
+ beltl = /obj/item/rogueweapon/sword/iron/short
+ backl = /obj/item/rogueweapon/shield/tower
+ // They're the tank subclass, so I'm keeping their armor in. If it's a problem, it's pretty easy to comment it out and give them hauberks instead
//tank stats (must be 5 stat point total)
H.change_stat("strength", 1)
H.change_stat("endurance", 2)
@@ -392,7 +374,7 @@
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/infestation5e)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/chilltouch5e) // decay-themed magic and a skeletal hand to attack people with
- ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
+ // ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) // Unnecessary with the heavy armor trait
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC)
@@ -430,6 +412,7 @@
eldritchhealing.targetnotification = "Maggots eat away my dead flesh!"
eldritchhealing.othernotification = "'s wounds are healed by... Maggots?"
H.mind.AddSpell(eldritchhealing)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) // If you get healing, you get diagnose
///////////////////////////////
// Curse
@@ -485,7 +468,7 @@
//removed eldritch blast and infestation
spell1 = pick(/obj/effect/proc_holder/spell/invoked/projectile/fireball,/obj/effect/proc_holder/spell/invoked/projectile/lightningbolt,/obj/effect/proc_holder/spell/invoked/projectile/fetch,/obj/effect/proc_holder/spell/invoked/projectile/spitfire,/obj/effect/proc_holder/spell/invoked/projectile/firebolt5e,/obj/effect/proc_holder/spell/invoked/projectile/rayoffrost5e,/obj/effect/proc_holder/spell/invoked/projectile/acidsplash5e,/obj/effect/proc_holder/spell/invoked/blade_burst,/obj/effect/proc_holder/spell/invoked/frostbite5e,/obj/effect/proc_holder/spell/invoked/poisonspray5e,/obj/effect/proc_holder/spell/invoked/arcyne_storm,/obj/effect/proc_holder/spell/invoked/chilltouch5e,/obj/effect/proc_holder/spell/invoked/mindsliver5e,/obj/effect/proc_holder/spell/targeted/lightninglure5e,/obj/effect/proc_holder/spell/invoked/greenflameblade5e,)
spell2 = pick(/obj/effect/proc_holder/spell/invoked/forcewall_weak,/obj/effect/proc_holder/spell/self/bladeward5e,)
- spell3 = pick(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,)
+ spell3 = pick(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,/obj/effect/proc_holder/spell/targeted/touch/prestidigitation,)
/obj/item/book/rogue/eldritch/equipped(mob/living/user)
@@ -503,6 +486,7 @@
return
/obj/item/book/rogue/eldritch/dropped(mob/living/user)
+ . = ..()
if(active_item)
to_chat(user, span_notice("Your intellect shrinks away"))
user.change_stat("intelligence", -1)
@@ -571,6 +555,7 @@
return
/obj/item/clothing/ring/gold/signet/dropped(mob/living/user)
+ . = ..()
if(active_item)
to_chat(user, span_notice("You feel like a peasant."))
REMOVE_TRAIT(user, TRAIT_NOBLE, TRAIT_GENERIC)
@@ -605,6 +590,7 @@
return
/obj/item/clothing/neck/roguetown/psicross/eldritch/dropped(mob/living/user)
+ . = ..()
if(active_item)
to_chat(user, span_notice("Your stroke of luck has ended."))
user.change_stat("fortune", -3)
@@ -643,6 +629,7 @@
return
/obj/item/rope/chain/constellation/dropped(mob/living/user)
+ . = ..()
if(active_item)
to_chat(user, span_notice("Your purpose is scattered to the wind"))
@@ -683,5 +670,6 @@
soullink(/datum/soullink/oneway/delay, item_owner, user)
/obj/item/clothing/ring/diamond/soulbond/dropped(mob/living/user)
+ . = ..()
qdel(user.GetComponent(/datum/soullink/oneway))
REMOVE_TRAIT(src, TRAIT_NODROP, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm
index eadb2b5f8ff..96d46c4b154 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm
@@ -40,7 +40,8 @@
H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE)
H.change_stat("strength", 2)
- H.change_stat("endurance", 2) // 7 stat points total as a low-skill martial role without magic. Compared to Pally with 5 points.
+ H.change_stat("perception", 1)
+ H.change_stat("endurance", 2) // 8 stat points total as a low-skill martial role without magic. Compared to Pally with 7 points.
H.change_stat("constitution", 2)
H.change_stat("speed", 1)
shoes = /obj/item/clothing/shoes/roguetown/boots
@@ -103,7 +104,7 @@
H.change_stat("endurance", 1) // Weaker endurance compared to a traditional warrior/soldier. Smarter due to study of rare magical beasts.
H.change_stat("constitution", 2)
H.change_stat("intelligence", 1)
- H.change_stat("speed", 1)
+ H.change_stat("perception", 1)
shoes = /obj/item/clothing/shoes/roguetown/boots
gloves = /obj/item/clothing/gloves/roguetown/leather
belt = /obj/item/storage/belt/rogue/leather
@@ -162,7 +163,8 @@
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_DECEIVING_MEEKNESS, TRAIT_GENERIC)
- H.change_stat("strength", 2)
+ H.change_stat("strength", 1)
+ H.change_stat("perception", 1)
H.change_stat("endurance", 1)
H.change_stat("speed", 2)
H.change_stat("intelligence", 2)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/cheesemaker.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/cheesemaker.dm
index 68d0bb613e7..bc2c7e83c80 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/cheesemaker.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/cheesemaker.dm
@@ -46,4 +46,4 @@
/datum/advclass/cheesemaker/boost_by_plus_power(plus_factor, mob/living/carbon/human/H)
// ha ha yeah, fuck you cheesemaker playin retards!
return
-
\ No newline at end of file
+
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/towndoctor.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/towndoctor.dm
index f1a98ea1e6b..8543dd3b6ac 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/towndoctor.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/towndoctor.dm
@@ -30,7 +30,7 @@
/obj/item/reagent_containers/glass/bottle/rogue/healthpot = 1,
/obj/item/clothing/mask/rogue/physician = 1,
/obj/item/storage/box/matches = 1, /// for carterizer and ring.
- /obj/item/clothing/ring/lantern = 1, //lantern+
+ /obj/item/flashlight/flare/torch/lantern/ring = 1, //lantern+
/obj/item/storage/fancy/skit = 1,
)
if(H.gender == MALE)
diff --git a/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm b/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm
index 6797cb4d142..5baf4d996ba 100644
--- a/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm
+++ b/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm
@@ -64,5 +64,6 @@
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/splash)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/roustame)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/animate_object)
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, "[type]")
H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn)
diff --git a/code/modules/jobs/job_types/roguetown/church/druid.dm b/code/modules/jobs/job_types/roguetown/church/druid.dm
index 3fabca31929..1eea6c90d8f 100644
--- a/code/modules/jobs/job_types/roguetown/church/druid.dm
+++ b/code/modules/jobs/job_types/roguetown/church/druid.dm
@@ -12,7 +12,7 @@
allowed_races = RACES_ALL_KINDSPLUS
allowed_patrons = ALL_DIVINE_PATRONS //gets set to dendor on the outfit anyways lol
outfit = /datum/outfit/job/roguetown/druid
- tutorial = "You have always been drawn to the wild, and the wild drawn to you. When your calling came, it was from Sylvarn. Your patron claims dominion over all of nature and promises bounty to those who act in his name to bring balance to His domain. The Wilds are the most comfortable place for you, toiling alongside soilsons and soilbrides although sometimes what lies beyond the gates fills your soul with a feral yearning."
+ tutorial = "You have always been drawn to the wild, and the wild drawn to you. When your calling came, it was from Nature and it's deities. You act as a medium between the natural and magickal worlds, often caught between it and the changing pace of society. The people still depend on you for wisdom and balance in this city; and it is often up to you and the various orders who survey the woodland realm to maintain any form of law: be it the lands or the peoples."
display_order = JDO_DRUID
give_bank_account = FALSE
diff --git a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm
index 243456f14f3..36574378c9f 100644
--- a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm
+++ b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm
@@ -6,7 +6,7 @@
allowed_sexes = list(MALE, FEMALE)
allowed_races = RACES_ALL_KINDSPLUS
allowed_patrons = ALL_CLERIC_PATRONS
- allowed_ages = list(AGE_MIDDLEAGED, AGE_OLD)
+ allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED, AGE_OLD)
outfit = /datum/outfit/job/roguetown/grandmaster
min_pq = 5
max_pq = null
@@ -22,46 +22,46 @@
..()
H.virginity = TRUE
head = /obj/item/clothing/head/roguetown/helmet/heavy/bucket
- neck = /obj/item/clothing/neck/roguetown/psicross/astrata
+ wrists = /obj/item/clothing/neck/roguetown/psicross/astrata
cloak = /obj/item/clothing/cloak/templar/psydon
switch(H.patron.name)
- if("Astrata")
+ if("Elysius")
wrists = /obj/item/clothing/neck/roguetown/psicross/astrata
head = /obj/item/clothing/head/roguetown/helmet/heavy/astratahelm
cloak = /obj/item/clothing/cloak/templar/astrata
- if("Dendor")
+ if("Sylvarn")
wrists = /obj/item/clothing/neck/roguetown/psicross/dendor
head = /obj/item/clothing/head/roguetown/helmet/heavy/dendorhelm
cloak = /obj/item/clothing/cloak/templar/dendor
- if("Necra")
+ if("Yamais")
wrists = /obj/item/clothing/neck/roguetown/psicross/necra
head = /obj/item/clothing/head/roguetown/helmet/heavy/necrahelm
cloak = /obj/item/clothing/cloak/templar/necra
- if("Pestra")
+ if("Hermeir")
wrists = /obj/item/clothing/neck/roguetown/psicross/pestra
head = /obj/item/clothing/head/roguetown/helmet/heavy/pestrahelm
cloak = /obj/item/clothing/cloak/templar/pestra
- if("Noc")
+ if("Lune")
wrists = /obj/item/clothing/neck/roguetown/psicross/noc
head = /obj/item/clothing/head/roguetown/helmet/heavy/nochelm
cloak = /obj/item/clothing/cloak/templar/noc
- if("Eora") //Eora content from Stonekeep
+ if("Viiritri") //Eora content from Stonekeep
head = /obj/item/clothing/head/roguetown/helmet/heavy/eorahelm
wrists = /obj/item/clothing/neck/roguetown/psicross/eora
cloak = /obj/item/clothing/cloak/templar/eora
- if("Ravox")
+ if("Minhur")
head = /obj/item/clothing/head/roguetown/helmet/heavy/ravoxhelm
wrists = /obj/item/clothing/neck/roguetown/psicross/ravox
cloak = /obj/item/clothing/cloak/templar/ravox
- if("Xylix")
+ if("Onder")
head = /obj/item/clothing/head/roguetown/helmet/heavy/xylixhelm
wrists = /obj/item/clothing/neck/roguetown/psicross/xylix
cloak = /obj/item/clothing/cloak/templar/xylix
- if("Malum")
+ if("Svaeryog")
head = /obj/item/clothing/head/roguetown/helmet/malumhelmet
wrists = /obj/item/clothing/neck/roguetown/psicross/malum
cloak = /obj/item/clothing/cloak/templar/malum
- if("Abyssor")
+ if("Abyssia")
head = /obj/item/clothing/head/roguetown/helmet/heavy/abyssorhelm
wrists = /obj/item/clothing/neck/roguetown/psicross/abyssor
cloak = /obj/item/clothing/cloak/templar/abyssor
@@ -81,10 +81,10 @@
if(H.mind)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 4, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 5, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 5, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 4, TRUE) // actual ass, but worse. Good luck.
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 4, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 5, TRUE) // Might be utterly disgusting. Good luck.
H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE)
diff --git a/code/modules/jobs/job_types/roguetown/church/mortician.dm b/code/modules/jobs/job_types/roguetown/church/mortician.dm
index 9f61291de1c..60048b363c1 100644
--- a/code/modules/jobs/job_types/roguetown/church/mortician.dm
+++ b/code/modules/jobs/job_types/roguetown/church/mortician.dm
@@ -9,55 +9,69 @@
allowed_sexes = list(MALE, FEMALE)
allowed_races = RACES_ALL_KINDSPLUS
allowed_patrons = ALL_DIVINE_PATRONS //gets set to necra on the outfit anyways lol
- tutorial = "As an acolyte of a death god, you have been given the honor and rites of putting the dead to rest instead of healing the living. Yamais bestows much wisdom in her reminders of our balance in life. Will you toil for her?"
+ tutorial = "The purpose of a Gravesinger, working on behalf of both the local temple and of the Adventurers' Guild, is two-fold. As a priest of Yamais, it is to be the shepard of spirits to their preferred destination, whether it be burial and reincarnation, or reanimated in their own body, restored and cured of decomposition. As an expert on the affairs of the dead, it is to assist Adventurers in locating missing or slain comrades and providing the testimony of the dead to the Hedgeknights. Additionally, you have some medical training and the tools to use them, along with the expectation that you should rescue the dying if you can."
outfit = /datum/outfit/job/roguetown/undertaker
display_order = JDO_GRAVEMAN
give_bank_account = TRUE
- min_pq = -5
+ min_pq = 5
max_pq = null
/datum/outfit/job/roguetown/undertaker
- allowed_patrons = list(/datum/patron/divine/necra,/datum/patron/divine/pestra)
+ allowed_patrons = list(/datum/patron/divine/necra)
-/datum/outfit/job/roguetown/undertaker/pre_equip(mob/living/carbon/human/H)
+/datum/outfit/job/roguetown/undertaker/pre_equip(mob/living/carbon/human/H)//Updated to have medium armor, because they'll be at odds with Necromancers and likely be targeted by antags.
..()
- head = /obj/item/clothing/head/roguetown/necrahood
+ head = /obj/item/clothing/head/roguetown/roguehood/surghood
+ mask = /obj/item/clothing/mask/rogue/skullmask
neck = /obj/item/clothing/neck/roguetown/psicross/necra
- cloak = /obj/item/clothing/cloak/raincloak/mortus
- armor = /obj/item/clothing/suit/roguetown/shirt/robe/necra
- shirt = /obj/item/clothing/suit/roguetown/armor/leather/vest/black
- pants = /obj/item/clothing/under/roguetown/trou/leather/mourning
- shoes = /obj/item/clothing/shoes/roguetown/boots
- belt = /obj/item/storage/belt/rogue/leather/rope
+ gloves = /obj/item/clothing/gloves/roguetown/plate
+ cloak = /obj/item/clothing/cloak/templar/necra
+ wrists = /obj/item/clothing/wrists/roguetown/bracers
+ shirt = /obj/item/clothing/suit/roguetown/shirt/robe/surgrobe
+ armor = /obj/item/clothing/suit/roguetown/armor/plate/half
+ pants = /obj/item/clothing/under/roguetown/platelegs
+ shoes = /obj/item/clothing/shoes/roguetown/boots/armor
+ belt = /obj/item/storage/belt/rogue/leather/blackleather
backl = /obj/item/storage/backpack/rogue/satchel
- backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver =1, /obj/item/toy/cards/deck/tarot =1, /obj/item/scrying =1,)
+ backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver =1, /obj/item/toy/cards/deck/tarot =1, /obj/item/scrying =1, /obj/item/storage/fancy/skit =1, /obj/item/reagent_containers/glass/alembic =1)
beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
- backr = /obj/item/rogueweapon/shovel
- backl = /obj/item/rogueweapon/sickle/scythe
- backl = /obj/item/storage/backpack/rogue/satchel
+ beltl = /obj/item/rogueweapon/shovel/small
+ backr = /obj/item/rogueweapon/sickle/scythe
if(H.mind)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 5, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 5, TRUE)//So that they can be extra menacing with their scythe.
H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 2, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 3, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 5, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 4, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE)
if(H.age == AGE_OLD)
- H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 1, TRUE)
- H.change_stat("strength", 1)
+ H.mind.adjust_skillrank(/datum/skill/magic/holy, 1, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE)
+ H.change_stat("strength", 2)
H.change_stat("constitution", 2)
- H.change_stat("intelligence", -2)
- H.change_stat("endurance", 1)
- H.change_stat("speed", 1)
+ H.change_stat("endurance", 2)
+ H.change_stat("intelligence", 1)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/stable)//Spare the dying
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/purge)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/seance)
+ H.grant_language(/datum/language_holder/abyssal)
+ H.grant_language(/datum/language_holder/celestial)
ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_SOUL_EXAMINE, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_SIXTHSENSE, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_SEESPIRITS, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
+ H.update_sight()
H.cmode_music = 'sound/music/combat_clergy.ogg'
var/datum/devotion/C = new /datum/devotion(H, H.patron)
C.grant_spells(H)
diff --git a/code/modules/jobs/job_types/roguetown/church/priest.dm b/code/modules/jobs/job_types/roguetown/church/priest.dm
index d44cbfcdc69..f2468d1a3b5 100644
--- a/code/modules/jobs/job_types/roguetown/church/priest.dm
+++ b/code/modules/jobs/job_types/roguetown/church/priest.dm
@@ -1,12 +1,13 @@
/datum/job/roguetown/priest
- title = "Prophet"
+ title = "Archpriest"
+ f_title = "Archpriestess"
flag = PRIEST
department_flag = CHURCHMEN
faction = "Station"
total_positions = 5
spawn_positions = 5
selection_color = JCOLOR_CHURCH
- f_title = "Prophetess"
+ f_title = "Archpriestess"
allowed_races = RACES_ALL_KINDSPLUS
allowed_patrons = ALL_DIVINE_PATRONS
allowed_sexes = list(MALE, FEMALE)
@@ -72,7 +73,7 @@
/mob/living/carbon/human/proc/coronate_lord()
set name = "Coronate"
- set category = "Prophet"
+ set category = "Archpriest"
if(!mind)
return
if(!istype(get_area(src), /area/rogue/indoors/town/church/chapel))
@@ -118,7 +119,7 @@
/mob/living/carbon/human/proc/churchexcommunicate()
set name = "Curse"
- set category = "Prophet"
+ set category = "Archpriest"
if(stat)
return
var/inputty = input("Curse someone... (curse them again to remove it)", "Sinner Name") as text|null
@@ -150,7 +151,7 @@
/mob/living/carbon/human/proc/churchannouncement()
set name = "Announcement"
- set category = "Prophet"
+ set category = "Archpriest"
if(!COOLDOWN_FINISHED(src, church_announcement))
to_chat(src, span_warning("I should wait..."))
diff --git a/code/modules/jobs/job_types/roguetown/church/puritan.dm b/code/modules/jobs/job_types/roguetown/church/puritan.dm
index 439e50df9dd..b0d2950ffa1 100644
--- a/code/modules/jobs/job_types/roguetown/church/puritan.dm
+++ b/code/modules/jobs/job_types/roguetown/church/puritan.dm
@@ -26,7 +26,7 @@
outfit = /datum/outfit/job/roguetown/puritan
display_order = JDO_PURITAN
give_bank_account = 36
- min_pq = 0
+ min_pq = 10
max_pq = null
/datum/outfit/job/roguetown/puritan
@@ -78,6 +78,7 @@
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC)
H.cmode_music = 'sound/music/combat_clergy.ogg'
/mob/living/carbon/human/proc/torture_victim()
diff --git a/code/modules/jobs/job_types/roguetown/church/templar.dm b/code/modules/jobs/job_types/roguetown/church/templar.dm
index 9717aaf2e1f..ca8d2ba4938 100644
--- a/code/modules/jobs/job_types/roguetown/church/templar.dm
+++ b/code/modules/jobs/job_types/roguetown/church/templar.dm
@@ -26,43 +26,43 @@
neck = /obj/item/clothing/neck/roguetown/psicross/silver
cloak = /obj/item/clothing/cloak/templar/psydon
switch(H.patron.name)
- if("Astrata")
+ if("Elysius")
wrists = /obj/item/clothing/neck/roguetown/psicross/astrata
head = /obj/item/clothing/head/roguetown/helmet/heavy/astratahelm
cloak = /obj/item/clothing/cloak/templar/astrata
- if("Dendor")
+ if("Sylvarn")
wrists = /obj/item/clothing/neck/roguetown/psicross/dendor
head = /obj/item/clothing/head/roguetown/helmet/heavy/dendorhelm
cloak = /obj/item/clothing/cloak/templar/dendor
- if("Necra")
+ if("Yamais")
wrists = /obj/item/clothing/neck/roguetown/psicross/necra
head = /obj/item/clothing/head/roguetown/helmet/heavy/necrahelm
cloak = /obj/item/clothing/cloak/templar/necra
- if("Pestra")
+ if("Hermeir")
wrists = /obj/item/clothing/neck/roguetown/psicross/pestra
head = /obj/item/clothing/head/roguetown/helmet/heavy/pestrahelm
cloak = /obj/item/clothing/cloak/templar/pestra
- if("Noc")
+ if("Lune")
wrists = /obj/item/clothing/neck/roguetown/psicross/noc
head = /obj/item/clothing/head/roguetown/helmet/heavy/nochelm
cloak = /obj/item/clothing/cloak/templar/noc
- if("Eora") //Eora content from Stonekeep
+ if("Viiritri") //Eora content from Stonekeep
head = /obj/item/clothing/head/roguetown/helmet/heavy/eorahelm
wrists = /obj/item/clothing/neck/roguetown/psicross/eora
cloak = /obj/item/clothing/cloak/templar/eora
- if("Ravox")
+ if("Minhur")
head = /obj/item/clothing/head/roguetown/helmet/heavy/ravoxhelm
wrists = /obj/item/clothing/neck/roguetown/psicross/ravox
cloak = /obj/item/clothing/cloak/templar/ravox
- if("Xylix")
+ if("Onder")
head = /obj/item/clothing/head/roguetown/helmet/heavy/xylixhelm
wrists = /obj/item/clothing/neck/roguetown/psicross/xylix
cloak = /obj/item/clothing/cloak/templar/xylix
- if("Malum")
+ if("Svaeryog")
head = /obj/item/clothing/head/roguetown/helmet/malumhelmet
wrists = /obj/item/clothing/neck/roguetown/psicross/malum
cloak = /obj/item/clothing/cloak/templar/malum
- if("Abyssor")
+ if("Abyssia")
head = /obj/item/clothing/head/roguetown/helmet/heavy/abyssorhelm
wrists = /obj/item/clothing/neck/roguetown/psicross/abyssor
cloak = /obj/item/clothing/cloak/templar/abyssor
diff --git a/code/modules/jobs/job_types/roguetown/courtier/magician.dm b/code/modules/jobs/job_types/roguetown/courtier/magician.dm
index c5b9c726c23..333ad778da5 100644
--- a/code/modules/jobs/job_types/roguetown/courtier/magician.dm
+++ b/code/modules/jobs/job_types/roguetown/courtier/magician.dm
@@ -9,7 +9,19 @@
allowed_races = RACES_ALL_KINDSPLUS
allowed_sexes = list(MALE, FEMALE)
- spells = list(/obj/effect/proc_holder/spell/invoked/projectile/fireball/greater, /obj/effect/proc_holder/spell/invoked/arcyne_storm, /obj/effect/proc_holder/spell/invoked/invisibility, /obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe, /obj/effect/proc_holder/spell/targeted/ethereal_jaunt, /obj/effect/proc_holder/spell/aoe_turf/rogue_knock)
+ spells = list (
+ /obj/effect/proc_holder/spell/invoked/projectile/fireball/greater,
+ /obj/effect/proc_holder/spell/invoked/projectile/spitfire,
+ /obj/effect/proc_holder/spell/invoked/projectile/lightningbolt,
+ /obj/effect/proc_holder/spell/invoked/arcyne_storm,
+ /obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,
+ /obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,
+ /obj/effect/proc_holder/spell/invoked/invisibility,
+ /obj/effect/proc_holder/spell/invoked/projectile/fetch,
+ /obj/effect/proc_holder/spell/targeted/touch/prestidigitation,
+ /obj/effect/proc_holder/spell/targeted/forcewall,
+ /obj/effect/proc_holder/spell/targeted/ethereal_jaunt,
+ /obj/effect/proc_holder/spell/aoe_turf/rogue_knock)
display_order = JDO_MAGICIAN
tutorial = "Your creed is one dedicated to the conquering of the arcane arts and the constant thrill of knowledge. \
You are one of the Arch-Magicians of Dreamkeeps Magick Academy; Ravenloft. You help teach and manage the students of this Academy.\
@@ -39,6 +51,7 @@
backl = /obj/item/storage/backpack/rogue/satchel
backpack_contents = list(/obj/item/slimepotion/lovepotion,/obj/item/reagent_containers/glass/bottle/rogue/poison,/obj/item/reagent_containers/glass/bottle/rogue/healthpot)
ADD_TRAIT(H, TRAIT_SEEPRICES, "[type]")
+ ADD_TRAIT(H, TRAIT_USEMAGICITEM, "[type]")
if(H.mind)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 6, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 5, TRUE)
@@ -76,7 +89,7 @@
if(/datum/patron/divine/pestra)
if(H.mind)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE)
- else if(/datum/patron/divine/ravox || /datum/patron/inhumen/graggar) //raises the pick(1,2) weapon skills to 2 if they weren't there already
+ if(/datum/patron/divine/ravox, /datum/patron/inhumen/graggar) //raises the pick(1,2) weapon skills to 2 if they weren't there already
if(H.mind)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, max((2 - H.mind.get_skill_level(/datum/skill/combat/knives)), 0), TRUE) //basically, (2 - current skill) is added to the total skill value.
H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, max((2 - H.mind.get_skill_level(/datum/skill/combat/swords)), 0), TRUE)
diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm
index be21a865a02..4d75b9df673 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm
@@ -3,18 +3,18 @@
flag = BOGGUARD
department_flag = GARRISON
faction = "Station"
- total_positions = 10
- spawn_positions = 10
+ total_positions = 6
+ spawn_positions = 6
selection_color = JCOLOR_SOLDIER
allowed_sexes = list(MALE, FEMALE)
allowed_races = RACES_ALL_KINDSPLUS
allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED, AGE_OLD)
- tutorial = " You decided to protect the dream dales oneday, and you joined the hedgecademy within the rangers keep. Learning from the best you can muster, you're a certified monster hunter as much as you are a ranger and guard. Keeping these woodlands safe is your duty."
+ tutorial = "The origins of your order are as ancient as the land upon which Stonehedge is built. The first Hedge Knights were rangers, once devoted to Sylvarn but finding that the wilderness was often harsh and lacking for justice. Hedge Knights these days are employed by the Adventurers' Guild to protect the town from violators of the Five Laws, whether they be adventurers, bandits, peasants, or night creatures. Do not abandon the town or abuse the powers and trust vested in you, or they will surely be taken away."
display_order = JDO_TOWNGUARD
whitelist_req = FALSE
outfit = /datum/outfit/job/roguetown/bogguardsman
give_bank_account = 60
- min_pq = 5
+ min_pq = 15
max_pq = null
cmode_music = 'sound/music/combat_bog.ogg'
@@ -23,57 +23,58 @@
. = ..()
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(istype(H.cloak, /obj/item/clothing/cloak/stabard/bog))
+ if(istype(H.cloak, /obj/item/clothing/cloak/templar/dendor))
var/obj/item/clothing/S = H.cloak
var/index = findtext(H.real_name, " ")
if(index)
index = copytext(H.real_name, 1,index)
if(!index)
index = H.real_name
- S.name = "bogman tabard ([index])"
+ S.name = "Hedge Knight tabard ([index])"
/datum/outfit/job/roguetown/bogguardsman/pre_equip(mob/living/carbon/human/H)
. = ..()
- head = /obj/item/clothing/head/roguetown/helmet/leather
- armor = /obj/item/clothing/suit/roguetown/armor/gambeson
- cloak = /obj/item/clothing/cloak/raincloak/green
+ head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet
+ armor = /obj/item/clothing/suit/roguetown/armor/plate/half/foresterarmor
+ cloak = /obj/item/clothing/cloak/templar/dendor
neck = /obj/item/clothing/neck/roguetown/bervor
- gloves = /obj/item/clothing/gloves/roguetown/leather
- wrists = /obj/item/clothing/wrists/roguetown/bracers/leather
- shirt = /obj/item/clothing/suit/roguetown/shirt/shortshirt/bog
- pants = /obj/item/clothing/under/roguetown/trou/leather
- shoes = /obj/item/clothing/shoes/roguetown/boots/leather
- beltl = /obj/item/flashlight/flare/torch/lantern
+ gloves = /obj/item/clothing/gloves/roguetown/forestergauntlets
+ wrists = /obj/item/clothing/wrists/roguetown/bracers
+ shirt = /obj/item/clothing/suit/roguetown/armor/chainmail
+ pants = /obj/item/clothing/under/roguetown/chainlegs
+ shoes = /obj/item/clothing/shoes/roguetown/boots/forestershoes
+ beltl = /obj/item/quiver/arrows
belt = /obj/item/storage/belt/rogue/leather
- beltr = /obj/item/rogueweapon/sword/silver/sabre/elf
+ beltr = /obj/item/rogueweapon/mace/stunmace/hedgeknight
backr = /obj/item/storage/backpack/rogue/satchel
backl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow
- wrists = /obj/item/clothing/wrists/roguetown/bracers/leather
id = /obj/item/scomstone
- backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel = 1, /obj/item/signal_horn = 1)
+ backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver = 1, /obj/item/signal_horn = 1)
if(H.mind)
assign_skills(H)
H.verbs |= /mob/proc/haltyell
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC)
-/*Design philosophy: "Jack of all tades, master of.. few" - Peasent, so bow, axe, and polearm skill. Knows most combat skills, but other than those not great with them.
-Also given some non-combat skills that a peasent would have, just to support themselves, but not anything to replace soilsons with.*/
+/*Design philosophy: Protectors of Stonehedge, whose holy maces are the bane of any who violate the Guild's few laws.
+While they are not as physically strong as more conventional warriors, they are swift and their endurance is second to none.*/
/datum/outfit/job/roguetown/bogguardsman/proc/assign_skills(mob/living/carbon/human/H)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 5, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 5, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 6, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/labor/butchering, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 3, TRUE)
@@ -84,8 +85,7 @@ Also given some non-combat skills that a peasent would have, just to support the
H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 2, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 4, TRUE) //Hearthstone change.
- H.change_stat("strength", 3)
H.change_stat("perception", 2)
- H.change_stat("constitution", 2)
- H.change_stat("endurance", 2)
- H.change_stat("speed", 1)
+ H.change_stat("constitution", 4)
+ H.change_stat("endurance", 4)
+ H.change_stat("speed", 2)
diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm
index 10b56a16caf..34cc8e882f2 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm
@@ -17,7 +17,7 @@
outfit = /datum/outfit/job/roguetown/bogmaster
give_bank_account = 2500
- min_pq = 10
+ min_pq = 15
max_pq = null
cmode_music = 'sound/music/combat_bog.ogg'
@@ -25,20 +25,20 @@
. = ..()
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(istype(H.cloak, /obj/item/clothing/cloak/stabard/bog))
+ if(istype(H.cloak, /obj/item/clothing/cloak/templar/dendor))
var/obj/item/clothing/S = H.cloak
var/index = findtext(H.real_name, " ")
if(index)
index = copytext(H.real_name, 1,index)
if(!index)
index = H.real_name
- S.name = "bog master tabard ([index])"
+ S.name = "Hedgemaster tabard ([index])"
/datum/outfit/job/roguetown/bogmaster/pre_equip(mob/living/carbon/human/H)
. = ..()
- head = /obj/item/clothing/head/roguetown/helmet/leather
+ head = /obj/item/clothing/head/roguetown/helmet/elfbarbutewings
pants = /obj/item/clothing/under/roguetown/chainlegs
- cloak = /obj/item/clothing/cloak/raincloak/green
+ cloak = /obj/item/clothing/cloak/templar/dendor
shirt = /obj/item/clothing/suit/roguetown/armor/chainmail
armor = /obj/item/clothing/suit/roguetown/armor/plate/half
neck = /obj/item/clothing/neck/roguetown/bervor
@@ -46,7 +46,7 @@
gloves = /obj/item/clothing/gloves/roguetown/chain
shoes = /obj/item/clothing/shoes/roguetown/boots/leather
beltl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow
- beltr = /obj/item/rogueweapon/sword/silver/sabre/elf
+ beltr = /obj/item/rogueweapon/mace/stunmace/hedgeknight
belt = /obj/item/storage/belt/rogue/leather
backr = /obj/item/storage/backpack/rogue/satchel
backl = /obj/item/quiver/Parrows
@@ -54,7 +54,7 @@
if(H.mind)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 5, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 5, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 5, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 5, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 4, TRUE)
@@ -64,23 +64,25 @@
H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 4, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 4, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 6, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE)
+ H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 4, TRUE) //Hearthstone change.
H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3, TRUE) //Peasent levy, so some skill
- H.mind.adjust_skillrank_up_to(/datum/skill/labor/farming, pick(1,2,2), TRUE) //Peasent levy, so some skill
- H.change_stat("strength", 3)
- H.change_stat("constitution", 2)
- H.change_stat("perception", 2)
- H.change_stat("endurance", 2)
+ H.mind.adjust_skillrank_up_to(/datum/skill/labor/farming, 2, TRUE) //Peasent levy, so some skill
+ H.change_stat("constitution", 4)
+ H.change_stat("perception", 3)
+ H.change_stat("endurance", 4)
+ H.change_stat("speed", 2)
H.dna.species.soundpack_m = new /datum/voicepack/male/knight()
H.verbs |= /mob/proc/haltyell
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC)
/obj/effect/proc_holder/spell/self/convertrole/bog
name = "Recruit Hedgeknight"
diff --git a/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm b/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm
deleted file mode 100644
index 71ce9cff6bf..00000000000
--- a/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-/datum/job/roguetown/manorguard
- title = "Man at Arms"
- flag = MANATARMS
- department_flag = GARRISON
- faction = "Station"
- total_positions = 6
- spawn_positions = 6
-
- allowed_sexes = list(MALE, FEMALE)
- allowed_races = RACES_ALL_KINDSPLUS
- allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED)
- tutorial = "Having proven yourself loyal and capable, you are entrusted to defend the Royal Family and their Court, \
- trained regularly in combat and siege warfare you stand a small chance of surviving the King's reign. \
- It's an honor to die as part of His Majesty's retinue, the Marshal reminds you every night."
- display_order = JDO_CASTLEGUARD
- whitelist_req = FALSE
-
- outfit = /datum/outfit/job/roguetown/manorguard
- give_bank_account = 22
- min_pq = 3
- max_pq = null
-
- cmode_music = 'sound/music/combat_guard2.ogg'
-
-/datum/job/roguetown/manorguard/after_spawn(mob/living/L, mob/M, latejoin = TRUE)
- ..()
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- if(istype(H.cloak, /obj/item/clothing/cloak/stabard/surcoat/guard))
- var/obj/item/clothing/S = H.cloak
- var/index = findtext(H.real_name, " ")
- if(index)
- index = copytext(H.real_name, 1,index)
- if(!index)
- index = H.real_name
- S.name = "man-at-arms jupon ([index])"
-
-/datum/outfit/job/roguetown/manorguard/pre_equip(mob/living/carbon/human/H)
- ..()
- head = /obj/item/clothing/head/roguetown/helmet/kettle
- pants = /obj/item/clothing/under/roguetown/chainlegs
- cloak = /obj/item/clothing/cloak/stabard/surcoat/guard
- gloves = /obj/item/clothing/gloves/roguetown/chain
- neck = /obj/item/clothing/neck/roguetown/gorget
- shirt = /obj/item/clothing/suit/roguetown/armor/chainmail
- armor = /obj/item/clothing/suit/roguetown/armor/plate/half
- shoes = /obj/item/clothing/shoes/roguetown/boots/leather
- beltl = /obj/item/storage/keyring/man_at_arms
- belt = /obj/item/storage/belt/rogue/leather/black
- backr = /obj/item/storage/backpack/rogue/satchel/black
- backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/rope/chain = 1, /obj/item/signal_horn = 1)
- r_hand = /obj/item/rogueweapon/spear
- if(H.mind)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, pick(2,3,3), TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, pick(1,2,3,3), TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 1, TRUE)
- H.change_stat("strength", 2)
- H.change_stat("perception", 2)
- H.change_stat("constitution", 1)
- H.change_stat("endurance", 1)
- H.change_stat("speed", 1)
- H.verbs |= /mob/proc/haltyell
- ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
-
diff --git a/code/modules/jobs/job_types/roguetown/garrison/royalguard.dm b/code/modules/jobs/job_types/roguetown/garrison/royalguard.dm
deleted file mode 100644
index 451dc669d70..00000000000
--- a/code/modules/jobs/job_types/roguetown/garrison/royalguard.dm
+++ /dev/null
@@ -1,218 +0,0 @@
-/datum/job/roguetown/royalguard
- title = "Pegasian Knight"
- flag = ROYALGUARD
- department_flag = GARRISON
- faction = "Station"
- total_positions = 4
- spawn_positions = 4
- allowed_sexes = list(MALE, FEMALE)
- allowed_races = RACES_ALL_KINDSPLUS
- allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED)
- tutorial = "Having proven yourself loyal and capable, you have been knighted to serve the realm as the monarch's personal guard. You listen to your Lord and the Captain of the Guard, defending your Lord and realm."
- display_order = JDO_ROYALGUARD
- allowed_patrons = ALL_DIVINE_PATRONS
- whitelist_req = FALSE
-
- outfit = /datum/outfit/job/roguetown/royalguard
- advclass_cat_rolls = list(CTAG_ROYALGUARD = 20)
-
- give_bank_account = 22
- min_pq = 1
- max_pq = null
-
- cmode_music = 'sound/music/combat_knight.ogg'
-
-/datum/job/roguetown/royalguard/after_spawn(mob/living/L, mob/M, latejoin = TRUE)
- ..()
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- H.advsetup = 1
- H.invisibility = INVISIBILITY_MAXIMUM
- H.become_blind("advsetup")
- if(istype(H.cloak, /obj/item/clothing/cloak/stabard/surcoat/guard))
- var/obj/item/clothing/S = H.cloak
- var/index = findtext(H.real_name, " ")
- if(index)
- index = copytext(H.real_name, 1,index)
- if(!index)
- index = H.real_name
- S.name = "knight's tabard ([index])"
- var/prev_real_name = H.real_name
- var/prev_name = H.name
- var/honorary = "Sir"
- if(H.gender == FEMALE)
- honorary = "Dame"
- H.real_name = "[honorary] [prev_real_name]"
- H.name = "[honorary] [prev_name]"
-
-/datum/outfit/job/roguetown/royalguard //For shared gear by the class. Royal archer gets different-looking armor.
- pants = /obj/item/clothing/under/roguetown/chainlegs
- neck = /obj/item/clothing/neck/roguetown/gorget
- shirt = /obj/item/clothing/suit/roguetown/armor/chainmail
- beltl = /obj/item/storage/keyring/guardcastle
- belt = /obj/item/storage/belt/rogue/leather/black
- backr = /obj/item/storage/backpack/rogue/satchel/black
- wrists = /obj/item/clothing/wrists/roguetown/bracers
-
-/datum/advclass/royalguard/heavy
- name = "Heavy Knight"
- tutorial = "While other knights may specialize in horse riding and swords, you specialize in two-handed weapons and maces. People may fear the mounted knights, but they should truly fear those who come off their mount.."
- outfit = /datum/outfit/job/roguetown/royalguard/heavy
-
- category_tags = list(CTAG_ROYALGUARD)
-
-/datum/outfit/job/roguetown/royalguard/heavy/pre_equip(mob/living/carbon/human/H)
- ..()
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 1, TRUE)
-
- //Normal shared skill section.
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, pick(1,2,2), TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, pick(2,3,3), TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, pick(2,2,3), TRUE)
- ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight
- H.dna.species.soundpack_m = new /datum/voicepack/male/knight() //For knightly voices; even though I despise them.
- H.verbs |= /mob/proc/haltyell
-
- H.change_stat("strength", 4)
- H.change_stat("constitution", 3)
- H.change_stat("endurance", 3)
- H.change_stat("speed", -3) //Lower speed for more strength and con of other knight, and to off-set endurance. (They need the end-stam for 2 handed.)
- // Decorative helberd, 2-handed
- if(prob(33))
- backl = /obj/item/rogueweapon/halberd/bardiche
- // Great-mace, 2-handed (worse than normal steel but better than iron)
- else if(prob(33))
- backl = /obj/item/rogueweapon/mace/goden/steel
- // Iron mace + tower shield
- else
- beltr = /obj/item/rogueweapon/mace
- backl = /obj/item/rogueweapon/shield/buckler
- // Armor section
- head = /obj/item/clothing/head/roguetown/helmet/heavy/royalknight
- armor = /obj/item/clothing/suit/roguetown/armor/plate/heavyplateroyalguard
- pants = /obj/item/clothing/under/roguetown/heavyroyalplatelegs //Gets better pants than chain ones.
- cloak = /obj/item/clothing/cloak/cape/guard
- gloves = /obj/item/clothing/gloves/roguetown/plate
- shoes = /obj/item/clothing/shoes/roguetown/boots/armor
- backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/rope/chain = 1, /obj/item/signal_horn = 1)
-
-/datum/advclass/royalguard/knight
- name = "Foot Knight"
- tutorial = "You are acustomed to traditional knight training, swords, shields, and mounts. You are swifter than some other knights and you know it; it's time to make use of it.."
- outfit = /datum/outfit/job/roguetown/royalguard/knight
-
- category_tags = list(CTAG_ROYALGUARD)
-
-/datum/outfit/job/roguetown/royalguard/knight/pre_equip(mob/living/carbon/human/H)
- ..()
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 3, TRUE) //Mildly better shield skill due to less weapon options.
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 3, TRUE) //Mounted knight due to 1-handed weapons specialty.
-
- //Normal shared skill section.
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, pick(1,2,2), TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, pick(2,3,3), TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, pick(2,2,3), TRUE)
- ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight.
- H.dna.species.soundpack_m = new /datum/voicepack/male/knight() //For knightly voices; even though I despise them.
- H.verbs |= /mob/proc/haltyell
-
- H.change_stat("strength", 3)
- H.change_stat("intelligence", 1)
- H.change_stat("perception", 1)
- H.change_stat("constitution", 2)
- H.change_stat("endurance", 2)
- // Flail + tower shield
- if(prob (33))
- beltr = /obj/item/rogueweapon/flail
- backl = /obj/item/rogueweapon/shield/buckler
- // Regular sword + tower shield
- else if(prob (33))
- beltr = /obj/item/rogueweapon/sword
- backl = /obj/item/rogueweapon/shield/buckler
- // Bastard sword (traditional knight loadout; can be 1-handed but far better 2-handed. Higher stam drain.)
- else
- backl = /obj/item/rogueweapon/sword/long
-
- // Armor section
- head = /obj/item/clothing/head/roguetown/helmet/heavy/royalknight
- armor = /obj/item/clothing/suit/roguetown/armor/plate/halfplateroyalguard
- cloak = /obj/item/clothing/cloak/cape/guard
- gloves = /obj/item/clothing/gloves/roguetown/chain
- shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron
- backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/rope/chain = 1, /obj/item/signal_horn = 1)
-
-/datum/advclass/royalguard/archer
- name = "Royal Archer"
- tutorial = "While you may be knighted, you are not what one expects for a 'knight'. You lack the heavy armor but all those royal hunts have homed your skills in not only archer but swords as well!"
- outfit = /datum/outfit/job/roguetown/royalguard/archer
-
- category_tags = list(CTAG_ROYALGUARD)
-
-/datum/outfit/job/roguetown/royalguard/archer/pre_equip(mob/living/carbon/human/H)
- ..()
- //This class doesn't use the normal shared skill section; totally different!!
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 5, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 4, TRUE) //Good as hell knife skill; makes them standout more compared to other guards.
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 3, TRUE) //Decent sword skill, mostly for short-swords n' all.
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) //Not good training; gave some because non-lethals.
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 1, TRUE) //Some training, not great at all though. Equal to an adventurer, L.
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 1, TRUE)
- ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
- ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) //Archer, so dodge expert. Lower speed than Watch crossbowman though, so not as strong.
- ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Royal Longbowman; kinda rare realistically, though they did exist irl. But hey - royal guard + fantasy.
- H.dna.species.soundpack_m = new /datum/voicepack/male/knight()
- H.verbs |= /mob/proc/haltyell
-
- //Stats are just slightly better than Watchman crossbowman basically. Still gets same amount of stats total as base royal guard.
- H.change_stat("strength", 2)
- H.change_stat("intelligence", 1)
- H.change_stat("perception", 2)
- H.change_stat("constitution", 1)
- H.change_stat("endurance", 2)
- H.change_stat("speed", 1) //Gets less speed than Watch crossbowman, but gets some other stat bonuses over them.
-
- //Weapon section
- beltr = /obj/item/quiver/arrows
- backl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow
-
- //Armor section - We give them kinda meh medium armor to either choose to upgrade to scale, or go for light armors.
- head = /obj/item/clothing/head/roguetown/helmet/bascinet/royalguard
- armor = /obj/item/clothing/suit/roguetown/armor/plate/half
- cloak = /obj/item/clothing/cloak/stabard/guardhood
- gloves = /obj/item/clothing/gloves/roguetown/angle
- shoes = /obj/item/clothing/shoes/roguetown/nobleboot
- backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/rope/chain = 1, /obj/item/signal_horn = 1)
diff --git a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm
index 62853a862b6..e868ea23b58 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm
@@ -14,7 +14,7 @@
outfit = /datum/outfit/job/roguetown/veteran
give_bank_account = 1500
- min_pq = 0
+ min_pq = 15
max_pq = null
cmode_music = 'sound/music/combat_guard.ogg'
@@ -36,5 +36,6 @@
/datum/outfit/job/roguetown/veteran/pre_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
cloak = /obj/item/clothing/cloak/half/vet
+ r_hand = /obj/item/scomstone
l_hand = /obj/item/class_selector/veteran //this is where they equip shit.
H.verbs |= /mob/proc/haltyell
diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm
index 43bac496a0d..fb03eb76661 100644
--- a/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm
+++ b/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm
@@ -17,7 +17,6 @@
/datum/outfit/job/roguetown/tribalcook/pre_equip(mob/living/carbon/human/H)
..()
- armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin
shirt = /obj/item/clothing/suit/roguetown/shirt/tribalrag
pants = /obj/item/clothing/under/roguetown/loincloth/brown
belt = /obj/item/storage/belt/rogue/leather/rope
diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm
index 738dd5b1f62..a3d0ccd6eff 100644
--- a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm
+++ b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm
@@ -7,7 +7,7 @@
spawn_positions = 1
allowed_sexes = list(MALE, FEMALE)
allowed_races = RACES_ALL_KINDSPLUS
- tutorial = "A tribal druidic shaman that works with shaman magic to heal the wounded and bring the dead back. They also take care of the farming on the side."
+ tutorial = "A tribal druidic shaman that works with shaman magic to heal the wounded and bring even dead back. Their prowess with druidic magic allows them to grow crops and guide the tribe with their wisdoms."
display_order = JDO_TRIBALSHAMAN
spells = list(/obj/effect/proc_holder/spell/self/convertrole/tribal, /obj/effect/proc_holder/spell/invoked/cure_rot, /obj/effect/proc_holder/spell/invoked/heal/shaman, /obj/effect/proc_holder/spell/invoked/revive/shaman)
outfit = /datum/outfit/job/roguetown/tribalshaman
@@ -53,6 +53,9 @@
H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 3, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 2, TRUE) //This does nothing, but maybe one day it will.
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/heal/shaman)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/revive/shaman)
if(H.age == AGE_OLD)
H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 1, TRUE)
H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 1, TRUE)
@@ -64,9 +67,6 @@
ADD_TRAIT(H, TRAIT_NASTY_EATER, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_PERFECT_TRACKER, TRAIT_GENERIC)
var/datum/devotion/C = new /datum/devotion(H, H.patron)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/heal/shaman)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/revive/shaman)
C.grant_spells_priest(H)
H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray)
diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm
index d740523097b..1f8c864f173 100644
--- a/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm
+++ b/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm
@@ -16,7 +16,6 @@
/datum/outfit/job/roguetown/tribalsmith/pre_equip(mob/living/carbon/human/H)
..()
- armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin
shirt = /obj/item/clothing/suit/roguetown/shirt/tribalrag
pants = /obj/item/clothing/under/roguetown/loincloth/brown
belt = /obj/item/storage/belt/rogue/leather
diff --git a/code/modules/jobs/job_types/roguetown/nobility/judge.dm b/code/modules/jobs/job_types/roguetown/nobility/judge.dm
index fd003768403..fc4476f219b 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/judge.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/judge.dm
@@ -132,32 +132,29 @@
var/choice = alert(lord, "The judge requests a new law!\n[requested_law]", "JUDGE LAW REQUEST", "Yes", "No")
if(choice != "Yes" || QDELETED(lord) || lord.stat > CONSCIOUS)
if(judge)
- to_chat(span_warning("The lord has denied the request for a new law!"))
+ to_chat(judge, span_warning("The lord has denied the request for a new law!"))
return
make_law(requested_law)
-
/proc/lord_law_removal_requested(mob/living/judge, mob/living/carbon/human/lord, requested_law)
if(!requested_law || !GLOB.laws_of_the_land[requested_law])
return
var/choice = alert(lord, "The judge requests the removal of a law!\n[GLOB.laws_of_the_land[requested_law]]", "JUDGE LAW REQUEST", "Yes", "No")
if(choice != "Yes" || QDELETED(lord) || lord.stat > CONSCIOUS)
if(judge)
- to_chat(span_warning("The lord has denied the request for a law removal!"))
+ to_chat(judge, span_warning("The lord has denied the request for a law removal!"))
return
remove_law(requested_law)
-
/proc/lord_purge_requested(mob/living/judge, mob/living/carbon/human/lord)
var/choice = alert(lord, "The judge requests a purge of all laws!", "JUDGE PURGE REQUEST", "Yes", "No")
if(choice != "Yes" || QDELETED(lord) || lord.stat > CONSCIOUS)
if(judge)
- to_chat(span_warning("The lord has denied the request for a purge of all laws!"))
+ to_chat(judge, span_warning("The lord has denied the request for a purge of all laws!"))
return
purge_laws()
-
/proc/lord_outlaw_requested(mob/living/judge, mob/living/carbon/human/lord, requested_outlaw)
var/choice = alert(lord, "The judge requests to outlaw someone!\n[requested_outlaw]", "JUDGE OUTLAW REQUEST", "Yes", "No")
if(choice != "Yes" || QDELETED(lord) || lord.stat > CONSCIOUS)
if(judge)
- to_chat(span_warning("The lord has denied the request for declaring an outlaw!"))
+ to_chat(judge, span_warning("The lord has denied the request for declaring an outlaw!"))
return
- make_outlaw(requested_outlaw)
\ No newline at end of file
+ make_outlaw(requested_outlaw)
diff --git a/code/modules/jobs/job_types/roguetown/peasants/grabber.dm b/code/modules/jobs/job_types/roguetown/peasants/grabber.dm
deleted file mode 100644
index d9ed5c36347..00000000000
--- a/code/modules/jobs/job_types/roguetown/peasants/grabber.dm
+++ /dev/null
@@ -1,66 +0,0 @@
-/datum/job/roguetown/grabber
- title = "Grabber"
- flag = GRABBER
- department_flag = PEASANTS
- faction = "Station"
- total_positions = 0
- spawn_positions = 0
-
- allowed_races = RACES_ALL_KINDSPLUS
-
- tutorial = "Grabber is the lowest position in the Merchant's Guild, reserved for the strong, loyal newcomers. They can be like family to the merchant in these foreign lands."
-
- outfit = /datum/outfit/job/roguetown/grabber
- display_order = JDO_GRABBER
- min_pq = -10
- max_pq = null
-
-/datum/outfit/job/roguetown/grabber/pre_equip(mob/living/carbon/human/H)
- ..()
- if(H.mind)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE)
- if(H.gender == MALE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE)
- else
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 1, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 4, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE)
- if(H.gender == MALE)
- shoes = /obj/item/clothing/shoes/roguetown/boots/leather
- pants = /obj/item/clothing/under/roguetown/tights/sailor
- neck = /obj/item/storage/belt/rogue/pouch/coins/poor
- beltr = /obj/item/rogueweapon/mace/woodclub
- beltl = /obj/item/roguekey/shop
- belt = /obj/item/storage/belt/rogue/leather/rope
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor
- backl = /obj/item/storage/backpack/rogue/satchel
- if(prob(30))
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor/red
- if(prob(23))
- armor = /obj/item/clothing/suit/roguetown/armor/leather/vest/sailor
- H.change_stat("strength", 2)
- H.change_stat("intelligence", -3)
- H.change_stat("endurance", 3)
- H.change_stat("constitution", 2)
- else
- shoes = /obj/item/clothing/shoes/roguetown/gladiator
- pants = /obj/item/clothing/under/roguetown/tights/sailor
- beltr = /obj/item/rogueweapon/sword/cutlass
- neck = /obj/item/storage/belt/rogue/pouch/coins/poor
- beltl = /obj/item/roguekey/shop
- belt = /obj/item/storage/belt/rogue/leather/rope
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor
- if(prob(23))
- armor = /obj/item/clothing/suit/roguetown/armor/leather/vest/sailor
- if(prob(77))
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor/red
- H.change_stat("strength", 1)
- H.change_stat("perception", 2)
- H.change_stat("intelligence", -3)
- H.change_stat("endurance", 4)
- H.change_stat("speed", 3)
- H.change_stat("constitution", 1)
diff --git a/code/modules/jobs/job_types/roguetown/roguetown.dm b/code/modules/jobs/job_types/roguetown/roguetown.dm
index a8adb2dcaa1..1d6c2488ce1 100644
--- a/code/modules/jobs/job_types/roguetown/roguetown.dm
+++ b/code/modules/jobs/job_types/roguetown/roguetown.dm
@@ -97,7 +97,7 @@
return
// For magic class roundstart spell selection
-/datum/outfit/job/roguetown/proc/choose_magic(list/category, mob/living/carbon/human/H)
+/datum/outfit/job/roguetown/proc/choose_magic(list/obj/effect/proc_holder/spell/category, mob/living/carbon/human/H)
var/list/choices = list()
for(var/i = 1, i <= category.len, i++)
choices["[category[i].name]: [category[i].cost]"] = category[i]
diff --git a/code/modules/jobs/job_types/roguetown/yeomen/alchemist.dm b/code/modules/jobs/job_types/roguetown/yeomen/alchemist.dm
index edb107dc467..55f4181a505 100644
--- a/code/modules/jobs/job_types/roguetown/yeomen/alchemist.dm
+++ b/code/modules/jobs/job_types/roguetown/yeomen/alchemist.dm
@@ -41,7 +41,7 @@
backpack_contents = list(
/obj/item/reagent_containers/glass/alembic = 1,
/obj/item/storage/fancy/ifak = 1,
- /obj/item/clothing/ring/lantern = 1,
+ /obj/item/flashlight/flare/torch/lantern/ring = 1,
/obj/item/storage/box/matches = 1,
)
H.change_stat("intelligence", 3)
@@ -57,7 +57,7 @@
backpack_contents = list(
/obj/item/reagent_containers/glass/alembic = 1,
/obj/item/storage/fancy/ifak = 1,
- /obj/item/clothing/ring/lantern = 1,
+ /obj/item/flashlight/flare/torch/lantern/ring = 1,
/obj/item/storage/box/matches = 1,
)
H.change_stat("intelligence", 3) // bob I like your code work but you are a sexist prick and I hate wiping your ass of this lil subtle stab shit.
diff --git a/code/modules/jobs/job_types/roguetown/yeomen/apothecary.dm b/code/modules/jobs/job_types/roguetown/yeomen/apothecary.dm
deleted file mode 100644
index 10ae2a28f6a..00000000000
--- a/code/modules/jobs/job_types/roguetown/yeomen/apothecary.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-/datum/job/roguetown/apothecary
- title = "Apothecary"
- flag = APOTHECARY
- department_flag = YEOMEN
- faction = "Station"
- total_positions = 0
- spawn_positions = 0
-
- allowed_races = RACES_ALL_KINDSPLUS
-
- outfit = /datum/outfit/job/roguetown/apothecary
- outfit_female = /datum/outfit/job/roguetown/apothecary/female
- display_order = 6
- min_pq = -10
- max_pq = null
-
-/datum/outfit/job/roguetown/apothecary
- name = "Apothecary"
- jobtype = /datum/job/roguetown/apothecary
-
- pants = /obj/item/clothing/under/roguetown/tights
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
- armor = /obj/item/clothing/suit/roguetown/shirt/rags
- shoes = /obj/item/clothing/shoes/roguetown/boots
-
-/datum/outfit/job/roguetown/apothecary/female
- name = "Apothecary"
- jobtype = /datum/job/roguetown/apothecary
-
- pants = null
diff --git a/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm b/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm
deleted file mode 100644
index 3318608fcd5..00000000000
--- a/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm
+++ /dev/null
@@ -1,46 +0,0 @@
-/datum/job/roguetown/wapprentice
- title = "Magicians Apprentice"
- flag = MAGEAPPRENTICE
- department_flag = YOUNGFOLK
- faction = "Station"
- total_positions = 2
- spawn_positions = 2
-
- allowed_races = RACES_ALL_KINDSPLUS
- allowed_ages = list(AGE_ADULT)
-
- tutorial = "Your master once saw potential in you, something you are uncertain if they still do with your recent studies. The path to using magic is something treacherous and untamed, and you are still decades away from calling yourself even a journeyman in the field. Listen and serve, and someday you will earn your hat."
-
- outfit = /datum/outfit/job/roguetown/wapprentice
-
- display_order = JDO_MAGEAPPRENTICE
- give_bank_account = TRUE
-
- min_pq = 0
- max_pq = null
-
-/datum/outfit/job/roguetown/wapprentice/pre_equip(mob/living/carbon/human/H)
- ..()
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
- pants = /obj/item/clothing/under/roguetown/tights/random
- belt = /obj/item/storage/belt/rogue/leather/rope
- beltr = /obj/item/storage/keyring/mage
- r_hand = /obj/item/rogueweapon/woodstaff
- if(H.gender == MALE)
- shoes = /obj/item/clothing/shoes/roguetown/simpleshoes
- armor = /obj/item/clothing/suit/roguetown/armor/workervest
- backr = /obj/item/storage/backpack/rogue/satchel
- else
- shoes = /obj/item/clothing/shoes/roguetown/sandals
- armor = /obj/item/clothing/suit/roguetown/armor/workervest
- backr = /obj/item/storage/backpack/rogue/satchel
- if(H.mind)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 3, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 2, TRUE)
- H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 1, TRUE)
- H.mind.adjust_spellpoints(5)
- H.change_stat("intelligence", 2)
- H.change_stat("speed", -1)
- H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn)
diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm
index 5e5908d577d..201690428f8 100644
--- a/code/modules/jobs/jobs.dm
+++ b/code/modules/jobs/jobs.dm
@@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(noble_positions, list(
GLOBAL_LIST_INIT(courtier_positions, list(
"Magician",
"Physician",
- "Jester",
+ "Harlequin",
"Head Butler",
))
@@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(garrison_positions, list(
))
GLOBAL_LIST_INIT(church_positions, list(
- "Prophet",
+ "Archpriest",
"Wytcher Captain",
"Confessor",
"Gravesinger",
diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm
index 1794604ba7b..60b1e953a6f 100644
--- a/code/modules/keybindings/bindings_carbon.dm
+++ b/code/modules/keybindings/bindings_carbon.dm
@@ -4,4 +4,4 @@
if("B")
client.set_context_menu_enabled(1)
return ..()
-#endif
\ No newline at end of file
+#endif
diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm
index fd322b70627..0b7e493d309 100644
--- a/code/modules/language/language.dm
+++ b/code/modules/language/language.dm
@@ -11,8 +11,7 @@
var/ask_verb = "asks" // Used when sentence ends in a ?
var/exclaim_verb = "exclaims" // Used when sentence ends in a !
var/whisper_verb = "whispers" // Optional. When not specified speech_verb + quietly/softly is used instead.
- var/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags
- var/signlang = FALSE
+ var/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has SIGNLANG flag
var/key // Character used to speak in language
// If key is null, then the language isn't real or learnable.
var/flags // Various language flags.
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index 6e3f9577d4a..0fea056f545 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -142,3 +142,6 @@
/datum/language_holder/abyssal
languages = list(/datum/language/hellspeak)
+
+/datum/language_holder/celestial
+ languages = list(/datum/language/celestial)
diff --git a/code/modules/language/roguetown/beast.dm b/code/modules/language/roguetown/beast.dm
index 5ffb31cfec1..d168a2e092a 100644
--- a/code/modules/language/roguetown/beast.dm
+++ b/code/modules/language/roguetown/beast.dm
@@ -16,4 +16,4 @@
"GRrr",
"Rr",
"Rrrr",
-"Rrrrr")
\ No newline at end of file
+"Rrrrr")
diff --git a/code/modules/language/roguetown/elf.dm b/code/modules/language/roguetown/elf.dm
index 0d816ebb35f..d7cb154fd8f 100644
--- a/code/modules/language/roguetown/elf.dm
+++ b/code/modules/language/roguetown/elf.dm
@@ -163,4 +163,4 @@
"aid",
"aig",
"ile",
-"tea")
\ No newline at end of file
+"tea")
diff --git a/code/modules/language/roguetown/thievescant.dm b/code/modules/language/roguetown/thievescant.dm
index 05caccd6979..2437b7ca2ab 100644
--- a/code/modules/language/roguetown/thievescant.dm
+++ b/code/modules/language/roguetown/thievescant.dm
@@ -5,11 +5,10 @@
ask_verb = "questioningly gestures"
exclaim_verb = "angrily gestures"
key = "t"
- flags = LANGUAGE_HIDE_ICON_IF_UNDERSTOOD | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | SIGNLANG | NO_STUTTER
+ flags = LANGUAGE_HIDE_ICON_IF_UNDERSTOOD | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | SIGNLANG | LANGUAGE_HIDE_NOT_UNDERSTOOD | NO_STUTTER
space_chance = 66
default_priority = 80
icon_state = "asse"
- signlang = TRUE
signlang_verb = list(
"scrunches their nose",
"smiles",
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
deleted file mode 100644
index e1e98b7cc20..00000000000
--- a/code/modules/library/lib_machines.dm
+++ /dev/null
@@ -1,597 +0,0 @@
-/* Library Machines
- *
- * Contains:
- * Borrowbook datum
- * Library Public Computer
- * Cachedbook datum
- * Library Computer
- * Library Scanner
- * Book Binder
- */
-
-
-
-/*
- * Library Public Computer
- */
-/obj/machinery/computer/libraryconsole
- name = "library visitor console"
- icon_state = "oldcomp"
- icon_screen = "library"
- icon_keyboard = null
- circuit = /obj/item/circuitboard/computer/libraryconsole
- desc = ""
- var/screenstate = 0
- var/title
- var/category = "Any"
- var/author
- var/SQLquery
-
-/obj/machinery/computer/libraryconsole/ui_interact(mob/user)
- . = ..()
- var/dat = "" //
- switch(screenstate)
- if(0)
- dat += "Search Settings
"
- dat += "Filter by Title: [title]
"
- dat += "Filter by Category: [category]
"
- dat += "Filter by Author: [author]
"
- dat += "\[Start Search\]
"
- if(1)
- if (!SSdbcore.Connect())
- dat += "ERROR: Unable to contact External Archive. Please contact my system administrator for assistance.
"
- else if(QDELETED(user))
- return
- else if(!SQLquery)
- dat += "ERROR: Malformed search request. Please contact my system administrator for assistance.
"
- else
- dat += ""
- dat += "| AUTHOR | TITLE | CATEGORY | SS13BN |
"
-
- var/datum/DBQuery/query_library_list_books = SSdbcore.NewQuery(SQLquery)
- if(!query_library_list_books.Execute())
- dat += "ERROR: Unable to retrieve book listings. Please contact my system administrator for assistance.
"
- else
- while(query_library_list_books.NextRow())
- var/author = query_library_list_books.item[1]
- var/title = query_library_list_books.item[2]
- var/category = query_library_list_books.item[3]
- var/id = query_library_list_books.item[4]
- dat += "| [author] | [title] | [category] | [id] |
"
- qdel(query_library_list_books)
- if(QDELETED(user))
- return
- dat += "
"
- dat += "\[Go Back\]
"
- var/datum/browser/popup = new(user, "publiclibrary", name, 600, 400)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
-
-/obj/machinery/computer/libraryconsole/Topic(href, href_list)
- . = ..()
- if(..())
- usr << browse(null, "window=publiclibrary")
- onclose(usr, "publiclibrary")
- return
-
- if(href_list["settitle"])
- var/newtitle = input("Enter a title to search for:") as text|null
- if(newtitle)
- title = sanitize(newtitle)
- else
- title = null
- title = sanitizeSQL(title)
- if(href_list["setcategory"])
- var/newcategory = input("Choose a category to search for:") in list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion")
- if(newcategory)
- category = sanitize(newcategory)
- else
- category = "Any"
- category = sanitizeSQL(category)
- if(href_list["setauthor"])
- var/newauthor = input("Enter an author to search for:") as text|null
- if(newauthor)
- author = sanitize(newauthor)
- else
- author = null
- author = sanitizeSQL(author)
- if(href_list["search"])
- SQLquery = "SELECT author, title, category, id FROM [format_table_name("library")] WHERE isnull(deleted) AND "
- if(category == "Any")
- SQLquery += "author LIKE '%[author]%' AND title LIKE '%[title]%'"
- else
- SQLquery += "author LIKE '%[author]%' AND title LIKE '%[title]%' AND category='[category]'"
- screenstate = 1
-
- if(href_list["back"])
- screenstate = 0
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
-
-/*
- * Borrowbook datum
- */
-/datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long.
- var/bookname
- var/mobname
- var/getdate
- var/duedate
-
-/*
- * Cachedbook datum
- */
-/datum/cachedbook // Datum used to cache the SQL DB books locally in order to achieve a performance gain.
- var/id
- var/title
- var/author
- var/category
-
-GLOBAL_LIST(cachedbooks) // List of our cached book datums
-
-
-/proc/load_library_db_to_cache()
- if(GLOB.cachedbooks)
- return
- if(!SSdbcore.Connect())
- return
- GLOB.cachedbooks = list()
- var/datum/DBQuery/query_library_cache = SSdbcore.NewQuery("SELECT id, author, title, category FROM [format_table_name("library")] WHERE isnull(deleted)")
- if(!query_library_cache.Execute())
- qdel(query_library_cache)
- return
- while(query_library_cache.NextRow())
- var/datum/cachedbook/newbook = new()
- newbook.id = query_library_cache.item[1]
- newbook.author = query_library_cache.item[2]
- newbook.title = query_library_cache.item[3]
- newbook.category = query_library_cache.item[4]
- GLOB.cachedbooks += newbook
- qdel(query_library_cache)
-
-
-
-#define PRINTER_COOLDOWN 60
-
-/*
- * Library Computer
- * After 860 days, it's finally a buildable computer.
- */
-// TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such
-// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it.
-// It's December 25th, 2014, and this is STILL here, and it's STILL relevant. Kill me
-/obj/machinery/computer/libraryconsole/bookmanagement
- name = "book inventory management console"
- desc = ""
- screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
- verb_say = "beeps"
- verb_ask = "beeps"
- verb_exclaim = "beeps"
- pass_flags = PASSTABLE
- var/arcanecheckout = 0
- var/buffer_book
- var/buffer_mob
- var/upload_category = "Fiction"
- var/list/checkouts = list()
- var/list/inventory = list()
- var/checkoutperiod = 5 // In minutes
- var/obj/machinery/libraryscanner/scanner // Book scanner that will be used when uploading books to the Archive
- var/list/libcomp_menu
- var/page = 1 //current page of the external archives
- var/cooldown = 0
-
-/obj/machinery/computer/libraryconsole/bookmanagement/proc/build_library_menu()
- if(libcomp_menu)
- return
- load_library_db_to_cache()
- if(!GLOB.cachedbooks)
- return
- libcomp_menu = list("")
-
- for(var/i in 1 to GLOB.cachedbooks.len)
- var/datum/cachedbook/C = GLOB.cachedbooks[i]
- var/page = round(i/250)+1
- if (libcomp_menu.len < page)
- libcomp_menu.len = page
- libcomp_menu[page] = ""
- libcomp_menu[page] += "| [C.author] | [C.title] | [C.category] | \[Order\] |
\n"
-
-/obj/machinery/computer/libraryconsole/bookmanagement/Initialize()
- . = ..()
- if(circuit)
- circuit.name = "Book Inventory Management Console (Machine Board)"
- circuit.build_path = /obj/machinery/computer/libraryconsole/bookmanagement
-
-/obj/machinery/computer/libraryconsole/bookmanagement/ui_interact(mob/user)
- . = ..()
- var/dat = "" //
- switch(screenstate)
- if(0)
- // Main Menu
- dat += "1. View General Inventory
"
- dat += "2. View Checked Out Inventory
"
- dat += "3. Check out a Book
"
- dat += "4. Connect to External Archive
"
- dat += "5. Upload New Title to Archive
"
- dat += "6. Upload Scanned Title to Newscaster
"
- dat += "7. Print Corporate Materials
"
- if(obj_flags & EMAGGED)
- dat += "8. Access the Forbidden Lore Vault
"
- if(src.arcanecheckout)
- print_forbidden_lore(user)
- src.arcanecheckout = 0
- if(1)
- // Inventory
- dat += "Inventory
"
- for(var/obj/item/book/b in inventory)
- dat += "[b.name] (Delete)
"
- dat += "(Return to main menu)
"
- if(2)
- // Checked Out
- dat += "Checked Out Books
"
- for(var/datum/borrowbook/b in checkouts)
- var/timetaken = world.time - b.getdate
- timetaken /= 600
- timetaken = round(timetaken)
- var/timedue = b.duedate - world.time
- timedue /= 600
- if(timedue <= 0)
- timedue = "(OVERDUE) [timedue]"
- else
- timedue = round(timedue)
- dat += "\"[b.bookname]\", Checked out to: [b.mobname]
--- Taken: [timetaken] minutes ago, Due: in [timedue] minutes
"
- dat += "(Check In)
"
- dat += "(Return to main menu)
"
- if(3)
- // Check Out a Book
- dat += "Check Out a Book
"
- dat += "Book: [src.buffer_book] "
- dat += "\[Edit\]
"
- dat += "Recipient: [src.buffer_mob] "
- dat += "\[Edit\]
"
- dat += "Checkout Date : [world.time/600]
"
- dat += "Due Date: [(world.time + checkoutperiod)/600]
"
- dat += "(Checkout Period: [checkoutperiod] minutes) (+/-)"
- dat += "(Commit Entry)
"
- dat += "(Return to main menu)
"
- if(4)
- dat += "External Archive
"
- build_library_menu()
-
- if(!GLOB.cachedbooks)
- dat += "ERROR: Unable to contact External Archive. Please contact my system administrator for assistance."
- else
- dat += "(Order book by SS13BN)
"
- dat += ""
- dat += "| AUTHOR | TITLE | CATEGORY | |
"
- dat += libcomp_menu[CLAMP(page,1,libcomp_menu.len)]
- dat += "| <<<< | | | >>>> |
"
- dat += "
"
- dat += "
(Return to main menu)
"
- if(5)
- dat += "Upload a New Title
"
- if(!scanner)
- scanner = findscanner(9)
- if(!scanner)
- dat += "No scanner found within wireless network range.
"
- else if(!scanner.cache)
- dat += "No data found in scanner memory.
"
- else
- dat += "Data marked for upload...
"
- dat += "Title: [scanner.cache.name]
"
- if(!scanner.cache.author)
- scanner.cache.author = "Anonymous"
- dat += "Author: [scanner.cache.author]
"
- dat += "Category: [upload_category]
"
- dat += "\[Upload\]
"
- dat += "(Return to main menu)
"
- if(6)
- dat += "Post Title to Newscaster
"
- if(!scanner)
- scanner = findscanner(9)
- if(!scanner)
- dat += "No scanner found within wireless network range.
"
- else if(!scanner.cache)
- dat += "No data found in scanner memory.
"
- else
- dat += "Post [scanner.cache.name] to station newscasters?"
- dat += "\[Post\]
"
- dat += "(Return to main menu)
"
- if(7)
- dat += "NTGanda(tm) Universal Printing Module
"
- dat += "What would you like to print?
"
- dat += "\[Bible\]
"
- dat += "\[Poster\]
"
- dat += "(Return to main menu)
"
- if(8)
- dat += "Accessing Forbidden Lore Vault v 1.3
"
- dat += "Are you absolutely sure you want to proceed? EldritchRelics Inc. takes no responsibilities for loss of sanity resulting from this action."
- dat += "Yes.
"
- dat += "No.
"
-
- var/datum/browser/popup = new(user, "library", name, 600, 400)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
-
-/obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange)
- for(var/obj/machinery/libraryscanner/S in range(viewrange, get_turf(src)))
- return S
- return null
-
-/obj/machinery/computer/libraryconsole/bookmanagement/proc/print_forbidden_lore(mob/user)
- new /obj/item/melee/cultblade/dagger(get_turf(src))
- to_chat(user, span_warning("My sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a sinister dagger sitting on the desk. You don't even remember where it came from..."))
- user.visible_message(span_warning("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older."), 2)
-
-/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/barcodescanner))
- var/obj/item/barcodescanner/scanner = W
- scanner.computer = src
- to_chat(user, span_notice("[scanner]'s associated machine has been set to [src]."))
- audible_message(span_hear("[src] lets out a low, short blip."))
- else
- return ..()
-
-/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user)
- if(density && !(obj_flags & EMAGGED))
- obj_flags |= EMAGGED
-
-/obj/machinery/computer/libraryconsole/bookmanagement/Topic(href, href_list)
- if(..())
- usr << browse(null, "window=library")
- onclose(usr, "library")
- return
- if(href_list["page"] && screenstate == 4)
- page = text2num(href_list["page"])
- if(href_list["switchscreen"])
- switch(href_list["switchscreen"])
- if("0")
- screenstate = 0
- if("1")
- screenstate = 1
- if("2")
- screenstate = 2
- if("3")
- screenstate = 3
- if("4")
- screenstate = 4
- if("5")
- screenstate = 5
- if("6")
- screenstate = 6
- if("7")
- screenstate = 7
- if("8")
- screenstate = 8
- if(href_list["arccheckout"])
- if(obj_flags & EMAGGED)
- src.arcanecheckout = 1
- src.screenstate = 0
- if(href_list["increasetime"])
- checkoutperiod += 1
- if(href_list["decreasetime"])
- checkoutperiod -= 1
- if(checkoutperiod < 1)
- checkoutperiod = 1
- if(href_list["editbook"])
- buffer_book = copytext(sanitize(input("Enter the book's title:") as text|null),1,MAX_MESSAGE_LEN)
- if(href_list["editmob"])
- buffer_mob = copytext(sanitize(input("Enter the recipient's name:") as text|null),1,MAX_NAME_LEN)
- if(href_list["checkout"])
- var/datum/borrowbook/b = new /datum/borrowbook
- b.bookname = sanitize(buffer_book)
- b.mobname = sanitize(buffer_mob)
- b.getdate = world.time
- b.duedate = world.time + (checkoutperiod * 600)
- checkouts.Add(b)
- if(href_list["checkin"])
- var/datum/borrowbook/b = locate(href_list["checkin"]) in checkouts
- if(b && istype(b))
- checkouts.Remove(b)
- if(href_list["delbook"])
- var/obj/item/book/b = locate(href_list["delbook"]) in inventory
- if(b && istype(b))
- inventory.Remove(b)
- if(href_list["setauthor"])
- var/newauthor = copytext(sanitize(input("Enter the author's name: ") as text|null),1,MAX_MESSAGE_LEN)
- if(newauthor)
- scanner.cache.author = newauthor
- if(href_list["setcategory"])
- var/newcategory = input("Choose a category: ") in list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion","Technical")
- if(newcategory)
- upload_category = newcategory
- if(href_list["upload"])
- if(scanner)
- if(scanner.cache)
- var/choice = input("Are you certain you wish to upload this title to the Archive?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if (!SSdbcore.Connect())
- alert("Connection to Archive has been severed. Aborting.")
- else
-
- var/sqltitle = sanitizeSQL(scanner.cache.name)
- var/sqlauthor = sanitizeSQL(scanner.cache.author)
- var/sqlcontent = sanitizeSQL(scanner.cache.dat)
- var/sqlcategory = sanitizeSQL(upload_category)
- var/sqlckey = sanitizeSQL(usr.ckey)
- var/msg = "[key_name(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs"
- var/datum/DBQuery/query_library_upload = SSdbcore.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, datetime, round_id_created) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[sqlckey]', Now(), '[GLOB.round_id]')")
- if(!query_library_upload.Execute())
- qdel(query_library_upload)
- alert("Database error encountered uploading to Archive")
- return
- else
- log_game(msg)
- qdel(query_library_upload)
- alert("Upload Complete. Uploaded title will be unavailable for printing for a short period")
- if(href_list["newspost"])
- if(!GLOB.news_network)
- alert("No news network found on station. Aborting.")
- var/channelexists = 0
- for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
- if(FC.channel_name == "Nanotrasen Book Club")
- channelexists = 1
- break
- if(!channelexists)
- GLOB.news_network.CreateFeedChannel("Nanotrasen Book Club", "Library", null)
- GLOB.news_network.SubmitArticle(scanner.cache.dat, "[scanner.cache.name]", "Nanotrasen Book Club", null)
- alert("Upload complete. Your uploaded title is now available on station newscasters.")
- if(href_list["orderbyid"])
- if(cooldown > world.time)
- say("Printer unavailable. Please allow a short time before attempting to print.")
- else
- var/orderid = input("Enter my order:") as num|null
- if(orderid)
- if(isnum(orderid) && ISINTEGER(orderid))
- href_list["targetid"] = num2text(orderid)
-
- if(href_list["targetid"])
- var/sqlid = sanitizeSQL(href_list["targetid"])
- if (!SSdbcore.Connect())
- alert("Connection to Archive has been severed. Aborting.")
- if(cooldown > world.time)
- say("Printer unavailable. Please allow a short time before attempting to print.")
- else
- cooldown = world.time + PRINTER_COOLDOWN
- var/datum/DBQuery/query_library_print = SSdbcore.NewQuery("SELECT * FROM [format_table_name("library")] WHERE id=[sqlid] AND isnull(deleted)")
- if(!query_library_print.Execute())
- qdel(query_library_print)
- say("PRINTER ERROR! Failed to print document (0x0000000F)")
- return
- while(query_library_print.NextRow())
- var/author = query_library_print.item[2]
- var/title = query_library_print.item[3]
- var/content = query_library_print.item[4]
- if(!QDELETED(src))
- var/obj/item/book/B = new(get_turf(src))
- B.name = "Book: [title]"
- B.title = title
- B.author = author
- B.dat = content
- B.icon_state = "book[rand(1,8)]"
- visible_message(span_notice("[src]'s printer hums as it produces a completely bound book. How did it do that?"))
- break
- qdel(query_library_print)
- if(href_list["printbible"])
- if(cooldown < world.time)
- var/obj/item/storage/book/bible/B = new /obj/item/storage/book/bible(src.loc)
- if(GLOB.bible_icon_state && GLOB.bible_item_state)
- B.icon_state = GLOB.bible_icon_state
- B.item_state = GLOB.bible_item_state
- B.name = GLOB.bible_name
- B.deity_name = GLOB.deity
- cooldown = world.time + PRINTER_COOLDOWN
- else
- say("Printer currently unavailable, please wait a moment.")
- if(href_list["printposter"])
- if(cooldown < world.time)
- new /obj/item/poster/random_official(src.loc)
- cooldown = world.time + PRINTER_COOLDOWN
- else
- say("Printer currently unavailable, please wait a moment.")
- add_fingerprint(usr)
- updateUsrDialog()
-
-/*
- * Library Scanner
- */
-/obj/machinery/libraryscanner
- name = "scanner control interface"
- icon = 'icons/obj/library.dmi'
- icon_state = "bigscanner"
- desc = ""
- density = TRUE
- var/obj/item/book/cache // Last scanned book
-
-/obj/machinery/libraryscanner/attackby(obj/O, mob/user, params)
- if(istype(O, /obj/item/book))
- if(!user.transferItemToLoc(O, src))
- return
- else
- return ..()
-
-/obj/machinery/libraryscanner/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- usr.set_machine(src)
- var/dat = "" //
- if(cache)
- dat += "Data stored in memory.
"
- else
- dat += "No data stored in memory.
"
- dat += "\[Scan\]"
- if(cache)
- dat += " \[Clear Memory\]
\[Remove Book\]"
- else
- dat += "
"
- var/datum/browser/popup = new(user, "scanner", name, 600, 400)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
-
-/obj/machinery/libraryscanner/Topic(href, href_list)
- if(..())
- usr << browse(null, "window=scanner")
- onclose(usr, "scanner")
- return
-
- if(href_list["scan"])
- for(var/obj/item/book/B in contents)
- cache = B
- break
- if(href_list["clear"])
- cache = null
- if(href_list["eject"])
- for(var/obj/item/book/B in contents)
- B.forceMove(drop_location())
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
-
-
-/*
- * Book binder
- */
-/obj/machinery/bookbinder
- name = "book binder"
- icon = 'icons/obj/library.dmi'
- icon_state = "binder"
- desc = ""
- density = TRUE
- var/busy = FALSE
-
-/obj/machinery/bookbinder/attackby(obj/O, mob/user, params)
- if(istype(O, /obj/item/paper))
- bind_book(user, O)
- else if(default_unfasten_wrench(user, O))
- return 1
- else
- return ..()
-
-/obj/machinery/bookbinder/proc/bind_book(mob/user, obj/item/paper/P)
- if(stat)
- return
- if(busy)
- to_chat(user, span_warning("The book binder is busy. Please wait for completion of previous operation."))
- return
- if(!user.transferItemToLoc(P, src))
- return
- user.visible_message(span_notice("[user] loads some paper into [src]."), span_notice("I load some paper into [src]."))
- audible_message(span_hear("[src] begins to hum as it warms up its printing drums."))
- busy = TRUE
- sleep(rand(200,400))
- busy = FALSE
- if(P)
- if(!stat)
- visible_message(span_notice("[src] whirs as it prints and binds a new book."))
- var/obj/item/book/B = new(src.loc)
- B.dat = P.info
- B.name = "Print Job #" + "[rand(100, 999)]"
- B.icon_state = "book[rand(1,7)]"
- qdel(P)
- else
- P.forceMove(drop_location())
diff --git a/code/modules/lighting/lighting_emissive_blocker.dm b/code/modules/lighting/lighting_emissive_blocker.dm
deleted file mode 100644
index b2102dea8b0..00000000000
--- a/code/modules/lighting/lighting_emissive_blocker.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Internal atom that copies an appearance on to the blocker plane
- *
- * This means that the atom in question will block any emissive sprites.
- * This should only be used internally. If you are directly creating more of these,
- * you're almost guaranteed to be doing something wrong.
- */
-/atom/movable/emissive_blocker
- name = "emissive blocker"
- plane = EMISSIVE_PLANE
- layer = FLOAT_LAYER
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- appearance_flags = EMISSIVE_APPEARANCE_FLAGS
-
-/atom/movable/emissive_blocker/Initialize(mapload, source)
- . = ..()
- verbs.Cut() //Cargo culting from lighting object, this maybe affects memory usage?
-
- render_source = source
- color = EM_BLOCK_COLOR
-
-/atom/movable/emissive_blocker/ex_act(severity)
- return FALSE
-
-/atom/movable/emissive_blocker/singularity_act()
- return
-
-/atom/movable/emissive_blocker/singularity_pull()
- return
-
-/atom/movable/emissive_blocker/blob_act()
- return
-
-/atom/movable/emissive_blocker/onTransitZ()
- return
-
-//Prevents people from moving these after creation, because they shouldn't be.
-/atom/movable/emissive_blocker/forceMove(atom/destination, no_tp = FALSE, harderforce = FALSE)
- if(harderforce)
- return ..()
diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm
index 02dbd898300..aee778a98af 100644
--- a/code/modules/mapping/ruins.dm
+++ b/code/modules/mapping/ruins.dm
@@ -111,7 +111,7 @@
for(var/v in current_pick.always_spawn_with)
if(current_pick.always_spawn_with[v] == PLACE_BELOW)
var/turf/T = locate(1,1,target_z)
- if(!SSmapping.get_turf_below(T))
+ if(!GET_TURF_BELOW(T))
if(forced_z)
continue outer
else
@@ -161,7 +161,7 @@
if(PLACE_DEFAULT)
forced_ruins[linked] = -1
if(PLACE_BELOW)
- forced_ruins[linked] = SSmapping.get_turf_below(placed_turf)
+ forced_ruins[linked] = GET_TURF_BELOW(placed_turf)
if(PLACE_ISOLATED)
forced_ruins[linked] = SSmapping.get_isolated_ruin_z()
diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm
index aef3e0ed7d3..2c7a8114618 100644
--- a/code/modules/mapping/space_management/multiz_helpers.dm
+++ b/code/modules/mapping/space_management/multiz_helpers.dm
@@ -1,33 +1,46 @@
/proc/get_step_multiz(ref, dir)
if(dir & UP)
dir &= ~UP
- return get_step(SSmapping.get_turf_above(get_turf(ref)), dir)
+ return get_step(GET_TURF_ABOVE(get_turf(ref)), dir)
if(dir & DOWN)
dir &= ~DOWN
- return get_step(SSmapping.get_turf_below(get_turf(ref)), dir)
+ return get_step(GET_TURF_BELOW(get_turf(ref)), dir)
return get_step(ref, dir)
+/proc/get_multiz_accessible_levels(center_z)
+ . = list(center_z)
+ var/other_z = center_z
+ var/offset
+ while((offset = SSmapping.multiz_levels[other_z]["[DOWN]"]))
+ other_z -= offset
+ if(other_z in .)
+ break // no infinite loops
+ . += other_z
+ other_z = center_z
+ while((offset = SSmapping.multiz_levels[other_z]["[UP]"]))
+ other_z += offset
+ if(other_z in .)
+ break // no infinite loops
+ . += other_z
+
+/// A cache of stringified z-level zweb checks.
+/// GLOB.zweb_cache[num2text(my_z)][num2text(compare_z)] = TRUE/FALSE
+GLOBAL_LIST_EMPTY(zweb_cache)
/proc/is_in_zweb(my_z, compare_z)
if(!my_z || !compare_z)
return FALSE
if(my_z == compare_z)
return TRUE
- if(my_z > compare_z)
- for(var/i in my_z to compare_z)
- if(!i || i<0)
- return FALSE
- if(i == compare_z)
- return TRUE
- if(!SSmapping.level_trait(i, ZTRAIT_DOWN))
- return FALSE
- if(my_z < compare_z)
- for(var/i in my_z to compare_z)
- if(!i || i<0)
- return FALSE
- if(i == compare_z)
- return TRUE
- if(!SSmapping.level_trait(i, ZTRAIT_UP))
- return FALSE
+ var/my_text = num2text(my_z)
+ var/comp_text = num2text(compare_z)
+ if(isnull(GLOB.zweb_cache[my_text]?[comp_text]))
+ LAZYINITLIST(GLOB.zweb_cache[my_text])
+ for(var/zlevel in get_multiz_accessible_levels(my_z))
+ var/ztext = num2text(zlevel)
+ GLOB.zweb_cache[my_text][ztext] = TRUE
+ LAZYINITLIST(GLOB.zweb_cache[ztext])
+ LAZYADD(GLOB.zweb_cache[ztext], my_text)
+ return GLOB.zweb_cache[my_text][comp_text]
/proc/get_dir_multiz(turf/us, turf/them)
us = get_turf(us)
@@ -37,24 +50,18 @@
if(us.z == them.z)
return get_dir(us, them)
else
- var/turf/T = us.above()
+ var/turf/T = GET_TURF_ABOVE(us)
var/dir = NONE
if(T && (T.z == them.z))
dir = UP
else
- T = us.below()
+ T = GET_TURF_BELOW(us)
if(T && (T.z == them.z))
dir = DOWN
else
return get_dir(us, them)
return (dir | get_dir(us, them))
-/turf/proc/above()
- return get_step_multiz(src, UP)
-
-/turf/proc/below()
- return get_step_multiz(src, DOWN)
-
/proc/dir_inverse_multiz(dir)
var/holder = dir & (UP|DOWN)
if((holder == NONE) || (holder == (UP|DOWN)))
diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm
index 9ba8d96d5e1..967a274732a 100644
--- a/code/modules/mapping/space_management/traits.dm
+++ b/code/modules/mapping/space_management/traits.dm
@@ -51,18 +51,18 @@
// Attempt to get the turf below the provided one according to Z traits
/datum/controller/subsystem/mapping/proc/get_turf_below(turf/T)
- if (!T)
+ if (!T || !initialized)
return
- var/offset = level_trait(T.z, ZTRAIT_DOWN)
+ var/offset = multiz_levels[T.z]["[DOWN]"]
if (!offset)
return
- return locate(T.x, T.y, T.z + offset)
+ return locate(T.x, T.y, T.z - offset)
// Attempt to get the turf above the provided one according to Z traits
/datum/controller/subsystem/mapping/proc/get_turf_above(turf/T)
- if (!T)
+ if (!T || !initialized)
return
- var/offset = level_trait(T.z, ZTRAIT_UP)
+ var/offset = multiz_levels[T.z]["[UP]"]
if (!offset)
return
return locate(T.x, T.y, T.z + offset)
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index ab14a63fb27..0a5fe22edb2 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -202,27 +202,27 @@
name = "Select Airlock Type"
button_icon_state = "airlock_select"
-datum/action/innate/aux_base/airlock_type/Activate()
+/datum/action/innate/aux_base/airlock_type/Activate()
if(..())
return
B.RCD.change_airlock_setting()
-datum/action/innate/aux_base/window_type
+/datum/action/innate/aux_base/window_type
name = "Select Window Type"
button_icon_state = "window_select"
-datum/action/innate/aux_base/window_type/Activate()
+/datum/action/innate/aux_base/window_type/Activate()
if(..())
return
B.RCD.toggle_window_type()
-datum/action/innate/aux_base/place_fan
+/datum/action/innate/aux_base/place_fan
name = "Place Tiny Fan"
button_icon_state = "build_fan"
-datum/action/innate/aux_base/place_fan/Activate()
+/datum/action/innate/aux_base/place_fan/Activate()
if(..())
return
@@ -244,11 +244,11 @@ datum/action/innate/aux_base/place_fan/Activate()
to_chat(owner, span_notice("Tiny fan placed. [B.fans_remaining] remaining."))
playsound(fan_turf, 'sound/blank.ogg', 50, TRUE)
-datum/action/innate/aux_base/install_turret
+/datum/action/innate/aux_base/install_turret
name = "Install Plasma Anti-Wildlife Turret"
button_icon_state = "build_turret"
-datum/action/innate/aux_base/install_turret/Activate()
+/datum/action/innate/aux_base/install_turret/Activate()
if(..())
return
diff --git a/code/modules/mining/equipment/vendor_items.dm b/code/modules/mining/equipment/vendor_items.dm
deleted file mode 100644
index f4e57ab5b9d..00000000000
--- a/code/modules/mining/equipment/vendor_items.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/**********************Mining Equipment Vendor Items**************************/
-//misc stuff you can buy from the vendor that has special code but doesn't really need its own file
-
-/**********************Facehugger toy**********************/
-/obj/item/clothing/mask/facehugger/toy
- item_state = "facehugger_inactive"
- desc = ""
- throwforce = 0
- real = 0
- sterile = 1
- tint = 3 //Makes it feel more authentic when it latches on
-
-/obj/item/clothing/mask/facehugger/toy/Die()
- return
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 25dc8388a97..3b17193169f 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -756,7 +756,6 @@
// var/loot = rand(1,7)
var/list/loot = list(/obj/item/book/granter/trait/defense/heavyarmor=35,
/obj/item/book/granter/trait/defense/mediumarmor=12,
- /obj/item/book/granter/trait/war/undying=8,
/obj/item/riddleofsteel = 45)
if(prob(50))
var/I = pickweight(loot)
@@ -1561,13 +1560,11 @@
/obj/structure/closet/crate/necropolis/sif/PopulateContents()
var/list/loot = list(/obj/item/rogueweapon/sword/sword_of_the_forsaken=40,
/obj/item/clothing/neck/roguetown/necklace_of_the_forsaken=40,
- /obj/item/book/granter/trait/war/relentless=10,
/obj/item/book/granter/spell/spells5e/frostbite5e = 40,
/obj/item/book/granter/spell/spells5e/createbonfire5e = 30,
/obj/item/book/granter/spell/spells5e/acidsplash5e = 40,)
var/list/loot2 = list(/obj/item/rogueweapon/sword/sword_of_the_forsaken=20,
/obj/item/clothing/neck/roguetown/necklace_of_the_forsaken=20,
- /obj/item/book/granter/trait/war/relentless=5,
/obj/item/book/granter/spell/spells5e/frostbite5e = 20,
/obj/item/book/granter/spell/spells5e/createbonfire5e = 15,
/obj/item/book/granter/spell/spells5e/acidsplash5e = 20,
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 603bb64ea52..f894f794816 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -18,7 +18,6 @@
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
- new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm
index 39954ee1d69..215617952ba 100644
--- a/code/modules/mob/camera/camera.dm
+++ b/code/modules/mob/camera/camera.dm
@@ -23,5 +23,5 @@
/mob/camera/canUseStorage()
return FALSE
-/mob/camera/emote(act, m_type = null, message = null, intentional = FALSE, forced = FALSE, targetted = FALSE)
+/mob/camera/emote(act, m_type = null, message = null, intentional = FALSE, forced = FALSE, targetted = FALSE, custom_me = FALSE)
return
diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm
index 1950304f9ba..5c307021fae 100644
--- a/code/modules/mob/dead/dead.dm
+++ b/code/modules/mob/dead/dead.dm
@@ -8,6 +8,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
throwforce = 0
/mob/dead/Initialize()
+ SHOULD_CALL_PARENT(FALSE)
if(flags_1 & INITIALIZED_1)
stack_trace("Warning: [src]([type]) initialized multiple times!")
flags_1 |= INITIALIZED_1
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 8f010813500..a36a0d604ef 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -559,7 +559,7 @@ GLOBAL_LIST_INIT(roleplay_readme, world.file2list("strings/rt/rp_prompt.txt"))
SSquirks.AssignQuirks(humanc, humanc.client, TRUE)
if(humanc)
var/fakekey = character.ckey
- if(ckey in GLOB.anonymize)
+ if(character.ckey in GLOB.anonymize)
fakekey = get_fake_key(character.ckey)
GLOB.character_list[character.mobid] = "[fakekey] was [character.real_name] ([rank])
"
GLOB.character_ckey_list[character.real_name] = character.ckey
diff --git a/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm b/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm
index 39c56bf0ce7..4c09bb3eaf8 100644
--- a/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm
@@ -193,7 +193,7 @@
/datum/sprite_accessory/proc/get_icon_state(obj/item/organ/organ, obj/item/bodypart/bodypart, mob/living/carbon/owner)
return icon_state
-/datum/sprite_accessory/proc/get_default_colors(var/key_source_list)
+/datum/sprite_accessory/proc/get_default_colors(key_source_list)
var/list/color_list = list()
for(var/i in 1 to color_keys)
var/color
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index 3edd8e3427e..5eb20b8dfa8 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -11,4 +11,4 @@
/mob/proc/death(gibbed)
SEND_SIGNAL(src, COMSIG_MOB_DEATH, gibbed)
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_DEATH, src , gibbed)
\ No newline at end of file
+ SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_DEATH, src , gibbed)
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index e75f767d6d5..94f85c6d92d 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -287,8 +287,8 @@
/mob/proc/dropItemToGround(obj/item/I, force = FALSE, silent = TRUE)
. = doUnEquip(I, force, drop_location(), FALSE, silent = silent)
if(. && I) //ensure the item exists and that it was dropped properly.
- I.pixel_x = initial(I.pixel_x) += rand(-6,6)
- I.pixel_y = initial(I.pixel_x) += rand(-6,6)
+ I.pixel_x = initial(I.pixel_x) + rand(-6,6)
+ I.pixel_y = initial(I.pixel_x) + rand(-6,6)
//for when the item will be immediately placed in a loc other than the ground
/mob/proc/transferItemToLoc(obj/item/I, newloc = null, force = FALSE, silent = TRUE)
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index 914a2e22720..ab2a10bc3bf 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -93,12 +93,7 @@
/mob/living/proc/bloodcrawl_consume(mob/living/victim)
to_chat(src, span_danger("I begin to feast on [victim]... You can not move while you are doing this."))
- var/sound
- if(istype(src, /mob/living/simple_animal/slaughter))
- var/mob/living/simple_animal/slaughter/SD = src
- sound = SD.feast_sound
- else
- sound = 'sound/blank.ogg'
+ var/sound = 'sound/blank.ogg'
for(var/i in 1 to 3)
playsound(get_turf(src),sound, 50, TRUE)
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index ffbc50e9560..7d131d122b0 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -43,7 +43,7 @@
to_chat(user, span_warning("There's already a brain in the MMI!"))
return
if(!newbrain.brainmob)
- to_chat(user, span_warning("I aren't sure where this brain came from, but you're pretty sure it's a useless brain!"))
+ to_chat(user, span_warning("I'm not sure where this brain came from, but you're pretty sure it's a useless brain!"))
return
if(!user.transferItemToLoc(O, src))
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
deleted file mode 100644
index a519b575e68..00000000000
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ /dev/null
@@ -1,150 +0,0 @@
-/mob/living/carbon/alien
- name = "alien"
- icon = 'icons/mob/alien.dmi'
- gender = FEMALE //All xenos are girls!!
- dna = null
- faction = list(ROLE_ALIEN)
- ventcrawler = VENTCRAWLER_ALWAYS
- sight = SEE_MOBS
- see_in_dark = 4
- verb_say = "hisses"
- initial_language_holder = /datum/language_holder/alien
- bubble_icon = "alien"
- type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
-
- var/obj/item/card/id/wear_ring = null // Fix for station bounced radios -- Skie
- var/has_fine_manipulation = 0
- var/move_delay_add = 0 // movement delay to add
-
- status_flags = CANUNCONSCIOUS|CANPUSH
-
- var/heat_protection = 0.5
- var/leaping = 0
- gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs
- unique_name = 1
-
- var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?")
-
-/mob/living/carbon/alien/Initialize()
- verbs += /mob/living/proc/mob_sleep
- verbs += /mob/living/proc/lay_down
-
- create_bodyparts() //initialize bodyparts
-
- create_internal_organs()
-
- . = ..()
-
-/mob/living/carbon/alien/create_internal_organs()
- internal_organs += new /obj/item/organ/brain/alien
- internal_organs += new /obj/item/organ/alien/hivenode
- internal_organs += new /obj/item/organ/tongue/alien
- internal_organs += new /obj/item/organ/eyes/night_vision/alien
- internal_organs += new /obj/item/organ/liver/alien
- internal_organs += new /obj/item/organ/ears
- ..()
-
-/mob/living/carbon/alien/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums
- return -10
-
-/mob/living/carbon/alien/handle_environment(datum/gas_mixture/environment)
- if(!environment)
- return
-
- var/loc_temp = get_temperature(environment)
-
- // Aliens are now weak to fire.
-
- //After then, it reacts to the surrounding atmosphere based on your thermal protection
- if(!on_fire) // If you're on fire, ignore local air temperature
- if(loc_temp > bodytemperature)
- //Place is hotter than we are
- var/thermal_protection = heat_protection //This returns a 0 - 1 value, which corresponds to the percentage of heat protection.
- if(thermal_protection < 1)
- adjust_bodytemperature((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR))
- else
- adjust_bodytemperature(1 * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR))
-
- if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT)
- //Body temperature is too hot.
- throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire)
- switch(bodytemperature)
- if(360 to 400)
- apply_damage(HEAT_DAMAGE_LEVEL_1, BURN)
- if(400 to 460)
- apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
- if(460 to INFINITY)
- if(on_fire)
- apply_damage(HEAT_DAMAGE_LEVEL_3, BURN)
- else
- apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
- else
- clear_alert("alien_fire")
-
-/mob/living/carbon/alien/reagent_check(datum/reagent/R) //can metabolize all reagents
- return 0
-
-/mob/living/carbon/alien/IsAdvancedToolUser()
- return has_fine_manipulation
-
-/mob/living/carbon/alien/Stat()
- ..()
-
- if(statpanel("Status"))
- stat(null, "Intent: [a_intent]")
-
-/mob/living/carbon/alien/getTrail()
- if(getBruteLoss() < 200)
- return pick (list("xltrails_1", "xltrails2"))
- else
- return pick (list("xttrails_1", "xttrails2"))
-/*----------------------------------------
-Proc: AddInfectionImages()
-Des: Gives the client of the alien an image on each infected mob.
-----------------------------------------*/
-/mob/living/carbon/alien/proc/AddInfectionImages()
- if (client)
- for (var/i in GLOB.mob_living_list)
- var/mob/living/L = i
- if(HAS_TRAIT(L, TRAIT_XENO_HOST))
- var/obj/item/organ/body_egg/alien_embryo/A = L.getorgan(/obj/item/organ/body_egg/alien_embryo)
- if(A)
- var/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[A.stage]")
- client.images += I
- return
-
-
-/*----------------------------------------
-Proc: RemoveInfectionImages()
-Des: Removes all infected images from the alien.
-----------------------------------------*/
-/mob/living/carbon/alien/proc/RemoveInfectionImages()
- if (client)
- for(var/image/I in client.images)
- if(dd_hasprefix_case(I.icon_state, "infected"))
- qdel(I)
- return
-
-/mob/living/carbon/alien/canBeHandcuffed()
- return 1
-
-/mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0)
- return initial(pixel_y)
-
-/mob/living/carbon/alien/proc/alien_evolve(mob/living/carbon/alien/new_xeno)
- to_chat(src, span_noticealien("I begin to evolve!"))
- visible_message(span_alertalien("[src] begins to twist and contort!"))
- new_xeno.setDir(dir)
- if(!alien_name_regex.Find(name))
- new_xeno.name = name
- new_xeno.real_name = real_name
- if(mind)
- mind.transfer_to(new_xeno)
- var/datum/component/nanites/nanites = GetComponent(/datum/component/nanites)
- if(nanites)
- new_xeno.AddComponent(/datum/component/nanites, nanites.nanite_volume)
- SEND_SIGNAL(new_xeno, COMSIG_NANITE_SYNC, nanites)
- qdel(src)
-
-/mob/living/carbon/alien/can_hold_items()
- return has_fine_manipulation
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
deleted file mode 100644
index c1efb53f33e..00000000000
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ /dev/null
@@ -1,129 +0,0 @@
-
-/mob/living/carbon/alien/get_eye_protection()
- return ..() + 2 //potential cyber implants + natural eye protection
-
-/mob/living/carbon/alien/get_ear_protection()
- return 2 //no ears
-
-/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum, d_type = "blunt")
- ..(AM, skipcatch = TRUE, hitpush = FALSE)
-
-
-/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
-As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
-In all, this is a lot like the monkey code. /N
-*/
-/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M)
- if(isturf(loc) && istype(loc.loc, /area/start))
- to_chat(M, "No attacking people at spawn, you jackass.")
- return
-
- switch(M.used_intent.type)
-
- if (INTENT_HELP)
- set_resting(FALSE)
- AdjustStun(-60)
- AdjustKnockdown(-60)
- AdjustImmobilized(-60)
- AdjustParalyzed(-60)
- AdjustUnconscious(-60)
- AdjustSleeping(-100)
- visible_message(span_notice("[M.name] nuzzles [src] trying to wake [p_them()] up!"))
-
- if (INTENT_GRAB)
- grabbedby(M)
-
- else
- if(health > 0)
- M.do_attack_animation(src, ATTACK_EFFECT_BITE)
- playsound(loc, 'sound/blank.ogg', 50, TRUE, -1)
- visible_message(span_danger("[M.name] bites [src]!"), \
- span_danger("[M.name] bites you!"), span_hear("I hear a chomp!"), COMBAT_MESSAGE_RANGE, M)
- to_chat(M, span_danger("I bite [src]!"))
- adjustBruteLoss(1)
- log_combat(M, src, "attacked")
- updatehealth()
- else
- to_chat(M, span_warning("[name] is too injured for that."))
-
-
-/mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L)
- return attack_alien(L)
-
-
-/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M)
- if(..()) //to allow surgery to return properly.
- return 0
-
- switch(M.used_intent.type)
- if(INTENT_HELP)
- help_shake_act(M)
- if(INTENT_GRAB)
- grabbedby(M)
- if (INTENT_HARM)
- M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
- return 1
- if(INTENT_DISARM)
- M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
- return 1
- return 0
-
-
-/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M)
- if(..())
- if (stat != DEAD)
- var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
- apply_damage(rand(1, 3), BRUTE, affecting)
-
-
-/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M)
- . = ..()
- if(.)
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- switch(M.melee_damage_type)
- if(BRUTE)
- adjustBruteLoss(damage)
- if(BURN)
- adjustFireLoss(damage)
- if(TOX)
- adjustToxLoss(damage)
- if(OXY)
- adjustOxyLoss(damage)
- if(CLONE)
- adjustCloneLoss(damage)
- if(STAMINA)
- adjustStaminaLoss(damage)
-
-/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M)
- if(..()) //successful slime attack
- var/damage = rand(5, 35)
- if(M.is_adult)
- damage = rand(10, 40)
- adjustBruteLoss(damage)
- log_combat(M, src, "attacked")
- updatehealth()
-
-/mob/living/carbon/alien/ex_act(severity, target, origin)
- if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
- return
- ..()
- switch (severity)
- if (EXPLODE_DEVASTATE)
- gib()
- return
-
- if (EXPLODE_HEAVY)
- take_overall_damage(60, 60)
- adjustEarDamage(30,120)
-
- if(EXPLODE_LIGHT)
- take_overall_damage(30,0)
- if(prob(50))
- Unconscious(20)
- adjustEarDamage(15,60)
-
-/mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15)
- return 0
-
-/mob/living/carbon/alien/acid_act(acidpwr, acid_volume)
- return 0//aliens are immune to acid.
diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm
deleted file mode 100644
index 452b162da21..00000000000
--- a/code/modules/mob/living/carbon/alien/damage_procs.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-
-/mob/living/carbon/alien/getToxLoss()
- return 0
-
-/mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) //alien immune to tox damage
- return FALSE
-
-//aliens are immune to stamina damage.
-/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE)
- return
-
-/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1)
- return
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
deleted file mode 100644
index 718186c9078..00000000000
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/mob/living/carbon/alien/spawn_gibs(with_bodyparts)
- if(with_bodyparts)
- new /obj/effect/gibspawner/xeno(drop_location(), src)
- else
- new /obj/effect/gibspawner/xeno/bodypartless(drop_location(), src)
-
-/mob/living/carbon/alien/gib_animation()
- new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
-
-/mob/living/carbon/alien/spawn_dust()
- new /obj/effect/decal/remains/xeno(loc)
-
-/mob/living/carbon/alien/dust_animation()
- new /obj/effect/temp_visual/dust_animation(loc, "dust-a")
diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm
deleted file mode 100644
index 95bb95b04d7..00000000000
--- a/code/modules/mob/living/carbon/alien/emote.dm
+++ /dev/null
@@ -1,29 +0,0 @@
-/datum/emote/living/alien
- mob_type_allowed_typecache = list(/mob/living/carbon/alien)
-
-/datum/emote/living/alien/gnarl
- key = "gnarl"
- key_third_person = "gnarls"
- message = "gnarls and shows its teeth..."
-
-/datum/emote/living/alien/hiss
- key = "hiss"
- key_third_person = "hisses"
- message_alien = "hisses."
- message_larva = "hisses softly."
-
-/datum/emote/living/alien/hiss/get_sound(mob/living/user)
- if(isalienadult(user))
- return "hiss"
-
-/datum/emote/living/alien/roar
- key = "roar"
- key_third_person = "roars"
- message_alien = "roars."
- message_larva = "softly roars."
- emote_type = EMOTE_AUDIBLE
- vary = TRUE
-
-/datum/emote/living/alien/roar/get_sound(mob/living/user)
- if(isalienadult(user))
- return 'sound/blank.ogg'
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
deleted file mode 100644
index e3f428cd91c..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ /dev/null
@@ -1,336 +0,0 @@
-/*NOTES:
-These are general powers. Specific powers are stored under the appropriate alien creature type.
-*/
-
-/*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit.
-Doesn't work on other aliens/AI.*/
-
-
-/obj/effect/proc_holder/alien
- name = "Alien Power"
- panel = "Alien"
- var/plasma_cost = 0
- var/check_turf = FALSE
- has_action = TRUE
- base_action = /datum/action/spell_action/alien
- action_icon = 'icons/mob/actions/actions_xeno.dmi'
- action_icon_state = "spell_default"
- action_background_icon_state = "bg_alien"
-
-/obj/effect/proc_holder/alien/Initialize()
- . = ..()
- action = new(src)
-
-/obj/effect/proc_holder/alien/Click()
- if(!iscarbon(usr))
- return 1
- var/mob/living/carbon/user = usr
- if(cost_check(check_turf,user))
- if(fire(user) && user) // Second check to prevent runtimes when evolving
- user.adjustPlasma(-plasma_cost)
- return 1
-
-/obj/effect/proc_holder/alien/on_gain(mob/living/carbon/user)
- return
-
-/obj/effect/proc_holder/alien/on_lose(mob/living/carbon/user)
- return
-
-/obj/effect/proc_holder/alien/fire(mob/living/carbon/user)
- return 1
-
-/obj/effect/proc_holder/alien/get_panel_text()
- . = ..()
- if(plasma_cost > 0)
- return "[plasma_cost]"
-
-/obj/effect/proc_holder/alien/proc/cost_check(check_turf = FALSE, mob/living/carbon/user, silent = FALSE)
- if(user.stat)
- if(!silent)
- to_chat(user, span_noticealien("I must be conscious to do this."))
- return FALSE
- if(user.getPlasma() < plasma_cost)
- if(!silent)
- to_chat(user, span_noticealien("Not enough plasma stored."))
- return FALSE
- if(check_turf && (!isturf(user.loc) || isspaceturf(user.loc)))
- if(!silent)
- to_chat(user, span_noticealien("Bad place for a garden!"))
- return FALSE
- return TRUE
-
-/obj/effect/proc_holder/alien/proc/check_vent_block(mob/living/user)
- var/obj/machinery/atmospherics/components/unary/atmos_thing = locate() in user.loc
- if(atmos_thing)
- var/rusure = alert(user, "Laying eggs and shaping resin here would block access to [atmos_thing]. Do you want to continue?", "Blocking Atmospheric Component", "Yes", "No")
- if(rusure != "Yes")
- return FALSE
- return TRUE
-
-/obj/effect/proc_holder/alien/plant
- name = "Plant Weeds"
- desc = ""
- plasma_cost = 50
- check_turf = TRUE
- action_icon_state = "alien_plant"
-
-/obj/effect/proc_holder/alien/plant/fire(mob/living/carbon/user)
- if(locate(/obj/structure/alien/weeds/node) in get_turf(user))
- to_chat(user, span_warning("There's already a weed node here!"))
- return 0
- user.visible_message(span_alertalien("[user] has planted some alien weeds!"))
- new/obj/structure/alien/weeds/node(user.loc)
- return 1
-
-/obj/effect/proc_holder/alien/whisper
- name = "Whisper"
- desc = ""
- plasma_cost = 10
- action_icon_state = "alien_whisper"
-
-/obj/effect/proc_holder/alien/whisper/fire(mob/living/carbon/user)
- var/list/options = list()
- for(var/mob/living/Ms in oview(user))
- options += Ms
- var/mob/living/M = input("Select who to whisper to:","Whisper to?",null) as null|mob in sortNames(options)
- if(!M)
- return 0
- if(M.anti_magic_check(FALSE, FALSE, TRUE, 0))
- to_chat(user, span_noticealien("As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled."))
- return FALSE
- var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
- if(msg)
- if(M.anti_magic_check(FALSE, FALSE, TRUE, 0))
- to_chat(user, span_notice("As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled."))
- return
- log_directed_talk(user, M, msg, LOG_SAY, tag="alien whisper")
- to_chat(M, "I hear a strange, alien voice in your head...[msg]")
- to_chat(user, span_noticealien("I said: \"[msg]\" to [M]"))
- for(var/ded in GLOB.dead_mob_list)
- if(!isobserver(ded))
- continue
- var/follow_link_user = FOLLOW_LINK(ded, user)
- var/follow_link_whispee = FOLLOW_LINK(ded, M)
- to_chat(ded, "[follow_link_user] [user] Alien Whisper --> [follow_link_whispee] [M] [msg]")
- else
- return 0
- return 1
-
-/obj/effect/proc_holder/alien/transfer
- name = "Transfer Plasma"
- desc = ""
- plasma_cost = 0
- action_icon_state = "alien_transfer"
-
-/obj/effect/proc_holder/alien/transfer/fire(mob/living/carbon/user)
- var/list/mob/living/carbon/aliens_around = list()
- for(var/mob/living/carbon/A in oview(user))
- if(A.getorgan(/obj/item/organ/alien/plasmavessel))
- aliens_around.Add(A)
- var/mob/living/carbon/M = input("Select who to transfer to:","Transfer plasma to?",null) as mob in sortNames(aliens_around)
- if(!M)
- return 0
- var/amount = input("Amount:", "Transfer Plasma to [M]") as num|null
- if (amount)
- amount = min(abs(round(amount)), user.getPlasma())
- if (get_dist(user,M) <= 1)
- M.adjustPlasma(amount)
- user.adjustPlasma(-amount)
- to_chat(M, span_noticealien("[user] has transferred [amount] plasma to you."))
- to_chat(user, span_noticealien("I transfer [amount] plasma to [M]."))
- else
- to_chat(user, span_noticealien("I need to be closer!"))
- return
-
-/obj/effect/proc_holder/alien/acid
- name = "Corrosive Acid"
- desc = ""
- plasma_cost = 200
- action_icon_state = "alien_acid"
-
-/obj/effect/proc_holder/alien/acid/on_gain(mob/living/carbon/user)
- user.verbs.Add(/mob/living/carbon/proc/corrosive_acid)
-
-/obj/effect/proc_holder/alien/acid/on_lose(mob/living/carbon/user)
- user.verbs.Remove(/mob/living/carbon/proc/corrosive_acid)
-
-/obj/effect/proc_holder/alien/acid/proc/corrode(atom/target,mob/living/carbon/user = usr)
- if(target in oview(1,user))
- if(target.acid_act(200, 100))
- user.visible_message(span_alertalien("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!"))
- return 1
- else
- to_chat(user, span_noticealien("I cannot dissolve this object."))
-
-
- return 0
- else
- to_chat(src, span_noticealien("[target] is too far away."))
- return 0
-
-
-/obj/effect/proc_holder/alien/acid/fire(mob/living/carbon/alien/user)
- var/O = input("Select what to dissolve:","Dissolve",null) as obj|turf in oview(1,user)
- if(!O || user.incapacitated())
- return 0
- else
- return corrode(O,user)
-
-/mob/living/carbon/proc/corrosive_acid(O as obj|turf in oview(1)) // right click menu verb ugh
- set name = "Corrosive Acid"
-
- if(!iscarbon(usr))
- return
- var/mob/living/carbon/user = usr
- var/obj/effect/proc_holder/alien/acid/A = locate() in user.abilities
- if(!A)
- return
- if(user.getPlasma() > A.plasma_cost && A.corrode(O))
- user.adjustPlasma(-A.plasma_cost)
-
-/obj/effect/proc_holder/alien/neurotoxin
- name = "Spit Neurotoxin"
- desc = ""
- action_icon_state = "alien_neurotoxin_0"
- active = FALSE
-
-/obj/effect/proc_holder/alien/neurotoxin/fire(mob/living/carbon/user)
- var/message
- if(active)
- message = span_notice("I empty your neurotoxin gland.")
- remove_ranged_ability(message)
- else
- message = span_notice("I prepare your neurotoxin gland. Left-click to fire at a target!")
- add_ranged_ability(user, message, TRUE)
-
-/obj/effect/proc_holder/alien/neurotoxin/update_icon()
- action.button_icon_state = "alien_neurotoxin_[active]"
- action.UpdateButtonIcon()
-
-/obj/effect/proc_holder/alien/neurotoxin/InterceptClickOn(mob/living/caller, params, atom/target)
- if(..())
- return
- var/p_cost = 50
- if(!iscarbon(ranged_ability_user) || ranged_ability_user.stat)
- remove_ranged_ability()
- return
-
- var/mob/living/carbon/user = ranged_ability_user
-
- if(user.getPlasma() < p_cost)
- to_chat(user, span_warning("I need at least [p_cost] plasma to spit."))
- remove_ranged_ability()
- return
-
- var/turf/T = user.loc
- var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction
- if(!isturf(U) || !isturf(T))
- return FALSE
-
- user.visible_message(span_danger("[user] spits neurotoxin!"), span_alertalien("I spit neurotoxin."))
- var/obj/projectile/bullet/neurotoxin/A = new /obj/projectile/bullet/neurotoxin(user.loc)
- A.preparePixelProjectile(target, user, params)
- A.fire()
- user.newtonian_move(get_dir(U, T))
- user.adjustPlasma(-p_cost)
-
- return TRUE
-
-/obj/effect/proc_holder/alien/neurotoxin/on_lose(mob/living/carbon/user)
- remove_ranged_ability()
-
-/obj/effect/proc_holder/alien/neurotoxin/add_ranged_ability(mob/living/user,msg,forced)
- ..()
- if(isalienadult(user))
- var/mob/living/carbon/alien/humanoid/A = user
- A.drooling = 1
- A.update_icons()
-
-/obj/effect/proc_holder/alien/neurotoxin/remove_ranged_ability(msg)
- if(isalienadult(ranged_ability_user))
- var/mob/living/carbon/alien/humanoid/A = ranged_ability_user
- A.drooling = 0
- A.update_icons()
- ..()
-
-/obj/effect/proc_holder/alien/resin
- name = "Secrete Resin"
- desc = ""
- plasma_cost = 55
- check_turf = TRUE
- var/list/structures = list(
- "resin wall" = /obj/structure/alien/resin/wall,
- "resin membrane" = /obj/structure/alien/resin/membrane,
- "resin nest" = /obj/structure/bed/nest)
-
- action_icon_state = "alien_resin"
-
-/obj/effect/proc_holder/alien/resin/fire(mob/living/carbon/user)
- if(locate(/obj/structure/alien/resin) in user.loc)
- to_chat(user, span_warning("There is already a resin structure there!"))
- return FALSE
-
- if(!check_vent_block(user))
- return FALSE
-
- var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in structures
- if(!choice)
- return FALSE
- if (!cost_check(check_turf,user))
- return FALSE
- to_chat(user, span_notice("I shape a [choice]."))
- user.visible_message(span_notice("[user] vomits up a thick purple substance and begins to shape it."))
-
- choice = structures[choice]
- new choice(user.loc)
- return TRUE
-
-/obj/effect/proc_holder/alien/sneak
- name = "Sneak"
- desc = ""
- active = 0
-
- action_icon_state = "alien_sneak"
-
-/obj/effect/proc_holder/alien/sneak/fire(mob/living/carbon/alien/humanoid/user)
- if(!active)
- user.alpha = 75 //Still easy to see in lit areas with bright tiles, almost invisible on resin.
- user.sneaking = 1
- active = 1
- to_chat(user, span_noticealien("I blend into the shadows..."))
- else
- user.alpha = initial(user.alpha)
- user.sneaking = 0
- active = 0
- to_chat(user, span_noticealien("I reveal yourself!"))
-
-
-/mob/living/carbon/proc/getPlasma()
- var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel)
- if(!vessel)
- return 0
- return vessel.storedPlasma
-
-
-/mob/living/carbon/proc/adjustPlasma(amount)
- var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel)
- if(!vessel)
- return 0
- vessel.storedPlasma = max(vessel.storedPlasma + amount,0)
- vessel.storedPlasma = min(vessel.storedPlasma, vessel.max_plasma) //upper limit of max_plasma, lower limit of 0
- for(var/X in abilities)
- var/obj/effect/proc_holder/alien/APH = X
- if(APH.has_action)
- APH.action.UpdateButtonIcon()
- return 1
-
-/mob/living/carbon/alien/adjustPlasma(amount)
- . = ..()
- updatePlasmaDisplay()
-
-/mob/living/carbon/proc/usePlasma(amount)
- if(getPlasma() >= amount)
- adjustPlasma(-amount)
- return 1
-
- return 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
deleted file mode 100644
index 65d4ff1c881..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
+++ /dev/null
@@ -1,43 +0,0 @@
-/mob/living/carbon/alien/humanoid/drone
- name = "alien drone"
- caste = "d"
- maxHealth = 125
- health = 125
- icon_state = "aliend"
-
-/mob/living/carbon/alien/humanoid/drone/Initialize()
- AddAbility(new/obj/effect/proc_holder/alien/evolve(null))
- . = ..()
-
-/mob/living/carbon/alien/humanoid/drone/create_internal_organs()
- internal_organs += new /obj/item/organ/alien/plasmavessel/large
- internal_organs += new /obj/item/organ/alien/resinspinner
- internal_organs += new /obj/item/organ/alien/acid
- ..()
-
-/obj/effect/proc_holder/alien/evolve
- name = "Evolve to Praetorian"
- desc = ""
- plasma_cost = 500
-
- action_icon_state = "alien_evolve_drone"
-
-/obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/humanoid/user)
- var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode)
- if(!node) //Players are Murphy's Law. We may not expect there to ever be a living xeno with no hivenode, but they _WILL_ make it happen.
- to_chat(user, span_danger("Without the hivemind, you can't possibly hold the responsibility of leadership!"))
- return 0
- if(node.recent_queen_death)
- to_chat(user, span_danger("My thoughts are still too scattered to take up the position of leadership."))
- return 0
-
- if(!isturf(user.loc))
- to_chat(user, span_warning("I can't evolve here!"))
- return 0
- if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal))
- var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new (user.loc)
- user.alien_evolve(new_xeno)
- return 1
- else
- to_chat(user, span_warning("We already have a living royal!"))
- return 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
deleted file mode 100644
index 7d857e83eee..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ /dev/null
@@ -1,95 +0,0 @@
-/mob/living/carbon/alien/humanoid/hunter
- name = "alien hunter"
- caste = "h"
- maxHealth = 125
- health = 125
- icon_state = "alienh"
- var/atom/movable/screen/leap_icon = null
-
-/mob/living/carbon/alien/humanoid/hunter/create_internal_organs()
- internal_organs += new /obj/item/organ/alien/plasmavessel/small
- ..()
-
-//Hunter verbs
-
-/mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(message = 1)
- leap_on_click = !leap_on_click
- leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]"
- update_icons()
- if(message)
- to_chat(src, span_noticealien("I will now [leap_on_click ? "leap at":"slash at"] enemies!"))
- else
- return
-
-/mob/living/carbon/alien/humanoid/hunter/ClickOn(atom/A, params)
- face_atom(A)
- if(leap_on_click)
- leap_at(A)
- else
- ..()
-
-#define MAX_ALIEN_LEAP_DIST 7
-
-/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A)
- if((mobility_flags & (MOBILITY_MOVE | MOBILITY_STAND)) != (MOBILITY_MOVE | MOBILITY_STAND) || leaping)
- return
-
- if(pounce_cooldown > world.time)
- to_chat(src, span_alertalien("I are too fatigued to pounce right now!"))
- return
-
- if(!has_gravity() || !A.has_gravity())
- to_chat(src, span_alertalien("It is unsafe to leap without gravity!"))
- //It's also extremely buggy visually, so it's balance+bugfix
- return
-
- else //Maybe uses plasma in the future, although that wouldn't make any sense...
- leaping = 1
- weather_immunities += "lava"
- update_icons()
- throw_at(A, MAX_ALIEN_LEAP_DIST, 1, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end)))
-
-/mob/living/carbon/alien/humanoid/hunter/proc/leap_end()
- leaping = 0
- weather_immunities -= "lava"
- update_icons()
-
-/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
-
- if(!leaping)
- return ..()
-
- pounce_cooldown = world.time + pounce_cooldown_time
- if(hit_atom)
- if(isliving(hit_atom))
- var/mob/living/L = hit_atom
- var/blocked = FALSE
- if(ishuman(hit_atom))
- var/mob/living/carbon/human/H = hit_atom
- if(H.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK))
- blocked = TRUE
- if(!blocked)
- L.visible_message(span_danger("[src] pounces on [L]!"), span_danger("[src] pounces on you!"))
- L.Paralyze(100)
- sleep(2)//Runtime prevention (infinite bump() calls on hulks)
- step_towards(src,L)
- else
- Paralyze(40, 1, 1)
-
- toggle_leap(0)
- else if(hit_atom.density && !hit_atom.CanPass(src))
- visible_message(span_danger("[src] smashes into [hit_atom]!"), span_alertalien("[src] smashes into [hit_atom]!"))
- Paralyze(40, 1, 1)
-
- if(leaping)
- leaping = FALSE
- update_icons()
- update_mobility()
-
-
-/mob/living/carbon/alien/humanoid/float(on)
- if(leaping)
- return
- ..()
-
-
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm
deleted file mode 100644
index eedcbc6b3f0..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm
+++ /dev/null
@@ -1,42 +0,0 @@
-/mob/living/carbon/alien/humanoid/royal/praetorian
- name = "alien praetorian"
- caste = "p"
- maxHealth = 250
- health = 250
- icon_state = "alienp"
-
-/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize()
- real_name = name
- AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src))
- AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve())
- . = ..()
-
-/mob/living/carbon/alien/humanoid/royal/praetorian/create_internal_organs()
- internal_organs += new /obj/item/organ/alien/plasmavessel/large
- internal_organs += new /obj/item/organ/alien/resinspinner
- internal_organs += new /obj/item/organ/alien/acid
- internal_organs += new /obj/item/organ/alien/neurotoxin
- ..()
-
-/obj/effect/proc_holder/alien/royal/praetorian/evolve
- name = "Evolve"
- desc = ""
- plasma_cost = 500
-
- action_icon_state = "alien_evolve_praetorian"
-
-/obj/effect/proc_holder/alien/royal/praetorian/evolve/fire(mob/living/carbon/alien/humanoid/user)
- var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode)
- if(!node) //Just in case this particular Praetorian gets violated and kept by the RD as a replacement for Lamarr.
- to_chat(user, span_warning("Without the hivemind, you would be unfit to rule as queen!"))
- return 0
- if(node.recent_queen_death)
- to_chat(user, span_warning("I are still too burdened with guilt to evolve into a queen."))
- return 0
- if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal/queen))
- var/mob/living/carbon/alien/humanoid/royal/queen/new_xeno = new (user.loc)
- user.alien_evolve(new_xeno)
- return 1
- else
- to_chat(user, span_warning("We already have an alive queen!"))
- return 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
deleted file mode 100644
index 7c6443cfae7..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-/mob/living/carbon/alien/humanoid/sentinel
- name = "alien sentinel"
- caste = "s"
- maxHealth = 150
- health = 150
- icon_state = "aliens"
-
-/mob/living/carbon/alien/humanoid/sentinel/Initialize()
- AddAbility(new /obj/effect/proc_holder/alien/sneak)
- . = ..()
-
-/mob/living/carbon/alien/humanoid/sentinel/create_internal_organs()
- internal_organs += new /obj/item/organ/alien/plasmavessel
- internal_organs += new /obj/item/organ/alien/acid
- internal_organs += new /obj/item/organ/alien/neurotoxin
- ..()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm
deleted file mode 100644
index a70600b81ef..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/death.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/mob/living/carbon/alien/humanoid/death(gibbed)
- if(stat == DEAD)
- return
-
- . = ..()
-
- update_icons()
- status_flags |= CANPUSH
-
-//When the alien queen dies, all others must pay the price for letting her die.
-/mob/living/carbon/alien/humanoid/royal/queen/death(gibbed)
- if(stat == DEAD)
- return
-
- for(var/mob/living/carbon/C in GLOB.alive_mob_list)
- if(C == src) //Make sure not to proc it on ourselves.
- continue
- var/obj/item/organ/alien/hivenode/node = C.getorgan(/obj/item/organ/alien/hivenode)
- if(istype(node)) // just in case someone would ever add a diffirent node to hivenode slot
- node.queen_death()
-
- return ..()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
deleted file mode 100644
index 5ad9fcaac7d..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ /dev/null
@@ -1,116 +0,0 @@
-/mob/living/carbon/alien/humanoid
- name = "alien"
- icon_state = "alien"
- pass_flags = PASSTABLE
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 5, /obj/item/stack/sheet/animalhide/xeno = 1)
- base_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM)
- limb_destroyer = 1
- hud_type = /datum/hud/human
- var/obj/item/r_store = null
- var/obj/item/l_store = null
- var/caste = ""
- var/alt_icon = 'icons/mob/alienleap.dmi' //used to switch between the two alien icon files.
- var/leap_on_click = 0
- var/pounce_cooldown = 0
- var/pounce_cooldown_time = 30
- var/custom_pixel_x_offset = 0 //for admin fuckery.
- var/custom_pixel_y_offset = 0
- var/sneaking = 0 //For sneaky-sneaky mode and appropriate slowdown
- var/drooling = 0 //For Neruotoxic spit overlays
- deathsound = 'sound/blank.ogg'
- bodyparts = list(/obj/item/bodypart/chest/alien, /obj/item/bodypart/head/alien, /obj/item/bodypart/l_arm/alien,
- /obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_leg/alien, /obj/item/bodypart/l_leg/alien)
-
-/mob/living/carbon/alien/humanoid/Initialize()
- . = ..()
- AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -3)
-
-/mob/living/carbon/alien/humanoid/restrained(ignore_grab)
- return handcuffed
-
-/mob/living/carbon/alien/humanoid/show_inv(mob/user)
- user.set_machine(src)
- var/list/dat = list()
- dat += {"
-
- [name]
-
"}
- for(var/i in 1 to held_items.len)
- var/obj/item/I = get_item_for_held_index(i)
- dat += "
[get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]"
- dat += "
Empty Pouches"
-
- if(handcuffed)
- dat += "
Handcuffed"
- if(legcuffed)
- dat += "
Legcuffed"
-
- dat += {"
-
-
Close
- "}
- user << browse(dat.Join(), "window=mob[REF(src)];size=325x500")
- onclose(user, "mob[REF(src)]")
-
-
-/mob/living/carbon/alien/humanoid/Topic(href, href_list)
- //strip panel
- if(href_list["pouches"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY))
- visible_message(span_danger("[usr] tries to empty [src]'s pouches."), \
- span_danger("[usr] tries to empty your pouches."))
- if(do_mob(usr, src, POCKET_STRIP_DELAY * 0.5))
- dropItemToGround(r_store)
- dropItemToGround(l_store)
-
- ..()
-
-
-/mob/living/carbon/alien/humanoid/cuff_resist(obj/item/I)
- playsound(src, 'sound/blank.ogg', 40, TRUE, TRUE) //Alien roars when starting to break free
- ..(I, cuff_break = INSTANT_CUFFBREAK)
-
-/mob/living/carbon/alien/humanoid/resist_grab(moving_resist)
- if(pulledby.grab_state)
- visible_message(span_danger("[src] breaks free of [pulledby]'s grip!"), \
- span_danger("I break free of [pulledby]'s grip!"))
- pulledby.stop_pulling()
- . = 0
-
-/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0)
- if(leaping)
- return -32
- else if(custom_pixel_y_offset)
- return custom_pixel_y_offset
- else
- return initial(pixel_y)
-
-/mob/living/carbon/alien/humanoid/get_standard_pixel_x_offset(lying = 0)
- if(leaping)
- return -32
- else if(custom_pixel_x_offset)
- return custom_pixel_x_offset
- else
- return initial(pixel_x)
-
-/mob/living/carbon/alien/humanoid/get_permeability_protection(list/target_zones)
- return 0.8
-
-/mob/living/carbon/alien/humanoid/alien_evolve(mob/living/carbon/alien/humanoid/new_xeno)
- drop_all_held_items()
- ..()
-
-//For alien evolution/promotion/queen finder procs. Checks for an active alien of that type
-/proc/get_alien_type(alienpath)
- for(var/mob/living/carbon/alien/humanoid/A in GLOB.alive_mob_list)
- if(!istype(A, alienpath))
- continue
- if(!A.key || A.stat == DEAD) //Only living aliens with a ckey are valid.
- continue
- return A
- return FALSE
-
-
-/mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath)
- if(breath && breath.total_moles() > 0 && !sneaking)
- playsound(get_turf(src), pick('sound/blank.ogg'), 50, FALSE, -5)
- ..()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
deleted file mode 100644
index b3f345e7985..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user)
- . = ..()
- if(!.)
- return
- adjustBruteLoss(15)
- var/hitverb = "hit"
- if(mob_size < MOB_SIZE_LARGE)
- safe_throw_at(get_edge_target_turf(src, get_dir(user, src)), 2, 1, user)
- hitverb = "slam"
- playsound(loc, "punch", 25, TRUE, -1)
- visible_message(span_danger("[user] [hitverb]s [src]!"), \
- span_danger("[user] [hitverb]s you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user)
- to_chat(user, span_danger("I [hitverb] [src]!"))
-
-/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M)
- if(..())
- switch(M.used_intent.type)
- if (INTENT_HARM)
- var/damage = rand(1, 9)
- if (prob(90))
- playsound(loc, "punch", 25, TRUE, -1)
- visible_message(span_danger("[M] punches [src]!"), \
- span_danger("[M] punches you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M)
- to_chat(M, span_danger("I punch [src]!"))
- if ((stat != DEAD) && (damage > 9 || prob(5)))//Regular humans have a very small chance of knocking an alien down.
- Unconscious(40)
- visible_message(span_danger("[M] knocks [src] down!"), \
- span_danger("[M] knocks you down!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), null, M)
- to_chat(M, span_danger("I knock [src] down!"))
- var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
- apply_damage(damage, BRUTE, affecting)
- log_combat(M, src, "attacked")
- else
- playsound(loc, 'sound/blank.ogg', 25, TRUE, -1)
- visible_message(span_danger("[M]'s punch misses [src]!"), \
- span_danger("I avoid [M]'s punch!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M)
- to_chat(M, span_warning("My punch misses [src]!"))
-
- if (INTENT_DISARM)
- if (!(mobility_flags & MOBILITY_STAND))
- if (prob(5))
- Unconscious(40)
- playsound(loc, 'sound/blank.ogg', 50, TRUE, -1)
- log_combat(M, src, "pushed")
- visible_message(span_danger("[M] pushes [src] down!"), \
- span_danger("[M] pushes you down!"), span_hear("I hear aggressive shuffling followed by a loud thud!"), null, M)
- to_chat(M, span_danger("I push [src] down!"))
- else
- if (prob(50))
- dropItemToGround(get_active_held_item(), silent = FALSE)
- playsound(loc, 'sound/blank.ogg', 50, TRUE, -1)
- visible_message(span_danger("[M] disarms [src]!"), \
- span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M)
- to_chat(M, span_danger("I disarm [src]!"))
- else
- playsound(loc, 'sound/blank.ogg', 25, TRUE, -1)
- visible_message(span_danger("[M] fails to disarm [src]!"),\
- span_danger("[M] fails to disarm you!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M)
- to_chat(M, span_warning("I fail to disarm [src]!"))
-
-
-
-/mob/living/carbon/alien/humanoid/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
- if(!no_effect && !visual_effect_icon)
- visual_effect_icon = ATTACK_EFFECT_CLAW
- ..()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
deleted file mode 100644
index 9628545b3cc..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
- . = ..()
- if(!. || !I)
- return
-
diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm
deleted file mode 100644
index fd6a73ae7bf..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/life.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-/mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost)
- var/temperature = current
- var/difference = abs(current-loc_temp) //get difference
- var/increments// = difference/10 //find how many increments apart they are
- if(difference > 50)
- increments = difference/5
- else
- increments = difference/10
- var/change = increments*boost // Get the amount to change by (x per increment)
- var/temp_change
- if(current < loc_temp)
- temperature = min(loc_temp, temperature+change)
- else if(current > loc_temp)
- temperature = max(loc_temp, temperature-change)
- temp_change = (temperature - current)
- return temp_change
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
deleted file mode 100644
index d4bcc8febaa..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ /dev/null
@@ -1,139 +0,0 @@
-/mob/living/carbon/alien/humanoid/royal
- //Common stuffs for Praetorian and Queen
- icon = 'icons/mob/alienqueen.dmi'
- status_flags = 0
- ventcrawler = VENTCRAWLER_NONE //pull over that ass too fat
- unique_name = 0
- pixel_x = -16
- bubble_icon = "alienroyal"
- mob_size = MOB_SIZE_LARGE
- layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles
- pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3)
-
- var/alt_inhands_file = 'icons/mob/alienqueen.dmi'
-
-/mob/living/carbon/alien/humanoid/royal/can_inject()
- return 0
-
-/mob/living/carbon/alien/humanoid/royal/queen
- name = "alien queen"
- caste = "q"
- maxHealth = 400
- health = 400
- icon_state = "alienq"
- var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen()
-
-/mob/living/carbon/alien/humanoid/royal/queen/Initialize()
- //there should only be one queen
- for(var/mob/living/carbon/alien/humanoid/royal/queen/Q in GLOB.carbon_list)
- if(Q == src)
- continue
- if(Q.stat == DEAD)
- continue
- if(Q.client)
- name = "alien princess ([rand(1, 999)])" //if this is too cutesy feel free to change it/remove it.
- break
-
- real_name = src.name
-
- AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src))
- AddAbility(new/obj/effect/proc_holder/alien/royal/queen/promote())
- smallsprite.Grant(src)
- return ..()
-
-/mob/living/carbon/alien/humanoid/royal/queen/create_internal_organs()
- internal_organs += new /obj/item/organ/alien/plasmavessel/large/queen
- internal_organs += new /obj/item/organ/alien/resinspinner
- internal_organs += new /obj/item/organ/alien/acid
- internal_organs += new /obj/item/organ/alien/neurotoxin
- internal_organs += new /obj/item/organ/alien/eggsac
- ..()
-
-//Queen verbs
-/obj/effect/proc_holder/alien/lay_egg
- name = "Lay Egg"
- desc = ""
- plasma_cost = 75
- check_turf = TRUE
- action_icon_state = "alien_egg"
-
-/obj/effect/proc_holder/alien/lay_egg/fire(mob/living/carbon/user)
- if(!check_vent_block(user))
- return FALSE
-
- if(locate(/obj/structure/alien/egg) in get_turf(user))
- to_chat(user, span_alertalien("There's already an egg here."))
- return FALSE
-
- user.visible_message(span_alertalien("[user] has laid an egg!"))
- new /obj/structure/alien/egg(user.loc)
- return TRUE
-
-//Button to let queen choose her praetorian.
-/obj/effect/proc_holder/alien/royal/queen/promote
- name = "Create Royal Parasite"
- desc = ""
- plasma_cost = 500 //Plasma cost used on promotion, not spawning the parasite.
-
- action_icon_state = "alien_queen_promote"
-
-
-
-/obj/effect/proc_holder/alien/royal/queen/promote/fire(mob/living/carbon/alien/user)
- var/obj/item/queenpromote/prom
- if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/))
- to_chat(user, span_noticealien("I already have a Praetorian!"))
- return 0
- else
- for(prom in user)
- to_chat(user, span_noticealien("I discard [prom]."))
- qdel(prom)
- return 0
-
- prom = new (user.loc)
- if(!user.put_in_active_hand(prom, 1))
- to_chat(user, span_warning("I must empty your hands before preparing the parasite."))
- return 0
- else //Just in case telling the player only once is not enough!
- to_chat(user, span_noticealien("Use the royal parasite on one of your children to promote her to Praetorian!"))
- return 0
-
-/obj/item/queenpromote
- name = "\improper royal parasite"
- desc = ""
- icon_state = "alien_medal"
- item_flags = ABSTRACT | DROPDEL
- icon = 'icons/mob/alien.dmi'
-
-/obj/item/queenpromote/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
-
-/obj/item/queenpromote/attack(mob/living/M, mob/living/carbon/alien/humanoid/user)
- if(!isalienadult(M) || isalienroyal(M))
- to_chat(user, span_noticealien("I may only use this with your adult, non-royal children!"))
- return
- if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/))
- to_chat(user, span_noticealien("I already have a Praetorian!"))
- return
-
- var/mob/living/carbon/alien/humanoid/A = M
- if(A.stat == CONSCIOUS && A.mind && A.key)
- if(!user.usePlasma(500))
- to_chat(user, span_noticealien("I must have 500 plasma stored to use this!"))
- return
-
- to_chat(A, span_noticealien("The queen has granted you a promotion to Praetorian!"))
- user.visible_message(span_alertalien("[A] begins to expand, twist and contort!"))
- var/mob/living/carbon/alien/humanoid/royal/praetorian/new_prae = new (A.loc)
- A.mind.transfer_to(new_prae)
- qdel(A)
- qdel(src)
- return
- else
- to_chat(user, span_warning("This child must be alert and responsive to become a Praetorian!"))
-
-/obj/item/queenpromote/attack_self(mob/user)
- to_chat(user, span_noticealien("I discard [src]."))
- qdel(src)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
deleted file mode 100644
index 0297f593579..00000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ /dev/null
@@ -1,94 +0,0 @@
-
-/mob/living/carbon/alien/humanoid/update_icons()
- cut_overlays()
- for(var/I in overlays_standing)
- add_overlay(I)
-
- var/asleep = IsSleeping()
- if(stat == DEAD)
- //If we mostly took damage from fire
- if(getFireLoss() > 125)
- icon_state = "alien[caste]_husked"
- else
- icon_state = "alien[caste]_dead"
-
- else if((stat == UNCONSCIOUS && !asleep) || stat == SOFT_CRIT || IsParalyzed())
- icon_state = "alien[caste]_unconscious"
- else if(leap_on_click)
- icon_state = "alien[caste]_pounce"
-
- else if(!(mobility_flags & MOBILITY_STAND))
- icon_state = "alien[caste]_sleep"
- else if(mob_size == MOB_SIZE_LARGE)
- icon_state = "alien[caste]"
- if(drooling)
- add_overlay("alienspit_[caste]")
- else
- icon_state = "alien[caste]"
- if(drooling)
- add_overlay("alienspit")
-
- if(leaping)
- if(alt_icon == initial(alt_icon))
- var/old_icon = icon
- icon = alt_icon
- alt_icon = old_icon
- icon_state = "alien[caste]_leap"
- pixel_x = -32
- pixel_y = -32
- else
- if(alt_icon != initial(alt_icon))
- var/old_icon = icon
- icon = alt_icon
- alt_icon = old_icon
- pixel_x = get_standard_pixel_x_offset(mobility_flags & MOBILITY_STAND)
- pixel_y = get_standard_pixel_y_offset(mobility_flags & MOBILITY_STAND)
- update_inv_hands()
- update_inv_handcuffed()
-
-/mob/living/carbon/alien/humanoid/regenerate_icons()
- if(!..())
- // update_icons() //Handled in update_transform(), leaving this here as a reminder
- update_transform()
-
-/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that.
- if(lying)
- lying = 90 //Anything else looks retarded
- ..()
- update_icons()
-
-/mob/living/carbon/alien/humanoid/update_inv_handcuffed()
- remove_overlay(HANDCUFF_LAYER)
- var/cuff_icon = "aliencuff"
- var/dmi_file = 'icons/mob/alien.dmi'
-
- if(mob_size == MOB_SIZE_LARGE)
- cuff_icon = "aliencuff_[caste]"
- dmi_file = 'icons/mob/alienqueen.dmi'
-
- if(handcuffed)
- overlays_standing[HANDCUFF_LAYER] = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER)
- apply_overlay(HANDCUFF_LAYER)
-
-//Royals have bigger sprites, so inhand things must be handled differently.
-/mob/living/carbon/alien/humanoid/royal/update_inv_hands()
- ..()
- remove_overlay(HANDS_LAYER)
- var/list/hands = list()
-
- var/obj/item/l_hand = get_item_for_held_index(1)
- if(l_hand)
- var/itm_state = l_hand.item_state
- if(!itm_state)
- itm_state = l_hand.icon_state
- hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER)
-
- var/obj/item/r_hand = get_item_for_held_index(2)
- if(r_hand)
- var/itm_state = r_hand.item_state
- if(!itm_state)
- itm_state = r_hand.icon_state
- hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER)
-
- overlays_standing[HANDS_LAYER] = hands
- apply_overlay(HANDS_LAYER)
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
deleted file mode 100644
index 8fd6329a0c1..00000000000
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/mob/living/carbon/alien/larva/death(gibbed)
- if(stat == DEAD)
- return
-
- . = ..()
-
- update_icons()
-
-/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts)
- if(with_bodyparts)
- new /obj/effect/gibspawner/larva(drop_location(), src)
- else
- new /obj/effect/gibspawner/larva/bodypartless(drop_location(), src)
-
-/mob/living/carbon/alien/larva/gib_animation()
- new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
-
-/mob/living/carbon/alien/larva/spawn_dust()
- new /obj/effect/decal/remains/xeno(loc)
-
-/mob/living/carbon/alien/larva/dust_animation()
- new /obj/effect/temp_visual/dust_animation(loc, "dust-l")
diff --git a/code/modules/mob/living/carbon/alien/larva/inventory.dm b/code/modules/mob/living/carbon/alien/larva/inventory.dm
deleted file mode 100644
index 23c461aa83c..00000000000
--- a/code/modules/mob/living/carbon/alien/larva/inventory.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-//can't unequip since it can't equip anything
-/mob/living/carbon/alien/larva/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
- return
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
deleted file mode 100644
index 84b9b4aefd1..00000000000
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ /dev/null
@@ -1,69 +0,0 @@
-/mob/living/carbon/alien/larva
- name = "alien larva"
- real_name = "alien larva"
- icon_state = "larva0"
- pass_flags = PASSTABLE | PASSMOB
- mob_size = MOB_SIZE_SMALL
- density = FALSE
- hud_type = /datum/hud/larva
-
- maxHealth = 25
- health = 25
-
- var/amount_grown = 0
- var/max_grown = 100
- var/time_of_birth
-
- rotate_on_lying = 0
- bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva)
-
-
-//This is fine right now, if we're adding organ specific damage this needs to be updated
-/mob/living/carbon/alien/larva/Initialize()
-
- AddAbility(new/obj/effect/proc_holder/alien/hide(null))
- AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null))
- . = ..()
-
-/mob/living/carbon/alien/larva/create_internal_organs()
- internal_organs += new /obj/item/organ/alien/plasmavessel/small/tiny
- ..()
-
-//This needs to be fixed
-/mob/living/carbon/alien/larva/Stat()
- ..()
- if(statpanel("Status"))
- stat(null, "Progress: [amount_grown]/[max_grown]")
-
-/mob/living/carbon/alien/larva/adjustPlasma(amount)
- if(stat != DEAD && amount > 0)
- amount_grown = min(amount_grown + 1, max_grown)
- ..(amount)
-
-//can't equip anything
-/mob/living/carbon/alien/larva/attack_ui(slot_id)
- return
-
-/mob/living/carbon/alien/larva/restrained(ignore_grab)
- . = 0
-
-// new damage icon system
-// now constructs damage icon for each organ from mask * damage field
-
-
-/mob/living/carbon/alien/larva/show_inv(mob/user)
- return
-
-/mob/living/carbon/alien/larva/toggle_throw_mode()
- return
-
-/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
- return
-
-/mob/living/carbon/alien/larva/stripPanelUnequip(obj/item/what, mob/who)
- to_chat(src, span_warning("I don't have the dexterity to do this!"))
- return
-
-/mob/living/carbon/alien/larva/stripPanelEquip(obj/item/what, mob/who)
- to_chat(src, span_warning("I don't have the dexterity to do this!"))
- return
diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
deleted file mode 100644
index 19ce8a4ac9d..00000000000
--- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-/mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M)
- if(..())
- var/damage = rand(1, 9)
- if (prob(90))
- playsound(loc, "punch", 25, TRUE, -1)
- log_combat(M, src, "attacked")
- visible_message(span_danger("[M] kicks [src]!"), \
- span_danger("[M] kicks you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M)
- to_chat(M, span_danger("I kick [src]!"))
- if ((stat != DEAD) && (damage > 4.9))
- Unconscious(rand(100,200))
-
- var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
- apply_damage(damage, BRUTE, affecting)
- else
- playsound(loc, 'sound/blank.ogg', 25, TRUE, -1)
- visible_message(span_danger("[M]'s kick misses [src]!"), \
- span_danger("I avoid [M]'s kick!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M)
- to_chat(M, span_warning("My kick misses [src]!"))
-
-/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user)
- . = ..()
- if(!.)
- return
- adjustBruteLoss(5 + rand(1,9))
- new /datum/forced_movement(src, get_step_away(user,src, 30), 1)
-
-/mob/living/carbon/alien/larva/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
- if(!no_effect && !visual_effect_icon)
- visual_effect_icon = ATTACK_EFFECT_BITE
- ..()
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
deleted file mode 100644
index 57ede2038e3..00000000000
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-/mob/living/carbon/alien/larva/Life()
- set invisibility = 0
- if (notransform)
- return
- if(..() && !IS_IN_STASIS(src)) //not dead and not in stasis
- // GROW!
- if(amount_grown < max_grown)
- amount_grown++
- update_icons()
-
-
-/mob/living/carbon/alien/larva/update_stat()
- if(status_flags & GODMODE)
- return
- if(stat != DEAD)
- if(health<= -maxHealth || !getorgan(/obj/item/organ/brain))
- death()
- return
- if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || health <= crit_threshold)
- if(stat == CONSCIOUS)
- stat = UNCONSCIOUS
- become_blind(UNCONSCIOUS_BLIND)
- update_mobility()
- else
- if(stat == UNCONSCIOUS)
- stat = CONSCIOUS
- cure_blind(UNCONSCIOUS_BLIND)
- set_resting(FALSE)
- update_damage_hud()
- update_health_hud()
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
deleted file mode 100644
index 0bf22c25dc2..00000000000
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ /dev/null
@@ -1,63 +0,0 @@
-/obj/effect/proc_holder/alien/hide
- name = "Hide"
- desc = ""
- plasma_cost = 0
-
- action_icon_state = "alien_hide"
-
-/obj/effect/proc_holder/alien/hide/fire(mob/living/carbon/alien/user)
- if(user.stat != CONSCIOUS)
- return
-
- if (user.layer != ABOVE_NORMAL_TURF_LAYER)
- user.layer = ABOVE_NORMAL_TURF_LAYER
- user.visible_message(span_name("[user] scurries to the ground!"), \
- span_noticealien("I are now hiding."))
- else
- user.layer = MOB_LAYER
- user.visible_message(span_notice("[user] slowly peeks up from the ground..."), \
- span_noticealien("I stop hiding."))
- return 1
-
-
-/obj/effect/proc_holder/alien/larva_evolve
- name = "Evolve"
- desc = ""
- plasma_cost = 0
-
- action_icon_state = "alien_evolve_larva"
-
-/obj/effect/proc_holder/alien/larva_evolve/fire(mob/living/carbon/alien/user)
- if(!islarva(user))
- return
- var/mob/living/carbon/alien/larva/L = user
-
- if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ?
- to_chat(user, span_warning("I cannot evolve when you are cuffed!"))
- return
-
- if(L.amount_grown >= L.max_grown) //TODO ~Carn
- to_chat(L, span_name("I are growing into a beautiful alien! It is time to choose a caste."))
- to_chat(L, span_info("There are three to choose from:"))
- to_chat(L, span_name("Hunters