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"