diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 6e21fbe06a..da5981ff8a 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -123,7 +123,6 @@
#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations
#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT
-#define MIN_MELEE_STAMCOST 1.25 //Minimum cost for swinging items around. Will be extra useful when stats and skills are introduced.
#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 7cab82149d..e31d2a278e 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -183,4 +183,16 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define BODY_ZONE_PRECISE_R_FOOT "r_foot"
//We will round to this value in damage calculations.
-#define DAMAGE_PRECISION 0.1
\ No newline at end of file
+#define DAMAGE_PRECISION 0.1
+
+//items total mass, used to calculate their attacks' stamina costs. If not defined, the cost will be (w_class * 1.25)
+#define TOTAL_MASS_TINY_ITEM 1.25
+#define TOTAL_MASS_SMALL_ITEM 2.5
+#define TOTAL_MASS_NORMAL_ITEM 3.75
+#define TOTAL_MASS_BULKY_ITEM 5
+#define TOTAL_MASS_HUGE_ITEM 6.25
+#define TOTAL_MASS_GIGANTIC_ITEM 7.5
+
+#define TOTAL_MASS_HAND_REPLACEMENT 5 //standard punching stamina cost. most hand replacements are huge items anyway.
+#define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds.
+#define TOTAL_MASS_TOY_SWORD 1.5
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index 95a8a2c885..24d381d1a8 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -234,3 +234,6 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list(
/obj/item/tank/internals/emergency_oxygen,
/obj/item/tank/internals/plasmaman,
/obj/item/toy)))
+
+//Internals checker
+#define GET_INTERNAL_SLOTS(C) list(C.head, C.wear_mask)
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index 5c21fbbc71..01d95d7ff9 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -33,7 +33,7 @@
#define LAVAPROTECT (1<<0)
#define STOPSPRESSUREDAMAGE (1<<1) //SUIT and HEAD items which stop pressure damage. To stop you taking all pressure damage you must have both a suit and head item with this flag.
#define BLOCK_GAS_SMOKE_EFFECT (1<<2) // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
-#define MASKINTERNALS (1<<3) // mask allows internals
+#define ALLOWINTERNALS (1<<3) // mask allows internals
#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc
#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
#define VOICEBOX_TOGGLABLE (1<<6) // The voicebox in this clothing can be toggled.
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index bb9fc98b8e..3b32745b5c 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -136,7 +136,7 @@ GLOBAL_LIST_INIT(bitfields, list(
"LAVAPROTECT" = LAVAPROTECT,
"STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE,
"BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT,
- "MASKINTERNALS" = MASKINTERNALS,
+ "ALLOWINTERNALS" = ALLOWINTERNALS,
"NOSLIP" = NOSLIP,
"THICKMATERIAL" = THICKMATERIAL,
"VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE,
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 5ee4ae0f8a..4c666d708c 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -290,16 +290,19 @@
icon_state = "internal0"
else
if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- if(!istype(C.wear_mask, /obj/item/clothing/mask))
+ var/obj/item/clothing/check
+ var/internals = FALSE
+
+ for(check in GET_INTERNAL_SLOTS(C))
+ if(istype(check, /obj/item/clothing/mask))
+ var/obj/item/clothing/mask/M = check
+ if(M.mask_adjusted)
+ M.adjustmask(C)
+ if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
+ internals = TRUE
+ if(!internals)
to_chat(C, "You are not wearing an internals mask!")
- return 1
- else
- var/obj/item/clothing/mask/M = C.wear_mask
- if(M.mask_adjusted) // if mask on face but pushed down
- M.adjustmask(C) // adjust it back
- if( !(M.clothing_flags & MASKINTERNALS) )
- to_chat(C, "You are not wearing an internals mask!")
- return
+ return
var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank)
if(I)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 3896c3eac3..6455b4ccb6 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -171,3 +171,7 @@
if(prob(2))
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
return 1
+
+/obj/item/proc/getweight()
+ return total_mass || w_class * 1.25
+
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index f432e44b18..2f56c69384 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -87,17 +87,20 @@ SUBSYSTEM_DEF(vote)
/datum/controller/subsystem/vote/proc/announce_result()
var/list/winners = get_result()
var/text
+ var/was_roundtype_vote = mode == "roundtype"
if(winners.len > 0)
if(question)
text += "[question]"
else
text += "[capitalize(mode)] Vote"
- stored_gamemode_votes = list()
+ if(was_roundtype_vote)
+ stored_gamemode_votes = list()
for(var/i=1,i<=choices.len,i++)
var/votes = choices[choices[i]]
if(!votes)
votes = 0
- stored_gamemode_votes[choices[i]] = votes
+ if(was_roundtype_vote)
+ stored_gamemode_votes[choices[i]] = votes
text += "\n[choices[i]]: [obfuscated ? "???" : votes]" //CIT CHANGE - adds obfuscated votes
if(mode != "custom")
if(winners.len > 1 && !obfuscated) //CIT CHANGE - adds obfuscated votes
diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm
index 21adc944f6..f02b7f185f 100644
--- a/code/datums/mutations/speech.dm
+++ b/code/datums/mutations/speech.dm
@@ -91,32 +91,29 @@
message = replacetext(message," oh god "," cheese and crackers ")
message = replacetext(message," jesus "," gee wiz ")
message = replacetext(message," weak "," strong ")
- message = replacetext(message," kill "," hug ")
- message = replacetext(message," murder "," tease ")
+ message = replacetext(message," kill yourself "," hug ")
message = replacetext(message," ugly "," beautiful ")
message = replacetext(message," douchbag "," nice guy ")
message = replacetext(message," whore "," lady ")
- message = replacetext(message," nerd "," smart guy ")
+ message = replacetext(message," nerd "," smarty pants ")
message = replacetext(message," moron "," fun person ")
message = replacetext(message," IT'S LOOSE "," EVERYTHING IS FINE ")
message = replacetext(message," sex "," hug fight ")
message = replacetext(message," idiot "," genius ")
message = replacetext(message," fat "," thin ")
- message = replacetext(message," beer "," water with ice ")
- message = replacetext(message," drink "," water ")
+ message = replacetext(message," beer "," liquid bread ")
+ message = replacetext(message," drink "," liquid ")
message = replacetext(message," feminist "," empowered woman ")
- message = replacetext(message," i hate you "," you're mean ")
- message = replacetext(message," nigger "," african american ")
+ message = replacetext(message," i hate you "," you're a mean ")
message = replacetext(message," jew "," jewish ")
message = replacetext(message," shit "," shiz ")
message = replacetext(message," crap "," poo ")
message = replacetext(message," slut "," tease ")
message = replacetext(message," ass "," butt ")
message = replacetext(message," damn "," dang ")
- message = replacetext(message," fuck "," ")
message = replacetext(message," penis "," privates ")
message = replacetext(message," cunt "," privates ")
- message = replacetext(message," dick "," jerk ")
+ message = replacetext(message," dick "," privates ")
message = replacetext(message," vagina "," privates ")
speech_args[SPEECH_MESSAGE] = trim(message)
@@ -281,4 +278,4 @@
/datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner)
..()
owner.grant_language(/datum/language/common)
- owner.remove_language(/datum/language/beachbum)
\ No newline at end of file
+ owner.remove_language(/datum/language/beachbum)
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 73fdcd5e8b..c317cbba0d 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -44,7 +44,7 @@
table.computer = src
break
-/obj/machinery/computer/operating/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+/obj/machinery/computer/operating/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "operating_computer", name, 350, 470, master_ui, state)
@@ -125,4 +125,4 @@
. = TRUE
#undef MENU_OPERATION
-#undef MENU_SURGERIES
\ No newline at end of file
+#undef MENU_SURGERIES
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 8d0cfb95e8..4bce450359 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -45,8 +45,8 @@
/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = ARCADE_WEIGHT_TRICK,
/obj/item/hot_potato/harmless/toy = ARCADE_WEIGHT_RARE,
/obj/item/twohanded/dualsaber/toy = ARCADE_WEIGHT_RARE,
- /obj/item/twohanded/hypereutactic/toy = ARCADE_WEIGHT_RARE,
- /obj/item/twohanded/hypereutactic/toy/rainbow = ARCADE_WEIGHT_RARE,
+ /obj/item/twohanded/dualsaber/hypereutactic/toy = ARCADE_WEIGHT_RARE,
+ /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow = ARCADE_WEIGHT_RARE,
/obj/item/storage/box/snappops = ARCADE_WEIGHT_TRICK,
/obj/item/clothing/under/syndicate/tacticool = ARCADE_WEIGHT_TRICK,
@@ -57,6 +57,7 @@
/obj/item/stack/tile/fakespace/loaded = ARCADE_WEIGHT_TRICK,
/obj/item/stack/tile/fakepit/loaded = ARCADE_WEIGHT_TRICK,
/obj/item/restraints/handcuffs/fake = ARCADE_WEIGHT_TRICK,
+ /obj/item/clothing/gloves/rapid/hug = ARCADE_WEIGHT_TRICK,
/obj/item/grenade/chem_grenade/glitter/pink = ARCADE_WEIGHT_TRICK,
/obj/item/grenade/chem_grenade/glitter/blue = ARCADE_WEIGHT_TRICK,
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index bfa6b46134..1654768de0 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -1,4 +1,4 @@
-#define AUTOCLONING_MINIMAL_LEVEL 3
+#define AUTOCLONING_MINIMAL_LEVEL 4
/obj/machinery/computer/cloning
name = "cloning console"
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 64081a77e4..1f1f13ee22 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -68,16 +68,16 @@
if (ismovableatom(M))
if(do_teleport(M, com.target, channel = TELEPORT_CHANNEL_BLUESPACE))
use_power(5000)
- if(!calibrated && prob(30 - ((accurate) * 10))) //oh dear a problem
- log_game("[M] ([key_name(M)]) was turned into a fly person")
- if(ishuman(M))//don't remove people from the round randomly you jerks
- var/mob/living/carbon/human/human = M
- if(human.dna && human.dna.species.id == "human")
- to_chat(M, "You hear a buzzing in your ears.")
- human.set_species(/datum/species/fly)
- human.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), EFFECT_IRRADIATE, 0)
- calibrated = 0
+ if(!calibrated && iscarbon(M) && prob(30 - ((accurate) * 10))) //oh dear a problem
+ var/mob/living/carbon/C = M
+ if(C.dna?.species && C.dna.species.id != "fly" && !HAS_TRAIT(C, TRAIT_RADIMMUNE))
+ to_chat(C, "You hear a buzzing in your ears.")
+ C.set_species(/datum/species/fly)
+ log_game("[C] ([key_name(C)]) was turned into a fly person")
+ C.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), EFFECT_IRRADIATE, 0)
+
+ calibrated = FALSE
return
/obj/machinery/teleport/hub/update_icon()
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index 7896d7aa35..cd7051d074 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -20,3 +20,6 @@
..()
defense_action.Remove(user)
+/obj/mecha/combat/Initialize()
+ . = ..()
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 95137938d0..f9fa2544b8 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -63,3 +63,6 @@
..()
thrusters_action.Remove(user)
+/obj/mecha/combat/Initialize()
+ . = ..()
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index 125aecd667..4c32e9c367 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -154,4 +154,6 @@
color = color+pick(colors)
return color
-
+/obj/mecha/combat/Initialize()
+ . = ..()
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index f5f369c2ad..1264a647c4 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -28,3 +28,6 @@
switch_damtype_action.Remove(user)
phasing_action.Remove(user)
+/obj/mecha/combat/Initialize()
+ . = ..()
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 9498eec3da..18c9b3eb2f 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -109,7 +109,7 @@
var/obj/mecha/M = in_mecha()
if(M)
M.emp_act(EMP_HEAVY)
- addtimer(CALLBACK(src, /obj/item/mecha_parts/mecha_tracking/proc/recharge), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
+ addtimer(CALLBACK(src, /obj/item/mecha_parts/mecha_tracking/proc/recharge), 15 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
recharging = 1
/obj/item/mecha_parts/mecha_tracking/proc/recharge()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index e17fe20977..566a64577d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -33,6 +33,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/usesound = null
var/throwhitsound = null
var/w_class = WEIGHT_CLASS_NORMAL
+ var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds.
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
pass_flags = PASSTABLE
pressure_resistance = 4
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 36a92b3db9..a306b48385 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -164,21 +164,6 @@
/obj/item/restraints/handcuffs/cable/white
item_color = "white"
-/obj/item/restraints/handcuffs/alien
- icon_state = "handcuffAlien"
-
-/obj/item/restraints/handcuffs/fake
- name = "fake handcuffs"
- desc = "Fake handcuffs meant for gag purposes."
- breakouttime = 10 //Deciseconds = 1s
-
-/obj/item/restraints/handcuffs/fake/kinky
- name = "kinky handcuffs"
- desc = "Fake handcuffs meant for erotic roleplay."
- icon = 'modular_citadel/icons/obj/items_and_weapons.dmi'
- icon_state = "handcuffgag"
- item_state = "kinkycuff"
-
/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params)
..()
if(istype(I, /obj/item/stack/rods))
@@ -213,7 +198,6 @@
/obj/item/restraints/handcuffs/cable/zipties
name = "zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
- icon_state = "zipties"
item_state = "zipties"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
@@ -229,6 +213,21 @@
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
return
+/obj/item/restraints/handcuffs/alien
+ icon_state = "handcuffAlien"
+
+/obj/item/restraints/handcuffs/fake
+ name = "fake handcuffs"
+ desc = "Fake handcuffs meant for gag purposes."
+ breakouttime = 10 //Deciseconds = 1s
+
+/obj/item/restraints/handcuffs/fake/kinky
+ name = "kinky handcuffs"
+ desc = "Fake handcuffs meant for erotic roleplay."
+ icon = 'modular_citadel/icons/obj/items_and_weapons.dmi'
+ icon_state = "handcuffgag"
+ item_state = "kinkycuff"
+
//Legcuffs
/obj/item/restraints/legcuffs
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index 65a4bd542b..c6f246ab97 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -14,6 +14,7 @@
icon = 'icons/obj/items_and_weapons.dmi'
w_class = WEIGHT_CLASS_GIGANTIC
force = 12
+ total_mass = TOTAL_MASS_NORMAL_ITEM // average toolbox
attack_verb = list("robusted")
hitsound = 'sound/weapons/smash.ogg'
var/awakened = FALSE
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 0e8a9fef9e..ad4384f9f5 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -285,14 +285,12 @@
hitsound = 'sound/weapons/sear.ogg'
damtype = BURN
attack_verb = list("punched", "cross countered", "pummeled")
-
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/nullrod/godhand/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
-
-
/obj/item/nullrod/staff
icon_state = "godstaff-red"
item_state = "godstaff-red"
@@ -330,6 +328,7 @@
sharpness = IS_SHARP
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
@@ -523,6 +522,7 @@
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_HUGE
attack_verb = list("smashed", "bashed", "hammered", "crunched")
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/nullrod/chainsaw
name = "chainsaw hand"
@@ -536,6 +536,7 @@
sharpness = IS_SHARP
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg'
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/nullrod/chainsaw/Initialize()
. = ..()
@@ -612,6 +613,7 @@
item_flags = ABSTRACT
w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/nullrod/armblade/Initialize()
. = ..()
@@ -672,6 +674,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
item_flags = SLOWS_WHILE_IN_HAND
+ total_mass = TOTAL_MASS_NORMAL_ITEM
/obj/item/nullrod/tribal_knife/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 935d2a007e..d854ab9f5a 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -5,9 +5,12 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
var/brightness_on = 3
+ total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces.
+
/obj/item/melee/transforming/energy/Initialize()
. = ..()
+ total_mass_on = (total_mass_on ? total_mass_on : (w_class_on * 0.75))
if(active)
set_light(brightness_on)
START_PROCESSING(SSobj, src)
@@ -79,6 +82,7 @@
attack_verb_off = list("attacked", "chopped", "cleaved", "torn", "cut")
attack_verb_on = list()
light_color = "#40ceff"
+ total_mass = null
/obj/item/melee/transforming/energy/axe/suicide_act(mob/user)
user.visible_message("[user] swings [src] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index daeceb7f87..cdb9c146e2 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -44,6 +44,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "impaled", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/melee/synthetic_arm_blade/Initialize()
. = ..()
@@ -67,6 +68,7 @@
attack_verb = list("slashed", "cut")
hitsound = 'sound/weapons/rapierhit.ogg'
materials = list(MAT_METAL = 1000)
+ total_mass = 3.4
/obj/item/melee/sabre/Initialize()
. = ..()
@@ -155,6 +157,7 @@
w_class = WEIGHT_CLASS_BULKY
sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_-
attack_verb = list("slashed", "cut", "pierces", "pokes")
+ total_mass = 3.4
/obj/item/melee/rapier/Initialize()
. = ..()
@@ -242,6 +245,7 @@
item_flags = NONE
force = 0
on = FALSE
+ total_mass = TOTAL_MASS_SMALL_ITEM
/obj/item/melee/classic_baton/telescopic/suicide_act(mob/user)
var/mob/living/carbon/human/H = user
@@ -402,6 +406,7 @@
var/static/list/ovens
var/on = FALSE
var/datum/beam/beam
+ total_mass = 2.5
/obj/item/melee/roastingstick/Initialize()
. = ..()
diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm
index 0d39e6c847..aabb930bb2 100644
--- a/code/game/objects/items/melee/transforming.dm
+++ b/code/game/objects/items/melee/transforming.dm
@@ -13,6 +13,7 @@
var/list/nemesis_factions //Any mob with a faction that exists in this list will take bonus damage/effects
var/w_class_on = WEIGHT_CLASS_BULKY
var/clumsy_check = TRUE
+ var/total_mass_on //Total mass in ounces when transformed. Primarily for balance purposes. Don't think about it too hard.
/obj/item/melee/transforming/Initialize()
. = ..()
@@ -46,6 +47,7 @@
active = !active
if(active)
force = force_on
+ total_mass = total_mass_on
throwforce = throwforce_on
hitsound = hitsound_on
throw_speed = 4
@@ -62,6 +64,7 @@
attack_verb = attack_verb_off
icon_state = initial(icon_state)
w_class = initial(w_class)
+ total_mass = initial(total_mass)
if(is_sharp())
var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering)
BT.butchering_enabled = TRUE
@@ -84,4 +87,4 @@
/obj/item/melee/transforming/proc/clumsy_transform_effect(mob/living/user)
if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, "You accidentally cut yourself with [src], like a doofus!")
- user.take_bodypart_damage(5,5)
+ user.take_bodypart_damage(5,5)
\ No newline at end of file
diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm
index 1fe57d151f..b6559c9091 100644
--- a/code/game/objects/items/singularityhammer.dm
+++ b/code/game/objects/items/singularityhammer.dm
@@ -16,6 +16,7 @@
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
force_string = "LORD SINGULOTH HIMSELF"
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/twohanded/singularityhammer/New()
..()
@@ -84,6 +85,7 @@
throwforce = 30
throw_range = 7
w_class = WEIGHT_CLASS_HUGE
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/twohanded/mjollnir/proc/shock(mob/living/target)
target.Stun(60)
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 1245b7de94..d409e40575 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -23,7 +23,7 @@
toggle_internals(user)
/obj/item/tank/proc/toggle_internals(mob/user)
- var/mob/living/carbon/human/H = user
+ var/mob/living/carbon/H = user
if(!istype(H))
return
@@ -33,13 +33,19 @@
H.update_internals_hud_icon(0)
else
if(!H.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- if(!H.wear_mask)
- to_chat(H, "You need a mask!")
- return
- if(H.wear_mask.mask_adjusted)
- H.wear_mask.adjustmask(H)
- if(!(H.wear_mask.clothing_flags & MASKINTERNALS))
- to_chat(H, "[H.wear_mask] can't use [src]!")
+ var/obj/item/clothing/check
+ var/internals = FALSE
+
+ for(check in GET_INTERNAL_SLOTS(H))
+ if(istype(check, /obj/item/clothing/mask))
+ var/obj/item/clothing/mask/M = check
+ if(M.mask_adjusted)
+ M.adjustmask(H)
+ if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
+ internals = TRUE
+
+ if(!internals)
+ to_chat(H, "You are not wearing an internals mask!")
return
if(H.internal)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 9ac5261e5f..46fabea8b0 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -30,6 +30,7 @@
throw_speed = 3
throw_range = 7
force = 0
+ total_mass = TOTAL_MASS_TINY_ITEM
/*
@@ -112,10 +113,6 @@
/obj/item/toy/syndicateballoon
name = "syndicate balloon"
desc = "There is a tag on the back that reads \"FUK NT!11!\"."
- throwforce = 0
- throw_speed = 3
- throw_range = 7
- force = 0
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "syndballoon"
item_state = "syndballoon"
@@ -225,6 +222,8 @@
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
var/hacked = FALSE
+ total_mass = 0.4
+ var/total_mass_on = TOTAL_MASS_TOY_SWORD
/obj/item/toy/sword/attack_self(mob/user)
active = !( active )
@@ -274,6 +273,9 @@
else
return ..()
+/obj/item/toy/sword/getweight()
+ return (active ? total_mass_on : total_mass) || w_class *1.25
+
/*
* Foam armblade
*/
@@ -327,12 +329,13 @@
force_unwielded = 0
force_wielded = 0
attack_verb = list("attacked", "struck", "hit")
+ total_mass_on = TOTAL_MASS_TOY_SWORD
/obj/item/twohanded/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- return 0
+ return FALSE
/obj/item/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles
- return 0
+ return FALSE
/obj/item/toy/katana
name = "replica katana"
@@ -346,6 +349,7 @@
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
force = 5
throwforce = 5
+ total_mass = null
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
hitsound = 'sound/weapons/bladeslice.ogg'
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index bf63a96f05..781a82513e 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -28,6 +28,8 @@
var/force_wielded = 0
var/wieldsound = null
var/unwieldsound = null
+ var/slowdown_wielded = 0
+ item_flags = SLOWS_WHILE_IN_HAND
/obj/item/twohanded/proc/unwield(mob/living/carbon/user, show_message = TRUE)
if(!wielded || !user)
@@ -55,7 +57,7 @@
var/obj/item/twohanded/offhand/O = user.get_inactive_held_item()
if(O && istype(O))
O.unwield()
- return
+ slowdown -= slowdown_wielded
/obj/item/twohanded/proc/wield(mob/living/carbon/user)
if(wielded)
@@ -85,7 +87,7 @@
O.desc = "Your second grip on [src]."
O.wielded = TRUE
user.put_in_inactive_hand(O)
- return
+ slowdown += slowdown_wielded
/obj/item/twohanded/dropped(mob/user)
. = ..()
@@ -279,6 +281,7 @@
wieldsound = 'sound/weapons/saberon.ogg'
unwieldsound = 'sound/weapons/saberoff.ogg'
hitsound = "swing_hit"
+ var/hitsound_on = 'sound/weapons/blade1.ogg'
armour_penetration = 35
item_color = "green"
light_color = "#00ff00"//green
@@ -290,8 +293,10 @@
var/hacked = FALSE
var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
var/list/possible_colors = list("red", "blue", "green", "purple")
- total_mass = 0.375 //Survival flashlights typically weigh around 5 ounces.
- var/total_mass_on = 3.4 //The typical medieval sword, on the other hand, weighs roughly 3 pounds. //Values copied from the regular e-sword
+ var/list/rainbow_colors = list(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)
+ var/spinnable = TRUE
+ total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces.
+ var/total_mass_on = 3.4
/obj/item/twohanded/dualsaber/suicide_act(mob/living/carbon/user)
if(wielded)
@@ -353,7 +358,7 @@
if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40))
impale(user)
return
- if((wielded) && prob(50))
+ if(spinnable && (wielded) && prob(50))
INVOKE_ASYNC(src, .proc/jedi_spin, user)
/obj/item/twohanded/dualsaber/proc/jedi_spin(mob/living/user)
@@ -406,11 +411,14 @@
/obj/item/twohanded/dualsaber/process()
if(wielded)
if(hacked)
- light_color = pick(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)
+ rainbow_process()
open_flame()
else
STOP_PROCESSING(SSobj, src)
+/obj/item/twohanded/dualsaber/proc/rainbow_process()
+ light_color = pick(rainbow_colors)
+
/obj/item/twohanded/dualsaber/IsReflect()
if(wielded)
return 1
@@ -428,7 +436,8 @@
playsound(loc, hitsound, get_clamped_volume(), 1, -1)
add_fingerprint(user)
// Light your candles while spinning around the room
- INVOKE_ASYNC(src, .proc/jedi_spin, user)
+ if(spinnable)
+ INVOKE_ASYNC(src, .proc/jedi_spin, user)
/obj/item/twohanded/dualsaber/green
possible_colors = list("green")
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 48681c3d6d..560731edfd 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -69,6 +69,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/claymore/Initialize()
. = ..()
@@ -223,6 +224,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/katana/cursed
slot_flags = null
@@ -431,6 +433,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
sharpness = IS_SHARP
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg'
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/mounted_chainsaw/Initialize()
. = ..()
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 8dc560b936..cdca354563 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -79,4 +79,4 @@
var/n_color = input(H, "Choose your [garment_type]'\s color.", "Character Preference", default_color) as color|null
if(!n_color || !H.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return default_color
- return sanitize_hexcolor(n_color, include_crunch= TRUE)
+ return sanitize_hexcolor(n_color)
diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm
index 077eb25688..e3002a8fae 100644
--- a/code/game/objects/structures/femur_breaker.dm
+++ b/code/game/objects/structures/femur_breaker.dm
@@ -83,8 +83,9 @@
icon_state = "breaker_drop"
/obj/structure/femur_breaker/proc/damage_leg(mob/living/carbon/human/H)
- H.say("AAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHH!!", forced = "femur broken")
+ H.emote("scream")
H.apply_damage(150, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ H.adjustBruteLoss(rand(5,20) + (max(0, H.health))) //Make absolutely sure they end up in crit, so that they can succumb if they wish.
/obj/structure/femur_breaker/proc/raise_slat()
slat_status = BREAKER_SLAT_RAISED
@@ -171,4 +172,4 @@
#undef BREAKER_ACTIVATE_DELAY
#undef BREAKER_WRENCH_DELAY
#undef BREAKER_ACTION_INUSE
-#undef BREAKER_ACTION_WRENCH
\ No newline at end of file
+#undef BREAKER_ACTION_WRENCH
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 99d8ae797b..c428c56d45 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -161,11 +161,13 @@
throwforce = 0 //Just to be on the safe side
throw_range = 0
throw_speed = 0
+ armour_penetration = 20
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP
var/can_drop = FALSE
var/fake = FALSE
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic)
. = ..()
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
index 510c279f3c..6d6b1fa9d0 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
@@ -224,7 +224,7 @@
. = ..()
/datum/clockwork_scripture/abscond/scripture_effects()
- var/mob/living/pulled_mob = invoker.pulling && isliving(invoker.pulling) && get_clockwork_power(ABSCOND_ABDUCTION_COST)
+ var/mob/living/pulled_mob = (invoker.pulling && isliving(invoker.pulling) && get_clockwork_power(ABSCOND_ABDUCTION_COST)) ? invoker.pulling : null
var/turf/T
if(GLOB.ark_of_the_clockwork_justiciar)
T = get_step(GLOB.ark_of_the_clockwork_justiciar, SOUTH)
diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
index 4cf7c1ba60..56b36d13e6 100644
--- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
@@ -131,9 +131,7 @@
if(!M || !M.current)
continue
if(isliving(M.current) && M.current.stat != DEAD)
- var/turf/t_turf
- if(isAI(M.current))
- t_turf = isAI(M.current) ? get_step(get_step(src, NORTH),NORTH) : get_turf(src) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark.
+ var/turf/t_turf = isAI(M.current) ? get_step(get_step(src, NORTH),NORTH) : get_turf(src) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark.
do_teleport(M, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE)
M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
M.current.clear_fullscreen("flash", 5)
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index dc2c29eb6d..25e3663c0b 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -105,7 +105,6 @@
inhand_x_dimension = 64
inhand_y_dimension = 64
actions_types = list()
- item_flags = SLOWS_WHILE_IN_HAND
var/datum/action/innate/dash/cult/jaunt
var/datum/action/innate/cult/spin2win/linked_action
var/spinning = FALSE
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index bbab86729b..a69694ced9 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -433,12 +433,12 @@ structure_check() searches for nearby cultist structures required for the invoca
continue
if(!A.anchored)
movedsomething = TRUE
- if(do_teleport(A, T, forceMove = TRUE, channel = TELEPORT_CHANNEL_CULT))
+ if(do_teleport(A, target, forceMove = TRUE, channel = TELEPORT_CHANNEL_CULT))
movesuccess = TRUE
if(movedsomething)
..()
if(moveuserlater)
- if(do_teleport(user, T, channel = TELEPORT_CHANNEL_CULT))
+ if(do_teleport(user, target, channel = TELEPORT_CHANNEL_CULT))
movesuccess = TRUE
if(movesuccess)
visible_message("There is a sharp crack of inrushing air, and everything above the rune disappears!", null, "You hear a sharp crack.")
diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm
index b274283621..edae8a4240 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm
@@ -5,6 +5,7 @@
#define CHALLENGE_SHUTTLE_DELAY 15000 // 25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
GLOBAL_LIST_EMPTY(jam_on_wardec)
+GLOBAL_VAR_INIT(war_declared, FALSE)
/obj/item/nuclear_challenge
name = "Declaration of War (Challenge Mode)"
@@ -61,11 +62,13 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec)
D.jammed = TRUE
-
+
+ GLOB.war_declared = TRUE
var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop)
var/actual_players = GLOB.joined_player_list.len - nukeops.len
new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS + CEILING(PLAYER_SCALING * actual_players, 1))
+
CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY))
SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1)
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index ade5458765..add3c1d9b0 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -373,6 +373,11 @@
S.switch_mode_to(TRACK_INFILTRATOR)
countdown.start()
set_security_level("delta")
+
+ if(GLOB.war_declared)
+ var/area/A = get_area(src)
+ priority_announce("Alert: Unexpected increase in radiation levels near [A.name] ([src.x],[src.y],[src.z]). Please send an authorized radiation specialist to investigate.", "Sensory Nuclear Indexer Telemetry Calculation Helper")
+
else
detonation_timer = null
set_security_level(previous_level)
diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
index 051bf74705..f2e6566e8f 100644
--- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm
+++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
@@ -244,10 +244,12 @@
to_chat(owner.current, "Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.")
to_chat(owner.current, "Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.")
to_chat(owner.current, " You have been provided with a standard uplink to accomplish your task. ")
+ to_chat(owner.current, "By no means reveal that you, or any other NT employees, are undercover agents.")
else
to_chat(owner.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.")
to_chat(owner.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.")
to_chat(owner.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.")
+ to_chat(owner.current, "By no means reveal that you, or any other NT employees, are undercover agents.")
to_chat(owner.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.")
owner.announce_objectives()
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index fcfdd7c455..84f08197b4 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -24,7 +24,6 @@
armour_penetration = 1000
resistance_flags = INDESTRUCTIBLE
anchored = TRUE
- item_flags = SLOWS_WHILE_IN_HAND
var/team = WHITE_TEAM
var/reset_cooldown = 0
var/anyonecanpickup = TRUE
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 4ab8b36d8c..4cf7c0178b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -72,11 +72,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/gender = MALE //gender of character (well duh)
var/age = 30 //age of character
var/underwear = "Nude" //underwear type
- var/undie_color = "#FFFFFF"
+ var/undie_color = "FFF"
var/undershirt = "Nude" //undershirt type
- var/shirt_color = "#FFFFFF"
+ var/shirt_color = "FFF"
var/socks = "Nude" //socks type
- var/socks_color = "#FFFFFF"
+ var/socks_color = "FFF"
var/backbag = DBACKPACK //backpack type
var/jumpsuit_style = PREF_SUIT //suit/skirt
var/hair_style = "Bald" //Hair type
@@ -1534,7 +1534,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("undie_color")
var/n_undie_color = input(user, "Choose your underwear's color.", "Character Preference", undie_color) as color|null
if(n_undie_color)
- undie_color = sanitize_hexcolor(n_undie_color, include_crunch= TRUE)
+ undie_color = sanitize_hexcolor(n_undie_color)
if("undershirt")
var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in GLOB.undershirt_list
@@ -1544,7 +1544,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("shirt_color")
var/n_shirt_color = input(user, "Choose your undershirt's color.", "Character Preference", shirt_color) as color|null
if(n_shirt_color)
- shirt_color = sanitize_hexcolor(n_shirt_color, include_crunch= TRUE)
+ shirt_color = sanitize_hexcolor(n_shirt_color)
if("socks")
var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in GLOB.socks_list
@@ -1554,7 +1554,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("socks_color")
var/n_socks_color = input(user, "Choose your socks' color.", "Character Preference", socks_color) as color|null
if(n_socks_color)
- socks_color = sanitize_hexcolor(n_socks_color, include_crunch= TRUE)
+ socks_color = sanitize_hexcolor(n_socks_color)
if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 04a8e17b7b..775bbabdfd 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -437,7 +437,7 @@
item_state = "gas_alt"
resistance_flags = NONE
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index bc36353ac5..1af24f8e61 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -72,9 +72,30 @@
M.adjustStaminaLoss(-2) //Restore 2/3 of the stamina used assuming empty stam buffer. With proper stamina buffer management, this results in a net gain of +.5 stamina per click.
if(warcry)
M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry")
+
.= FALSE
+
/obj/item/clothing/gloves/rapid/attack_self(mob/user)
var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7)
if(input)
warcry = input
+
+/obj/item/clothing/gloves/rapid/hug
+ name = "Hugs of the North Star"
+ desc = "Just looking at these fills you with an urge to hug the shit out of people"
+ warcry = "owo" //Shouldn't ever come into play
+
+/obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE)
+ var/mob/living/M = loc
+
+ if(M.a_intent == INTENT_HELP)
+ if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead
+ if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions
+ return
+ else
+ M.changeNext_move(CLICK_CD_RAPID)
+ . = FALSE
+
+/obj/item/clothing/gloves/rapid/hug/attack_self(mob/user)
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index ed0ef27174..947aa048c4 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -4,8 +4,8 @@
icon_state = "breath"
item_state = "m_mask"
body_parts_covered = 0
- clothing_flags = MASKINTERNALS
- visor_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
+ visor_flags = ALLOWINTERNALS
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.1
permeability_coefficient = 0.5
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index bcf3064c49..c613d1a91e 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -2,7 +2,7 @@
name = "gas mask"
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
icon_state = "gas_alt"
- clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
w_class = WEIGHT_CLASS_NORMAL
item_state = "gas_alt"
@@ -59,7 +59,7 @@
/obj/item/clothing/mask/gas/clown_hat
name = "clown wig and mask"
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "clown"
item_state = "clown_hat"
flags_cover = MASKCOVERSEYES
@@ -91,7 +91,7 @@
/obj/item/clothing/mask/gas/sexyclown
name = "sexy-clown wig and mask"
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "sexyclown"
item_state = "sexyclown"
flags_cover = MASKCOVERSEYES
@@ -100,7 +100,7 @@
/obj/item/clothing/mask/gas/mime
name = "mime mask"
desc = "The traditional mime's mask. It has an eerie facial posture."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "mime"
item_state = "mime"
flags_cover = MASKCOVERSEYES
@@ -132,7 +132,7 @@
/obj/item/clothing/mask/gas/monkeymask
name = "monkey mask"
desc = "A mask used when acting as a monkey."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "monkeymask"
item_state = "monkeymask"
flags_cover = MASKCOVERSEYES
@@ -141,7 +141,7 @@
/obj/item/clothing/mask/gas/sexymime
name = "sexy mime mask"
desc = "A traditional female mime's mask."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "sexymime"
item_state = "sexymime"
flags_cover = MASKCOVERSEYES
@@ -162,7 +162,7 @@
name = "owl mask"
desc = "Twoooo!"
icon_state = "owl"
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
flags_cover = MASKCOVERSEYES
resistance_flags = FLAMMABLE
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index 8860650fbc..f004f07bf5 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -7,10 +7,10 @@
actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust)
icon_state = "sechailer"
item_state = "sechailer"
- clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
flags_inv = HIDEFACIALHAIR|HIDEFACE
w_class = WEIGHT_CLASS_SMALL
- visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
visor_flags_inv = HIDEFACE
flags_cover = MASKCOVERSMOUTH
visor_flags_cover = MASKCOVERSMOUTH
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index 9d3918ed84..662a91c80c 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -4,7 +4,7 @@
name = "space helmet"
icon_state = "spaceold"
desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays."
- clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
+ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
item_state = "spaceold"
permeability_coefficient = 0.01
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index 798bcf82dd..af22ae3b96 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -15,6 +15,12 @@
var/list/wave_type
var/wave_name = "normal"
+/datum/round_event/meteor_wave/setup()
+ announceWhen = 1
+ startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
+ endWhen = startWhen + 60
+
+
/datum/round_event/meteor_wave/New()
..()
if(!wave_type)
@@ -46,7 +52,7 @@
kill()
/datum/round_event/meteor_wave/announce(fake)
- priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg')
+ priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.", "Meteor Alert", 'sound/ai/meteors.ogg')
/datum/round_event/meteor_wave/tick()
if(ISMULTIPLE(activeFor, 3))
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index e36efe750b..c4b9451c7f 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -573,4 +573,14 @@
name = "Maintenance Peaches"
desc = "I have a mouth and I must eat."
icon_state = "peachcanmaint"
- tastes = list("peaches" = 1, "tin" = 7)
\ No newline at end of file
+ tastes = list("peaches" = 1, "tin" = 7)
+
+/obj/item/reagent_containers/food/snacks/chocolatestrawberry
+ name = "Chocolate dipped strawberries"
+ desc = "A strawberry dipped in a bit of chocolate."
+ icon_state = "chocolatestrawberry"
+ list_reagents = list("sugar" = 5, "nutriment" = 2)
+ filling_color = "#ffdf26"
+ w_class = WEIGHT_CLASS_NORMAL
+ tastes = list("strawberries" = 5, "chocolate" = 3)
+ foodtype = FRUIT | SUGAR
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index 238bb4f86a..9b87002738 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -308,7 +308,6 @@
tastes = list("bread" = 1, "egg" = 1, "cheese" = 1)
foodtype = GRAIN | MEAT | DAIRY
-
/obj/item/reagent_containers/food/snacks/sugarcookie
name = "sugar cookie"
desc = "Just like your little sister used to make."
@@ -369,6 +368,16 @@
tastes = list("cake" = 3, "blue cherry" = 1)
foodtype = GRAIN | FRUIT | SUGAR
+/obj/item/reagent_containers/food/snacks/strawberrycupcake
+ name = "Strawberry cupcake"
+ desc = "Strawberry inside a delicious cupcake."
+ icon_state = "strawberrycupcake"
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
+ list_reagents = list("nutriment" = 5, "vitamin" = 1)
+ filling_color = "#F0E68C"
+ tastes = list("cake" = 2, "strawberry" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
+
/obj/item/reagent_containers/food/snacks/honeybun
name = "honey bun"
desc = "A sticky pastry bun glazed with honey."
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index 20313fd1b7..be6c11fd68 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -315,4 +315,12 @@
filling_color = "#1E90FF"
list_reagents = list("nutriment" = 2, "vitamin" = 4)
tastes = list("nuts" = 1, "pie" = 1)
- foodtype = GRAIN
\ No newline at end of file
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/pie/strawberrypie
+ name = "strawberry pie"
+ desc = "A strawberry.pie."
+ icon_state = "strawberrypie"
+ bonus_reagents = list("nutriment" = 6, "vitamin" = 6)
+ tastes = list("strawberry" = 1, "pie" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index ce33cbef77..71ba5dfe41 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -332,3 +332,12 @@
)
result = /obj/item/reagent_containers/food/snacks/riceball
subcategory = CAT_MISCFOOD
+
+/datum/crafting_recipe/food/chocolatestrawberry
+ name = "Chocolate Strawberry"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /obj/item/reagent_containers/food/snacks/grown/strawberries = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/chocolatestrawberry
+ subcategory = CAT_MISCFOOD
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index 2246d12df4..f3675ccb0d 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -325,6 +325,15 @@ datum/crafting_recipe/food/donut/meat
result = /obj/item/reagent_containers/food/snacks/bluecherrycupcake
subcategory = CAT_PASTRY
+/datum/crafting_recipe/food/strawberrycupcake
+ name = "Strawberry cherry cupcake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/strawberries = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/strawberrycupcake
+ subcategory = CAT_PASTRY
+
/datum/crafting_recipe/food/honeybun
name = "Honey bun"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
index 39eb4ce05e..a0a225c44f 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
@@ -160,6 +160,15 @@
result = /obj/item/reagent_containers/food/snacks/pie/frostypie
subcategory = CAT_PIE
+/datum/crafting_recipe/food/strawberrypie
+ name = "Strawberry pie"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/strawberries = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/strawberrypie
+ subcategory = CAT_PIE
+
/datum/crafting_recipe/food/baklava
name = "Baklava pie"
reqs = list(
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
index 19abdacf3a..f106a0dfe0 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -215,3 +215,22 @@
filling_color = "#7FFF00"
tastes = list("green grape" = 1)
distill_reagent = "cognac"
+
+// Strawberry
+/obj/item/seeds/strawberries
+ name = "pack of green grape seeds"
+ desc = "These seeds grow into strawberries vines."
+ icon_state = "seed-strawberry"
+ species = "strawberry"
+ plantname = "Strawberry Vine"
+ product = /obj/item/reagent_containers/food/snacks/grown/strawberries
+ reagents_add = list("vitamin" = 0.07, "nutriment" = 0.1, "sugar" = 0.1)
+ mutatelist = list()
+
+/obj/item/reagent_containers/food/snacks/grown/strawberries
+ seed = /obj/item/seeds/strawberries
+ name = "strawberry"
+ icon_state = "strawberries"
+ filling_color = "#7FFF00"
+ tastes = list("strawberries" = 1)
+ wine_power = 20
\ No newline at end of file
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 2c35c3148f..23ec02976d 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -43,7 +43,7 @@
name = "explorer gas mask"
desc = "A military-grade gas mask that can be connected to an air supply."
icon_state = "gas_mining"
- visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
visor_flags_inv = HIDEFACIALHAIR
visor_flags_cover = MASKCOVERSMOUTH
actions_types = list(/datum/action/item_action/adjust)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index abcb6d5911..7add723a06 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -641,6 +641,8 @@
nemesis_factions = list("mining", "boss")
var/transform_cooldown
var/swiping = FALSE
+ total_mass = 2.75
+ total_mass_on = 5
/obj/item/melee/transforming/cleaving_saw/examine(mob/user)
..()
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index c2c8904aa1..96e7c4310b 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -15,7 +15,7 @@
icon_state = "facehugger"
item_state = "facehugger"
w_class = WEIGHT_CLASS_TINY //note: can be picked up by aliens unlike most other items of w_class below 4
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
throw_range = 5
tint = 3
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 72d1d7392b..b53655ca7c 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -239,7 +239,7 @@
if(href_list["internal"])
var/slot = text2num(href_list["internal"])
var/obj/item/ITEM = get_item_by_slot(slot)
- if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & MASKINTERNALS))
+ if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS))
visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].", \
"[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].")
if(do_mob(usr, src, POCKET_STRIP_DELAY))
@@ -247,7 +247,7 @@
internal = null
update_internals_hud_icon(0)
else if(ITEM && istype(ITEM, /obj/item/tank))
- if((wear_mask && (wear_mask.clothing_flags & MASKINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE))
+ if((wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE))
internal = ITEM
update_internals_hud_icon(1)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 076b8efb66..9abfc5826f 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -500,7 +500,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(B)
var/mutable_appearance/MA = mutable_appearance(B.icon, B.icon_state, -BODY_LAYER)
if(UNDIE_COLORABLE(B))
- MA.color = H.undie_color
+ MA.color = "#[H.undie_color]"
standing += MA
if(H.undershirt)
@@ -516,7 +516,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
MA = mutable_appearance(T.icon, T.icon_state, -BODY_LAYER)
if(UNDIE_COLORABLE(T))
- MA.color = H.shirt_color
+ MA.color = "#[H.shirt_color]"
standing += MA
if(H.socks && H.get_num_legs(FALSE) >= 2)
@@ -529,7 +529,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/digilegs = (DIGITIGRADE in species_traits) ? "_d" : ""
var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER)
if(UNDIE_COLORABLE(S))
- MA.color = H.socks_color
+ MA.color = "[H.socks_color]"
standing += MA
if(standing.len)
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 11a25cea6c..754c48c3bd 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -174,6 +174,7 @@
item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/light_eater/Initialize()
. = ..()
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 6c17e17ca8..f0144e022d 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -308,11 +308,17 @@
return
/mob/living/carbon/proc/get_breath_from_internal(volume_needed)
+ var/obj/item/clothing/check
+ var/internals = FALSE
+
+ for(check in GET_INTERNAL_SLOTS(src))
+ if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
+ internals = TRUE
if(internal)
if(internal.loc != src)
internal = null
update_internals_hud_icon(0)
- else if ((!wear_mask || !(wear_mask.clothing_flags & MASKINTERNALS)) && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
+ else if (!internals && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
internal = null
update_internals_hud_icon(0)
else
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 44c2508894..5662f25993 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -187,7 +187,7 @@
clear_alert("legcuffed")
if(legcuffed)
var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER)
- legcuffs.color = handcuffed.color
+ legcuffs.color = legcuffed.color
overlays_standing[HANDCUFF_LAYER] = legcuffs
apply_overlay(LEGCUFF_LAYER)
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 1a918766b6..73274dcfaf 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
var/list/guardian_overlays[GUARDIAN_TOTAL_LAYERS]
var/reset = 0 //if the summoner has reset the guardian already
var/cooldown = 0
- var/mob/living/summoner
+ var/mob/living/carbon/summoner
var/range = 10 //how far from the user the spirit can be
var/toggle_button_type = /obj/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses
var/datum/guardianname/namedatum = new/datum/guardianname()
@@ -149,6 +149,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
death(TRUE)
qdel(src)
snapback()
+ if(HAS_TRAIT(summoner, TRAIT_NODEATH) && (istype(summoner.wear_neck, /obj/item/clothing/neck/necklace/memento_mori)))
+ REMOVE_TRAIT(summoner, TRAIT_NODEATH, "memento_mori")
+ to_chat(summoner,"You feel incredibly vulnerable as the memento mori pulls your life force in one too many directions!")
/mob/living/simple_animal/hostile/guardian/Stat()
..()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 84f0df3cc7..c64702f9ef 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -116,17 +116,19 @@
// vision_distance (optional) define how many tiles away the message can be seen.
// ignored_mob (optional) doesn't show any message to a given mob if TRUE.
-/atom/proc/visible_message(message, self_message, blind_message, vision_distance, ignored_mob, no_ghosts = FALSE)
+/atom/proc/visible_message(message, self_message, blind_message, vision_distance, list/ignored_mobs, no_ghosts = FALSE)
var/turf/T = get_turf(src)
if(!T)
return
+ if(!islist(ignored_mobs))
+ ignored_mobs = list(ignored_mobs)
var/range = 7
if(vision_distance)
range = vision_distance
for(var/mob/M in get_hearers_in_view(range, src))
if(!M.client)
continue
- if(M == ignored_mob)
+ if(M in ignored_mobs)
continue
var/msg = message
if(isobserver(M) && no_ghosts)
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index 53857b214c..4753abff97 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -15,6 +15,7 @@
recharge_rate = 1
ammo_type = /obj/item/ammo_casing/magic/bloodchill
fire_sound = 'sound/effects/attackblob.ogg'
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/gun/magic/bloodchill/Initialize()
. = ..()
diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm
index f4b23c89b1..99902ff6d6 100644
--- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm
+++ b/code/modules/surgery/advanced/bioware/nerve_grounding.dm
@@ -17,10 +17,14 @@
time = 155
/datum/surgery_step/ground_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] starts splicing together [target]'s nerves.", "You start splicing together [target]'s nerves.")
+ display_results(user, target, "You start rerouting [target]'s nerves.",
+ "[user] starts rerouting [target]'s nerves.",
+ "[user] starts manipulating [target]'s nervous system.")
/datum/surgery_step/ground_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully splices [target]'s nervous system!", "You successfully splice [target]'s nervous system!")
+ display_results(user, target, "You successfully reroute [target]'s nervous system!",
+ "[user] successfully reroutes [target]'s nervous system!",
+ "[user] finishes manipulating [target]'s nervous system.")
new /datum/bioware/grounded_nerves(target)
return TRUE
@@ -37,4 +41,4 @@
/datum/bioware/grounded_nerves/on_lose()
..()
- owner.physiology.siemens_coeff = prev_coeff
\ No newline at end of file
+ owner.physiology.siemens_coeff = prev_coeff
diff --git a/code/modules/surgery/advanced/bioware/nerve_splicing.dm b/code/modules/surgery/advanced/bioware/nerve_splicing.dm
index 6192786cc4..e6e66e1b6e 100644
--- a/code/modules/surgery/advanced/bioware/nerve_splicing.dm
+++ b/code/modules/surgery/advanced/bioware/nerve_splicing.dm
@@ -10,17 +10,20 @@
/datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
bioware_target = BIOWARE_NERVES
-
/datum/surgery_step/splice_nerves
name = "splice nerves"
accept_hand = TRUE
time = 155
/datum/surgery_step/splice_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] starts splicing together [target]'s nerves.", "You start splicing together [target]'s nerves.")
+ display_results(user, target, "You start splicing together [target]'s nerves.",
+ "[user] starts splicing together [target]'s nerves.",
+ "[user] starts manipulating [target]'s nervous system.")
/datum/surgery_step/splice_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully splices [target]'s nervous system!", "You successfully splice [target]'s nervous system!")
+ display_results(user, target, "You successfully splice [target]'s nervous system!",
+ "[user] successfully splices [target]'s nervous system!",
+ "[user] finishes manipulating [target]'s nervous system.")
new /datum/bioware/spliced_nerves(target)
return TRUE
@@ -28,11 +31,9 @@
name = "Spliced Nerves"
desc = "Nerves are connected to each other multiple times, greatly reducing the impact of stunning effects."
mod_type = BIOWARE_NERVES
-
/datum/bioware/spliced_nerves/on_gain()
..()
owner.physiology.stun_mod *= 0.5
-
/datum/bioware/spliced_nerves/on_lose()
..()
- owner.physiology.stun_mod *= 2
\ No newline at end of file
+ owner.physiology.stun_mod *= 2
diff --git a/code/modules/surgery/advanced/bioware/vein_threading.dm b/code/modules/surgery/advanced/bioware/vein_threading.dm
index 7a03833c51..fc0868c116 100644
--- a/code/modules/surgery/advanced/bioware/vein_threading.dm
+++ b/code/modules/surgery/advanced/bioware/vein_threading.dm
@@ -10,17 +10,20 @@
/datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
bioware_target = BIOWARE_CIRCULATION
-
/datum/surgery_step/thread_veins
name = "thread veins"
accept_hand = TRUE
time = 125
/datum/surgery_step/thread_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] starts weaving [target]'s circulatory system.", "You start weaving [target]'s circulatory system.")
+ display_results(user, target, "You start weaving [target]'s circulatory system.",
+ "[user] starts weaving [target]'s circulatory system.",
+ "[user] starts manipulating [target]'s circulatory system.")
/datum/surgery_step/thread_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] weaves [target]'s circulatory system into a resistant mesh!", "You weave [target]'s circulatory system into a resistant mesh!")
+ display_results(user, target, "You weave [target]'s circulatory system into a resistant mesh!",
+ "[user] weaves [target]'s circulatory system into a resistant mesh!",
+ "[user] finishes manipulating [target]'s circulatory system.")
new /datum/bioware/threaded_veins(target)
return TRUE
@@ -28,11 +31,9 @@
name = "Threaded Veins"
desc = "The circulatory system is woven into a mesh, severely reducing the amount of blood lost from wounds."
mod_type = BIOWARE_CIRCULATION
-
/datum/bioware/threaded_veins/on_gain()
..()
owner.physiology.bleed_mod *= 0.25
-
/datum/bioware/threaded_veins/on_lose()
..()
- owner.physiology.bleed_mod *= 4
\ No newline at end of file
+ owner.physiology.bleed_mod *= 4
diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm
index 23783f1bf2..730a912189 100644
--- a/code/modules/surgery/advanced/brainwashing.dm
+++ b/code/modules/surgery/advanced/brainwashing.dm
@@ -2,7 +2,6 @@
name = "Brainwashing Surgery Disk"
desc = "The disk provides instructions on how to impress an order on a brain, making it the primary objective of the patient."
surgeries = list(/datum/surgery/advanced/brainwashing)
-
/datum/surgery/advanced/brainwashing
name = "Brainwashing"
desc = "A surgical procedure which directly implants a directive into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant."
@@ -13,10 +12,9 @@
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/brainwash,
/datum/surgery_step/close)
-
+
species = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_HEAD)
-
/datum/surgery/advanced/brainwashing/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
@@ -24,27 +22,29 @@
if(!B)
return FALSE
return TRUE
-
/datum/surgery_step/brainwash
name = "brainwash"
implements = list(/obj/item/hemostat = 85, TOOL_WIRECUTTER = 50, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15)
time = 200
var/objective
-
/datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
objective = stripped_input(user, "Choose the objective to imprint on your victim's brain.", "Brainwashing", null, MAX_MESSAGE_LEN)
if(!objective)
return -1
- user.visible_message("[user] begins to tinker with [target]'s brain.", "You begin to brainwash [target]...")
+ display_results(user, target, "You begin to brainwash [target]...",
+ "[user] begins to fix [target]'s brain.",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(!target.mind)
- user.visible_message("[target] doesn't respond to the brainwashing, as if [target.p_they()] lacked a mind...")
+ to_chat(user, "[target] doesn't respond to the brainwashing, as if [target.p_they()] lacked a mind...")
return FALSE
if(HAS_TRAIT(target, TRAIT_MINDSHIELD))
- user.visible_message("You hear a faint buzzing from a device inside [target]'s brain, and the brainwashing is erased.")
+ to_chat(user, "You hear a faint buzzing from a device inside [target]'s brain, and the brainwashing is erased.")
return FALSE
- user.visible_message("[user] successfully brainwashes [target]!", "You succeed in brainwashing [target].")
+ display_results(user, target, "You succeed in brainwashing [target].",
+ "[user] successfully fixes [target]'s brain!",
+ "[user] completes the surgery on [target]'s brain.")
to_chat(target, "A new compulsion fills your mind... you feel forced to obey it!")
brainwash(target, objective)
message_admins("[ADMIN_LOOKUPFLW(user)] surgically brainwashed [ADMIN_LOOKUPFLW(target)] with the objective '[objective]'.")
@@ -53,8 +53,10 @@
/datum/surgery_step/brainwash/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(target.getorganslot(ORGAN_SLOT_BRAIN))
- user.visible_message("[user] damages some brain tissue!", "You bruise some brain tissue!")
+ display_results(user, target, "You screw up, bruising the brain tissue!",
+ "[user] screws up, causing brain damage!",
+ "[user] completes the surgery on [target]'s brain.")
target.adjustBrainLoss(40)
else
user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the brain you were working on is not there anymore.")
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm
index f74346b193..1c09f5f7da 100644
--- a/code/modules/surgery/advanced/lobotomy.dm
+++ b/code/modules/surgery/advanced/lobotomy.dm
@@ -12,7 +12,6 @@
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
/datum/surgery/advanced/lobotomy/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
@@ -20,23 +19,25 @@
if(!B)
return FALSE
return TRUE
-
/datum/surgery_step/lobotomize
name = "perform lobotomy"
implements = list(/obj/item/scalpel = 85, /obj/item/melee/transforming/energy/sword = 55, /obj/item/kitchen/knife = 35,
/obj/item/shard = 25, /obj/item = 20)
time = 100
-
/datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool)
if(implement_type == /obj/item && !tool.is_sharp())
return FALSE
return TRUE
/datum/surgery_step/lobotomize/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to cut a piece of [target]'s brain.", "You begin to cut a piece of [target]'s brain...")
+ display_results(user, target, "You begin to perform a lobotomy on [target]'s brain...",
+ "[user] begins to perform a lobotomy on [target]'s brain.",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully lobotomizes [target]!", "You succeed in lobotomizing [target].")
+ display_results(user, target, "You succeed in lobotomizing [target].",
+ "[user] successfully lobotomizes [target]!",
+ "[user] completes the surgery on [target]'s brain.")
target.cure_all_traumas(TRAUMA_RESILIENCE_LOBOTOMY)
if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed))
target.mind.remove_antag_datum(/datum/antagonist/brainwashed)
@@ -51,7 +52,9 @@
/datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(target.getorganslot(ORGAN_SLOT_BRAIN))
- user.visible_message("[user] removes the wrong part, causing more damage!", "You remove the wrong part, causing more damage!")
+ display_results(user, target, "You remove the wrong part, causing more damage!",
+ "[user] successfully lobotomizes [target]!",
+ "[user] completes the surgery on [target]'s brain.")
target.adjustBrainLoss(80)
switch(rand(1,3))
if(1)
@@ -62,4 +65,4 @@
target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC)
else
user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the brain you were working on is not there anymore.")
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm
index a88bb51b31..8c57930252 100644
--- a/code/modules/surgery/advanced/necrotic_revival.dm
+++ b/code/modules/surgery/advanced/necrotic_revival.dm
@@ -7,9 +7,7 @@
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/bionecrosis,
/datum/surgery_step/close)
-
possible_locs = list(BODY_ZONE_HEAD)
-
/datum/surgery/advanced/necrotic_revival/can_start(mob/user, mob/living/carbon/target)
. = ..()
var/obj/item/organ/zombie_infection/ZI = target.getorganslot(ORGAN_SLOT_ZOMBIE)
@@ -19,16 +17,21 @@
/datum/surgery_step/bionecrosis
name = "start bionecrosis"
implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
+ implements = list(/obj/item/reagent_containers/syringe = 100, /obj/item/pen = 30)
time = 50
chems_needed = list("zombiepowder", "rezadone")
require_all_chems = FALSE
/datum/surgery_step/bionecrosis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to stimulate [target]'s brain.", "You begin to stimulate [target]'s brain...")
+ display_results(user, target, "You begin to grow a romerol tumor on [target]'s brain...",
+ "[user] begins to tinker with [target]'s brain...",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully grows a necrotic tumor on [target]'s brain!", "You succeed in growing a necrotic tumor on [target]'s brain.")
+ display_results(user, target, "You succeed in growing a romerol tumor on [target]'s brain.",
+ "[user] successfully grows a romerol tumor on [target]'s brain!",
+ "[user] completes the surgery on [target]'s brain.")
if(!target.getorganslot(ORGAN_SLOT_ZOMBIE))
var/obj/item/organ/zombie_infection/ZI = new()
ZI.Insert(target)
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm
index 15e34d003c..d5585d71a8 100644
--- a/code/modules/surgery/advanced/pacification.dm
+++ b/code/modules/surgery/advanced/pacification.dm
@@ -7,31 +7,34 @@
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/pacify,
/datum/surgery_step/close)
-
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
/datum/surgery/advanced/pacify/can_start(mob/user, mob/living/carbon/target)
. = ..()
var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN)
if(!B)
return FALSE
-
/datum/surgery_step/pacify
name = "rewire brain"
implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
time = 40
/datum/surgery_step/pacify/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to reshape [target]'s brain.", "You begin to reshape [target]'s brain...")
+ display_results(user, target, "You begin to pacify [target]...",
+ "[user] begins to fix [target]'s brain.",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/pacify/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] reshapes [target]'s brain!", "You succeed in reshaping [target]'s brain.")
+ display_results(user, target, "You succeed in neurologically pacifying [target].",
+ "[user] successfully fixes [target]'s brain!",
+ "[user] completes the surgery on [target]'s brain.")
target.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_LOBOTOMY)
return TRUE
/datum/surgery_step/pacify/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] reshapes [target]'s brain!", "You screwed up, and rewired [target]'s brain the wrong way around...")
+ display_results(user, target, "You screw up, rewiring [target]'s brain the wrong way around...",
+ "[user] screws up, causing brain damage!",
+ "[user] completes the surgery on [target]'s brain.")
target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY)
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm
index ebda8a04e2..01c30f174a 100644
--- a/code/modules/surgery/advanced/revival.dm
+++ b/code/modules/surgery/advanced/revival.dm
@@ -8,11 +8,9 @@
/datum/surgery_step/incise,
/datum/surgery_step/revive,
/datum/surgery_step/close)
-
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
/datum/surgery/advanced/revival/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
@@ -24,12 +22,10 @@
if(!B)
return FALSE
return TRUE
-
/datum/surgery_step/revive
name = "electrically stimulate brain"
implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60)
time = 120
-
/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool)
. = TRUE
if(istype(tool, /obj/item/twohanded/shockpaddles))
@@ -51,25 +47,33 @@
return FALSE
/datum/surgery_step/revive/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] prepares to shock [target]'s brain with [tool].", "You prepare to give [target]'s brain the spark of life with [tool].")
+ display_results(user, target, "You prepare to give [target]'s brain the spark of life with [tool].",
+ "[user] prepares to shock [target]'s brain with [tool].",
+ "[user] prepares to shock [target]'s brain with [tool].")
target.notify_ghost_cloning("Someone is trying to zap your brain. Re-enter your corpse if you want to be revived!", source = target)
/datum/surgery_step/revive/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] send a powerful shock to [target]'s brain with [tool]...", "You successfully shock [target]'s brain with [tool]...")
+ display_results(user, target, "You successfully shock [target]'s brain with [tool]...",
+ "[user] send a powerful shock to [target]'s brain with [tool]...",
+ "[user] send a powerful shock to [target]'s brain with [tool]...")
playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1)
target.adjustOxyLoss(-50, 0)
target.updatehealth()
if(target.revive())
user.visible_message("...[target] wakes up, alive and aware!", "IT'S ALIVE!")
+ target.visible_message("...[target] wakes up, alive and aware!")
target.emote("gasp")
target.adjustBrainLoss(50, 199) //MAD SCIENCE
return TRUE
else
user.visible_message("...[target.p_they()] convulses, then lies still.")
+ target.visible_message("...[target.p_they()] convulses, then lies still.")
return FALSE
/datum/surgery_step/revive/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.", "You shock [target]'s brain with [tool], but [target.p_they()] doesn't react.")
+ display_results(user, target, "You shock [target]'s brain with [tool], but [target.p_they()] doesn't react.",
+ "[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.",
+ "[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.")
playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1)
target.adjustBrainLoss(15, 199)
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm
index 115f8a2eed..b87d5e001c 100644
--- a/code/modules/surgery/advanced/viral_bonding.dm
+++ b/code/modules/surgery/advanced/viral_bonding.dm
@@ -7,17 +7,14 @@
/datum/surgery_step/incise,
/datum/surgery_step/viral_bond,
/datum/surgery_step/close)
-
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST)
-
/datum/surgery/advanced/viral_bonding/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
if(!LAZYLEN(target.diseases))
return FALSE
return TRUE
-
/datum/surgery_step/viral_bond
name = "viral bond"
implements = list(/obj/item/cautery = 100, TOOL_WELDER = 50, /obj/item = 30) // 30% success with any hot item.
@@ -27,15 +24,18 @@
/datum/surgery_step/viral_bond/tool_check(mob/user, obj/item/tool)
if(implement_type == TOOL_WELDER || implement_type == /obj/item)
return tool.is_hot()
-
return TRUE
/datum/surgery_step/viral_bond/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] starts heating [target]'s bone marrow with [tool]...", "You start heating [target]'s bone marrow with [tool]...")
+ display_results(user, target, "You start heating [target]'s bone marrow with [tool]...",
+ "[user] starts heating [target]'s bone marrow with [tool]...",
+ "[user] starts heating something in [target]'s chest with [tool]...")
/datum/surgery_step/viral_bond/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[target]'s bone marrow begins pulsing slowly.", "[target]'s bone marrow begins pulsing slowly. The viral bonding is complete.")
+ display_results(user, target, "[target]'s bone marrow begins pulsing slowly. The viral bonding is complete.",
+ "[target]'s bone marrow begins pulsing slowly.",
+ "[user] finishes the operation.")
for(var/X in target.diseases)
var/datum/disease/D = X
D.carrier = TRUE
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 8465a6d332..01cf6ae112 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -1,25 +1,25 @@
-
/datum/surgery/amputation
- name = "amputation"
+ name = "Amputation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/sever_limb)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
-
/datum/surgery_step/sever_limb
name = "sever limb"
implements = list(/obj/item/scalpel = 100, /obj/item/circular_saw = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100, /obj/item/melee/arm_blade = 80, /obj/item/twohanded/required/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25)
time = 64
/datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to sever [target]'s [parse_zone(target_zone)]!", "You begin to sever [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to sever [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to sever [target]'s [parse_zone(target_zone)]!",
+ "[user] begins to sever [target]'s [parse_zone(target_zone)]!")
/datum/surgery_step/sever_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/mob/living/carbon/human/L = target
- user.visible_message("[user] severs [L]'s [parse_zone(target_zone)]!", "You sever [L]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You sever [L]'s [parse_zone(target_zone)].",
+ "[user] severs [L]'s [parse_zone(target_zone)]!",
+ "[user] severs [L]'s [parse_zone(target_zone)]!")
if(surgery.operated_bodypart)
var/obj/item/bodypart/target_limb = surgery.operated_bodypart
target_limb.drop_limb()
-
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm
index fcd626ad97..e65271576d 100644
--- a/code/modules/surgery/brain_surgery.dm
+++ b/code/modules/surgery/brain_surgery.dm
@@ -1,5 +1,5 @@
/datum/surgery/brain_surgery
- name = "brain surgery"
+ name = "Brain surgery"
steps = list(
/datum/surgery_step/incise,
/datum/surgery_step/retract_skin,
@@ -7,16 +7,13 @@
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/fix_brain,
/datum/surgery_step/close)
-
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
/datum/surgery_step/fix_brain
name = "fix brain"
implements = list(/obj/item/hemostat = 85, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100
time = 120 //long and complicated
-
/datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target)
var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN)
if(!B)
@@ -24,10 +21,14 @@
return TRUE
/datum/surgery_step/fix_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to fix [target]'s brain.", "You begin to fix [target]'s brain...")
+ display_results(user, target, "You begin to fix [target]'s brain...",
+ "[user] begins to fix [target]'s brain.",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/fix_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully fixes [target]'s brain!", "You succeed in fixing [target]'s brain.")
+ display_results(user, target, "You succeed in fixing [target]'s brain.",
+ "[user] successfully fixes [target]'s brain!",
+ "[user] completes the surgery on [target]'s brain.")
if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed))
target.mind.remove_antag_datum(/datum/antagonist/brainwashed)
target.adjustBrainLoss(-60)
@@ -36,9 +37,11 @@
/datum/surgery_step/fix_brain/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(target.getorganslot(ORGAN_SLOT_BRAIN))
- user.visible_message("[user] screws up, causing more damage!", "You screw up, causing more damage!")
+ display_results(user, target, "You screw up, causing more damage!",
+ "[user] screws up, causing brain damage!",
+ "[user] completes the surgery on [target]'s brain.")
target.adjustBrainLoss(60)
target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY)
else
user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the brain you were working on is not there anymore.")
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm
index 72874e0308..4c65b56962 100644
--- a/code/modules/surgery/cavity_implant.dm
+++ b/code/modules/surgery/cavity_implant.dm
@@ -1,30 +1,32 @@
/datum/surgery/cavity_implant
- name = "cavity implant"
+ name = "Cavity implant"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/handle_cavity, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST)
-
-
//handle cavity
/datum/surgery_step/handle_cavity
name = "implant item"
accept_hand = 1
accept_any_item = 1
+ implements = list(/obj/item = 100)
+ repeatable = TRUE
time = 32
var/obj/item/IC = null
-
+/datum/surgery_step/handle_cavity/tool_check(mob/user, obj/item/tool)
+ if(istype(tool, /obj/item/cautery) || istype(tool, /obj/item/gun/energy/laser))
+ return FALSE
+ return !tool.is_hot()
/datum/surgery_step/handle_cavity/preop(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/bodypart/chest/CH = target.get_bodypart(BODY_ZONE_CHEST)
IC = CH.cavity_item
if(tool)
- if(istype(tool, /obj/item/surgical_drapes) || istype(tool, /obj/item/bedsheet))
- var/obj/item/inactive = user.get_inactive_held_item()
- if(istype(inactive, /obj/item/cautery) || istype(inactive, /obj/item/screwdriver) || iscyborg(user))
- attempt_cancel_surgery(surgery, tool, target, user)
- return -1
- user.visible_message("[user] begins to insert [tool] into [target]'s [target_zone].", "You begin to insert [tool] into [target]'s [target_zone]...")
+ display_results(user, target, "You begin to insert [tool] into [target]'s [target_zone]...",
+ "[user] begins to insert [tool] into [target]'s [target_zone].",
+ "[user] begins to insert [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone].")
else
- user.visible_message("[user] checks for items in [target]'s [target_zone].", "You check for items in [target]'s [target_zone]...")
+ display_results(user, target, "You check for items in [target]'s [target_zone]...",
+ "[user] checks for items in [target]'s [target_zone].",
+ "[user] looks for something in [target]'s [target_zone].")
/datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/bodypart/chest/CH = target.get_bodypart(BODY_ZONE_CHEST)
@@ -32,18 +34,18 @@
if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || HAS_TRAIT(tool, TRAIT_NODROP) || istype(tool, /obj/item/organ))
to_chat(user, "You can't seem to fit [tool] in [target]'s [target_zone]!")
return 0
- var/obj/item/electronic_assembly/EA = tool
- if(istype(EA) && EA.combat_circuits && tool.w_class > WEIGHT_CLASS_SMALL)
- to_chat(user, "[tool] is too dangerous to put in [target]'s [target_zone]! Maybe if it was smaller...")
- return 0
else
- user.visible_message("[user] stuffs [tool] into [target]'s [target_zone]!", "You stuff [tool] into [target]'s [target_zone].")
+ display_results(user, target, "You stuff [tool] into [target]'s [target_zone].",
+ "[user] stuffs [tool] into [target]'s [target_zone]!",
+ "[user] stuffs [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone].")
user.transferItemToLoc(tool, target, TRUE)
CH.cavity_item = tool
return 1
else
if(IC)
- user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].")
+ display_results(user, target, "You pull [IC] out of [target]'s [target_zone].",
+ "[user] pulls [IC] out of [target]'s [target_zone]!",
+ "[user] pulls [IC.w_class > WEIGHT_CLASS_SMALL ? IC : "something"] out of [target]'s [target_zone].")
user.put_in_hands(IC)
CH.cavity_item = null
return 1
diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm
index 7bf888ab40..6243405f8d 100644
--- a/code/modules/surgery/core_removal.dm
+++ b/code/modules/surgery/core_removal.dm
@@ -1,5 +1,5 @@
/datum/surgery/core_removal
- name = "core removal"
+ name = "Core removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/extract_core)
species = list(/mob/living/simple_animal/slime)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
@@ -8,7 +8,6 @@
if(target.stat == DEAD)
return 1
return 0
-
//extract brain
/datum/surgery_step/extract_core
name = "extract core"
@@ -16,13 +15,17 @@
time = 16
/datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to extract a core from [target].", "You begin to extract a core from [target]...")
+ display_results(user, target, "You begin to extract a core from [target]...",
+ "[user] begins to extract a core from [target].",
+ "[user] begins to extract a core from [target].")
/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/mob/living/simple_animal/slime/slime = target
if(slime.cores > 0)
slime.cores--
- user.visible_message("[user] successfully extracts a core from [target]!", "You successfully extract a core from [target]. [slime.cores] core\s remaining.")
+ display_results(user, target, "You successfully extract a core from [target]. [slime.cores] core\s remaining.",
+ "[user] successfully extracts a core from [target]!",
+ "[user] successfully extracts a core from [target]!")
new slime.coretype(slime.loc)
@@ -33,4 +36,4 @@
return 0
else
to_chat(user, "There aren't any cores left in [target]!")
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index a8cb881326..85142e7bb1 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -1,16 +1,14 @@
/datum/surgery/eye_surgery
- name = "eye surgery"
+ name = "Eye surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_PRECISE_EYES)
requires_bodypart_type = 0
-
//fix eyes
/datum/surgery_step/fix_eyes
name = "fix eyes"
implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 45, /obj/item/pen = 25)
time = 64
-
/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target)
var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES)
if(!E)
@@ -19,10 +17,14 @@
return TRUE
/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...")
+ display_results(user, target, "You begin to fix [target]'s eyes...",
+ "[user] begins to fix [target]'s eyes.",
+ "[user] begins to perform surgery on [target]'s eyes.")
/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.")
+ display_results(user, target, "You succeed in fixing [target]'s eyes.",
+ "[user] successfully fixes [target]'s eyes!",
+ "[user] completes the surgery on [target]'s eyes.")
target.cure_blind(list(EYE_DAMAGE))
target.set_blindness(0)
target.cure_nearsighted(list(EYE_DAMAGE))
@@ -32,8 +34,12 @@
/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(target.getorgan(/obj/item/organ/brain))
- user.visible_message("[user] accidentally stabs [target] right in the brain!", "You accidentally stab [target] right in the brain!")
+ display_results(user, target, "You accidentally stab [target] right in the brain!",
+ "[user] accidentally stabs [target] right in the brain!",
+ "[user] accidentally stabs [target] right in the brain!")
target.adjustBrainLoss(70)
else
- user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.")
- return FALSE
\ No newline at end of file
+ display_results(user, target, "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.",
+ "[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.",
+ "[user] accidentally stabs [target] right in the brain!")
+ return FALSE
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 1eca915d70..0419a4c73f 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -65,7 +65,7 @@
if(S.ignore_clothes || get_location_accessible(M, selected_zone))
var/datum/surgery/procedure = new S.type(M, selected_zone, affecting)
- user.visible_message("[user] drapes [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].", \
+ user.visible_message("[user] drapes [I] over [M]'s [parse_zone(selected_zone)] to prepare for surgery.", \
"You drape [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].")
log_combat(user, M, "operated on", null, "(OPERATION TYPE: [procedure.name]) (TARGET AREA: [selected_zone])")
@@ -110,15 +110,22 @@
return 0.5
-/proc/get_location_accessible(mob/living/M, location)
+/proc/get_location_accessible(mob/M, location)
var/covered_locations = 0 //based on body_parts_covered
var/face_covered = 0 //based on flags_inv
var/eyesmouth_covered = 0 //based on flags_cover
- for(var/A in M.get_equipped_items())
- var/obj/item/I = A
- covered_locations |= I.body_parts_covered
- face_covered |= I.flags_inv
- eyesmouth_covered |= I.flags_cover
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ for(var/obj/item/clothing/I in list(C.back, C.wear_mask, C.head))
+ covered_locations |= I.body_parts_covered
+ face_covered |= I.flags_inv
+ eyesmouth_covered |= I.flags_cover
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.ears))
+ covered_locations |= I.body_parts_covered
+ face_covered |= I.flags_inv
+ eyesmouth_covered |= I.flags_cover
switch(location)
if(BODY_ZONE_HEAD)
@@ -162,4 +169,3 @@
return 0
return 1
-
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm
index 92c5e05246..05119b365d 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/implant_removal.dm
@@ -3,27 +3,30 @@
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/extract_implant, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST)
-
-
//extract implant
/datum/surgery_step/extract_implant
name = "extract implant"
implements = list(/obj/item/hemostat = 100, TOOL_CROWBAR = 65)
time = 64
var/obj/item/implant/I = null
-
/datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
for(var/obj/item/O in target.implants)
I = O
break
if(I)
- user.visible_message("[user] begins to extract [I] from [target]'s [target_zone].", "You begin to extract [I] from [target]'s [target_zone]...")
+ display_results(user, target, "You begin to extract [I] from [target]'s [target_zone]...",
+ "[user] begins to extract [I] from [target]'s [target_zone].",
+ "[user] begins to extract something from [target]'s [target_zone].")
else
- user.visible_message("[user] looks for an implant in [target]'s [target_zone].", "You look for an implant in [target]'s [target_zone]...")
+ display_results(user, target, "You look for an implant in [target]'s [target_zone]...",
+ "[user] looks for an implant in [target]'s [target_zone].",
+ "[user] looks for something in [target]'s [target_zone].")
/datum/surgery_step/extract_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(I)
- user.visible_message("[user] successfully removes [I] from [target]'s [target_zone]!", "You successfully remove [I] from [target]'s [target_zone].")
+ display_results(user, target, "You successfully remove [I] from [target]'s [target_zone].",
+ "[user] successfully removes [I] from [target]'s [target_zone]!",
+ "[user] successfully removes something from [target]'s [target_zone]!")
I.removed(target)
var/obj/item/implantcase/case
@@ -36,14 +39,15 @@
case.imp = I
I.forceMove(case)
case.update_icon()
- user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].")
+ display_results(user, target, "You place [I] into [case].",
+ "[user] places [I] into [case]!",
+ "[user] places it into [case]!")
else
qdel(I)
else
to_chat(user, "You can't find anything in [target]'s [target_zone]!")
return 1
-
/datum/surgery/implant_removal/mechanic
name = "implant removal"
requires_bodypart_type = BODYPART_ROBOTIC
@@ -53,4 +57,4 @@
/datum/surgery_step/mechanic_unwrench,
/datum/surgery_step/extract_implant,
/datum/surgery_step/mechanic_wrench,
- /datum/surgery_step/mechanic_close)
\ No newline at end of file
+ /datum/surgery_step/mechanic_close)
diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm
index 46fe262189..7ba8dbc49d 100644
--- a/code/modules/surgery/limb_augmentation.dm
+++ b/code/modules/surgery/limb_augmentation.dm
@@ -1,9 +1,5 @@
-
/////AUGMENTATION SURGERIES//////
-
-
//SURGERY STEPS
-
/datum/surgery_step/replace
name = "sever muscles"
implements = list(/obj/item/scalpel = 100, TOOL_WIRECUTTER = 55)
@@ -11,16 +7,15 @@
/datum/surgery_step/replace/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to sever the muscles on [target]'s [parse_zone(user.zone_selected)].", "You begin to sever the muscles on [target]'s [parse_zone(user.zone_selected)]...")
-
+ display_results(user, target, "You begin to sever the muscles on [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] begins to sever the muscles on [target]'s [parse_zone(user.zone_selected)].",
+ "[user] begins an incision on [target]'s [parse_zone(user.zone_selected)].")
/datum/surgery_step/replace_limb
name = "replace limb"
implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100)
time = 32
var/obj/item/bodypart/L = null // L because "limb"
-
-
/datum/surgery_step/replace_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(tool, /obj/item/organ_storage) && istype(tool.contents[1], /obj/item/bodypart))
tool = tool.contents[1]
@@ -33,22 +28,20 @@
return -1
L = surgery.operated_bodypart
if(L)
- user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_selected)].", "You begin to augment [target]'s [parse_zone(user.zone_selected)]...")
+ display_results(user, target, "You begin to augment [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].",
+ "[user] begins to augment [target]'s [parse_zone(user.zone_selected)].")
else
user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
-
//ACTUAL SURGERIES
-
/datum/surgery/augmentation
- name = "augmentation"
+ name = "Augmentation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/replace_limb)
species = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
requires_real_bodypart = TRUE
-
//SURGERY STEP SUCCESSES
-
/datum/surgery_step/replace_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery)
if(L)
if(istype(tool, /obj/item/organ_storage))
@@ -58,7 +51,9 @@
tool = tool.contents[1]
if(istype(tool) && user.temporarilyRemoveItemFromInventory(tool))
tool.replace_limb(target, TRUE)
- user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!", "You successfully augment [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You successfully augment [target]'s [parse_zone(target_zone)].",
+ "[user] successfully augments [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully augments [target]'s [parse_zone(target_zone)]!")
log_combat(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
else
to_chat(user, "[target] has no organic [parse_zone(target_zone)] there!")
diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm
index 9967eba663..bb297b4604 100644
--- a/code/modules/surgery/lipoplasty.dm
+++ b/code/modules/surgery/lipoplasty.dm
@@ -1,14 +1,11 @@
/datum/surgery/lipoplasty
- name = "lipoplasty"
+ name = "Lipoplasty"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/cut_fat, /datum/surgery_step/remove_fat, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
-
/datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target)
if(HAS_TRAIT(target, TRAIT_FAT))
return 1
return 0
-
-
//cut fat
/datum/surgery_step/cut_fat
name = "cut excess fat"
@@ -16,10 +13,14 @@
time = 64
/datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to cut away [target]'s excess fat.", "You begin to cut away [target]'s excess fat...")
+ display_results(user, target, "You begin to cut away [target]'s excess fat...",
+ "[user] begins to cut away [target]'s excess fat.",
+ "[user] begins to cut [target]'s [target_zone] with [tool].")
/datum/surgery_step/cut_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] cuts [target]'s excess fat loose!", "You cut [target]'s excess fat loose.")
+ display_results(user, target, "You cut [target]'s excess fat loose.",
+ "[user] cuts [target]'s excess fat loose!",
+ "[user] finishes the cut on [target]'s [target_zone].")
return 1
//remove fat
@@ -29,25 +30,27 @@
time = 32
/datum/surgery_step/remove_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to extract [target]'s loose fat!", "You begin to extract [target]'s loose fat...")
+ display_results(user, target, "You begin to extract [target]'s loose fat...",
+ "[user] begins to extract [target]'s loose fat!",
+ "[user] begins to extract something from [target]'s [target_zone].")
/datum/surgery_step/remove_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] extracts [target]'s fat!", "You extract [target]'s fat.")
+ display_results(user, target, "You extract [target]'s fat.",
+ "[user] extracts [target]'s fat!",
+ "[user] extracts [target]'s fat!")
target.overeatduration = 0 //patient is unfatted
var/removednutriment = target.nutrition
target.nutrition = NUTRITION_LEVEL_WELL_FED
removednutriment -= 450 //whatever was removed goes into the meat
var/mob/living/carbon/human/H = target
var/typeofmeat = /obj/item/reagent_containers/food/snacks/meat/slab/human
-
if(H.dna && H.dna.species)
typeofmeat = H.dna.species.meat
-
var/obj/item/reagent_containers/food/snacks/meat/slab/human/newmeat = new typeofmeat
newmeat.name = "fatty meat"
newmeat.desc = "Extremely fatty tissue taken from a patient."
newmeat.subjectname = H.real_name
newmeat.subjectjob = H.job
- newmeat.reagents.add_reagent ("nutriment", (removednutriment / 15)) //To balance with nutriment_factor of nutriment
+ newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment
newmeat.forceMove(target.loc)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm
index 6431770fa9..7d364d9ecf 100644
--- a/code/modules/surgery/mechanic_steps.dm
+++ b/code/modules/surgery/mechanic_steps.dm
@@ -9,15 +9,14 @@
time = 24
/datum/surgery_step/mechanic_open/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].",
- "You begin to unscrew the shell of [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to unscrew the shell of [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].",
+ "[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/mechanic_incise/tool_check(mob/user, obj/item/tool)
if(implement_type == /obj/item && !tool.is_sharp())
return FALSE
-
return TRUE
-
//close shell
/datum/surgery_step/mechanic_close
name = "screw shell"
@@ -29,15 +28,14 @@
time = 24
/datum/surgery_step/mechanic_close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to screw the shell of [target]'s [parse_zone(target_zone)].",
- "You begin to screw the shell of [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to screw the shell of [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to screw the shell of [target]'s [parse_zone(target_zone)].",
+ "[user] begins to screw the shell of [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/mechanic_close/tool_check(mob/user, obj/item/tool)
if(implement_type == /obj/item && !tool.is_sharp())
return FALSE
-
return TRUE
-
//prepare electronics
/datum/surgery_step/prepare_electronics
name = "prepare electronics"
@@ -47,8 +45,9 @@
time = 24
/datum/surgery_step/prepare_electronics/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to prepare electronics in [target]'s [parse_zone(target_zone)].",
- "You begin to prepare electronics in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to prepare electronics in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to prepare electronics in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to prepare electronics in [target]'s [parse_zone(target_zone)].")
//unwrench
/datum/surgery_step/mechanic_unwrench
@@ -59,8 +58,9 @@
time = 24
/datum/surgery_step/mechanic_unwrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].",
- "You begin to unwrench some bolts in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to unwrench some bolts in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].")
//wrench
/datum/surgery_step/mechanic_wrench
@@ -71,8 +71,9 @@
time = 24
/datum/surgery_step/mechanic_wrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].",
- "You begin to wrench some bolts in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to wrench some bolts in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].")
//open hatch
/datum/surgery_step/open_hatch
@@ -81,5 +82,6 @@
time = 10
/datum/surgery_step/open_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].",
- "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...")
\ No newline at end of file
+ display_results(user, target, "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].")
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index 553de45c60..6bffed7452 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -1,5 +1,5 @@
/datum/surgery/organ_manipulation
- name = "organ manipulation"
+ name = "Organ manipulation"
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD)
requires_real_bodypart = 1
@@ -13,7 +13,6 @@
//there should be bone fixing
/datum/surgery_step/close
)
-
/datum/surgery/organ_manipulation/soft
possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
steps = list(
@@ -24,9 +23,8 @@
/datum/surgery_step/manipulate_organs,
/datum/surgery_step/close
)
-
/datum/surgery/organ_manipulation/alien
- name = "alien organ manipulation"
+ name = "Alien organ manipulation"
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
species = list(/mob/living/carbon/alien/humanoid)
steps = list(
@@ -37,9 +35,8 @@
/datum/surgery_step/manipulate_organs,
/datum/surgery_step/close
)
-
/datum/surgery/organ_manipulation/mechanic
- name = "prosthesis organ manipulation"
+ name = "Prosthesis organ manipulation"
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD)
requires_bodypart_type = BODYPART_ROBOTIC
steps = list(
@@ -51,7 +48,6 @@
/datum/surgery_step/mechanic_wrench,
/datum/surgery_step/mechanic_close
)
-
/datum/surgery/organ_manipulation/mechanic/soft
possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
steps = list(
@@ -61,7 +57,6 @@
/datum/surgery_step/manipulate_organs,
/datum/surgery_step/mechanic_close
)
-
/datum/surgery_step/manipulate_organs
time = 64
name = "manipulate organs"
@@ -70,11 +65,9 @@
var/implements_extract = list(/obj/item/hemostat = 100, TOOL_CROWBAR = 55)
var/current_type
var/obj/item/organ/I = null
-
/datum/surgery_step/manipulate_organs/New()
..()
implements = implements + implements_extract
-
/datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
I = null
if(istype(tool, /obj/item/organ_storage))
@@ -92,9 +85,9 @@
if(target_zone != I.zone || target.getorganslot(I.slot))
to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!")
return -1
-
- user.visible_message("[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].",
- "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].",
+ "[user] begins to insert something into [target]'s [parse_zone(target_zone)].")
else if(implement_type in implements_extract)
current_type = "extract"
@@ -107,21 +100,20 @@
O.on_find(user)
organs -= O
organs[O.name] = O
-
I = input("Remove which organ?", "Surgery", null, null) as null|anything in organs
if(I && user && target && user.Adjacent(target) && user.get_active_held_item() == tool)
I = organs[I]
if(!I)
return -1
- user.visible_message("[user] begins to extract [I] from [target]'s [parse_zone(target_zone)].",
- "You begin to extract [I] from [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to extract [I] from [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to extract [I] from [target]'s [parse_zone(target_zone)].",
+ "[user] begins to extract something from [target]'s [parse_zone(target_zone)].")
else
return -1
else if(istype(tool, /obj/item/reagent_containers/food/snacks/organ))
to_chat(user, "[tool] was bitten by someone! It's too damaged to use!")
return -1
-
/datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(current_type == "insert")
if(istype(tool, /obj/item/organ_storage))
@@ -134,17 +126,20 @@
I = tool
user.temporarilyRemoveItemFromInventory(I, TRUE)
I.Insert(target)
- user.visible_message("[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!",
- "You insert [tool] into [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You insert [tool] into [target]'s [parse_zone(target_zone)].",
+ "[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!",
+ "[user] inserts something into [target]'s [parse_zone(target_zone)]!")
else if(current_type == "extract")
if(I && I.owner == target)
- user.visible_message("[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!",
- "You successfully extract [I] from [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You successfully extract [I] from [target]'s [parse_zone(target_zone)].",
+ "[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!",
+ "[user] successfully extracts something from [target]'s [parse_zone(target_zone)]!")
log_combat(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
I.Remove(target)
I.forceMove(get_turf(target))
else
- user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!",
- "You can't extract anything from [target]'s [parse_zone(target_zone)]!")
+ display_results(user, target, "You can't extract anything from [target]'s [parse_zone(target_zone)]!",
+ "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!",
+ "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!")
return 0
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 01eb751f39..da03771a27 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -1,4 +1,3 @@
-
//make incision
/datum/surgery_step/incise
name = "make incision"
@@ -7,13 +6,22 @@
time = 16
/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].",
- "You begin to make an incision in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to make an incision in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to make an incision in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to make an incision in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/incise/tool_check(mob/user, obj/item/tool)
if(implement_type == /obj/item && !tool.is_sharp())
return FALSE
-
+ return TRUE
+/datum/surgery_step/incise/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if ishuman(target)
+ var/mob/living/carbon/human/H = target
+ if (!(NOBLOOD in H.dna.species.species_traits))
+ display_results(user, target, "Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
+ "Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
+ "")
+ H.bleed_rate += 3
return TRUE
//clamp bleeders
@@ -23,15 +31,17 @@
time = 24
/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].",
- "You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/clamp_bleeders/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(locate(/datum/surgery_step/saw) in surgery.steps)
target.heal_bodypart_damage(20,0)
+ if (ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.bleed_rate = max( (H.bleed_rate - 3), 0)
return ..()
-
-
//retract skin
/datum/surgery_step/retract_skin
name = "retract skin"
@@ -39,8 +49,9 @@
time = 24
/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].",
- "You begin to retract the skin in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to retract the skin in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].")
@@ -52,22 +63,21 @@
time = 24
/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].",
- "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/close/tool_check(mob/user, obj/item/tool)
if(implement_type == TOOL_WELDER || implement_type == /obj/item)
return tool.is_hot()
-
return TRUE
-
/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(locate(/datum/surgery_step/saw) in surgery.steps)
target.heal_bodypart_damage(45,0)
+ if (ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.bleed_rate = max( (H.bleed_rate - 3), 0)
return ..()
-
-
-
//saw bone
/datum/surgery_step/saw
name = "saw bone"
@@ -77,13 +87,15 @@
time = 54
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].",
- "You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
target.apply_damage(50, BRUTE, "[target_zone]")
-
- user.visible_message("[user] saws [target]'s [parse_zone(target_zone)] open!", "You saw [target]'s [parse_zone(target_zone)] open.")
+ display_results(user, target, "You saw [target]'s [parse_zone(target_zone)] open.",
+ "[user] saws [target]'s [parse_zone(target_zone)] open!",
+ "[user] saws [target]'s [parse_zone(target_zone)] open!")
return 1
//drill bone
@@ -93,10 +105,12 @@
time = 30
/datum/surgery_step/drill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].",
- "You begin to drill into the bone in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to drill into the bone in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/drill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] drills into [target]'s [parse_zone(target_zone)]!",
- "You drill into [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You drill into [target]'s [parse_zone(target_zone)].",
+ "[user] drills into [target]'s [parse_zone(target_zone)]!",
+ "[user] drills into [target]'s [parse_zone(target_zone)]!")
return 1
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 55c8d95082..eeaaaf2a03 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -184,7 +184,7 @@
/obj/item/organ/eyes/robotic/glow/proc/terminate_effects()
if(owner && active)
- deactivate()
+ deactivate(TRUE)
active = FALSE
clear_visuals(TRUE)
STOP_PROCESSING(SSfastprocess, src)
@@ -237,12 +237,6 @@
return
deactivate(silent = TRUE)
-/obj/item/organ/eyes/robotic/glow/Remove(mob/living/carbon/M)
- . = ..()
- if(active)
- UnregisterSignal(M, COMSIG_ATOM_DIR_CHANGE)
- active = FALSE
-
/obj/item/organ/eyes/robotic/glow/proc/activate(silent = FALSE)
start_visuals()
if(!silent)
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
index 54482ade73..39077ae235 100644
--- a/code/modules/surgery/plastic_surgery.dm
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -1,8 +1,7 @@
/datum/surgery/plastic_surgery
- name = "plastic surgery"
+ name = "Plastic surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/reshape_face, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_HEAD)
-
//reshape_face
/datum/surgery_step/reshape_face
name = "reshape face"
@@ -10,12 +9,16 @@
time = 64
/datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to alter [target]'s appearance.", "You begin to alter [target]'s appearance...")
+ display_results(user, target, "You begin to alter [target]'s appearance...",
+ "[user] begins to alter [target]'s appearance.",
+ "[user] begins to make an incision in [target]'s face.")
/datum/surgery_step/reshape_face/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(HAS_TRAIT_FROM(target, TRAIT_DISFIGURED, TRAIT_GENERIC))
REMOVE_TRAIT(target, TRAIT_DISFIGURED, TRAIT_GENERIC)
- user.visible_message("[user] successfully restores [target]'s appearance!", "You successfully restore [target]'s appearance.")
+ display_results(user, target, "You successfully restore [target]'s appearance.",
+ "[user] successfully restores [target]'s appearance!",
+ "[user] finishes the operation on [target]'s face.")
else
var/list/names = list()
if(!isabductor(user))
@@ -31,8 +34,18 @@
var/oldname = target.real_name
target.real_name = chosen_name
var/newname = target.real_name //something about how the code handles names required that I use this instead of target.real_name
- user.visible_message("[user] alters [oldname]'s appearance completely, [target.p_they()] is now [newname]!", "You alter [oldname]'s appearance completely, [target.p_they()] is now [newname].")
+ display_results(user, target, "You alter [oldname]'s appearance completely, [target.p_they()] is now [newname].",
+ "[user] alters [oldname]'s appearance completely, [target.p_they()] is now [newname]!",
+ "[user] finishes the operation on [target]'s face.")
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.sec_hud_set_ID()
return 1
+ return TRUE
+
+/datum/surgery_step/reshape_face/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You screw up, leaving [target]'s appearance disfigured!",
+ "[user] screws up, disfiguring [target]'s appearance!",
+ "[user] finishes the operation on [target]'s face.")
+ ADD_TRAIT(target, TRAIT_DISFIGURED, TRAIT_GENERIC)
+ return FALSE
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 9032964ae4..fdceb1fb1f 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -1,26 +1,21 @@
/datum/surgery/prosthetic_replacement
- name = "prosthetic replacement"
+ name = "Prosthetic replacement"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/add_prosthetic)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
requires_bodypart = FALSE //need a missing limb
requires_bodypart_type = 0
-
/datum/surgery/prosthetic_replacement/can_start(mob/user, mob/living/carbon/target)
if(!iscarbon(target))
return 0
var/mob/living/carbon/C = target
if(!C.get_bodypart(user.zone_selected)) //can only start if limb is missing
return 1
-
-
-
/datum/surgery_step/add_prosthetic
name = "add prosthetic"
implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/twohanded/required/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100)
time = 32
var/organ_rejection_dam = 0
-
/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(tool, /obj/item/organ_storage))
if(!tool.contents.len)
@@ -48,16 +43,19 @@
organ_rejection_dam = 30
if(target_zone == BP.body_zone) //so we can't replace a leg with an arm, or a human arm with a monkey arm.
- user.visible_message("[user] begins to replace [target]'s [parse_zone(target_zone)].", "You begin to replace [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to replace [target]'s [parse_zone(target_zone)] with [tool]...",
+ "[user] begins to replace [target]'s [parse_zone(target_zone)] with [tool].",
+ "[user] begins to replace [target]'s [parse_zone(target_zone)].")
else
to_chat(user, "[tool] isn't the right type for [parse_zone(target_zone)].")
return -1
else if(target_zone == BODY_ZONE_L_ARM || target_zone == BODY_ZONE_R_ARM)
- user.visible_message("[user] begins to attach [tool] onto [target].", "You begin to attach [tool] onto [target]...")
+ display_results(user, target, "You begin to attach [tool] onto [target]...",
+ "[user] begins to attach [tool] onto [target]'s [parse_zone(target_zone)].",
+ "[user] begins to attach something onto [target]'s [parse_zone(target_zone)].")
else
to_chat(user, "[tool] must be installed onto an arm.")
return -1
-
/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(tool, /obj/item/organ_storage))
tool.icon_state = initial(tool.icon_state)
@@ -69,13 +67,17 @@
L.attach_limb(target)
if(organ_rejection_dam)
target.adjustToxLoss(organ_rejection_dam)
- user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "You succeed in replacing [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You succeed in replacing [target]'s [parse_zone(target_zone)].",
+ "[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully replaces [target]'s [parse_zone(target_zone)]!")
return 1
else
var/obj/item/bodypart/L = target.newBodyPart(target_zone, FALSE, FALSE)
L.is_pseudopart = TRUE
L.attach_limb(target)
- user.visible_message("[user] finishes attaching [tool]!", "You attach [tool].")
+ display_results(user, target, "You attach [tool].",
+ "[user] finishes attaching [tool]!",
+ "[user] finishes the attachment procedure!")
qdel(tool)
if(istype(tool, /obj/item/twohanded/required/chainsaw))
var/obj/item/mounted_chainsaw/new_arm = new(target)
@@ -85,4 +87,3 @@
var/obj/item/melee/arm_blade/new_arm = new(target,TRUE,TRUE)
target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
return 1
-
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index 451ae02dac..0c3a3b55a5 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -2,23 +2,20 @@
name = "removal of embedded objects"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/remove_object)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
-
-
/datum/surgery_step/remove_object
name = "remove embedded objects"
time = 32
accept_hand = 1
var/obj/item/bodypart/L = null
-
-
/datum/surgery_step/remove_object/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
L = surgery.operated_bodypart
if(L)
- user.visible_message("[user] looks for objects embedded in [target]'s [parse_zone(user.zone_selected)].", "You look for objects embedded in [target]'s [parse_zone(user.zone_selected)]...")
+ display_results(user, target, "You look for objects embedded in [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] looks for objects embedded in [target]'s [parse_zone(user.zone_selected)].",
+ "[user] looks for something in [target]'s [parse_zone(user.zone_selected)].")
else
user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
-
/datum/surgery_step/remove_object/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(L)
if(ishuman(target))
@@ -33,11 +30,12 @@
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "embedded")
if(objects > 0)
- user.visible_message("[user] successfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].")
+ display_results(user, target, "You successfully remove [objects] objects from [H]'s [L.name].",
+ "[user] successfully removes [objects] objects from [H]'s [L]!",
+ "[user] successfully removes [objects] objects from [H]'s [L]!")
else
to_chat(user, "You find no objects embedded in [H]'s [L]!")
else
to_chat(user, "You can't find [target]'s [parse_zone(user.zone_selected)], let alone any objects embedded in it!")
-
return 1
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index f670b80167..c5a944fbb2 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -2,13 +2,12 @@
var/name
var/list/implements = list() //format is path = probability of success. alternatively
var/implement_type = null //the current type of implement used. This has to be stored, as the actual typepath of the tool may not match the list type.
- var/accept_hand = 0 //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
- var/accept_any_item = 0 //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
+ var/accept_hand = FALSE //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
+ var/accept_any_item = FALSE //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
var/time = 10 //how long does the step take?
- var/repeatable = 0 //can this step be repeated? Make shure it isn't last step, or it used in surgery with `can_cancel = 1`. Or surgion will be stuck in the loop
+ var/repeatable = FALSE //can this step be repeated? Make shure it isn't last step, or it used in surgery with `can_cancel = 1`. Or surgion will be stuck in the loop
var/list/chems_needed = list() //list of chems needed to complete the step. Even on success, the step will have no effect if there aren't the chems required in the mob.
var/require_all_chems = TRUE //any on the list or all on the list?
-
/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
var/success = FALSE
if(accept_hand)
@@ -16,104 +15,87 @@
success = TRUE
if(iscyborg(user))
success = TRUE
-
if(accept_any_item)
if(tool && tool_check(user, tool))
success = TRUE
-
else if(tool)
for(var/key in implements)
var/match = FALSE
-
if(ispath(key) && istype(tool, key))
match = TRUE
else if(tool.tool_behaviour == key)
match = TRUE
-
if(match)
implement_type = key
if(tool_check(user, tool))
success = TRUE
break
-
if(success)
if(target_zone == surgery.location)
if(get_location_accessible(target, target_zone) || surgery.ignore_clothes)
- initiate(user, target, target_zone, tool, surgery, try_to_fail)
- return 1
+ return initiate(user, target, target_zone, tool, surgery, try_to_fail)
else
to_chat(user, "You need to expose [target]'s [parse_zone(target_zone)] to perform surgery on it!")
- return 1 //returns 1 so we don't stab the guy in the dick or wherever.
-
+ return TRUE //returns TRUE so we don't stab the guy in the dick or wherever.
if(repeatable)
var/datum/surgery_step/next_step = surgery.get_surgery_next_step()
if(next_step)
surgery.status++
if(next_step.try_op(user, target, user.zone_selected, user.get_active_held_item(), surgery))
- return 1
+ return TRUE
else
surgery.status--
-
- if(iscyborg(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache
- return 1
-
- return 0
-
-
+ return FALSE
/datum/surgery_step/proc/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
- surgery.step_in_progress = 1
-
+ surgery.step_in_progress = TRUE
var/speed_mod = 1
-
+ var/advance = FALSE
if(preop(user, target, target_zone, tool, surgery) == -1)
- surgery.step_in_progress = 0
- return
-
+ surgery.step_in_progress = FALSE
+ return FALSE
if(tool)
speed_mod = tool.toolspeed
-
if(do_after(user, time * speed_mod, target = target))
- var/advance = 0
var/prob_chance = 100
-
if(implement_type) //this means it isn't a require hand or any item step.
prob_chance = implements[implement_type]
prob_chance *= surgery.get_propability_multiplier()
-
if((prob(prob_chance) || iscyborg(user)) && chem_check(target) && !try_to_fail)
if(success(user, target, target_zone, tool, surgery))
- advance = 1
+ advance = TRUE
else
if(failure(user, target, target_zone, tool, surgery))
- advance = 1
-
+ advance = TRUE
if(advance && !repeatable)
surgery.status++
if(surgery.status > surgery.steps.len)
surgery.complete()
-
- surgery.step_in_progress = 0
+ surgery.step_in_progress = FALSE
+ return advance
/datum/surgery_step/proc/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to perform surgery on [target].", "You begin to perform surgery on [target]...")
-
+ display_results(user, target, "You begin to perform surgery on [target]...",
+ "[user] begins to perform surgery on [target].",
+ "[user] begins to perform surgery on [target].")
/datum/surgery_step/proc/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] succeeds!", "You succeed.")
- return 1
+ display_results(user, target, "You succeed.",
+ "[user] succeeds!",
+ "[user] finishes.")
+ return TRUE
/datum/surgery_step/proc/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] screws up!", "You screw up!")
- return 0
+ display_results(user, target, "You screw up!",
+ "[user] screws up!",
+ "[user] finishes.", TRUE) //By default the patient will notice if the wrong thing has been cut
+ return FALSE
/datum/surgery_step/proc/tool_check(mob/user, obj/item/tool)
- return 1
-
+ return TRUE
/datum/surgery_step/proc/chem_check(mob/living/carbon/target)
if(!LAZYLEN(chems_needed))
return TRUE
-
if(require_all_chems)
. = TRUE
for(var/R in chems_needed)
@@ -124,7 +106,6 @@
for(var/R in chems_needed)
if(target.reagents.has_reagent(R))
return TRUE
-
/datum/surgery_step/proc/get_chem_list()
if(!LAZYLEN(chems_needed))
return
@@ -135,3 +116,11 @@
var/chemname = temp.name
chems += chemname
return english_list(chems, and_text = require_all_chems ? " and " : " or ")
+
+//Replaces visible_message during operations so only people looking over the surgeon can tell what they're doing, allowing for shenanigans.
+/datum/surgery_step/proc/display_results(mob/user, mob/living/carbon/target, self_message, detailed_message, vague_message, target_detailed = FALSE)
+ var/list/detailed_mobs = get_hearers_in_view(1, user) //Only the surgeon and people looking over his shoulder can see the operation clearly
+ if(!target_detailed)
+ detailed_mobs -= target //The patient can't see well what's going on, unless it's something like getting cut
+ user.visible_message(detailed_message, self_message, vision_distance = 1, ignored_mobs = target_detailed ? null : target)
+ user.visible_message(vague_message, "", ignored_mobs = detailed_mobs)
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 9a2455f56d..ae53f29a55 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -13,6 +13,7 @@
hitsound = 'sound/hallucinations/growl1.ogg'
force = 21 // Just enough to break airlocks with melee attacks
damtype = "brute"
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/zombie_hand/Initialize()
. = ..()
diff --git a/html/changelogs/AutoChangeLog-pr-8927.yml b/html/changelogs/AutoChangeLog-pr-8927.yml
new file mode 100644
index 0000000000..3a87d7652e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8927.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "toned down the stamina costs of some of the bulkier weapons."
+ - code_imp: "repathed hypereutactic blades to be a subtype of dual sabers. Way less copypasta."
diff --git a/html/changelogs/AutoChangeLog-pr-8992.yml b/html/changelogs/AutoChangeLog-pr-8992.yml
new file mode 100644
index 0000000000..299792fee3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8992.yml
@@ -0,0 +1,5 @@
+author: "Chayse"
+delete-after: True
+changes:
+ - rscadd: "Assorted space-worthy helmets can now act as masks for internals."
+ - refactor: "Internals code can now check any item with the ALLOWSINTERNALS flag through the GET_INTERNAL_SLOTS define. For now this only checks head and mask slots, since those are the most realistically speaking usable ones."
diff --git a/html/changelogs/AutoChangeLog-pr-9010.yml b/html/changelogs/AutoChangeLog-pr-9010.yml
new file mode 100644
index 0000000000..52aed38e2c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9010.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - balance: "Activating the nuclear device during war-ops informs the crew of the nuke's position."
diff --git a/html/changelogs/AutoChangeLog-pr-9054.yml b/html/changelogs/AutoChangeLog-pr-9054.yml
new file mode 100644
index 0000000000..5952c9ecfd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9054.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "hugboxing mining loot"
diff --git a/html/changelogs/AutoChangeLog-pr-9061.yml b/html/changelogs/AutoChangeLog-pr-9061.yml
new file mode 100644
index 0000000000..4fc9d10ba5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9061.yml
@@ -0,0 +1,5 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - tweak: "The femur breaker now uses `*scream` instead of forced speech. This means that the femur breaker will no longer spam deadchat with \"AAAAAAAAAHHHHHHHHHH!!\""
+ - tweak: "The femur breaker will now guarantee that the victim falls into crit, which will make it harder to perform torture scenes with it since the victim can just succumb."
diff --git a/html/changelogs/AutoChangeLog-pr-9062.yml b/html/changelogs/AutoChangeLog-pr-9062.yml
new file mode 100644
index 0000000000..12102204c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9062.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - spellcheck: "less bad wording in slime"
diff --git a/html/changelogs/AutoChangeLog-pr-9064.yml b/html/changelogs/AutoChangeLog-pr-9064.yml
new file mode 100644
index 0000000000..6e775c1eb4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9064.yml
@@ -0,0 +1,4 @@
+author: "Cebutris"
+delete-after: True
+changes:
+ - rscadd: "Hugs of the North Star! Get them from the arcades (if you're lucky) and hug your friends at INCREDIBLE hihg speeds!"
diff --git a/html/changelogs/AutoChangeLog-pr-9069.yml b/html/changelogs/AutoChangeLog-pr-9069.yml
new file mode 100644
index 0000000000..0439515dd3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9069.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes clock cult Abscond scripture not dragging pulled mobs into Reebe. Also fixes blood cult tele runes teleporting you from the source turf to the source turf."
diff --git a/html/changelogs/AutoChangeLog-pr-9070.yml b/html/changelogs/AutoChangeLog-pr-9070.yml
new file mode 100644
index 0000000000..2013550dd2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9070.yml
@@ -0,0 +1,5 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - rscadd: "inhands sprite for rainbow knife"
+ - tweak: "colour of highlight on the regular knife when held in the right hand"
diff --git a/html/changelogs/AutoChangeLog-pr-9071.yml b/html/changelogs/AutoChangeLog-pr-9071.yml
new file mode 100644
index 0000000000..40ae43867f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9071.yml
@@ -0,0 +1,4 @@
+author: "Yakumo Chen"
+delete-after: True
+changes:
+ - balance: "Autocloning now requires tier 4 parts"
diff --git a/html/changelogs/AutoChangeLog-pr-9078.yml b/html/changelogs/AutoChangeLog-pr-9078.yml
new file mode 100644
index 0000000000..2e202ec43a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9078.yml
@@ -0,0 +1,7 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - rscdel: "Removed racism"
+ - tweak: "Teleporter calibration actually matters to all roundstart players"
+ - balance: "Slows down teleportation with the console/hub/teleporter setup if you care for your species."
+ - balance: "Dedicated non-humans can now get hulk without having to become human."
diff --git a/html/changelogs/AutoChangeLog-pr-9079.yml b/html/changelogs/AutoChangeLog-pr-9079.yml
new file mode 100644
index 0000000000..42aa732e16
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9079.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "ling blade now has 40 armor pen"
diff --git a/html/changelogs/AutoChangeLog-pr-9081.yml b/html/changelogs/AutoChangeLog-pr-9081.yml
new file mode 100644
index 0000000000..c66148e446
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9081.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - balance: "Central Command informs you when a Meteor Storm is about to hit 5 to 10 minutes before it happens."
diff --git a/html/changelogs/AutoChangeLog-pr-9083.yml b/html/changelogs/AutoChangeLog-pr-9083.yml
new file mode 100644
index 0000000000..74b4d95ca3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9083.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "strawbarries and such"
diff --git a/html/changelogs/AutoChangeLog-pr-9084.yml b/html/changelogs/AutoChangeLog-pr-9084.yml
new file mode 100644
index 0000000000..c2569d10b4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9084.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixes clock cult mass recall."
diff --git a/html/changelogs/AutoChangeLog-pr-9085.yml b/html/changelogs/AutoChangeLog-pr-9085.yml
new file mode 100644
index 0000000000..92f5dc4cf8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9085.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes underwear colors a bit."
diff --git a/html/changelogs/AutoChangeLog-pr-9101.yml b/html/changelogs/AutoChangeLog-pr-9101.yml
new file mode 100644
index 0000000000..174619dd49
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9101.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542, original by XDTM"
+delete-after: True
+changes:
+ - rscadd: "Surgery steps are now shown in detail only to the surgeon and anyone standing adjacent to them; the patient and people watching from further away get a more vague/ambiguous description."
diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi
index 277a7d8f05..93cd988cff 100644
Binary files a/icons/mob/inhands/equipment/kitchen_lefthand.dmi and b/icons/mob/inhands/equipment/kitchen_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi
index 0103bd19b5..075b4c2033 100644
Binary files a/icons/mob/inhands/equipment/kitchen_righthand.dmi and b/icons/mob/inhands/equipment/kitchen_righthand.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 92b5203f5d..6fda702cb3 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi
index 1bf5b7ee96..df1e61c849 100644
Binary files a/icons/obj/food/piecake.dmi and b/icons/obj/food/piecake.dmi differ
diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi
index d309884be0..9b0bc9816b 100644
Binary files a/icons/obj/hydroponics/growing_fruits.dmi and b/icons/obj/hydroponics/growing_fruits.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index a1ab5b08e5..61070621c2 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 5a2088c332..30be27486b 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/modular_citadel/code/_onclick/item_attack.dm b/modular_citadel/code/_onclick/item_attack.dm
index dcc9f567e2..80281ee084 100644
--- a/modular_citadel/code/_onclick/item_attack.dm
+++ b/modular_citadel/code/_onclick/item_attack.dm
@@ -17,9 +17,3 @@
/obj/item/proc/altafterattack(atom/target, mob/user, proximity_flag, click_parameters)
return FALSE
-
-/obj/item/proc/getweight()
- if(total_mass)
- return max(total_mass,MIN_MELEE_STAMCOST)
- else
- return w_class*1.25
diff --git a/modular_citadel/code/game/machinery/wishgranter.dm b/modular_citadel/code/game/machinery/wishgranter.dm
index f7c2c57d08..f24062a126 100644
--- a/modular_citadel/code/game/machinery/wishgranter.dm
+++ b/modular_citadel/code/game/machinery/wishgranter.dm
@@ -95,7 +95,7 @@
killwish.grasp_range = 6
killwish.melee_damage_upper = 30
killwish.grasp_chance = 50
- killwish.loot = list(/obj/item/twohanded/hypereutactic)
+ killwish.loot = list(/obj/item/twohanded/dualsaber/hypereutactic)
charges--
insisting = FALSE
if(!charges)
diff --git a/modular_citadel/code/game/objects/items.dm b/modular_citadel/code/game/objects/items.dm
index 337db986b0..c94923f9de 100644
--- a/modular_citadel/code/game/objects/items.dm
+++ b/modular_citadel/code/game/objects/items.dm
@@ -1,6 +1,4 @@
/obj/item
- var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds.
-
var/list/alternate_screams = list() //REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
// lazy for screaming.
diff --git a/modular_citadel/code/game/objects/items/melee/energy.dm b/modular_citadel/code/game/objects/items/melee/energy.dm
deleted file mode 100644
index c37f88eacf..0000000000
--- a/modular_citadel/code/game/objects/items/melee/energy.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/obj/item/melee/transforming/energy/sword
- total_mass = 0.375 //Survival flashlights typically weigh around 5 ounces.
- total_mass_on = 3.4 //The typical medieval sword, on the other hand, weighs roughly 3 pounds.
diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
index 6e28a3115f..68ab229f0a 100644
--- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
+++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
@@ -124,7 +124,7 @@
return
else
to_chat(user, "You combine the two light swords, making a single supermassive blade! You're cool.")
- new /obj/item/twohanded/hypereutactic(user.drop_location())
+ new /obj/item/twohanded/dualsaber/hypereutactic(user.drop_location())
qdel(W)
qdel(src)
else
@@ -233,7 +233,7 @@
return
else
to_chat(user, "You combine the two plastic swords, making a single supermassive toy! You're fake-cool.")
- new /obj/item/twohanded/hypereutactic/toy(user.loc)
+ new /obj/item/twohanded/dualsaber/hypereutactic/toy(user.loc)
qdel(W)
qdel(src)
else
@@ -247,7 +247,7 @@
// HYPEREUTACTIC Blades /////////////////////////
/////////////////////////////////////////////////////
-/obj/item/twohanded/hypereutactic
+/obj/item/twohanded/dualsaber/hypereutactic
icon = 'modular_citadel/icons/eutactic/item/hypereutactic.dmi'
icon_state = "hypereutactic"
lefthand_file = 'modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi'
@@ -258,58 +258,29 @@
name = "hypereutactic blade"
desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter."
force = 7
- throwforce = 5
- throw_speed = 3
- throw_range = 5
- w_class = WEIGHT_CLASS_SMALL
- var/w_class_on = WEIGHT_CLASS_BULKY
force_unwielded = 7
force_wielded = 40
wieldsound = 'sound/weapons/nebon.ogg'
unwieldsound = 'sound/weapons/neboff.ogg'
- hitsound = "swing_hit"
+ hitsound_on = 'sound/weapons/nebhit.ogg'
+ slowdown_wielded = 1
armour_penetration = 60
light_color = "#37FFF7"
+ rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded")
- block_chance = 75
- max_integrity = 200
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
- resistance_flags = FIRE_PROOF
- var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
- item_flags = SLOWS_WHILE_IN_HAND
+ spinnable = FALSE
+ total_mass_on = 4
-/obj/item/twohanded/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
+/obj/item/twohanded/dualsaber/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
altafterattack(A, user, TRUE, params)
return TRUE
-/obj/item/twohanded/hypereutactic/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
+/obj/item/twohanded/dualsaber/hypereutactic/altafterattack(atom/target, mob/living/user, proximity_flag, click_parameters) //does right click memes
if(istype(user))
user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
return TRUE
-/obj/item/twohanded/hypereutactic/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
- if(M.has_dna())
- if(M.dna.check_mutation(HULK))
- to_chat(M, "You lack the grace to wield this!")
- return
- ..()
- if(wielded)
- sharpness = IS_SHARP
- w_class = w_class_on
- hitsound = 'sound/weapons/nebhit.ogg'
- START_PROCESSING(SSobj, src)
- set_light(brightness_on)
-
-/obj/item/twohanded/hypereutactic/unwield() //Specific unwield () to switch hitsounds.
- sharpness = initial(sharpness)
- w_class = initial(w_class)
- ..()
- hitsound = "swing_hit"
- STOP_PROCESSING(SSobj, src)
- set_light(0)
- slowdown = initial(slowdown)
-
-/obj/item/twohanded/hypereutactic/update_icon()
+/obj/item/twohanded/dualsaber/hypereutactic/update_icon()
var/mutable_appearance/blade_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_blade")
var/mutable_appearance/gem_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_gem")
@@ -329,21 +300,21 @@
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)//blood overlays get weird otherwise, because the sprite changes. (retained from original desword because I have no idea what this is)
-/obj/item/twohanded/hypereutactic/AltClick(mob/living/user)
- if(!in_range(src, user)) //Basic checks to prevent abuse
+/obj/item/twohanded/dualsaber/hypereutactic/AltClick(mob/living/user)
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
return
if(user.incapacitated() || !istype(user))
to_chat(user, "You can't do that right now!")
return
-
if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null
- if(energy_color_input)
- light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ if(!energy_color_input || !user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
+ return
+ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
update_icon()
update_light()
-/obj/item/twohanded/hypereutactic/worn_overlays(isinhands, icon_file)
+/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file)
. = ..()
if(isinhands)
var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem")
@@ -354,70 +325,19 @@
blade_inhand.color = light_color
. += blade_inhand
-/obj/item/twohanded/hypereutactic/examine(mob/user)
+/obj/item/twohanded/dualsaber/hypereutactic/examine(mob/user)
..()
- to_chat(user, "Alt-click to recolor it.")
+ if(!hacked)
+ to_chat(user, "Alt-click to recolor it.")
-////////// stuff beneath this is all taken from the desword //////////// wow very professional such OOP wow
-
-/obj/item/twohanded/hypereutactic/attack(mob/target, mob/living/carbon/human/user)
- if(user.has_dna())
- if(user.dna.check_mutation(HULK))
- to_chat(user, "You grip the blade too hard and accidentally close it!")
- unwield()
- return
- ..()
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40))
- impale(user)
- return
-
-/obj/item/twohanded/hypereutactic/Destroy()
- STOP_PROCESSING(SSobj, src)
+/obj/item/twohanded/dualsaber/hypereutactic/rainbow_process()
. = ..()
-
-/obj/item/twohanded/hypereutactic/proc/impale(mob/living/user)
- to_chat(user, "You spin around a bit before losing your balance and impaling yourself on [src].")
- if (force_wielded)
- user.take_bodypart_damage(20,25)
- else
- user.adjustStaminaLoss(25)
-
-/obj/item/twohanded/hypereutactic/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(wielded)
- return ..()
- return FALSE
-
-/obj/item/twohanded/hypereutactic/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
- if(wielded)
- to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!")
- return TRUE
-
-/obj/item/twohanded/hypereutactic/process()
- if(wielded)
- open_flame()
- else
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/twohanded/hypereutactic/IsReflect()
- if(wielded)
- return TRUE
-
-/obj/item/twohanded/hypereutactic/ignition_effect(atom/A, mob/user)
- // same as /obj/item/melee/transforming/energy, mostly
- if(!wielded)
- return ""
- var/in_mouth = ""
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- if(C.wear_mask == src)
- in_mouth = ", barely missing their nose"
- . = "[user] swings [user.p_their()] [src][in_mouth]. [user.p_they()] light[user.p_s()] [A] in the process."
- playsound(loc, hitsound, get_clamped_volume(), 1, -1)
- add_fingerprint(user)
+ update_icon()
+ update_light()
////////////////// TOY VERSION /////////////////////////////
-/obj/item/twohanded/hypereutactic/toy
+/obj/item/twohanded/dualsaber/hypereutactic/toy
name = "\improper DX Hyper-Euplastic LightSword"
desc = "A supermassive toy envisioned to cleave the very fabric of space and time itself in twain. Realistic visuals and sounds! Ages 8 and up."
force = 0
@@ -427,11 +347,13 @@
force_unwielded = 0
force_wielded = 0
attack_verb = list("attacked", "struck", "hit")
+ total_mass_on = TOTAL_MASS_TOY_SWORD
+ slowdown_wielded = 0
-/obj/item/twohanded/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+/obj/item/twohanded/dualsaber/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
return FALSE
-/obj/item/twohanded/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles
+/obj/item/twohanded/dualsaber/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles
return FALSE
//////// Tatortot NEB /////////////// (same stats as regular esword)
@@ -455,17 +377,7 @@
//RAINBOW MEMES
-/obj/item/twohanded/hypereutactic/toy/rainbow
+/obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow
name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander"
desc = "A custom-built toy with fancy rainbow lights built-in."
- var/list/rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
-
-/obj/item/twohanded/hypereutactic/toy/rainbow/process()
- . = ..()
- var/set_color = pick(rainbow_colors)
- light_color = set_color
- update_light()
- update_icon()
-
-/obj/item/twohanded/hypereutactic/toy/rainbow/AltClick(mob/living/user)
- return
+ hacked = TRUE
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/items/melee/transforming.dm b/modular_citadel/code/game/objects/items/melee/transforming.dm
deleted file mode 100644
index 46610f4e54..0000000000
--- a/modular_citadel/code/game/objects/items/melee/transforming.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/obj/item/melee/transforming
- var/total_mass_on //Total mass in ounces when transformed. Primarily for balance purposes. Don't think about it too hard.
-
-/obj/item/melee/transforming/getweight()
- if(total_mass && total_mass_on)
- if(active)
- return max(total_mass_on,MIN_MELEE_STAMCOST)
- else
- return max(total_mass,MIN_MELEE_STAMCOST)
- else
- return initial(w_class)*1.25
-
-/obj/item/melee/transforming/cleaving_saw
- total_mass = 2.75
- total_mass_on = 5
diff --git a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm b/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
index f6991f1d9f..ccbf9a42fe 100644
--- a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
+++ b/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
@@ -49,7 +49,7 @@
/datum/outfit/lavaknight/captain
name ="Cydonian Knight Captain"
- l_pocket = /obj/item/twohanded/hypereutactic
+ l_pocket = /obj/item/twohanded/dualsaber/hypereutactic
/datum/outfit/lavaknight/captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index e3dbbbd490..cc156adc4b 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -220,7 +220,7 @@
/datum/gear/torisword
name = "Rainbow Zweihander"
category = SLOT_IN_BACKPACK
- path = /obj/item/twohanded/hypereutactic/toy/rainbow
+ path = /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow
ckeywhitelist = list("annoymous35")
/datum/gear/darksabre
diff --git a/tgstation.dme b/tgstation.dme
index e2c4ff105a..dc4e981a4f 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2901,10 +2901,8 @@
#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm"
-#include "modular_citadel\code\game\objects\items\melee\energy.dm"
#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm"
#include "modular_citadel\code\game\objects\items\melee\misc.dm"
-#include "modular_citadel\code\game\objects\items\melee\transforming.dm"
#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm"
#include "modular_citadel\code\game\objects\items\storage\firstaid.dm"
#include "modular_citadel\code\game\objects\structures\tables_racks.dm"