Merge remote-tracking branch 'origin/master' into rustsql
This commit is contained in:
@@ -146,10 +146,58 @@
|
||||
if(dbflags & DB_FLAG_AGE_CONFIRMATION_INCOMPLETE) //they have not completed age gate
|
||||
var/age_verification = age_gate()
|
||||
if(age_verification != 1)
|
||||
client.add_system_note("Automated-Age-Gate", "Failed automatic age gate process")
|
||||
client.add_system_note("Automated-Age-Gate", "Failed automatic age gate process.")
|
||||
//ban them and kick them
|
||||
AddBan(client.ckey, client.computer_id, "SYSTEM BAN - Inputted date during join verification was under 18 years of age. Contact administration on discord for verification.", "SYSTEM", FALSE, null, client.address)
|
||||
|
||||
//parameters used by sql line, easier to read:
|
||||
var/bantype_str = "ADMIN_PERMABAN"
|
||||
var/reason = "SYSTEM BAN - Inputted date during join verification was under 18 years of age. Contact administration on discord for verification."
|
||||
var/duration = -1
|
||||
var/sql_ckey = sanitizeSQL(client.ckey)
|
||||
var/computerid = client.computer_id
|
||||
if(!computerid)
|
||||
computerid = "0"
|
||||
var/sql_computerid = sanitizeSQL(computerid)
|
||||
var/ip = client.address
|
||||
if(!ip)
|
||||
ip = "0.0.0.0"
|
||||
var/sql_ip = sanitizeSQL(ip)
|
||||
|
||||
//parameter not used as there's no job but i want to fill out all parameters for the insert line
|
||||
var/sql_job
|
||||
|
||||
// these are typically the banning admin's, but it's the system so we leave them null, but they're still here for the sake of a full set of values
|
||||
var/sql_a_ckey
|
||||
var/sql_a_computerid
|
||||
var/sql_a_ip
|
||||
|
||||
// record all admins and non-admins online at the time
|
||||
var/who
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(!who)
|
||||
who = "[C]"
|
||||
else
|
||||
who += ", [C]"
|
||||
|
||||
var/adminwho
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(!adminwho)
|
||||
adminwho = "[C]"
|
||||
else
|
||||
adminwho += ", [C]"
|
||||
|
||||
var/sql = "INSERT INTO [format_table_name("ban")] (`bantime`,`server_ip`,`server_port`,`round_id`,`bantype`,`reason`,`job`,`duration`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]', '[bantype_str]', '[reason]', '[sql_job]', [(duration)?"[duration]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[sql_ckey]', '[sql_computerid]', INET_ATON('[sql_ip]'), '[sql_a_ckey]', '[sql_a_computerid]', INET_ATON('[sql_a_ip]'), '[who]', '[adminwho]')"
|
||||
var/datum/DBQuery/query_add_ban = SSdbcore.NewQuery(sql)
|
||||
qdel(query_add_ban)
|
||||
|
||||
// announce this
|
||||
message_admins("[html_encode(client.ckey)] has been banned for failing the automatic age gate.")
|
||||
send2irc("[html_encode(client.ckey)] has been banned for failing the automatic age gate.")
|
||||
|
||||
// removing the client disconnects them
|
||||
qdel(client)
|
||||
|
||||
|
||||
return FALSE
|
||||
else
|
||||
//they claim to be of age, so allow them to continue and update their flags
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
datum/sprite_accessory/caps
|
||||
/datum/sprite_accessory/caps
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
color_src = HAIR
|
||||
relevant_layers = list(BODY_ADJ_LAYER)
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
name = "Bald"
|
||||
icon_state = "bald"
|
||||
|
||||
/datum/sprite_accessory/hair/adhara
|
||||
name = "Adhara"
|
||||
icon_state = "hair_adhara"
|
||||
|
||||
/datum/sprite_accessory/hair/afro
|
||||
name = "Afro"
|
||||
icon_state = "hair_afro"
|
||||
@@ -29,6 +33,14 @@
|
||||
name = "Ahoge"
|
||||
icon_state = "hair_antenna"
|
||||
|
||||
/datum/sprite_accessory/hair/amazon
|
||||
name = "Amazon"
|
||||
icon_state = "hair_amazon"
|
||||
|
||||
/datum/sprite_accessory/hair/anita
|
||||
name = "Anita"
|
||||
icon_state = "hair_anita"
|
||||
|
||||
/datum/sprite_accessory/hair/balding
|
||||
name = "Balding Hair"
|
||||
icon_state = "hair_e"
|
||||
@@ -61,6 +73,18 @@
|
||||
name = "Beehive 2"
|
||||
icon_state = "hair_beehive2"
|
||||
|
||||
/datum/sprite_accessory/hair/belenko
|
||||
name = "Beleneko"
|
||||
icon_state = "hair_belenko"
|
||||
|
||||
/datum/sprite_accessory/hair/belenkotied
|
||||
name = "Belenko (Tied)"
|
||||
icon_state = "hair_belenkotied"
|
||||
|
||||
/datum/sprite_accessory/hair/belle
|
||||
name = "Belle"
|
||||
icon_state = "hair_belle"
|
||||
|
||||
/datum/sprite_accessory/hair/bob
|
||||
name = "Bob Hair"
|
||||
icon_state = "hair_bob"
|
||||
@@ -309,6 +333,10 @@
|
||||
name = "Flow Hair"
|
||||
icon_state = "hair_f"
|
||||
|
||||
/datum/sprite_accessory/hair/fluffy
|
||||
name = "Fluffy"
|
||||
icon_state = "hair_fluffy"
|
||||
|
||||
/datum/sprite_accessory/hair/fringetail
|
||||
name = "Fringe Tail"
|
||||
icon_state = "hair_fringetail"
|
||||
@@ -365,6 +393,10 @@
|
||||
name = "Hitop"
|
||||
icon_state = "hair_hitop"
|
||||
|
||||
/datum/sprite_accessory/hair/inkling
|
||||
name = "Inkling"
|
||||
icon_state = "hair_inkling"
|
||||
|
||||
/datum/sprite_accessory/hair/jade
|
||||
name = "Jade"
|
||||
icon_state = "hair_jade"
|
||||
@@ -373,6 +405,10 @@
|
||||
name = "Jensen"
|
||||
icon_state = "hair_jensen"
|
||||
|
||||
/datum/sprite_accessory/hair/jessica
|
||||
name = "Jessica"
|
||||
icon_state = "hair_jessica"
|
||||
|
||||
/datum/sprite_accessory/hair/joestar
|
||||
name = "Joestar"
|
||||
icon_state = "hair_joestar"
|
||||
@@ -389,6 +425,10 @@
|
||||
name = "Kusanagi"
|
||||
icon_state = "hair_kusanagi"
|
||||
|
||||
/datum/sprite_accessory/hair/kleeia
|
||||
name = "Kleeia"
|
||||
icon_state = "hair_kleeia"
|
||||
|
||||
/datum/sprite_accessory/hair/long
|
||||
name = "Long Hair 1"
|
||||
icon_state = "hair_long"
|
||||
@@ -445,6 +485,10 @@
|
||||
name = "Mohawk"
|
||||
icon_state = "hair_d"
|
||||
|
||||
/datum/sprite_accessory/hair/newyou
|
||||
name = "New You"
|
||||
icon_state = "hair_newyou"
|
||||
|
||||
/datum/sprite_accessory/hair/reversemohawk
|
||||
name = "Mohawk (Reverse)"
|
||||
icon_state = "hair_reversemohawk"
|
||||
@@ -575,6 +619,10 @@
|
||||
name = "Ponytail (Side) 4"
|
||||
icon_state = "hair_sidetail4"
|
||||
|
||||
/datum/sprite_accessory/hair/sharptail
|
||||
name = "Ponytail (Sharp)"
|
||||
icon_state = "hair_sharptail"
|
||||
|
||||
/datum/sprite_accessory/hair/spikytail
|
||||
name = "Ponytail (Spiky)"
|
||||
icon_state = "hair_spikyponytail"
|
||||
@@ -679,6 +727,26 @@
|
||||
name = "Skinhead"
|
||||
icon_state = "hair_skinhead"
|
||||
|
||||
/datum/sprite_accessory/hair/simple
|
||||
name = "Simple"
|
||||
icon_state = "hair_simple"
|
||||
|
||||
/datum/sprite_accessory/hair/skrellvshort
|
||||
name = "Skrell Replicant (Very Short)"
|
||||
icon_state = "hair_skrellvshort"
|
||||
|
||||
/datum/sprite_accessory/hair/skrellshort
|
||||
name = "Skrell Replicant (Short)"
|
||||
icon_state = "hair_skrellshort"
|
||||
|
||||
/datum/sprite_accessory/hair/skrell
|
||||
name = "Skrell Replicant (Average)"
|
||||
icon_state = "hair_skrell"
|
||||
|
||||
/datum/sprite_accessory/hair/skrelllong
|
||||
name = "Skrell Replicant (Long)"
|
||||
icon_state = "hair_skrelllong"
|
||||
|
||||
/datum/sprite_accessory/hair/sleaze
|
||||
name = "Sleaze"
|
||||
icon_state = "hair_sleaze"
|
||||
@@ -699,6 +767,10 @@
|
||||
name = "Spiky 3"
|
||||
icon_state = "hair_spiky2"
|
||||
|
||||
/datum/sprite_accessory/hair/supernova
|
||||
name = "Supernova"
|
||||
icon_state = "hair_supernova"
|
||||
|
||||
/datum/sprite_accessory/hair/swept
|
||||
name = "Swept Back Hair"
|
||||
icon_state = "hair_swept"
|
||||
@@ -743,6 +815,10 @@
|
||||
name = "Trimmed (Flat)"
|
||||
icon_state = "hair_trimflat"
|
||||
|
||||
/datum/sprite_accessory/hair/twincurls
|
||||
name = "Twincurls"
|
||||
icon_state = "hair_twincurls"
|
||||
|
||||
/datum/sprite_accessory/hair/twintails
|
||||
name = "Twintails"
|
||||
icon_state = "hair_twintail"
|
||||
@@ -787,6 +863,10 @@
|
||||
name = "Very Short Over Eye (Alt)"
|
||||
icon_state = "hair_veryshortovereyealternate"
|
||||
|
||||
/datum/sprite_accessory/hair/vivi
|
||||
name = "Vivi"
|
||||
icon_state = "hair_vivi"
|
||||
|
||||
/datum/sprite_accessory/hair/volaju
|
||||
name = "Volaju"
|
||||
icon_state = "hair_volaju"
|
||||
|
||||
@@ -11,6 +11,11 @@
|
||||
|
||||
// please make sure they're sorted alphabetically and categorized
|
||||
|
||||
/datum/sprite_accessory/underwear/socks/garter
|
||||
name = "Garter"
|
||||
icon_state = "garter"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/sprite_accessory/underwear/socks/socks_knee
|
||||
name = "Knee-high"
|
||||
icon_state = "socks_knee"
|
||||
@@ -83,6 +88,10 @@
|
||||
name = "Pantyhose"
|
||||
icon_state = "pantyhose"
|
||||
|
||||
/datum/sprite_accessory/underwear/socks/pantyhose_ripped
|
||||
name = "Pantyhose - Ripped"
|
||||
icon_state = "pantyhose_ripped"
|
||||
|
||||
/datum/sprite_accessory/underwear/socks/socks_short
|
||||
name = "Short"
|
||||
icon_state = "socks_short"
|
||||
|
||||
@@ -757,7 +757,7 @@
|
||||
icon_state = "husky"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
datum/sprite_accessory/tails/mam_tails/insect
|
||||
/datum/sprite_accessory/tails/mam_tails/insect
|
||||
name = "Insect"
|
||||
icon_state = "insect"
|
||||
matrixed_sections = MATRIX_RED
|
||||
|
||||
@@ -343,6 +343,20 @@
|
||||
icon_state = "fishnet_body"
|
||||
gender = FEMALE
|
||||
|
||||
/datum/sprite_accessory/underwear/top/shibari
|
||||
name = "Shibari Ropes"
|
||||
icon_state = "shibari"
|
||||
gender = FEMALE
|
||||
has_color = TRUE
|
||||
covers_chest = FALSE
|
||||
|
||||
/datum/sprite_accessory/underwear/top/shibari_sleeved
|
||||
name = "Shibari Ropes - sleeves"
|
||||
icon_state = "shibari_sleeves"
|
||||
gender = FEMALE
|
||||
has_color = TRUE
|
||||
covers_chest = FALSE
|
||||
|
||||
/datum/sprite_accessory/underwear/top/swimsuit
|
||||
name = "Swimsuit Top"
|
||||
icon_state = "bra_swimming"
|
||||
|
||||
@@ -556,7 +556,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
var/list/dest = list() //List of possible destinations (mobs)
|
||||
var/target = null //Chosen target.
|
||||
|
||||
dest += getpois(mobs_only=1) //Fill list, prompt user with list
|
||||
dest += getpois(mobs_only = TRUE) //Fill list, prompt user with list
|
||||
target = input("Please, select a player!", "Jump to Mob", null, null) as null|anything in dest
|
||||
|
||||
if (!target)//Make sure we actually have a target
|
||||
@@ -893,7 +893,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if (!eye_name)
|
||||
return
|
||||
|
||||
var/mob/mob_eye = creatures[eye_name]
|
||||
do_observe(creatures[eye_name])
|
||||
|
||||
/mob/dead/observer/proc/do_observe(mob/mob_eye)
|
||||
//Istype so we filter out points of interest that are not mobs
|
||||
if(client && mob_eye && istype(mob_eye))
|
||||
client.eye = mob_eye
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/orbit_menu
|
||||
var/mob/dead/observer/owner
|
||||
var/auto_observe = FALSE
|
||||
|
||||
/datum/orbit_menu/New(mob/dead/observer/new_owner)
|
||||
if(!istype(new_owner))
|
||||
@@ -10,6 +11,7 @@
|
||||
return GLOB.observer_state
|
||||
|
||||
/datum/orbit_menu/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if (!ui)
|
||||
ui = new(user, src, "Orbit")
|
||||
ui.open()
|
||||
@@ -18,15 +20,35 @@
|
||||
if (..())
|
||||
return
|
||||
|
||||
if (action == "orbit")
|
||||
var/ref = params["ref"]
|
||||
var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list)
|
||||
if (poi != null)
|
||||
switch(action)
|
||||
if ("orbit")
|
||||
var/ref = params["ref"]
|
||||
var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list)
|
||||
if (poi == null)
|
||||
. = TRUE
|
||||
return
|
||||
owner.ManualFollow(poi)
|
||||
owner.reset_perspective(null)
|
||||
if (auto_observe)
|
||||
owner.do_observe(poi)
|
||||
. = TRUE
|
||||
if ("refresh")
|
||||
update_static_data(owner, ui)
|
||||
. = TRUE
|
||||
if ("toggle_observe")
|
||||
auto_observe = !auto_observe
|
||||
if (auto_observe && owner.orbit_target)
|
||||
owner.do_observe(owner.orbit_target)
|
||||
else
|
||||
owner.reset_perspective(null)
|
||||
|
||||
/datum/orbit_menu/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["auto_observe"] = auto_observe
|
||||
return data
|
||||
|
||||
/datum/orbit_menu/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
var/list/alive = list()
|
||||
var/list/antagonists = list()
|
||||
var/list/dead = list()
|
||||
@@ -34,7 +56,7 @@
|
||||
var/list/misc = list()
|
||||
var/list/npcs = list()
|
||||
|
||||
var/list/pois = getpois(skip_mindless = 1)
|
||||
var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE)
|
||||
for (var/name in pois)
|
||||
var/list/serialized = list()
|
||||
serialized["name"] = name
|
||||
@@ -80,7 +102,7 @@
|
||||
data["npcs"] = npcs
|
||||
|
||||
return data
|
||||
|
||||
|
||||
/datum/orbit_menu/ui_assets()
|
||||
. = ..() || list()
|
||||
. += get_asset_datum(/datum/asset/simple/orbit)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//This is the proc for gibbing a mob. Cannot gib ghosts.
|
||||
//added different sort of gibs and animations. N
|
||||
/mob/proc/gib()
|
||||
/mob/proc/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
|
||||
return
|
||||
|
||||
//This is the proc for turning a mob into ash. Mostly a copy of gib code (above).
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
gender = FEMALE //All xenos are girls!!
|
||||
dna = null
|
||||
faction = list(ROLE_ALIEN)
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
sight = SEE_MOBS
|
||||
see_in_dark = 4
|
||||
verb_say = "hisses"
|
||||
@@ -12,6 +11,10 @@
|
||||
bubble_icon = "alien"
|
||||
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
|
||||
|
||||
/// Whether they can ventcrawl; this is set individually for 'humanoid' and 'royal' types
|
||||
/// 'royal' types (Praetorian, Queen) cannot ventcrawl
|
||||
var/can_ventcrawl
|
||||
|
||||
/// How much brute damage without armor piercing they do against mobs in melee
|
||||
var/meleeSlashHumanPower = 20
|
||||
/// How much power they have for DefaultCombatKnockdown when attacking humans
|
||||
@@ -19,7 +22,6 @@
|
||||
/// How much brute damage they do to simple animals
|
||||
var/meleeSlashSAPower = 35
|
||||
|
||||
var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie
|
||||
var/has_fine_manipulation = 0
|
||||
var/move_delay_add = 0 // movement delay to add
|
||||
|
||||
@@ -40,6 +42,9 @@
|
||||
|
||||
create_internal_organs()
|
||||
|
||||
if(can_ventcrawl)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/alien/create_internal_organs()
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
bodyparts = list(/obj/item/bodypart/chest/alien, /obj/item/bodypart/head/alien, /obj/item/bodypart/l_arm/alien,
|
||||
/obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_leg/alien, /obj/item/bodypart/l_leg/alien)
|
||||
|
||||
can_ventcrawl = TRUE
|
||||
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/humanoid/Initialize()
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
//Common stuffs for Praetorian and Queen
|
||||
icon = 'icons/mob/alienqueen.dmi'
|
||||
status_flags = 0
|
||||
ventcrawler = VENTCRAWLER_NONE //pull over that ass too fat
|
||||
unique_name = 0
|
||||
pixel_x = -16
|
||||
bubble_icon = "alienroyal"
|
||||
@@ -10,6 +9,7 @@
|
||||
layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles
|
||||
pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3)
|
||||
can_ventcrawl = FALSE
|
||||
|
||||
meleeKnockdownPower = 125
|
||||
meleeSlashHumanPower = 30
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
|
||||
can_ventcrawl = TRUE
|
||||
|
||||
var/amount_grown = 0
|
||||
var/max_grown = 100
|
||||
var/time_of_birth
|
||||
|
||||
@@ -434,6 +434,9 @@
|
||||
legcuffed.forceMove(drop_location())
|
||||
legcuffed = null
|
||||
I.dropped(src)
|
||||
if(istype(I, /obj/item/restraints/legcuffs))
|
||||
var/obj/item/restraints/legcuffs/lgcf = I
|
||||
lgcf.on_removed()
|
||||
update_inv_legcuffed()
|
||||
return
|
||||
else
|
||||
@@ -1229,3 +1232,25 @@
|
||||
*/
|
||||
/mob/living/carbon/proc/get_biological_state()
|
||||
return BIO_FLESH_BONE
|
||||
|
||||
/mob/living/carbon/altattackby(obj/item/W, mob/living/carbon/user, params)
|
||||
if(user.incapacitated() || !user.Adjacent(src))
|
||||
return FALSE
|
||||
if(W && user.a_intent == INTENT_HELP && W.can_give())
|
||||
user.give()
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/verb/give_verb()
|
||||
set src in oview(1)
|
||||
set category = "IC"
|
||||
set name = "Give"
|
||||
|
||||
if(usr.incapacitated() || !usr.Adjacent(src))
|
||||
return
|
||||
|
||||
if(!usr.get_active_held_item()) // Let me know if this has any problems -Yota
|
||||
return
|
||||
var/obj/item/I = usr.get_active_held_item()
|
||||
var/mob/living/carbon/C = usr
|
||||
if(I.can_give())
|
||||
C.give()
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
if(SSticker.mode)
|
||||
SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
|
||||
|
||||
/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts)
|
||||
/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
|
||||
var/atom/Tsec = drop_location()
|
||||
for(var/mob/M in src)
|
||||
if(M in stomach_contents)
|
||||
@@ -27,7 +27,7 @@
|
||||
"<span class='danger'>You burst out of [src]!</span>")
|
||||
..()
|
||||
|
||||
/mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts)
|
||||
/mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
|
||||
var/atom/Tsec = drop_location()
|
||||
if(!no_bodyparts)
|
||||
if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop.
|
||||
@@ -41,6 +41,8 @@
|
||||
qdel(O) //so the brain isn't transfered to the head when the head drops.
|
||||
continue
|
||||
if(!(O.organ_flags & ORGAN_NO_DISMEMBERMENT) && check_zone(O.zone) == BODY_ZONE_CHEST)
|
||||
if(was_explosion)
|
||||
LAZYADD(O.acted_explosions, was_explosion.explosion_id)
|
||||
O.Remove()
|
||||
O.forceMove(Tsec)
|
||||
O.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
|
||||
@@ -50,13 +52,16 @@
|
||||
if(I.organ_flags & ORGAN_NO_DISMEMBERMENT || (no_brain && istype(I, /obj/item/organ/brain)) || (no_organs && !istype(I, /obj/item/organ/brain)))
|
||||
qdel(I)
|
||||
continue
|
||||
if(was_explosion)
|
||||
LAZYADD(I.acted_explosions, was_explosion.explosion_id)
|
||||
I.Remove()
|
||||
I.forceMove(Tsec)
|
||||
I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
|
||||
|
||||
|
||||
/mob/living/carbon/spread_bodyparts()
|
||||
/mob/living/carbon/spread_bodyparts(no_brain, no_organs, datum/explosion/was_explosion)
|
||||
for(var/X in bodyparts)
|
||||
var/obj/item/bodypart/BP = X
|
||||
if(was_explosion)
|
||||
LAZYADD(BP.acted_explosions, was_explosion.explosion_id)
|
||||
BP.drop_limb()
|
||||
BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
|
||||
|
||||
@@ -281,11 +281,13 @@
|
||||
dropItemToGround(pocket_item)
|
||||
if(!usr.can_hold_items() || !usr.put_in_hands(pocket_item))
|
||||
pocket_item.forceMove(drop_location())
|
||||
log_combat(usr, src, "pickpocketed of item: [pocket_item]")
|
||||
else
|
||||
if(place_item)
|
||||
if(place_item.mob_can_equip(src, usr, pocket_id, FALSE, TRUE))
|
||||
usr.temporarilyRemoveItemFromInventory(place_item, TRUE)
|
||||
equip_to_slot(place_item, pocket_id, TRUE)
|
||||
log_combat(usr, src, "placed item [place_item] onto")
|
||||
//do nothing otherwise
|
||||
|
||||
// Update strip window
|
||||
@@ -293,8 +295,9 @@
|
||||
show_inv(usr)
|
||||
else
|
||||
// Display a warning if the user mocks up
|
||||
if (!strip_silence)
|
||||
if(!strip_silence)
|
||||
to_chat(src, "<span class='warning'>You feel your [pocket_side] pocket being fumbled with!</span>")
|
||||
log_combat(usr, src, "failed to [pocket_item ? "pickpocket item [pocket_item] from" : "place item [place_item] onto "]")
|
||||
|
||||
if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY, null, FALSE))
|
||||
// separate from first canusetopic
|
||||
@@ -938,43 +941,43 @@
|
||||
admin_ticket_log(src, msg)
|
||||
|
||||
/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user)
|
||||
if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS)
|
||||
var/GS_needed = istype(target, /mob/living/silicon/pai)? GRAB_PASSIVE : GRAB_AGGRESSIVE
|
||||
if(pulling == target && grab_state >= GS_needed && stat == CONSCIOUS)
|
||||
//If they dragged themselves and we're currently aggressively grabbing them try to piggyback
|
||||
if(user == target && can_piggyback(target))
|
||||
piggyback(target)
|
||||
return
|
||||
//If you dragged them to you and you're aggressively grabbing try to fireman carry them
|
||||
else if(user != target)
|
||||
else if(user == src)
|
||||
if(user.a_intent == INTENT_GRAB)
|
||||
fireman_carry(target)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
//src is the user that will be carrying, target is the mob to be carried
|
||||
/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target)
|
||||
return (istype(target) && target.stat == CONSCIOUS)
|
||||
/mob/living/carbon/human/proc/can_piggyback(mob/living/target)
|
||||
return (iscarbon(target) || ispAI(target)) && target.stat == CONSCIOUS
|
||||
|
||||
/mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target)
|
||||
return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND))
|
||||
return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND)) || ispAI(target)
|
||||
|
||||
/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target)
|
||||
var/carrydelay = 50 //if you have latex you are faster at grabbing
|
||||
var/skills_space = "" //cobby told me to do this
|
||||
if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY))
|
||||
carrydelay = 30
|
||||
skills_space = "expertly"
|
||||
skills_space = "expertly "
|
||||
else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY))
|
||||
carrydelay = 40
|
||||
skills_space = "quickly"
|
||||
skills_space = "quickly "
|
||||
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
|
||||
visible_message("<span class='notice'>[src] starts [skills_space] lifting [target] onto their back..</span>",
|
||||
visible_message("<span class='notice'>[src] starts [skills_space]lifting [target] onto their back..</span>",
|
||||
//Joe Medic starts quickly/expertly lifting Grey Tider onto their back..
|
||||
"<span class='notice'>[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]</span>")
|
||||
"<span class='notice'>[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space]start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]</span>")
|
||||
//(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...)
|
||||
if(do_after(src, carrydelay, TRUE, target))
|
||||
//Second check to make sure they're still valid to be carried
|
||||
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
|
||||
target.set_resting(FALSE, TRUE)
|
||||
buckle_mob(target, TRUE, TRUE, 90, 1, 0, TRUE)
|
||||
return
|
||||
visible_message("<span class='warning'>[src] fails to fireman carry [target]!")
|
||||
@@ -992,13 +995,13 @@
|
||||
if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
|
||||
target.visible_message("<span class='warning'>[target] can't hang onto [src]!</span>")
|
||||
return
|
||||
buckle_mob(target, TRUE, TRUE, FALSE, 1, 2, FALSE)
|
||||
buckle_mob(target, TRUE, TRUE, 0, 1, 2, FALSE)
|
||||
else
|
||||
visible_message("<span class='warning'>[target] fails to climb onto [src]!</span>")
|
||||
else
|
||||
to_chat(target, "<span class='warning'>You can't piggyback ride [src] right now!</span>")
|
||||
|
||||
/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0, fireman = FALSE)
|
||||
/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = 0, hands_needed = 0, target_hands_needed = 0, fireman = FALSE)
|
||||
if(!force)//humans are only meant to be ridden through piggybacking and special cases
|
||||
return
|
||||
if(!is_type_in_typecache(target, can_ride_typecache))
|
||||
@@ -1010,6 +1013,9 @@
|
||||
riding_datum.ride_check_rider_restrained = TRUE
|
||||
if(buckled_mobs && ((target in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled)
|
||||
return
|
||||
if(istype(target, /mob/living/silicon/pai))
|
||||
hands_needed = 1
|
||||
target_hands_needed = 0
|
||||
var/equipped_hands_self
|
||||
var/equipped_hands_target
|
||||
if(hands_needed)
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
var/list/datum/bioware = list()
|
||||
|
||||
var/creamed = FALSE //to use with creampie overlays
|
||||
var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot))
|
||||
var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot, /mob/living/silicon/pai))
|
||||
var/lastpuke = 0
|
||||
var/account_id
|
||||
var/last_fire_update
|
||||
@@ -95,9 +95,10 @@
|
||||
parry_efficiency_considered_successful = 0.01
|
||||
parry_efficiency_to_counterattack = 0.01
|
||||
parry_max_attacks = 3
|
||||
parry_cooldown = 30
|
||||
parry_failed_stagger_duration = 0
|
||||
parry_failed_clickcd_duration = 0.4
|
||||
parry_cooldown = 3 SECONDS
|
||||
parry_failed_cooldown_duration = 1.5 SECONDS
|
||||
parry_failed_stagger_duration = 1 SECONDS
|
||||
parry_failed_clickcd_duration = 0.4 SECONDS
|
||||
|
||||
parry_data = list( // yeah it's snowflake
|
||||
"UNARMED_PARRY_STAGGER" = 3 SECONDS,
|
||||
@@ -135,16 +136,16 @@
|
||||
parry_imperfect_falloff_percent = 20
|
||||
parry_efficiency_perfect = 100
|
||||
parry_efficiency_perfect_override = list(
|
||||
ATTACK_TYPE_PROJECTILE_TEXT = 60,
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 60,
|
||||
)
|
||||
|
||||
parry_efficiency_considered_successful = 0.01
|
||||
parry_efficiency_to_counterattack = 0.01
|
||||
parry_max_attacks = INFINITY
|
||||
parry_failed_cooldown_duration = 1.5 SECONDS
|
||||
parry_failed_stagger_duration = 0
|
||||
parry_cooldown = 0
|
||||
parry_failed_clickcd_duration = 0.8
|
||||
parry_failed_cooldown_duration = 3 SECONDS
|
||||
parry_failed_stagger_duration = 2 SECONDS
|
||||
parry_cooldown = 3 SECONDS
|
||||
parry_failed_clickcd_duration = 0.8 SECONDS
|
||||
|
||||
parry_data = list( // yeah it's snowflake
|
||||
"UNARMED_PARRY_STAGGER" = 3 SECONDS,
|
||||
|
||||
@@ -1425,8 +1425,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
|
||||
var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
|
||||
var/punchwoundbonus = user.dna.species.punchwoundbonus
|
||||
var/puncherstam = user.getStaminaLoss()
|
||||
var/puncherbrute = user.getBruteLoss()
|
||||
var/punchedstam = target.getStaminaLoss()
|
||||
var/punchedbrute = target.getBruteLoss()
|
||||
|
||||
@@ -1434,7 +1432,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
if(!SEND_SIGNAL(target, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
|
||||
damage *= 1.2
|
||||
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
|
||||
damage *= 0.8
|
||||
damage *= 0.65
|
||||
if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
|
||||
damage *= 0.8
|
||||
//END OF CITADEL CHANGES
|
||||
@@ -1446,19 +1444,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
if(!affecting) //Maybe the bodypart is missing? Or things just went wrong..
|
||||
affecting = target.get_bodypart(BODY_ZONE_CHEST) //target chest instead, as failsafe. Or hugbox? You decide.
|
||||
|
||||
var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases
|
||||
if(attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)
|
||||
miss_chance = 0
|
||||
else
|
||||
if(user.dna.species.punchdamagelow)
|
||||
if(atk_verb == ATTACK_EFFECT_KICK) //kicks never miss (provided your species deals more than 0 damage)
|
||||
miss_chance = 0
|
||||
else if(HAS_TRAIT(user, TRAIT_PUGILIST)) //pugilists, being good at Punching People, also never miss
|
||||
miss_chance = 0
|
||||
else
|
||||
miss_chance = min(10 + max(puncherstam * 0.5, puncherbrute * 0.5), 100) //probability of miss has a base of 10, and modified based on half brute total. Capped at max 100 to prevent weirdness in prob()
|
||||
|
||||
if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted
|
||||
if(!damage || !affecting)//future-proofing for species that have 0 damage/weird cases where no zone is targeted
|
||||
playsound(target.loc, user.dna.species.miss_sound, 25, TRUE, -1)
|
||||
target.visible_message("<span class='danger'>[user]'s [atk_verb] misses [target]!</span>", \
|
||||
"<span class='danger'>You avoid [user]'s [atk_verb]!</span>", "<span class='hear'>You hear a swoosh!</span>", null, COMBAT_MESSAGE_RANGE, null, \
|
||||
@@ -1796,12 +1782,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
"<span class='warning'>[M] attempted to touch you!</span>", target = M, \
|
||||
target_message = "<span class='warning'>You attempted to touch [H]!</span>")
|
||||
return TRUE
|
||||
if(M == H)
|
||||
althelp(M, H, attacker_style)
|
||||
return TRUE
|
||||
switch(M.a_intent)
|
||||
if(INTENT_HELP)
|
||||
if(M == H)
|
||||
althelp(M, H, attacker_style)
|
||||
return TRUE
|
||||
return FALSE
|
||||
if(INTENT_DISARM)
|
||||
altdisarm(M, H, attacker_style)
|
||||
return TRUE
|
||||
@@ -1987,6 +1971,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
H.show_message("<span class='notice'>The radiation beam dissipates harmlessly through your body.</span>")
|
||||
if(/obj/item/projectile/energy/florayield)
|
||||
H.show_message("<span class='notice'>The radiation beam dissipates harmlessly through your body.</span>")
|
||||
if(/obj/item/projectile/energy/florarevolution)
|
||||
H.show_message("<span class='notice'>The radiation beam dissipates harmlessly through your body.</span>")
|
||||
|
||||
/datum/species/proc/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
// called before a projectile hit
|
||||
|
||||
@@ -30,10 +30,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
|
||||
|
||||
/datum/species/dwarf/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
. = ..()
|
||||
var/dwarf_hair = pick("Beard (Dwarf)", "Beard (Very Long)", "Beard (Long)") //beard roullette
|
||||
var/mob/living/carbon/human/H = C
|
||||
H.facial_hair_style = dwarf_hair
|
||||
H.update_hair()
|
||||
H.AddElement(/datum/element/dwarfism, COMSIG_SPECIES_LOSS, src)
|
||||
RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) //We register handle_speech is being used.
|
||||
|
||||
|
||||
@@ -801,11 +801,11 @@
|
||||
|
||||
/datum/species/golem/plastic/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
. = ..()
|
||||
C.ventcrawler = VENTCRAWLER_NUDE
|
||||
C.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C)
|
||||
. = ..()
|
||||
C.ventcrawler = initial(C.ventcrawler)
|
||||
C.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/datum/species/golem/bronze
|
||||
name = "Bronze Golem"
|
||||
|
||||
@@ -64,6 +64,11 @@
|
||||
H.show_message("<span class='userdanger'>The radiation beam singes you!</span>")
|
||||
if(/obj/item/projectile/energy/florayield)
|
||||
H.adjust_nutrition(30, NUTRITION_LEVEL_FULL)
|
||||
if(/obj/item/projectile/energy/florarevolution)
|
||||
H.show_message("<span class='notice'>The radiation beam leaves you feeling disoriented!</span>")
|
||||
H.Dizzy(15)
|
||||
H.emote("flip")
|
||||
H.emote("spin")
|
||||
|
||||
/datum/species/pod/pseudo_weak
|
||||
name = "Anthromorphic Plant"
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
if(istype(H, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/SA = H
|
||||
if((human_caster.blood_volume <= (BLOOD_VOLUME_BAD*human_caster.blood_ratio)) || (ventcrawl_nude_only && length(human_caster.get_equipped_items(include_pockets = TRUE))))
|
||||
SA.ventcrawler = FALSE
|
||||
SA.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
if(transfer_name)
|
||||
H.name = human_caster.name
|
||||
|
||||
|
||||
@@ -159,3 +159,57 @@
|
||||
/mob/living/carbon/proc/get_holding_bodypart_of_item(obj/item/I)
|
||||
var/index = get_held_index_of_item(I)
|
||||
return index && hand_bodyparts[index]
|
||||
|
||||
/**
|
||||
* Proc called when giving an item to another player
|
||||
*
|
||||
* This handles creating an alert and adding an overlay to it
|
||||
*/
|
||||
/mob/living/carbon/proc/give(target)
|
||||
var/obj/item/receiving = get_active_held_item()
|
||||
if(!receiving)
|
||||
to_chat(src, "<span class='warning'>You're not holding anything to give!</span>")
|
||||
return
|
||||
visible_message("<span class='notice'>[src] is offering [receiving]</span>", \
|
||||
"<span class='notice'>You offer [receiving]</span>", null, 2)
|
||||
var/mob/living/carbon/targets = list()
|
||||
if(!target)
|
||||
for(var/mob/living/carbon/C in orange(1, src))
|
||||
if(!CanReach(C))
|
||||
return
|
||||
targets += C
|
||||
else
|
||||
targets += target
|
||||
if(!targets)
|
||||
return
|
||||
for(var/mob/living/carbon/C in targets)
|
||||
var/obj/screen/alert/give/G = C.throw_alert("[src]", /obj/screen/alert/give)
|
||||
if(!G)
|
||||
return
|
||||
G.setup(C, src, receiving)
|
||||
|
||||
/**
|
||||
* Proc called when the player clicks the give alert
|
||||
*
|
||||
* Handles checking if the player taking the item has open slots and is in range of the giver
|
||||
* Also deals with the actual transferring of the item to the players hands
|
||||
* Arguments:
|
||||
* * giver - The person giving the original item
|
||||
* * I - The item being given by the giver
|
||||
*/
|
||||
/mob/living/carbon/proc/take(mob/living/carbon/giver, obj/item/I)
|
||||
clear_alert("[giver]")
|
||||
if(get_dist(src, giver) > 1)
|
||||
to_chat(src, "<span class='warning'>[giver] is out of range! </span>")
|
||||
return
|
||||
if(!I || giver.get_active_held_item() != I)
|
||||
to_chat(src, "<span class='warning'>[giver] is no longer holding the item they were offering! </span>")
|
||||
return
|
||||
if(!get_empty_held_indexes())
|
||||
to_chat(src, "<span class='warning'>You have no empty hands!</span>")
|
||||
return
|
||||
if(!giver.temporarilyRemoveItemFromInventory(I))
|
||||
visible_message("<span class='notice'>[src] tries to hand over [I] but it's stuck to them....", \
|
||||
"<span class'notice'> You make a fool of yourself trying to give away an item stuck to your hands")
|
||||
return
|
||||
put_in_hands(I)
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
icon_state = ""
|
||||
gender = NEUTER
|
||||
pass_flags = PASSTABLE
|
||||
ventcrawler = VENTCRAWLER_NUDE
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
|
||||
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/monkey
|
||||
@@ -29,6 +28,8 @@
|
||||
create_bodyparts()
|
||||
create_internal_organs()
|
||||
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_NUDE)
|
||||
|
||||
. = ..()
|
||||
|
||||
if (cubespawned)
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
/mob/living/carbon/can_speak_vocal(message)
|
||||
if(silent)
|
||||
return 0
|
||||
if(get_message_language(message) == /datum/language/signlanguage && (handcuffed || (!src.get_bodypart(BODY_ZONE_L_ARM) && !src.get_bodypart(BODY_ZONE_R_ARM)) || get_num_held_items() == held_items.len))
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/could_speak_language(datum/language/language)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/gib(no_brain, no_organs, no_bodyparts)
|
||||
/mob/living/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
|
||||
var/prev_lying = lying
|
||||
if(stat != DEAD)
|
||||
death(1)
|
||||
@@ -6,22 +6,22 @@
|
||||
if(!prev_lying)
|
||||
gib_animation()
|
||||
|
||||
spill_organs(no_brain, no_organs, no_bodyparts)
|
||||
spill_organs(no_brain, no_organs, no_bodyparts, was_explosion)
|
||||
|
||||
if(!no_bodyparts)
|
||||
spread_bodyparts(no_brain, no_organs)
|
||||
spread_bodyparts(no_brain, no_organs, was_explosion)
|
||||
|
||||
for(var/X in implants)
|
||||
var/obj/item/implant/I = X
|
||||
qdel(I)
|
||||
|
||||
spawn_gibs(no_bodyparts)
|
||||
spawn_gibs(no_bodyparts, null, was_explosion)
|
||||
qdel(src)
|
||||
|
||||
/mob/living/proc/gib_animation()
|
||||
return
|
||||
|
||||
/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override)
|
||||
/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override, datum/explosion/was_explosion)
|
||||
var/location = loc_override ? loc_override.drop_location() : drop_location()
|
||||
if(mob_biotypes & MOB_ROBOTIC)
|
||||
new /obj/effect/gibspawner/robot(location, src, get_static_viruses())
|
||||
@@ -31,7 +31,7 @@
|
||||
/mob/living/proc/spill_organs()
|
||||
return
|
||||
|
||||
/mob/living/proc/spread_bodyparts()
|
||||
/mob/living/proc/spread_bodyparts(no_brain, no_organs, datum/explosion/was_explosion)
|
||||
return
|
||||
|
||||
/mob/living/dust(just_ash, drop_items, force)
|
||||
|
||||
@@ -866,7 +866,7 @@
|
||||
if(istype(G))
|
||||
strip_mod = G.strip_mod
|
||||
strip_silence = G.strip_silence
|
||||
if (!strip_silence)
|
||||
if(!strip_silence)
|
||||
who.visible_message("<span class='danger'>[src] tries to remove [who]'s [what.name].</span>", \
|
||||
"<span class='userdanger'>[src] tries to remove your [what.name].</span>", target = src,
|
||||
target_message = "<span class='danger'>You try to remove [who]'s [what.name].</span>")
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/**
|
||||
* Determines if we can actively parry.
|
||||
*/
|
||||
/obj/item/proc/can_active_parry()
|
||||
/obj/item/proc/can_active_parry(mob/user)
|
||||
return block_parry_data && (item_flags & ITEM_CAN_PARRY)
|
||||
|
||||
/**
|
||||
@@ -29,7 +29,7 @@
|
||||
var/datum/block_parry_data/data
|
||||
var/datum/tool
|
||||
var/method
|
||||
if(using_item?.can_active_parry())
|
||||
if(using_item?.can_active_parry(src))
|
||||
data = using_item.block_parry_data
|
||||
method = ITEM_PARRY
|
||||
tool = using_item
|
||||
@@ -50,9 +50,20 @@
|
||||
using_item = backup
|
||||
method = ITEM_PARRY
|
||||
var/list/other_items = list()
|
||||
if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_PARRY_START, method, tool, other_items) & COMPONENT_PREVENT_PARRY_START)
|
||||
var/list/override = list()
|
||||
if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_PARRY_START, method, tool, other_items, override) & COMPONENT_PREVENT_PARRY_START)
|
||||
to_chat(src, "<span class='warning'>Something is preventing you from parrying!</span>")
|
||||
return
|
||||
if(length(override))
|
||||
var/datum/thing = override[1]
|
||||
var/_method = override[thing]
|
||||
if(_method == ITEM_PARRY)
|
||||
using_item = thing
|
||||
method = ITEM_PARRY
|
||||
data = using_item.block_parry_data
|
||||
else if(_method == UNARMED_PARRY)
|
||||
method = UNARMED_PARRY
|
||||
data = thing
|
||||
if(!using_item && !method && length(other_items))
|
||||
using_item = other_items[1]
|
||||
method = ITEM_PARRY
|
||||
@@ -94,7 +105,7 @@
|
||||
*/
|
||||
/mob/living/proc/find_backup_parry_item()
|
||||
for(var/obj/item/I in held_items - get_active_held_item())
|
||||
if(I.can_active_parry())
|
||||
if(I.can_active_parry(src))
|
||||
return I
|
||||
|
||||
/**
|
||||
@@ -231,7 +242,7 @@
|
||||
var/efficiency = data.get_parry_efficiency(attack_type, get_parry_time())
|
||||
switch(parrying)
|
||||
if(ITEM_PARRY)
|
||||
if(!active_parry_item.can_active_parry())
|
||||
if(!active_parry_item.can_active_parry(src))
|
||||
return BLOCK_NONE
|
||||
. = active_parry_item.on_active_parry(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, get_parry_time())
|
||||
if(UNARMED_PARRY)
|
||||
@@ -243,6 +254,18 @@
|
||||
if(efficiency <= 0) // Do not allow automatically handled/standardized parries that increase damage for now.
|
||||
return
|
||||
. |= BLOCK_SHOULD_PARTIAL_MITIGATE
|
||||
if(efficiency >= data.parry_efficiency_perfect)
|
||||
. |= data.perfect_parry_block_return_flags
|
||||
if(data.perfect_parry_block_return_list)
|
||||
return_list |= data.perfect_parry_block_return_list
|
||||
else if(efficiency >= data.parry_efficiency_considered_successful)
|
||||
. |= data.imperfect_parry_block_return_flags
|
||||
if(data.imperfect_parry_block_return_list)
|
||||
return_list |= data.imperfect_parry_block_return_list
|
||||
else
|
||||
. |= data.failed_parry_block_return_flags
|
||||
if(data.failed_parry_block_return_list)
|
||||
return_list |= data.failed_parry_block_return_list
|
||||
if(isnull(return_list[BLOCK_RETURN_MITIGATION_PERCENT])) // if one of the on_active_parry procs overrode. We don't have to worry about interference since parries are the first thing checked in the [do_run_block()] sequence.
|
||||
return_list[BLOCK_RETURN_MITIGATION_PERCENT] = clamp(efficiency, 0, 100) // do not allow > 100% or < 0% for now.
|
||||
if((return_list[BLOCK_RETURN_MITIGATION_PERCENT] >= 100) || (damage <= 0))
|
||||
|
||||
@@ -157,6 +157,16 @@ GLOBAL_LIST_EMPTY(block_parry_data)
|
||||
/// Parry cooldown post-parry if failed. This is ADDED to parry_cooldown!!!
|
||||
var/parry_failed_cooldown_duration = 0 SECONDS
|
||||
|
||||
// Advanced
|
||||
/// Flags added to return value
|
||||
var/perfect_parry_block_return_flags = NONE
|
||||
var/imperfect_parry_block_return_flags = NONE
|
||||
var/failed_parry_block_return_flags = NONE
|
||||
/// List appended to block return
|
||||
var/perfect_parry_block_return_list
|
||||
var/imperfect_parry_block_return_list
|
||||
var/failed_parry_block_return_list
|
||||
|
||||
/**
|
||||
* Quirky proc to get average of flags in list that are in attack_type because why is attack_type a flag.
|
||||
*/
|
||||
|
||||
@@ -81,7 +81,6 @@
|
||||
|
||||
var/bloodcrawl = 0 //0 No blood crawling, BLOODCRAWL for bloodcrawling, BLOODCRAWL_EAT for crawling+mob devour
|
||||
var/holder = null //The holder for blood crawling
|
||||
var/ventcrawler = 0 //0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always
|
||||
var/limb_destroyer = 0 //1 Sets AI behavior that allows mobs to target and dismember limbs with their basic attack.
|
||||
|
||||
var/mob_size = MOB_SIZE_HUMAN
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
update_sprint_icon()
|
||||
|
||||
/mob/living/proc/enable_sprint_mode(update_icon = TRUE)
|
||||
if(!CONFIG_GET(flag/sprint_enabled))
|
||||
return
|
||||
if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
|
||||
return
|
||||
ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE)
|
||||
@@ -61,6 +63,8 @@
|
||||
update_sprint_icon()
|
||||
|
||||
/mob/living/proc/user_toggle_intentional_sprint_mode()
|
||||
if(!CONFIG_GET(flag/sprint_enabled))
|
||||
return
|
||||
var/old = (combat_flags & COMBAT_FLAG_SPRINT_TOGGLED)
|
||||
if(old)
|
||||
if(combat_flags & COMBAT_FLAG_SPRINT_FORCED)
|
||||
|
||||
@@ -17,10 +17,6 @@
|
||||
if (isturf(T))
|
||||
update_z(T.z)
|
||||
|
||||
//Vents
|
||||
if(ventcrawler)
|
||||
to_chat(src, "<span class='notice'>You can ventcrawl! Use alt+click on vents to quickly travel about the station.</span>")
|
||||
|
||||
if(ranged_ability)
|
||||
ranged_ability.add_ranged_ability(src, "<span class='notice'>You currently have <b>[ranged_ability]</b> active!</span>")
|
||||
if((vore_flags & VORE_INIT) && !(vore_flags & VOREPREF_INIT)) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing.
|
||||
|
||||
@@ -329,7 +329,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
return 1
|
||||
|
||||
/mob/living/proc/can_speak_vocal(message) //Check AFTER handling of xeno and ling channels
|
||||
if(HAS_TRAIT(src, TRAIT_MUTE))
|
||||
if(HAS_TRAIT(src, TRAIT_MUTE) && get_message_language(message) != /datum/language/signlanguage)
|
||||
return 0
|
||||
|
||||
if(is_muzzled())
|
||||
|
||||
@@ -1039,3 +1039,6 @@
|
||||
if(current && eyeobj)
|
||||
return eyeobj.emote(act, m_type, message, intentional, forced = TRUE)
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/ai/zMove(dir, feedback = FALSE)
|
||||
. = eyeobj.zMove(dir, feedback)
|
||||
|
||||
@@ -94,6 +94,25 @@
|
||||
if(ai.master_multicam)
|
||||
ai.master_multicam.refresh_view()
|
||||
|
||||
//it uses setLoc not forceMove, talks to the sillycone and not the camera mob
|
||||
/mob/camera/aiEye/zMove(dir, feedback = FALSE)
|
||||
if(dir != UP && dir != DOWN)
|
||||
return FALSE
|
||||
var/turf/target = get_step_multiz(src, dir)
|
||||
if(!target)
|
||||
if(feedback)
|
||||
to_chat(ai, "<span class='warning'>There's nowhere to go in that direction!</span>")
|
||||
return FALSE
|
||||
if(!canZMove(dir, target))
|
||||
if(feedback)
|
||||
to_chat(ai, "<span class='warning'>You couldn't move there!</span>")
|
||||
return FALSE
|
||||
setLoc(target, TRUE)
|
||||
return TRUE
|
||||
|
||||
/mob/camera/aiEye/canZMove(direction, turf/target) //cameras do not respect these FLOORS you speak so much of
|
||||
return TRUE
|
||||
|
||||
/mob/camera/aiEye/Move()
|
||||
return 0
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
maxHealth = 500
|
||||
layer = BELOW_MOB_LAYER
|
||||
var/obj/item/instrument/piano_synth/internal_instrument
|
||||
silicon_privileges = PRIVILEDGES_PAI
|
||||
silicon_privileges = PRIVILEGES_PAI
|
||||
|
||||
var/network = "ss13"
|
||||
var/obj/machinery/camera/current = null
|
||||
@@ -143,6 +143,10 @@
|
||||
custom_holoform.Grant(src)
|
||||
emitter_next_use = world.time + 10 SECONDS
|
||||
|
||||
/mob/living/silicon/pai/deployed/Initialize()
|
||||
. = ..()
|
||||
fold_out(TRUE)
|
||||
|
||||
/mob/living/silicon/pai/ComponentInitialize()
|
||||
. = ..()
|
||||
if(possible_chassis[chassis])
|
||||
|
||||
@@ -923,7 +923,8 @@
|
||||
/obj/item/cyborg_clamp,
|
||||
/obj/item/stack/marker_beacon,
|
||||
/obj/item/destTagger,
|
||||
/obj/item/stack/packageWrap)
|
||||
/obj/item/stack/packageWrap,
|
||||
/obj/item/card/id/miningborg)
|
||||
emag_modules = list(/obj/item/borg/stun)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg/miner,
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
/mob/living/silicon/robot/default_toggle_sprint(shutdown = FALSE)
|
||||
if(!CONFIG_GET(flag/sprint_enabled))
|
||||
disable_intentional_sprint_mode()
|
||||
return
|
||||
var/current = (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
|
||||
if(current || shutdown || !cell || (cell.charge < 25) || !cansprint)
|
||||
disable_intentional_sprint_mode()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/silicon
|
||||
gender = NEUTER
|
||||
silicon_privileges = PRIVILEDGES_SILICON
|
||||
silicon_privileges = PRIVILEGES_SILICON
|
||||
verb_say = "states"
|
||||
verb_ask = "queries"
|
||||
verb_exclaim = "declares"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
maxbodytemp = INFINITY
|
||||
minbodytemp = 0
|
||||
blood_volume = 0
|
||||
silicon_privileges = PRIVILEDGES_BOT
|
||||
silicon_privileges = PRIVILEGES_BOT
|
||||
sentience_type = SENTIENCE_ARTIFICIAL
|
||||
status_flags = NONE //no default canpush
|
||||
verb_say = "states"
|
||||
|
||||
@@ -335,6 +335,12 @@
|
||||
|
||||
/mob/living/simple_animal/bot/floorbot/proc/repair(turf/target_turf)
|
||||
|
||||
if(check_bot_working(target_turf))
|
||||
add_to_ignore(target_turf)
|
||||
target = null
|
||||
playsound(src, 'sound/effects/whistlereset.ogg', 50, TRUE)
|
||||
return
|
||||
|
||||
if(isspaceturf(target_turf))
|
||||
//Must be a hull breach or in line mode to continue.
|
||||
if(!is_hull_breach(target_turf) && !targetdirection)
|
||||
@@ -350,9 +356,9 @@
|
||||
sleep(50)
|
||||
if(mode == BOT_REPAIRING && src.loc == target_turf)
|
||||
if(autotile) //Build the floor and include a tile.
|
||||
target_turf.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR)
|
||||
else //Build a hull plating without a floor tile.
|
||||
target_turf.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
|
||||
else //Build a hull plating without a floor tile.
|
||||
target_turf.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR)
|
||||
|
||||
else
|
||||
var/turf/open/floor/F = target_turf
|
||||
@@ -366,7 +372,7 @@
|
||||
if(mode == BOT_REPAIRING && F && src.loc == F)
|
||||
F.broken = 0
|
||||
F.burnt = 0
|
||||
F.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR)
|
||||
F.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
|
||||
|
||||
if(replacetiles && F.type != initial(tiletype.turf_type) && specialtiles && !isplatingturf(F))
|
||||
anchored = TRUE
|
||||
@@ -418,3 +424,14 @@
|
||||
repair(A)
|
||||
else
|
||||
..()
|
||||
|
||||
/**
|
||||
* Checks a given turf to see if another floorbot is there, working as well.
|
||||
*/
|
||||
/mob/living/simple_animal/bot/floorbot/proc/check_bot_working(turf/active_turf)
|
||||
if(isturf(active_turf))
|
||||
for(var/mob/living/simple_animal/bot/floorbot/robot in active_turf)
|
||||
if(robot.mode == BOT_REPAIRING)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
density = FALSE
|
||||
movement_type = FLYING
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
mob_size = MOB_SIZE_TINY
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
@@ -35,6 +34,7 @@
|
||||
/mob/living/simple_animal/pet/bumbles/Initialize()
|
||||
. = ..()
|
||||
add_verb(src, /mob/living/proc/lay_down)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/pet/bumbles/ComponentInitialize()
|
||||
. = ..()
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
density = FALSE
|
||||
movement_type = FLYING
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
mob_size = MOB_SIZE_TINY
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BUG
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
@@ -33,6 +32,7 @@
|
||||
. = ..()
|
||||
var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
|
||||
add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/butterfly/bee_friendly()
|
||||
return TRUE //treaty signed at the Beeneeva convention
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
pass_flags = PASSTABLE
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
@@ -40,6 +39,7 @@
|
||||
/mob/living/simple_animal/pet/cat/Initialize()
|
||||
. = ..()
|
||||
add_verb(src, /mob/living/proc/lay_down)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/pet/cat/ComponentInitialize()
|
||||
. = ..()
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
response_harm_simple = "splat"
|
||||
speak_emote = list("chitters")
|
||||
density = FALSE
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
mob_size = MOB_SIZE_TINY
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
verb_say = "chitters"
|
||||
@@ -32,6 +31,10 @@
|
||||
var/squish_chance = 50
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/cockroach/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/cockroach/death(gibbed)
|
||||
if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes.
|
||||
return
|
||||
|
||||
@@ -21,12 +21,15 @@
|
||||
stop_automated_movement = 1
|
||||
friendly_verb_continuous = "pinches"
|
||||
friendly_verb_simple = "pinch"
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
mob_size = MOB_SIZE_TINY
|
||||
var/obj/item/inventory_head
|
||||
var/obj/item/inventory_mask
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
|
||||
/mob/living/simple_animal/crab/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/crab/BiologicalLife(seconds, times_fired)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
unsuitable_atmos_damage = 0
|
||||
wander = 0
|
||||
speed = 0
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
healable = 0
|
||||
density = FALSE
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
@@ -41,7 +40,7 @@
|
||||
bubble_icon = "machine"
|
||||
initial_language_holder = /datum/language_holder/drone
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
silicon_privileges = PRIVILEDGES_DRONE
|
||||
silicon_privileges = PRIVILEGES_DRONE
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
hud_possible = list(DIAG_STAT_HUD, DIAG_HUD, ANTAG_HUD)
|
||||
unique_name = TRUE
|
||||
@@ -101,6 +100,8 @@
|
||||
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
|
||||
diag_hud.add_to_hud(src)
|
||||
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/drone/ComponentInitialize()
|
||||
. = ..()
|
||||
if(can_be_held)
|
||||
|
||||
@@ -114,7 +114,6 @@
|
||||
harm_intent_damage = 5
|
||||
density = TRUE
|
||||
speed = 1
|
||||
ventcrawler = VENTCRAWLER_NONE
|
||||
faction = list("neutral", "ratvar")
|
||||
speak_emote = list("clanks", "clinks", "clunks", "clangs")
|
||||
verb_ask = "requests"
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
to_chat(src, "<i>Your onboard antivirus has initiated lockdown. Motor servos are impaired, ventilation access is denied, and your display reports that you are hacked to all nearby.</i>")
|
||||
hacked = TRUE
|
||||
mind.special_role = "hacked drone"
|
||||
ventcrawler = VENTCRAWLER_NONE //Again, balance
|
||||
RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) // balance
|
||||
speed = 1 //gotta go slow
|
||||
message_admins("[src] ([src.key]) became a hacked drone hellbent on [clockwork ? "serving Ratvar" : "destroying the station"]!")
|
||||
else
|
||||
@@ -125,7 +125,7 @@
|
||||
to_chat(src, "<i>Having been restored, your onboard antivirus reports the all-clear and you are able to perform all actions again.</i>")
|
||||
hacked = FALSE
|
||||
mind.special_role = null
|
||||
ventcrawler = initial(ventcrawler)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
speed = initial(speed)
|
||||
if(is_servant_of_ratvar(src))
|
||||
remove_servant_of_ratvar(src, TRUE)
|
||||
|
||||
@@ -241,7 +241,6 @@
|
||||
attack_verb_simple = "kick"
|
||||
health = 3
|
||||
maxHealth = 3
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
var/amount_grown = 0
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
mob_size = MOB_SIZE_TINY
|
||||
@@ -253,6 +252,7 @@
|
||||
. = ..()
|
||||
pixel_x = rand(-6, 6)
|
||||
pixel_y = rand(0, 10)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/chick/BiologicalLife(seconds, times_fired)
|
||||
if(!(. = ..()))
|
||||
@@ -296,7 +296,6 @@
|
||||
attack_verb_simple = "kick"
|
||||
health = 15
|
||||
maxHealth = 15
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
var/eggsleft = 0
|
||||
var/eggsFertile = TRUE
|
||||
var/body_color
|
||||
@@ -322,6 +321,8 @@
|
||||
pixel_y = rand(0, 10)
|
||||
++chicken_count
|
||||
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/chicken/Destroy()
|
||||
--chicken_count
|
||||
return ..()
|
||||
@@ -392,7 +393,6 @@
|
||||
attack_verb_simple = "kick"
|
||||
health = 25
|
||||
maxHealth = 25
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
var/eggsleft = 0
|
||||
var/eggsFertile = TRUE
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
@@ -412,6 +412,8 @@
|
||||
. = ..()
|
||||
++kiwi_count
|
||||
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/kiwi/BiologicalLife(seconds, times_fired)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
@@ -473,7 +475,6 @@
|
||||
attack_verb_simple = "kick"
|
||||
health = 10
|
||||
maxHealth = 10
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
var/amount_grown = 0
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
mob_size = MOB_SIZE_TINY
|
||||
@@ -486,6 +487,8 @@
|
||||
pixel_x = rand(-6, 6)
|
||||
pixel_y = rand(0, 10)
|
||||
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/babyKiwi/BiologicalLife(seconds, times_fired)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
response_disarm_simple = "shoo"
|
||||
response_harm_continuous = "stomps on"
|
||||
response_harm_simple = "stomp on"
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
density = FALSE
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
@@ -31,6 +30,7 @@
|
||||
/mob/living/simple_animal/hostile/lizard/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/mob_holder, worn_state = "lizard", inv_slots = ITEM_SLOT_HEAD) //you can hold lizards now.
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target?
|
||||
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
response_harm_continuous = "splats"
|
||||
response_harm_simple = "splat"
|
||||
density = FALSE
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
mob_size = MOB_SIZE_TINY
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
@@ -40,6 +39,7 @@
|
||||
icon_state = "mouse_[body_color]"
|
||||
icon_living = "mouse_[body_color]"
|
||||
icon_dead = "mouse_[body_color]_dead"
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/mouse/proc/splat()
|
||||
src.health = 0
|
||||
|
||||
@@ -22,12 +22,15 @@
|
||||
response_harm_continuous = "stamps on"
|
||||
response_harm_simple = "stamp"
|
||||
density = FALSE
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
mob_size = MOB_SIZE_TINY
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
|
||||
/mob/living/simple_animal/opossum/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/opossum/poppy
|
||||
name = "Poppy the Safety Possum"
|
||||
desc = "Safety first!"
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
response_harm_continuous = "steps on"
|
||||
response_harm_simple = "step on"
|
||||
faction = list("hostile")
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
density = FALSE
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
@@ -39,6 +38,9 @@
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/snake/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/snake/ListTargets(atom/the_target)
|
||||
. = oview(vision_range, targets_from) //get list of things in vision range
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
speak_emote = list("chitters")
|
||||
mouse_opacity = 2
|
||||
density = TRUE
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
verb_say = "chitters"
|
||||
verb_ask = "chitters inquisitively"
|
||||
verb_exclaim = "chitters loudly"
|
||||
@@ -37,6 +36,8 @@
|
||||
if(A)
|
||||
notify_ghosts("A banana spider has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
|
||||
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/banana_spider/attack_ghost(mob/user)
|
||||
if(key) //please stop using src. without a good reason.
|
||||
return
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
to_chat(user, "<span class='info'>You strap the armor plating to [A] and sharpen [A.p_their()] claws with the nail filer. This was a great idea.</span>")
|
||||
qdel(src)
|
||||
|
||||
mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it.
|
||||
/mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it.
|
||||
name = "Terrygold"
|
||||
icon_state = "butterbear"
|
||||
icon_living = "butterbear"
|
||||
@@ -155,7 +155,7 @@ mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Seve
|
||||
to_chat(src, "<span class='notice'>Your name is now <b>\"new_name\"</b>!</span>")
|
||||
name = new_name
|
||||
|
||||
mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path.
|
||||
/mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path.
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if((L.mobility_flags & MOBILITY_STAND))
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
speak_emote = list("growls")
|
||||
mouse_opacity = 2
|
||||
density = TRUE
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
verb_say = "growls"
|
||||
verb_ask = "growls inquisitively"
|
||||
verb_exclaim = "growls loudly"
|
||||
@@ -38,6 +37,7 @@
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
notify_ghosts("A tumor bread has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/bread/attack_ghost(mob/user)
|
||||
if(key) //please stop using src. without a good reason.
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
var/busy = SPIDER_IDLE
|
||||
pass_flags = PASSTABLE
|
||||
move_to_delay = 6
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
attack_verb_continuous = "bites"
|
||||
attack_verb_simple = "bite"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
@@ -63,6 +62,8 @@
|
||||
lay_web = new
|
||||
lay_web.Grant(src)
|
||||
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Destroy()
|
||||
QDEL_NULL(lay_web)
|
||||
return ..()
|
||||
@@ -389,7 +390,6 @@
|
||||
name = "Wrap"
|
||||
panel = "Spider"
|
||||
active = FALSE
|
||||
datum/action/spell_action/action = null
|
||||
desc = "Wrap something or someone in a cocoon. If it's a living being, you'll also consume them, allowing you to lay eggs."
|
||||
ranged_mousepointer = 'icons/effects/wrap_target.dmi'
|
||||
action_icon = 'icons/mob/actions/actions_animal.dmi'
|
||||
|
||||
@@ -20,11 +20,14 @@
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
speak_emote = list("squeaks")
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
var/datum/mind/origin
|
||||
var/egg_lain = 0
|
||||
gold_core_spawnable = NO_SPAWN //are you sure about this?? // CITADEL CHANGE, Yes.
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
|
||||
var/obj/item/organ/body_egg/changeling_egg/egg = new(victim)
|
||||
egg.Insert(victim)
|
||||
|
||||
@@ -511,7 +511,7 @@
|
||||
DestroyObjectsInDirection(direction)
|
||||
|
||||
|
||||
mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with megafauna destroying everything around them
|
||||
/mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with megafauna destroying everything around them
|
||||
if(environment_smash)
|
||||
EscapeConfinement()
|
||||
for(var/dir in GLOB.cardinals)
|
||||
|
||||
@@ -22,10 +22,13 @@
|
||||
attack_verb_continuous = "slams"
|
||||
attack_verb_simple = "slam"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
faction = list("plants")
|
||||
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 150
|
||||
maxbodytemp = 500
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
|
||||
/mob/living/simple_animal/hostile/killertomato/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
@@ -620,7 +620,6 @@ Difficulty: Very Hard
|
||||
density = FALSE
|
||||
movement_type = FLYING
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
mob_size = MOB_SIZE_TINY
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
verb_say = "warps"
|
||||
@@ -648,6 +647,7 @@ Difficulty: Very Hard
|
||||
remove_verb(src, /mob/verb/me_verb)
|
||||
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
medsensor.add_hud_to(src)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/lightgeist/AttackingTarget()
|
||||
. = ..()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
friendly_verb_continuous = "pinches"
|
||||
friendly_verb_simple = "pinch"
|
||||
a_intent = INTENT_HELP
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
stat_attack = UNCONSCIOUS
|
||||
gender = NEUTER
|
||||
@@ -50,6 +49,7 @@
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
|
||||
udder = new()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/CanAttack(atom/the_target) // Gutlunch-specific version of CanAttack to handle stupid stat_exclusive = true crap so we don't have to do it for literally every single simple_animal/hostile except the two that spawn in lavaland
|
||||
if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids
|
||||
|
||||
@@ -398,7 +398,6 @@
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
belt = /obj/item/tank/internals/emergency_oxygen
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
ears = /obj/item/radio/headset
|
||||
gloves = /obj/item/clothing/gloves/color/fyellow
|
||||
id = /obj/item/card/id/silver/reaper //looks cool and has a fancy name but only a 1% chance
|
||||
if(prob(99))
|
||||
@@ -412,7 +411,7 @@
|
||||
back = /obj/item/spear
|
||||
else if(prob(80)) //Now they dont always have a backpack
|
||||
back = /obj/item/storage/backpack
|
||||
backpack_contents = list(/obj/item/stack/cable_coil = 1, /obj/item/assembly/flash = 1, /obj/item/storage/fancy/donut_box = 1, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 1, /obj/item/lighter = 1)
|
||||
backpack_contents = list(/obj/item/stack/cable_coil = 1, /obj/item/storage/fancy/donut_box = 1, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 1, /obj/item/lighter = 1)
|
||||
if(prob(90))
|
||||
r_pocket = /obj/item/kitchen/knife
|
||||
if(prob(60))
|
||||
@@ -423,7 +422,6 @@
|
||||
suit = /obj/item/clothing/suit/hooded/bee_costume
|
||||
shoes = /obj/item/clothing/shoes/sneakers/yellow
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
ears = /obj/item/radio/headset
|
||||
belt = /obj/item/storage/belt/fannypack/yellow
|
||||
id_job = "Assisant"
|
||||
id = /obj/item/card/id
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
stat_attack = DEAD
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
speed = 1
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
robust_searching = 1
|
||||
unique_name = 1
|
||||
speak_emote = list("squeaks")
|
||||
@@ -41,6 +40,10 @@
|
||||
var/static/mutable_appearance/cap_living //Where we store our cap icons so we dont generate them constantly to update our icon
|
||||
var/static/mutable_appearance/cap_dead
|
||||
|
||||
/mob/living/simple_animal/hostile/mushroom/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/mushroom/examine(mob/user)
|
||||
. = ..()
|
||||
if(health >= maxHealth)
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
attack_verb_continuous = "slashes"
|
||||
attack_verb_simple = "slash"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
unique_name = TRUE
|
||||
faction = list("rat")
|
||||
var/datum/action/cooldown/coffer
|
||||
@@ -42,6 +41,8 @@
|
||||
key = C.key
|
||||
notify_ghosts("All rise for the rat king, ascendant to the throne in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE)
|
||||
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/regalrat/handle_automated_action()
|
||||
if(prob(20))
|
||||
riot.Trigger()
|
||||
@@ -175,7 +176,6 @@
|
||||
health = 15
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1)
|
||||
density = FALSE
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
mob_size = MOB_SIZE_TINY
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
@@ -185,6 +185,7 @@
|
||||
. = ..()
|
||||
SSmobs.cheeserats += src
|
||||
AddComponent(/datum/component/swarming)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/rat/Destroy()
|
||||
SSmobs.cheeserats -= src
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
mob_size = MOB_SIZE_TINY
|
||||
movement_type = FLYING
|
||||
speak_emote = list("squeaks")
|
||||
@@ -38,11 +37,14 @@
|
||||
var/min_oxy = 0
|
||||
var/max_tox = 0
|
||||
|
||||
|
||||
//Space bats need no air to fly in.
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/bat/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/bat/secbat
|
||||
name = "Security Bat"
|
||||
icon_state = "secbat"
|
||||
|
||||
@@ -137,7 +137,6 @@
|
||||
emote_see = list("honks", "sweats", "jiggles", "contemplates its existence")
|
||||
speak_chance = 5
|
||||
dextrous = TRUE
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
maxHealth = 140
|
||||
health = 140
|
||||
speed = -5
|
||||
@@ -147,6 +146,10 @@
|
||||
obj_damage = 5
|
||||
loot = list(/obj/item/clothing/suit/hooded/bloated_human, /obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/fleshclown/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/longface
|
||||
name = "Longface"
|
||||
desc = "Often found walking into the bar."
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
response_harm_continuous = "splats"
|
||||
response_harm_simple = "splat"
|
||||
density = FALSE
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
faction = list("hostile")
|
||||
attack_sound = 'sound/effects/reee.ogg'
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/nugget = 1)
|
||||
@@ -40,6 +39,7 @@
|
||||
icon_living = "rare_frog"
|
||||
icon_dead = "rare_frog_dead"
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/nugget = 5)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/frog/Crossed(AM as mob|obj)
|
||||
. = ..()
|
||||
|
||||
@@ -190,5 +190,5 @@
|
||||
* Arguments:
|
||||
* * datum/beam/vine - The vine to be removed from the list.
|
||||
*/
|
||||
mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force)
|
||||
/mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force)
|
||||
vines -= vine
|
||||
|
||||
@@ -83,6 +83,8 @@
|
||||
|
||||
//Headset for Poly to yell at engineers :)
|
||||
var/obj/item/radio/headset/ears = null
|
||||
/// spawns with headset
|
||||
var/spawns_with_headset = FALSE
|
||||
|
||||
//The thing the parrot is currently interested in. This gets used for items the parrot wants to pick up, mobs it wants to steal from,
|
||||
//mobs it wants to attack or mobs that have attacked it
|
||||
@@ -105,13 +107,14 @@
|
||||
|
||||
/mob/living/simple_animal/parrot/Initialize()
|
||||
. = ..()
|
||||
if(!ears)
|
||||
var/headset = pick(/obj/item/radio/headset/headset_sec, \
|
||||
/obj/item/radio/headset/headset_eng, \
|
||||
/obj/item/radio/headset/headset_med, \
|
||||
/obj/item/radio/headset/headset_sci, \
|
||||
/obj/item/radio/headset/headset_cargo)
|
||||
ears = new headset(src)
|
||||
if(spawns_with_headset)
|
||||
if(!ears)
|
||||
var/headset = pick(/obj/item/radio/headset/headset_sec, \
|
||||
/obj/item/radio/headset/headset_eng, \
|
||||
/obj/item/radio/headset/headset_med, \
|
||||
/obj/item/radio/headset/headset_sci, \
|
||||
/obj/item/radio/headset/headset_cargo)
|
||||
ears = new headset(src)
|
||||
|
||||
parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var
|
||||
|
||||
@@ -881,6 +884,7 @@
|
||||
speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE")
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
speak_chance = 3
|
||||
spawns_with_headset = TRUE
|
||||
var/memory_saved = FALSE
|
||||
var/rounds_survived = 0
|
||||
var/longest_survival = 0
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
icon_state = "grey baby slime"
|
||||
pass_flags = PASSTABLE
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
gender = NEUTER
|
||||
var/is_adult = 0
|
||||
var/docile = 0
|
||||
@@ -108,6 +107,8 @@
|
||||
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_SLIME, 7.5)
|
||||
set_nutrition(rand(650, 800))
|
||||
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
/mob/living/simple_animal/slime/Destroy()
|
||||
for (var/A in actions)
|
||||
var/datum/action/AC = A
|
||||
|
||||
@@ -5,7 +5,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
|
||||
|
||||
//VENTCRAWLING
|
||||
|
||||
/mob/living/proc/handle_ventcrawl(atom/A)
|
||||
/mob/living/proc/handle_ventcrawl(atom/A, ventcrawler)
|
||||
if(!ventcrawler || !Adjacent(A))
|
||||
return
|
||||
. = TRUE //return value to stop the client from being shown the turf contents stat tab on alt-click.
|
||||
@@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
|
||||
if(!client)
|
||||
return
|
||||
|
||||
if(iscarbon(src) && ventcrawler == VENTCRAWLER_NUDE)
|
||||
if(iscarbon(src) && ventcrawler==VENTCRAWLER_NUDE)
|
||||
if(length(get_equipped_items(include_pockets = TRUE)) || get_num_held_items())
|
||||
to_chat(src, "<span class='warning'>You can't crawl around in the ventilation ducts with items!</span>")
|
||||
return
|
||||
|
||||
@@ -408,7 +408,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
return
|
||||
return TRUE
|
||||
|
||||
/atom/proc/hasSiliconAccessInArea(mob/user, flags = PRIVILEDGES_SILICON)
|
||||
/atom/proc/hasSiliconAccessInArea(mob/user, flags = PRIVILEGES_SILICON)
|
||||
return user.silicon_privileges & (flags) || (user.siliconaccesstoggle && (get_area(src) in user.siliconaccessareas))
|
||||
|
||||
/mob/proc/toggleSiliconAccessArea(area/area)
|
||||
@@ -496,7 +496,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
colored_message = "<font color=[color]>[message]</font>"
|
||||
else
|
||||
colored_message = "<font color='[color]'>[message]</font>"
|
||||
|
||||
|
||||
//This makes readability a bit better for admins.
|
||||
switch(message_type)
|
||||
if(LOG_WHISPER)
|
||||
@@ -507,7 +507,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
colored_message = "(ASAY) [colored_message]"
|
||||
if(LOG_EMOTE)
|
||||
colored_message = "(EMOTE) [colored_message]"
|
||||
|
||||
|
||||
var/list/timestamped_message = list("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(src)] [loc_name(src)] (Event #[LAZYLEN(logging[smessage_type])])" = colored_message)
|
||||
|
||||
logging[smessage_type] += timestamped_message
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
//////////////////////////////////////////////////////
|
||||
|
||||
/mob/proc/get_top_level_mob()
|
||||
if(istype(src.loc,/mob)&&src.loc!=src)
|
||||
var/mob/M=src.loc
|
||||
if(ismob(src.loc) && src.loc != src)
|
||||
var/mob/M = src.loc
|
||||
return M.get_top_level_mob()
|
||||
return src
|
||||
|
||||
proc/get_top_level_mob(var/mob/S)
|
||||
if(istype(S.loc,/mob)&&S.loc!=S)
|
||||
var/mob/M=S.loc
|
||||
/proc/get_top_level_mob(mob/S)
|
||||
if(ismob(S.loc) && S.loc != S)
|
||||
var/mob/M = S.loc
|
||||
return M.get_top_level_mob()
|
||||
return S
|
||||
|
||||
|
||||
@@ -175,6 +175,7 @@
|
||||
icon = null
|
||||
cut_overlays()
|
||||
invisibility = INVISIBILITY_MAXIMUM
|
||||
|
||||
new /obj/effect/temp_visual/monkeyify/humanify(loc)
|
||||
|
||||
transformation_timer = addtimer(CALLBACK(src, .proc/finish_humanize, tr_flags), TRANSFORMATION_DURATION, TIMER_UNIQUE)
|
||||
@@ -202,6 +203,8 @@
|
||||
|
||||
var/mob/living/carbon/human/O = new( loc )
|
||||
for(var/obj/item/C in O.loc)
|
||||
if(C.anchored)
|
||||
continue
|
||||
O.equip_to_appropriate_slot(C)
|
||||
|
||||
dna.transfer_identity(O)
|
||||
|
||||
Reference in New Issue
Block a user