Merge branch 'master' of https://github.com/PolarisSS13/Polaris into teshhair2

This commit is contained in:
Greenjoe12345
2022-10-16 22:55:40 +01:00
33 changed files with 551 additions and 386 deletions
+3 -3
View File
@@ -404,13 +404,13 @@
// As this is only done at runtime, we have to create all the vending machines in existence and force them
// to register their products when this asset initializes.
/datum/asset/spritesheet/vending/proc/populate_vending_products()
SSatoms.map_loader_begin()
SSatoms.BeginMapLoad()
for(var/path in subtypesof(/obj/machinery/vending))
var/obj/machinery/vending/x = new path(null)
// force an inventory build; with map_loader_begin active, init isn't called
// force an inventory build; with BeginMapLoad active, init isn't called
x.build_inventory()
qdel(x)
SSatoms.map_loader_stop()
SSatoms.FinishMapLoad()
// /datum/asset/simple/genetics
// assets = list(
@@ -730,6 +730,24 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.h_style = new_h_style
return TOPIC_REFRESH_UPDATE_PREVIEW
else if (href_list["hair_style_left"])
var/list/valid_hairstyles = pref.get_valid_hairstyles()
var/index = valid_hairstyles.Find(href_list["hair_style_left"])
if (!index || index == 1)
pref.h_style = valid_hairstyles[length(valid_hairstyles)]
else
pref.h_style = valid_hairstyles[index - 1]
return TOPIC_REFRESH_UPDATE_PREVIEW
else if (href_list["hair_style_right"])
var/list/valid_hairstyles = pref.get_valid_hairstyles()
var/index = valid_hairstyles.Find(href_list["hair_style_right"])
if (!index || index == length(valid_hairstyles))
pref.h_style = valid_hairstyles[1]
else
pref.h_style = valid_hairstyles[index + 1]
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["grad_style"])
var/list/valid_gradients = GLOB.hair_gradients
@@ -738,26 +756,22 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.grad_style = new_grad_style
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["hair_style_left"])
var/H = href_list["hair_style_left"]
var/list/valid_hairstyles = pref.get_valid_hairstyles()
var/start = valid_hairstyles.Find(H)
if(start != 1) //If we're not the beginning of the list, become the previous element.
pref.h_style = valid_hairstyles[start-1]
else //But if we ARE, become the final element.
pref.h_style = valid_hairstyles[valid_hairstyles.len]
else if (href_list["grad_style_left"])
var/list/valid_hair_gradients = GLOB.hair_gradients
var/index = valid_hair_gradients.Find(href_list["grad_style_left"])
if (!index || index == 1)
pref.grad_style = valid_hair_gradients[length(valid_hair_gradients)]
else
pref.grad_style = valid_hair_gradients[index - 1]
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["hair_style_right"])
var/H = href_list["hair_style_right"]
var/list/valid_hairstyles = pref.get_valid_hairstyles()
var/start = valid_hairstyles.Find(H)
if(start != valid_hairstyles.len) //If we're not the end of the list, become the next element.
pref.h_style = valid_hairstyles[start+1]
else //But if we ARE, become the first element.
pref.h_style = valid_hairstyles[1]
else if (href_list["grad_style_right"])
var/list/valid_hair_gradients = GLOB.hair_gradients
var/index = valid_hair_gradients.Find(href_list["grad_style_right"])
if (!index || index == length(valid_hair_gradients))
pref.grad_style = valid_hair_gradients[1]
else
pref.grad_style = valid_hair_gradients[index + 1]
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["facial_color"])
@@ -806,26 +820,22 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.f_style = new_f_style
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["facial_style_left"])
var/F = href_list["facial_style_left"]
else if (href_list["facial_style_left"])
var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles()
var/start = valid_facialhairstyles.Find(F)
if(start != 1) //If we're not the beginning of the list, become the previous element.
pref.f_style = valid_facialhairstyles[start-1]
else //But if we ARE, become the final element.
pref.f_style = valid_facialhairstyles[valid_facialhairstyles.len]
var/index = valid_facialhairstyles.Find(href_list["facial_style_left"])
if (!index || index == 1)
pref.f_style = valid_facialhairstyles[length(valid_facialhairstyles)]
else
pref.f_style = valid_facialhairstyles[index - 1]
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["facial_style_right"])
var/F = href_list["facial_style_right"]
else if (href_list["facial_style_right"])
var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles()
var/start = valid_facialhairstyles.Find(F)
if(start != valid_facialhairstyles.len) //If we're not the end of the list, become the next element.
pref.f_style = valid_facialhairstyles[start+1]
else //But if we ARE, become the first element.
var/index = valid_facialhairstyles.Find(href_list["facial_style_right"])
if (!index || index == length(valid_facialhairstyles))
pref.f_style = valid_facialhairstyles[1]
else
pref.f_style = valid_facialhairstyles[index + 1]
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["marking_style"])
+30
View File
@@ -153,6 +153,36 @@
desc = "A starry winter hood."
icon_state = "winterhood_cosmic"
/obj/item/clothing/head/hood/winter/parka_red
name = "red parka hood"
desc = "A red fur-lined hood."
icon_state = "redpark_hood"
/obj/item/clothing/head/hood/winter/parka_green
name = "green parka hood"
desc = "A green fur-lined hood."
icon_state = "greenpark_hood"
/obj/item/clothing/head/hood/winter/parka_blue
name = "blue parka hood"
desc = "A blue fur-lined hood."
icon_state = "bluepark_hood"
/obj/item/clothing/head/hood/winter/parka_yellow
name = "yellow parka hood"
desc = "A yellow fur-lined hood."
icon_state = "yellowpark_hood"
/obj/item/clothing/head/hood/winter/parka_purple
name = "purple parka hood"
desc = "A purple fur-lined hood."
icon_state = "purplepark_hood"
/obj/item/clothing/head/hood/winter/parka_vintage
name = "vintage parka hood"
desc = "An old-fashioned fur-lined hood."
icon_state = "vintagepark_hood"
// Explorer gear
/obj/item/clothing/head/hood/explorer
name = "explorer hood"
+39
View File
@@ -335,6 +335,45 @@
light_power = 1.8
light_range = 1.2
/obj/item/clothing/suit/storage/hooded/wintercoat/parka
name = "red parka"
desc = "A heavy fur-lined jacket designed to keep you extra warm in sub-zero conditions."
icon_state = "redpark"
item_state_slots = list(slot_r_hand_str = "coatwinter", slot_l_hand_str = "coatwinter")
hoodtype = /obj/item/clothing/head/hood/winter/parka_red
/obj/item/clothing/suit/storage/hooded/wintercoat/parka/green
name = "green parka"
icon_state = "greenpark"
hoodtype = /obj/item/clothing/head/hood/winter/parka_green
/obj/item/clothing/suit/storage/hooded/wintercoat/parka/blue
name = "blue parka"
icon_state = "bluepark"
hoodtype = /obj/item/clothing/head/hood/winter/parka_blue
/obj/item/clothing/suit/storage/hooded/wintercoat/parka/yellow
name = "yellow parka"
icon_state = "yellowpark"
hoodtype = /obj/item/clothing/head/hood/winter/parka_yellow
/obj/item/clothing/suit/storage/hooded/wintercoat/parka/purple
name = "purple parka"
icon_state = "purplepark"
hoodtype = /obj/item/clothing/head/hood/winter/parka_purple
/obj/item/clothing/suit/storage/hooded/wintercoat/parka/nanotrasen
name = "corporate blue parka"
desc = "A NanoTrasen branded fur-lined jacket made to keep you nice and toasty on cold winter days. Or at least alive"
icon_state = "corppark"
hoodtype = /obj/item/clothing/head/hood/winter/parka_blue //No point having a unique hood when it's just blue anyway!
/obj/item/clothing/suit/storage/hooded/wintercoat/parka/vintage
name = "vintage parka"
desc = "An old-fashioned fur-lined jacket made to keep you nice and toasty on cold winter days. Or at least alive."
icon_state = "vintagepark"
hoodtype = /obj/item/clothing/head/hood/winter/parka_vintage
// winter coats end here
/obj/item/clothing/suit/storage/hooded/explorer
+4 -4
View File
@@ -366,7 +366,7 @@ var/global/use_preloader = FALSE
first_turf_index++
//turn off base new Initialization until the whole thing is loaded
SSatoms.map_loader_begin()
SSatoms.BeginMapLoad()
//instanciate the first /turf
var/turf/T
if(members[first_turf_index] != /turf/template_noop)
@@ -385,7 +385,7 @@ var/global/use_preloader = FALSE
for(index in 1 to first_turf_index-1)
instance_atom(members[index],members_attributes[index],crds,no_changeturf,orientation)
//Restore initialization to the previous value
SSatoms.map_loader_stop()
SSatoms.FinishMapLoad()
////////////////
//Helpers procs
@@ -406,9 +406,9 @@ var/global/use_preloader = FALSE
//custom CHECK_TICK here because we don't want things created while we're sleeping to not initialize
if(TICK_CHECK)
SSatoms.map_loader_stop()
SSatoms.FinishMapLoad()
stoplag()
SSatoms.map_loader_begin()
SSatoms.BeginMapLoad()
// Rotate the atom now that it exists, rather than changing its orientation beforehand through the fields["dir"]
if(orientation != 0) // 0 means no rotation
@@ -7,8 +7,7 @@
if (istype(loc, /turf/space))
return ..() - 1
if(species.slowdown)
. += species.slowdown
. += species.get_slowdown(src)
if(force_max_speed)
return ..() + HUMAN_LOWEST_SLOWDOWN
@@ -263,4 +262,4 @@
/mob/living/carbon/human/set_dir(var/new_dir)
. = ..()
if(. && species.tail)
update_tail_showing()
update_tail_showing()
+22 -20
View File
@@ -82,7 +82,7 @@
handle_shock()
handle_pain()
handle_allergens()
handle_medical_side_effects()
@@ -167,11 +167,12 @@
var/pressure_difference
// First get the absolute pressure difference.
if(pressure < species.safe_pressure) // We are in an underpressure.
pressure_difference = species.safe_pressure - pressure
var/species_safe_pressure = species.get_safe_pressure(src)
if(pressure < species_safe_pressure) // We are in an underpressure.
pressure_difference = species_safe_pressure - pressure
else //We are in an overpressure or standard atmosphere.
pressure_difference = pressure - species.safe_pressure
pressure_difference = pressure - species_safe_pressure
if(pressure_difference < 5) // If the difference is small, don't bother calculating the fraction.
pressure_difference = 0
@@ -184,10 +185,10 @@
// The difference is always positive to avoid extra calculations.
// Apply the relative difference on a standard atmosphere to get the final result.
// The return value will be the adjusted_pressure of the human that is the basis of pressure warnings and damage.
if(pressure < species.safe_pressure)
return species.safe_pressure - pressure_difference
if(pressure < species_safe_pressure)
return species_safe_pressure - pressure_difference
else
return species.safe_pressure + pressure_difference
return species_safe_pressure + pressure_difference
/mob/living/carbon/human/handle_disabilities()
..()
@@ -565,7 +566,7 @@
else
failed_last_breath = 0
adjustOxyLoss(-5)
if(!does_not_breathe && client) // If we breathe, and have an active client, check if we have synthetic lungs.
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
var/turf = get_turf(src)
@@ -588,7 +589,7 @@
to_chat(src, "<span class='danger'>You feel your face burning and a searing heat in your lungs!</span>")
if(breath.temperature >= species.heat_discomfort_level)
if(breath.temperature >= species.breath_heat_level_3)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Heat")
throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_MAX)
@@ -641,25 +642,25 @@
breath.update_values()
return 1
/mob/living/carbon/human/proc/play_inhale(var/mob/living/M, var/exhale)
var/suit_inhale_sound
if(species.suit_inhale_sound)
suit_inhale_sound = species.suit_inhale_sound
else // Failsafe
suit_inhale_sound = 'sound/effects/mob_effects/suit_breathe_in.ogg'
playsound_local(get_turf(src), suit_inhale_sound, 100, pressure_affected = FALSE, volume_channel = VOLUME_CHANNEL_AMBIENCE)
if(!exhale) // Did we fail exhale? If no, play it after inhale finishes.
addtimer(CALLBACK(src, .proc/play_exhale, M), 5 SECONDS)
/mob/living/carbon/human/proc/play_exhale(var/mob/living/M)
var/suit_exhale_sound
if(species.suit_exhale_sound)
suit_exhale_sound = species.suit_exhale_sound
else // Failsafe
suit_exhale_sound = 'sound/effects/mob_effects/suit_breathe_out.ogg'
playsound_local(get_turf(src), suit_exhale_sound, 100, pressure_affected = FALSE, volume_channel = VOLUME_CHANNEL_AMBIENCE)
/mob/living/carbon/human/proc/handle_allergens()
@@ -729,7 +730,7 @@
else
loc_temp = environment.temperature
if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1)
if(adjusted_pressure < species.get_warning_high_pressure(src) && adjusted_pressure > species.get_warning_low_pressure(src) && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1)
clear_alert("pressure")
return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp
@@ -798,15 +799,16 @@
if(status_flags & GODMODE)
return 1 //godmode
if(adjusted_pressure >= species.hazard_high_pressure)
var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
var/species_hazard_high_pressure = species.get_hazard_high_pressure(src)
if(adjusted_pressure >= species_hazard_high_pressure)
var/pressure_damage = min( ( (adjusted_pressure / species_hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure")
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
else if(adjusted_pressure >= species.warning_high_pressure)
else if(adjusted_pressure >= species.get_warning_high_pressure(src))
throw_alert("pressure", /obj/screen/alert/highpressure, 1)
else if(adjusted_pressure >= species.warning_low_pressure)
else if(adjusted_pressure >= species.get_warning_low_pressure(src))
clear_alert("pressure")
else if(adjusted_pressure >= species.hazard_low_pressure)
else if(adjusted_pressure >= species.get_hazard_low_pressure(src))
throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
else
if( !(COLD_RESISTANCE in mutations))
@@ -814,7 +816,7 @@
if(getOxyLoss() < 55) // 12 OxyLoss per 4 ticks when wearing internals; unconsciousness in 16 ticks, roughly half a minute
var/pressure_dam = 3 // 16 OxyLoss per 4 ticks when no internals present; unconsciousness in 13 ticks, roughly twenty seconds
// (Extra 1 oxyloss from failed breath)
// Being in higher pressure decreases the damage taken, down to a minimum of (species.hazard_low_pressure / ONE_ATMOSPHERE) at species.hazard_low_pressure
// Being in higher pressure decreases the damage taken, down to a minimum of (species.get_hazard_low_pressure(src) / ONE_ATMOSPHERE) at species.get_hazard_low_pressure(src)
pressure_dam *= (ONE_ATMOSPHERE - adjusted_pressure) / ONE_ATMOSPHERE
if(wear_suit && wear_suit.min_pressure_protection && head && head.min_pressure_protection)
@@ -14,6 +14,7 @@
/datum/unarmed_attack/claws/strong,
/datum/unarmed_attack/bite/strong
)
rarity_value = 5
blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \
scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \
@@ -40,9 +41,6 @@
male_sneeze_sound = 'sound/voice/shrieksneeze.ogg'
female_sneeze_sound = 'sound/voice/shrieksneeze.ogg'
warning_low_pressure = 50
hazard_low_pressure = 0
cold_level_1 = 210 //Default 260
cold_level_2 = 150 //Default 200
cold_level_3 = 90 //Default 120
@@ -98,6 +96,8 @@
default_emotes = list(
/decl/emote/audible/vox_shriek
)
inherent_verbs = list(/mob/living/carbon/human/proc/toggle_vox_pressure_seal)
var/list/current_pressure_toggle = list()
/datum/species/vox/get_random_name(var/gender)
var/datum/language/species_language = GLOB.all_languages[default_language]
@@ -106,3 +106,57 @@
/datum/species/vox/equip_survival_gear(var/mob/living/carbon/human/H, var/extendedtank = 0,var/comprehensive = 0)
. = ..()
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/vox(H), slot_wear_mask)
/datum/species/vox/get_slowdown(var/mob/living/carbon/human/H)
if(current_pressure_toggle["\ref[H]"])
return 1.5
return ..()
/datum/species/vox/get_warning_low_pressure(var/mob/living/carbon/human/H)
if(current_pressure_toggle["\ref[H]"])
return 50
return ..()
/datum/species/vox/get_hazard_low_pressure(var/mob/living/carbon/human/H)
if(current_pressure_toggle["\ref[H]"])
return 0
return ..()
/mob/living/carbon/human/proc/toggle_vox_pressure_seal()
set name = "Toggle Vox Pressure Seal"
set category = "Abilities"
set src = usr
if(!istype(species, /datum/species/vox))
verbs -= /mob/living/carbon/human/proc/toggle_vox_pressure_seal
return
if(incapacitated(INCAPACITATION_KNOCKOUT))
to_chat(src, SPAN_WARNING("You are in no state to do that."))
return
var/datum/gender/G = gender_datums[get_visible_gender()]
visible_message(SPAN_NOTICE("\The [src] begins flexing and realigning [G.his] scaling..."))
if(!do_after(src, 2 SECONDS, src, FALSE))
visible_message(
SPAN_NOTICE("\The [src] ceases adjusting [G.his] scaling."),
self_message = SPAN_WARNING("You must remain still to seal or unseal your scaling."))
return
if(incapacitated(INCAPACITATION_KNOCKOUT))
to_chat(src, SPAN_WARNING("You are in no state to do that."))
return
// TODO: maybe add cold and heat thresholds to this.
var/my_ref = "\ref[src]"
var/datum/species/vox/kikiki = species
if((kikiki.current_pressure_toggle[my_ref] = !kikiki.current_pressure_toggle[my_ref]))
visible_message(
SPAN_NOTICE("\The [src]'s scaling flattens and smooths out."),
self_message = SPAN_NOTICE("You flatten your scaling and inflate internal bladders, protecting yourself against low pressure at the cost of dexterity.")
)
else
visible_message(
SPAN_NOTICE("\The [src]'s scaling bristles roughly."),
self_message = SPAN_NOTICE("You bristle your scaling and deflate your internal bladders, restoring mobility but leaving yourself vulnerable to low pressure.")
)
@@ -113,3 +113,21 @@
/datum/species/proc/get_vision_flags(var/mob/living/carbon/human/H)
return vision_flags
/datum/species/proc/get_hazard_high_pressure(var/mob/living/carbon/human/H)
return hazard_high_pressure
/datum/species/proc/get_warning_high_pressure(var/mob/living/carbon/human/H)
return warning_high_pressure
/datum/species/proc/get_warning_low_pressure(var/mob/living/carbon/human/H)
return warning_low_pressure
/datum/species/proc/get_hazard_low_pressure(var/mob/living/carbon/human/H)
return hazard_low_pressure
/datum/species/proc/get_safe_pressure(var/mob/living/carbon/human/H)
return safe_pressure
/datum/species/proc/get_slowdown(var/mob/living/carbon/human/H)
return slowdown
@@ -225,7 +225,7 @@ var/global/datum/species/shapeshifter/promethean/prometheans
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment.return_pressure()
var/affecting_pressure = H.calculate_affecting_pressure(pressure)
if(affecting_pressure <= hazard_low_pressure) // Dangerous low pressure stops the regeneration of physical wounds. Body is focusing on keeping them intact rather than sealing.
if(affecting_pressure <= get_hazard_low_pressure(H)) // Dangerous low pressure stops the regeneration of physical wounds. Body is focusing on keeping them intact rather than sealing.
regen_brute = FALSE
regen_burn = FALSE
@@ -1721,22 +1721,49 @@ shaved
//Skrell 'hairstyles'
/datum/sprite_accessory/hair/skr
name = "Skrell Average Tentacles"
icon_state = "skrell_hair_average"
name = "Tentacles, Average"
icon_state = "skrell_short"
species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3)
/datum/sprite_accessory/hair/skr/tentacle_veryshort
name = "Skrell Short Tentacles"
icon_state = "skrell_hair_short"
gender = MALE
/datum/sprite_accessory/hair/skr/pullback
name = "Tentacles, Average, Pullback"
icon_state = "skrell_short_pullback"
/datum/sprite_accessory/hair/skr/tentacle_average
name = "Skrell Long Tentacles"
icon_state = "skrell_hair_long"
/datum/sprite_accessory/hair/skr/very_short
name = "Tentacles, Short"
icon_state = "skrell_very_short"
/datum/sprite_accessory/hair/skr/tentacle_verylong
name = "Skrell Very Long Tentacles"
icon_state = "skrell_hair_verylong"
/datum/sprite_accessory/hair/skr/long
name = "Tentacles, Long"
icon_state = "skrell_long"
/datum/sprite_accessory/hair/skr/long/pullback
name = "Tentacles, Long, Pullback"
icon_state = "skrell_long_pullback"
/datum/sprite_accessory/hair/skr/long/scarf
name = "Tentacles, Long, Scarf"
icon_state = "skrell_long_scarf"
/datum/sprite_accessory/hair/skr/long/wavy
name = "Tentacles, Long, Wavy"
icon_state = "skrell_long_wavy"
/datum/sprite_accessory/hair/skr/very_long
name = "Tentacles, Very Long"
icon_state = "skrell_very_long"
/datum/sprite_accessory/hair/skr/very_long/pullback
name = "Tentacles, Very Long, Pullback"
icon_state = "skrell_very_long_pullback"
/datum/sprite_accessory/hair/skr/very_long/scarf
name = "Tentacles, Very Long, Scarf"
icon_state = "skrell_very_long_scarf"
/datum/sprite_accessory/hair/skr/very_long/wavy
name = "Tentacles, Very Long, Wavy"
icon_state = "skrell_very_long_wavy"
//Tajaran hairstyles
/datum/sprite_accessory/hair/taj
@@ -91,27 +91,16 @@
return
/obj/item/reagent_containers/pill/attackby(obj/item/W as obj, mob/user as mob)
if(is_sharp(W))
var/obj/item/reagent_containers/powder/J = new /obj/item/reagent_containers/powder(src.loc)
user.visible_message("<span class='warning'>[user] gently cuts up [src] with [W]!</span>")
playsound(src.loc, 'sound/effects/chop.ogg', 50, 1)
if(reagents)
reagents.trans_to_obj(J, reagents.total_volume)
J.get_appearance()
/obj/item/reagent_containers/pill/attackby(obj/item/item, mob/living/user)
if (is_sharp(item) || istype(item, /obj/item/card))
user.visible_message(
SPAN_ITALIC("\The [user] cuts up \a [src] with \a [item]."),
SPAN_ITALIC("You cut up \the [src] with \the [item].")
)
playsound(loc, 'sound/effects/chop.ogg', 50, 1)
new /obj/item/reagent_containers/powder (loc, reagents)
qdel(src)
if(istype(W, /obj/item/card/id))
var/obj/item/reagent_containers/powder/J = new /obj/item/reagent_containers/powder(src.loc)
user.visible_message("<span class='warning'>[user] clumsily chops up [src] with [W]!</span>")
playsound(src.loc, 'sound/effects/chop.ogg', 50, 1)
if(reagents)
reagents.trans_to_obj(J, reagents.total_volume)
J.get_appearance()
qdel(src)
return TRUE
return ..()
////////////////////////////////////////////////////////////////////////////////