Merge branch 'master' into upstream-merge-26776
This commit is contained in:
@@ -218,6 +218,14 @@
|
||||
for(var/X in list(owner.glasses, owner.ears, owner.wear_mask, owner.head))
|
||||
var/obj/item/I = X
|
||||
owner.dropItemToGround(I, TRUE)
|
||||
|
||||
//Handle dental implants
|
||||
for(var/datum/action/item_action/hands_free/activate_pill/AP in owner.actions)
|
||||
AP.Remove(owner)
|
||||
var/obj/pill = AP.target
|
||||
if(pill)
|
||||
pill.forceMove(src)
|
||||
|
||||
name = "[owner.real_name]'s head"
|
||||
..()
|
||||
|
||||
@@ -254,6 +262,8 @@
|
||||
if(held_index > C.hand_bodyparts.len)
|
||||
C.hand_bodyparts.len = held_index
|
||||
C.hand_bodyparts[held_index] = src
|
||||
if(C.dna.species.mutanthands && !is_pseudopart)
|
||||
C.put_in_hand(new C.dna.species.mutanthands(), held_index)
|
||||
if(C.hud_used)
|
||||
var/obj/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"]
|
||||
if(hand)
|
||||
@@ -269,6 +279,9 @@
|
||||
qdel(S)
|
||||
break
|
||||
|
||||
for(var/obj/item/organ/O in contents)
|
||||
O.Insert(C)
|
||||
|
||||
update_bodypart_damage_state()
|
||||
|
||||
C.updatehealth()
|
||||
@@ -300,6 +313,14 @@
|
||||
C.real_name = real_name
|
||||
real_name = ""
|
||||
name = initial(name)
|
||||
|
||||
//Handle dental implants
|
||||
for(var/obj/item/weapon/reagent_containers/pill/P in src)
|
||||
for(var/datum/action/item_action/hands_free/activate_pill/AP in P.actions)
|
||||
P.forceMove(C)
|
||||
AP.Grant(C)
|
||||
break
|
||||
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -48,7 +48,10 @@
|
||||
brain = null
|
||||
update_icon_dropped()
|
||||
else
|
||||
I.loc = T
|
||||
if(istype(I, /obj/item/weapon/reagent_containers/pill))
|
||||
for(var/datum/action/item_action/hands_free/activate_pill/AP in I.actions)
|
||||
qdel(AP)
|
||||
I.forceMove(T)
|
||||
|
||||
/obj/item/bodypart/head/update_limb(dropping_limb, mob/living/carbon/source)
|
||||
var/mob/living/carbon/C
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
user.drop_item()
|
||||
tool.loc = target
|
||||
|
||||
var/datum/action/item_action/hands_free/activate_pill/P = new
|
||||
var/datum/action/item_action/hands_free/activate_pill/P = new(tool)
|
||||
P.button.name = "Activate [tool.name]"
|
||||
P.target = tool
|
||||
P.Grant(target)
|
||||
P.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it
|
||||
|
||||
user.visible_message("[user] wedges \the [tool] into [target]'s [parse_zone(target_zone)]!", "<span class='notice'>You wedge [tool] into [target]'s [parse_zone(target_zone)].</span>")
|
||||
return 1
|
||||
@@ -37,6 +37,5 @@
|
||||
if(target.reagents.total_volume)
|
||||
target.reagents.reaction(owner, INGEST)
|
||||
target.reagents.trans_to(owner, target.reagents.total_volume)
|
||||
Remove(owner)
|
||||
qdel(target)
|
||||
return 1
|
||||
@@ -106,7 +106,7 @@
|
||||
"<span class='notice'>You begin to mend the incision in [target]'s [parse_zone(target_zone)]...</span>")
|
||||
|
||||
else if(istype(tool, /obj/item/weapon/reagent_containers/food/snacks/organ))
|
||||
to_chat(user, "<span class='warning'>[tool] was biten by someone! It's too damaged to use!</span>")
|
||||
to_chat(user, "<span class='warning'>[tool] was bitten by someone! It's too damaged to use!</span>")
|
||||
return -1
|
||||
|
||||
/datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible."
|
||||
zone = "head"
|
||||
slot = "ears"
|
||||
gender = PLURAL
|
||||
|
||||
// `deaf` measures "ticks" of deafness. While > 0, the person is unable
|
||||
// to hear anything.
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
desc = "I see you!"
|
||||
zone = "eyes"
|
||||
slot = "eye_sight"
|
||||
gender = PLURAL
|
||||
|
||||
var/sight_flags = 0
|
||||
var/see_in_dark = 2
|
||||
@@ -63,6 +64,9 @@
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
sight_flags = SEE_MOBS
|
||||
|
||||
/obj/item/organ/eyes/night_vision/zombie
|
||||
name = "undead eyes"
|
||||
desc = "Somewhat counterintuitively, these half rotten eyes actually have superior vision to those of a living human."
|
||||
|
||||
///Robotic
|
||||
|
||||
|
||||
@@ -125,16 +125,13 @@
|
||||
if(!getorganslot("tongue"))
|
||||
var/obj/item/organ/tongue/T
|
||||
|
||||
if(dna && dna.species)
|
||||
for(var/tongue_type in dna.species.mutant_organs)
|
||||
if(ispath(tongue_type, /obj/item/organ/tongue))
|
||||
T = new tongue_type()
|
||||
T.Insert(src)
|
||||
if(dna && dna.species && dna.species.mutanttongue)
|
||||
T = new dna.species.mutanttongue()
|
||||
else
|
||||
T = new()
|
||||
|
||||
// if they have no mutant tongues, give them a regular one
|
||||
if(!T)
|
||||
T = new()
|
||||
T.Insert(src)
|
||||
T.Insert(src)
|
||||
|
||||
if(!getorganslot("eye_sight"))
|
||||
var/obj/item/organ/eyes/E
|
||||
|
||||
@@ -10,9 +10,10 @@
|
||||
var/taste_sensitivity = 15 // lower is more sensitive.
|
||||
|
||||
/obj/item/organ/tongue/Initialize(mapload)
|
||||
..()
|
||||
. = ..()
|
||||
languages_possible = typecacheof(list(
|
||||
/datum/language/common,
|
||||
/datum/language/draconic,
|
||||
/datum/language/monkey,
|
||||
/datum/language/ratvar
|
||||
))
|
||||
@@ -123,10 +124,11 @@
|
||||
taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED
|
||||
|
||||
/obj/item/organ/tongue/alien/Initialize(mapload)
|
||||
..()
|
||||
. = ..()
|
||||
languages_possible = typecacheof(list(
|
||||
/datum/language/xenocommon,
|
||||
/datum/language/common,
|
||||
/datum/language/draconic,
|
||||
/datum/language/ratvar,
|
||||
/datum/language/monkey))
|
||||
|
||||
@@ -175,7 +177,7 @@
|
||||
|
||||
/obj/item/organ/tongue/bone/plasmaman/get_spans()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/organ/tongue/robot
|
||||
name = "robotic voicebox"
|
||||
desc = "A voice synthesizer that can interface with organic lifeforms."
|
||||
@@ -185,16 +187,8 @@
|
||||
attack_verb = list("beeped", "booped")
|
||||
taste_sensitivity = 25 // not as good as an organic tongue
|
||||
|
||||
/obj/item/organ/tongue/robot/Initialize(mapload)
|
||||
..()
|
||||
languages_possible = typecacheof(list(
|
||||
/datum/language/xenocommon,
|
||||
/datum/language/common,
|
||||
/datum/language/ratvar,
|
||||
/datum/language/monkey,
|
||||
/datum/language/drone,
|
||||
/datum/language/machine,
|
||||
/datum/language/swarmer))
|
||||
/obj/item/organ/tongue/robot/can_speak_in_language(datum/language/dt)
|
||||
. = TRUE // THE MAGIC OF ELECTRONICS
|
||||
|
||||
/obj/item/organ/tongue/robot/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
icon_state = "appendix"
|
||||
zone = "mouth"
|
||||
slot = "vocal_cords"
|
||||
gender = PLURAL
|
||||
var/list/spans = null
|
||||
|
||||
/obj/item/organ/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords
|
||||
@@ -19,6 +20,40 @@
|
||||
/obj/item/organ/vocal_cords/proc/handle_speech(message) //actually say the message
|
||||
owner.say(message, spans = spans, sanitize = FALSE)
|
||||
|
||||
/obj/item/organ/adamantine_resonator
|
||||
name = "adamantine resonator"
|
||||
desc = "Fragments of adamantine exists in all golems, stemming from their origins as purely magical constructs. These are used to \"hear\" messages from their leaders."
|
||||
zone = "head"
|
||||
slot = "adamantine_resonator"
|
||||
icon_state = "adamantine_resonator"
|
||||
|
||||
/obj/item/organ/vocal_cords/adamantine
|
||||
name = "adamantine vocal cords"
|
||||
desc = "When adamantine resonates, it causes all nearby pieces of adamantine to resonate as well. Adamantine golems use this to broadcast messages to nearby golems."
|
||||
actions_types = list(/datum/action/item_action/organ_action/use/adamantine_vocal_cords)
|
||||
zone = "mouth"
|
||||
slot = "vocal_cords"
|
||||
icon_state = "adamantine_cords"
|
||||
|
||||
/datum/action/item_action/organ_action/use/adamantine_vocal_cords/Trigger()
|
||||
if(!IsAvailable())
|
||||
return
|
||||
var/message = input(owner, "Resonate a message to all nearby golems.", "Resonate")
|
||||
if(QDELETED(src) || QDELETED(owner) || !message)
|
||||
return
|
||||
owner.say(".x[message]")
|
||||
|
||||
/obj/item/organ/vocal_cords/adamantine/handle_speech(message)
|
||||
var/msg = "<span class='resonate'><span class='name'>[owner.real_name]</span> <span class='message'>resonates, \"[message]\"</span></span>"
|
||||
for(var/m in GLOB.player_list)
|
||||
if(iscarbon(m))
|
||||
var/mob/living/carbon/C = m
|
||||
if(C.getorganslot("adamantine_resonator"))
|
||||
to_chat(C, msg)
|
||||
if(isobserver(m))
|
||||
var/link = FOLLOW_LINK(m, src)
|
||||
to_chat(m, "[link] [msg]")
|
||||
|
||||
//Colossus drop, forces the listeners to obey certain commands
|
||||
/obj/item/organ/vocal_cords/colossus
|
||||
name = "divine vocal cords"
|
||||
@@ -247,7 +282,7 @@
|
||||
else if((findtext(message, silence_words)))
|
||||
cooldown = COOLDOWN_STUN
|
||||
for(var/mob/living/carbon/C in listeners)
|
||||
if(user.mind && (user.mind.assigned_role == "Librarian" || user.mind.assigned_role == "Mime"))
|
||||
if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime"))
|
||||
power_multiplier *= 3
|
||||
C.silent += (10 * power_multiplier)
|
||||
|
||||
|
||||
@@ -72,9 +72,9 @@
|
||||
user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "<span class='notice'>You succeed in replacing [target]'s [parse_zone(target_zone)].</span>")
|
||||
return 1
|
||||
else
|
||||
target.regenerate_limb(target_zone)
|
||||
var/obj/item/bodypart/L = target.get_bodypart(target_zone)
|
||||
var/obj/item/bodypart/L = target.newBodyPart(target_zone, FALSE, FALSE)
|
||||
L.is_pseudopart = TRUE
|
||||
L.attach_limb(target)
|
||||
user.visible_message("[user] finishes attaching [tool]!", "<span class='notice'>You attach [tool].</span>")
|
||||
qdel(tool)
|
||||
if(istype(tool, /obj/item/weapon/twohanded/required/chainsaw))
|
||||
|
||||
@@ -111,17 +111,8 @@
|
||||
if(contents.len)
|
||||
to_chat(user, "<span class='notice'>[src] already has something inside it.</span>")
|
||||
return
|
||||
if(isorgan(I))
|
||||
var/obj/item/organ/O = I
|
||||
if(O.status != ORGAN_ORGANIC)
|
||||
to_chat(user, "<span class='notice'>[src] can only hold organic body parts!</span>")
|
||||
return
|
||||
else if(isbodypart(I))
|
||||
var/obj/item/bodypart/BP = I
|
||||
if(BP.status != BODYPART_ORGANIC)
|
||||
to_chat(user, "<span class='notice'>[src] can only hold organic body parts!</span>")
|
||||
return
|
||||
else
|
||||
if(!isorgan(I) && !isbodypart(I))
|
||||
to_chat(user, "<span class='notice'>[src] can only hold body parts!</span>")
|
||||
return
|
||||
|
||||
user.visible_message("[user] puts [I] into [src].", "<span class='notice'>You put [I] inside [src].</span>")
|
||||
@@ -150,4 +141,4 @@
|
||||
desc = "A container for holding body parts."
|
||||
else
|
||||
to_chat(user, "[src] is empty.")
|
||||
return
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user