Merge branch 'master' into final_shuttle_touches_and_stuff

# Conflicts:
#	code/game/objects/structures/window.dm
#	code/modules/client/preference_setup/loadout/loadout_uniform.dm
This commit is contained in:
alberyk
2021-12-21 16:51:40 -03:00
375 changed files with 118163 additions and 3628 deletions
@@ -274,7 +274,7 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player)
character.lastarea = get_area(loc)
// Moving wheelchair if they have one
if(character.buckled_to && istype(character.buckled_to, /obj/structure/bed/chair/wheelchair))
if(character.buckled_to && istype(character.buckled_to, /obj/structure/bed/stool/chair/office/wheelchair))
character.buckled_to.forceMove(character.loc)
character.buckled_to.set_dir(character.dir)
@@ -68,7 +68,7 @@ Follow by example and make good judgement based on length which list to include
bald
name = "Bald" // try to capitalize the names please~
icon_state = "bald" // you do not need to define _s or _l sub-states, game automatically does this for you
species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi,/datum/species/diona)
species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi,/datum/species/diona, /datum/species/diona/coeu)
length = 0
chatname = "bald head" //aim to keep these lowercase so they fit into the hair tugging message
@@ -1740,7 +1740,8 @@ Follow by example and make good judgement based on length which list to include
name = "None"
icon_state = "none"
species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi,
/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell, /datum/species/bug,
/datum/species/bug/type_b)
fade_up
name = "Fade (Up)"
@@ -1785,6 +1786,12 @@ Follow by example and make good judgement based on length which list to include
icon_state = "skrell_gradient_spots"
species_allowed = list(/datum/species/skrell, /datum/species/skrell/axiori)
bulwark_default
name = "Bulwark Horn"
icon = "icons/mob/base_48.dmi"
icon_state = "blank"
species_allowed = list(/datum/species/bug/type_e)
/*
///////////////////////////////////
/ =---------------------------= /
@@ -1802,7 +1809,8 @@ Follow by example and make good judgement based on length which list to include
icon_state = "bald"
gender = NEUTER
species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi,
/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell,/datum/species/diona, /datum/species/diona/coeu)
/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell,/datum/species/diona,
/datum/species/diona/coeu, /datum/species/bug/type_b)
threeOclock
name = "3 O'clock Shadow"
@@ -2314,6 +2322,13 @@ Follow by example and make good judgement based on length which list to include
length = 6
chatname = "Long Both Behind"
skr_tentacle_reef
name = "Skrell Reef Ponytail, short"
icon_state = "skrell_reef_short"
length = 4
chatname = "Ponytail, Reef"
scrunchy_style = "reef"
//tajaran hair
taj_ears
@@ -2563,6 +2578,18 @@ Follow by example and make good judgement based on length which list to include
icon_state = "hair_swoop"
length = 2
chatname = "styled mane"
taj_ears_swoop_alt
name = "Tajara Swoop Alt"
icon_state = "hair_swoop_alt"
length = 2
chatname = "styled mane"
taj_ears_swoop_bangs
name = "Tajara Swoop Bangs"
icon_state = "hair_swoop_bangs"
length = 2
chatname = "styled mane"
taj_ears_swoop_long
name = "Tajara Swoop Long"
@@ -2825,6 +2852,18 @@ Follow by example and make good judgement based on length which list to include
length = 2
chatname = "styled mane"
msai_ears_swoop_alt
name = "M'sai Swoop Alt"
icon_state = "msai_swoop_alt"
length = 2
chatname = "styled mane"
msai_ears_swoop_bangs
name = "M'sai Swoop Bangs"
icon_state = "msai_swoop_bangs"
length = 2
chatname = "styled mane"
msai_ears_swoop_long
name = "M'sai Swoop Long"
icon_state = "msai_longswoop"
@@ -2918,6 +2957,75 @@ Follow by example and make good judgement based on length which list to include
chatname = "antennae"
length = 2
//Bulwark antennae
bulwark_classic
icon = 'icons/mob/human_face/bulwark_hair.dmi'
name = "Bulwark Classic Antennae"
icon_state = "bully_classic"
species_allowed = list(/datum/species/bug/type_e)
gender = NEUTER
chatname = "antennae"
bulwark_damaged_left
name = "Bulwark Injured Antenna, Left"
icon_state = "bully_inj_left"
chatname = "antenna"
length = 1
bulwark_damaged_right
name = "Bulwark Injured Antenna, Right"
icon_state = "bully_inj_right"
chatname = "antenna"
length = 1
bulwark_knight
name = "Bulwark Knight Antennae"
icon_state = "bully_knight"
chatname = "antennae"
length = 2
bulwark_pointy
name = "Pointy Antennae"
icon_state = "bully_pointy"
chatname = "antennae"
length = 2
bulwark_original
name = "Original Antennae"
icon_state = "bully_original"
chatname = "antennae"
length = 2
bulwark_islero
name = "Islero Antennae"
icon_state = "bully_islero"
chatname = "antennae"
length = 3
bulwark_tall
name = "Tall Antennae"
icon_state = "bully_tall"
chatname = "antennae"
length = 4
bulwark_stag
name = "Stag Antennae"
icon_state = "bully_stag"
chatname = "antennae"
length = 5
bulwark_rhino
name = "Rhinoceros Antenna"
icon_state = "bully_rhino"
chatname = "antenna"
length = 5
bulwark_ladybug
name = "Ladybug Antennae"
icon_state = "bully_ladybug"
chatname = "antennae"
length = 6
/datum/sprite_accessory/facial_hair
taj_goatee
icon = 'icons/mob/human_face/tajara_facial_hair.dmi'
@@ -3418,6 +3526,50 @@ Follow by example and make good judgement based on length which list to include
name = "Pilot"
icon_state = "Pilot"
//Vaurca mandibles
clicky
icon = 'icons/mob/human_face/vaurca_facial_hair.dmi'
name = "Clicky Mandibles"
icon_state = "vaurca_clicky"
species_allowed = list(/datum/species/bug/type_b)
gender = NEUTER
clacky
name = "Clacky Mandibles"
icon_state = "vaurca_clacky"
bulldog
name = "Bulldog Mandibles"
icon_state = "vaurca_bulldog"
mantis
name = "Mantis Mandibles"
icon_state = "vaurca_mantis"
stag
name = "Stag Mandibles"
icon_state = "vaurca_stag"
ectatomma
name = "Ectatomma Mandibles"
icon_state = "vaurca_ectatomma"
horridus
name = "Horridus Mandibles"
icon_state = "vaurca_horridus"
tusks
name = "Tusk Mandibles"
icon_state = "vaurca_tusks"
acanthognathus
name = "Acanthognathus Mandibles"
icon_state = "vaurca_acanthognathus"
myrmoteras
name = "Myrmoteras Mandibles"
icon_state = "vaurca_myrmoteras"
/*
////////////////////////////
/ =--------------------= /
@@ -3435,6 +3587,177 @@ Follow by example and make good judgement based on length which list to include
var/is_genetic = TRUE // If TRUE, the marking is considered genetic and is embedded into DNA.
var/is_painted = FALSE // If TRUE, the marking can be put on prosthetics/robolimbs.
bandage_head
name = "Bandage, head 1"
icon_state = "bandage1"
body_parts = list(BP_HEAD)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
head_2
name = "Bandage, head 2"
icon_state= "bandage2"
head_3
name = "Bandage, head 3"
icon_state= "bandage3"
bandage_chest
name = "Bandage, chest 1"
icon_state = "bandage1"
body_parts = list(BP_CHEST)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
chest_2
name= "Bandage, chest 2"
icon_state = "bandage2"
chest_3
name= "Bandage, chest 3"
icon_state = "bandage3"
bandage_groin
name = "Bandage, groin 1"
icon_state = "bandage1"
body_parts = list(BP_GROIN)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
groin_2
name= "Bandage, groin 2"
icon_state = "bandage2"
groin_3
name= "Bandage, groin 3"
icon_state = "bandage3"
bandage_l_arm
name = "Bandage, left arm 1"
icon_state = "bandage1"
body_parts = list(BP_L_ARM)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
l_arm_2
name= "Bandage, left arm 2"
icon_state = "bandage2"
l_arm_3
name= "Bandage, left arm 3"
icon_state = "bandage3"
bandage_l_hand
name = "Bandage, left hand 1"
icon_state = "bandage1"
body_parts = list(BP_L_HAND)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
l_hand_2
name= "Bandage, left hand 2"
icon_state = "bandage2"
l_hand_3
name= "Bandage, left hand 3"
icon_state = "bandage3"
bandage_r_arm
name = "Bandage, right arm 1"
icon_state = "bandage1"
body_parts = list(BP_R_ARM)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
r_arm_2
name= "Bandage, right arm 2"
icon_state = "bandage2"
r_arm_3
name= "Bandage, right arm 3"
icon_state = "bandage3"
bandage_r_hand
name = "Bandage, right hand 1"
icon_state = "bandage1"
body_parts = list(BP_R_HAND)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
r_hand_2
name= "Bandage, right hand 2"
icon_state = "bandage2"
r_hand_3
name= "Bandage, right hand 3"
icon_state = "bandage3"
bandage_l_leg
name = "Bandage, left leg 1"
icon_state = "bandage1"
body_parts = list(BP_L_LEG)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
l_leg_2
name= "Bandage, left leg 2"
icon_state = "bandage2"
l_leg_3
name= "Bandage, left leg 3"
icon_state = "bandage3"
bandage_l_foot
name = "Bandage, left foot 1"
icon_state = "bandage1"
body_parts = list(BP_L_FOOT)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
l_foot_2
name= "Bandage, left foot 2"
icon_state = "bandage2"
l_foot_3
name= "Bandage, left foot 3"
icon_state = "bandage3"
bandage_r_leg
name = "Bandage, right leg 1"
icon_state = "bandage1"
body_parts = list(BP_R_LEG)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
r_leg_2
name= "Bandage, right leg 2"
icon_state = "bandage2"
r_leg_3
name= "Bandage, right leg 3"
icon_state = "bandage3"
bandage_r_foot
name = "Bandage, right foot 1"
icon_state = "bandage1"
body_parts = list(BP_R_FOOT)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/skrell, /datum/species/skrell/axiori)
is_genetic = FALSE
r_foot_2
name= "Bandage, right foot 2"
icon_state = "bandage2"
r_foot_3
name= "Bandage, right foot 3"
icon_state = "bandage3"
heterochromia
name = "Heterochromia (Right eye)"
icon_state = "heterochromia"
body_parts = list(BP_HEAD)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/machine/shell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi)
aug_scalpports
name = "Augment (Scalp Ports)"
icon_state = "aug_scalpports"
@@ -3859,21 +4182,21 @@ Follow by example and make good judgement based on length which list to include
scar_chest
name = "Scar, Chest"
icon_state = "surgicalscar_chest"
icon_state = "surgicalscar"
body_parts = list(BP_CHEST)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/machine/shell, /datum/species/skrell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/bug, /datum/species/bug/type_b)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/machine/shell, /datum/species/skrell, /datum/species/skrell/axiori, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/bug, /datum/species/bug/type_b)
scar_chest_left
name = "Scar, Chest Left"
icon_state = "chestscar_l_chest"
icon_state = "chestscar1"
body_parts = list(BP_CHEST)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/machine/shell, /datum/species/skrell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/bug, /datum/species/bug/type_b)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/machine/shell, /datum/species/skrell, /datum/species/skrell/axiori, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/bug, /datum/species/bug/type_b)
scar_chest_right
name = "Scar, Chest Right"
icon_state = "chestscar_r_chest"
icon_state = "chestscar2"
body_parts = list(BP_CHEST)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/machine/shell, /datum/species/skrell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/bug, /datum/species/bug/type_b)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/machine/shell, /datum/species/skrell, /datum/species/skrell/axiori, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi, /datum/species/bug, /datum/species/bug/type_b)
scratch_abdomen_left
name = "Scratch, Abdomen Left"
@@ -3949,13 +4272,13 @@ Follow by example and make good judgement based on length which list to include
tat_circle_back
name = "Tattoo (Circle, Back)"
icon_state = "tat_circle_back"
icon_state = "tat_circle"
body_parts = list(BP_CHEST)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/diona, /datum/species/diona/coeu, /datum/species/machine/shell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi)
tat_circle_big_back
name = "Tattoo (Big Circle, Back)"
icon_state = "tat_bigcircle_back"
icon_state = "tat_bigcircle"
body_parts = list(BP_CHEST)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/diona, /datum/species/diona/coeu, /datum/species/machine/shell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi)
@@ -3973,7 +4296,7 @@ Follow by example and make good judgement based on length which list to include
tat_harness
name = "Tattoo (Harness, Chest)"
icon_state = "tat_harness_body"
icon_state = "tat_harness"
body_parts = list(BP_CHEST)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/diona, /datum/species/diona/coeu, /datum/species/machine/shell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi)
@@ -4075,7 +4398,7 @@ Follow by example and make good judgement based on length which list to include
tat_spine_back
name = "Tattoo (Spine, Back)"
icon_state = "tat_spine_back"
icon_state = "tat_spine"
body_parts = list(BP_CHEST)
species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/diona, /datum/species/diona/coeu, /datum/species/machine/shell, /datum/species/skrell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi)
+17 -10
View File
@@ -189,18 +189,25 @@ Works together with spawning an observer, noted above.
//Teleports the observer away from z-levels they shouldnt be on, if needed.
/mob/abstract/observer/proc/teleport_if_needed()
//If we dont have a observe restriction we dont need to teleport
if(!config.observe_restriction)
return
//If we are not on a restricted level we dont need to get rid of them
if(!on_restricted_level())
return
//If we have observe restriction 1 and they are following a living non-animal mob we dont need to do anything.
if(config.observe_restriction == 1 && following && isliving(following) && !isliving(following))
return
//In case we have observe restriction 2 (or 1 and they are following something, then teleport them back.)
if(following)
if(!isliving(following) || isanimal(following)) //If they are following something other than a living non-animal mob, teleport them
var/message = "You can not follow \the [following] on this level."
stop_following()
teleport_to_spawn(message)
else
return
//If they are moving around freely, teleport them
teleport_to_spawn()
stop_following()
teleport_to_spawn("You can not follow \the [following] on this level.")
else
teleport_to_spawn()
//And update their sight settings
updateghostsight()
@@ -328,7 +335,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(ishuman(following))
health_scan_mob(following, usr, TRUE, TRUE)
else
else
to_chat(src, SPAN_WARNING("This isn't a scannable target."))
/mob/abstract/observer/verb/toggle_antagHUD()
@@ -976,4 +983,4 @@ mob/abstract/observer/MayRespawn(var/feedback = 0, var/respawn_type = null)
/mob/abstract/observer/can_hear_radio(speaker_coverage = list())
if(client && (client.prefs.toggles & CHAT_GHOSTRADIO))
return TRUE
return ..()
return ..()
+25 -18
View File
@@ -9,6 +9,12 @@
flags = RESTRICTED | HIVEMIND
var/drone_only
/datum/language/binary/proc/can_hear(var/mob/speaker, var/mob/hearer)
return TRUE
/datum/language/binary/proc/get_speaker_name(var/mob/speaker)
return speaker.real_name
/datum/language/binary/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
if(!speaker.binarycheck())
@@ -21,32 +27,23 @@
log_say("[key_name(speaker)] : ([name]) [message]",ckey=key_name(speaker))
var/message_start = "<span style='font-size: [speaker.get_binary_font_size()];'><i><span class='game say'>[name], <span class='name'>[speaker.real_name]</span>"
var/message_start = "<span style='font-size: [speaker.get_binary_font_size()];'><i><span class='game say'>[name], <span class='name'>[get_speaker_name(speaker)]</span>"
var/message_body = "<span class='message'>[speaker.say_quote(message)], \"[message]\"</span></span></i></span>"
for (var/mob/M in dead_mob_list)
for (var/mob/M as anything in dead_mob_list)
if(!istype(M,/mob/abstract/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
M.show_message("[ghost_follow_link(speaker, M)] [message_start] [message_body]", 2)
for (var/mob/living/S in living_mob_list)
if(drone_only && !istype(S,/mob/living/silicon/robot/drone))
for(var/mob/living/S in living_mob_list)
if(drone_only && !isDrone(S))
continue
else if(istype(S , /mob/living/silicon/ai))
message_start = "<i><span class='game say'>[name], <a href='byond://?src=\ref[S];track2=\ref[S];track=\ref[speaker];trackname=[html_encode(speaker.name)]'><span class='name'>[speaker.real_name]</span></a></span></i>"
else if (!S.binarycheck())
else if(isAI(S))
message_start = "<i><span class='game say'>[name], <a href='byond://?src=\ref[S];track2=\ref[S];track=\ref[speaker];trackname=[html_encode(speaker.name)]'><span class='name'>[get_speaker_name(speaker)]</span></a></span></i>"
else if (!S.binarycheck() || !can_hear(speaker, S))
continue
S.show_message("[message_start] [message_body]", 2)
var/list/listening = hearers(1, src)
listening -= src
for (var/mob/living/M in listening)
if(istype(M, /mob/living/silicon) || M.binarycheck())
continue
M.show_message("<i><span class='game say'><span class='name'>synthesised voice</span> <span class='message'>beeps, \"beep beep beep\"</span></span></i>",2)
//robot binary xmitter component power usage
if (isrobot(speaker))
var/mob/living/silicon/robot/R = speaker
@@ -62,7 +59,17 @@
colour = "say_quote"
key = "d"
flags = RESTRICTED | HIVEMIND
drone_only = 1
drone_only = TRUE
/datum/language/binary/drone/get_speaker_name(mob/living/silicon/robot/drone/speaker)
if(isMatriarchDrone(speaker))
return "Matriarch [speaker.designation]"
return ..()
/datum/language/binary/drone/can_hear(mob/living/silicon/robot/drone/speaker, mob/living/silicon/robot/drone/hearer)
if(speaker.master_matrix != hearer.master_matrix)
return FALSE
return TRUE
/mob/living/proc/get_binary_font_size()
return "1em"
@@ -82,4 +89,4 @@
/datum/language/local_drone/handle_message_mode(var/message_mode)
if(message_mode == "headset")
return list(all_languages[LANGUAGE_DRONE], null)
return list(src, null)
return list(src, null)
+12 -6
View File
@@ -62,21 +62,27 @@
/datum/species/bug
autohiss_basic_map = list(
"s" = list("z","zz")
"f" = list("v","vh"),
"ph" = list("v", "vh")
)
autohiss_extra_map = list(
"f" = list("v", "vh"),
"ph" = list("v", "vh")
"s" = list("z", "zz", "zzz"),
"ce" = list("z", "zz"),
"ci" = list("z", "zz"),
"v" = list("vv", "vvv")
)
autohiss_exempt = list(LANGUAGE_VAURCA)
/datum/species/bug/type_b
autohiss_basic_map = list(
"s" = list("z","zz", "zzz")
"f" = list("v","vh"),
"ph" = list("v", "vh")
)
autohiss_extra_map = list(
"f" = list("v", "vh"),
"ph" = list("v", "vh")
"s" = list("z", "zz", "zzz"),
"ce" = list("z", "zz"),
"ci" = list("z", "zz"),
"v" = list("vv", "vvv")
)
autohiss_exempt = list(LANGUAGE_VAURCA)
@@ -47,6 +47,8 @@
var/datum/reagents/metabolism/ingested
var/can_attach = TRUE // Whether they can attach to a host
/mob/living/carbon/alien/diona/get_ingested_reagents()
return ingested
@@ -229,6 +231,7 @@
//This function makes sure the nymph has the correct split/merge verbs, depending on whether or not its part of a gestalt
/mob/living/carbon/alien/diona/proc/update_verbs()
if(gestalt && !detached)
verbs |= /mob/living/carbon/alien/diona/proc/split
verbs -= /mob/living/proc/ventcrawl
verbs -= /mob/living/proc/hide
verbs -= /mob/living/carbon/alien/diona/proc/grow
@@ -236,7 +239,8 @@
verbs -= /mob/living/carbon/proc/absorb_nymph
verbs -= /mob/living/carbon/proc/sample
verbs -= /mob/living/carbon/alien/diona/proc/remove_hat
verbs |= /mob/living/carbon/alien/diona/proc/split
verbs -= /mob/living/carbon/alien/diona/proc/attach_nymph_limb
verbs -= /mob/living/carbon/alien/diona/proc/detach_nymph_limb
else
verbs |= /mob/living/carbon/alien/diona/proc/merge
verbs |= /mob/living/carbon/proc/absorb_nymph
@@ -245,6 +249,8 @@
verbs |= /mob/living/proc/hide
verbs |= /mob/living/carbon/proc/sample
verbs |= /mob/living/carbon/alien/diona/proc/remove_hat
verbs |= /mob/living/carbon/alien/diona/proc/attach_nymph_limb
verbs |= /mob/living/carbon/alien/diona/proc/detach_nymph_limb
verbs -= /mob/living/carbon/alien/diona/proc/split // we want to remove this one
verbs -= /mob/living/carbon/alien/verb/evolve //We don't want the old alien evolve verb
+8 -12
View File
@@ -166,11 +166,9 @@
/mob/living/carbon/swap_hand()
var/obj/item/item_in_hand = src.get_active_hand()
if(item_in_hand) //this segment checks if the item in your hand is twohanded.
if(istype(item_in_hand,/obj/item/material/twohanded) || istype(item_in_hand,/obj/item/gun) || istype(item_in_hand,/obj/item/pickaxe) || istype(item_in_hand, /obj/item/grab))
if(item_in_hand:wielded == 1)
to_chat(usr, SPAN_WARNING("Your other hand is too busy holding the [item_in_hand.name]"))
return
if(item_in_hand && !item_in_hand.can_swap_hands(src)) //this segment checks if the item in your hand is twohanded.
to_chat(src, SPAN_WARNING("Your other hand is too busy holding \the [item_in_hand]!"))
return
src.hand = !src.hand
if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
if(hand) //This being 1 means the left hand is in use
@@ -179,11 +177,6 @@
else
hud_used.l_hand_hud_object.icon_state = "l_hand_inactive"
hud_used.r_hand_hud_object.icon_state = "r_hand_active"
/*if (!( src.hand ))
src.hands.set_dir(NORTH)
else
src.hands.set_dir(SOUTH)*/
return
/mob/living/carbon/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand.
if(istext(selhand))
@@ -355,7 +348,7 @@
/mob/living/carbon/can_use_hands()
if(handcuffed)
return 0
if(buckled_to && ! istype(buckled_to, /obj/structure/bed/chair)) // buckling does not restrict hands
if(buckled_to && ! istype(buckled_to, /obj/structure/bed/stool/chair)) // buckling does not restrict hands
return 0
return 1
@@ -498,4 +491,7 @@
. = contents - internal_organs
/mob/living/carbon/proc/is_drowsy()
return (drowsiness >= 5)
return (drowsiness >= 5)
/mob/living/carbon/proc/should_have_limb(var/organ_check)
return FALSE
@@ -72,9 +72,9 @@
//head
if(head)
if(head.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(head, user)] [head.gender==PLURAL?"some":"a"] [fluid_color_type_map(head.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[head]'>[head.name]</a> on [get_pronoun("his")] head!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(head, user)] [head.gender==PLURAL?"some":"a"] [fluid_color_type_map(head.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[head]'>[head.name]</a> [head.get_head_examine_text(src)]!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(head, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[head]'>\a [head]</a> on [get_pronoun("his")] head.\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(head, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[head]'>\a [head]</a> [head.get_head_examine_text(src)].\n"
//suit/armor
if(wear_suit)
+16 -7
View File
@@ -613,7 +613,8 @@
var/datum/record/general/R = SSrecords.find_record("name", perpname)
if(istype(R) && istype(R.security))
if(hasHUD(usr,"security"))
to_chat(usr, "<b>Name:</b> [R.name]] <b>Criminal Status:</b> [R.security.criminal]")
to_chat(usr, "<b>Name:</b> [R.name]")
to_chat(usr, "<b>Criminal Status:</b> [R.security.criminal]")
to_chat(usr, "<b>Crimes:</b> [R.security.crimes]")
to_chat(usr, "<b>Notes:</b> [R.security.notes]")
to_chat(usr, "<a href='?src=\ref[src];secrecordComment=`'>\[View Comment Log\]</a>")
@@ -911,7 +912,7 @@
var/obj/item/organ/internal/stomach/stomach = internal_organs_by_name[BP_STOMACH]
var/nothing_to_puke = FALSE
if(should_have_organ(BP_STOMACH))
if(!istype(stomach) || (stomach.ingested.total_volume <= 3 && !length(stomach.contents)))
if(!istype(stomach) || (stomach.ingested.total_volume <= 3 && !length(stomach.contents)) && nutrition <= 50)
nothing_to_puke = TRUE
else if(!(locate(/mob) in contents))
nothing_to_puke = TRUE
@@ -949,6 +950,7 @@
A.dropInto(get_turf(src))
if((species.gluttonous & GLUT_PROJECTILE_VOMIT) && !vomitReceptacle)
A.throw_at(get_edge_target_turf(src,dir),7,7,src)
nutrition -= 20
else
for(var/mob/M in contents)
if(vomitReceptacle)
@@ -1922,6 +1924,9 @@
/mob/living/carbon/human/should_have_organ(var/organ_check)
return (species?.has_organ[organ_check])
/mob/living/carbon/human/should_have_limb(var/limb_check)
return (species?.has_limbs[limb_check])
/mob/living/proc/resuscitate()
return FALSE
@@ -2009,6 +2014,10 @@
if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.current_accent)
used_accent = rig.speech.voice_holder.current_accent
var/obj/item/organ/internal/augment/synthetic_cords/voice/aug = internal_organs_by_name[BP_AUG_ACC_CORDS] //checks for augments, thanks grey
if(aug)
used_accent = aug.accent
for(var/obj/item/gear in list(wear_mask,wear_suit,head)) //checks for voice changers masks now
if(gear)
var/obj/item/voice_changer/changer = locate() in gear
@@ -2113,16 +2122,16 @@
var/obj/item/organ/external/E = organs_by_name[BP_HEAD]
switch (intensity)
if (1)
custom_pain("Your ears hurt a little.", 5, FALSE, E, 0)
custom_pain("Your ears hurt a little.", 5, FALSE, E, TRUE)
if (2)
custom_pain("Your ears hurt!", 10, TRUE, E, 0)
custom_pain("Your ears hurt!", 10, TRUE, E, TRUE)
if (3)
custom_pain("Your ears hurt badly!", 40, TRUE, E, 0)
custom_pain("Your ears hurt badly!", 40, TRUE, E, TRUE)
if (4)
custom_pain("Your ears begin to ring faintly from the pain!", 70, TRUE, E, 0)
custom_pain("Your ears begin to ring faintly from the pain!", 70, TRUE, E, TRUE)
adjustEarDamage(5, 0, FALSE)
stop_listening()
if (5)
custom_pain("YOUR EARS ARE DEAFENED BY THE PAIN!", 110, TRUE, E, 1)
custom_pain("YOUR EARS ARE DEAFENED BY THE PAIN!", 110, TRUE, E, FALSE)
adjustEarDamage(5, 5, FALSE)
stop_listening()
@@ -90,6 +90,7 @@
if(O)
O.status = 0
switch(status)
if ("amputated")
organs_by_name[O.limb_name] = null
organs -= O
@@ -97,6 +98,14 @@
for(var/obj/item/organ/external/child in O.children)
organs_by_name[child.limb_name] = null
organs -= child
if ("nymph")
if (organ_data[name])
O.AddComponent(/datum/component/nymph_limb)
var/datum/component/nymph_limb/D = O.GetComponent(/datum/component/nymph_limb)
if(D)
D.nymphize(src, O.limb_name, TRUE)
if ("cyborg")
if (rlimb_data[name])
O.force_skintone = FALSE
@@ -102,7 +102,12 @@ This saves us from having to call add_fingerprint() any time something is put in
if (wear_suit.flags_inv & HIDEJUMPSUIT)
update_uniform = 1
if(s_store)
if(!(isvaurca(src) && s_store.w_class <= ITEMSIZE_SMALL))
var/can_keep_s_store = FALSE
if(s_store.slot_flags & SLOT_S_STORE)
can_keep_s_store = TRUE
if(!can_keep_s_store && species.can_hold_s_store(s_store))
can_keep_s_store = TRUE
if(!can_keep_s_store)
drop_from_inventory(s_store)
wear_suit = null
update_inv_wear_suit()
+7 -1
View File
@@ -175,7 +175,7 @@
if("headset")
var/obj/item/device/radio/R = get_radio()
if(R)
used_radios += l_ear
used_radios += R
if(R.talk_into(src, message, null, verb, speaking))
successful_radio += R
if("right ear")
@@ -322,3 +322,9 @@
message = "[prefix][jointext(words," ")]"
return message
/mob/living/carbon/human/binarycheck()
for(var/obj/item/device/radio/headset/dongle in list(l_ear, r_ear))
if(dongle.translate_binary)
return TRUE
return FALSE
@@ -19,6 +19,7 @@
var/list/selectable_pronouns = list(MALE, FEMALE, PLURAL)
// Icon/appearance vars.
var/canvas_icon = 'icons/mob/base_32.dmi' // Used to blend parts and icons onto this, to avoid clipping issues.
var/icobase = 'icons/mob/human_races/human/r_human.dmi' // Normal icon set.
var/deform = 'icons/mob/human_races/human/r_def_human.dmi' // Mutated icon set.
var/preview_icon = 'icons/mob/human_races/human/human_preview.dmi'
@@ -94,7 +95,7 @@
var/break_cuffs = FALSE //used in resist.dm to check if they can break hand/leg cuffs
var/natural_climbing = FALSE //If true, the species always succeeds at climbing.
var/climb_coeff = 1.25 //The coefficient to the climbing speed of the individual = 60 SECONDS * climb_coeff
// Death vars.
var/respawn_type = CREW
var/meat_type = /obj/item/reagent_containers/food/snacks/meat/human
@@ -277,6 +278,7 @@
var/bodyfall_sound = /decl/sound_category/bodyfall_sound //default, can be used for species specific falling sounds
var/list/alterable_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH, BP_APPENDIX) //what internal organs can be changed in character setup
var/list/possible_external_organs_modifications = list("Normal","Amputated","Prosthesis")
/datum/species/proc/get_eyes(var/mob/living/carbon/human/H)
return
@@ -731,7 +733,7 @@
/datum/species/proc/handle_movement_tally(var/mob/living/carbon/human/H)
var/tally = 0
if(istype(H.buckled_to, /obj/structure/bed/chair/wheelchair))
if(istype(H.buckled_to, /obj/structure/bed/stool/chair/office/wheelchair))
for(var/organ_name in list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM))
var/obj/item/organ/external/E = H.get_organ(organ_name)
if(!E || E.is_stump())
@@ -788,3 +790,9 @@
stance_damage -=2
return stance_damage
/datum/species/proc/can_hold_s_store(var/obj/item/I)
return FALSE
/datum/species/proc/can_double_fireman_carry()
return FALSE
@@ -36,7 +36,7 @@
num_alternate_languages = 2
name_language = LANGUAGE_ROOTSONG
ethanol_resistance = -1 //Can't get drunk
taste_sensitivity = TASTE_DULL
taste_sensitivity = TASTE_NUMB
mob_size = 12 //Worker gestalts are 150kg
remains_type = /obj/effect/decal/cleanable/ash //no bones, so, they just turn into dust
gluttonous = GLUT_ITEM_ANYTHING|GLUT_SMALLER
@@ -908,7 +908,7 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL,
/datum/species/golem/technomancer/handle_movement_tally(var/mob/living/carbon/human/H)
var/tally = 0
if(istype(H.buckled_to, /obj/structure/bed/chair/wheelchair))
if(istype(H.buckled_to, /obj/structure/bed/stool/chair/office/wheelchair))
for(var/organ_name in list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM))
var/obj/item/organ/external/E = H.get_organ(organ_name)
if(!E || E.is_stump())
@@ -36,6 +36,8 @@
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_SOCKS
flags = NO_SLIP
possible_external_organs_modifications = list("Normal","Amputated","Prosthesis", "Diona Nymph")
has_limbs = list(
BP_CHEST = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
@@ -95,7 +95,7 @@
allowed_religions = list(RELIGION_TWINSUNS, RELIGION_MATAKE, RELIGION_RASKARA, RELIGION_NONE, RELIGION_OTHER)
default_accent = ACCENT_REPUBICLANSIIK
allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_DINAKK, ACCENT_OLDYASSA)
allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_DINAKK, ACCENT_HARRNRRI, ACCENT_OLDYASSA)
inherent_verbs = list(
/mob/living/carbon/human/proc/tie_hair)
@@ -28,7 +28,7 @@
heat_level_2 = 360 //RaceDefault 380 Default 400
heat_level_3 = 700 //RaceDefault 800 Default 1000
allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_RURALDELVAHHI, ACCENT_NOMADDELVAHHI, ACCENT_DINAKK)
allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_RURALDELVAHHI, ACCENT_NOMADDELVAHHI, ACCENT_DINAKK, ACCENT_HARRNRRI)
stomach_capacity = 7
@@ -66,7 +66,7 @@
default_h_style = "M'sai Ears"
secondary_langs = list(LANGUAGE_SIIK_MAAS, LANGUAGE_SIIK_TAJR, LANGUAGE_SIGN_TAJARA)
allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_DINAKK)
allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_DINAKK, ACCENT_HARRNRRI, ACCENT_ZARRJIRI)
max_nutrition_factor = 1.2
max_hydration_factor = 1.2
@@ -99,6 +99,16 @@
"Your scales bristle against the cold."
)
has_organ = list(
BP_BRAIN = /obj/item/organ/internal/brain/unathi,
BP_HEART = /obj/item/organ/internal/heart/unathi,
BP_LIVER = /obj/item/organ/internal/liver/unathi,
BP_LUNGS = /obj/item/organ/internal/lungs/unathi,
BP_KIDNEYS = /obj/item/organ/internal/kidneys/unathi,
BP_STOMACH = /obj/item/organ/internal/stomach/unathi,
BP_EYES = /obj/item/organ/internal/eyes/unathi
)
pain_emotes_with_pain_level = list(
list(/decl/emote/audible/wheeze, /decl/emote/audible/roar, /decl/emote/audible/bellow) = 80,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/wheeze, /decl/emote/audible/hiss) = 50,
@@ -118,6 +128,8 @@
default_accent = ACCENT_HEGEMON_PEASANT
allowed_accents = list(ACCENT_HEGEMON_NOBLE, ACCENT_HEGEMON_PEASANT, ACCENT_TRAD_NOBLE, ACCENT_TRAD_PEASANT, ACCENT_WASTELAND, ACCENT_DOMINIA_HIGH, ACCENT_DOMINIA_VULGAR)
possible_external_organs_modifications = list("Normal","Amputated","Prosthesis", "Diona Nymph")
/datum/species/unathi/after_equip(var/mob/living/carbon/human/H)
. = ..()
if(H.shoes)
@@ -104,7 +104,8 @@
BP_PHORON_RESERVE = /obj/item/organ/vaurca/preserve,
BP_LIVER = /obj/item/organ/internal/liver/vaurca,
BP_KIDNEYS = /obj/item/organ/internal/kidneys/vaurca,
BP_STOMACH = /obj/item/organ/internal/stomach,
BP_STOMACH = /obj/item/organ/internal/stomach/vaurca,
BP_APPENDIX = /obj/item/organ/internal/appendix/vaurca,
BP_BRAIN = /obj/item/organ/internal/brain/vaurca,
BP_EYES = /obj/item/organ/internal/eyes/night/vaurca
)
@@ -127,14 +128,14 @@
move_trail = /obj/effect/decal/cleanable/blood/tracks/claw
allowed_citizenships = list(CITIZENSHIP_ZORA, CITIZENSHIP_IZWESKI, CITIZENSHIP_BIESEL, CITIZENSHIP_ERIDANI, CITIZENSHIP_JARGON)
allowed_citizenships = list(CITIZENSHIP_NONE, CITIZENSHIP_IZWESKI, CITIZENSHIP_BIESEL, CITIZENSHIP_ERIDANI, CITIZENSHIP_JARGON)
allowed_religions = list(RELIGION_HIVEPANTHEON, RELIGION_PREIMMINENNCE, RELIGION_PILOTDREAM, RELIGION_NONE, RELIGION_OTHER)
default_citizenship = CITIZENSHIP_ZORA
default_citizenship = CITIZENSHIP_NONE
default_accent = ACCENT_TTS
allowed_accents = list(ACCENT_TTS, ACCENT_ZORA, ACCENT_KLAX, ACCENT_CTHUR)
alterable_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_STOMACH)
alterable_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_STOMACH, BP_APPENDIX)
/datum/species/bug/before_equip(var/mob/living/carbon/human/H)
. = ..()
@@ -159,3 +160,8 @@
/datum/species/bug/is_naturally_insulated()
return TRUE
/datum/species/bug/can_hold_s_store(obj/item/I)
if(I.w_class <= ITEMSIZE_SMALL)
return TRUE
return FALSE
@@ -60,8 +60,14 @@
toxins_mod = 1 //they're not used to all our weird human bacteria.
break_cuffs = TRUE
mob_size = 30
taste_sensitivity = TASTE_DULL
blurb = {"Type CB Vaurcae, also known as Breeders, are the leaders of the Vaurca Society. Type C, being the only fertile caste, provide life to the Hive. Most of them, however, are not producing more eggs but in charge of hive-cells of other castes, coordinating their everyday life.<br>
Some Type CB Vaurcae have been recently used as representatives for their respective queens, due their keen social intelligence, making them ideal candidates for negotiating with aliens on economic and political matters. They easily grasp the nuances of social context, contracts, and systems that other castes have difficulty navigating.<br>
The Type C caste is not suitable for physical work and will often delegate any duties to the rest of the Vaurcae, which are below them in the hierarchy.<br>
<b>Vaurca Breeders can only be played as Hive Representatives of Queens affiliated to the Court of Queens.</b>"}
age_max = 1000
default_genders = list(FEMALE)
economic_modifier = 3
speech_sounds = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
@@ -71,6 +77,7 @@
damage_overlays = 'icons/mob/human_races/masks/dam_breeder.dmi'
damage_mask = 'icons/mob/human_races/masks/dam_mask_breeder.dmi'
blood_mask = 'icons/mob/human_races/masks/blood_breeder.dmi'
canvas_icon = 'icons/mob/base_48.dmi'
stamina = 175
@@ -78,9 +85,10 @@
sprint_cost_factor = 0.80
stamina_recovery = 3
allowed_citizenships = list(CITIZENSHIP_ZORA, CITIZENSHIP_KLAX, CITIZENSHIP_CTHUR, CITIZENSHIP_IZWESKI, CITIZENSHIP_BIESEL, CITIZENSHIP_ERIDANI, CITIZENSHIP_JARGON)
allowed_citizenships = list(CITIZENSHIP_ZORA, CITIZENSHIP_KLAX, CITIZENSHIP_CTHUR)
default_citizenship = CITIZENSHIP_ZORA
flags = NO_SCAN | NO_SLIP | NO_ARTERIES | PHORON_IMMUNE
flags = NO_SLIP | NO_ARTERIES | PHORON_IMMUNE
inherent_verbs = list(
/mob/living/carbon/human/proc/bugbite
@@ -185,9 +193,10 @@
icon_template = 'icons/mob/human_races/vaurca/r_vaurcae.dmi'
icobase = 'icons/mob/human_races/vaurca/r_vaurcae.dmi'
deform = 'icons/mob/human_races/vaurca/r_vaurcae.dmi'
canvas_icon = 'icons/mob/base_48.dmi'
talk_bubble_icon = 'icons/mob/talk_bulwark.dmi'
bald = TRUE
default_h_style = "Bulwark Classic Antennae"
icon_x_offset = -9
healths_x = 22
@@ -246,3 +255,6 @@ Bulwarks are much larger and have significantly thicker carapaces than most Vaur
slot_wrists_str = list("[NORTH]" = list("x" = 15, "y" = 0), "[EAST]" = list("x" = 12, "y" = 0), "[SOUTH]" = list("x" = 4, "y" = 0), "[WEST]" = list("x" = 9, "y" = 0)),
slot_shoes_str = list("[NORTH]" = list("x" = 9, "y" = 0), "[EAST]" = list("x" = 8, "y" = 0), "[SOUTH]" = list("x" = 9, "y" = 0), "[WEST]" = list("x" = 8, "y" = 0))
)
/datum/species/bug/type_e/can_double_fireman_carry()
return TRUE
@@ -246,6 +246,20 @@ There are several things that need to be remembered:
if(update_icons)
update_icon()
//Overlays for the worn overlay so you can overlay while you overlay
//eg: ammo counters, primed grenade flashing, etc.
//"icon_file" is used automatically for inhands etc. to make sure it gets the correct inhand file
/obj/item/proc/worn_overlays(icon_file)
. = null
. = list()
var/mutable_appearance/M = null
if(build_from_parts)
M = mutable_appearance(icon_file, "[item_state]_[worn_overlay]")
M.appearance_flags = RESET_COLOR|RESET_ALPHA
if(worn_overlay_color)
M.color = worn_overlay_color
. += M
/proc/slot_str_to_contained_flag(var/slot_str)
switch(slot_str)
if(slot_back_str)
@@ -404,7 +418,7 @@ There are several things that need to be remembered:
var/icon/face_standing = SSicon_cache.human_hair_cache[cache_key]
if (!face_standing) // Not cached, generate it from scratch.
face_standing = new /icon('icons/mob/human_face/hair.dmi',"bald")
face_standing = new /icon(species.canvas_icon, "blank")
// Beard.
if(f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
@@ -653,7 +667,12 @@ There are several things that need to be remembered:
var/mob_state = gloves.item_state || gloves.icon_state
if(gloves.contained_sprite)
mob_icon = (gloves.icon_override || gloves.icon)
if(gloves.icon_override)
mob_icon = gloves.icon_override
else if(gloves.sprite_sheets && gloves.sprite_sheets[GET_BODY_TYPE])
mob_icon = gloves.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = gloves.icon
gloves.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(gloves.icon_species_tag)][gloves.item_state][WORN_GLOVES]"
else if(gloves.icon_override)
@@ -683,7 +702,12 @@ There are several things that need to be remembered:
var/mob_icon
var/mob_state = glasses.icon_state
if(glasses.contained_sprite)
mob_icon = (glasses.icon_override || glasses.icon)
if(glasses.icon_override)
mob_icon = glasses.icon_override
else if(glasses.sprite_sheets && glasses.sprite_sheets[GET_BODY_TYPE])
mob_icon = glasses.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = glasses.icon
glasses.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(glasses.icon_species_tag)][glasses.item_state][WORN_EYES]"
else if(glasses.icon_override)
@@ -723,7 +747,12 @@ There are several things that need to be remembered:
var/mob_state = l_ear.icon_state
if(l_ear.contained_sprite)
mob_icon = (l_ear.icon_override || l_ear.icon)
if(l_ear.icon_override)
mob_icon = l_ear.icon_override
else if(l_ear.sprite_sheets && l_ear.sprite_sheets[GET_BODY_TYPE])
mob_icon = l_ear.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = l_ear.icon
l_ear.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(l_ear.icon_species_tag)][l_ear.item_state][WORN_LEAR]"
else if(l_ear.icon_override)
@@ -750,7 +779,12 @@ There are several things that need to be remembered:
var/mob_state = r_ear.icon_state
if(r_ear.contained_sprite)
mob_icon = (r_ear.icon_override || r_ear.icon)
if(r_ear.icon_override)
mob_icon = r_ear.icon_override
else if(r_ear.sprite_sheets && r_ear.sprite_sheets[GET_BODY_TYPE])
mob_icon = r_ear.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = r_ear.icon
r_ear.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(r_ear.icon_species_tag)][r_ear.item_state][WORN_REAR]"
else if(r_ear.icon_override)
@@ -776,10 +810,12 @@ There are several things that need to be remembered:
var/mob_state = shoes.icon_state
if(shoes.contained_sprite)
if(shoes.icon_override)
mob_icon = shoes.icon_override
if(shoes.sprite_sheets && shoes.sprite_sheets[GET_BODY_TYPE])
mob_icon = shoes.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = (shoes.icon_override || shoes.icon)
mob_icon = shoes.icon
shoes.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(shoes.icon_species_tag)][shoes.item_state][WORN_SHOES]"
else if(shoes.icon_override)
@@ -832,7 +868,12 @@ There are several things that need to be remembered:
var/mob_icon = 'icons/mob/belt_mirror.dmi'
var/mob_state = (s_store.item_state || s_store.icon_state)
if(s_store.contained_sprite)
mob_icon = (s_store.icon_override || s_store.icon)
if(s_store.icon_override)
mob_icon = s_store.icon_override
else if(s_store.sprite_sheets && s_store.sprite_sheets[GET_BODY_TYPE])
mob_icon = s_store.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = s_store.icon
s_store.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(s_store.icon_species_tag)][s_store.item_state][WORN_SSTORE]"
overlays_raw[SUIT_STORE_LAYER] = s_store.get_mob_overlay(src, mob_icon, mob_state, slot_s_store_str)
@@ -852,10 +893,12 @@ There are several things that need to be remembered:
var/mob_state = head.icon_state
if(head.contained_sprite)
if(head.sprite_sheets && head.sprite_sheets[GET_BODY_TYPE])
if(head.icon_override)
mob_icon = head.icon_override
else if(head.sprite_sheets && head.sprite_sheets[GET_BODY_TYPE])
mob_icon = head.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = (head.icon_override || head.icon)
mob_icon = head.icon
head.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(head.icon_species_tag)][head.item_state][WORN_HEAD]"
else if(head.icon_override)
@@ -886,10 +929,12 @@ There are several things that need to be remembered:
var/mob_state = belt.item_state
if(belt.contained_sprite)
if(belt.sprite_sheets && belt.sprite_sheets[GET_BODY_TYPE])
if(belt.icon_override)
mob_icon = belt.icon_override
else if(belt.sprite_sheets && belt.sprite_sheets[GET_BODY_TYPE])
mob_icon = belt.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = (belt.icon_override || belt.icon)
mob_icon = belt.icon
belt.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(belt.icon_species_tag)][belt.item_state][WORN_BELT]"
else if(belt.icon_override)
@@ -924,7 +969,9 @@ There are several things that need to be remembered:
var/mob_icon = INV_SUIT_DEF_ICON
var/mob_state = wear_suit.icon_state
if(wear_suit.contained_sprite)
if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[GET_BODY_TYPE])
if(wear_suit.icon_override)
mob_icon = wear_suit.icon_override
else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[GET_BODY_TYPE])
mob_icon = wear_suit.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = wear_suit.icon
@@ -971,10 +1018,12 @@ There are several things that need to be remembered:
if(wear_mask.contained_sprite)
wear_mask.auto_adapt_species(src)
var/state = "[UNDERSCORE_OR_NULL(wear_mask.icon_species_tag)][wear_mask.item_state][WORN_MASK]"
if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[GET_BODY_TYPE])
if(wear_mask.icon_override)
mob_icon = wear_mask.icon_override
else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[GET_BODY_TYPE])
mob_icon = wear_mask.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = (wear_mask.icon_override || wear_mask.icon)
mob_icon = wear_mask.icon
mob_state = state
else if(wear_mask.icon_override)
mob_icon = wear_mask.icon_override
@@ -1005,10 +1054,12 @@ There are several things that need to be remembered:
var/mob_state = back.icon_state
if(back.contained_sprite)
if(back.sprite_sheets && back.sprite_sheets[GET_BODY_TYPE])
if(back.icon_override)
mob_icon = back.icon_override
else if(back.sprite_sheets && back.sprite_sheets[GET_BODY_TYPE])
mob_icon = back.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = (back.icon_override || back.icon)
mob_icon = back.icon
back.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(back.icon_species_tag)][back.item_state][WORN_BACK]"
else if(back.icon_override)
@@ -1101,14 +1152,19 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_inv_l_hand(var/update_icons=1)
if (QDELING(src))
return
if(l_hand)
var/mob_icon
var/mob_state = l_hand.item_state || l_hand.icon_state
if(l_hand.contained_sprite)
mob_icon = l_hand.icon_override || l_hand.icon
if(l_hand.icon_override)
mob_icon = l_hand.icon_override
else if(l_hand.sprite_sheets && l_hand.sprite_sheets[GET_BODY_TYPE])
mob_icon = l_hand.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = l_hand.icon
l_hand.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(l_hand.icon_species_tag)][l_hand.item_state][WORN_LHAND]"
else
@@ -1122,7 +1178,7 @@ There are several things that need to be remembered:
mob_state += WORN_LHAND
else
mob_icon = INV_L_HAND_DEF_ICON
overlays_raw[L_HAND_LAYER] = l_hand.get_mob_overlay(src, mob_icon, mob_state, slot_l_hand_str)
else
overlays_raw[L_HAND_LAYER] = null
@@ -1139,7 +1195,12 @@ There are several things that need to be remembered:
var/mob_state = r_hand.item_state || r_hand.icon_state
if(r_hand.contained_sprite)
mob_icon = r_hand.icon_override || r_hand.icon
if(r_hand.icon_override)
mob_icon = r_hand.icon_override
else if(r_hand.sprite_sheets && r_hand.sprite_sheets[GET_BODY_TYPE])
mob_icon = r_hand.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = r_hand.icon
r_hand.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(r_hand.icon_species_tag)][r_hand.item_state][WORN_RHAND]"
else
@@ -1153,7 +1214,7 @@ There are several things that need to be remembered:
mob_state += WORN_RHAND
else
mob_icon = INV_R_HAND_DEF_ICON
overlays_raw[R_HAND_LAYER] = r_hand.get_mob_overlay(src, mob_icon, mob_state, slot_r_hand_str)
else
overlays_raw[R_HAND_LAYER] = null
@@ -1170,7 +1231,12 @@ There are several things that need to be remembered:
var/mob_icon
var/mob_state = wrists.item_state || wrists.icon_state
if(wrists.contained_sprite)
mob_icon = wrists.icon
if(wrists.icon_override)
mob_icon = wrists.icon_override
else if(wrists.sprite_sheets && wrists.sprite_sheets[GET_BODY_TYPE])
mob_icon = wrists.sprite_sheets[GET_BODY_TYPE]
else
mob_icon = wrists.icon
wrists.auto_adapt_species(src)
mob_state = "[UNDERSCORE_OR_NULL(wrists.icon_species_tag)][wrists.item_state][WORN_WRISTS]"
else
+33 -33
View File
@@ -10,14 +10,14 @@
Weaken(3)
spin(32,2)
visible_message(
"<span class='danger'>[src] rolls on the floor, trying to put themselves out!</span>",
"<span class='notice'>You stop, drop, and roll!</span>"
SPAN_DANGER("[src] rolls on the floor, trying to put themselves out!"),
SPAN_NOTICE("You stop, drop, and roll!")
)
sleep(3 SECONDS)
if(fire_stacks <= 0)
visible_message(
"<span class='danger'>[src] has successfully extinguished themselves!</span>",
"<span class='notice'>You extinguish yourself.</span>"
SPAN_DANGER("[src] has successfully extinguished themselves!"),
SPAN_NOTICE("You extinguish yourself.")
)
return
@@ -36,26 +36,26 @@
/mob/living/carbon/human/proc/escape_jacket()
visible_message(
"<span class='danger'>\The [src] attempts to escape [wear_suit]!</span>",
"<span class='warning'>You attempt to escape [wear_suit]. (This will take around 6 minutes and you need to stand still)</span>"
SPAN_DANGER("\The [src] attempts to escape [wear_suit]!"),
SPAN_WARNING("You attempt to escape [wear_suit]. (This will take around 6 minutes and you need to stand still)")
)
if (!do_after(src, 1.5 MINUTES, act_target = src))
return
visible_message(
"<span class='danger'>\The [src] is shifting in their [wear_suit]!</span>",
"<span class='warning'>You start to loosen the [wear_suit].</span>"
SPAN_WARNING("\The [src] is shifting in their [wear_suit]!"),
SPAN_WARNING("You start to loosen the [wear_suit].")
)
if (!do_after(src, 1.5 MINUTES, act_target = src))
return
visible_message(
"<span class='danger'>\The [src] is moving in their [wear_suit]!</span>",
"<span class='warning'>You slip one of your arms out of the [wear_suit].</span>"
SPAN_DANGER("\The [src] is moving in their [wear_suit]!"),
SPAN_WARNING("You slip one of your arms out of the [wear_suit].")
)
if (!do_after(src, 1.5 MINUTES, act_target = src))
return
visible_message(
"<span class='danger'>\The [src] is moving around in their [wear_suit] - it looks like they are about to break out!</span>",
"<span class='warning'>You start to pull loose the straps on the straightjacket[wear_suit].</span>"
SPAN_DANGER("\The [src] is moving around in their [wear_suit] - it looks like they are about to break out!"),
SPAN_WARNING("You start to pull loose the straps on the straightjacket[wear_suit].")
)
if (do_after(src, 1.5 MINUTES, act_target = src))
var/obj/ex_suit = wear_suit
@@ -98,13 +98,13 @@
violent_removal = 1
breakouttime = rand(450,600)
visible_message(
"<span class='danger'>\The [src] attempts to break out of \the [HC]!</span>",
"<span class='warning'>You attempt to break out of \the [HC]. (This will take around 1 minute and you need to stand still)</span>"
SPAN_DANGER("\The [src] attempts to break out of \the [HC]!"),
SPAN_WARNING("You attempt to break out of \the [HC]. (This will take around 1 minute and you need to stand still)")
)
else
visible_message(
"<span class='danger'>\The [src] attempts to slip out of \the [HC]!</span>",
"<span class='warning'>You attempt to slip out of \the [HC]. (This will take around [displaytime] minutes and you need to stand still)</span>"
SPAN_DANGER("\The [src] attempts to slip out of \the [HC]!"),
SPAN_WARNING("You attempt to slip out of \the [HC]. (This will take around [displaytime] minutes and you need to stand still)")
)
if(do_after(src, breakouttime))
@@ -125,13 +125,13 @@
E.dislocate(1)
dislocate_message = ", but dislocate your [E] in the process"
visible_message(
"<span class='danger'>\The [src] manages to remove \the [handcuffed][buckle_message_other]!</span>",
"<span class='notice'>You successfully remove \the [handcuffed][buckle_message_user][dislocate_message].</span>"
SPAN_DANGER("\The [src] manages to remove \the [handcuffed][buckle_message_other]!"),
SPAN_NOTICE("You successfully remove \the [handcuffed][buckle_message_user][dislocate_message].")
)
else
visible_message(
"<span class='notice'>\The [src] manages to slip out of \the [handcuffed][buckle_message_other]!</span>",
"<span class='notice'>You successfully slip out of \the [handcuffed][buckle_message_user].</span>"
SPAN_NOTICE("\The [src] manages to slip out of \the [handcuffed][buckle_message_other]!"),
SPAN_NOTICE("You successfully slip out of \the [handcuffed][buckle_message_user].")
)
drop_from_inventory(handcuffed)
@@ -157,16 +157,16 @@
displaytime = breakouttime / 600 //Minutes
visible_message(
"<span class='danger'>[usr] attempts to remove \the [HC]!</span>",
"<span class='warning'>You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)</span>"
SPAN_DANGER("[usr] attempts to remove \the [HC]!"),
SPAN_WARNING("You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)")
)
if(do_after(src, breakouttime))
if(!legcuffed || buckled_to)
return
visible_message(
"<span class='danger'>[src] manages to remove \the [legcuffed]!</span>",
"<span class='notice'>You successfully remove \the [legcuffed].</span>"
SPAN_DANGER("[src] manages to remove \the [legcuffed]!"),
SPAN_NOTICE("You successfully remove \the [legcuffed].")
)
drop_from_inventory(legcuffed)
@@ -187,17 +187,17 @@
/mob/living/carbon/proc/break_handcuffs()
visible_message(
"<span class='danger'>[src] is trying to break \the [handcuffed]!</span>",
"<span class='warning'>You attempt to break your [handcuffed.name]. (This will take around 5 seconds and you need to stand still)</span>"
SPAN_DANGER("[src] is trying to break \the [handcuffed]!"),
SPAN_WARNING("You attempt to break your [handcuffed.name]. (This will take around 10 seconds and you need to stand still)")
)
if(do_after(src, 50))
if(do_after(src, 10 SECONDS))
if(!handcuffed)
return
visible_message(
"<span class='danger'>[src] manages to break \the [handcuffed]!</span>",
"<span class='warning'>You successfully break your [handcuffed.name].</span>"
SPAN_DANGER("[src] manages to break \the [handcuffed]!"),
SPAN_WARNING("You successfully break your [handcuffed.name].")
)
if((isunathi(src)) || (HULK in mutations))
@@ -211,16 +211,16 @@
update_inv_handcuffed()
/mob/living/carbon/proc/break_legcuffs()
to_chat(src, "<span class='warning'>You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)</span>")
visible_message("<span class='danger'>[src] is trying to break the legcuffs!</span>")
to_chat(src, SPAN_WARNING("You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)"))
visible_message(SPAN_DANGER("[src] is trying to break the legcuffs!"))
if(do_after(src, 50))
if(!legcuffed || buckled_to)
return
visible_message(
"<span class='danger'>[src] manages to break the legcuffs!</span>",
"<span class='warning'>You successfully break your legcuffs.</span>"
SPAN_DANGER("[src] manages to break the legcuffs!"),
SPAN_WARNING("You successfully break your legcuffs.")
)
say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ))
+2 -17
View File
@@ -75,23 +75,8 @@ proc/get_radio_key_from_channel(var/channel)
return key
/mob/living/proc/binarycheck()
if (istype(src, /mob/living/silicon/pai))
return
if (!ishuman(src))
return
var/mob/living/carbon/human/H = src
if (H.l_ear || H.r_ear)
var/obj/item/device/radio/headset/dongle
if(istype(H.l_ear,/obj/item/device/radio/headset))
dongle = H.l_ear
else
dongle = H.r_ear
if(!istype(dongle)) return
if(dongle.translate_binary) return 1
/mob/living/proc/binarycheck(var/mob/speaker)
return FALSE
/mob/living/proc/get_stuttered_message(message)
return stutter(message, stuttering)
@@ -11,6 +11,8 @@ var/list/robot_custom_icons
return 1
/mob/living/silicon/robot/proc/set_custom_sprite()
if(!(name in robot_custom_icons))
return
var/datum/custom_synth/sprite = robot_custom_icons[name]
if(istype(sprite) && sprite.synthckey == ckey)
custom_sprite = 1
@@ -21,4 +23,4 @@ var/list/robot_custom_icons
icon_state = "[sprite.synthicon]-Standard"
else
to_chat(src, SPAN_WARNING("Could not locate [sprite.synthicon]-Standard sprite."))
icon = 'icons/mob/robots.dmi'
icon = 'icons/mob/robots.dmi'
@@ -0,0 +1,5 @@
#define MTX_UPG_SPEED "Actuator Enhancement"
#define MTX_UPG_CELL "Power Cell Amplification"
#define MTX_UPG_HEALTH "Chassis Hardening"
#define ALL_MATRIX_UPGRADES list(MTX_UPG_SPEED, MTX_UPG_CELL, MTX_UPG_HEALTH)
@@ -21,6 +21,7 @@
/mob/living/silicon/robot/drone
// Look and feel
name = "maintenance drone"
var/designation
var/desc_flavor = "It's a tiny little repair drone. The casing is stamped with an corporate logo and the subscript: '%MAPNAME% Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'<br><br><b>OOC Info:</b><br><br>Drones are player-controlled synthetics which are lawed to maintain the station and not interact with anyone else, except for other drones.<br><br>They hold a wide array of tools to build, repair, maintain, and clean. They function similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, such as fire, radiation, vacuum, and more.<br><br>Ghosts can join the round as a maintenance drone by accessing the 'Ghost Spawner' menu in the 'Ghost' tab. An inactive drone can be rebooted by swiping an ID card on it with engineering or robotics access, and an active drone can be shut down in the same manner.<br><br>An antagonist can use an Electromagnetic Sequencer to corrupt their laws and make them follow their orders."
icon = 'icons/mob/robots.dmi'
icon_state = "repairbot"
@@ -37,6 +38,9 @@
cell_emp_mult = 1
integrated_light_power = 3
var/upgrade_cooldown = 0
var/list/matrix_upgrades
// Interaction
universal_speak = FALSE
universal_understand = TRUE
@@ -63,6 +67,7 @@
var/hacked = FALSE
// Laws
var/datum/drone_matrix/master_matrix
var/obj/machinery/drone_fabricator/master_fabricator
var/law_type = /datum/ai_laws/drone
@@ -83,6 +88,17 @@
. = ..()
set_default_language(all_languages[LANGUAGE_LOCAL_DRONE])
/mob/living/silicon/robot/drone/Destroy()
if(master_matrix)
master_matrix.remove_drone(WEAKREF(src))
master_matrix = null
return ..()
/mob/living/silicon/robot/drone/death(gibbed)
if(master_matrix)
master_matrix.handle_death(src)
return ..()
/mob/living/silicon/robot/drone/can_be_possessed_by(var/mob/abstract/observer/possessor)
if(!istype(possessor) || !possessor.client || !possessor.ckey)
return FALSE
@@ -119,6 +135,8 @@
hat.forceMove(get_turf(src))
hat = null
QDEL_NULL(hat_overlay)
master_matrix = null
master_fabricator = null
return ..()
/mob/living/silicon/robot/drone/get_default_language()
@@ -183,6 +201,8 @@
law_type = /datum/ai_laws/matriarch_drone
can_swipe = FALSE
var/matrix_tag = STATION_TAG
/mob/living/silicon/robot/drone/construction/matriarch/Initialize()
. = ..()
check_add_to_late_firers()
@@ -193,13 +213,24 @@
/mob/living/silicon/robot/drone/construction/matriarch/assign_player(mob/user)
. = ..()
SSghostroles.remove_spawn_atom("matriarchmaintdrone", src)
assign_drone_to_matrix(src, matrix_tag)
master_matrix.message_drones(MATRIX_NOTICE("Energy surges through your circuits. The matriarch has come online."))
/mob/living/silicon/robot/drone/construction/matriarch/do_possession(mob/abstract/observer/possessor)
. = ..()
SSghostroles.remove_spawn_atom("matriarchmaintdrone", src)
/mob/living/silicon/robot/drone/construction/matriarch/ghostize(can_reenter_corpse, should_set_timer)
. = ..()
if(stat == DEAD)
if(can_reenter_corpse || stat == DEAD)
return
if(src in mob_list) // needs to exist to reopen spawn atom
if(master_matrix)
master_matrix.remove_drone(WEAKREF(src))
master_matrix.message_drones(MATRIX_NOTICE("Your circuits dull. The matriarch has gone offline."))
master_matrix = null
set_name(initial(name))
designation = null
request_player()
/mob/living/silicon/robot/drone/construction/matriarch/Destroy()
@@ -521,7 +552,7 @@
/mob/living/silicon/robot/drone/self_destruct()
gib()
/mob/living/silicon/robot/drone/examine(mob/user)
..()
var/msg
@@ -18,7 +18,7 @@
idle_power_usage = 20
active_power_usage = 5000
var/fabricator_tag = "Aurora"
var/fabricator_tag = STATION_TAG
var/drone_progress = 0
var/produce_drones = TRUE
var/time_last_drone = 500
@@ -99,11 +99,15 @@
if(!drone_tag)
drone_tag = "MT"
var/designation = "[drone_tag]-[rand(100,999)]"
var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src))
new_drone.set_name("[initial(new_drone.name)] ([drone_tag]-[rand(100,999)])")
new_drone.set_name("[initial(new_drone.name)] ([designation])")
new_drone.designation = designation
new_drone.transfer_personality(player)
new_drone.master_fabricator = src
assign_drone_to_matrix(new_drone, fabricator_tag)
drone_progress = 0
return new_drone
return new_drone
@@ -0,0 +1,91 @@
var/global/list/drone_matrices = list()
/datum/drone_matrix
var/id = null
var/datum/weakref/matriarch
var/list/datum/weakref/drones = list()
var/upgrades_remaining = 2
var/list/bought_upgrades
/datum/drone_matrix/New(var/matrix_id)
..()
id = matrix_id
drone_matrices[id] = src
/datum/drone_matrix/Destroy(force)
drone_matrices -= id
return ..()
/datum/drone_matrix/proc/get_matriarch()
if(matriarch)
return matriarch.resolve()
return null
/datum/drone_matrix/proc/get_drones()
. = list()
for(var/datum/weakref/drone_ref as anything in drones)
var/mob/living/silicon/robot/drone/D = drone_ref.resolve()
if(D)
. += D
/datum/drone_matrix/proc/message_drones(var/msg)
var/mob/living/silicon/robot/drone/D = null
if(matriarch)
D = matriarch.resolve()
if(D)
to_chat(D, msg)
for(var/datum/weakref/drone_ref as anything in drones)
D = drone_ref.resolve()
if(D)
to_chat(D, msg)
/datum/drone_matrix/proc/add_drone(mob/living/silicon/robot/drone/D)
if(isMatriarchDrone(D))
matriarch = WEAKREF(D)
return
drones += WEAKREF(D)
/datum/drone_matrix/proc/remove_drone(var/datum/weakref/drone_ref)
if(drone_ref == matriarch)
matriarch = null
return
drones -= drone_ref
/datum/drone_matrix/proc/handle_death(mob/living/silicon/robot/drone/D)
if(isMatriarchDrone(D))
message_drones(MATRIX_DANGER("A cold wave washes over your circuits. The matriarch is dead!"))
else
message_drones(SPAN_DANGER("Your circuits spark. Drone [D.designation] has died."))
/datum/drone_matrix/proc/buy_upgrade(var/upgrade_type)
LAZYADD(bought_upgrades, upgrade_type)
upgrades_remaining--
message_drones(MATRIX_NOTICE("A new matrix upgrade is available: [upgrade_type]"))
/datum/drone_matrix/proc/apply_upgrades(mob/living/silicon/robot/drone/D)
var/list/applied_upgrades = list()
for(var/upgrade in bought_upgrades)
if(!LAZYISIN(D.matrix_upgrades, upgrade))
applied_upgrades += upgrade
set_upgrade(D, upgrade)
if(length(applied_upgrades))
to_chat(D, SPAN_NOTICE("Matrix upgrades applied to chassis: [english_list(applied_upgrades)]"))
/datum/drone_matrix/proc/set_upgrade(mob/living/silicon/robot/drone/D, var/upgrade_type)
switch(upgrade_type)
if(MTX_UPG_SPEED)
D.speed = initial(D.speed) - 1
if(MTX_UPG_CELL)
D.cell.maxcharge = D.cell.maxcharge * 1.5
if(MTX_UPG_HEALTH)
D.maxHealth += 15
LAZYADD(D.matrix_upgrades, upgrade_type)
/proc/assign_drone_to_matrix(mob/living/silicon/robot/drone/D, var/matrix_tag)
var/datum/drone_matrix/DM = drone_matrices[matrix_tag]
if(!DM)
DM = new /datum/drone_matrix(matrix_tag)
D.master_matrix = DM
DM.add_drone(D)
@@ -0,0 +1,82 @@
/mob/living/silicon/robot/drone/verb/view_matrix_info()
set name = "View Matrix Info"
set desc = "View various information regarding the status of your assigned matrix."
set category = "Matrix"
if(!master_matrix)
to_chat(src, SPAN_WARNING("You do not belong to a matrix!"))
return
var/datum/drone_matrix/DM = master_matrix
var/dat = ""
var/mob/living/silicon/robot/drone/construction/matriarch/matriarch = DM.get_matriarch()
if(matriarch)
var/drone_stat = ""
if(matriarch.stat == UNCONSCIOUS)
drone_stat = " (Disabled)"
else if(matriarch.stat == DEAD)
drone_stat = " (Destroyed)"
dat += "<b>Matriarch:</b> [matriarch.designation][drone_stat]<hr>"
else
dat += "<b>Matriarch:</b> None<hr>"
var/list/drone_list = DM.get_drones()
dat += "<h2>Drones</h2>"
if(!length(drone_list))
dat += " - None<br>"
else
for(var/mob/living/silicon/robot/drone/D as anything in drone_list)
var/drone_stat = ""
if(D.stat == UNCONSCIOUS)
drone_stat = " (Disabled)"
else if(D.stat == DEAD)
drone_stat = " (Destroyed)"
dat += " - [D.designation][drone_stat]<br>"
dat += "<h2>Upgrades</h2>"
if(!length(DM.bought_upgrades))
dat += " - None<br>"
else
for(var/upgrade in DM.bought_upgrades)
dat += " - [upgrade]<br>"
var/datum/browser/matrix_win = new(src, "matrixinfo", "Matrix Information", 250, 350)
matrix_win.set_content(dat)
matrix_win.open()
/mob/living/silicon/robot/drone/verb/view_own_matrix_upgrades()
set name = "View Own Matrix Upgrades"
set desc = "View the matrix upgrades applied to your own chassis."
set category = "Matrix"
if(!LAZYLEN(matrix_upgrades))
to_chat(src, SPAN_WARNING("You have no matrix upgrades."))
return
to_chat(src, SPAN_NOTICE("Matrix upgrades active on chassis: [english_list(matrix_upgrades)]"))
/mob/living/silicon/robot/drone/construction/matriarch/verb/select_matrix_upgrades()
set name = "Select Matrix Upgrades"
set desc = "Select the upgrades to apply to the drones within your matrix."
set category = "Matrix"
if(!master_matrix)
to_chat(src, SPAN_WARNING("You do not belong to a matrix!"))
return
var/datum/drone_matrix/DM = master_matrix
if(!DM.upgrades_remaining)
to_chat(src, SPAN_WARNING("The matrix cannot support more upgrades!"))
return
var/list/selectable_upgrades = ALL_MATRIX_UPGRADES - DM.bought_upgrades
if(!length(selectable_upgrades))
to_chat(src, SPAN_WARNING("There are no more matrix upgrades to select!"))
return
var/selected_upgrade = input(src, "Select an upgrade for your matrix drones. ([DM.upgrades_remaining] Upgrades Remaining)", "Matrix Upgrades") as null|anything in selectable_upgrades
if(!selected_upgrade)
return
DM.buy_upgrade(selected_upgrade)
@@ -0,0 +1,5 @@
#undef MTX_UPG_SPEED
#undef MTX_UPG_CELL
#undef MTX_UPG_HEALTH
#undef ALL_MATRIX_UPGRADES
@@ -309,6 +309,11 @@ var/global/list/robot_modules = list(
modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful.
modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws.
modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to.
modules += new /obj/item/pen/robopen(src)
modules += new /obj/item/form_printer(src)
modules += new /obj/item/gripper/paperwork(src)
modules += new /obj/item/device/hand_labeler(src)
modules += new /obj/item/tape_roll(src)
emag = new /obj/item/reagent_containers/hypospray/cmo(src)
emag.reagents.add_reagent(/decl/reagent/wulumunusha, 30)
emag.name = "Wulumunusha Hypospray"
@@ -392,6 +397,11 @@ var/global/list/robot_modules = list(
modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful.
modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws.
modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to.
modules += new /obj/item/pen/robopen(src)
modules += new /obj/item/form_printer(src)
modules += new /obj/item/gripper/paperwork(src)
modules += new /obj/item/device/hand_labeler(src)
modules += new /obj/item/tape_roll(src)
emag = new /obj/item/gun/energy/plasmacutter/mounted(src)
malf_AI_module += new /obj/item/rfd/transformer(src)
@@ -456,6 +466,11 @@ var/global/list/robot_modules = list(
modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful.
modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws.
modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to.
modules += new /obj/item/pen/robopen(src)
modules += new /obj/item/form_printer(src)
modules += new /obj/item/gripper/paperwork(src)
modules += new /obj/item/device/hand_labeler(src)
modules += new /obj/item/tape_roll(src)
emag = new /obj/item/melee/baton/robot/arm(src)
malf_AI_module += new /obj/item/rfd/transformer(src)
@@ -570,6 +585,11 @@ var/global/list/robot_modules = list(
modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful.
modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws.
modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to.
modules += new /obj/item/pen/robopen(src)
modules += new /obj/item/form_printer(src)
modules += new /obj/item/gripper/paperwork(src)
modules += new /obj/item/device/hand_labeler(src)
modules += new /obj/item/tape_roll(src)
emag = new /obj/item/reagent_containers/spray(src)
emag.reagents.add_reagent(/decl/reagent/lube, 250)
emag.name = "Lube spray"
@@ -57,10 +57,12 @@
add_language(LANGUAGE_BORER_HIVEMIND)
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")]-[rand(1000,9999)]"
var/number = rand(1000,9999)
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")]-[number]"
if(request_player && !ckey && !client)
SSghostroles.add_spawn_atom("borer", src)
name = initial(name) + " ([number])"
real_name = name
/mob/living/simple_animal/borer/Destroy()
QDEL_NULL(ability_bar)
@@ -159,8 +159,8 @@
update_icon()
return
if(istype(O, /obj/item/stool))
var/obj/item/stool/S = O
if(istype(O, /obj/structure/bed/stool))
var/obj/structure/bed/stool/S = O
src.visible_message(SPAN_NOTICE("[src] starts to dismantle \the [S]."))
busy = 2
update_icon()
-35
View File
@@ -348,41 +348,6 @@
face_atom(A)
return 1
/datum/mobl // I have no idea what the fuck this is, but it's better for it to be a datum than an /obj/effect.
var/list/container = list()
var/master
/mob/proc/ret_grab(datum/mobl/L, flag)
if ((!( istype(l_hand, /obj/item/grab) ) && !( istype(r_hand, /obj/item/grab) )))
if (!( L ))
return null
else
return L.container
else
if (!( L ))
L = new /datum/mobl
L.container += src
L.master = src
if (istype(l_hand, /obj/item/grab))
var/obj/item/grab/G = l_hand
if (!(L.container.Find(G.affecting)))
L.container += G.affecting
if (G.affecting)
G.affecting.ret_grab(L, 1)
if (istype(r_hand, /obj/item/grab))
var/obj/item/grab/G = r_hand
if (!(L.container.Find(G.affecting)))
L.container += G.affecting
if (G.affecting)
G.affecting.ret_grab(L, 1)
if (!( flag ))
if (L.master == src)
var/list/temp = L.container.Copy()
qdel(L)
return temp
else
return L.container
return
/mob/verb/mode()
set name = "Activate Held Object"
+41 -22
View File
@@ -116,15 +116,16 @@
if(state <= GRAB_AGGRESSIVE)
allow_upgrade = 1
//disallow upgrading if we're grabbing more than one person
if((assailant.l_hand && assailant.l_hand != src && istype(assailant.l_hand, /obj/item/grab)))
var/obj/item/grab/G = assailant.l_hand
if(G.affecting != affecting)
allow_upgrade = 0
if((assailant.r_hand && assailant.r_hand != src && istype(assailant.r_hand, /obj/item/grab)))
var/obj/item/grab/G = assailant.r_hand
if(G.affecting != affecting)
allow_upgrade = 0
if(!assailant.species.can_double_fireman_carry())
//disallow upgrading if we're grabbing more than one person
if((assailant.l_hand && assailant.l_hand != src && istype(assailant.l_hand, /obj/item/grab)))
var/obj/item/grab/G = assailant.l_hand
if(G.affecting != affecting)
allow_upgrade = 0
if((assailant.r_hand && assailant.r_hand != src && istype(assailant.r_hand, /obj/item/grab)))
var/obj/item/grab/G = assailant.r_hand
if(G.affecting != affecting)
allow_upgrade = 0
//disallow upgrading past aggressive if we're being grabbed aggressively
for(var/obj/item/grab/G in affecting.grabbed_by)
@@ -448,7 +449,7 @@
if(state < GRAB_AGGRESSIVE)
to_chat(H, SPAN_WARNING("You need an aggressive grab before you can fireman carry someone!"))
return
if(H.get_inactive_hand())
if(H.get_inactive_hand() && !H.species.can_double_fireman_carry())
to_chat(H, SPAN_WARNING("Your other hand must be empty to fireman carry someone!"))
return
@@ -460,12 +461,15 @@
if(affecting.buckled_to)
return
if(H.get_inactive_hand())
if(H.get_inactive_hand() && !H.species.can_double_fireman_carry())
to_chat(H, SPAN_WARNING("Your other hand must be empty to fireman carry someone!"))
return
var/obj/item/grab/offhand/OH = new /obj/item/grab/offhand(H, H, affecting, src)
H.put_in_hands(OH)
if(H.species.can_double_fireman_carry())
set_wielding()
else
var/obj/item/grab/offhand/OH = new /obj/item/grab/offhand(H, H, affecting, src)
H.put_in_hands(OH)
H.visible_message("<b>[H]</b> lifts \the [affecting] onto their shoulders!", SPAN_NOTICE("You lift \the [affecting] onto your shoulders!"))
@@ -474,28 +478,43 @@
adjust_position()
moved_event.register(assailant, src, /obj/item/grab/proc/move_affecting)
/obj/item/grab/proc/set_wielding()
wielded = TRUE
state = GRAB_AGGRESSIVE
icon_state = "!reinforce"
hud.icon_state = "!reinforce"
/obj/item/grab/proc/move_affecting()
if(affecting && assailant.Adjacent(affecting)) // Only move if it's near us.
affecting.forceMove(assailant.loc)
/obj/item/grab/can_swap_hands(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.species.can_double_fireman_carry())
return TRUE
if(wielded)
return FALSE
return ..()
/obj/item/grab/proc/get_grab_type()
if(wielded)
return MOB_GRAB_FIREMAN
return MOB_GRAB_NORMAL
/obj/item/grab/offhand
icon_state = "!reinforce"
/obj/item/grab/offhand/Initialize(mapload, mob/user, mob/victim, var/obj/item/grab/linked)
. = ..()
set_wielding()
linked_grab = linked
linked.linked_grab = src
linked_grab.wielded = TRUE
linked_grab.state = GRAB_AGGRESSIVE
icon_state = "!reinforce"
hud.icon_state = "!reinforce"
linked_grab.icon_state = "!reinforce"
linked_grab.hud.icon_state = "!reinforce"
linked_grab.set_wielding()
/obj/item/grab/offhand/process()
return
/obj/item/grab/offhand/adjust_position()
return
return
+2 -17
View File
@@ -1066,7 +1066,7 @@ proc/is_blind(A)
#undef SAFE_PERP
/mob/proc/get_multitool(var/obj/P)
if(P.ismultitool())
if(P?.ismultitool())
return P
/mob/abstract/observer/get_multitool()
@@ -1166,7 +1166,7 @@ proc/is_blind(A)
return species.handle_stance_damage(src, TRUE) >= 4
/mob/living/carbon/human/proc/equip_wheelchair()
var/obj/structure/bed/chair/wheelchair/W = new(get_turf(src))
var/obj/structure/bed/stool/chair/office/wheelchair/W = new(get_turf(src))
if(isturf(loc))
buckled_to = W
update_canmove()
@@ -1244,21 +1244,6 @@ proc/is_blind(A)
if(ear && speaker_coverage[ear])
return TRUE
/mob/proc/has_grab()
. = MOB_GRAB_NONE
if(istype(l_hand, /obj/item/grab))
var/obj/item/grab/l_grab = l_hand
if(l_grab.wielded)
. = max(MOB_GRAB_FIREMAN, .)
else
. = max(MOB_GRAB_NORMAL, .)
if(istype(r_hand, /obj/item/grab))
var/obj/item/grab/r_grab = r_hand
if(r_grab.wielded)
. = max(MOB_GRAB_FIREMAN, .)
else
. = max(MOB_GRAB_NORMAL, .)
/mob/proc/handle_vision()
return
+11 -38
View File
@@ -280,7 +280,7 @@
//TODO: Fuck wheelchairs.
//Toss away all this snowflake code here, and rewrite wheelchairs as a vehicle.
else if(istype(mob.buckled_to, /obj/structure/bed/chair/wheelchair))
else if(istype(mob.buckled_to, /obj/structure/bed/stool/chair/office/wheelchair))
var/min_move_delay = 0
if(ishuman(mob.buckled_to))
var/mob/living/carbon/human/driver = mob.buckled_to
@@ -325,7 +325,7 @@
//Wheelchair pushing goes here for now.
//TODO: Fuck wheelchairs.
if(istype(mob.pulledby, /obj/structure/bed/chair/wheelchair) || istype(mob.pulledby, /obj/structure/janitorialcart))
if(istype(mob.pulledby, /obj/structure/bed/stool/chair/office/wheelchair) || istype(mob.pulledby, /obj/structure/janitorialcart))
move_delay += 1
return mob.pulledby.relaymove(mob, direct)
@@ -333,43 +333,16 @@
//We are now going to move
moving = 1
//Something with pulling things
var/grab_level = mob.has_grab()
if(grab_level == MOB_GRAB_FIREMAN)
move_delay++
if (mob_is_human && grab_level == MOB_GRAB_NORMAL)
move_delay = max(move_delay, world.time + 7)
var/list/L = mob.ret_grab()
if(istype(L, /list))
if(L.len == 2)
L -= mob
var/mob/M = L[1]
if(M)
if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
var/turf/T = mob.loc
. = ..()
if (isturf(M.loc))
var/diag = get_dir(mob, M)
if ((diag - 1) & diag)
else
diag = null
if ((get_dist(mob, M) > 1 || diag))
step(M, get_dir(M.loc, T))
else
for(var/mob/M in L)
M.other_mobs = 1
if(mob != M)
M.animate_movement = 3
for(var/mob/M in L)
spawn( 0 )
step(M, direct)
return
spawn( 1 )
M.other_mobs = null
M.animate_movement = 2
return
if(mob_is_human)
for(var/obj/item/grab/G in list(mob.l_hand, mob.r_hand))
switch(G.get_grab_type())
if(MOB_GRAB_FIREMAN)
move_delay++
if(MOB_GRAB_NORMAL)
move_delay = max(move_delay, world.time + 7)
step(G.affecting, get_dir(G.affecting.loc, mob.loc))
else if(mob.confused && prob(25) && mob.m_intent == M_RUN)
if(mob.confused && prob(25) && mob.m_intent == M_RUN)
step(mob, pick(cardinal))
else
. = mob.SelfMove(n, direct)