Merge remote-tracking branch 'upstream/master' into Surgery

This commit is contained in:
Archie
2020-12-28 16:43:57 -03:00
21 changed files with 847 additions and 850 deletions
+1 -1
View File
@@ -55,7 +55,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
GLOB.genital_fluids_list = list (/datum/reagent/consumable/milk, /datum/reagent/water, /datum/reagent/consumable/semen, /datum/reagent/consumable/femcum)
GLOB.genital_fluids_list = list ("Milk", "Water", "Semen", "Femcum")
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")
for(var/K in GLOB.breasts_shapes_list)
var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K]
+8
View File
@@ -419,6 +419,14 @@
lose_text = "<span class='notice'>Your mind finally feels calm.</span>"
medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events."
//Port from Shadow
/datum/quirk/donotclone
name = "DNC"
desc = "You have filed a Do Not Clone order, stating that you do not wish to be cloned. You can still be revived by other means."
value = -2
mob_trait = TRAIT_NEVER_CLONE
medical_record_text = "Patient has a DNC (Do not clone) order on file, and cannot be cloned as a result."
//Port from Citadel
/datum/quirk/blindness
name = "Blind"
-8
View File
@@ -135,11 +135,3 @@
mob_trait = TRAIT_HEADPAT_SLUT
value = 0
medical_record_text = "Patient seems overly affectionate"
//Port from Shadow
/datum/quirk/donotclone
name = "DNC"
desc = "You have filed a Do Not Clone order, stating that you do not wish to be cloned. You can still be revived by other means."
value = 0
mob_trait = TRAIT_NEVER_CLONE
medical_record_text = "Patient has a DNC (Do not clone) order on file, and cannot be cloned as a result."
File diff suppressed because it is too large Load Diff
-12
View File
@@ -715,18 +715,6 @@
icon_state = "scrubpuppy"
item_state = "scrubpuppy"
/obj/item/toy/plush/borgplushie/meddrake
name = "MediDrake Plushie"
desc = "An adorable stuffed toy of a Medidrake."
icon_state = "meddrake"
item_state = "meddrake"
/obj/item/toy/plush/borgplushie/secdrake
name = "SecDrake Plushie"
desc = "An adorable stuffed toy of a Secdrake."
icon_state = "secdrake"
item_state = "secdrake"
/obj/item/toy/plush/borgplushie/seeking
icon_state = "seeking"
item_state = "seeking"
@@ -17,30 +17,34 @@
* Metal
*/
GLOBAL_LIST_INIT(metal_recipes, list ( \
new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \
//CIT CHANGE - adds sofas to metal recipe list
new/datum/stack_recipe_list("sofas", list( \
new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \
new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = TRUE, on_floor = TRUE), \
new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, one_per_turf = TRUE, on_floor = TRUE), \
new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, one_per_turf = TRUE, on_floor = TRUE), \
)), \
//END OF CIT CHANGES
null, \
new/datum/stack_recipe_list("office chairs", list( \
new/datum/stack_recipe_list("seats", \
list( \
new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = TRUE, on_floor = TRUE), \
null, \
new/datum/stack_recipe("dark office chair", /obj/structure/chair/office/dark, 5, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("light office chair", /obj/structure/chair/office/light, 5, one_per_turf = TRUE, on_floor = TRUE), \
)), \
new/datum/stack_recipe_list("comfy chairs", list( \
null, \
new/datum/stack_recipe("beige comfy chair", /obj/structure/chair/comfy/beige, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("black comfy chair", /obj/structure/chair/comfy/black, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("brown comfy chair", /obj/structure/chair/comfy/brown, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("lime comfy chair", /obj/structure/chair/comfy/lime, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, one_per_turf = TRUE, on_floor = TRUE) \
)), \
//CIT CHANGE - adds sofas to metal recipe list
new/datum/stack_recipe_list("sofas", \
list( \
new/datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, one_per_turf = TRUE, on_floor = TRUE) \
)), \
//END OF CIT CHANGES
new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \
null, \
//add this when I can find a way to make them easily constructible > new/datum/stack_recipe("sink", /obj/structure/sink, 2, one_per_turf = TRUE, on_floor = TRUE),
new/datum/stack_recipe("shower", /obj/machinery/shower/crafted, 2, one_per_turf = TRUE, on_floor = TRUE), \
null, \
new/datum/stack_recipe("rack parts", /obj/item/rack_parts), \
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
@@ -56,7 +60,8 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
null, \
new /datum/stack_recipe_list("airlock assemblies", list( \
new /datum/stack_recipe_list("airlock assemblies", \
list( \
new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \
@@ -74,7 +79,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new /datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
)), \
)), \
null, \
new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+44 -10
View File
@@ -8,14 +8,48 @@
density = TRUE
anchored = TRUE
/obj/structure/loom/attackby(obj/item/stack/sheet/W, mob/user)
if(W.is_fabric && W.amount > 1)
user.show_message("<span class='notice'>You start weaving the [W.name] through the loom..</span>", 1)
if(W.use_tool(src, user, W.pull_effort))
new W.loom_result(drop_location())
user.show_message("<span class='notice'>You weave the [W.name] into a workable fabric.</span>", 1)
W.amount = (W.amount - 2)
if(W.amount < 1)
qdel(W)
/obj/structure/loom/attackby(obj/item/I, mob/user)
if (user.a_intent != INTENT_HELP)
return ..()
if (istype(I, /obj/item/stack/sheet))
if (!anchored)
return to_chat(user, "<span class='notice'>You have to anchor [src] first!</span>")
var/obj/item/stack/sheet/W = I
if(W.is_fabric && W.amount > 1)
user.visible_message("<span class='notice'[user] starts weaving [W.name] through the loom.</span>",
"<span class='notice'>You start weaving the [W.name] through the loom.</span>")
if(W.use_tool(src, user, W.pull_effort))
new W.loom_result(drop_location())
to_chat(user, "<span class='notice'>You weave the [W.name] into a workable fabric.</span>")
W.amount = (W.amount - 2)
if(W.amount < 1)
qdel(W)
else
to_chat("<span class='notice'>You need at least 2 [W.name] to loom into fabric!</span>")
else
user.show_message("<span class='notice'>You need a valid fabric and at least 2 of said fabric before using this.</span>", 1)
switch (I.tool_behaviour)
if (TOOL_SCREWDRIVER)
user.visible_message("<span class='info'>[user] starts disassembling [src]...</span>",
"<span class='info'>You start disassembling [src]...</span>")
I.play_tool_sound(src)
if(I.use_tool(src, user, 60))
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE)
deconstruct(TRUE)
return
if (TOOL_WRENCH)
if (anchored)
to_chat(user, "<span class='notice'>You unsecure the [src].</span>")
I.play_tool_sound(src)
anchored = FALSE
else
to_chat(user, "<span class='notice'>You secure the [src].</span>")
I.play_tool_sound(src)
anchored = TRUE
return
return ..()
/obj/structure/loom/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/mineral/wood (get_turf(src), 10)
qdel(src)
+107 -21
View File
@@ -219,6 +219,9 @@
var/watertemp = "normal" //freezing, normal, or boiling
var/datum/looping_sound/showering/soundloop
/obj/machinery/shower/crafted //When created from sheets of metal
anchored = FALSE
/obj/machinery/shower/Initialize()
. = ..()
soundloop = new(list(src), FALSE)
@@ -227,6 +230,29 @@
QDEL_NULL(soundloop)
return ..()
/obj/machinery/shower/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/metal (get_turf(src), 2)
Destroy()
//Copy from /obj/structure/chair
/obj/machinery/shower/ComponentInitialize()
. = ..()
AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE, CALLBACK(src, .proc/can_user_rotate),CALLBACK(src, .proc/can_be_rotated),null)
/obj/machinery/shower/proc/can_be_rotated(mob/user)
return !anchored
/obj/machinery/shower/proc/can_user_rotate(mob/user)
if(istype(user, /mob/living))
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return FALSE
else
return TRUE
else if(isobserver(user) && CONFIG_GET(flag/ghost_interaction))
return TRUE
return FALSE
////
/obj/effect/mist
name = "mist"
icon = 'icons/obj/watercloset.dmi'
@@ -236,6 +262,8 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/machinery/shower/interact(mob/M)
if (!anchored)
return to_chat(M, "<span class='warning'>You have to connect [src] to the floor first!</span>")
on = !on
update_icon()
add_fingerprint(M)
@@ -258,25 +286,56 @@
/obj/machinery/shower/attackby(obj/item/I, mob/user, params)
if(I.type == /obj/item/analyzer)
to_chat(user, "<span class='notice'>The water temperature seems to be [watertemp].</span>")
else
to_chat(user, "<span class='notice'>The water temperature seems to be <span class='bold'>[watertemp]</span>.</span>")
return
if (user.a_intent != INTENT_HELP)
return ..()
/obj/machinery/shower/wrench_act(mob/living/user, obj/item/I)
to_chat(user, "<span class='notice'>You begin to adjust the temperature valve with \the [I]...</span>")
if(I.use_tool(src, user, 50))
switch(watertemp)
if("normal")
watertemp = "freezing"
if("freezing")
watertemp = "boiling"
if("boiling")
watertemp = "normal"
user.visible_message("<span class='notice'>[user] adjusts the shower with \the [I].</span>", "<span class='notice'>You adjust the shower with \the [I] to [watertemp] temperature.</span>")
log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])")
add_hiddenprint(user)
return TRUE
switch (I.tool_behaviour)
if (TOOL_WRENCH)
if (!anchored)
user.visible_message("<span class='notice'>[user] starts to take apart [src]...</span>", "<span class='notice'>You start dismantling [src]...</span>")
I.play_tool_sound(src)
if(I.use_tool(src, user, 20))
deconstruct(TRUE)
else
to_chat(user, "<span class='notice'>You begin to adjust the temperature valve with \the [I]...</span>")
if(I.use_tool(src, user, 50))
switch(watertemp)
if("normal")
watertemp = "freezing"
if("freezing")
watertemp = "boiling"
if("boiling")
watertemp = "normal"
user.visible_message("<span class='notice'>[user] adjusts the shower with \the [I].</span>", "<span class='notice'>You adjust the shower with \the [I] to [watertemp] temperature.</span>")
log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])")
add_hiddenprint(user)
if (TOOL_SCREWDRIVER)
if (!anchored)
to_chat(user, "<span class='notice'>You begin screwing in [src] to the floor...</span>")
I.play_tool_sound(src)
if(I.use_tool(src, user, 30))
user.visible_message("<span class='notice'>[user] connects [src] to the floor.</span>", "<span class='notice'>You connect [src] to the floor.</span>")
anchored = TRUE
else
to_chat(user, "<span class='notice'>You start to take out [src]'s screws...</span>")
on = FALSE
soundloop.stop()
update_icon()
I.play_tool_sound(src)
if(I.use_tool(src, user, 20))
user.visible_message("<span class='notice'>[user] disconnects [src] from the floor.</span>", "<span class='notice'>You disconnect [src] from the floor.</span>")
anchored = FALSE
/obj/machinery/shower/examine()
. += ..()
if (anchored)
. += "<span class='info'>It looks like it can be taken apart with a <span class='bold'>screwdriver</span>...</span>"
else
. += "<span class='info'>Its <span class='bold'>screws</span> are out of place, allowing it to be <span class='bold'>dismantled with a wrench</span>.</span>"
/obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up
cut_overlays() //once it's been on for a while, in addition to handling the water overlay.
@@ -463,6 +522,27 @@
anchored = TRUE
var/busy = FALSE //Something's being washed at the moment
var/dispensedreagent = /datum/reagent/water // for whenever plumbing happens
layer = WALL_OBJ_LAYER
/*/obj/structure/sink/Initialize() //This doesn't work in the slightest. It used to at some point through development, but that made it so you cant interact with the object whatsoever. I hate this.
. = ..()
switch (dir) //Thinking about moving this into its own construction sequence so it can actually work, like using a screwdriver will set its pixel offset, but I feel like that's too much
if (NORTH) //Or maybe putting it in lateinit... but that's sloppy and I feel like it wont work when spawning it in after the round starts
pixel_x = pixel_y = 0
layer = WALL_OBJ_LAYER
if (EAST)
pixel_x = 12
pixel_y = 3
layer = WALL_OBJ_LAYER
if (SOUTH)
pixel_y = 24
pixel_x = 0
layer = ABOVE_OBJ_LAYER
if (WEST)
pixel_x = -12
pixel_y = 3
layer = WALL_OBJ_LAYER
*/
/obj/structure/sink/attack_hand(mob/living/user)
@@ -509,7 +589,16 @@
/obj/structure/sink/attackby(obj/item/O, mob/living/user, params)
if(busy)
to_chat(user, "<span class='warning'>Someone's already washing here!</span>")
to_chat(user, "<span class='warning'>Someone's already washing here.</span>")
return
if (istype(O, /obj/item/wrench) && user.a_intent == INTENT_HELP)
to_chat(user, "<span class='notice'>You start deconstructing [src]...</span>")
O.play_tool_sound(src)
if(O.use_tool(src, user, 20))
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE)
deconstruct(TRUE)
return
if(istype(O, /obj/item/reagent_containers))
@@ -574,16 +663,13 @@
return ..()
/obj/structure/sink/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/metal (loc, 3)
new /obj/item/stack/sheet/metal (loc, 2)
qdel(src)
/obj/structure/sink/kitchen
name = "kitchen sink"
icon_state = "sink_alt"
/obj/structure/sink/puddle //splishy splashy ^_^
name = "puddle"
desc = "A puddle used for washing one's hands and face."
+32 -5
View File
@@ -825,7 +825,20 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=balls_color;task=input'>Change</a><br>"
//dat += "<b>Ball Circumference:</b> <a style='display:block;width:120px' href='?_src_=prefs;preference=balls_size;task=input'>[features["balls_size"]] inch(es)</a>" // The menu works but doesn't do anything yet. Need to figure it out.
dat += "<b>Testicles showing:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=balls_shape;task=input'>[features["balls_shape"]]</a>"
dat += "<b>Produces:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>[features["balls_fluid"]]</a>"
dat += "<b>Produces:</b>"
switch(features["balls_fluid"])
if(/datum/reagent/consumable/milk)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Milk</a>"
if(/datum/reagent/water)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Water</a>"
if(/datum/reagent/consumable/semen)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Semen</a>"
if(/datum/reagent/consumable/femcum)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Femcum</a>"
else
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Nothing?</a>"
//This else is a safeguard for errors, and if it happened, they wouldn't be able to change this pref,
//DO NOT REMOVE IT UNLESS YOU HAVE A GOOD IDEA
dat += APPEARANCE_CATEGORY_COLUMN
dat += "<h3>Vagina</h3>"
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=has_vag'>[features["has_vag"] == TRUE ? "Yes" : "No"]</a>"
@@ -2137,8 +2150,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("balls_fluid")
var/new_shape
new_shape = input(user, "Balls Fluid", "Character Preference") as null|anything in GLOB.genital_fluids_list
if(new_shape)
features["balls_fluid"] = new_shape
switch(new_shape)
if("Milk")
features["balls_fluid"] = /datum/reagent/consumable/milk
if("Water")
features["balls_fluid"] = /datum/reagent/water
if("Semen")
features["balls_fluid"] = /datum/reagent/consumable/semen
if("Femcum")
features["balls_fluid"] = /datum/reagent/consumable/femcum
if("egg_size")
var/new_size
@@ -2171,8 +2191,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("breasts_fluid")
var/new_shape
new_shape = input(user, "Breast Fluid", "Character Preference") as null|anything in GLOB.genital_fluids_list
if(new_shape)
features["breasts_fluid"] = new_shape
switch(new_shape)
if("Milk")
features["balls_fluid"] = /datum/reagent/consumable/milk
if("Water")
features["balls_fluid"] = /datum/reagent/water
if("Semen")
features["balls_fluid"] = /datum/reagent/consumable/semen
if("Femcum")
features["balls_fluid"] = /datum/reagent/consumable/femcum
if("breasts_color")
var/new_breasts_color = input(user, "Breast Color:", "Character Preference") as color|null
+23 -34
View File
@@ -13,7 +13,7 @@
possible_transfer_amounts = list(5,10,15,20,25,30,50)
volume = 50
resistance_flags = NONE
var/isGlass = TRUE //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
var/isGlass = TRUE //Whether the container is made of glass or not so that milk cartons dont shatter when someone gets hit by it
splashable = TRUE
/obj/item/reagent_containers/food/drinks/on_reagent_change(changetype)
@@ -105,34 +105,45 @@
/obj/item/reagent_containers/food/drinks/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(!.) //if the bottle wasn't caught
smash(hit_atom, throwingdatum?.thrower, TRUE)
smash(hit_atom, throwingdatum.thrower, TRUE)
/obj/item/reagent_containers/food/drinks/after_throw(datum/callback/callback)
. = ..()
if (!isGlass)
return
if (!QDELETED(src) || !QDELING(src)) //If we didn't get qdeleted by smash(), assume we got flung by a bartender
transform = initial(transform)
to_chat(viewers(8, get_turf(src)), "<span class='notice'>\The [src] lands upright without spilling a drop!</span>")
/obj/item/reagent_containers/food/drinks/proc/smash(atom/target, mob/thrower, ranged = FALSE)
if(!isGlass)
if (!isGlass)
return
if(QDELING(src) || !target) //Invalid loc
if (QDELING(src) || !target) //Invalid loc
return
if(bartender_check(target) && ranged)
if (bartender_check(thrower) && istype(target, /turf/open) && ranged) //Smash against windows and players, but not on floors or tables. The target is always an open turf if there is no density
return
SplashReagents(target)
var/obj/item/broken_bottle/B = new (loc)
B.icon_state = icon_state
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
var/icon/I = new(icon, icon_state)
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
B.name = "broken [name]"
if(ranged)
transfer_fingerprints_to(B)
playsound(src, "shatter", 70, 1)
qdel(src)
if (ranged)
var/matrix/M = matrix(B.transform)
M.Turn(rand(-170, 170))
B.transform = M
B.pixel_x = rand(-12, 12)
B.pixel_y = rand(-12, 12)
if(prob(33))
new/obj/item/shard(drop_location())
playsound(src, "shatter", 70, 1)
transfer_fingerprints_to(B)
qdel(src)
else
thrower.put_in_hands(B)
if (prob(33))
new/obj/item/shard(get_turf(target))
@@ -305,28 +316,6 @@
icon_state = "juicebox"
volume = 15 //I figure if you have to craft these it should at least be slightly better than something you can get for free from a watercooler
/obj/item/reagent_containers/food/drinks/sillycup/smallcarton/smash(atom/target, mob/thrower, ranged = FALSE)
if(bartender_check(target) && ranged)
return
var/obj/item/broken_bottle/B = new (loc)
B.icon_state = icon_state
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
B.name = "broken [name]"
B.force = 0
B.throwforce = 0
B.desc = "A carton with the bottom half burst open. Might give you a papercut."
if(ranged)
var/matrix/M = matrix(B.transform)
M.Turn(rand(-170, 170))
B.transform = M
B.pixel_x = rand(-12, 12)
B.pixel_y = rand(-12, 12)
transfer_fingerprints_to(B)
qdel(src)
/obj/item/reagent_containers/food/drinks/sillycup/smallcarton/on_reagent_change(changetype)
if (reagents.reagent_list.len)
switch(reagents.get_master_reagent_id())
@@ -16,40 +16,6 @@
isGlass = TRUE
foodtype = ALCOHOL
/obj/item/reagent_containers/food/drinks/bottle/smash(mob/living/target, mob/thrower, ranged = FALSE)
//Creates a shattering noise and replaces the bottle with a broken_bottle
if(bartender_check(target) && ranged)
return
var/obj/item/broken_bottle/B = new (loc)
if(!ranged)
thrower.put_in_hands(B)
else
var/matrix/M = matrix(B.transform)
M.Turn(rand(-170, 170))
B.transform = M
B.pixel_x = rand(-12, 12)
B.pixel_y = rand(-12, 12)
B.icon_state = icon_state
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
if(isGlass)
if(prob(33))
new/obj/item/shard(drop_location())
playsound(src, "shatter", 70, 1)
else
B.force = 0
B.throwforce = 0
B.desc = "A carton with the bottom half burst open. Might give you a papercut."
B.name = "broken [name]"
transfer_fingerprints_to(B)
qdel(src)
/obj/item/reagent_containers/food/drinks/bottle/attack(mob/living/target, mob/living/user)
if(!target)
+34 -3
View File
@@ -38,8 +38,10 @@
playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE)
/obj/structure/fermenting_barrel/attackby(obj/item/I, mob/user, params)
var/obj/item/reagent_containers/food/snacks/grown/fruit = I
if(istype(fruit))
if (user.a_intent != INTENT_HELP)
return ..()
if (istype(I, /obj/item/reagent_containers/food/snacks/grown))
var/obj/item/reagent_containers/food/snacks/grown/fruit = I
if(!fruit.can_distill)
to_chat(user, "<span class='warning'>You can't distill this into anything...</span>")
return TRUE
@@ -50,7 +52,32 @@
addtimer(CALLBACK(src, .proc/makeWine, fruit), rand(80, 120) * speed_multiplier)
return TRUE
else
return ..()
switch (I.tool_behaviour)
if (TOOL_SCREWDRIVER)
user.visible_message("<span class='info'>[user] starts disassembling [src]...</span>",
"<span class='info'>You start disassembling [src]...</span>")
var/reagent_calculation = 1
if (reagents.total_volume)
user.visible_message("<span class='warning'>Liquid starts pouring out [src] as [user] starts disassembling it!</span>",
"<span class='warning'>Liquid starts pouring out [src], maybe you should think about this...</span>")
reagent_calculation += 2+round(reagents.total_volume/100)/2
I.play_tool_sound(src)
if(I.use_tool(src, user, 30*reagent_calculation))
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE)
if (reagents.total_volume)
chem_splash(loc, round(reagent_calculation*0.75), list(reagents))
deconstruct(TRUE)
else if (reagents.total_volume)
visible_message("<span class='info'>[user] stops disassembling [src].</span>")
if (TOOL_WRENCH)
if (anchored) //Imaginary bolts on the ground, just like anything else that can get wrenched
to_chat(user, "<span class='notice'>You unsecure [src].</span>")
I.play_tool_sound(src)
anchored = FALSE
else
to_chat(user, "<span class='notice'>You secure [src].</span>")
I.play_tool_sound(src)
anchored = TRUE
/obj/structure/fermenting_barrel/attack_hand(mob/user)
open = !open
@@ -69,3 +96,7 @@
icon_state = "barrel_open"
else
icon_state = "barrel"
/obj/structure/fermenting_barrel/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/mineral/wood (get_turf(src), 10)
qdel(src)
@@ -316,6 +316,6 @@
/datum/chemical_reaction/prussian_blue
name = "Prussian Blue"
id = "prussian_blue"
results = list("prussian_blue" = 2)
required_reagents = list( "iron" = 1, "cyanide" = 6)
id = /datum/reagent/medicine/prussian_blue
results = list(/datum/reagent/medicine/prussian_blue = 2)
required_reagents = list( /datum/reagent/iron = 1, /datum/reagent/toxin/cyanide = 6)
+7 -8
View File
@@ -85,10 +85,10 @@
/obj/item/reagent_containers/proc/bartender_check(atom/target)
. = FALSE
var/turf/T = get_turf(src)
if(!T || target.CanPass(src, T) || !thrownby || !thrownby.actions)
if(!T || !thrownby || !thrownby.actions)
return
for(var/datum/action/innate/drink_fling/D in thrownby.actions)
if(D.active)
for(var/datum/action/innate/D in thrownby.actions)
if(D.active && istype(D, /datum/action/innate/drink_fling))
return TRUE
@@ -107,17 +107,16 @@
target.visible_message("<span class='danger'>[M] has been splashed with something!</span>", \
"<span class='userdanger'>[M] has been splashed with something!</span>")
for(var/datum/reagent/A in reagents.reagent_list)
R += A.type + " ("
R += num2text(A.volume) + "),"
R += "[A.type] ([num2text(A.volume)]), "
if(thrownby)
log_combat(thrownby, M, "splashed", R)
reagents.reaction(target, TOUCH)
else if(bartender_check(target) && thrown)
visible_message("<span class='notice'>[src] lands onto the [target.name] without spilling a single drop.</span>")
transform = initial(transform)
addtimer(CALLBACK(src, .proc/ForceResetRotation), 1)
if(!istype(src, /obj/item/reagent_containers/food/drinks)) //drinks smash against solid objects
visible_message("<span class='notice'>[src] lands upright without spilling a single drop!</span>")
transform = initial(transform)
return
else
@@ -63,7 +63,6 @@
log_game("[key_name(user)] fired Space lube from \a [src] at [AREACOORD(T)].")
return
/obj/item/reagent_containers/spray/proc/spray(atom/A)
var/range = CLAMP(get_dist(src, A), 1, current_range)
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))