From b87442e6332cce7f3be48ba12cb1679a26713254 Mon Sep 17 00:00:00 2001 From: Ghommie Date: Fri, 19 Jul 2019 20:09:16 +0200 Subject: [PATCH 01/54] Tones down some items attack stamina costs. kills hypereutactic blades copypasta. --- code/__DEFINES/citadel_defines.dm | 1 - code/__DEFINES/combat.dm | 13 +- code/_onclick/item_attack.dm | 4 + code/game/machinery/computer/arcade.dm | 4 +- code/game/objects/items.dm | 1 + code/game/objects/items/clown_items.dm | 1 + code/game/objects/items/his_grace.dm | 1 + code/game/objects/items/holy_weapons.dm | 9 +- code/game/objects/items/melee/energy.dm | 4 + code/game/objects/items/melee/misc.dm | 7 +- code/game/objects/items/melee/transforming.dm | 5 +- code/game/objects/items/singularityhammer.dm | 2 + code/game/objects/items/toys.dm | 12 +- code/game/objects/items/twohanded.dm | 17 +- code/game/objects/items/weaponry.dm | 5 + .../changeling/powers/mutations.dm | 1 + .../mining/lavaland/necropolis_chests.dm | 2 + .../human/species_types/shadowpeople.dm | 1 + .../xenobiology/crossbreeding/_weapons.dm | 1 + code/modules/zombie/items.dm | 1 + modular_citadel/code/_onclick/item_attack.dm | 6 - .../code/game/machinery/wishgranter.dm | 2 +- modular_citadel/code/game/objects/items.dm | 2 - .../code/game/objects/items/melee/energy.dm | 3 - .../objects/items/melee/eutactic_blades.dm | 147 ++++-------------- .../game/objects/items/melee/transforming.dm | 15 -- .../citadel_ghostrole_spawners.dm | 2 +- .../code/modules/client/loadout/__donator.dm | 2 +- tgstation.dme | 2 - 29 files changed, 110 insertions(+), 163 deletions(-) delete mode 100644 modular_citadel/code/game/objects/items/melee/energy.dm delete mode 100644 modular_citadel/code/game/objects/items/melee/transforming.dm diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 2abe0db04e..ed26128505 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..ae7ce436ab 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -183,4 +183,15 @@ 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. 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/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 8d0cfb95e8..3710072fa6 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, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 384a1e4ee4..1c911d889c 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/clown_items.dm b/code/game/objects/items/clown_items.dm index 1d302b409e..0b71396d07 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -111,6 +111,7 @@ throw_speed = 3 throw_range = 7 attack_verb = list("HONKED") + total_mass = 0 /obj/item/bikehorn/Initialize() . = ..() diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 6e977331a6..44ea5731a8 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..78be502b08 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 = 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 0d45960767..2a656f48cd 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() . = ..() @@ -147,8 +149,9 @@ flags_1 = CONDUCT_1 obj_flags = UNIQUE_RENAME w_class = WEIGHT_CLASS_BULKY - sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_- + 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() . = ..() @@ -230,6 +233,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 @@ -390,6 +394,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/toys.dm b/code/game/objects/items/toys.dm index 9ac5261e5f..46b49bac3d 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 = 1.25 /* @@ -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 = 2 /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,6 +329,7 @@ force_unwielded = 0 force_wielded = 0 attack_verb = list("attacked", "struck", "hit") + total_mass_on = 2.4 /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 @@ -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..7a7c8d36b3 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -279,6 +279,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 +291,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 +356,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 +409,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 +434,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..85af9b181f 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() . = ..() @@ -606,6 +609,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 0 item_flags = DROPDEL | ABSTRACT attack_verb = list("bopped") + total_mass = 0 /obj/item/slapper name = "slapper" @@ -617,6 +621,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 item_flags = DROPDEL | ABSTRACT attack_verb = list("slapped") hitsound = 'sound/effects/snap.ogg' + total_mass = 0 /obj/item/slapper/attack(mob/M, mob/living/carbon/human/user) if(ishuman(M)) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 4e0595362c..776fe9580b 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -166,6 +166,7 @@ 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/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/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/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 141e6b1fe1..62efbe99a0 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -14,6 +14,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/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/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..8be60107cf 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,37 @@ 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' 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/dualsaber/hypereutactic/wield() + . = ..() + slowdown = 0.5 -/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) +/obj/item/twohanded/dualsaber/hypereutactic/unwield() + . = ..() 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 +308,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 +333,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 +355,12 @@ force_unwielded = 0 force_wielded = 0 attack_verb = list("attacked", "struck", "hit") + total_mass_on = 2.4 -/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 +384,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 90172bbf43..ce28145dc2 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 6aee7dffa1..05cd66987b 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2892,10 +2892,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" From 12f2b767ab8bf345b0f87cc7bff2513fe7daaa10 Mon Sep 17 00:00:00 2001 From: Ghommie Date: Fri, 19 Jul 2019 21:23:07 +0200 Subject: [PATCH 02/54] removes stamina-free spammability. --- code/game/objects/items/clown_items.dm | 1 - code/game/objects/items/weaponry.dm | 2 -- 2 files changed, 3 deletions(-) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 0b71396d07..1d302b409e 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -111,7 +111,6 @@ throw_speed = 3 throw_range = 7 attack_verb = list("HONKED") - total_mass = 0 /obj/item/bikehorn/Initialize() . = ..() diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 85af9b181f..560731edfd 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -609,7 +609,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 0 item_flags = DROPDEL | ABSTRACT attack_verb = list("bopped") - total_mass = 0 /obj/item/slapper name = "slapper" @@ -621,7 +620,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 item_flags = DROPDEL | ABSTRACT attack_verb = list("slapped") hitsound = 'sound/effects/snap.ogg' - total_mass = 0 /obj/item/slapper/attack(mob/M, mob/living/carbon/human/user) if(ishuman(M)) From 94f5573e3a95d749d67a663605ff18c5f4b4bc6a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 19 Jul 2019 17:45:44 -0700 Subject: [PATCH 03/54] Update nanites.dm --- code/datums/diseases/advance/symptoms/nanites.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/diseases/advance/symptoms/nanites.dm b/code/datums/diseases/advance/symptoms/nanites.dm index f288b24068..b18e089a41 100644 --- a/code/datums/diseases/advance/symptoms/nanites.dm +++ b/code/datums/diseases/advance/symptoms/nanites.dm @@ -25,7 +25,7 @@ if(!..()) return var/mob/living/carbon/M = A.affected_mob - SEND_SIGNAL(M, COMSIG_NANITE_ADJUST_VOLUME, src, power) + SEND_SIGNAL(M, COMSIG_NANITE_ADJUST_VOLUME, power) if(reverse_boost && SEND_SIGNAL(M, COMSIG_HAS_NANITES)) if(prob(A.stage_prob)) A.stage = min(A.stage + 1,A.max_stages) From 85f87b667984c4bd7809faf697eb800a643d5453 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sat, 20 Jul 2019 21:26:18 +0200 Subject: [PATCH 04/54] Update code/game/objects/items/melee/energy.dm Co-Authored-By: deathride58 --- code/game/objects/items/melee/energy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 78be502b08..d854ab9f5a 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -10,7 +10,7 @@ /obj/item/melee/transforming/energy/Initialize() . = ..() - total_mass_on = w_class_on * 0.75 + total_mass_on = (total_mass_on ? total_mass_on : (w_class_on * 0.75)) if(active) set_light(brightness_on) START_PROCESSING(SSobj, src) From 6c712a69319f5da6911b04b0801d1ba477966e6b Mon Sep 17 00:00:00 2001 From: Ghommie Date: Wed, 24 Jul 2019 17:58:24 +0200 Subject: [PATCH 05/54] Implementing nerfs. --- code/__DEFINES/combat.dm | 1 + code/game/objects/items/toys.dm | 10 +++++----- code/game/objects/items/twohanded.dm | 6 ++++-- code/modules/antagonists/cult/cult_items.dm | 1 - code/modules/awaymissions/capture_the_flag.dm | 1 - .../game/objects/items/melee/eutactic_blades.dm | 13 +++---------- 6 files changed, 13 insertions(+), 19 deletions(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index ae7ce436ab..e31d2a278e 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -195,3 +195,4 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #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/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 46b49bac3d..46fabea8b0 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -30,7 +30,7 @@ throw_speed = 3 throw_range = 7 force = 0 - total_mass = 1.25 + total_mass = TOTAL_MASS_TINY_ITEM /* @@ -223,7 +223,7 @@ attack_verb = list("attacked", "struck", "hit") var/hacked = FALSE total_mass = 0.4 - var/total_mass_on = 2 + var/total_mass_on = TOTAL_MASS_TOY_SWORD /obj/item/toy/sword/attack_self(mob/user) active = !( active ) @@ -329,13 +329,13 @@ force_unwielded = 0 force_wielded = 0 attack_verb = list("attacked", "struck", "hit") - total_mass_on = 2.4 + 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" diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 7a7c8d36b3..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) . = ..() diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 9a17c3270b..9c429dd777 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/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/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm index 8be60107cf..68ab229f0a 100644 --- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm +++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm @@ -263,11 +263,11 @@ wieldsound = 'sound/weapons/nebon.ogg' unwieldsound = 'sound/weapons/neboff.ogg' 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") - item_flags = SLOWS_WHILE_IN_HAND spinnable = FALSE total_mass_on = 4 @@ -280,14 +280,6 @@ user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].") return TRUE -/obj/item/twohanded/dualsaber/hypereutactic/wield() - . = ..() - slowdown = 0.5 - -/obj/item/twohanded/dualsaber/hypereutactic/unwield() - . = ..() - slowdown = initial(slowdown) - /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") @@ -355,7 +347,8 @@ force_unwielded = 0 force_wielded = 0 attack_verb = list("attacked", "struck", "hit") - total_mass_on = 2.4 + total_mass_on = TOTAL_MASS_TOY_SWORD + slowdown_wielded = 0 /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 From 5055cd73b91f143899b313e11e755701eec93121 Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 28 Jul 2019 17:31:59 +0100 Subject: [PATCH 06/54] Hardsuit Helmets can now be used as internals masks. Rejoice, CE mains. Also reworks internals code a little to be much more friendly. Any head or mask item with the flag should now function as an internals mask if it has the ALLOWSINTERNALS flag. --- code/__DEFINES/obj_flags.dm | 2 +- code/_globalvars/bitfields.dm | 2 +- code/_onclick/hud/screen_objects.dm | 23 +++++++++++-------- code/game/objects/items/tanks/tanks.dm | 20 ++++++++++------ code/modules/clothing/chameleon.dm | 2 +- code/modules/clothing/masks/breath.dm | 4 ++-- code/modules/clothing/masks/gasmask.dm | 14 +++++------ code/modules/clothing/masks/hailer.dm | 4 ++-- .../clothing/spacesuits/_spacesuits.dm | 2 +- .../modules/mining/equipment/explorer_gear.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 4 ++-- .../mob/living/carbon/human/inventory.dm | 6 +++++ code/modules/mob/living/carbon/life.dm | 12 +++++++++- 14 files changed, 62 insertions(+), 37 deletions(-) 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..caa8d23df4 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -280,7 +280,7 @@ /obj/screen/internals/Click() if(!iscarbon(usr)) return - var/mob/living/carbon/C = usr + var/mob/living/carbon/human/C = usr if(C.incapacitated()) return @@ -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 C.get_internal_slots()) + 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/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 1245b7de94..3cc5249b56 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -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 H.get_internal_slots()) + 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/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/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/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/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 aa87a6e46d..2a074df420 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -238,7 +238,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)) @@ -246,7 +246,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/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index d35df6b789..3dd4807251 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -77,6 +77,12 @@ s_store, ) +/mob/living/carbon/human/proc/get_internal_slots() + return list( + head, + wear_mask, + ) + //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() /mob/living/carbon/human/equip_to_slot(obj/item/I, slot) if(!..()) //a check failed or the item has already found its slot diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 9dd55c361e..999544d1f7 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -304,11 +304,21 @@ return /mob/living/carbon/proc/get_breath_from_internal(volume_needed) + var/obj/item/clothing/check + var/internals = FALSE + var/internalslots = list( + head, + wear_mask, + ) + + for(check in internalslots) + 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 == FALSE && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) internal = null update_internals_hud_icon(0) else From 1db0ceff1f52fc8441b2464208c3f3654840650e Mon Sep 17 00:00:00 2001 From: BurgerLua Date: Wed, 31 Jul 2019 03:33:33 -0700 Subject: [PATCH 07/54] Added --- .../antagonists/nukeop/equipment/nuclear_challenge.dm | 2 ++ code/modules/antagonists/nukeop/equipment/nuclearbomb.dm | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index c616459bd1..f68da8bc28 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)" @@ -62,6 +63,7 @@ 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 new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS + CEILING(PLAYER_SCALING * GLOB.player_list.len, 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) From d5b0104a3e87a60e8103406bcf9a973f70dedea6 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 2 Aug 2019 05:46:49 -0700 Subject: [PATCH 08/54] Update miscellaneous.dm --- code/modules/clothing/shoes/miscellaneous.dm | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index e6554f6125..1aa35baafe 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -219,17 +219,13 @@ var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction - if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, .proc/hop_end))) - jumping = TRUE + if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)) playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1) + addtimer(src, VARSET_CALLBACK(src, recharging_time, world.time + recharging_rate)) user.visible_message("[usr] dashes forward into the air!") else to_chat(user, "Something prevents you from dashing forward!") -/obj/item/clothing/shoes/bhop/proc/hop_end() - jumping = FALSE - recharging_time = world.time + recharging_rate - /obj/item/clothing/shoes/singery name = "yellow performer's boots" desc = "These boots were made for dancing." From 1c1ca84c3a81a7b55cdda7d298b6f87fa7e091eb Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 3 Aug 2019 00:49:57 -0700 Subject: [PATCH 09/54] Update miscellaneous.dm --- code/modules/clothing/shoes/miscellaneous.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 1aa35baafe..4659de3e6a 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -221,7 +221,7 @@ if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)) playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1) - addtimer(src, VARSET_CALLBACK(src, recharging_time, world.time + recharging_rate)) + recharging_time = world.time + recharging_rate user.visible_message("[usr] dashes forward into the air!") else to_chat(user, "Something prevents you from dashing forward!") From a0a21dc01fd6d81feb9fd236035fe6dc2a3ca28d Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sat, 3 Aug 2019 18:36:46 +0100 Subject: [PATCH 10/54] !iscarbon to !ishuman --- code/_onclick/hud/screen_objects.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index caa8d23df4..00ec766ea5 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -278,7 +278,7 @@ screen_loc = ui_internal /obj/screen/internals/Click() - if(!iscarbon(usr)) + if(!ishuman(usr)) return var/mob/living/carbon/human/C = usr if(C.incapacitated()) From 46e4023ba9b9f70d56390d988637c614e01ff02a Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 4 Aug 2019 05:07:24 +0100 Subject: [PATCH 11/54] Monkey business --- code/_onclick/hud/screen_objects.dm | 4 ++-- code/game/objects/items/tanks/tanks.dm | 2 +- code/modules/mob/living/carbon/human/inventory.dm | 6 ------ code/modules/mob/living/carbon/inventory.dm | 6 ++++++ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 00ec766ea5..75349c5789 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -278,9 +278,9 @@ screen_loc = ui_internal /obj/screen/internals/Click() - if(!ishuman(usr)) + if(!iscarbon(usr)) return - var/mob/living/carbon/human/C = usr + var/mob/living/carbon/C = usr if(C.incapacitated()) return diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 3cc5249b56..0ddca78c95 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 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 3dd4807251..d35df6b789 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -77,12 +77,6 @@ s_store, ) -/mob/living/carbon/human/proc/get_internal_slots() - return list( - head, - wear_mask, - ) - //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() /mob/living/carbon/human/equip_to_slot(obj/item/I, slot) if(!..()) //a check failed or the item has already found its slot diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index bc2d6132e1..2c4627b0ee 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -140,3 +140,9 @@ /mob/living/carbon/proc/get_holding_bodypart_of_item(obj/item/I) var/index = get_held_index_of_item(I) return index && hand_bodyparts[index] + +/mob/living/carbon/proc/get_internal_slots() + return list( + head, + wear_mask, + ) From 0a7054c6048f043156679c2551328a768e2890c8 Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 4 Aug 2019 05:26:02 +0100 Subject: [PATCH 12/54] Update code/modules/mob/living/carbon/inventory.dm Co-Authored-By: deathride58 --- code/modules/mob/living/carbon/inventory.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 2c4627b0ee..388cf81a43 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -144,5 +144,5 @@ /mob/living/carbon/proc/get_internal_slots() return list( head, - wear_mask, + wear_mask ) From 5e757f1012355d761c865b891394bdccfdd21e19 Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 4 Aug 2019 05:26:16 +0100 Subject: [PATCH 13/54] Update code/modules/mob/living/carbon/life.dm Co-Authored-By: deathride58 --- code/modules/mob/living/carbon/life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 999544d1f7..9f4f7ba868 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -318,7 +318,7 @@ if(internal.loc != src) internal = null update_internals_hud_icon(0) - else if (internals == FALSE && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + else if (!internals && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) internal = null update_internals_hud_icon(0) else From f9d829b111fd18e56e03b4734c80752229a0ecd9 Mon Sep 17 00:00:00 2001 From: Chayse Ramsay Date: Sun, 4 Aug 2019 05:48:08 +0100 Subject: [PATCH 14/54] Proc to define --- code/__DEFINES/inventory.dm | 3 +++ code/_onclick/hud/screen_objects.dm | 2 +- code/game/objects/items/tanks/tanks.dm | 2 +- code/modules/mob/living/carbon/inventory.dm | 6 ------ code/modules/mob/living/carbon/life.dm | 6 +----- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 03cfde802f..5e200c38c0 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -230,3 +230,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/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 75349c5789..4c666d708c 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -293,7 +293,7 @@ var/obj/item/clothing/check var/internals = FALSE - for(check in C.get_internal_slots()) + 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) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 0ddca78c95..d409e40575 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -36,7 +36,7 @@ var/obj/item/clothing/check var/internals = FALSE - for(check in H.get_internal_slots()) + 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) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 2c4627b0ee..bc2d6132e1 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -140,9 +140,3 @@ /mob/living/carbon/proc/get_holding_bodypart_of_item(obj/item/I) var/index = get_held_index_of_item(I) return index && hand_bodyparts[index] - -/mob/living/carbon/proc/get_internal_slots() - return list( - head, - wear_mask, - ) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 999544d1f7..19e04fb43c 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -306,12 +306,8 @@ /mob/living/carbon/proc/get_breath_from_internal(volume_needed) var/obj/item/clothing/check var/internals = FALSE - var/internalslots = list( - head, - wear_mask, - ) - for(check in internalslots) + for(check in GET_INTERNAL_SLOTS(src)) if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS)) internals = TRUE if(internal) From fb4709f6dbe000f24adaa8c9048171821fbd0701 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 5 Aug 2019 01:49:28 -0700 Subject: [PATCH 15/54] Update hierophant.dm --- .../simple_animal/hostile/megafauna/hierophant.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 6577553a6a..3a495766ac 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -158,6 +158,7 @@ Difficulty: Normal else burst_range = 3 INVOKE_ASYNC(src, .proc/burst, get_turf(src), 0.25) //melee attacks on living mobs cause it to release a fast burst if on cooldown + OpenFire() else devour(L) else @@ -426,6 +427,7 @@ Difficulty: Normal /mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original, spread_speed = 0.5) //release a wave of blasts playsound(original,'sound/machines/airlockopen.ogg', 200, 1) var/last_dist = 0 + var/list/hit_mobs = list() //don't hit people multiple times. for(var/t in spiral_range_turfs(burst_range, original)) var/turf/T = t if(!T) @@ -434,7 +436,7 @@ Difficulty: Normal if(dist > last_dist) last_dist = dist sleep(1 + min(burst_range - last_dist, 12) * spread_speed) //gets faster as it gets further out - new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE) + new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE, hit_mobs) /mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck) if(!istype(A) || get_dist(A, src) <= 2) @@ -472,7 +474,7 @@ Difficulty: Normal duration = 100 smooth = SMOOTH_TRUE -/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) +/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caste r) . = ..() queue_smooth_neighbors(src) queue_smooth(src) @@ -591,8 +593,10 @@ Difficulty: Normal var/friendly_fire_check = FALSE var/bursting = FALSE //if we're bursting and need to hit anyone crossing us -/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire) +/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire, list/only_hit_once) . = ..() + if(only_hit_once) + hit_things = only_hit_once friendly_fire_check = friendly_fire if(new_caster) hit_things += new_caster From 58f8920008768b3b8fccd83a244830cb3105c4e4 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 5 Aug 2019 01:51:51 -0700 Subject: [PATCH 16/54] Update hierophant.dm --- .../mob/living/simple_animal/hostile/megafauna/hierophant.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 3a495766ac..bb80e34d19 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -158,7 +158,8 @@ Difficulty: Normal else burst_range = 3 INVOKE_ASYNC(src, .proc/burst, get_turf(src), 0.25) //melee attacks on living mobs cause it to release a fast burst if on cooldown - OpenFire() + if(L.stat == CONSCIOUS && L.health >= 30) + OpenFire() else devour(L) else From 48db0b129ea152ff6771e1361048394fb305325a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 5 Aug 2019 01:55:05 -0700 Subject: [PATCH 17/54] Update hierophant.dm --- .../mob/living/simple_animal/hostile/megafauna/hierophant.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index bb80e34d19..cca39cfea6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -475,7 +475,7 @@ Difficulty: Normal duration = 100 smooth = SMOOTH_TRUE -/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caste r) +/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) . = ..() queue_smooth_neighbors(src) queue_smooth(src) From e3c3742aec72785534988a2a4c9895b35d5e4e14 Mon Sep 17 00:00:00 2001 From: Sishen Date: Mon, 5 Aug 2019 06:27:10 -0400 Subject: [PATCH 18/54] Update guardian.dm --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 1a918766b6..12cb81bccb 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -58,6 +58,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians . = ..() +/mob/living/simple_animal/hostile/guardian/CtrlClickOn(atom/A) + return + /mob/living/simple_animal/hostile/guardian/med_hud_set_health() if(summoner) var/image/holder = hud_list[HEALTH_HUD] From 9f5b54940c21d2e24e58d4bc4cae4a775b95962e Mon Sep 17 00:00:00 2001 From: Sishen Date: Mon, 5 Aug 2019 21:31:17 -0400 Subject: [PATCH 19/54] adds in a memento mori check --- .../modules/mob/living/simple_animal/guardian/guardian.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 12cb81bccb..ba516046cb 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -59,8 +59,12 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians . = ..() /mob/living/simple_animal/hostile/guardian/CtrlClickOn(atom/A) - return - + var/mob/living/carbon/C = A + if((iscarbon(C)) && (istype(C.wear_neck, /obj/item/clothing/neck/necklace/memento_mori))) + return + else + . = ..() + /mob/living/simple_animal/hostile/guardian/med_hud_set_health() if(summoner) var/image/holder = hud_list[HEALTH_HUD] From 7a22e73a79fc78d4cb104aadab8374f73a2f75f7 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Tue, 6 Aug 2019 08:47:10 -0400 Subject: [PATCH 20/54] Update speech.dm --- code/datums/mutations/speech.dm | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) 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) From df5366e9115c38a249153a12bd796b20ab2b678d Mon Sep 17 00:00:00 2001 From: Ghommie Date: Thu, 8 Aug 2019 05:06:53 +0200 Subject: [PATCH 21/54] Removes a redunant Remove() from high luminosity eyes. --- code/modules/surgery/organs/eyes.dm | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) 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) From 1f05123816789a725ddb2ff5d1321c8d9da91321 Mon Sep 17 00:00:00 2001 From: Sishen Date: Thu, 8 Aug 2019 03:04:51 -0400 Subject: [PATCH 22/54] ook ook --- code/modules/antagonists/changeling/powers/mutations.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 99d8ae797b..894fe71c4f 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -161,6 +161,7 @@ throwforce = 0 //Just to be on the safe side throw_range = 0 throw_speed = 0 + armour_penetration = 40 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = IS_SHARP From 582b355224cc891d9c9e1d5b2d3d5d89fae524a9 Mon Sep 17 00:00:00 2001 From: Sishen Date: Thu, 8 Aug 2019 11:00:23 -0400 Subject: [PATCH 23/54] Update guardian.dm --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index ba516046cb..6d9a25b1ec 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -61,6 +61,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians /mob/living/simple_animal/hostile/guardian/CtrlClickOn(atom/A) var/mob/living/carbon/C = A if((iscarbon(C)) && (istype(C.wear_neck, /obj/item/clothing/neck/necklace/memento_mori))) + to_chat(user,"The memento mori repels your hands, you cannot grasp [C]!") return else . = ..() From 1fc69a13a4b2910492530d54a5a838df13fb9e14 Mon Sep 17 00:00:00 2001 From: Sishen Date: Thu, 8 Aug 2019 22:02:12 -0400 Subject: [PATCH 24/54] okay fixed --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 6d9a25b1ec..24d8afb60c 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -61,11 +61,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians /mob/living/simple_animal/hostile/guardian/CtrlClickOn(atom/A) var/mob/living/carbon/C = A if((iscarbon(C)) && (istype(C.wear_neck, /obj/item/clothing/neck/necklace/memento_mori))) - to_chat(user,"The memento mori repels your hands, you cannot grasp [C]!") + to_chat(mind,"The memento mori repels your hands, you cannot grasp [C]!") + verbs -= /mob/living/verb/pulled return else + verbs += /mob/living/verb/pulled . = ..() - + /mob/living/simple_animal/hostile/guardian/med_hud_set_health() if(summoner) var/image/holder = hud_list[HEALTH_HUD] From b8907c2f97cb9c107f386834cf40d2efa97427e8 Mon Sep 17 00:00:00 2001 From: Sishen Date: Fri, 9 Aug 2019 13:47:36 -0400 Subject: [PATCH 25/54] fixing what i forgot to do --- code/game/mecha/combat/durand.dm | 3 +++ code/game/mecha/combat/gygax.dm | 3 +++ code/game/mecha/combat/honker.dm | 4 +++- code/game/mecha/combat/phazon.dm | 3 +++ 4 files changed, 12 insertions(+), 1 deletion(-) 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) From 77e0551616a002f241c5af7930c7d65617ddc04c Mon Sep 17 00:00:00 2001 From: MrJWhit <48370570+MrJWhit@users.noreply.github.com> Date: Fri, 9 Aug 2019 13:56:07 -0400 Subject: [PATCH 26/54] Adds a line in the spawntext for IAA Adds "By no means reveal that you, or any other NT employees, are undercover agents." at the spawntext --- code/modules/antagonists/traitor/IAA/internal_affairs.dm | 2 ++ 1 file changed, 2 insertions(+) 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() From b0a28d1a29e42c7bf4ced74e569e3b4e995009c0 Mon Sep 17 00:00:00 2001 From: Sishen Date: Sat, 10 Aug 2019 02:16:07 -0400 Subject: [PATCH 27/54] Update mutations.dm --- code/modules/antagonists/changeling/powers/mutations.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 894fe71c4f..893ee16d6b 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -161,7 +161,7 @@ throwforce = 0 //Just to be on the safe side throw_range = 0 throw_speed = 0 - armour_penetration = 40 + armour_penetration = 20 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = IS_SHARP From 15dbb7ff3273190b4a2fe450e9de642c9eb54b1b Mon Sep 17 00:00:00 2001 From: Sishen Date: Sat, 10 Aug 2019 07:03:45 -0400 Subject: [PATCH 28/54] Update guardian.dm --- .../living/simple_animal/guardian/guardian.dm | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 24d8afb60c..581bcbd363 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() @@ -57,17 +57,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians setthemename(theme) . = ..() - -/mob/living/simple_animal/hostile/guardian/CtrlClickOn(atom/A) - var/mob/living/carbon/C = A - if((iscarbon(C)) && (istype(C.wear_neck, /obj/item/clothing/neck/necklace/memento_mori))) - to_chat(mind,"The memento mori repels your hands, you cannot grasp [C]!") - verbs -= /mob/living/verb/pulled - return - else - verbs += /mob/living/verb/pulled - . = ..() - + /mob/living/simple_animal/hostile/guardian/med_hud_set_health() if(summoner) var/image/holder = hud_list[HEALTH_HUD] @@ -159,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() ..() From 51011ccf974a5f52005cd436fb7a451b017ecc04 Mon Sep 17 00:00:00 2001 From: Sishen Date: Sat, 10 Aug 2019 07:05:53 -0400 Subject: [PATCH 29/54] Update guardian.dm --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 581bcbd363..73274dcfaf 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -57,7 +57,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians setthemename(theme) . = ..() - + /mob/living/simple_animal/hostile/guardian/med_hud_set_health() if(summoner) var/image/holder = hud_list[HEALTH_HUD] From 234d058cc26e32885ea9bd41f236ef14f2d12f52 Mon Sep 17 00:00:00 2001 From: Sishen Date: Sat, 10 Aug 2019 07:28:35 -0400 Subject: [PATCH 30/54] Update mecha_control_console.dm --- code/game/mecha/mecha_control_console.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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() From d77360c794921c44372436b1d8658a873a02271e Mon Sep 17 00:00:00 2001 From: Cebutris Date: Sat, 10 Aug 2019 19:32:12 -0400 Subject: [PATCH 31/54] gives tea aspera proper reagents --- code/modules/hydroponics/grown/tea_coffee.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index fc84617ed8..d9e775acc0 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -14,6 +14,7 @@ icon_dead = "tea-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/tea/astra) + reagents_add = list("teapowder" = 0.1) /obj/item/reagent_containers/food/snacks/grown/tea seed = /obj/item/seeds/tea From df136ab96c599de96bd41646e7f9d6b2a281ec90 Mon Sep 17 00:00:00 2001 From: Cebutris Date: Sat, 10 Aug 2019 23:28:16 -0400 Subject: [PATCH 32/54] lactation is now a preference --- code/__HELPERS/mobs.dm | 1 + code/modules/client/preferences.dm | 6 ++++++ code/modules/client/preferences_savefile.dm | 1 + modular_citadel/code/modules/arousal/organs/genitals.dm | 1 + modular_citadel/code/modules/client/preferences_savefile.dm | 1 + 5 files changed, 10 insertions(+) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5ec839130a..7ec99fa885 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -189,6 +189,7 @@ "breasts_size" = pick(GLOB.breasts_size_list), "breasts_shape" = "Pair", "breasts_fluid" = "milk", + "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = pick(GLOB.vagina_shapes_list), "vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e86ec41a63..4f4e8cfdac 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -144,6 +144,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) "breasts_size" = "C", "breasts_shape" = "Pair", "breasts_fluid" = "milk", + "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = "Human", "vag_color" = "fff", @@ -743,6 +744,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "    Change
" dat += "Cup Size:[features["breasts_size"]]" dat += "Breast Shape:[features["breasts_shape"]]" + dat += "Lactates:[features["breasts_producing"] == TRUE ? "Yes" : "No"]" dat += "" dat += "" dat += "" @@ -2053,6 +2055,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["eggsack_internal"] = !features["eggsack_internal"] if("has_breasts") features["has_breasts"] = !features["has_breasts"] + if(features["has_breasts"] == FALSE) + features["breasts_producing"] = FALSE + if("breasts_producing") + features["breasts_producing"] = !features["breasts_producing"] if("has_vag") features["has_vag"] = !features["has_vag"] if(features["has_vag"] == FALSE) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 4ce91ffd94..5a994c0253 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -347,6 +347,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_breasts_shape"] >> features["breasts_shape"] S["feature_breasts_color"] >> features["breasts_color"] S["feature_breasts_fluid"] >> features["breasts_fluid"] + S["feature_breasts_producing"] >> features["breasts_producing"] //vagina features S["feature_has_vag"] >> features["has_vag"] S["feature_vag_shape"] >> features["vag_shape"] diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index c4fffea355..1ecdb1e970 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -216,6 +216,7 @@ B.size = dna.features["breasts_size"] B.shape = dna.features["breasts_shape"] B.fluid_id = dna.features["breasts_fluid"] + B.producing = dna.features["breasts_producing"] B.update() diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index 2921f70684..0a353e3f5d 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -65,6 +65,7 @@ WRITE_FILE(S["feature_breasts_shape"], features["breasts_shape"]) WRITE_FILE(S["feature_breasts_color"], features["breasts_color"]) WRITE_FILE(S["feature_breasts_fluid"], features["breasts_fluid"]) + WRITE_FILE(S["feature_breasts_producing"], features["breasts_producing"]) //vagina features WRITE_FILE(S["feature_has_vag"], features["has_vag"]) WRITE_FILE(S["feature_vag_shape"], features["vag_shape"]) From 23d4b9827dc67c631d3a6b8b80dd80b00d108992 Mon Sep 17 00:00:00 2001 From: Sishen Date: Sun, 11 Aug 2019 01:19:37 -0400 Subject: [PATCH 33/54] fix, yadda yadda --- code/game/machinery/computer/Operating.dm | 4 +- code/modules/mob/mob.dm | 6 +- .../advanced/bioware/nerve_grounding.dm | 10 ++- .../advanced/bioware/nerve_splicing.dm | 13 +-- .../advanced/bioware/vein_threading.dm | 13 +-- code/modules/surgery/advanced/brainwashing.dm | 24 +++--- code/modules/surgery/advanced/lobotomy.dm | 17 ++-- .../surgery/advanced/necrotic_revival.dm | 13 +-- code/modules/surgery/advanced/pacification.dm | 17 ++-- code/modules/surgery/advanced/revival.dm | 20 +++-- .../modules/surgery/advanced/viral_bonding.dm | 14 ++-- code/modules/surgery/amputation.dm | 16 ++-- code/modules/surgery/brain_surgery.dm | 19 +++-- code/modules/surgery/cavity_implant.dm | 36 +++++---- code/modules/surgery/core_removal.dm | 13 +-- code/modules/surgery/eye_surgery.dm | 22 +++-- code/modules/surgery/helpers.dm | 22 +++-- code/modules/surgery/implant_removal.dm | 22 ++--- code/modules/surgery/limb_augmentation.dm | 25 +++--- code/modules/surgery/lipoplasty.dm | 27 ++++--- code/modules/surgery/mechanic_steps.dm | 34 ++++---- code/modules/surgery/organ_manipulation.dm | 41 +++++----- code/modules/surgery/organic_steps.dm | 64 +++++++++------ code/modules/surgery/plastic_surgery.dm | 23 ++++-- .../modules/surgery/prosthetic_replacement.dm | 25 +++--- .../modules/surgery/remove_embedded_object.dm | 14 ++-- code/modules/surgery/surgery_step.dm | 81 ++++++++----------- 27 files changed, 346 insertions(+), 289 deletions(-) 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/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/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/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) From f17aea268c6d007db815dea90922c1c03c4b7311 Mon Sep 17 00:00:00 2001 From: Jay Date: Sun, 11 Aug 2019 01:07:20 -0500 Subject: [PATCH 34/54] Donator item --- icons/mob/custom_w.dmi | Bin 38166 -> 38407 bytes icons/obj/custom.dmi | Bin 24551 -> 24829 bytes .../code/modules/client/loadout/__donator.dm | 8 +++++++- .../modules/custom_loadout/custom_items.dm | 8 ++++++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi index c22ff7f15980043090f03dcece9acb855c1df51d..1b917d9434d70e7fb6701178d9451074d0c2c38d 100644 GIT binary patch delta 18332 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 delta 5166 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 diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index e3dbbbd490..5a0d69202a 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -438,7 +438,13 @@ datum/gear/darksabresheath /datum/gear/borgplush name = "Robot Plush" category = SLOT_IN_BACKPACK - /obj/item/toy/plush/borgplushie + path = /obj/item/toy/plush/borgplushie ckeywhitelist = list("nicholaiavenicci") +/datum/gear/donorberet + name = "Atmos Beret + category = SLOT_HEAD + path = /obj/item/clothing/head/blueberet + ckeywhitelist = list("foxystalin") + diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index ece673587f..977d28199e 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -508,3 +508,11 @@ icon = 'icons/obj/custom.dmi' alternate_worn_icon = 'icons/mob/custom_w.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION + +/obj/item/clothing/head/blueberet + name = "Atmos Beret" + desc = "A fitted beret designed to be worn by Atmos Techs." + icon_state = "blueberet" + item_state = "blueberet" + icon = 'icons/obj/custom.dmi' + alternate_worn_icon = 'icons/mob/custom_w.dmi' From 675c042958af88f18af466af930e51e57507011b Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 11 Aug 2019 08:38:13 -0400 Subject: [PATCH 35/54] Update __donator.dm --- modular_citadel/code/modules/client/loadout/__donator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 5a0d69202a..fcc1499d99 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -442,7 +442,7 @@ datum/gear/darksabresheath ckeywhitelist = list("nicholaiavenicci") /datum/gear/donorberet - name = "Atmos Beret + name = "Atmos Beret" category = SLOT_HEAD path = /obj/item/clothing/head/blueberet ckeywhitelist = list("foxystalin") From aa4e20c6b3d2e0372755f1b9bcb7b37003906e1b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 11 Aug 2019 11:59:32 -0500 Subject: [PATCH 36/54] Automatic changelog generation for PR #9101 [ci skip] --- html/changelogs/AutoChangeLog-pr-9101.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9101.yml 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." From ffd4edffe6eda7983b81556cdb312e159e7b69d8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 11 Aug 2019 12:01:12 -0500 Subject: [PATCH 37/54] Automatic changelog generation for PR #9079 [ci skip] --- html/changelogs/AutoChangeLog-pr-9079.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9079.yml 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" From 0dcd3a2688787d36158f9ff8a93d6847bf6c9c79 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 11 Aug 2019 12:08:47 -0500 Subject: [PATCH 38/54] Automatic changelog generation for PR #9062 [ci skip] --- html/changelogs/AutoChangeLog-pr-9062.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9062.yml 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" From f81ad400b4a2cabeb2105d5a4b979958002cbc57 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 11 Aug 2019 12:11:14 -0500 Subject: [PATCH 39/54] Automatic changelog generation for PR #9054 [ci skip] --- html/changelogs/AutoChangeLog-pr-9054.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9054.yml 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" From 5f74d55bdef30246b4878ae390e08f4c658fcbe4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 11 Aug 2019 12:12:22 -0500 Subject: [PATCH 40/54] Automatic changelog generation for PR #8927 [ci skip] --- html/changelogs/AutoChangeLog-pr-8927.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8927.yml 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." From ed71bf4104143058f73edbd5ac7c41b7411ba1aa Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 11 Aug 2019 12:13:04 -0500 Subject: [PATCH 41/54] Automatic changelog generation for PR #9010 [ci skip] --- html/changelogs/AutoChangeLog-pr-9010.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9010.yml 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." From cf44c96be95b26d788b7b47cd60d54f23eeb3ca6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 11 Aug 2019 12:15:51 -0500 Subject: [PATCH 42/54] Automatic changelog generation for PR #8992 [ci skip] --- html/changelogs/AutoChangeLog-pr-8992.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8992.yml 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." From c0bbb099f8d4f4af2972aa63746e655c044b116c Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 12 Aug 2019 00:36:45 +0100 Subject: [PATCH 43/54] Fixes disappearing chems. --- code/modules/reagents/chemistry/holder.dm | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 300e73a6fd..6e617a5050 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1,3 +1,5 @@ +#define CHEMICAL_QUANTISATION_LEVEL 0.0001 + /proc/build_chemical_reagent_list() //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -471,7 +473,7 @@ return 0 for(var/B in cached_required_reagents) - multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) + multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), CHEMICAL_QUANTISATION_LEVEL)) for(var/P in selected_reaction.results) targetVol = cached_results[P]*multiplier @@ -498,7 +500,7 @@ return 0 for(var/B in cached_required_reagents) // - multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01)) + multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), CHEMICAL_QUANTISATION_LEVEL)) for(var/B in cached_required_reagents) remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1, ignore_pH = TRUE) @@ -646,8 +648,8 @@ addChemAmmount = deltaT * stepChemAmmount if (addChemAmmount >= (targetVol - reactedVol)) addChemAmmount = (targetVol - reactedVol) - if (addChemAmmount < 0.01) - addChemAmmount = 0.01 + if (addChemAmmount < CHEMICAL_QUANTISATION_LEVEL) + addChemAmmount = CHEMICAL_QUANTISATION_LEVEL removeChemAmmount = (addChemAmmount/cached_results[P]) //This is kept for future bugtesters. //message_admins("Reaction vars: PreReacted: [reactedVol] of [targetVol]. deltaT [deltaT], multiplier [multiplier], Step [stepChemAmmount], uncapped Step [deltaT*(multiplier*cached_results[P])], addChemAmmount [addChemAmmount], removeFactor [removeChemAmmount] Pfactor [cached_results[P]], adding [addChemAmmount]") @@ -693,7 +695,7 @@ //Make sure things are limited. pH = CLAMP(pH, 0, 14) - + //return said amount to compare for next step. return (reactedVol) @@ -739,7 +741,7 @@ total_volume = 0 for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - if(R.volume < 0.1) + if(R.volume < CHEMICAL_QUANTISATION_LEVEL) del_reagent(R.id) else total_volume += R.volume @@ -808,7 +810,7 @@ if(!isnum(amount) || !amount) return FALSE - if(amount <= 0.00) + if(amount <= CHEMICAL_QUANTISATION_LEVEL)//To prevent small ammount problems. return FALSE var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] @@ -967,7 +969,7 @@ if(!amount) return R else - if(R.volume >= amount) + if(round(R.volume, CHEMICAL_QUANTISATION_LEVEL) >= amount) return R else return 0 @@ -979,7 +981,7 @@ for(var/_reagent in cached_reagents) var/datum/reagent/R = _reagent if (R.id == reagent) - return R.volume + return round(R.volume, CHEMICAL_QUANTISATION_LEVEL) return 0 From 51a6ae96a0c612fc53e1bfb64121d168cec23d9a Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 12 Aug 2019 00:37:57 +0100 Subject: [PATCH 44/54] R.data --- code/modules/reagents/chemistry/holder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6e617a5050..d1eec39f44 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -96,7 +96,7 @@ var/list/data = list() for(var/r in reagent_list) //no reagents will be left behind var/datum/reagent/R = r - data += "[R.id] ([round(R.volume, 0.1)]u)" + data += "[R.id] ([round(R.volume, CHEMICAL_QUANTISATION_LEVEL)]u)" //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. return english_list(data) From ae1191a4691525e761d88e934c4fcd32786f84e2 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 12 Aug 2019 05:10:05 +0100 Subject: [PATCH 45/54] Changes an oversight (and a unintended wah!) --- .../code/modules/reagents/chemistry/reagents/SDGF.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index cb222fd967..f629780810 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -331,7 +331,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(86)//mean clone time! if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.) - message_admins("(non-infectious) Zombie spawned at [M.loc], produced by impure chem, wah!") + message_admins("(non-infectious) SDZF: Zombie spawned at [M]!") M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") From 5a9b2bcad7a984e0e3f33e7a7d9cbd5f7c0e38ec Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 12 Aug 2019 05:10:46 +0100 Subject: [PATCH 46/54] Added COORD --- .../code/modules/reagents/chemistry/reagents/SDGF.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index f629780810..499510b5d4 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -331,7 +331,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(86)//mean clone time! if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.) - message_admins("(non-infectious) SDZF: Zombie spawned at [M]!") + message_admins("(non-infectious) SDZF: Zombie spawned at [M] [COORD(M)]!") M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") From 411e0cc2cc225dc69eb666bdf5f1a22e96970a0f Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 12 Aug 2019 00:17:31 -0700 Subject: [PATCH 47/54] Update on_move.dm --- code/modules/shuttle/on_move.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index a6904c28cc..dd2d7483e3 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -179,7 +179,7 @@ All ShuttleMove procs go here for(var/obj/machinery/door/airlock/A in range(1, src)) // includes src A.shuttledocked = FALSE A.air_tight = TRUE - INVOKE_ASYNC(A, /obj/machinery/door/.proc/close) + addtimer(CALLBACK(A, /obj/machinery/door/.proc/close), 0) /obj/machinery/door/airlock/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) . = ..() From 382487fdc2d0cfc27062631c6a6439db053ffffd Mon Sep 17 00:00:00 2001 From: Sishen Date: Tue, 13 Aug 2019 05:32:37 -0400 Subject: [PATCH 48/54] viruseseses-cures --- code/datums/diseases/advance/advance.dm | 43 ++++++++++++++++--- .../antagonists/disease/disease_disease.dm | 2 +- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index f506f44ad5..a4a4936f0e 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -31,13 +31,43 @@ var/id = "" var/processing = FALSE var/mutable = TRUE //set to FALSE to prevent most in-game methods of altering the disease via virology + var/oldres // The order goes from easy to cure to hard to cure. var/static/list/advance_cures = list( - "sodiumchloride", "sugar", "orangejuice", - "spaceacillin", "salglu_solution", "ethanol", - "leporazine", "synaptizine", "lipolicide", - "silver", "gold" + list( // level 1 + "copper", "silver", "iodine", "iron", "carbon" + ), + list( // level 2 + "potassium", "ethanol", "lithium", "silicon", "bromine" + ), + list( // level 3 + "sodiumchloride", "sugar", "orangejuice", "tomatojuice", "milk" + ), + list( //level 4 + "spaceacillin", "salglu_solution", "epinephrine", "charcoal" + ), + list( //level 5 + "oil", "synaptizine", "mannitol", "space_drugs", "cryptobiolin" + ), + list( // level 6 + "phenol", "inacusiate", "oculine", "antihol" + ), + list( // level 7 + "leporazine", "mindbreaker", "corazone" + ), + list( // level 8 + "pax", "happiness", "ephedrine" + ), + list( // level 9 + "lipolicide", "sal_acid" + ), + list( // level 10 + "haloperidol", "aranesp", "diphenhydramine" + ), + list( //level 11 + "modafinil", "anacea" + ) ) /* @@ -250,7 +280,10 @@ /datum/disease/advance/proc/GenerateCure() if(properties && properties.len) var/res = CLAMP(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) - cures = list(advance_cures[res]) + if(res == oldres) + return + cures = list(pick(advance_cures[res])) + oldres = res // Get the cure name from the cure_id var/datum/reagent/D = GLOB.chemical_reagents_list[cures[1]] diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm index 21d0381982..b4b8ac0956 100644 --- a/code/modules/antagonists/disease/disease_disease.dm +++ b/code/modules/antagonists/disease/disease_disease.dm @@ -51,7 +51,7 @@ if(cures.len) return var/list/not_used = advance_cures.Copy() - cures = list(pick_n_take(not_used), pick_n_take(not_used)) + cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used))) // Get the cure name from the cure_id var/datum/reagent/D1 = GLOB.chemical_reagents_list[cures[1]] From b23b574bafa88ecfb886c300b472dd8d622ba409 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 14 Aug 2019 13:59:16 -0500 Subject: [PATCH 49/54] Automatic changelog generation for PR #9113 [ci skip] --- html/changelogs/AutoChangeLog-pr-9113.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9113.yml diff --git a/html/changelogs/AutoChangeLog-pr-9113.yml b/html/changelogs/AutoChangeLog-pr-9113.yml new file mode 100644 index 0000000000..1bdae7cab9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9113.yml @@ -0,0 +1,5 @@ +author: "Fermis" +delete-after: True +changes: + - bugfix: "fixes fermichem reactions for tiny volumes work" + - tweak: "makes quantisation level for chemistry finer" From 3610d1486912b1bf036d4215e0e1f14bf582471a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 14 Aug 2019 13:59:44 -0500 Subject: [PATCH 50/54] Automatic changelog generation for PR #9115 [ci skip] --- html/changelogs/AutoChangeLog-pr-9115.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9115.yml diff --git a/html/changelogs/AutoChangeLog-pr-9115.yml b/html/changelogs/AutoChangeLog-pr-9115.yml new file mode 100644 index 0000000000..32c3109c43 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9115.yml @@ -0,0 +1,4 @@ +author: "Thalpy" +delete-after: True +changes: + - bugfix: "fixes message_admins in SDZF" From b6478b0254a2d850f46de33f0982de2601430c6b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 14 Aug 2019 14:31:49 -0500 Subject: [PATCH 51/54] Automatic changelog generation for PR #9098 [ci skip] --- html/changelogs/AutoChangeLog-pr-9098.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9098.yml diff --git a/html/changelogs/AutoChangeLog-pr-9098.yml b/html/changelogs/AutoChangeLog-pr-9098.yml new file mode 100644 index 0000000000..6e11eaeb90 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9098.yml @@ -0,0 +1,4 @@ +author: "Cebutris" +delete-after: True +changes: + - bugfix: "Tea Aspera now properly contains tea powder" From bcf3c1a172418c3acb902f0b0b1491877bc279a9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 14 Aug 2019 14:40:56 -0500 Subject: [PATCH 52/54] Automatic changelog generation for PR #9100 [ci skip] --- html/changelogs/AutoChangeLog-pr-9100.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9100.yml diff --git a/html/changelogs/AutoChangeLog-pr-9100.yml b/html/changelogs/AutoChangeLog-pr-9100.yml new file mode 100644 index 0000000000..81141b3b0c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9100.yml @@ -0,0 +1,4 @@ +author: "Cebutris" +delete-after: True +changes: + - tweak: "Breasts no longer lactate by default, lactation is now a preference" From e84bad1e55c4d96e5785d7aee5a703266850f959 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 14 Aug 2019 14:43:53 -0500 Subject: [PATCH 53/54] Automatic changelog generation for PR #9052 [ci skip] --- html/changelogs/AutoChangeLog-pr-9052.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9052.yml diff --git a/html/changelogs/AutoChangeLog-pr-9052.yml b/html/changelogs/AutoChangeLog-pr-9052.yml new file mode 100644 index 0000000000..a75b6c51ae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9052.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - balance: "Hierophant now goes sicko mode, but hey, at least you can't be multi-hit by melee waves!" From 0125a202520e8c7bf3a7b35f6aa16ed137e1280c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 15 Aug 2019 03:12:15 -0500 Subject: [PATCH 54/54] Automatic changelog generation for PR #9126 [ci skip] --- html/changelogs/AutoChangeLog-pr-9126.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9126.yml diff --git a/html/changelogs/AutoChangeLog-pr-9126.yml b/html/changelogs/AutoChangeLog-pr-9126.yml new file mode 100644 index 0000000000..c3e54a8f2d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9126.yml @@ -0,0 +1,4 @@ +author: "original by Skoglol, port by sishen1542" +delete-after: True +changes: + - balance: "Added lots of new virus cures, made cure difficulty scale more consistently. Cures are now picked from a list of possible cures per resistance level, multiple diseases at the same level no longer always share a cure. Looking at you table salt."