From cae2e5e1ebb4486a2369d71440e6c553cb74c303 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Wed, 24 Jan 2018 12:58:42 -0500 Subject: [PATCH 01/36] Shifts vars off /mob to the correct subtype --- code/game/machinery/computer/teleporter.dm | 4 +-- code/game/objects/items/teleportation.dm | 4 +-- .../mob/living/carbon/carbon_defines.dm | 4 ++- .../mob/living/carbon/human/human_defines.dm | 5 ++-- code/modules/mob/living/living_defines.dm | 19 +++++++++++++ code/modules/mob/mob_defines.dm | 27 +++---------------- code/modules/mob/mob_movement.dm | 10 +++---- .../chemistry/reagents/toxin_reagents.dm | 6 +++-- 8 files changed, 42 insertions(+), 37 deletions(-) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 9f9791beec..74e640ae51 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -166,10 +166,10 @@ L[avoid_assoc_duplicate_keys(A.name, areaindex)] = R for(var/obj/item/implant/tracking/I in GLOB.tracked_implants) - if(!I.imp_in || !ismob(I.loc)) + if(!I.imp_in || !isliving(I.loc)) continue else - var/mob/M = I.loc + var/mob/living/M = I.loc if(M.stat == DEAD) if(M.timeofdeath + 6000 < world.time) continue diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index c3022a7758..44c44281c6 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -84,10 +84,10 @@ Frequency: src.temp += "Extranneous Signals:
" for (var/obj/item/implant/tracking/W in GLOB.tracked_implants) - if (!W.imp_in || !ismob(W.loc)) + if (!W.imp_in || !isliving(W.loc)) continue else - var/mob/M = W.loc + var/mob/living/M = W.loc if (M.stat == DEAD) if (M.timeofdeath + 6000 < world.time) continue diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index d601fde492..976aae894f 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -3,6 +3,7 @@ pressure_resistance = 15 possible_a_intents = list(INTENT_HELP, INTENT_HARM) hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD) + has_limbs = 1 var/list/stomach_contents = list() var/list/internal_organs = list() //List of /obj/item/organ in the mob. They don't go in the contents for some reason I don't want to know. var/list/internal_organs_slot= list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. @@ -33,7 +34,6 @@ var/co2overloadtime = null var/temperature_resistance = T0C+75 - has_limbs = 1 var/obj/item/reagent_containers/food/snacks/meat/slab/type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab var/gib_type = /obj/effect/decal/cleanable/blood/gibs @@ -57,3 +57,5 @@ var/obj/halitem var/hal_screwyhud = SCREWYHUD_NONE var/next_hallucination = 0 + var/cpr_time = 1 //CPR cooldown. + var/damageoverlaytemp = 0 diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 716373061d..7c4d12aaa1 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -2,6 +2,8 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD) possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM) pressure_resistance = 25 + can_buckle = TRUE + buckle_lying = FALSE //Hair colour and style var/hair_color = "000" var/hair_style = "Bald" @@ -43,8 +45,7 @@ var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects var/datum/personal_crafting/handcrafting - can_buckle = TRUE - buckle_lying = FALSE var/creamed = FALSE //to use with creampie overlays var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot)) + var/lastpuke = 0 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 904e9b9c21..471d29a361 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -5,6 +5,10 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) pressure_resistance = 10 + var/resize = 1 //Badminnery resize + var/lastattacker = null + var/lastattackerckey = null + //Health and life related vars var/maxHealth = 100 //Maximum health that should be possible. var/health = 100 //A mob's health @@ -17,10 +21,12 @@ var/cloneloss = 0 //Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this. + var/confused = 0 //Makes the mob move in random directions. var/hallucination = 0 //Directly affects how long a mob will hallucinate for var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. + var/timeofdeath = 0 //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas @@ -69,7 +75,16 @@ var/blood_volume = 0 //how much blood the mob has var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override + var/see_override = 0 //0 for no override, sets see_invisible = see_override in silicon & carbon life process via update_sight() + var/list/status_effects //a list of all status effects the mob has + var/druggy = 0 + + //Speech + var/stuttering = 0 + var/slurring = 0 + var/cultslurring = 0 + var/derpspeech = 0 var/list/implants = null @@ -83,3 +98,7 @@ var/registered_z var/can_be_held = FALSE //whether this can be picked up and held. + + var/radiation = 0 //If the mob is irradiated. + var/ventcrawl_layer = PIPING_LAYER_DEFAULT + var/losebreath = 0 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 536ee125e0..e9eabdfb98 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -6,6 +6,7 @@ flags_1 = HEAR_1 hud_possible = list(ANTAG_HUD) pressure_resistance = 8 + mouse_drag_pointer = MOUSE_ACTIVE_POINTER var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE var/datum/mind/mind var/list/datum/action/actions = list() @@ -22,10 +23,7 @@ */ var/zone_selected = null - var/damageoverlaytemp = 0 var/computer_id = null - var/lastattacker = null - var/lastattackerckey = null var/list/logging = list(INDIVIDUAL_ATTACK_LOG, INDIVIDUAL_SAY_LOG, INDIVIDUAL_EMOTE_LOG, INDIVIDUAL_OOC_LOG) var/obj/machinery/machine = null var/other_mobs = null @@ -35,25 +33,15 @@ var/notransform = null //Carbon var/eye_blind = 0 //Carbon var/eye_blurry = 0 //Carbon - var/stuttering = 0 //Carbon - var/slurring = 0 //Carbon - var/cultslurring = 0 //Carbon - var/derpspeech = 0 //Carbon var/real_name = null var/spacewalk = FALSE - var/druggy = 0 //Carbon - var/confused = 0 //Carbon var/resting = 0 //Carbon var/lying = 0 var/lying_prev = 0 var/canmove = 1 - var/lastpuke = 0 var/name_archive //For admin things like possession - var/timeofdeath = 0//Living - var/cpr_time = 1//Carbon - var/bodytemperature = BODYTEMP_NORMAL //310.15K / 98.6F var/drowsyness = 0//Carbon var/dizziness = 0//Carbon @@ -62,7 +50,6 @@ var/satiety = 0//Carbon var/overeatduration = 0 // How long this guy is overeating //Carbon - var/losebreath = 0//Carbon var/a_intent = INTENT_HELP//Living var/list/possible_a_intents = null//Living var/m_intent = MOVE_INTENT_RUN//Living @@ -77,8 +64,6 @@ var/obj/item/storage/s_active = null//Carbon - var/see_override = 0 //0 for no override, sets see_invisible = see_override in mob life process - var/datum/hud/hud_used = null var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining. @@ -91,10 +76,13 @@ var/job = null//Living +<<<<<<< HEAD var/radiation = 0//Carbon var/voice_name = "unidentifiable voice" +======= +>>>>>>> 3f10f29... Shifts vars off /mob and to the correct subtype (#34773) var/list/faction = list("neutral") //A list of factions that this mob is currently in, for hostile mob targetting, amongst other things var/move_on_shuttle = 1 // Can move on the shuttle. @@ -110,9 +98,6 @@ var/list/viruses = list() // list of all diseases in a mob var/list/resistances = list() - mouse_drag_pointer = MOUSE_ACTIVE_POINTER - - var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH //bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc) var/digitalcamo = 0 // Can they be tracked by the AI? @@ -127,12 +112,8 @@ var/turf/listed_turf = null //the current turf being examined in the stat panel - var/resize = 1 //Badminnery resize - var/list/observers = null //The list of people observing this mob. var/list/progressbars = null //for stacking do_after bars var/list/mousemove_intercept_objects - - var/ventcrawl_layer = PIPING_LAYER_DEFAULT diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 0b770888ec..17742e9089 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -89,17 +89,17 @@ move_delay = world.time var/oldloc = mob.loc - if(mob.confused) + if(L.confused) var/newdir = 0 - if(mob.confused > 40) + if(L.confused > 40) newdir = pick(GLOB.alldirs) - else if(prob(mob.confused * 1.5)) + else if(prob(L.confused * 1.5)) newdir = angle2dir(dir2angle(direct) + pick(90, -90)) - else if(prob(mob.confused * 3)) + else if(prob(L.confused * 3)) newdir = angle2dir(dir2angle(direct) + pick(45, -45)) if(newdir) direct = newdir - n = get_step(mob, direct) + n = get_step(L, direct) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index fa996b0bc0..0823d64bf1 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -244,8 +244,10 @@ toxpwr = 1 /datum/reagent/toxin/spore/on_mob_life(mob/living/M) - M.damageoverlaytemp = 60 - M.update_damage_hud() + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.damageoverlaytemp = 60 + C.update_damage_hud() M.blur_eyes(3) return ..() From fb5195aa4e97a01f657953e0d810ace08c2737d4 Mon Sep 17 00:00:00 2001 From: Robustin Date: Sun, 21 Jan 2018 02:45:23 -0500 Subject: [PATCH 02/36] New Cocktail: The Nar'Sour --- .../chemistry/reagents/alcohol_reagents.dm | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 6b47b99a32..4e3af9d284 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1281,3 +1281,23 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_yellow" glass_name = "eggnog" glass_desc = "For enjoying the most wonderful time of the year." +<<<<<<< HEAD +======= + + +/datum/reagent/consumable/ethanol/narsour + name = "Nar'Sour" + id = "narsour" + description = "Side effects include self-mutilation and hoarding plasteel." + color = RUNE_COLOR_DARKRED + boozepwr = 10 + taste_description = "bloody" + glass_icon_state = "narsour" + glass_name = "Nar'Sour" + glass_desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!" + +/datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/M) + M.cultslurring = min(M.cultslurring + 3, 3) + M.stuttering = min(M.stuttering + 3, 3) + ..() +>>>>>>> b7c5747... Adds stutter to narsour From 7267f4a5f3b59af29c7c4b112d90977d89cbc0f6 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Wed, 24 Jan 2018 13:02:19 -0600 Subject: [PATCH 03/36] Fixes the kitchen spike turning people upside down forever (#34807) --- code/game/objects/structures/kitchen_spike.dm | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 5cdadb186c..415024d2e0 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -129,15 +129,24 @@ return if(!M.buckled) return - var/matrix/m180 = matrix(M.transform) - m180.Turn(180) - animate(M, transform = m180, time = 3) - M.pixel_y = M.get_standard_pixel_y_offset(180) - M.adjustBruteLoss(30) - src.visible_message(text("[M] falls free of [src]!")) - unbuckle_mob(M,force=1) - M.emote("scream") - M.AdjustKnockdown(20) + release_mob(M) + +/obj/structure/kitchenspike/proc/release_mob(mob/living/M) + var/matrix/m180 = matrix(M.transform) + m180.Turn(180) + animate(M, transform = m180, time = 3) + M.pixel_y = M.get_standard_pixel_y_offset(180) + M.adjustBruteLoss(30) + src.visible_message(text("[M] falls free of [src]!")) + unbuckle_mob(M,force=1) + M.emote("scream") + M.AdjustKnockdown(20) + +/obj/structure/kitchenspike/Destroy() + if(has_buckled_mobs()) + for(var/mob/living/L in buckled_mobs) + release_mob(L) + return ..() /obj/structure/kitchenspike/deconstruct(disassembled = TRUE) if(disassembled) From f8c349ea541a0a9e01dd9659dbeec3244f06b33c Mon Sep 17 00:00:00 2001 From: Robustin Date: Wed, 24 Jan 2018 14:52:43 -0500 Subject: [PATCH 05/36] Gives clockwork marauders a reasonable cost/cooldown (#34285) balance: Clockwork marauders now take more time (+3s) and power (7x) to create. balance: The "recent marauder" time limit is now 60 seconds, up from 20. The limit now has a significantly smaller effect on summon time but will act as a further cap on marauder summoning until it has passed. tweak: The marauder cap will now only account for living cultists. --- code/__DEFINES/clockcult.dm | 4 ++-- .../clock_scriptures/scripture_applications.dm | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 7451c42cab..cc501b5289 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -83,9 +83,9 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define RATVARIAN_SPEAR_COOLDOWN 300 //The cooldown period between summoning another Ratvarian spear -#define MARAUDER_SCRIPTURE_SCALING_THRESHOLD 200 //The amount of deciseconds that must pass before marauder scripture will not gain a recital penalty +#define MARAUDER_SCRIPTURE_SCALING_THRESHOLD 600 //The amount of deciseconds that must pass before marauder scripture will not gain a recital penalty -#define MARAUDER_SCRIPTURE_SCALING_TIME 50 //The amount of extra deciseconds tacked on to the marauder scripture recital time per recent marauder +#define MARAUDER_SCRIPTURE_SCALING_TIME 20 //The amount of extra deciseconds tacked on to the marauder scripture recital time per recent marauder #define MARAUDER_SCRIPTURE_SCALING_MAX 300 //The maximum extra time applied to the marauder scripture diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm index da1f5965bd..c06bb5395e 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -73,8 +73,8 @@ name = "Clockwork Marauder" desc = "Creates a shell for a clockwork marauder, a balanced frontline construct that can deflect projectiles with its shield." invocations = list("Arise, avatar of Arbiter!", "Defend the Ark with vengeful zeal.") - channel_time = 50 - power_cost = 1000 + channel_time = 80 + power_cost = 8000 creator_message = "Your slab disgorges several chunks of replicant alloy that form into a suit of thrumming armor." usage_tip = "Reciting this scripture multiple times in a short period will cause it to take longer!" tier = SCRIPTURE_APPLICATION @@ -94,10 +94,13 @@ var/human_servants = 0 for(var/V in SSticker.mode.servants_of_ratvar) var/datum/mind/M = V - if(ishuman(M.current)) + var/mob/living/L = M.current + if(ishuman(L) && L.stat != DEAD) human_servants++ construct_limit = human_servants / 4 //1 per 4 human servants, and a maximum of 3 marauders - construct_limit = CLAMP(construct_limit, 1, 3) + construct_limit = CLAMP(construct_limit - recent_marauders, 1, 3) + if(recent_marauders) + to_chat(invoker, "The Hierophant Network needs [MARAUDER_SCRIPTURE_SCALING_THRESHOLD / 10] seconds to recover from marauder summoning; recent summoning has limited the number of available marauders by [recent_marauders]!") /datum/clockwork_scripture/create_object/construct/clockwork_marauder/pre_recital() channel_time = initial(channel_time) From be9f8a2d06baa26643167d43ab2014962c03480d Mon Sep 17 00:00:00 2001 From: Ashe Higgs Date: Wed, 24 Jan 2018 14:55:53 -0500 Subject: [PATCH 07/36] Refactors and nerfs Fleshmend --- code/__DEFINES/status_effects.dm | 2 ++ code/datums/status_effects/buffs.dm | 24 ++++++++++++++++++ .../gamemodes/changeling/powers/fleshmend.dm | 22 ++++++++++++++++ icons/mob/screen_alert.dmi | Bin 77077 -> 98254 bytes 4 files changed, 48 insertions(+) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 2e1524ebac..b481ba7ddd 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -28,6 +28,8 @@ #define STATUS_EFFECT_BLOODDRUNK /datum/status_effect/blooddrunk //Stun immunity and greatly reduced damage taken +#define STATUS_EFFECT_FLESHMEND /datum/status_effect/fleshmend //Very fast healing; suppressed by fire, and heals less fire damage + ///////////// // DEBUFFS // ///////////// diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index ec4b81acbe..9179b9bea4 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -412,3 +412,27 @@ /datum/status_effect/sword_spin/on_remove() owner.visible_message("[owner]'s inhuman strength dissipates and the sword's runes grow cold!") + + +//Used by changelings to rapidly heal +//Heals 10 brute and oxygen damage every second, and 5 fire +//Being on fire will suppress this healing +/datum/status_effect/fleshmend + id = "fleshmend" + duration = 100 + alert_type = /obj/screen/alert/status_effect/fleshmend + +/datum/status_effect/fleshmend/tick() + if(owner.on_fire) + linked_alert.icon_state = "fleshmend_fire" + return + else + linked_alert.icon_state = "fleshmend" + owner.adjustBruteLoss(-10, FALSE) + owner.adjustFireLoss(-5, FALSE) + owner.adjustOxyLoss(-10) + +/obj/screen/alert/status_effect/fleshmend + name = "Fleshmend" + desc = "Our wounds are rapidly healing. This effect is prevented if we are on fire." + icon_state = "fleshmend" diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index dd9d4a8634..eef9995d3c 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/effect/proc_holder/changeling/fleshmend name = "Fleshmend" desc = "Our flesh rapidly regenerates, healing our burns, bruises and shortness of breath. Effectiveness decreases with quick, repeated use." @@ -50,3 +51,24 @@ else break sleep(10) +======= +/obj/effect/proc_holder/changeling/fleshmend + name = "Fleshmend" + desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath. Functions while unconscious." + helptext = "If we are on fire, the healing effect will not function. Does not regrow limbs or restore lost blood." + chemical_cost = 20 + dna_cost = 2 + req_stat = UNCONSCIOUS + +//Starts healing you every second for 10 seconds. +//Can be used whilst unconscious. +/obj/effect/proc_holder/changeling/fleshmend/sting_action(mob/living/user) + if(user.has_status_effect(STATUS_EFFECT_FLESHMEND)) + to_chat(user, "We are already fleshmending!") + return + to_chat(user, "We begin to heal rapidly.") + user.apply_status_effect(STATUS_EFFECT_FLESHMEND) + return TRUE + +//Check buffs.dm for the fleshmend status effect code +>>>>>>> c051740... Refactors and nerfs Fleshmend (#34458) diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index e6d40977a7accd2dbc7ed07ab77a71fe991ef0e6..01fcdcddad3419715c38fc8337fc72d7f077f801 100644 GIT binary patch delta 27123 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 From 481f73aba0e88e9f6e64fbe85cc0e2cf5c6bbf36 Mon Sep 17 00:00:00 2001 From: coiax Date: Wed, 24 Jan 2018 19:58:00 +0000 Subject: [PATCH 08/36] Costumes for nuclear operatives --- code/game/machinery/PDApainter.dm | 4 +- .../objects/items/devices/radio/headset.dm | 4 + .../objects/items/implants/implant_clown.dm | 2 +- code/game/objects/items/storage/backpack.dm | 13 ++ .../game/objects/items/storage/uplink_kits.dm | 24 ++++ code/modules/clothing/chameleon.dm | 100 ++++++++++---- code/modules/paperwork/stamps.dm | 125 ++++++++++++++++++ code/modules/uplink/uplink_items.dm | 40 ++++-- 8 files changed, 269 insertions(+), 43 deletions(-) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 6156ee1d86..ba8be95065 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -34,7 +34,9 @@ /obj/item/device/pda/ai, /obj/item/device/pda/heads, /obj/item/device/pda/clear, - /obj/item/device/pda/syndicate) + /obj/item/device/pda/syndicate, + /obj/item/device/pda/chameleon, + /obj/item/device/pda/chameleon/broken) for(var/P in typesof(/obj/item/device/pda) - blocked) var/obj/item/device/pda/D = new P diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 0fc957fdca..1362721e1d 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -194,6 +194,10 @@ keyslot = new /obj/item/device/encryptionkey/headset_com keyslot2 = new /obj/item/device/encryptionkey/headset_cent +/obj/item/device/radio/headset/headset_cent/empty + keyslot = null + keyslot2 = null + /obj/item/device/radio/headset/headset_cent/commander keyslot = new /obj/item/device/encryptionkey/heads/captain diff --git a/code/game/objects/items/implants/implant_clown.dm b/code/game/objects/items/implants/implant_clown.dm index 18a22c1e60..ae1fef109d 100644 --- a/code/game/objects/items/implants/implant_clown.dm +++ b/code/game/objects/items/implants/implant_clown.dm @@ -14,7 +14,7 @@ playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 0) /obj/item/implanter/sad_trombone - name = "implanter (sad_trombone)" + name = "implanter (sad trombone)" imp_type = /obj/item/implant/sad_trombone /obj/item/implantcase/sad_trombone diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 84cd51fe22..c1aa39ddb1 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -553,3 +553,16 @@ new /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka(src) new /obj/item/reagent_containers/syringe/stimulants(src) new /obj/item/grenade/syndieminibomb(src) + +// For ClownOps. +/obj/item/storage/backpack/duffelbag/clown/syndie + slowdown = 0 + silent = TRUE + +/obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents() + new /obj/item/device/pda/clown(src) + new /obj/item/clothing/under/rank/clown(src) + new /obj/item/clothing/shoes/clown_shoes(src) + new /obj/item/clothing/mask/gas/clown_hat(src) + new /obj/item/bikehorn(src) + new /obj/item/implanter/sad_trombone(src) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index fb44d094c7..7ce832acd3 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -308,3 +308,27 @@ /obj/item/storage/box/syndie_kit/imp_radio/PopulateContents() new /obj/item/implanter/radio(src) + +/obj/item/storage/box/syndie_kit/centcom_costume/PopulateContents() + new /obj/item/clothing/under/rank/centcom_officer(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/gloves/color/black(src) + new /obj/item/device/radio/headset/headset_cent/empty(src) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/storage/backpack/satchel(src) + new /obj/item/device/pda/heads(src) + new /obj/item/clipboard(src) + +/obj/item/storage/box/syndie_kit/chameleon/broken/PopulateContents() + new /obj/item/clothing/under/chameleon/broken(src) + new /obj/item/clothing/suit/chameleon/broken(src) + new /obj/item/clothing/gloves/chameleon/broken(src) + new /obj/item/clothing/shoes/chameleon/broken(src) + new /obj/item/clothing/glasses/chameleon/broken(src) + new /obj/item/clothing/head/chameleon/broken(src) + new /obj/item/clothing/mask/chameleon/broken(src) + new /obj/item/storage/backpack/chameleon/broken(src) + new /obj/item/device/radio/headset/chameleon/broken(src) + new /obj/item/stamp/chameleon/broken(src) + new /obj/item/device/pda/chameleon/broken(src) + // No chameleon laser, they can't randomise for //REASONS// diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index d282fb9aed..ac3718394d 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -153,13 +153,15 @@ select_look(owner) return 1 -/datum/action/item_action/chameleon/change/proc/emp_randomise() +/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME) if(istype(target, /obj/item/gun/energy/laser/chameleon)) return //Please no crash! START_PROCESSING(SSprocessing, src) random_look(owner) - emp_timer = world.time + EMP_RANDOMISE_TIME + var/new_value = world.time + amount + if(new_value > emp_timer) + emp_timer = new_value /datum/action/item_action/chameleon/change/process() if(world.time > emp_timer) @@ -189,8 +191,8 @@ item_state = "engi_suit" item_color = "engine" -/obj/item/clothing/under/chameleon/New() - ..() +/obj/item/clothing/under/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/under chameleon_action.chameleon_name = "Jumpsuit" @@ -200,6 +202,10 @@ /obj/item/clothing/under/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/clothing/under/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/clothing/suit/chameleon name = "armor" desc = "A slim armored vest that protects against most types of damage." @@ -211,8 +217,8 @@ var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/suit/chameleon/New() - ..() +/obj/item/clothing/suit/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/suit chameleon_action.chameleon_name = "Suit" @@ -222,6 +228,10 @@ /obj/item/clothing/suit/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/clothing/suit/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/clothing/glasses/chameleon name = "Optical Meson Scanner" desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." @@ -232,8 +242,8 @@ var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/glasses/chameleon/New() - ..() +/obj/item/clothing/glasses/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/glasses chameleon_action.chameleon_name = "Glasses" @@ -243,6 +253,10 @@ /obj/item/clothing/glasses/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/clothing/glasses/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/clothing/gloves/chameleon desc = "These gloves will protect the wearer from electric shock." name = "insulated gloves" @@ -254,8 +268,8 @@ var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/gloves/chameleon/New() - ..() +/obj/item/clothing/gloves/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/gloves chameleon_action.chameleon_name = "Gloves" @@ -265,6 +279,10 @@ /obj/item/clothing/gloves/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/clothing/gloves/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/clothing/head/chameleon name = "grey cap" desc = "It's a baseball hat in a tasteful grey colour." @@ -276,8 +294,8 @@ var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/head/chameleon/New() - ..() +/obj/item/clothing/head/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/head chameleon_action.chameleon_name = "Hat" @@ -287,6 +305,10 @@ /obj/item/clothing/head/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/clothing/head/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/clothing/head/chameleon/drone // The camohat, I mean, holographic hat projection, is part of the // drone itself. @@ -294,8 +316,8 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) // which means it offers no protection, it's just air and light -/obj/item/clothing/head/chameleon/drone/New() - ..() +/obj/item/clothing/head/chameleon/drone/Initialize() + . = ..() chameleon_action.random_look() var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) togglehatmask_action.UpdateButtonIcon() @@ -320,8 +342,8 @@ var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/mask/chameleon/New() - ..() +/obj/item/clothing/mask/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/mask chameleon_action.chameleon_name = "Mask" @@ -331,6 +353,10 @@ /obj/item/clothing/mask/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/clothing/mask/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/clothing/mask/chameleon/attack_self(mob/user) vchange = !vchange to_chat(user, "The voice changer is now [vchange ? "on" : "off"]!") @@ -343,8 +369,8 @@ // Can drones use the voice changer part? Let's not find out. vchange = 0 -/obj/item/clothing/mask/chameleon/drone/New() - ..() +/obj/item/clothing/mask/chameleon/drone/Initialize() + . = ..() chameleon_action.random_look() var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) togglehatmask_action.UpdateButtonIcon() @@ -367,8 +393,8 @@ var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/clothing/shoes/chameleon/New() - ..() +/obj/item/clothing/shoes/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/shoes chameleon_action.chameleon_name = "Shoes" @@ -378,6 +404,10 @@ /obj/item/clothing/shoes/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/clothing/shoes/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/gun/energy/laser/chameleon name = "practice laser gun" desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." @@ -405,8 +435,6 @@ chameleon_action.chameleon_blacklist = typecacheof(/obj/item/gun/magic, ignore_root_path = FALSE) chameleon_action.initialize_disguises() -/obj/item/gun/energy/laser/chameleon/Initialize() - . = ..() projectile_copy_vars = list("name", "icon", "icon_state", "item_state", "speed", "color", "hitsound", "forcedodge", "impact_effect_type", "range", "suppressed", "hitsound_wall", "impact_effect_type", "pass_flags") chameleon_projectile_vars = list("name" = "practice laser", "icon" = 'icons/obj/projectiles.dmi', "icon_state" = "laser") gun_copy_vars = list("fire_sound", "burst_size", "fire_delay") @@ -505,8 +533,8 @@ name = "backpack" var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/storage/backpack/chameleon/New() - ..() +/obj/item/storage/backpack/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/storage/backpack chameleon_action.chameleon_name = "Backpack" @@ -515,14 +543,18 @@ /obj/item/storage/backpack/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/storage/backpack/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/storage/belt/chameleon name = "toolbelt" desc = "Holds tools." silent = 1 var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/storage/belt/chameleon/New() - ..() +/obj/item/storage/belt/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/storage/belt chameleon_action.chameleon_name = "Belt" @@ -531,6 +563,10 @@ /obj/item/storage/belt/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/storage/belt/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/device/radio/headset/chameleon name = "radio headset" var/datum/action/item_action/chameleon/change/chameleon_action @@ -545,12 +581,16 @@ /obj/item/device/radio/headset/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/device/radio/headset/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/device/pda/chameleon name = "PDA" var/datum/action/item_action/chameleon/change/chameleon_action -/obj/item/device/pda/chameleon/New() - ..() +/obj/item/device/pda/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/device/pda chameleon_action.chameleon_name = "PDA" @@ -560,3 +600,7 @@ /obj/item/device/pda/chameleon/emp_act(severity) chameleon_action.emp_randomise() +/obj/item/device/pda/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 3c26382d6f..e18ed333e3 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/stamp name = "\improper GRANTED rubber stamp" desc = "A rubber stamp for stamping important documents." @@ -109,3 +110,127 @@ if(initial(stamp_type.name) == input_stamp) break change_to(stamp_type) +======= +/obj/item/stamp + name = "\improper GRANTED rubber stamp" + desc = "A rubber stamp for stamping important documents." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "stamp-ok" + item_state = "stamp" + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + throw_speed = 3 + throw_range = 7 + materials = list(MAT_METAL=60) + item_color = "cargo" + pressure_resistance = 2 + attack_verb = list("stamped") + +/obj/item/stamp/suicide_act(mob/user) + user.visible_message("[user] stamps 'VOID' on [user.p_their()] forehead, then promptly falls over, dead.") + return (OXYLOSS) + +/obj/item/stamp/qm + name = "quartermaster's rubber stamp" + icon_state = "stamp-qm" + item_color = "qm" + +/obj/item/stamp/law + name = "law office's rubber stamp" + icon_state = "stamp-law" + item_color = "cargo" + +/obj/item/stamp/captain + name = "captain's rubber stamp" + icon_state = "stamp-cap" + item_color = "captain" + +/obj/item/stamp/hop + name = "head of personnel's rubber stamp" + icon_state = "stamp-hop" + item_color = "hop" + +/obj/item/stamp/hos + name = "head of security's rubber stamp" + icon_state = "stamp-hos" + item_color = "hosred" + +/obj/item/stamp/ce + name = "chief engineer's rubber stamp" + icon_state = "stamp-ce" + item_color = "chief" + +/obj/item/stamp/rd + name = "research director's rubber stamp" + icon_state = "stamp-rd" + item_color = "director" + +/obj/item/stamp/cmo + name = "chief medical officer's rubber stamp" + icon_state = "stamp-cmo" + item_color = "cmo" + +/obj/item/stamp/denied + name = "\improper DENIED rubber stamp" + icon_state = "stamp-deny" + item_color = "redcoat" + +/obj/item/stamp/clown + name = "clown's rubber stamp" + icon_state = "stamp-clown" + item_color = "clown" + +/obj/item/stamp/attack_paw(mob/user) + return attack_hand(user) + +// Syndicate stamp to forge documents. + +/obj/item/stamp/chameleon + actions_types = list(/datum/action/item_action/toggle) + + var/list/stamp_types + var/list/stamp_names + +/obj/item/stamp/chameleon/Initialize() + . = ..() + stamp_types = typesof(/obj/item/stamp) - type // Get all stamp types except our own + + stamp_names = list() + // Generate them into a list + for(var/i in stamp_types) + var/obj/item/stamp/stamp_type = i + stamp_names += initial(stamp_type.name) + + stamp_names = sortList(stamp_names) + +/obj/item/stamp/chameleon/emp_act(severity) + change_to(pick(stamp_types)) + +/obj/item/stamp/chameleon/proc/change_to(obj/item/stamp/stamp_type) + name = initial(stamp_type.name) + icon_state = initial(stamp_type.icon_state) + item_color = initial(stamp_type.item_color) + +/obj/item/stamp/chameleon/attack_self(mob/user) + var/input_stamp = input(user, "Choose a stamp to disguise as.", + "Choose a stamp.") as null|anything in stamp_names + + if(user && (src in user.contents) && input_stamp) + var/obj/item/stamp/stamp_type + for(var/i in stamp_types) + stamp_type = i + if(initial(stamp_type.name) == input_stamp) + break + change_to(stamp_type) + +/obj/item/stamp/chameleon/broken/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/item/stamp/chameleon/broken/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/stamp/chameleon/broken/process() + change_to(pick(stamp_types)) +>>>>>>> a00d4b1... Costumes for nuclear operatives (#34487) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 54514689cb..f798eac3d4 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -714,10 +714,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. exclude_modes = list(/datum/game_mode/nuclear) player_minimum = 20 -/datum/uplink_item/stealthy_tools/chameleon/nuke - cost = 6 - include_modes = list(/datum/game_mode/nuclear) - /datum/uplink_item/stealthy_tools/syndigaloshes name = "No-Slip Chameleon Shoes" desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \ @@ -727,6 +723,12 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. exclude_modes = list(/datum/game_mode/nuclear) player_minimum = 20 +/datum/uplink_item/stealthy_tools/syndigaloshes/nuke + item = /obj/item/clothing/shoes/chameleon + cost = 4 + exclude_modes = list() + include_modes = list(/datum/game_mode/nuclear) + /datum/uplink_item/stealthy_tools/frame name = "F.R.A.M.E. PDA Cartridge" desc = "When inserted into a personal digital assistant, this cartridge gives you five PDA viruses which \ @@ -736,15 +738,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/cartridge/virus/frame cost = 4 -/datum/uplink_item/stealthy_tools/syndigaloshes/nuke - name = "Stealthy No-Slip Chameleon Shoes" - desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \ - They do not work on heavily lubricated surfaces. The manufacturer claims they are much more stealthy than the normal brand." - item = /obj/item/clothing/shoes/chameleon - cost = 4 - exclude_modes = list() - include_modes = list(/datum/game_mode/nuclear) - /datum/uplink_item/stealthy_tools/agent_card name = "Agent Identification Card" desc = "Agent cards prevent artificial intelligences from tracking the wearer, and can copy access \ @@ -1328,6 +1321,27 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. cost = 20 cant_discount = TRUE +/datum/uplink_item/badass/costumes + surplus = 0 + include_modes = list(/datum/game_mode/nuclear) + cost = 4 + cant_discount = TRUE + +/datum/uplink_item/badass/costumes/centcom_official + name = "Centcom Official Costume" + desc = "Ask the crew to \"inspect\" their nuclear disk and weapons system, and then when they decline, pull out a fully automatic rifle and gun down the Captain. Radio headset does not include key. No gun included." + item = /obj/item/storage/box/syndie_kit/centcom_costume + +/datum/uplink_item/badass/costumes/clown + name = "Clown Costume" + desc = "Nothing is more terrifying than clowns with fully automatic weaponry." + item = /obj/item/storage/backpack/duffelbag/clown/syndie + +/datum/uplink_item/badass/costumes/obvious_chameleon + name = "Broken Chameleon Kit" + desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! Please note that this kit did NOT pass quality control." + item = /obj/item/storage/box/syndie_kit/chameleon/broken + /datum/uplink_item/badass/bundle name = "Syndicate Bundle" desc = "Syndicate Bundles are specialized groups of items that arrive in a plain box. \ From 646aa3f2f8eb292c7b62c88a29c9e929930e27ed Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 24 Jan 2018 13:58:47 -0600 Subject: [PATCH 09/36] Update alcohol_reagents.dm --- code/modules/reagents/chemistry/reagents/alcohol_reagents.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 4e3af9d284..68770490e9 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1281,9 +1281,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_yellow" glass_name = "eggnog" glass_desc = "For enjoying the most wonderful time of the year." -<<<<<<< HEAD -======= - /datum/reagent/consumable/ethanol/narsour name = "Nar'Sour" @@ -1300,4 +1297,3 @@ All effects don't start immediately, but rather get worse over time; the rate is M.cultslurring = min(M.cultslurring + 3, 3) M.stuttering = min(M.stuttering + 3, 3) ..() ->>>>>>> b7c5747... Adds stutter to narsour From f69e5260e2b219bdabb058c81ea0124d71c343b8 Mon Sep 17 00:00:00 2001 From: ACCount12 Date: Tue, 23 Jan 2018 14:46:03 +0300 Subject: [PATCH 10/36] Plasma cutter now has a tool sound --- code/modules/projectiles/guns/energy/special.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index a4ae8cae13..cced6d9544 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -126,6 +126,8 @@ sharpness = IS_SHARP can_charge = 0 heat = 3800 + + usesound = 'sound/items/welder.ogg' toolspeed = 0.7 //plasmacutters can be used as welders for a few things, and are faster than standard welders /obj/item/gun/energy/plasmacutter/examine(mob/user) From eb1a6b89ef7b418e4fa624b28d85ad986277ae90 Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> Date: Wed, 24 Jan 2018 15:02:33 -0500 Subject: [PATCH 12/36] One can no longer use cogscarab as a form of Eminence priority. (#34611) Cogscarabs are meant to build, and wasting an integral (building) slot for something you can get as a ghost so you get priority is shitty to both other ghosts and team (the second one being an admin issue). If you want to go eminence, you can roll for it as a ghost like everyone else. --- .../clock_cult/clock_structures/eminence_spire.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm b/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm index 2fa682ff5c..ef035234d0 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm @@ -35,6 +35,13 @@ else nomination(user) +/obj/structure/destructible/clockwork/eminence_spire/attack_drone(mob/living/simple_animal/drone/user) + if(!is_servant_of_ratvar(user)) + ..() + else + to_chat(user, "You feel the omniscient gaze turn into a puzzled frown. Perhaps you should just stick to building.") + return + /obj/structure/destructible/clockwork/eminence_spire/attack_ghost(mob/user) if(!IsAdminGhost(user)) return From c3ba7008d16646e78d8167d46a4057625d223252 Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 24 Jan 2018 18:07:01 -0200 Subject: [PATCH 14/36] Merge pull request #34800 from ShizCalev/everybody-was-kungfoo-fighting martial art sanity check --- code/datums/martial.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 146959d5ab..f594f95429 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -76,6 +76,8 @@ return 1 /datum/martial_art/proc/teach(mob/living/carbon/human/H,make_temporary=0) + if(!istype(H) || !H.mind) + return FALSE if(H.mind.martial_art) if(make_temporary) if(!H.mind.martial_art.allow_temp_override) @@ -98,7 +100,7 @@ base = M /datum/martial_art/proc/remove(mob/living/carbon/human/H) - if(H.mind.martial_art != src) + if(!istype(H) || !H.mind || H.mind.martial_art != src) return on_remove(H) if(base) From 00d1e8f902db63409657a4c293a6d1853e1c6bb1 Mon Sep 17 00:00:00 2001 From: Ordonis Date: Wed, 24 Jan 2018 14:07:34 -0600 Subject: [PATCH 16/36] Adds Ketrazine, a powerful combat stimulant with severe side-effects which can be synthesized by the crew (#34579) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🆑 Ordo rscadd: Adds Ketrazine, a powerful but dangerous combat stim which the crew can synthesize /🆑 --- .../chemistry/reagents/medicine_reagents.dm | 102 ++++++++++++++++++ .../reagents/chemistry/recipes/medicine.dm | 11 +- 2 files changed, 112 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index d49ddd57a1..53320e9460 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1105,3 +1105,105 @@ id = "corazone" description = "A medication used to treat pain, fever, and inflammation, along with heart attacks." color = "#F5F5F5" + +/datum/reagent/medicine/ketrazine + name = "Ketrazine" + id = "ketrazine" + description = "A powerful and addictive combat stimulant, capable of healing grievous wounds and enabling the user to shrug off stuns and heavy weights by stimulating tendons and muscle groups; however the strain on the body causes severe lasting damage. Use only in life-or-death situations. Overdose is almost invariably fatal." + reagent_state = LIQUID + color = "#5F42F4" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 20 + addiction_threshold = 5 + +/datum/reagent/medicine/ketrazine/on_mob_life(mob/living/M) + M.status_flags |= IGNORESLOWDOWN + M.status_flags |= GOTTAGOFAST + M.adjustToxLoss(-3*REM, 0) + M.adjustBruteLoss(-5*REM, 0) + M.adjustFireLoss(-5*REM, 0) + M.adjustOxyLoss(-5*REM, 0) + M.AdjustStun(-80*REM, 0) + M.AdjustKnockdown(-70*REM, 0) + M.adjustStaminaLoss(-80*REM, 0) + M.AdjustUnconscious(-50*REM, 0) + M.adjustBrainLoss(0.5*REM,0) + switch(current_cycle) + if(2 to 12) + if(prob(15)) + to_chat(M, "You feel incredibly powerful! Nothing can stop you! ") + if(12) + to_chat(M, "Your muscles begin to ache terribly... " ) + if(14) + to_chat(M, "You feel like your body is being ripped to shreds! ") + if(15 to 25) + M.drowsyness += 3 + M.adjustBruteLoss(10*REM, 0) + M.adjustToxLoss(7*REM, 0) + if(25 to 30) + if(prob(33)) + to_chat(M, "The pain is unbearable! You can barely stand! ") + M.Sleeping(40, 0) + M.AdjustKnockdown(40*REM,0) + M.drop_all_held_items() + M.Dizzy(3) + M.drowsyness +=4 + M.adjustBruteLoss(15*REM,0) + M.adjustToxLoss(10*REM,0) + M.adjustStaminaLoss(30*REM,0) + if(30 to INFINITY) + if(prob(20)) + to_chat(M, "Your body can't handle the stress! ") + M.Sleeping(60, 0) + M.AdjustKnockdown(80*REM,0) + M.drop_all_held_items() + M.Dizzy(5) + M.drowsyness +=6 + M.adjustBruteLoss(20*REM,0) + M.adjustToxLoss(15*REM,0) + M.adjustStaminaLoss(40*REM,0) + M.losebreath +=2 + + + ..() + +/datum/reagent/medicine/ketrazine/overdose_process(mob/living/M) + if(prob(66)) + to_chat(M, " You feel a sense of impending doom. ") + M.drop_all_held_items() + M.Dizzy(6) + M.Jitter(7) + M.adjustOxyLoss(40*REM,0) + M.adjustBruteLoss(40*REM,0) + M.losebreath +=10 + ..() + +/datum/reagent/medicine/ketrazine/addiction_act_stage1(mob/living/M) + if(prob(33)) + to_chat(M, "You feel like you need more power... ") + M.drop_all_held_items() + M.Jitter(2) + M.Dizzy(2) + ..() + +/datum/reagent/medicine/ketrazine/addiction_act_stage2(mob/living/M) + if(prob(50)) + to_chat(M, "You feel weak and sore, you need something to amp you up! ") + M.drop_all_held_items() + M.adjustToxLoss(2*REM, 0) + M.adjustBruteLoss(4*REM,0) + M.adjustStaminaLoss(6*REM,0) + M.Dizzy(3) + M.Jitter(3) + ..() + +/datum/reagent/medicine/ketrazine/addiction_act_stage3(mob/living/M) + if(prob(66)) + to_chat(M, " You need ketrazine! You need it badly! You need it now! ") + M.drop_all_held_items() + M.adjustToxLoss(4*REM, 0) + M.adjustBruteLoss(5*REM,0) + M.adjustStaminaLoss(7*REM,0) + M.Dizzy(7) + M.Jitter(7) + ..() diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 7123267eb3..8bb62fb233 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -232,4 +232,13 @@ id = "morphine" results = list("morphine" = 3) required_reagents = list("carbon" = 2, "hydrogen" = 2, "nitrogen" = 1, "oxygen" = 1) - required_temp = 480 \ No newline at end of file + required_temp = 480 + +/datum/chemical_reaction/ketrazine + name = "Ketrazine" + id = "ketrazine" + results = list("ketrazine" = 3) + required_reagents = list("epinephrine" = 1, "ephedrine" = 1, "tricordazine" = 1, "atropine" = 1) + required_catalysts = list("gold" = 1) + required_temp = 520 + mix_message = "The solution fizzes and then settles into an oily, smooth, purple liquid." From 2a0da701b2f5e6e19cc863e79efe15e03720de77 Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 24 Jan 2018 18:09:18 -0200 Subject: [PATCH 18/36] Merge pull request #34801 from ShizCalev/DMM-viewer-fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes compatability issues with some third-party-java-based™ DMM viewers --- code/modules/integrated_electronics/subtypes/manipulation.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 5ce41f838b..0daed12bce 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -292,9 +292,9 @@ /obj/item/integrated_circuit/manipulation/grabber name = "grabber" - desc = "A circuit with it's own inventory for tiny/small items, used to grab and store things." + desc = "A circuit which is used to grab and store tiny to small objects within it's self-contained inventory." icon_state = "grabber" - extended_desc = "The circuit accepts a reference to thing to be grabbed. It can store up to 10 things. Modes: 1 for grab. 0 for eject the first thing. -1 for eject all." + extended_desc = "The circuit accepts a reference to an object to be grabbed and can store up to 10 objects. Modes: 1 to grab, 0 to eject the first object, and -1 to eject all objects." w_class = WEIGHT_CLASS_SMALL size = 3 From cb43e02276e70a386a20eb56df9e7bb989077a28 Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 24 Jan 2018 18:10:47 -0200 Subject: [PATCH 20/36] Merge pull request #34776 from ShizCalev/mapGeneratorModule-args Corrects mapGeneratorModule generate() args --- code/modules/procedural_mapping/mapGeneratorModules/helpers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index 4f761412f7..00dba2d000 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -28,7 +28,7 @@ return for(var/V in mother.map) var/turf/T = V - T.empty(deleteturfs? null : T.type, ignore_typecache = ignore_typecache, forceop = TRUE) + T.empty(deleteturfs? null : T.type, null, ignore_typecache, CHANGETURF_FORCEOP) /datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs/New() ..() From 8b2da0aa909c937746a2250d70698b8900dbeb81 Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 25 Jan 2018 09:14:14 +1300 Subject: [PATCH 22/36] Merge pull request #34746 from DaxDupont/autolathe Makes the autolathe repeat it's animation while it's still printing. --- code/game/machinery/autolathe.dm | 5 ++--- icons/obj/stationobjs.dmi | Bin 60472 -> 60479 bytes 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 7554bb00ae..c425bbf8f4 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -170,8 +170,7 @@ if((materials.amount(MAT_METAL) >= metal_cost*multiplier*coeff) && (materials.amount(MAT_GLASS) >= glass_cost*multiplier*coeff)) busy = TRUE use_power(power) - icon_state = "autolathe" - flick("autolathe_n",src) + icon_state = "autolathe_n" var/time = is_stack ? 32 : 32*coeff*multiplier addtimer(CALLBACK(src, .proc/make_item, power, metal_cost, glass_cost, multiplier, coeff, is_stack), time) @@ -207,7 +206,7 @@ for(var/mat in materials_used) new_item.materials[mat] = materials_used[mat] / multiplier new_item.autolathe_crafted(src) - + icon_state = "autolathe" busy = FALSE updateDialog() diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index e4c1de0282414a94ba0101b1b827920abaaf3a95..d657bd841bf5319de35d47ad899f5598b96e5836 100644 GIT binary patch delta 1037 zcmV+o1oHd1*aN@V1CS(t;(AnAbVOxyV{&P5bZKvH004NLrI^ib+d2@1*Va=I?efZj zEm>*q!kdc}MHcPmK7c@xV~H@u5lAXd-@Xg~NVY`})gTCv0N)u7hlfK_U)g`(f4u!- zuRq_Ccd$;OVOzF&S|y8vlD=VEmS@SL0aZ8t_>c441KYAMsy51hgI#|~7E)Qqwrrg& zc9yr`*p}tVLW1VM*_N%-b-KROt)_J&u;tE`(yDi`1G^#F^)y`EBy^pW15s)edon50 z3k}>>*j6R(cJp{M3+KYCcbJxB!)%JQnAXEbr%@_XlOe83ArYddVh6O3PHctT z22#6+CA=#U@Y{&49Ta}{Q`Ld+k;Nt7I2l$s@UR^lhL*ZsmBR1k82<16QAWFpCBA zSa1^y79=Qt!R>|ay^rXoo#xIfvD3Vx%h{r>d!Su# z`^t9>9t3w#(tYoO(yN#i#pED?RuiENHlKU6pixzu4jtWfTV+(mW15#y6}P2^U3AdW zs=A?nX=%Z^i2ix9Tp9K3Ja6-vv}m|-3bVOxyV{&P5bZKvH004NLrI^o-+aM6e&&gAu_E@q? z?0CC9|HtdtCjPhWASD)syQd!3~Y&D;4 zt!Tip4NK><614csHf+ULe08T=j_U?sBb>`itM*`fc1^OYaX7n4=sGC}GS?_~WKyP+ z8iXydDRSIyr}1VIE~Hm`7?&h{H5t#w_3++mES0Iq5LZ)CB3kLKCUZT5v;z{JjE%4; z!6+!n^b(%TXBx48WgC`_glWlCwdjnjhdv^}Kusg$2aC9bp^GRw@6jx<1=>d^wm@M6 zsoldR?3E1oZ9rEJjKhc-I)U^?-zx3F<`Rv!81UWAOa`=pq(ZypS{z6;PP{PK;vvFe zH!@77D$HbsoIZ%h_lc6#)OB7?6)ZZVQSL%}ZGGKu9=K$GaZnay=gBxJPkGAIK8^!>i_9!E}m8E{){YA#PTqcP)ChVXGIOT-_m?(=&n|;{?WZxHC%k zsta1gqplS;@W5ElZyzTEi=*`-bQ`}Hj{V#Q3wd#WYP3oV=L&qM-FPMo8Z8m6S53?d z@qz{{IXE!ad_AIzFvW$X59PoZv_)#v*ou-a_yh)0c?m9GAK_1}K$rQ?h(ohS*%vYO zmG5diNZ}x-``!hmS24-5(Ln;OCPEo(KKE!wqpC73I=bsN%BVubG%uqHVRH@J=%Be( zRZY`>r3L3A`sc}VdDOG>yv--lvKG!M`T%z*TIbO~-hgwWqE9RfvKF=qHj}Hz-I(qJ zTkR4f!q=m^2v?8lV!liDaLh_IAnUCtBCbwHFi`Qg(5xj_Pm*JdQ1!#_R@qgQP`w`)SU nJQ_1srKbHg6g=3vpV^P!uk7{L+x#EQ0>?oxIjH@!4+Jpij}-TD From 53d37098fca0a215960cc1e478d4bb4bfb0d496b Mon Sep 17 00:00:00 2001 From: MoreRobustThanYou Date: Wed, 24 Jan 2018 15:15:10 -0500 Subject: [PATCH 24/36] Shuttles will now throw you when taking off MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🆑 SPACE CONDUCTOR tweak: Shuttles will throw you around if ya don't buckle in /🆑 --- code/modules/shuttle/shuttle.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index f539c0dd14..d87750c394 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -248,7 +248,7 @@ var/launch_status = NOLAUNCH - var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 0) + var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) // A timid shuttle will not register itself with the shuttle subsystem // All shuttle templates are timid @@ -745,4 +745,4 @@ mode = SHUTTLE_ENDGAME /obj/docking_port/mobile/emergency/on_emergency_dock() - return \ No newline at end of file + return From 497dcd9d9e5c5aa1a7b394459144e82194345c1e Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 24 Jan 2018 15:50:59 -0500 Subject: [PATCH 26/36] Merge pull request #34895 from JJRcop/patch-16 #34889 Fixes possible issue with set_labels --- tools/WebhookProcessor/github_webhook_processor.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index 604f87678e..f7ea3eecfc 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -179,7 +179,9 @@ function set_labels($payload, $labels, $remove) { $tags = array_merge($labels, $existing); $tags = array_unique($tags); - $tags = array_diff($tags, $remove); + if($remove) { + $tags = array_diff($tags, $remove); + } $final = array(); foreach($tags as $t) From 912fb88cc12a53a81a19e1e437d6a3d269543f68 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 24 Jan 2018 15:39:45 -0600 Subject: [PATCH 28/36] Update stamps.dm --- code/modules/paperwork/stamps.dm | 114 ------------------------------- 1 file changed, 114 deletions(-) diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index e18ed333e3..97038bd94c 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -1,116 +1,3 @@ -<<<<<<< HEAD -/obj/item/stamp - name = "\improper GRANTED rubber stamp" - desc = "A rubber stamp for stamping important documents." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "stamp-ok" - item_state = "stamp" - throwforce = 0 - w_class = WEIGHT_CLASS_TINY - throw_speed = 3 - throw_range = 7 - materials = list(MAT_METAL=60) - item_color = "cargo" - pressure_resistance = 2 - attack_verb = list("stamped") - -/obj/item/stamp/suicide_act(mob/user) - user.visible_message("[user] stamps 'VOID' on [user.p_their()] forehead, then promptly falls over, dead.") - return (OXYLOSS) - -/obj/item/stamp/qm - name = "quartermaster's rubber stamp" - icon_state = "stamp-qm" - item_color = "qm" - -/obj/item/stamp/law - name = "law office's rubber stamp" - icon_state = "stamp-law" - item_color = "cargo" - -/obj/item/stamp/captain - name = "captain's rubber stamp" - icon_state = "stamp-cap" - item_color = "captain" - -/obj/item/stamp/hop - name = "head of personnel's rubber stamp" - icon_state = "stamp-hop" - item_color = "hop" - -/obj/item/stamp/hos - name = "head of security's rubber stamp" - icon_state = "stamp-hos" - item_color = "hosred" - -/obj/item/stamp/ce - name = "chief engineer's rubber stamp" - icon_state = "stamp-ce" - item_color = "chief" - -/obj/item/stamp/rd - name = "research director's rubber stamp" - icon_state = "stamp-rd" - item_color = "director" - -/obj/item/stamp/cmo - name = "chief medical officer's rubber stamp" - icon_state = "stamp-cmo" - item_color = "cmo" - -/obj/item/stamp/denied - name = "\improper DENIED rubber stamp" - icon_state = "stamp-deny" - item_color = "redcoat" - -/obj/item/stamp/clown - name = "clown's rubber stamp" - icon_state = "stamp-clown" - item_color = "clown" - -/obj/item/stamp/attack_paw(mob/user) - return attack_hand(user) - -// Syndicate stamp to forge documents. - -/obj/item/stamp/chameleon - actions_types = list(/datum/action/item_action/toggle) - - var/list/stamp_types - var/list/stamp_names - -/obj/item/stamp/chameleon/Initialize() - . = ..() - stamp_types = typesof(/obj/item/stamp) - type // Get all stamp types except our own - - stamp_names = list() - // Generate them into a list - for(var/i in stamp_types) - var/obj/item/stamp/stamp_type = i - stamp_names += initial(stamp_type.name) - - stamp_names = sortList(stamp_names) - -/obj/item/stamp/chameleon/emp_act(severity) - change_to(pick(stamp_types)) - -/obj/item/stamp/chameleon/proc/change_to(obj/item/stamp/stamp_type) - name = initial(stamp_type.name) - icon_state = initial(stamp_type.icon_state) - item_color = initial(stamp_type.item_color) - -/obj/item/stamp/chameleon/attack_self(mob/user) - var/input_stamp = input(user, "Choose a stamp to disguise as.", - "Choose a stamp.") as null|anything in stamp_names - - if(user && (src in user.contents) && input_stamp) - var/obj/item/stamp/stamp_type - for(var/i in stamp_types) - stamp_type = i - if(initial(stamp_type.name) == input_stamp) - break - change_to(stamp_type) -======= /obj/item/stamp name = "\improper GRANTED rubber stamp" desc = "A rubber stamp for stamping important documents." @@ -233,4 +120,3 @@ /obj/item/stamp/chameleon/broken/process() change_to(pick(stamp_types)) ->>>>>>> a00d4b1... Costumes for nuclear operatives (#34487) From 072056f919d6ecba83dd1581c91ad7b864bb0ee0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 24 Jan 2018 15:40:05 -0600 Subject: [PATCH 29/36] Update fleshmend.dm --- .../gamemodes/changeling/powers/fleshmend.dm | 55 ------------------- 1 file changed, 55 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index eef9995d3c..df6a787d60 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -1,57 +1,3 @@ -<<<<<<< HEAD -/obj/effect/proc_holder/changeling/fleshmend - name = "Fleshmend" - desc = "Our flesh rapidly regenerates, healing our burns, bruises and shortness of breath. Effectiveness decreases with quick, repeated use." - helptext = "Heals a moderate amount of damage over a short period of time. Can be used while unconscious. Does not regrow limbs or restore lost blood." - chemical_cost = 20 - dna_cost = 2 - req_stat = UNCONSCIOUS - var/recent_uses = 1 //The factor of which the healing should be divided by - var/healing_ticks = 10 - // The ideal total healing amount, - // divided by healing_ticks to get heal/tick - var/total_healing = 100 - -/obj/effect/proc_holder/changeling/fleshmend/Initialize() - . = ..() - START_PROCESSING(SSobj, src) - -/obj/effect/proc_holder/changeling/fleshmend/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/effect/proc_holder/changeling/fleshmend/process() - if(recent_uses > 1) - recent_uses = max(1, recent_uses - (1 / healing_ticks)) - -//Starts healing you every second for 10 seconds. -//Can be used whilst unconscious. -/obj/effect/proc_holder/changeling/fleshmend/sting_action(mob/living/user) - to_chat(user, "We begin to heal rapidly.") - if(recent_uses > 1) - to_chat(user, "Our healing's effectiveness is reduced \ - by quick repeated use!") - - recent_uses++ - INVOKE_ASYNC(src, .proc/fleshmend, user) - return TRUE - -/obj/effect/proc_holder/changeling/fleshmend/proc/fleshmend(mob/living/user) - - // The healing itself - doesn't heal toxin damage - // (that's anatomic panacea) and the effectiveness decreases with - // each use in a short timespan - for(var/i in 1 to healing_ticks) - if(user) - var/healpertick = -(total_healing / healing_ticks) - user.adjustBruteLoss(healpertick / recent_uses, 0) - user.adjustOxyLoss(healpertick / recent_uses, 0) - user.adjustFireLoss(healpertick / recent_uses, 0) - user.updatehealth() - else - break - sleep(10) -======= /obj/effect/proc_holder/changeling/fleshmend name = "Fleshmend" desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath. Functions while unconscious." @@ -71,4 +17,3 @@ return TRUE //Check buffs.dm for the fleshmend status effect code ->>>>>>> c051740... Refactors and nerfs Fleshmend (#34458) From 8af82a912a706a353d1f5cab9b3fa922b8bed336 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 Jan 2018 20:44:18 -0600 Subject: [PATCH 30/36] Automatic changelog generation for PR #5070 [ci skip] --- html/changelogs/AutoChangeLog-pr-5070.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5070.yml diff --git a/html/changelogs/AutoChangeLog-pr-5070.yml b/html/changelogs/AutoChangeLog-pr-5070.yml new file mode 100644 index 0000000000..e9c504e674 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5070.yml @@ -0,0 +1,6 @@ +author: "Robustin" +delete-after: True +changes: + - balance: "Clockwork marauders now take more time (+3s) and power (7x) to create." + - balance: "The \"recent marauder\" time limit is now 60 seconds, up from 20. The limit now has a significantly smaller effect on summon time but will act as a further cap on marauder summoning until it has passed." + - tweak: "The marauder cap will now only account for living cultists." From 8ddea318079cf9caf3065439de232b244217f0ed Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 Jan 2018 20:44:32 -0600 Subject: [PATCH 31/36] Automatic changelog generation for PR #5071 [ci skip] --- html/changelogs/AutoChangeLog-pr-5071.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5071.yml diff --git a/html/changelogs/AutoChangeLog-pr-5071.yml b/html/changelogs/AutoChangeLog-pr-5071.yml new file mode 100644 index 0000000000..facd56fda6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5071.yml @@ -0,0 +1,6 @@ +author: "Xhuis" +delete-after: True +changes: + - balance: "Fleshmend can no longer be stacked several times at once." + - balance: "Fleshmend no longer heals changelings who are on fire, and heals burn damage half as quickly as brute and oxygen damage." + - code_imp: "Fleshmend has been refactored into a status effect." From 8332834652c2d191c4f87bfc18e9f00888c02818 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 Jan 2018 20:44:45 -0600 Subject: [PATCH 32/36] Automatic changelog generation for PR #5072 [ci skip] --- html/changelogs/AutoChangeLog-pr-5072.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5072.yml diff --git a/html/changelogs/AutoChangeLog-pr-5072.yml b/html/changelogs/AutoChangeLog-pr-5072.yml new file mode 100644 index 0000000000..748208977b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5072.yml @@ -0,0 +1,6 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "Nuclear operatives that wish to fail in style can purchase Centcom +Official and Clown costumes. They can also buy a defective chameleon +kit." From 1c399150e2af169853bea53d557cfa3752d6f71c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 Jan 2018 20:45:53 -0600 Subject: [PATCH 33/36] Automatic changelog generation for PR #5076 [ci skip] --- html/changelogs/AutoChangeLog-pr-5076.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5076.yml diff --git a/html/changelogs/AutoChangeLog-pr-5076.yml b/html/changelogs/AutoChangeLog-pr-5076.yml new file mode 100644 index 0000000000..3017cd534e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5076.yml @@ -0,0 +1,4 @@ +author: "Ordo" +delete-after: True +changes: + - rscadd: "Adds Ketrazine, a powerful but dangerous combat stim which the crew can synthesize" From 1b4be986821b01de5fd76b0f21f6489d1c89fc41 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 Jan 2018 20:46:29 -0600 Subject: [PATCH 34/36] Automatic changelog generation for PR #5067 [ci skip] --- html/changelogs/AutoChangeLog-pr-5067.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5067.yml diff --git a/html/changelogs/AutoChangeLog-pr-5067.yml b/html/changelogs/AutoChangeLog-pr-5067.yml new file mode 100644 index 0000000000..ab176d32ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5067.yml @@ -0,0 +1,4 @@ +author: "Robustin" +delete-after: True +changes: + - rscadd: "A new cocktail: The Nar'Sour. Made from blood, demonsblood, and lemon juice, this cocktail is known to induce a slightly different type of slurring when imbibed." From a9bc274e9adef5a52c868d4024e0dc79025b5631 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 Jan 2018 20:48:05 -0600 Subject: [PATCH 35/36] Automatic changelog generation for PR #5080 [ci skip] --- html/changelogs/AutoChangeLog-pr-5080.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5080.yml diff --git a/html/changelogs/AutoChangeLog-pr-5080.yml b/html/changelogs/AutoChangeLog-pr-5080.yml new file mode 100644 index 0000000000..5b110dc0ae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5080.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - imageadd: "Autolathe now repeats it's animation while printing." From d531f63fa9a1e7f5b03b23ab1f324c88d96eda67 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 Jan 2018 20:48:17 -0600 Subject: [PATCH 36/36] Automatic changelog generation for PR #5081 [ci skip] --- html/changelogs/AutoChangeLog-pr-5081.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5081.yml diff --git a/html/changelogs/AutoChangeLog-pr-5081.yml b/html/changelogs/AutoChangeLog-pr-5081.yml new file mode 100644 index 0000000000..5113078f76 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5081.yml @@ -0,0 +1,4 @@ +author: "SPACE CONDUCTOR" +delete-after: True +changes: + - tweak: "Shuttles will throw you around if ya don't buckle in"