mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-15 09:57:49 +01:00
Merge remote-tracking branch 'upstream/master' into Surgery
This commit is contained in:
@@ -825,7 +825,20 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'> </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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user