mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-26 22:42:26 +01:00
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:
@@ -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)
|
||||
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!" ))
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user