diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm index 0cfe2282881..46ee18a33bc 100644 --- a/code/__HELPERS/trait_helpers.dm +++ b/code/__HELPERS/trait_helpers.dm @@ -225,6 +225,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// An advanced surgical tool. If a surgical tool has this flag, it will be able to automatically repeat steps until they succeed. #define TRAIT_ADVANCED_SURGICAL "advanced_surgical" +///An item that is oiled. If sprayed with water, it's slowdown reverts to normal. +#define TRAIT_OIL_SLICKED "oil_slicked" // // common trait sources diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm index 8e808415002..21d39671828 100644 --- a/code/_globalvars/genetics.dm +++ b/code/_globalvars/genetics.dm @@ -17,7 +17,6 @@ GLOBAL_VAR_INIT(monkeyblock, DNA_SE_LENGTH) // Monkey block will always be the D GLOBAL_VAR_INIT(breathlessblock, 0) GLOBAL_VAR_INIT(remoteviewblock, 0) GLOBAL_VAR_INIT(regenerateblock, 0) -GLOBAL_VAR_INIT(increaserunblock, 0) GLOBAL_VAR_INIT(remotetalkblock, 0) GLOBAL_VAR_INIT(morphblock, 0) GLOBAL_VAR_INIT(coldblock, 0) diff --git a/code/game/dna/mutations/mutation_powers.dm b/code/game/dna/mutations/mutation_powers.dm index 2376043ede7..e2b9231b1a9 100644 --- a/code/game/dna/mutations/mutation_powers.dm +++ b/code/game/dna/mutations/mutation_powers.dm @@ -33,26 +33,6 @@ H.adjustBruteLoss(-1, FALSE) H.adjustFireLoss(-1) -/datum/mutation/increaserun - name = "Super Speed" - activation_messages = list("You feel swift and unencumbered.") - deactivation_messages = list("You feel slow.") - instability = GENE_INSTABILITY_MINOR - traits_to_add = list(TRAIT_IGNORESLOWDOWN) - -/datum/mutation/increaserun/New() - ..() - block = GLOB.increaserunblock - -/datum/mutation/increaserun/can_activate(mob/M, flags) - if(!..()) - return FALSE - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.dna.species && H.dna.species.speed_mod && !(flags & MUTCHK_FORCED)) - return FALSE - return TRUE - /datum/mutation/heat_resist name = "Heat Resistance" activation_messages = list("Your skin is icy to the touch.") diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 42c0e316acb..21f6e1eced4 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -51,7 +51,6 @@ GLOB.breathlessblock = getAssignedBlock("BREATHLESS", numsToAssign, DNA_HARD_BOUNDS, good=1) GLOB.remoteviewblock = getAssignedBlock("REMOTEVIEW", numsToAssign, DNA_HARDER_BOUNDS, good=1) GLOB.regenerateblock = getAssignedBlock("REGENERATE", numsToAssign, DNA_HARDER_BOUNDS, good=1) - GLOB.increaserunblock = getAssignedBlock("INCREASERUN", numsToAssign, DNA_HARDER_BOUNDS, good=1) GLOB.remotetalkblock = getAssignedBlock("REMOTETALK", numsToAssign, DNA_HARDER_BOUNDS, good=1) GLOB.morphblock = getAssignedBlock("MORPH", numsToAssign, DNA_HARDER_BOUNDS, good=1) GLOB.coldblock = getAssignedBlock("COLD", numsToAssign, good=1) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 37eab53c901..34118fe18cf 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -877,3 +877,23 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons /obj/item/proc/remove_tape() return + +/obj/item/water_act(volume, temperature, source, method) + . = ..() + if(HAS_TRAIT(src, TRAIT_OIL_SLICKED)) + slowdown = initial(slowdown) + remove_atom_colour(FIXED_COLOUR_PRIORITY) + REMOVE_TRAIT(src, TRAIT_OIL_SLICKED, "potion") + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.regenerate_icons() + +/obj/item/cleaning_act(mob/user, atom/cleaner, cleanspeed, text_verb, text_description, text_targetname) + . = ..() + if(HAS_TRAIT(src, TRAIT_OIL_SLICKED)) + slowdown = initial(slowdown) + remove_atom_colour(FIXED_COLOUR_PRIORITY) + REMOVE_TRAIT(src, TRAIT_OIL_SLICKED, "potion") + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.regenerate_icons() diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index e554e56390f..7e6c1d3c631 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -286,28 +286,6 @@ block = GLOB.regenerateblock ..() -/obj/item/dnainjector/runfast - name = "DNA-Injector (Increase Run)" - desc = "Running Man." - datatype = DNA2_BUF_SE - value = 0xFFF - forcedmutation = TRUE - -/obj/item/dnainjector/runfast/Initialize() - block = GLOB.increaserunblock - ..() - -/obj/item/dnainjector/antirunfast - name = "DNA-Injector (Anti-Increase Run)" - desc = "Walking Man." - datatype = DNA2_BUF_SE - value = 0x001 - forcedmutation = TRUE - -/obj/item/dnainjector/antirunfast/Initialize() - block = GLOB.increaserunblock - ..() - /obj/item/dnainjector/morph name = "DNA-Injector (Morph)" desc = "A total makeover." diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 32d85501b86..5b5cd49adcd 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -36,6 +36,8 @@ var/framestackamount = 2 var/deconstruction_ready = TRUE var/flipped = FALSE + ///If this is true, the table will have items slide off it when placed. + var/slippery = FALSE /// The minimum level of environment_smash required for simple animals to be able to one-shot this. var/minimum_env_smash = ENVIRONMENT_SMASH_WALLS @@ -235,7 +237,12 @@ //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) I.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) I.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) - item_placed(I) + if(slippery) + step_away(I, user) + visible_message("[I] slips right off [src]!") + playsound(loc, 'sound/misc/slip.ogg', 50, 1, -1) + else //Don't want slippery moving tables to have the item attached to them if it slides off. + item_placed(I) else return ..() @@ -402,6 +409,14 @@ return 1 +/obj/structure/table/water_act(volume, temperature, source, method) + . = ..() + if(HAS_TRAIT(src, TRAIT_OIL_SLICKED)) + slippery = initial(slippery) + remove_atom_colour(FIXED_COLOUR_PRIORITY) + REMOVE_TRAIT(src, TRAIT_OIL_SLICKED, "potion") + + /* * Glass Tables */ diff --git a/code/modules/antagonists/wishgranter/wishgranter_avatar.dm b/code/modules/antagonists/wishgranter/wishgranter_avatar.dm index 463cb869211..8774b487b93 100644 --- a/code/modules/antagonists/wishgranter/wishgranter_avatar.dm +++ b/code/modules/antagonists/wishgranter/wishgranter_avatar.dm @@ -26,9 +26,6 @@ H.dna.SetSEState(GLOB.teleblock, TRUE) singlemutcheck(H, GLOB.teleblock, MUTCHK_FORCED) - H.dna.SetSEState(GLOB.increaserunblock, TRUE) - singlemutcheck(H, GLOB.increaserunblock, MUTCHK_FORCED) - H.dna.SetSEState(GLOB.breathlessblock, TRUE) singlemutcheck(H, GLOB.breathlessblock, MUTCHK_FORCED) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index dead171d855..1741114ddcb 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -17,13 +17,21 @@ STOP_PROCESSING(SSobj, src) return ..() +/obj/item/clothing/shoes/magboots/water_act(volume, temperature, source, method) + . = ..() + if(magpulse && slowdown_active > SHOES_SLOWDOWN) + slowdown = slowdown_active + /obj/item/clothing/shoes/magboots/atmos desc = "Magnetic boots, made to withstand gusts of space wind over 500kmph." name = "atmospheric magboots" icon_state = "atmosmagboots0" magboot_state = "atmosmagboots" -/obj/item/clothing/shoes/magboots/attack_self(mob/user) +/obj/item/clothing/shoes/magboots/attack_self(mob/user, forced = FALSE) + toggle_magpulse(user, forced) + +/obj/item/clothing/shoes/magboots/proc/toggle_magpulse(mob/user, forced) if(magpulse) START_PROCESSING(SSobj, src) //Gravboots flags &= ~NOSLIP @@ -34,7 +42,8 @@ slowdown = slowdown_active magpulse = !magpulse icon_state = "[magboot_state][magpulse]" - to_chat(user, "You [magpulse ? "enable" : "disable"] the [magpulse_name].") + if(!forced) + to_chat(user, "You [magpulse ? "enable" : "disable"] the [magpulse_name].") user.update_inv_shoes() //so our mob-overlays update user.update_gravity(user.mob_has_gravity()) for(var/X in actions) @@ -194,7 +203,7 @@ if(ishuman(loc)) var/mob/living/carbon/human/user = loc to_chat(user, "[src] has ran out of charge, and turned off!") - attack_self(user) + attack_self(user, TRUE) else cell.use(power_consumption_rate) @@ -258,7 +267,7 @@ style.remove(H) if(magpulse) to_chat(user, "As [src] are removed, they deactivate.") - attack_self(user) + attack_self(user, TRUE) /obj/item/clothing/shoes/magboots/gravity/item_action_slot_check(slot) if(slot == slot_shoes) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 803a408b2d2..b36fc97471f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -755,6 +755,17 @@ emp_act /mob/living/carbon/human/water_act(volume, temperature, source, method = REAGENT_TOUCH) . = ..() dna.species.water_act(src, volume, temperature, source, method) + if(method != REAGENT_TOUCH) + return + + for(var/obj/O in list(head, wear_suit, l_hand, r_hand)) + O.water_act(src, volume, temperature, source, method) + if((head?.flags & THICKMATERIAL) && (wear_suit?.flags & THICKMATERIAL)) // fully pierce proof clothing is also water proof! + return + for(var/obj/O in list(w_uniform, shoes, belt, gloves, glasses, l_ear, r_ear, wear_id, wear_pda, r_store, l_store, s_store)) + O.water_act(src, volume, temperature, source, method) + + /mob/living/carbon/human/attackby(obj/item/I, mob/user, params) if(SEND_SIGNAL(src, COMSIG_HUMAN_ATTACKED, user) & COMPONENT_CANCEL_ATTACK_CHAIN) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 3fdf4b8508a..6fe535ff9d0 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -532,6 +532,20 @@ log_game("[who] triggered an oil slime explosion at [COORD(extract_turf)].") explosion(extract_turf, 1, 3, 6) +/datum/chemical_reaction/oil_slick + name = "Oil Potion" + id = "O_potion" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/oil + required_other = TRUE + +/datum/chemical_reaction/oil_slick/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) + var/obj/item/slimepotion/oil_slick/P = new /obj/item/slimepotion/oil_slick + P.forceMove(get_turf(holder.my_atom)) + //Light Pink /datum/chemical_reaction/slimepotion2 name = "Slime Potion 2" diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index abd557236a0..75c2062e90e 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -447,6 +447,49 @@ if(loc == usr && loc.Adjacent(over_object)) afterattack(over_object, usr, TRUE) +/obj/item/slimepotion/oil_slick + name = "slime oil potion" + desc = "A potent chemical mix that will remove the slowdown from any item by reducing friction. Doesn't mix well with water." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle4" + origin_tech = "biotech=5" + +/obj/item/slimepotion/oil_slick/afterattack(obj/O, mob/user, proximity_flag) + if(!proximity_flag) + return + ..() + if(!isitem(O)) + if(!istype(O, /obj/structure/table)) + to_chat(user, "The potion can only be used on items!") + return + var/obj/structure/table/T = O + if(T.slippery) + to_chat(user, "[T] can luckily not be made any slippier!") + return + to_chat(user, "You go to place the potion on [T], but before you know it, your hands are moving on your own!") //Speed table must remain. + T.slippery = TRUE + else + var/obj/item/I = O + if(I.slowdown <= 0) + to_chat(user, "[I] can't be made any faster!") + return + I.slowdown = 0 + + to_chat(user, "You slather the oily gunk over [O], making it slick and slippery.") + O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + O.add_atom_colour("#6e6e86", FIXED_COLOUR_PRIORITY) + ADD_TRAIT(O, TRAIT_OIL_SLICKED, "potion") + if(ishuman(O.loc)) + var/mob/living/carbon/human/H = O.loc + H.regenerate_icons() + qdel(src) + +/obj/item/slimepotion/oil_slick/MouseDrop(obj/over_object) + if(usr.incapacitated()) + return + if(loc == usr && loc.Adjacent(over_object)) + afterattack(over_object, usr, TRUE) + /obj/effect/timestop anchored = TRUE name = "chronofield" diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index 6f8f3f7c357..09ef99dfcac 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -238,3 +238,4 @@ /obj/vehicle/zap_act(power, zap_flags) zap_buckle_check(power) return ..() + diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 838676795c2..9030742c394 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ