mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-31 00:58:26 +01:00
[MIRROR] Remove hideous inline tab indentation, and bans it in contributing guidelines (#3394)
* Remove hideous inline tab indentation, and bans it in contributing guidelines * a Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> Co-authored-by: Gandalf2k15 <jzo123@hotmail.com>
This commit is contained in:
co-authored by
Mothblocks
Gandalf2k15
parent
7635f198f4
commit
b332b46b65
@@ -85,7 +85,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
|
||||
new /atom/movable/screen/splash(C)
|
||||
|
||||
notransform = TRUE
|
||||
sleep(29) //let the animation play
|
||||
sleep(29) //let the animation play
|
||||
notransform = FALSE
|
||||
|
||||
if(!C)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
stat = DEAD
|
||||
hud_possible = list()
|
||||
|
||||
var/mob/living/new_character //for instant transfer once the round is set up
|
||||
var/mob/living/new_character //for instant transfer once the round is set up
|
||||
|
||||
//Used to make sure someone doesn't get spammed with messages if they're ineligible for roles
|
||||
var/ineligible_for_roles = FALSE
|
||||
@@ -313,7 +313,7 @@
|
||||
|
||||
var/arrivals_docked = TRUE
|
||||
if(SSshuttle.arrivals)
|
||||
close_spawn_windows() //In case we get held up
|
||||
close_spawn_windows() //In case we get held up
|
||||
if(SSshuttle.arrivals.damaged && CONFIG_GET(flag/arrivals_shuttle_require_safe_latejoin))
|
||||
src << alert("The arrivals shuttle is currently malfunctioning! You cannot join.")
|
||||
return FALSE
|
||||
@@ -328,9 +328,9 @@
|
||||
|
||||
SSjob.AssignRole(src, rank, 1)
|
||||
|
||||
var/mob/living/character = create_character(TRUE) //creates the human and transfers vars and mind
|
||||
var/mob/living/character = create_character(TRUE) //creates the human and transfers vars and mind
|
||||
var/equip = SSjob.EquipRank(character, rank, TRUE)
|
||||
if(isliving(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob.
|
||||
if(isliving(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob.
|
||||
character = equip
|
||||
|
||||
var/datum/job/job = SSjob.GetJob(rank)
|
||||
@@ -357,9 +357,9 @@
|
||||
//SKYRAT EDIT ADDITION END
|
||||
|
||||
if(ishuman(character))
|
||||
humanc = character //Let's retypecast the var to be human,
|
||||
humanc = character //Let's retypecast the var to be human,
|
||||
|
||||
if(humanc) //These procs all expect humans
|
||||
if(humanc) //These procs all expect humans
|
||||
GLOB.data_core.manifest_inject(humanc)
|
||||
if(SSshuttle.arrivals)
|
||||
SSshuttle.arrivals.QueueAnnounce(humanc, rank)
|
||||
@@ -384,7 +384,7 @@
|
||||
|
||||
GLOB.joined_player_list += character.ckey
|
||||
|
||||
if(CONFIG_GET(flag/allow_latejoin_antagonists) && humanc) //Borgs aren't allowed to be antags. Will need to be tweaked if we get true latejoin ais.
|
||||
if(CONFIG_GET(flag/allow_latejoin_antagonists) && humanc) //Borgs aren't allowed to be antags. Will need to be tweaked if we get true latejoin ais.
|
||||
if(SSshuttle.emergency)
|
||||
switch(SSshuttle.emergency.mode)
|
||||
if(SHUTTLE_RECALL, SHUTTLE_IDLE)
|
||||
@@ -484,9 +484,9 @@
|
||||
if(mind)
|
||||
if(transfer_after)
|
||||
mind.late_joiner = TRUE
|
||||
mind.active = FALSE //we wish to transfer the key manually
|
||||
mind.active = FALSE //we wish to transfer the key manually
|
||||
mind.original_character_slot_index = client.prefs.default_slot
|
||||
mind.transfer_to(H) //won't transfer key since the mind is not active
|
||||
mind.transfer_to(H) //won't transfer key since the mind is not active
|
||||
mind.original_character = H
|
||||
|
||||
H.name = real_name
|
||||
@@ -499,7 +499,7 @@
|
||||
/mob/dead/new_player/proc/transfer_character()
|
||||
. = new_character
|
||||
if(.)
|
||||
new_character.key = key //Manually transfer the key to log them in,
|
||||
new_character.key = key //Manually transfer the key to log them in,
|
||||
new_character.stop_sound_channel(CHANNEL_LOBBYMUSIC)
|
||||
new_character = null
|
||||
qdel(src)
|
||||
|
||||
@@ -47,24 +47,24 @@
|
||||
return L
|
||||
|
||||
/datum/sprite_accessory
|
||||
var/icon //the icon file the accessory is located in
|
||||
var/icon_state //the icon_state of the accessory
|
||||
var/name //the preview name of the accessory
|
||||
var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
|
||||
var/icon //the icon file the accessory is located in
|
||||
var/icon_state //the icon_state of the accessory
|
||||
var/name //the preview name of the accessory
|
||||
var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
|
||||
var/gender_specific //Something that can be worn by either gender, but looks different on each
|
||||
var/use_static //determines if the accessory will be skipped by color preferences
|
||||
var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
|
||||
var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
|
||||
var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects
|
||||
var/use_static //determines if the accessory will be skipped by color preferences
|
||||
var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
|
||||
var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
|
||||
var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects
|
||||
var/dimension_x = 32
|
||||
var/dimension_y = 32
|
||||
var/center = FALSE //Should we center the sprite?
|
||||
var/center = FALSE //Should we center the sprite?
|
||||
|
||||
//////////////////////
|
||||
// Hair Definitions //
|
||||
//////////////////////
|
||||
/datum/sprite_accessory/hair
|
||||
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
|
||||
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
|
||||
|
||||
// please make sure they're sorted alphabetically and, where needed, categorized
|
||||
// try to capitalize the names please~
|
||||
@@ -1814,8 +1814,8 @@
|
||||
name = "Aquatic"
|
||||
icon_state = "aqua"
|
||||
|
||||
/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them.
|
||||
icon = null //These datums exist for selecting legs on preference, and little else
|
||||
/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them.
|
||||
icon = null //These datums exist for selecting legs on preference, and little else
|
||||
|
||||
/datum/sprite_accessory/legs/none
|
||||
name = "Normal Legs"
|
||||
|
||||
@@ -12,5 +12,5 @@
|
||||
observetarget = null
|
||||
..()
|
||||
spawn(0)
|
||||
if(src && !key) //we've transferred to another mob. This ghost should be deleted.
|
||||
if(src && !key) //we've transferred to another mob. This ghost should be deleted.
|
||||
qdel(src)
|
||||
|
||||
@@ -33,7 +33,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
var/image/ghostimage_default = null //this mobs ghost image without accessories and dirs
|
||||
var/image/ghostimage_simple = null //this mob with the simple white ghost sprite
|
||||
var/ghostvision = 1 //is the ghost able to see things humans can't?
|
||||
var/mob/observetarget = null //The target mob that the ghost is observing. Used as a reference in logout()
|
||||
var/mob/observetarget = null //The target mob that the ghost is observing. Used as a reference in logout()
|
||||
var/ghost_hud_enabled = 1 //did this ghost disable the on-screen HUD?
|
||||
var/data_huds_on = 0 //Are data HUDs currently enabled?
|
||||
var/health_scan = FALSE //Are health scans currently enabled?
|
||||
@@ -50,8 +50,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
var/facial_hair_color
|
||||
var/mutable_appearance/facial_hair_overlay
|
||||
|
||||
var/updatedir = 1 //Do we have to update our dir as the ghost moves around?
|
||||
var/lastsetting = null //Stores the last setting that ghost_others was set to, for a little more efficiency when we update ghost images. Null means no update is necessary
|
||||
var/updatedir = 1 //Do we have to update our dir as the ghost moves around?
|
||||
var/lastsetting = null //Stores the last setting that ghost_others was set to, for a little more efficiency when we update ghost images. Null means no update is necessary
|
||||
|
||||
//We store copies of the ghost display preferences locally so they can be referred to even if no client is connected.
|
||||
//If there's a bug with changing your ghost settings, it's probably related to this.
|
||||
@@ -87,7 +87,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
var/turf/T
|
||||
var/mob/body = loc
|
||||
if(ismob(body))
|
||||
T = get_turf(body) //Where is the body located?
|
||||
T = get_turf(body) //Where is the body located?
|
||||
|
||||
gender = body.gender
|
||||
if(body.mind && body.mind.name)
|
||||
@@ -101,7 +101,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
else
|
||||
name = random_unique_name(gender)
|
||||
|
||||
mind = body.mind //we don't transfer the mind but we keep a reference to it.
|
||||
mind = body.mind //we don't transfer the mind but we keep a reference to it.
|
||||
|
||||
set_suicide(body.suiciding) // Transfer whether they committed suicide.
|
||||
|
||||
@@ -125,7 +125,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
|
||||
forceMove(T)
|
||||
|
||||
if(!name) //To prevent nameless ghosts
|
||||
if(!name) //To prevent nameless ghosts
|
||||
name = random_unique_name(gender)
|
||||
real_name = name
|
||||
|
||||
@@ -213,8 +213,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
if(ghost_accs >= GHOST_ACCS_DIR && (icon_state in GLOB.ghost_forms_with_directions_list)) //if this icon has dirs AND the client wants to show them, we make sure we update the dir on movement
|
||||
updatedir = 1
|
||||
else
|
||||
updatedir = 0 //stop updating the dir in case we want to show accessories with dirs on a ghost sprite without dirs
|
||||
setDir(2 )//reset the dir to its default so the sprites all properly align up
|
||||
updatedir = 0 //stop updating the dir in case we want to show accessories with dirs on a ghost sprite without dirs
|
||||
setDir(2 )//reset the dir to its default so the sprites all properly align up
|
||||
|
||||
if(ghost_accs == GHOST_ACCS_FULL && (icon_state in GLOB.ghost_forms_with_accessories_list)) //check if this form supports accessories and if the client wants to show them
|
||||
var/datum/sprite_accessory/S
|
||||
@@ -280,12 +280,12 @@ Works together with spawning an observer, noted above.
|
||||
if(key)
|
||||
if(key[1] != "@") // Skip aghosts.
|
||||
stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now
|
||||
var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc.
|
||||
var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc.
|
||||
SStgui.on_transfer(src, ghost) // Transfer NanoUIs.
|
||||
ghost.can_reenter_corpse = can_reenter_corpse
|
||||
ghost.key = key
|
||||
ghost.client.init_verbs()
|
||||
if(!can_reenter_corpse) // Disassociates observer mind from the body mind
|
||||
if(!can_reenter_corpse) // Disassociates observer mind from the body mind
|
||||
ghost.mind = null
|
||||
return ghost
|
||||
|
||||
@@ -311,7 +311,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
||||
if(response != "Ghost")
|
||||
return FALSE//didn't want to ghost after-all
|
||||
ghostize(FALSE) // FALSE parameter is so we can never re-enter our body. U ded.
|
||||
ghostize(FALSE) // FALSE parameter is so we can never re-enter our body. U ded.
|
||||
return TRUE
|
||||
|
||||
/mob/camera/verb/ghost()
|
||||
@@ -358,7 +358,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(!can_reenter_corpse)
|
||||
to_chat(src, "<span class='warning'>You cannot re-enter your body.</span>")
|
||||
return
|
||||
if(mind.current.key && mind.current.key[1] != "@") //makes sure we don't accidentally kick any clients
|
||||
if(mind.current.key && mind.current.key[1] != "@") //makes sure we don't accidentally kick any clients
|
||||
to_chat(usr, "<span class='warning'>Another consciousness is in your body...It is resisting you.</span>")
|
||||
return
|
||||
client.view_size.setDefault(getScreenSize(client.prefs.widescreenpref))//Let's reset so people can't become allseeing gods
|
||||
@@ -495,7 +495,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.
|
||||
var/target = null //Chosen target.
|
||||
|
||||
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
|
||||
@@ -504,10 +504,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
return
|
||||
else
|
||||
var/mob/M = dest[target] //Destination mob
|
||||
var/mob/A = src //Source mob
|
||||
var/mob/A = src //Source mob
|
||||
var/turf/T = get_turf(M) //Turf of the destination mob
|
||||
|
||||
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
|
||||
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
|
||||
A.forceMove(T)
|
||||
A.update_parallax_contents()
|
||||
else
|
||||
|
||||
@@ -186,7 +186,7 @@
|
||||
return put_in_hand(I, get_empty_held_index_for_side(RIGHT_HANDS))
|
||||
|
||||
/mob/proc/put_in_hand_check(obj/item/I)
|
||||
return FALSE //nonliving mobs don't have hands
|
||||
return FALSE //nonliving mobs don't have hands
|
||||
|
||||
/mob/living/put_in_hand_check(obj/item/I)
|
||||
if(istype(I) && ((mobility_flags & MOBILITY_PICKUP) || (I.item_flags & ABSTRACT)))
|
||||
@@ -319,7 +319,7 @@
|
||||
I.layer = initial(I.layer)
|
||||
I.plane = initial(I.plane)
|
||||
I.appearance_flags &= ~NO_CLIENT_COLOR
|
||||
if(!no_move && !(I.item_flags & DROPDEL)) //item may be moved/qdel'd immedietely, don't bother moving it
|
||||
if(!no_move && !(I.item_flags & DROPDEL)) //item may be moved/qdel'd immedietely, don't bother moving it
|
||||
if (isnull(newloc))
|
||||
I.moveToNullspace()
|
||||
else
|
||||
|
||||
@@ -27,12 +27,12 @@
|
||||
stored_dna.species = new rando_race()
|
||||
|
||||
/mob/living/brain/Destroy()
|
||||
if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
|
||||
if(stat!=DEAD) //If not dead.
|
||||
death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
|
||||
if(mind) //You aren't allowed to return to brains that don't exist
|
||||
if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
|
||||
if(stat!=DEAD) //If not dead.
|
||||
death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
|
||||
if(mind) //You aren't allowed to return to brains that don't exist
|
||||
mind.current = null
|
||||
ghostize() //Ghostize checks for key so nothing else is necessary.
|
||||
ghostize() //Ghostize checks for key so nothing else is necessary.
|
||||
container = null
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
attack_verb_simple = list("attack", "slap", "whack")
|
||||
|
||||
///The brain's organ variables are significantly more different than the other organs, with half the decay rate for balance reasons, and twice the maxHealth
|
||||
decay_factor = STANDARD_ORGAN_DECAY * 0.5 //30 minutes of decaying to result in a fully damaged brain, since a fast decay rate would be unfun gameplay-wise
|
||||
decay_factor = STANDARD_ORGAN_DECAY * 0.5 //30 minutes of decaying to result in a fully damaged brain, since a fast decay rate would be unfun gameplay-wise
|
||||
|
||||
maxHealth = BRAIN_DAMAGE_DEATH
|
||||
low_threshold = 45
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
var/suicided = FALSE
|
||||
var/mob/living/brain/brainmob = null
|
||||
var/decoy_override = FALSE //if it's a fake brain with no brainmob assigned. Feedback messages will be faked as if it does have a brainmob. See changelings & dullahans.
|
||||
var/decoy_override = FALSE //if it's a fake brain with no brainmob assigned. Feedback messages will be faked as if it does have a brainmob. See changelings & dullahans.
|
||||
//two variables necessary for calculating whether we get a brain trauma or not
|
||||
var/damage_delta = 0
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
name = "brain"
|
||||
|
||||
if(C.mind && C.mind.has_antag_datum(/datum/antagonist/changeling) && !no_id_transfer) //congrats, you're trapped in a body you don't control
|
||||
if(C.mind && C.mind.has_antag_datum(/datum/antagonist/changeling) && !no_id_transfer) //congrats, you're trapped in a body you don't control
|
||||
if(brainmob && !(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_DEATHCOMA))))
|
||||
to_chat(brainmob, "<span class= danger>You can't feel your body! You're still just a brain!</span>")
|
||||
forceMove(C)
|
||||
@@ -130,7 +130,7 @@
|
||||
|
||||
user.visible_message("<span class='notice'>[user] pours the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.</span>", "<span class='notice'>You pour the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.</span>")
|
||||
var/healby = O.reagents.get_reagent_amount(/datum/reagent/medicine/mannitol)
|
||||
setOrganDamage(damage - healby*2) //heals 2 damage per unit of mannitol, and by using "setorgandamage", we clear the failing variable if that was up
|
||||
setOrganDamage(damage - healby*2) //heals 2 damage per unit of mannitol, and by using "setorgandamage", we clear the failing variable if that was up
|
||||
O.reagents.clear_reagents()
|
||||
return
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
to_chat(C, "<span class='notice'>[user] inserts [src] into your head.</span>")
|
||||
to_chat(user, "<span class='notice'>You insert [src] into [C]'s head.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You insert [src] into your head.</span>" )
|
||||
to_chat(user, "<span class='notice'>You insert [src] into your head.</span>" )
|
||||
|
||||
Insert(C)
|
||||
else
|
||||
@@ -225,7 +225,7 @@
|
||||
QDEL_LIST(traumas)
|
||||
|
||||
destroy_all_skillchips()
|
||||
if(owner?.mind) //You aren't allowed to return to brains that don't exist
|
||||
if(owner?.mind) //You aren't allowed to return to brains that don't exist
|
||||
owner.mind.current = null
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ In all, this is a lot like the monkey code. /N
|
||||
|
||||
/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M, modifiers)
|
||||
. = ..()
|
||||
if(.) //to allow surgery to return properly.
|
||||
if(.) //to allow surgery to return properly.
|
||||
return FALSE
|
||||
|
||||
if(M.combat_mode)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
butcher_results = list(/obj/item/food/meat/slab/xeno = 5, /obj/item/stack/sheet/animalhide/xeno = 1)
|
||||
limb_destroyer = 1
|
||||
hud_type = /datum/hud/alien
|
||||
melee_damage_lower = 20 //Refers to unarmed damage, aliens do unarmed attacks.
|
||||
melee_damage_lower = 20 //Refers to unarmed damage, aliens do unarmed attacks.
|
||||
melee_damage_upper = 20
|
||||
var/obj/item/r_store = null
|
||||
var/obj/item/l_store = null
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/regenerate_icons()
|
||||
if(!..())
|
||||
// update_icons() //Handled in update_transform(), leaving this here as a reminder
|
||||
// update_icons() //Handled in update_transform(), leaving this here as a reminder
|
||||
update_transform()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that.
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost)
|
||||
var/temperature = current
|
||||
var/difference = abs(current-loc_temp) //get difference
|
||||
var/increments// = difference/10 //find how many increments apart they are
|
||||
var/difference = abs(current-loc_temp) //get difference
|
||||
var/increments// = difference/10 //find how many increments apart they are
|
||||
if(difference > 50)
|
||||
increments = difference/5
|
||||
else
|
||||
increments = difference/10
|
||||
var/change = increments*boost // Get the amount to change by (x per increment)
|
||||
var/change = increments*boost // Get the amount to change by (x per increment)
|
||||
var/temp_change
|
||||
if(current < loc_temp)
|
||||
temperature = min(loc_temp, temperature+change)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
if(Q.stat == DEAD)
|
||||
continue
|
||||
if(Q.client)
|
||||
name = "alien princess ([rand(1, 999)])" //if this is too cutesy feel free to change it/remove it.
|
||||
name = "alien princess ([rand(1, 999)])" //if this is too cutesy feel free to change it/remove it.
|
||||
break
|
||||
|
||||
real_name = src.name
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
to_chat(user, "<span class='warning'>You cannot evolve when you are cuffed!</span>")
|
||||
return
|
||||
|
||||
if(L.amount_grown >= L.max_grown) //TODO ~Carn
|
||||
if(L.amount_grown >= L.max_grown) //TODO ~Carn
|
||||
to_chat(L, "<span class='name'>You are growing into a beautiful alien! It is time to choose a caste.</span>")
|
||||
to_chat(L, "<span class='info'>There are three to choose from:</span>")
|
||||
to_chat(L, "<span class='name'>Hunters</span> <span class='info'>are the most agile caste, tasked with hunting for hosts. They are faster than a human and can even pounce, but are not much tougher than a drone.</span>")
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
|
||||
if(!candidates.len || !owner)
|
||||
bursting = FALSE
|
||||
stage = 5 // If no ghosts sign up for the Larva, let's regress our growth by one minute, we will try again!
|
||||
stage = 5 // If no ghosts sign up for the Larva, let's regress our growth by one minute, we will try again!
|
||||
addtimer(CALLBACK(src, .proc/advance_embryo_stage), growth_time)
|
||||
return
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
var/atom/xeno_loc = get_turf(owner)
|
||||
var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc)
|
||||
new_xeno.key = ghost.key
|
||||
SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention
|
||||
SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention
|
||||
ADD_TRAIT(new_xeno, TRAIT_IMMOBILIZED, type) //so we don't move during the bursting animation
|
||||
ADD_TRAIT(new_xeno, TRAIT_HANDS_BLOCKED, type)
|
||||
new_xeno.notransform = 1
|
||||
|
||||
@@ -559,13 +559,13 @@
|
||||
/mob/living/carbon/updatehealth()
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
var/total_stamina = 0
|
||||
for(var/X in bodyparts) //hardcoded to streamline things a bit
|
||||
for(var/X in bodyparts) //hardcoded to streamline things a bit
|
||||
var/obj/item/bodypart/BP = X
|
||||
total_brute += (BP.brute_dam * BP.body_damage_coeff)
|
||||
total_burn += (BP.burn_dam * BP.body_damage_coeff)
|
||||
total_brute += (BP.brute_dam * BP.body_damage_coeff)
|
||||
total_burn += (BP.burn_dam * BP.body_damage_coeff)
|
||||
total_stamina += (BP.stamina_dam * BP.stam_damage_coeff)
|
||||
set_health(round(maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute, DAMAGE_PRECISION))
|
||||
staminaloss = round(total_stamina, DAMAGE_PRECISION)
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
I.add_mob_blood(src)
|
||||
var/turf/location = get_turf(src)
|
||||
add_splatter_floor(location)
|
||||
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
|
||||
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
|
||||
user.add_mob_blood(src)
|
||||
if(affecting.body_zone == BODY_ZONE_HEAD)
|
||||
if(wear_mask)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
. = ..()
|
||||
if(. && !(movement_type & FLOATING)) //floating is easy
|
||||
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous
|
||||
set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous
|
||||
else if(nutrition && stat != DEAD)
|
||||
adjust_nutrition(-(HUNGER_FACTOR/10))
|
||||
if(m_intent == MOVE_INTENT_RUN)
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
var/obj/item/bodypart/BP = X
|
||||
if(BP.dmg_overlay_type)
|
||||
if(BP.brutestate)
|
||||
damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") //we're adding icon_states of the base image as overlays
|
||||
damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") //we're adding icon_states of the base image as overlays
|
||||
if(BP.burnstate)
|
||||
damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_0[BP.burnstate]")
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
/**
|
||||
* If an organ exists in the slot requested, and we are capable of taking damage (we don't have [GODMODE] on), call the set damage proc on that organ, which can
|
||||
* set or clear the failing variable on that organ, making it either cease or start functions again, unlike adjustOrganLoss.
|
||||
* set or clear the failing variable on that organ, making it either cease or start functions again, unlike adjustOrganLoss.
|
||||
*
|
||||
* Arguments:
|
||||
* * slot - organ slot, like [ORGAN_SLOT_HEART]
|
||||
@@ -248,7 +248,7 @@
|
||||
/// damage MANY bodyparts, in random order
|
||||
/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status)
|
||||
if(status_flags & GODMODE)
|
||||
return //godmode
|
||||
return //godmode
|
||||
|
||||
var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_status)
|
||||
var/update = 0
|
||||
@@ -265,8 +265,8 @@
|
||||
|
||||
update |= picked.receive_damage(brute_per_part, burn_per_part, stamina_per_part, FALSE, required_status, wound_bonus = CANT_WOUND) // disabling wounds from these for now cuz your entire body snapping cause your heart stopped would suck
|
||||
|
||||
brute = round(brute - (picked.brute_dam - brute_was), DAMAGE_PRECISION)
|
||||
burn = round(burn - (picked.burn_dam - burn_was), DAMAGE_PRECISION)
|
||||
brute = round(brute - (picked.brute_dam - brute_was), DAMAGE_PRECISION)
|
||||
burn = round(burn - (picked.burn_dam - burn_was), DAMAGE_PRECISION)
|
||||
stamina = round(stamina - (picked.stamina_dam - stamina_was), DAMAGE_PRECISION)
|
||||
|
||||
parts -= picked
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
add_verb(src, /mob/living/proc/mob_sleep)
|
||||
add_verb(src, /mob/living/proc/toggle_resting)
|
||||
|
||||
icon_state = "" //Remove the inherent human icon that is visible on the map editor. We're rendering ourselves limb by limb, having it still be there results in a bug where the basic human icon appears below as south in all directions and generally looks nasty.
|
||||
icon_state = "" //Remove the inherent human icon that is visible on the map editor. We're rendering ourselves limb by limb, having it still be there results in a bug where the basic human icon appears below as south in all directions and generally looks nasty.
|
||||
|
||||
//initialize limbs first
|
||||
create_bodyparts()
|
||||
@@ -117,12 +117,12 @@
|
||||
if(obscured & ITEM_SLOT_EYES)
|
||||
dat += "<tr><td><font color=grey><B>Eyes:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
|
||||
else
|
||||
dat += "<tr><td><B>Eyes:</B></td><td><A href='?src=[REF(src)];item=[ITEM_SLOT_EYES]'>[(glasses && !(glasses.item_flags & ABSTRACT)) ? glasses : "<font color=grey>Empty</font>"]</A></td></tr>"
|
||||
dat += "<tr><td><B>Eyes:</B></td><td><A href='?src=[REF(src)];item=[ITEM_SLOT_EYES]'>[(glasses && !(glasses.item_flags & ABSTRACT)) ? glasses : "<font color=grey>Empty</font>"]</A></td></tr>"
|
||||
|
||||
if(obscured & ITEM_SLOT_EARS)
|
||||
dat += "<tr><td><font color=grey><B>Ears:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
|
||||
else
|
||||
dat += "<tr><td><B>Ears:</B></td><td><A href='?src=[REF(src)];item=[ITEM_SLOT_EARS]'>[(ears && !(ears.item_flags & ABSTRACT)) ? ears : "<font color=grey>Empty</font>"]</A></td></tr>"
|
||||
dat += "<tr><td><B>Ears:</B></td><td><A href='?src=[REF(src)];item=[ITEM_SLOT_EARS]'>[(ears && !(ears.item_flags & ABSTRACT)) ? ears : "<font color=grey>Empty</font>"]</A></td></tr>"
|
||||
|
||||
dat += "<tr><td> </td></tr>"
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
if(obscured & ITEM_SLOT_FEET)
|
||||
dat += "<tr><td><font color=grey><B>Shoes:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
|
||||
else
|
||||
dat += "<tr><td><B>Shoes:</B></td><td><A href='?src=[REF(src)];item=[ITEM_SLOT_FEET]'>[(shoes && !(shoes.item_flags & ABSTRACT)) ? shoes : "<font color=grey>Empty</font>"]</A>"
|
||||
dat += "<tr><td><B>Shoes:</B></td><td><A href='?src=[REF(src)];item=[ITEM_SLOT_FEET]'>[(shoes && !(shoes.item_flags & ABSTRACT)) ? shoes : "<font color=grey>Empty</font>"]</A>"
|
||||
if(shoes && shoes.can_be_tied && shoes.tied != SHOES_KNOTTED)
|
||||
dat += " <A href='?src=[REF(src)];shoes=[ITEM_SLOT_FEET]'>[shoes.tied ? "Untie shoes" : "Knot shoes"]</A>"
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
if(obscured & ITEM_SLOT_GLOVES)
|
||||
dat += "<tr><td><font color=grey><B>Gloves:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
|
||||
else
|
||||
dat += "<tr><td><B>Gloves:</B></td><td><A href='?src=[REF(src)];item=[ITEM_SLOT_GLOVES]'>[(gloves && !(gloves.item_flags & ABSTRACT)) ? gloves : "<font color=grey>Empty</font>"]</A></td></tr>"
|
||||
dat += "<tr><td><B>Gloves:</B></td><td><A href='?src=[REF(src)];item=[ITEM_SLOT_GLOVES]'>[(gloves && !(gloves.item_flags & ABSTRACT)) ? gloves : "<font color=grey>Empty</font>"]</A></td></tr>"
|
||||
|
||||
if(obscured & ITEM_SLOT_ICLOTHING)
|
||||
dat += "<tr><td><font color=grey><B>Uniform:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
|
||||
@@ -379,7 +379,7 @@
|
||||
if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD))
|
||||
return
|
||||
if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
|
||||
return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten
|
||||
return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten
|
||||
// Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access
|
||||
var/allowed_access = null
|
||||
var/obj/item/clothing/glasses/hud/security/G = H.glasses
|
||||
@@ -421,7 +421,7 @@
|
||||
return
|
||||
if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD))
|
||||
return
|
||||
to_chat(usr, "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]")
|
||||
to_chat(usr, "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]")
|
||||
for(var/datum/data/crime/c in R.fields["crim"])
|
||||
to_chat(usr, "<b>Crime:</b> [c.crimeName]")
|
||||
if (c.crimeDetails)
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
P.yo = new_y - curloc.y
|
||||
P.xo = new_x - curloc.x
|
||||
var/new_angle_s = P.Angle + rand(120,240)
|
||||
while(new_angle_s > 180) // Translate to regular projectile degrees
|
||||
while(new_angle_s > 180) // Translate to regular projectile degrees
|
||||
new_angle_s -= 360
|
||||
P.setAngle(new_angle_s)
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
apply_damage(15, BRUTE, wound_bonus=10)
|
||||
|
||||
/mob/living/carbon/human/attack_hand(mob/user, modifiers)
|
||||
if(..()) //to allow surgery to return properly.
|
||||
if(..()) //to allow surgery to return properly.
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
@@ -412,12 +412,12 @@
|
||||
burn_loss = 60
|
||||
if(bomb_armor)
|
||||
brute_loss = 30*(2 - round(bomb_armor*0.01, 0.05))
|
||||
burn_loss = brute_loss //damage gets reduced from 120 to up to 60 combined brute+burn
|
||||
burn_loss = brute_loss //damage gets reduced from 120 to up to 60 combined brute+burn
|
||||
damage_clothes(200 - bomb_armor, BRUTE, BOMB)
|
||||
if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT))
|
||||
ears.adjustEarDamage(30, 120)
|
||||
Unconscious(20) //short amount of time for follow up attacks against elusive enemies like wizards
|
||||
Knockdown(200 - (bomb_armor * 1.6)) //between ~4 and ~20 seconds of knockdown depending on bomb armor
|
||||
Unconscious(20) //short amount of time for follow up attacks against elusive enemies like wizards
|
||||
Knockdown(200 - (bomb_armor * 1.6)) //between ~4 and ~20 seconds of knockdown depending on bomb armor
|
||||
|
||||
if(EXPLODE_LIGHT)
|
||||
brute_loss = 30
|
||||
@@ -426,7 +426,7 @@
|
||||
damage_clothes(max(50 - bomb_armor, 0), BRUTE, BOMB)
|
||||
if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT))
|
||||
ears.adjustEarDamage(15,60)
|
||||
Knockdown(160 - (bomb_armor * 1.6)) //100 bomb armor will prevent knockdown altogether
|
||||
Knockdown(160 - (bomb_armor * 1.6)) //100 bomb armor will prevent knockdown altogether
|
||||
|
||||
take_overall_damage(brute_loss,burn_loss)
|
||||
|
||||
@@ -858,7 +858,7 @@
|
||||
broken.Insert(broken.len, "and ")
|
||||
broken_plural = TRUE
|
||||
else
|
||||
var/holder = broken[1] //our one and only element
|
||||
var/holder = broken[1] //our one and only element
|
||||
if(holder[length(holder)] == "s")
|
||||
broken_plural = TRUE
|
||||
//Put the items in that list into a string of text
|
||||
|
||||
@@ -28,19 +28,19 @@
|
||||
//Eye colour
|
||||
var/eye_color = "000"
|
||||
|
||||
var/skin_tone = "caucasian1" //Skin tone
|
||||
var/skin_tone = "caucasian1" //Skin tone
|
||||
|
||||
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
|
||||
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
|
||||
var/lip_color = "white"
|
||||
|
||||
var/age = 30 //Player's age
|
||||
var/age = 30 //Player's age
|
||||
|
||||
var/underwear = "Nude" //Which underwear the player wants
|
||||
var/underwear = "Nude" //Which underwear the player wants
|
||||
var/underwear_color = "000"
|
||||
var/undershirt = "Nude" //Which undershirt the player wants
|
||||
var/socks = "Nude" //Which socks the player wants
|
||||
var/backpack = DBACKPACK //Which backpack type the player has chosen.
|
||||
var/jumpsuit_style = PREF_SUIT //suit/skirt
|
||||
var/backpack = DBACKPACK //Which backpack type the player has chosen.
|
||||
var/jumpsuit_style = PREF_SUIT //suit/skirt
|
||||
|
||||
//Equipment slots
|
||||
var/obj/item/clothing/wear_suit = null
|
||||
|
||||
@@ -47,12 +47,12 @@
|
||||
|
||||
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when Fluacided or when updating a human's name variable
|
||||
/mob/living/carbon/human/proc/get_face_name(if_no_face="Unknown")
|
||||
if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible
|
||||
if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible
|
||||
return if_no_face
|
||||
if( head && (head.flags_inv&HIDEFACE) )
|
||||
return if_no_face //Likewise for hats
|
||||
return if_no_face //Likewise for hats
|
||||
var/obj/item/bodypart/O = get_bodypart(BODY_ZONE_HEAD)
|
||||
if( !O || (HAS_TRAIT(src, TRAIT_DISFIGURED)) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name ) //disfigured. use id-name if possible
|
||||
if( !O || (HAS_TRAIT(src, TRAIT_DISFIGURED)) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name ) //disfigured. use id-name if possible
|
||||
return if_no_face
|
||||
return real_name
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
if(card_slot?.stored_card)
|
||||
. = card_slot.stored_card.registered_name
|
||||
if(!.)
|
||||
. = if_no_id //to prevent null-names making the mob unclickable
|
||||
. = if_no_id //to prevent null-names making the mob unclickable
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/get_idcard(hand_first = TRUE)
|
||||
|
||||
@@ -6,7 +6,7 @@ This system allows you to update individual mob-overlays, without regenerating t
|
||||
When we generate overlays we generate the standing version and then rotate the mob as necessary..
|
||||
|
||||
As of the time of writing there are 20 layers within this list. Please try to keep this from increasing. //22 and counting, good job guys
|
||||
var/overlays_standing[20] //For the standing stance
|
||||
var/overlays_standing[20] //For the standing stance
|
||||
|
||||
Most of the time we only wish to update one overlay:
|
||||
e.g. - we dropped the fireaxe out of our left hand and need to remove its icon from our mob
|
||||
@@ -28,7 +28,7 @@ Note: The defines for layer numbers is now kept exclusvely in __DEFINES/misc.dm
|
||||
All of this means that this code is more maintainable, faster and still fairly easy to use.
|
||||
|
||||
There are several things that need to be remembered:
|
||||
> Whenever we do something that should cause an overlay to update (which doesn't use standard procs
|
||||
> Whenever we do something that should cause an overlay to update (which doesn't use standard procs
|
||||
( i.e. you do something like l_hand = /obj/item/something new(src), rather than using the helper procs)
|
||||
You will need to call the relevant update_inv_* proc
|
||||
|
||||
@@ -37,12 +37,12 @@ There are several things that need to be remembered:
|
||||
slime etc. Instead, it'll just return without doing any work. So no harm in calling it for slimes and such.
|
||||
|
||||
|
||||
> There are also these special cases:
|
||||
update_damage_overlays() //handles damage overlays for brute/burn damage
|
||||
update_body() //Handles updating your mob's body layer and mutant bodyparts
|
||||
> There are also these special cases:
|
||||
update_damage_overlays() //handles damage overlays for brute/burn damage
|
||||
update_body() //Handles updating your mob's body layer and mutant bodyparts
|
||||
as well as sprite-accessories that didn't really fit elsewhere (underwear, undershirts, socks, lips, eyes)
|
||||
//NOTE: update_mutantrace() is now merged into this!
|
||||
update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and
|
||||
update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and
|
||||
eyes were merged into update_body())
|
||||
|
||||
|
||||
@@ -216,10 +216,10 @@ There are several things that need to be remembered:
|
||||
inv.update_icon()
|
||||
|
||||
if(glasses)
|
||||
glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
|
||||
glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
|
||||
if(client && hud_used?.hud_shown)
|
||||
if(hud_used.inventory_shown) //if the inventory is open ...
|
||||
client.screen += glasses //Either way, add the item to the HUD
|
||||
if(hud_used.inventory_shown) //if the inventory is open ...
|
||||
client.screen += glasses //Either way, add the item to the HUD
|
||||
update_observer_view(glasses,1)
|
||||
if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES)))
|
||||
overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/clothing/eyes.dmi')
|
||||
@@ -246,10 +246,10 @@ There are several things that need to be remembered:
|
||||
inv.update_icon()
|
||||
|
||||
if(ears)
|
||||
ears.screen_loc = ui_ears //move the item to the appropriate screen loc
|
||||
ears.screen_loc = ui_ears //move the item to the appropriate screen loc
|
||||
if(client && hud_used?.hud_shown)
|
||||
if(hud_used.inventory_shown) //if the inventory is open
|
||||
client.screen += ears //add it to the client's screen
|
||||
if(hud_used.inventory_shown) //if the inventory is open
|
||||
client.screen += ears //add it to the client's screen
|
||||
update_observer_view(ears,1)
|
||||
overlays_standing[EARS_LAYER] = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = 'icons/mob/clothing/ears.dmi')
|
||||
var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER]
|
||||
@@ -273,10 +273,10 @@ There are several things that need to be remembered:
|
||||
inv.update_icon()
|
||||
|
||||
if(shoes)
|
||||
shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc
|
||||
shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc
|
||||
if(client && hud_used?.hud_shown)
|
||||
if(hud_used.inventory_shown) //if the inventory is open
|
||||
client.screen += shoes //add it to client's screen
|
||||
if(hud_used.inventory_shown) //if the inventory is open
|
||||
client.screen += shoes //add it to client's screen
|
||||
update_observer_view(shoes,1)
|
||||
overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/clothing/feet.dmi')
|
||||
var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER]
|
||||
@@ -302,7 +302,7 @@ There are several things that need to be remembered:
|
||||
if(client && hud_used?.hud_shown)
|
||||
client.screen += s_store
|
||||
update_observer_view(s_store)
|
||||
overlays_standing[SUIT_STORE_LAYER] = s_store.build_worn_icon(default_layer = SUIT_STORE_LAYER, default_icon_file = 'icons/mob/clothing/belt_mirror.dmi')
|
||||
overlays_standing[SUIT_STORE_LAYER] = s_store.build_worn_icon(default_layer = SUIT_STORE_LAYER, default_icon_file = 'icons/mob/clothing/belt_mirror.dmi')
|
||||
var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER]
|
||||
if(OFFSET_S_STORE in dna.species.offset_features)
|
||||
s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1]
|
||||
@@ -432,7 +432,7 @@ There are several things that need to be remembered:
|
||||
/proc/wear_female_version(t_color, icon, layer, type)
|
||||
var/index = t_color
|
||||
var/icon/female_clothing_icon = GLOB.female_clothing_icons[index]
|
||||
if(!female_clothing_icon) //Create standing/laying icons if they don't exist
|
||||
if(!female_clothing_icon) //Create standing/laying icons if they don't exist
|
||||
generate_female_clothing(index,t_color,icon,type)
|
||||
return mutable_appearance(GLOB.female_clothing_icons[t_color], layer = -layer)
|
||||
|
||||
|
||||
@@ -6,17 +6,17 @@
|
||||
// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection()
|
||||
// The values here should add up to 1.
|
||||
// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30%
|
||||
#define THERMAL_PROTECTION_HEAD 0.3
|
||||
#define THERMAL_PROTECTION_CHEST 0.15
|
||||
#define THERMAL_PROTECTION_GROIN 0.15
|
||||
#define THERMAL_PROTECTION_LEG_LEFT 0.075
|
||||
#define THERMAL_PROTECTION_LEG_RIGHT 0.075
|
||||
#define THERMAL_PROTECTION_FOOT_LEFT 0.025
|
||||
#define THERMAL_PROTECTION_FOOT_RIGHT 0.025
|
||||
#define THERMAL_PROTECTION_ARM_LEFT 0.075
|
||||
#define THERMAL_PROTECTION_ARM_RIGHT 0.075
|
||||
#define THERMAL_PROTECTION_HAND_LEFT 0.025
|
||||
#define THERMAL_PROTECTION_HAND_RIGHT 0.025
|
||||
#define THERMAL_PROTECTION_HEAD 0.3
|
||||
#define THERMAL_PROTECTION_CHEST 0.15
|
||||
#define THERMAL_PROTECTION_GROIN 0.15
|
||||
#define THERMAL_PROTECTION_LEG_LEFT 0.075
|
||||
#define THERMAL_PROTECTION_LEG_RIGHT 0.075
|
||||
#define THERMAL_PROTECTION_FOOT_LEFT 0.025
|
||||
#define THERMAL_PROTECTION_FOOT_RIGHT 0.025
|
||||
#define THERMAL_PROTECTION_ARM_LEFT 0.075
|
||||
#define THERMAL_PROTECTION_ARM_RIGHT 0.075
|
||||
#define THERMAL_PROTECTION_HAND_LEFT 0.025
|
||||
#define THERMAL_PROTECTION_HAND_RIGHT 0.025
|
||||
|
||||
/mob/living/carbon/human/Life()
|
||||
if (notransform)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
var/ancestor_name
|
||||
/// The number of times Pun Pun has died since he was last gibbed
|
||||
var/ancestor_chain = 1
|
||||
var/relic_hat //Note: these two are paths
|
||||
var/relic_hat //Note: these two are paths
|
||||
var/relic_mask
|
||||
var/memory_saved = FALSE
|
||||
|
||||
@@ -81,10 +81,10 @@
|
||||
/mob/living/carbon/human/species/monkey/punpun/proc/Read_Memory()
|
||||
if(fexists("data/npc_saves/Punpun.sav")) //legacy compatability to convert old format to new
|
||||
var/savefile/S = new /savefile("data/npc_saves/Punpun.sav")
|
||||
S["ancestor_name"] >> ancestor_name
|
||||
S["ancestor_name"] >> ancestor_name
|
||||
S["ancestor_chain"] >> ancestor_chain
|
||||
S["relic_hat"] >> relic_hat
|
||||
S["relic_mask"] >> relic_mask
|
||||
S["relic_hat"] >> relic_hat
|
||||
S["relic_mask"] >> relic_mask
|
||||
fdel("data/npc_saves/Punpun.sav")
|
||||
else
|
||||
var/json_file = file("data/npc_saves/Punpun.json")
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
//Stores several modifiers in a way that isn't cleared by changing species
|
||||
|
||||
/datum/physiology
|
||||
var/brute_mod = 1 // % of brute damage taken from all sources
|
||||
var/burn_mod = 1 // % of burn damage taken from all sources
|
||||
var/tox_mod = 1 // % of toxin damage taken from all sources
|
||||
var/oxy_mod = 1 // % of oxygen damage taken from all sources
|
||||
var/clone_mod = 1 // % of clone damage taken from all sources
|
||||
var/stamina_mod = 1 // % of stamina damage taken from all sources
|
||||
var/brain_mod = 1 // % of brain damage taken from all sources
|
||||
var/brute_mod = 1 // % of brute damage taken from all sources
|
||||
var/burn_mod = 1 // % of burn damage taken from all sources
|
||||
var/tox_mod = 1 // % of toxin damage taken from all sources
|
||||
var/oxy_mod = 1 // % of oxygen damage taken from all sources
|
||||
var/clone_mod = 1 // % of clone damage taken from all sources
|
||||
var/stamina_mod = 1 // % of stamina damage taken from all sources
|
||||
var/brain_mod = 1 // % of brain damage taken from all sources
|
||||
|
||||
var/pressure_mod = 1 // % of brute damage taken from low or high pressure (stacks with brute_mod)
|
||||
var/heat_mod = 1 // % of burn damage taken from heat (stacks with burn_mod)
|
||||
var/cold_mod = 1 // % of burn damage taken from cold (stacks with burn_mod)
|
||||
var/pressure_mod = 1 // % of brute damage taken from low or high pressure (stacks with brute_mod)
|
||||
var/heat_mod = 1 // % of burn damage taken from heat (stacks with burn_mod)
|
||||
var/cold_mod = 1 // % of burn damage taken from cold (stacks with burn_mod)
|
||||
|
||||
var/damage_resistance = 0 // %damage reduction from all sources
|
||||
|
||||
var/siemens_coeff = 1 // resistance to shocks
|
||||
var/siemens_coeff = 1 // resistance to shocks
|
||||
|
||||
var/stun_mod = 1 // % stun modifier
|
||||
var/bleed_mod = 1 // % bleeding modifier
|
||||
var/datum/armor/armor // internal armor datum
|
||||
var/stun_mod = 1 // % stun modifier
|
||||
var/bleed_mod = 1 // % bleeding modifier
|
||||
var/datum/armor/armor // internal armor datum
|
||||
|
||||
var/hunger_mod = 1 //% of hunger rate taken per tick.
|
||||
var/hunger_mod = 1 //% of hunger rate taken per tick.
|
||||
|
||||
/datum/physiology/New()
|
||||
armor = new
|
||||
|
||||
@@ -106,7 +106,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
///To use MUTCOLOR with a fixed color that's independent of the mcolor feature in DNA.
|
||||
var/fixed_mut_color = ""
|
||||
///Special mutation that can be found in the genepool exclusively in this species. Dont leave empty or changing species will be a headache
|
||||
var/inert_mutation = DWARFISM
|
||||
var/inert_mutation = DWARFISM
|
||||
///Used to set the mob's deathsound upon species change
|
||||
var/deathsound
|
||||
///Sounds to override barefeet walking
|
||||
@@ -198,7 +198,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
/datum/species/New()
|
||||
|
||||
if(!limbs_id) //if we havent set a limbs id to use, just use our own id
|
||||
if(!limbs_id) //if we havent set a limbs id to use, just use our own id
|
||||
limbs_id = id
|
||||
..()
|
||||
|
||||
@@ -390,7 +390,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/obj/item/I = V
|
||||
if(istype(I))
|
||||
C.dropItemToGround(I)
|
||||
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
|
||||
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
|
||||
C.put_in_hands(new mutanthands())
|
||||
|
||||
for(var/X in inherent_traits)
|
||||
@@ -749,7 +749,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
|
||||
var/list/bodyparts_to_add = mutant_bodyparts.Copy()
|
||||
var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||
var/list/standing = list()
|
||||
var/list/standing = list()
|
||||
|
||||
H.remove_overlay(BODY_BEHIND_LAYER)
|
||||
H.remove_overlay(BODY_ADJ_LAYER)
|
||||
@@ -1294,7 +1294,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
addtimer(CALLBACK(src, .proc/go_bald, H), 50)
|
||||
|
||||
/datum/species/proc/go_bald(mob/living/carbon/human/H)
|
||||
if(QDELETED(H)) //may be called from a timer
|
||||
if(QDELETED(H)) //may be called from a timer
|
||||
return
|
||||
H.facial_hairstyle = "Shaved"
|
||||
H.hairstyle = "Bald"
|
||||
@@ -1529,13 +1529,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/bloody = FALSE
|
||||
if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2))))
|
||||
if(affecting.status == BODYPART_ORGANIC)
|
||||
I.add_mob_blood(H) //Make the weapon bloody, not the person.
|
||||
if(prob(I.force * 2)) //blood spatter!
|
||||
I.add_mob_blood(H) //Make the weapon bloody, not the person.
|
||||
if(prob(I.force * 2)) //blood spatter!
|
||||
bloody = TRUE
|
||||
var/turf/location = H.loc
|
||||
if(istype(location))
|
||||
H.add_splatter_floor(location)
|
||||
if(get_dist(user, H) <= 1) //people with TK won't get smeared with blood
|
||||
if(get_dist(user, H) <= 1) //people with TK won't get smeared with blood
|
||||
user.add_mob_blood(H)
|
||||
|
||||
switch(hit_area)
|
||||
@@ -1558,7 +1558,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(rev)
|
||||
rev.remove_revolutionary(FALSE, user)
|
||||
|
||||
if(bloody) //Apply blood
|
||||
if(bloody) //Apply blood
|
||||
if(H.wear_mask)
|
||||
H.wear_mask.add_mob_blood(H)
|
||||
H.update_inv_wear_mask()
|
||||
@@ -2103,7 +2103,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
/datum/species/proc/CanFly(mob/living/carbon/human/H)
|
||||
if(H.stat || H.body_position == LYING_DOWN)
|
||||
return FALSE
|
||||
if(H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) //Jumpsuits have tail holes, so it makes sense they have wing holes too
|
||||
if(H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) //Jumpsuits have tail holes, so it makes sense they have wing holes too
|
||||
to_chat(H, "<span class='warning'>Your suit blocks your wings from extending!</span>")
|
||||
return FALSE
|
||||
var/turf/T = get_turf(H)
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
/datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas!
|
||||
if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas!
|
||||
if(H.dna.features["tail_human"] == "None")
|
||||
H.dna.features["tail_human"] = "Cat"
|
||||
if(H.dna.features["ears"] == "None")
|
||||
|
||||
@@ -863,7 +863,7 @@
|
||||
/datum/species/golem/bronze/proc/gong(mob/living/carbon/human/H)
|
||||
last_gong_time = world.time
|
||||
for(var/mob/living/M in get_hearers_in_view(7,H))
|
||||
if(M.stat == DEAD) //F
|
||||
if(M.stat == DEAD) //F
|
||||
continue
|
||||
if(M == H)
|
||||
H.show_message("<span class='narsiesmall'>You cringe with pain as your body rings around you!</span>", MSG_AUDIBLE)
|
||||
|
||||
@@ -370,24 +370,24 @@
|
||||
return FALSE
|
||||
var/datum/species/jelly/slime/SS = H.dna.species
|
||||
|
||||
if(QDELETED(dupe)) //Is there a body?
|
||||
if(QDELETED(dupe)) //Is there a body?
|
||||
SS.bodies -= dupe
|
||||
return FALSE
|
||||
|
||||
if(!isslimeperson(dupe)) //Is it a slimeperson?
|
||||
if(!isslimeperson(dupe)) //Is it a slimeperson?
|
||||
SS.bodies -= dupe
|
||||
return FALSE
|
||||
|
||||
if(dupe.stat == DEAD) //Is it alive?
|
||||
if(dupe.stat == DEAD) //Is it alive?
|
||||
return FALSE
|
||||
|
||||
if(dupe.stat != CONSCIOUS) //Is it awake?
|
||||
if(dupe.stat != CONSCIOUS) //Is it awake?
|
||||
return FALSE
|
||||
|
||||
if(dupe.mind && dupe.mind.active) //Is it unoccupied?
|
||||
if(dupe.mind && dupe.mind.active) //Is it unoccupied?
|
||||
return FALSE
|
||||
|
||||
if(!(dupe in SS.bodies)) //Do we actually own it?
|
||||
if(!(dupe in SS.bodies)) //Do we actually own it?
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
suicide_log()
|
||||
adjustBruteLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
death(FALSE)
|
||||
ghostize(FALSE) // Disallows reentering body and disassociates mind
|
||||
ghostize(FALSE) // Disallows reentering body and disassociates mind
|
||||
|
||||
@@ -146,12 +146,12 @@
|
||||
|
||||
/mob/living/proc/handle_traits()
|
||||
//Eyes
|
||||
if(eye_blind) //blindness, heals slowly over time
|
||||
if(eye_blind) //blindness, heals slowly over time
|
||||
if(HAS_TRAIT_FROM(src, TRAIT_BLIND, EYES_COVERED)) //covering your eyes heals blurry eyes faster
|
||||
adjust_blindness(-3)
|
||||
else if(!stat && !(HAS_TRAIT(src, TRAIT_BLIND)))
|
||||
adjust_blindness(-1)
|
||||
else if(eye_blurry) //blurry eyes heal slowly
|
||||
else if(eye_blurry) //blurry eyes heal slowly
|
||||
adjust_blurriness(-1)
|
||||
|
||||
/mob/living/proc/update_damage_hud()
|
||||
|
||||
@@ -241,7 +241,7 @@
|
||||
if((AM.move_resist * MOVE_FORCE_CRUSH_RATIO) <= force)
|
||||
if(move_crush(AM, move_force, dir_to_target))
|
||||
push_anchored = TRUE
|
||||
if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally
|
||||
if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally
|
||||
if(force_push(AM, move_force, dir_to_target, push_anchored))
|
||||
push_anchored = TRUE
|
||||
if((AM.anchored && !push_anchored) || (force < (AM.move_resist * MOVE_FORCE_PUSH_RATIO)))
|
||||
@@ -612,11 +612,11 @@
|
||||
//Recursive function to find everything a mob is holding. Really shitty proc tbh.
|
||||
/mob/living/get_contents()
|
||||
var/list/ret = list()
|
||||
ret |= contents //add our contents
|
||||
for(var/i in ret.Copy()) //iterate storage objects
|
||||
ret |= contents //add our contents
|
||||
for(var/i in ret.Copy()) //iterate storage objects
|
||||
var/atom/A = i
|
||||
SEND_SIGNAL(A, COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret)
|
||||
for(var/obj/item/folder/F in ret.Copy()) //very snowflakey-ly iterate folders
|
||||
for(var/obj/item/folder/F in ret.Copy()) //very snowflakey-ly iterate folders
|
||||
ret |= F.contents
|
||||
return ret
|
||||
|
||||
@@ -854,7 +854,7 @@
|
||||
return
|
||||
|
||||
var/bleed_amount = bleedDragAmount()
|
||||
blood_volume = max(blood_volume - bleed_amount, 0) //that depends on our brute damage.
|
||||
blood_volume = max(blood_volume - bleed_amount, 0) //that depends on our brute damage.
|
||||
var/newdir = get_dir(target_turf, start)
|
||||
if(newdir != direction)
|
||||
newdir = newdir | direction
|
||||
|
||||
@@ -18,12 +18,12 @@
|
||||
var/health = MAX_LIVING_HEALTH
|
||||
|
||||
//Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS
|
||||
var/bruteloss = 0 ///Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage)
|
||||
var/oxyloss = 0 ///Oxygen depravation damage (no air in lungs)
|
||||
var/toxloss = 0 ///Toxic damage caused by being poisoned or radiated
|
||||
var/fireloss = 0 ///Burn damage caused by being way too hot, too cold or burnt.
|
||||
var/cloneloss = 0 ///Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims
|
||||
var/staminaloss = 0 ///Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this.
|
||||
var/bruteloss = 0 ///Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage)
|
||||
var/oxyloss = 0 ///Oxygen depravation damage (no air in lungs)
|
||||
var/toxloss = 0 ///Toxic damage caused by being poisoned or radiated
|
||||
var/fireloss = 0 ///Burn damage caused by being way too hot, too cold or burnt.
|
||||
var/cloneloss = 0 ///Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims
|
||||
var/staminaloss = 0 ///Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this.
|
||||
var/crit_threshold = HEALTH_THRESHOLD_CRIT /// when the mob goes from "normal" to crit
|
||||
///When the mob enters hard critical state and is fully incapacitated.
|
||||
var/hardcrit_threshold = HEALTH_THRESHOLD_FULLCRIT
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
var/list/roundstart_quirks = list()
|
||||
|
||||
var/list/surgeries = list() ///a list of surgery datums. generally empty, they're added when the player wants them.
|
||||
var/list/surgeries = list() ///a list of surgery datums. generally empty, they're added when the player wants them.
|
||||
|
||||
var/now_pushing = null //! Used by [living/Bump()][/mob/living/proc/Bump] and [living/PushAM()][/mob/living/proc/PushAM] to prevent potential infinite loop.
|
||||
|
||||
@@ -132,11 +132,11 @@
|
||||
|
||||
var/list/implants = null
|
||||
|
||||
var/last_words ///used for database logging
|
||||
var/last_words ///used for database logging
|
||||
|
||||
var/list/obj/effect/proc_holder/abilities = list()
|
||||
|
||||
var/can_be_held = FALSE //whether this can be picked up and held.
|
||||
var/can_be_held = FALSE //whether this can be picked up and held.
|
||||
var/worn_slot_flags = NONE //if it can be held, can it be equipped to any slots? (think pAI's on head)
|
||||
|
||||
var/radiation = 0 ///If the mob is irradiated.
|
||||
|
||||
@@ -313,8 +313,8 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
|
||||
if(client) //client is so that ghosts don't have to listen to mice
|
||||
for(var/_M in GLOB.player_list)
|
||||
var/mob/M = _M
|
||||
if(QDELETED(M)) //Some times nulls and deleteds stay in this list. This is a workaround to prevent ic chat breaking for everyone when they do.
|
||||
continue //Remove if underlying cause (likely byond issue) is fixed. See TG PR #49004.
|
||||
if(QDELETED(M)) //Some times nulls and deleteds stay in this list. This is a workaround to prevent ic chat breaking for everyone when they do.
|
||||
continue //Remove if underlying cause (likely byond issue) is fixed. See TG PR #49004.
|
||||
if(M.stat != DEAD) //not dead, not important
|
||||
continue
|
||||
if(get_dist(M, src) > 7 || M.z != z) //they're out of range of normal hearing
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/Logout()
|
||||
update_z(null)
|
||||
..()
|
||||
if(!key && mind) //key and mind have become separated.
|
||||
mind.active = FALSE //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
|
||||
if(!key && mind) //key and mind have become separated.
|
||||
mind.active = FALSE //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
|
||||
med_hud_set_status()
|
||||
|
||||
@@ -53,14 +53,14 @@
|
||||
var/datum/module_picker/malf_picker
|
||||
var/list/datum/ai_module/current_modules = list()
|
||||
var/can_dominate_mechs = FALSE
|
||||
var/shunted = FALSE //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead
|
||||
var/shunted = FALSE //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead
|
||||
|
||||
var/control_disabled = FALSE // Set to 1 to stop AI from interacting via Click()
|
||||
var/malfhacking = FALSE // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
|
||||
var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown
|
||||
var/control_disabled = FALSE // Set to 1 to stop AI from interacting via Click()
|
||||
var/malfhacking = FALSE // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
|
||||
var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown
|
||||
|
||||
var/obj/machinery/power/apc/malfhack
|
||||
var/explosive = FALSE //does the AI explode when it dies?
|
||||
var/explosive = FALSE //does the AI explode when it dies?
|
||||
|
||||
var/mob/living/silicon/ai/parent
|
||||
var/camera_light_on = FALSE
|
||||
@@ -70,11 +70,11 @@
|
||||
|
||||
var/last_paper_seen = null
|
||||
var/can_shunt = TRUE
|
||||
var/last_announcement = "" // For AI VOX, if enabled
|
||||
var/last_announcement = "" // For AI VOX, if enabled
|
||||
var/turf/waypoint //Holds the turf of the currently selected waypoint.
|
||||
var/waypoint_mode = FALSE //Waypoint mode is for selecting a turf via clicking.
|
||||
var/call_bot_cooldown = 0 //time of next call bot command
|
||||
var/obj/machinery/power/apc/apc_override //Ref of the AI's APC, used when the AI has no power in order to access their APC.
|
||||
var/waypoint_mode = FALSE //Waypoint mode is for selecting a turf via clicking.
|
||||
var/call_bot_cooldown = 0 //time of next call bot command
|
||||
var/obj/machinery/power/apc/apc_override //Ref of the AI's APC, used when the AI has no power in order to access their APC.
|
||||
var/nuking = FALSE
|
||||
var/obj/machinery/doomsday_device/doomsday_device
|
||||
|
||||
@@ -547,7 +547,7 @@
|
||||
var/foo = 0
|
||||
var/dat2 = ""
|
||||
for (var/obj/machinery/camera/I in CL)
|
||||
dat2 += text("[]<A HREF=?src=[REF(src)];switchcamera=[REF(I)]>[]</A>", (!foo) ? "" : " | ", I.c_tag) //I'm not fixing this shit...
|
||||
dat2 += text("[]<A HREF=?src=[REF(src)];switchcamera=[REF(I)]>[]</A>", (!foo) ? "" : " | ", I.c_tag) //I'm not fixing this shit...
|
||||
foo = 1
|
||||
queueAlarm(text ("--- [] alarm detected in []! ([])", class, A.name, dat2), class)
|
||||
else
|
||||
@@ -619,7 +619,7 @@
|
||||
to_chat(src, "<span class='notice'>Switched to the \"[uppertext(network)]\" camera network.</span>")
|
||||
//End of code by Mord_Sith
|
||||
|
||||
//I am the icon meister. Bow fefore me. //>fefore
|
||||
//I am the icon meister. Bow fefore me. //>fefore
|
||||
/mob/living/silicon/ai/proc/ai_hologram_change()
|
||||
set name = "Change Hologram"
|
||||
set desc = "Change the default hologram available to AI to something else."
|
||||
@@ -785,7 +785,7 @@
|
||||
new_core.circuit.battery = battery
|
||||
ai_restore_power()//So the AI initially has power.
|
||||
control_disabled = TRUE //Can't control things remotely if you're stuck in a card!
|
||||
radio_enabled = FALSE //No talking on the built-in radio for you either!
|
||||
radio_enabled = FALSE //No talking on the built-in radio for you either!
|
||||
forceMove(card)
|
||||
card.AI = src
|
||||
to_chat(src, "You have been downloaded to a mobile storage device. Remote device connection severed.")
|
||||
|
||||
@@ -106,7 +106,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new)
|
||||
if(USE_STATIC_OPAQUE)
|
||||
client.images -= GLOB.cameranet.obscured
|
||||
|
||||
// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open.
|
||||
// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open.
|
||||
|
||||
/datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1)
|
||||
if(!SSticker || (opacity_check && !A.opacity))
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
add_overlay(highlighted ? highlighted_background : standard_background)
|
||||
|
||||
/atom/movable/screen/movable/pic_in_pic/ai/set_view_size(width, height, do_refresh = TRUE)
|
||||
aiEye.static_visibility_range = (round(max(width, height) / 2) + 1)
|
||||
aiEye.static_visibility_range = (round(max(width, height) / 2) + 1)
|
||||
if(ai)
|
||||
ai.camera_visibility(aiEye)
|
||||
..()
|
||||
|
||||
@@ -26,45 +26,45 @@
|
||||
var/network = "ss13"
|
||||
var/obj/machinery/camera/current = null
|
||||
|
||||
var/ram = 100 // Used as currency to purchase different abilities
|
||||
var/ram = 100 // Used as currency to purchase different abilities
|
||||
var/list/software = list()
|
||||
var/userDNA // The DNA string of our assigned user
|
||||
var/obj/item/paicard/card // The card we inhabit
|
||||
var/hacking = FALSE //Are we hacking a door?
|
||||
var/userDNA // The DNA string of our assigned user
|
||||
var/obj/item/paicard/card // The card we inhabit
|
||||
var/hacking = FALSE //Are we hacking a door?
|
||||
|
||||
var/speakStatement = "states"
|
||||
var/speakExclamation = "declares"
|
||||
var/speakDoubleExclamation = "alarms"
|
||||
var/speakQuery = "queries"
|
||||
|
||||
var/obj/item/pai_cable/hacking_cable // The cable we produce when hacking a door
|
||||
var/obj/item/pai_cable/hacking_cable // The cable we produce when hacking a door
|
||||
|
||||
var/master // Name of the one who commands us
|
||||
var/master_dna // DNA string for owner verification
|
||||
var/master // Name of the one who commands us
|
||||
var/master_dna // DNA string for owner verification
|
||||
|
||||
// Various software-specific vars
|
||||
|
||||
var/temp // General error reporting text contained here will typically be shown once and cleared
|
||||
var/screen // Which screen our main window displays
|
||||
var/subscreen // Which specific function of the main screen is being displayed
|
||||
var/temp // General error reporting text contained here will typically be shown once and cleared
|
||||
var/screen // Which screen our main window displays
|
||||
var/subscreen // Which specific function of the main screen is being displayed
|
||||
|
||||
var/secHUD = 0 // Toggles whether the Security HUD is active or not
|
||||
var/medHUD = 0 // Toggles whether the Medical HUD is active or not
|
||||
var/secHUD = 0 // Toggles whether the Security HUD is active or not
|
||||
var/medHUD = 0 // Toggles whether the Medical HUD is active or not
|
||||
|
||||
var/datum/data/record/medicalActive1 // Datacore record declarations for record software
|
||||
var/datum/data/record/medicalActive1 // Datacore record declarations for record software
|
||||
var/datum/data/record/medicalActive2
|
||||
|
||||
var/datum/data/record/securityActive1 // Could probably just combine all these into one
|
||||
var/datum/data/record/securityActive1 // Could probably just combine all these into one
|
||||
var/datum/data/record/securityActive2
|
||||
|
||||
var/obj/machinery/door/hackdoor // The airlock being hacked
|
||||
var/hackprogress = 0 // Possible values: 0 - 100, >= 100 means the hack is complete and will be reset upon next check
|
||||
var/obj/machinery/door/hackdoor // The airlock being hacked
|
||||
var/hackprogress = 0 // Possible values: 0 - 100, >= 100 means the hack is complete and will be reset upon next check
|
||||
|
||||
var/obj/item/integrated_signaler/signaler // AI's signaller
|
||||
|
||||
var/obj/item/instrument/piano_synth/internal_instrument
|
||||
var/obj/machinery/newscaster //pAI Newscaster
|
||||
var/obj/item/healthanalyzer/hostscan //pAI healthanalyzer
|
||||
var/obj/machinery/newscaster //pAI Newscaster
|
||||
var/obj/item/healthanalyzer/hostscan //pAI healthanalyzer
|
||||
|
||||
/// Internal pAI GPS, enabled if pAI downloads GPS software, and then uses it.
|
||||
var/obj/item/gps/pai/internal_gps = null
|
||||
@@ -75,7 +75,7 @@
|
||||
var/can_transmit = TRUE
|
||||
var/can_receive = TRUE
|
||||
var/chassis = "repairbot"
|
||||
var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "bat" = FALSE, "butterfly" = FALSE, "hawk" = FALSE, "lizard" = FALSE, "duffel" = TRUE) //assoc value is whether it can be picked up.
|
||||
var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "bat" = FALSE, "butterfly" = FALSE, "hawk" = FALSE, "lizard" = FALSE, "duffel" = TRUE) //assoc value is whether it can be picked up.
|
||||
|
||||
var/emitterhealth = 20
|
||||
var/emittermaxhealth = 20
|
||||
@@ -85,7 +85,7 @@
|
||||
var/emittersemicd = FALSE
|
||||
|
||||
var/overload_ventcrawl = 0
|
||||
var/overload_bulletblock = 0 //Why is this a good idea?
|
||||
var/overload_bulletblock = 0 //Why is this a good idea?
|
||||
var/overload_maxhealth = 0
|
||||
var/silent = FALSE
|
||||
var/brightness_power = 5
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
/mob/living/silicon/pai/ex_act(severity, target)
|
||||
take_holo_damage(severity * 50)
|
||||
switch(severity)
|
||||
if(1) //RIP
|
||||
if(1) //RIP
|
||||
qdel(card)
|
||||
qdel(src)
|
||||
if(2)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// TODO:
|
||||
// - Potentially roll HUDs and Records into one
|
||||
// - Shock collar/lock system for prisoner pAIs?
|
||||
// - Potentially roll HUDs and Records into one
|
||||
// - Shock collar/lock system for prisoner pAIs?
|
||||
|
||||
|
||||
/mob/living/silicon/pai/var/list/available_software = list(
|
||||
@@ -36,12 +36,12 @@
|
||||
|
||||
if(temp)
|
||||
left_part = temp
|
||||
else if(stat == DEAD) // Show some flavor text if the pAI is dead
|
||||
else if(stat == DEAD) // Show some flavor text if the pAI is dead
|
||||
left_part = "<b><font color=red>ÈRrÖR Ða†Ä ÇÖRrÚþ†Ìoñ</font></b>"
|
||||
right_part = "<pre>Program index hash not found</pre>"
|
||||
|
||||
else
|
||||
switch(screen) // Determine which interface to show here
|
||||
switch(screen) // Determine which interface to show here
|
||||
if("main")
|
||||
left_part = ""
|
||||
if("directives")
|
||||
@@ -76,7 +76,7 @@
|
||||
left_part = softwareHostScan()
|
||||
|
||||
|
||||
//usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc
|
||||
//usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc
|
||||
|
||||
|
||||
// Declaring a doctype is necessary to enable BYOND's crappy browser's more advanced CSS functionality
|
||||
@@ -255,7 +255,7 @@
|
||||
radio.subspace_transmission = TRUE
|
||||
|
||||
if("translator")
|
||||
if(href_list["toggle"]) //This is permanent.
|
||||
if(href_list["toggle"]) //This is permanent.
|
||||
grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_SOFTWARE)
|
||||
|
||||
if("doorjack")
|
||||
@@ -293,7 +293,7 @@
|
||||
|
||||
// MENUS
|
||||
|
||||
/mob/living/silicon/pai/proc/softwareMenu() // Populate the right menu
|
||||
/mob/living/silicon/pai/proc/softwareMenu() // Populate the right menu
|
||||
var/dat = ""
|
||||
|
||||
dat += "<A href='byond://?src=[REF(src)];software=refresh'>Refresh</A><br>"
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
robot_modules_background = new()
|
||||
robot_modules_background.icon_state = "block"
|
||||
robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it.
|
||||
robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it.
|
||||
robot_modules_background.plane = HUD_PLANE
|
||||
|
||||
inv1 = new /atom/movable/screen/robot/module1()
|
||||
@@ -180,7 +180,7 @@
|
||||
real_name = changed_name
|
||||
name = real_name
|
||||
if(!QDELETED(builtInCamera))
|
||||
builtInCamera.c_tag = real_name //update the camera name too
|
||||
builtInCamera.c_tag = real_name //update the camera name too
|
||||
|
||||
/mob/living/silicon/robot/proc/get_standard_name()
|
||||
return "[(designation ? "[designation] " : "")][mmi.braintype]-[ident]"
|
||||
@@ -784,7 +784,7 @@
|
||||
real_name = name
|
||||
GLOB.available_ai_shells |= src
|
||||
if(!QDELETED(builtInCamera))
|
||||
builtInCamera.c_tag = real_name //update the camera name too
|
||||
builtInCamera.c_tag = real_name //update the camera name too
|
||||
diag_hud_set_aishell()
|
||||
|
||||
/**
|
||||
@@ -815,7 +815,7 @@
|
||||
real_name = "[AI.real_name] [designation] Shell-[ident]"
|
||||
name = real_name
|
||||
if(!QDELETED(builtInCamera))
|
||||
builtInCamera.c_tag = real_name //update the camera name too
|
||||
builtInCamera.c_tag = real_name //update the camera name too
|
||||
mainframe = AI
|
||||
deployed = TRUE
|
||||
set_connected_ai(mainframe)
|
||||
@@ -860,7 +860,7 @@
|
||||
if(radio) //Return radio to normal
|
||||
radio.recalculateChannels()
|
||||
if(!QDELETED(builtInCamera))
|
||||
builtInCamera.c_tag = real_name //update the camera name too
|
||||
builtInCamera.c_tag = real_name //update the camera name too
|
||||
diag_hud_set_aishell()
|
||||
mainframe.diag_hud_set_deployed()
|
||||
if(mainframe.laws)
|
||||
|
||||
@@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
|
||||
to_chat(user, "<span class='warning'>The wires seem fine, there's no need to fix them.</span>")
|
||||
return
|
||||
|
||||
if(W.tool_behaviour == TOOL_CROWBAR) // crowbar means open or close the cover
|
||||
if(W.tool_behaviour == TOOL_CROWBAR) // crowbar means open or close the cover
|
||||
if(opened)
|
||||
to_chat(user, "<span class='notice'>You close the cover.</span>")
|
||||
opened = FALSE
|
||||
@@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
|
||||
update_icons()
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/stock_parts/cell) && opened) // trying to put a cell inside
|
||||
if(istype(W, /obj/item/stock_parts/cell) && opened) // trying to put a cell inside
|
||||
if(wiresexposed)
|
||||
to_chat(user, "<span class='warning'>Close the cover first!</span>")
|
||||
else if(cell)
|
||||
@@ -74,13 +74,13 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
|
||||
to_chat(user, "<span class='warning'>You can't reach the wiring!</span>")
|
||||
return
|
||||
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER && opened) // wire hacking or radio management
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER && opened) // wire hacking or radio management
|
||||
if(!cell) //haxing
|
||||
wiresexposed = !wiresexposed
|
||||
to_chat(user, "<span class='notice'>The wires have been [wiresexposed ? "exposed" : "unexposed"].</span>")
|
||||
else //radio
|
||||
if(shell)
|
||||
to_chat(user, "<span class='warning'>You cannot seem to open the radio compartment!</span>") //Prevent AI radio key theft
|
||||
to_chat(user, "<span class='warning'>You cannot seem to open the radio compartment!</span>") //Prevent AI radio key theft
|
||||
else if(radio)
|
||||
radio.attackby(W,user)//Push it to the radio to let it handle everything
|
||||
else
|
||||
@@ -163,7 +163,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
|
||||
to_chat(user, "<span class='warning'>Unable to locate a radio!</span>")
|
||||
return
|
||||
|
||||
if (W.GetID()) // trying to unlock the interface with an ID card
|
||||
if (W.GetID()) // trying to unlock the interface with an ID card
|
||||
if(opened)
|
||||
to_chat(user, "<span class='warning'>You must close the cover to swipe an ID card!</span>")
|
||||
else
|
||||
|
||||
@@ -215,7 +215,7 @@
|
||||
/obj/item/paint/anycolor,
|
||||
/obj/item/soap/nanotrasen,
|
||||
/obj/item/pneumatic_cannon/pie/selfcharge/cyborg,
|
||||
/obj/item/razor, //killbait material
|
||||
/obj/item/razor, //killbait material
|
||||
/obj/item/lipstick/purple,
|
||||
/obj/item/reagent_containers/spray/waterflower/cyborg,
|
||||
/obj/item/borg/cyborghug/peacekeeper,
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
var/updating = FALSE //portable camera camerachunk update
|
||||
|
||||
var/hack_software = FALSE //Will be able to use hacking actions
|
||||
var/interaction_range = 7 //wireless control range
|
||||
var/interaction_range = 7 //wireless control range
|
||||
var/obj/item/pda/ai/aiPDA
|
||||
|
||||
/mob/living/silicon/Initialize()
|
||||
@@ -371,7 +371,7 @@
|
||||
Autochan += " ([radio.frequency])"
|
||||
else if(Autochan == "None") //Prevents use of the radio for automatic annoucements.
|
||||
radiomod = ""
|
||||
else //For department channels, if any, given by the internal radio.
|
||||
else //For department channels, if any, given by the internal radio.
|
||||
for(var/key in GLOB.department_radio_keys)
|
||||
if(GLOB.department_radio_keys[key] == Autochan)
|
||||
radiomod = ":" + key
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
if(buckled_mobs)
|
||||
for(var/mob/living/M in buckled_mobs)
|
||||
unbuckle_mob(M)
|
||||
M.electrocute_act(shock_damage/100, source, siemens_coeff, flags) //Hard metal shell conducts!
|
||||
M.electrocute_act(shock_damage/100, source, siemens_coeff, flags) //Hard metal shell conducts!
|
||||
return 0 //So borgs they don't die trying to fix wiring
|
||||
|
||||
/mob/living/silicon/emp_act(severity)
|
||||
|
||||
@@ -59,13 +59,13 @@
|
||||
if(!on)
|
||||
return
|
||||
switch(mode)
|
||||
if(BOT_IDLE) // idle
|
||||
if(BOT_IDLE) // idle
|
||||
update_icon()
|
||||
walk_to(src,0)
|
||||
look_for_perp() // see if any criminals are in range
|
||||
if(!mode && auto_patrol) // still idle, and set to patrol
|
||||
mode = BOT_START_PATROL // switch to patrol mode
|
||||
if(BOT_HUNT) // hunting for perp
|
||||
look_for_perp() // see if any criminals are in range
|
||||
if(!mode && auto_patrol) // still idle, and set to patrol
|
||||
mode = BOT_START_PATROL // switch to patrol mode
|
||||
if(BOT_HUNT) // hunting for perp
|
||||
update_icon()
|
||||
playsound(src,'sound/effects/beepskyspinsabre.ogg',100,TRUE,-1)
|
||||
// general beepsky doesn't give up so easily, jedi scum
|
||||
@@ -73,13 +73,13 @@
|
||||
walk_to(src,0)
|
||||
back_to_idle()
|
||||
return
|
||||
if(target) // make sure target exists
|
||||
if(Adjacent(target) && isturf(target.loc)) // if right next to perp
|
||||
if(target) // make sure target exists
|
||||
if(Adjacent(target) && isturf(target.loc)) // if right next to perp
|
||||
target_lastloc = target.loc //stun_attack() can clear the target if they're dead, so this needs to be set first
|
||||
stun_attack(target)
|
||||
set_anchored(TRUE)
|
||||
return
|
||||
else // not next to perp
|
||||
else // not next to perp
|
||||
var/turf/olddist = get_dist(src, target)
|
||||
walk_to(src, target,1,4)
|
||||
if((get_dist(src, target)) >= (olddist))
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
var/open = FALSE//Maint panel
|
||||
var/locked = TRUE
|
||||
var/hacked = FALSE //Used to differentiate between being hacked by silicons and emagged by humans.
|
||||
var/text_hack = "" //Custom text returned to a silicon upon hacking a bot.
|
||||
var/text_dehack = "" //Text shown when resetting a bots hacked status to normal.
|
||||
var/text_hack = "" //Custom text returned to a silicon upon hacking a bot.
|
||||
var/text_dehack = "" //Text shown when resetting a bots hacked status to normal.
|
||||
var/text_dehack_fail = "" //Shown when a silicon tries to reset a bot emagged with the emag item, which cannot be reset.
|
||||
var/declare_message = "" //What the bot will display to the HUD user.
|
||||
var/frustration = 0 //Used by some bots for tracking failures to reach their target.
|
||||
@@ -63,18 +63,18 @@
|
||||
var/radio_key = null //which channels can the bot listen to
|
||||
var/radio_channel = RADIO_CHANNEL_COMMON //The bot's default radio channel
|
||||
var/auto_patrol = 0// set to make bot automatically patrol
|
||||
var/turf/patrol_target // this is turf to navigate to (location of beacon)
|
||||
var/turf/summon_target // The turf of a user summoning a bot.
|
||||
var/new_destination // pending new destination (waiting for beacon response)
|
||||
var/destination // destination description tag
|
||||
var/next_destination // the next destination in the patrol route
|
||||
var/shuffle = FALSE // If we should shuffle our adjacency checking
|
||||
var/turf/patrol_target // this is turf to navigate to (location of beacon)
|
||||
var/turf/summon_target // The turf of a user summoning a bot.
|
||||
var/new_destination // pending new destination (waiting for beacon response)
|
||||
var/destination // destination description tag
|
||||
var/next_destination // the next destination in the patrol route
|
||||
var/shuffle = FALSE // If we should shuffle our adjacency checking
|
||||
|
||||
var/blockcount = 0 //number of times retried a blocked path
|
||||
var/awaiting_beacon = 0 // count of pticks awaiting a beacon response
|
||||
var/blockcount = 0 //number of times retried a blocked path
|
||||
var/awaiting_beacon = 0 // count of pticks awaiting a beacon response
|
||||
|
||||
var/nearest_beacon // the nearest beacon's tag
|
||||
var/turf/nearest_beacon_loc // the nearest beacon's location
|
||||
var/nearest_beacon // the nearest beacon's tag
|
||||
var/turf/nearest_beacon_loc // the nearest beacon's location
|
||||
|
||||
var/beacon_freq = FREQ_NAV_BEACON
|
||||
var/model = "" //The type of bot it is.
|
||||
@@ -282,10 +282,10 @@
|
||||
break
|
||||
|
||||
switch(mode) //High-priority overrides are processed first. Bots can do nothing else while under direct command.
|
||||
if(BOT_RESPONDING) //Called by the AI.
|
||||
if(BOT_RESPONDING) //Called by the AI.
|
||||
call_mode()
|
||||
return
|
||||
if(BOT_SUMMON) //Called by PDA
|
||||
if(BOT_SUMMON) //Called by PDA
|
||||
bot_summon()
|
||||
return
|
||||
return TRUE //Successful completion. Used to prevent child process() continuing if this one is ended early.
|
||||
@@ -456,13 +456,13 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r
|
||||
if(!T)
|
||||
return
|
||||
var/list/adjacent = T.GetAtmosAdjacentTurfs(1)
|
||||
if(shuffle) //If we were on the same tile as another bot, let's randomize our choices so we dont both go the same way
|
||||
if(shuffle) //If we were on the same tile as another bot, let's randomize our choices so we dont both go the same way
|
||||
adjacent = shuffle(adjacent)
|
||||
shuffle = FALSE
|
||||
for(var/scan in adjacent)//Let's see if there's something right next to us first!
|
||||
if(check_bot(scan)) //Is there another bot there? Then let's just skip it
|
||||
if(check_bot(scan)) //Is there another bot there? Then let's just skip it
|
||||
continue
|
||||
if(isturf(scan_type)) //If we're lookeing for a turf we can just run the checks directly!
|
||||
if(isturf(scan_type)) //If we're lookeing for a turf we can just run the checks directly!
|
||||
var/final_result = checkscan(scan,scan_type,old_target)
|
||||
if(final_result)
|
||||
return final_result
|
||||
@@ -493,8 +493,8 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r
|
||||
var/turf/T = get_turf(targ)
|
||||
if(T)
|
||||
for(var/C in T.contents)
|
||||
if(istype(C,type) && (C != src)) //Is there another bot there already? If so, let's skip it so we dont all atack on top of eachother.
|
||||
return TRUE //Let's abort if we find a bot so we dont have to keep rechecking
|
||||
if(istype(C,type) && (C != src)) //Is there another bot there already? If so, let's skip it so we dont all atack on top of eachother.
|
||||
return TRUE //Let's abort if we find a bot so we dont have to keep rechecking
|
||||
|
||||
//When the scan finds a target, run bot specific processing to select it for the next step. Empty by default.
|
||||
/mob/living/simple_animal/bot/proc/process_scan(scan_target)
|
||||
@@ -640,14 +640,14 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
|
||||
if(patrol_target) // has patrol target
|
||||
INVOKE_ASYNC(src, .proc/target_patrol)
|
||||
else // no patrol target, so need a new one
|
||||
else // no patrol target, so need a new one
|
||||
speak("Engaging patrol mode.")
|
||||
find_patrol_target()
|
||||
tries++
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/proc/target_patrol()
|
||||
calc_path() // Find a route to it
|
||||
calc_path() // Find a route to it
|
||||
if(!path.len)
|
||||
patrol_target = null
|
||||
return
|
||||
@@ -656,26 +656,26 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
|
||||
/mob/living/simple_animal/bot/proc/patrol_step()
|
||||
|
||||
if(client) // In use by player, don't actually move.
|
||||
if(client) // In use by player, don't actually move.
|
||||
return
|
||||
|
||||
if(loc == patrol_target) // reached target
|
||||
if(loc == patrol_target) // reached target
|
||||
//Find the next beacon matching the target.
|
||||
if(!get_next_patrol_target())
|
||||
find_patrol_target() //If it fails, look for the nearest one instead.
|
||||
return
|
||||
|
||||
else if(path.len > 0 && patrol_target) // valid path
|
||||
else if(path.len > 0 && patrol_target) // valid path
|
||||
if(path[1] == loc)
|
||||
increment_path()
|
||||
return
|
||||
|
||||
|
||||
var/moved = bot_move(patrol_target)//step_towards(src, next) // attempt to move
|
||||
var/moved = bot_move(patrol_target)//step_towards(src, next) // attempt to move
|
||||
if(!moved) //Couldn't proceed the next step of the path BOT_STEP_MAX_RETRIES times
|
||||
addtimer(CALLBACK(src, .proc/patrol_step_not_moved), 2)
|
||||
|
||||
else // no path, so calculate new one
|
||||
else // no path, so calculate new one
|
||||
mode = BOT_START_PATROL
|
||||
|
||||
/mob/living/simple_animal/bot/proc/patrol_step_not_moved()
|
||||
@@ -732,7 +732,7 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
// process control input
|
||||
switch(command)
|
||||
if("patroloff")
|
||||
bot_reset() //HOLD IT!! //OBJECTION!!
|
||||
bot_reset() //HOLD IT!! //OBJECTION!!
|
||||
auto_patrol = FALSE
|
||||
|
||||
if("patrolon")
|
||||
@@ -794,23 +794,23 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
|
||||
/mob/living/simple_animal/bot/proc/summon_step()
|
||||
|
||||
if(client) // In use by player, don't actually move.
|
||||
if(client) // In use by player, don't actually move.
|
||||
return
|
||||
|
||||
if(loc == summon_target) // Arrived to summon location.
|
||||
if(loc == summon_target) // Arrived to summon location.
|
||||
bot_reset()
|
||||
return
|
||||
|
||||
else if(path.len > 0 && summon_target) //Proper path acquired!
|
||||
else if(path.len > 0 && summon_target) //Proper path acquired!
|
||||
if(path[1] == loc)
|
||||
increment_path()
|
||||
return
|
||||
|
||||
var/moved = bot_move(summon_target, 3) // Move attempt
|
||||
var/moved = bot_move(summon_target, 3) // Move attempt
|
||||
if(!moved)
|
||||
addtimer(CALLBACK(src, .proc/summon_step_not_moved), 2)
|
||||
|
||||
else // no path, so calculate new one
|
||||
else // no path, so calculate new one
|
||||
calc_summon_path()
|
||||
|
||||
/mob/living/simple_animal/bot/proc/summon_step_not_moved()
|
||||
|
||||
@@ -253,14 +253,14 @@
|
||||
return
|
||||
|
||||
if(loc == get_turf(target))
|
||||
if(!(check_bot(target) && prob(50))) //Target is not defined at the parent. 50% chance to still try and clean so we dont get stuck on the last blood drop.
|
||||
UnarmedAttack(target) //Rather than check at every step of the way, let's check before we do an action, so we can rescan before the other bot.
|
||||
if(!(check_bot(target) && prob(50))) //Target is not defined at the parent. 50% chance to still try and clean so we dont get stuck on the last blood drop.
|
||||
UnarmedAttack(target) //Rather than check at every step of the way, let's check before we do an action, so we can rescan before the other bot.
|
||||
if(QDELETED(target)) //We done here.
|
||||
target = null
|
||||
mode = BOT_IDLE
|
||||
return
|
||||
else
|
||||
shuffle = TRUE //Shuffle the list the next time we scan so we dont both go the same way.
|
||||
shuffle = TRUE //Shuffle the list the next time we scan so we dont both go the same way.
|
||||
path = list()
|
||||
|
||||
if(!path || path.len == 0) //No path, need a new one
|
||||
|
||||
@@ -31,13 +31,13 @@
|
||||
var/toolbox = /obj/item/storage/toolbox/mechanical
|
||||
var/toolbox_color = ""
|
||||
|
||||
#define HULL_BREACH 1
|
||||
#define LINE_SPACE_MODE 2
|
||||
#define FIX_TILE 3
|
||||
#define AUTO_TILE 4
|
||||
#define PLACE_TILE 5
|
||||
#define REPLACE_TILE 6
|
||||
#define TILE_EMAG 7
|
||||
#define HULL_BREACH 1
|
||||
#define LINE_SPACE_MODE 2
|
||||
#define FIX_TILE 3
|
||||
#define AUTO_TILE 4
|
||||
#define PLACE_TILE 5
|
||||
#define REPLACE_TILE 6
|
||||
#define TILE_EMAG 7
|
||||
|
||||
/mob/living/simple_animal/bot/floorbot/Initialize(mapload, new_toolbox_color)
|
||||
. = ..()
|
||||
@@ -242,9 +242,9 @@
|
||||
|
||||
if(target)
|
||||
if(loc == target || loc == get_turf(target))
|
||||
if(check_bot(target)) //Target is not defined at the parent
|
||||
if(check_bot(target)) //Target is not defined at the parent
|
||||
shuffle = TRUE
|
||||
if(prob(50)) //50% chance to still try to repair so we dont end up with 2 floorbots failing to fix the last breach
|
||||
if(prob(50)) //50% chance to still try to repair so we dont end up with 2 floorbots failing to fix the last breach
|
||||
target = null
|
||||
path = list()
|
||||
return
|
||||
@@ -317,7 +317,7 @@
|
||||
F = scan_target
|
||||
if(isfloorturf(F) && !isplatingturf(F)) //The floor must already have a tile.
|
||||
result = F
|
||||
if(FIX_TILE) //Selects only damaged floors.
|
||||
if(FIX_TILE) //Selects only damaged floors.
|
||||
F = scan_target
|
||||
if(istype(F) && (F.broken || F.burnt))
|
||||
result = F
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
var/cooldowntimehorn = 10
|
||||
var/mob/living/carbon/target
|
||||
var/oldtarget_name
|
||||
var/target_lastloc = FALSE //Loc of target when arrested.
|
||||
var/last_found = FALSE //There's a delay
|
||||
var/target_lastloc = FALSE //Loc of target when arrested.
|
||||
var/last_found = FALSE //There's a delay
|
||||
var/threatlevel = FALSE
|
||||
var/declare_arrests = FALSE // speak, you shall not, unless to Honk
|
||||
var/idcheck = TRUE
|
||||
@@ -94,7 +94,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
dat += text({"<BR> Auto Patrol: []"},
|
||||
|
||||
"<A href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "On" : "Off"]</A>" )
|
||||
return dat
|
||||
return dat
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/judgement_criteria()
|
||||
var/final = NONE
|
||||
@@ -228,7 +228,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
|
||||
switch(mode)
|
||||
|
||||
if(BOT_IDLE) // idle
|
||||
if(BOT_IDLE) // idle
|
||||
|
||||
walk_to(src,0)
|
||||
look_for_perp()
|
||||
@@ -243,7 +243,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
back_to_idle()
|
||||
return
|
||||
|
||||
if(target) // make sure target exists
|
||||
if(target) // make sure target exists
|
||||
if(Adjacent(target) && isturf(target.loc))
|
||||
|
||||
if(threatlevel <= 4)
|
||||
@@ -256,7 +256,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
target_lastloc = target.loc
|
||||
return
|
||||
|
||||
else // not next to perp
|
||||
else // not next to perp
|
||||
var/turf/olddist = get_dist(src, target)
|
||||
walk_to(src, target,1,4)
|
||||
if((get_dist(src, target)) >= (olddist))
|
||||
|
||||
@@ -107,13 +107,13 @@
|
||||
tile.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
|
||||
|
||||
switch(mode)
|
||||
if(BOT_IDLE) // idle
|
||||
if(BOT_IDLE) // idle
|
||||
walk_to(src,0)
|
||||
look_for_lowhygiene() // see if any disgusting fucks are in range
|
||||
if(!mode && auto_patrol) // still idle, and set to patrol
|
||||
mode = BOT_START_PATROL // switch to patrol mode
|
||||
look_for_lowhygiene() // see if any disgusting fucks are in range
|
||||
if(!mode && auto_patrol) // still idle, and set to patrol
|
||||
mode = BOT_START_PATROL // switch to patrol mode
|
||||
|
||||
if(BOT_HUNT) // hunting for stinkman
|
||||
if(BOT_HUNT) // hunting for stinkman
|
||||
if(emagged) //lol fuck em up
|
||||
currentspeed = 3.5
|
||||
start_washing()
|
||||
@@ -224,7 +224,7 @@ Maintenance panel is [open ? "opened" : "closed"]"}
|
||||
if(!locked || issilicon(user) || isAdminGhostAI(user))
|
||||
dat += {"<BR> Auto Patrol: ["<A href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "On" : "Off"]</A>"]"}
|
||||
|
||||
return dat.Join("")
|
||||
return dat.Join("")
|
||||
|
||||
/mob/living/simple_animal/bot/hygienebot/proc/check_purity(mob/living/L)
|
||||
if((emagged == 2) && L.stat != DEAD)
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
//MEDBOT
|
||||
//MEDBOT PATHFINDING
|
||||
//MEDBOT ASSEMBLY
|
||||
#define MEDBOT_PANIC_NONE 0
|
||||
#define MEDBOT_PANIC_LOW 15
|
||||
#define MEDBOT_PANIC_MED 35
|
||||
#define MEDBOT_PANIC_HIGH 55
|
||||
#define MEDBOT_PANIC_FUCK 70
|
||||
#define MEDBOT_PANIC_ENDING 90
|
||||
#define MEDBOT_PANIC_END 100
|
||||
#define MEDBOT_PANIC_NONE 0
|
||||
#define MEDBOT_PANIC_LOW 15
|
||||
#define MEDBOT_PANIC_MED 35
|
||||
#define MEDBOT_PANIC_HIGH 55
|
||||
#define MEDBOT_PANIC_FUCK 70
|
||||
#define MEDBOT_PANIC_ENDING 90
|
||||
#define MEDBOT_PANIC_END 100
|
||||
|
||||
/mob/living/simple_animal/bot/medbot
|
||||
name = "\improper Medibot"
|
||||
@@ -405,7 +405,7 @@
|
||||
if(stationary_mode && !Adjacent(C)) //YOU come to ME, BRO
|
||||
return FALSE
|
||||
if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH)))
|
||||
return FALSE //welp too late for them!
|
||||
return FALSE //welp too late for them!
|
||||
|
||||
if(!(loc == C.loc) && !(isturf(C.loc) && isturf(loc)))
|
||||
return FALSE
|
||||
|
||||
@@ -41,14 +41,14 @@
|
||||
var/base_icon = "mulebot" /// icon_state to use in update_icon_state
|
||||
var/atom/movable/load /// what we're transporting
|
||||
var/mob/living/passenger /// who's riding us
|
||||
var/turf/target /// this is turf to navigate to (location of beacon)
|
||||
var/loaddir = 0 /// this the direction to unload onto/load from
|
||||
var/home_destination = "" /// tag of home delivery beacon
|
||||
var/turf/target /// this is turf to navigate to (location of beacon)
|
||||
var/loaddir = 0 /// this the direction to unload onto/load from
|
||||
var/home_destination = "" /// tag of home delivery beacon
|
||||
|
||||
var/reached_target = TRUE ///true if already reached the target
|
||||
var/reached_target = TRUE ///true if already reached the target
|
||||
|
||||
var/auto_return = TRUE /// true if auto return to home beacon after unload
|
||||
var/auto_pickup = TRUE /// true if auto-pickup at beacon
|
||||
var/auto_return = TRUE /// true if auto return to home beacon after unload
|
||||
var/auto_pickup = TRUE /// true if auto-pickup at beacon
|
||||
var/report_delivery = TRUE /// true if bot will announce an arrival to a location.
|
||||
|
||||
var/obj/item/stock_parts/cell/cell /// Internal Powercell
|
||||
@@ -433,7 +433,7 @@
|
||||
if(!istype(crate))
|
||||
if(!wires.is_cut(WIRE_LOADCHECK))
|
||||
buzz(SIGH)
|
||||
return // if not hacked, only allow crates to be loaded
|
||||
return // if not hacked, only allow crates to be loaded
|
||||
crate = null
|
||||
|
||||
if(crate || isobj(AM))
|
||||
@@ -578,8 +578,8 @@
|
||||
return
|
||||
if(isturf(next))
|
||||
var/oldloc = loc
|
||||
var/moved = step_towards(src, next) // attempt to move
|
||||
if(moved && oldloc!=loc) // successful move
|
||||
var/moved = step_towards(src, next) // attempt to move
|
||||
if(moved && oldloc!=loc) // successful move
|
||||
blockcount = 0
|
||||
path -= loc
|
||||
|
||||
@@ -588,14 +588,14 @@
|
||||
else
|
||||
mode = BOT_DELIVER
|
||||
|
||||
else // failed to move
|
||||
else // failed to move
|
||||
|
||||
blockcount++
|
||||
mode = BOT_BLOCKED
|
||||
if(blockcount == 3)
|
||||
buzz(ANNOYED)
|
||||
|
||||
if(blockcount > 10) // attempt 10 times before recomputing
|
||||
if(blockcount > 10) // attempt 10 times before recomputing
|
||||
// find new path excluding blocked turf
|
||||
buzz(SIGH)
|
||||
mode = BOT_WAIT_FOR_NAV
|
||||
@@ -611,7 +611,7 @@
|
||||
mode = BOT_NAV
|
||||
return
|
||||
|
||||
if(BOT_NAV) // calculate new path
|
||||
if(BOT_NAV) // calculate new path
|
||||
mode = BOT_WAIT_FOR_NAV
|
||||
INVOKE_ASYNC(src, .proc/process_nav)
|
||||
|
||||
@@ -682,7 +682,7 @@
|
||||
calling_ai = null
|
||||
radio_channel = RADIO_CHANNEL_AI_PRIVATE //Report on AI Private instead if the AI is controlling us.
|
||||
|
||||
if(load) // if loaded, unload at target
|
||||
if(load) // if loaded, unload at target
|
||||
if(report_delivery)
|
||||
speak("Destination <b>[destination]</b> reached. Unloading [load].",radio_channel)
|
||||
unload(loaddir)
|
||||
@@ -695,7 +695,7 @@
|
||||
if(!A.anchored)
|
||||
AM = A
|
||||
break
|
||||
else // otherwise, look for crates only
|
||||
else // otherwise, look for crates only
|
||||
AM = locate(/obj/structure/closet/crate) in get_step(loc,loaddir)
|
||||
if(AM?.Adjacent(src))
|
||||
load(AM)
|
||||
@@ -708,7 +708,7 @@
|
||||
start_home()
|
||||
mode = BOT_BLOCKED
|
||||
else
|
||||
bot_reset() // otherwise go idle
|
||||
bot_reset() // otherwise go idle
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/MobBump(mob/M) // called when the bot bumps into a mob
|
||||
@@ -760,11 +760,11 @@
|
||||
return
|
||||
|
||||
for(var/obj/machinery/navbeacon/NB in GLOB.deliverybeacons)
|
||||
if(NB.location == new_destination) // if the beacon location matches the set destination
|
||||
if(NB.location == new_destination) // if the beacon location matches the set destination
|
||||
// the we will navigate there
|
||||
destination = new_destination
|
||||
target = NB.loc
|
||||
var/direction = NB.dir // this will be the load/unload dir
|
||||
var/direction = NB.dir // this will be the load/unload dir
|
||||
if(direction)
|
||||
loaddir = text2num(direction)
|
||||
else
|
||||
@@ -851,7 +851,7 @@
|
||||
|
||||
else if(!wires.is_cut(WIRE_LOADCHECK))
|
||||
buzz(SIGH)
|
||||
return // if not hacked, only allow ghosts to be loaded
|
||||
return // if not hacked, only allow ghosts to be loaded
|
||||
|
||||
else if(isobj(AM))
|
||||
var/obj/O = AM
|
||||
|
||||
@@ -148,7 +148,7 @@ Auto Patrol: []"},
|
||||
"<A href='?src=[REF(src)];operation=declarearrests'>[declare_arrests ? "Yes" : "No"]</A>",
|
||||
"<A href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "On" : "Off"]</A>" )
|
||||
|
||||
return dat
|
||||
return dat
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/Topic(href, href_list)
|
||||
if(..())
|
||||
@@ -314,14 +314,14 @@ Auto Patrol: []"},
|
||||
|
||||
switch(mode)
|
||||
|
||||
if(BOT_IDLE) // idle
|
||||
if(BOT_IDLE) // idle
|
||||
|
||||
walk_to(src,0)
|
||||
look_for_perp() // see if any criminals are in range
|
||||
if(!mode && auto_patrol) // still idle, and set to patrol
|
||||
mode = BOT_START_PATROL // switch to patrol mode
|
||||
look_for_perp() // see if any criminals are in range
|
||||
if(!mode && auto_patrol) // still idle, and set to patrol
|
||||
mode = BOT_START_PATROL // switch to patrol mode
|
||||
|
||||
if(BOT_HUNT) // hunting for perp
|
||||
if(BOT_HUNT) // hunting for perp
|
||||
|
||||
// if can't reach perp for long enough, go idle
|
||||
if(frustration >= 8)
|
||||
@@ -329,8 +329,8 @@ Auto Patrol: []"},
|
||||
back_to_idle()
|
||||
return
|
||||
|
||||
if(target) // make sure target exists
|
||||
if(Adjacent(target) && isturf(target.loc)) // if right next to perp
|
||||
if(target) // make sure target exists
|
||||
if(Adjacent(target) && isturf(target.loc)) // if right next to perp
|
||||
if(!check_nap_violations())
|
||||
stun_attack(target, TRUE)
|
||||
else
|
||||
@@ -342,7 +342,7 @@ Auto Patrol: []"},
|
||||
set_anchored(TRUE)
|
||||
return
|
||||
|
||||
else // not next to perp
|
||||
else // not next to perp
|
||||
var/turf/olddist = get_dist(src, target)
|
||||
walk_to(src, target,1,4)
|
||||
if((get_dist(src, target)) >= (olddist))
|
||||
@@ -352,7 +352,7 @@ Auto Patrol: []"},
|
||||
else
|
||||
back_to_idle()
|
||||
|
||||
if(BOT_PREP_ARREST) // preparing to arrest target
|
||||
if(BOT_PREP_ARREST) // preparing to arrest target
|
||||
|
||||
// see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
|
||||
if( !Adjacent(target) || !isturf(target.loc) || (target.AmountParalyzed() < 40 && target.staminaloss < STAMINA_THRESHOLD_SOFTCRIT)) //SKYRAT EDIT CHANGE: if( !Adjacent(target) || !isturf(target.loc) || target.AmountParalyzed() < 40)
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
P.yo = new_y - curloc.y
|
||||
P.xo = new_x - curloc.x
|
||||
var/new_angle_s = P.Angle + rand(120,240)
|
||||
while(new_angle_s > 180) // Translate to regular projectile degrees
|
||||
while(new_angle_s > 180) // Translate to regular projectile degrees
|
||||
new_angle_s -= 360
|
||||
P.setAngle(new_angle_s)
|
||||
|
||||
@@ -391,7 +391,7 @@
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(HAS_TRAIT(C, TRAIT_NODISMEMBER))
|
||||
return ..() //ATTACK!
|
||||
return ..() //ATTACK!
|
||||
var/list/parts = list()
|
||||
var/undismembermerable_limbs = 0
|
||||
for(var/X in C.bodyparts)
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
..()
|
||||
//CRAB movement
|
||||
if(!ckey && !stat)
|
||||
if(isturf(loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||
if(isturf(loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||
turns_since_move++
|
||||
if(turns_since_move >= turns_per_move)
|
||||
var/east_vs_west = pick(4,8)
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
sleep(3)
|
||||
step_to(src,movement_target,1)
|
||||
|
||||
if(movement_target) //Not redundant due to sleeps, Item can be gone in 6 decisecomds
|
||||
if(movement_target) //Not redundant due to sleeps, Item can be gone in 6 decisecomds
|
||||
var/turf/T = get_turf(movement_target)
|
||||
if(!T)
|
||||
return
|
||||
@@ -100,7 +100,7 @@
|
||||
var/obj/item/inventory_head
|
||||
var/obj/item/inventory_back
|
||||
var/shaved = FALSE
|
||||
var/nofur = FALSE //Corgis that have risen past the material plane of existence.
|
||||
var/nofur = FALSE //Corgis that have risen past the material plane of existence.
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/add_cell_sample()
|
||||
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
|
||||
@@ -413,7 +413,7 @@
|
||||
//IAN! SQUEEEEEEEEE~
|
||||
/mob/living/simple_animal/pet/dog/corgi/ian
|
||||
name = "Ian"
|
||||
real_name = "Ian" //Intended to hold the name without altering it.
|
||||
real_name = "Ian" //Intended to hold the name without altering it.
|
||||
gender = MALE
|
||||
desc = "It's the HoP's beloved corgi."
|
||||
response_help_continuous = "pets"
|
||||
@@ -462,8 +462,8 @@
|
||||
/mob/living/simple_animal/pet/dog/corgi/ian/proc/Read_Memory()
|
||||
if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new
|
||||
var/savefile/S = new /savefile("data/npc_saves/Ian.sav")
|
||||
S["age"] >> age
|
||||
S["record_age"] >> record_age
|
||||
S["age"] >> age
|
||||
S["record_age"] >> record_age
|
||||
S["saved_head"] >> saved_head
|
||||
fdel("data/npc_saves/Ian.sav")
|
||||
else
|
||||
@@ -612,7 +612,7 @@
|
||||
desc = "It's the HoP's beloved corgi puppy."
|
||||
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/puppy/void //Tribute to the corgis born in nullspace
|
||||
/mob/living/simple_animal/pet/dog/corgi/puppy/void //Tribute to the corgis born in nullspace
|
||||
name = "\improper void puppy"
|
||||
real_name = "voidy"
|
||||
desc = "A corgi puppy that has been infused with deep space energy. It's staring back..."
|
||||
@@ -626,7 +626,7 @@
|
||||
held_state = "void_puppy"
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0)
|
||||
return 1 //Void puppies can navigate space.
|
||||
return 1 //Void puppies can navigate space.
|
||||
|
||||
|
||||
//LISA! SQUEEEEEEEEE~
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
#define DRONE_NET_DISCONNECT "<span class='danger'>DRONE NETWORK: [name] is not responding.</span>"
|
||||
|
||||
/// Maintenance Drone icon_state (multiple colors)
|
||||
#define MAINTDRONE "drone_maint"
|
||||
#define MAINTDRONE "drone_maint"
|
||||
/// Repair Drone icon_state
|
||||
#define REPAIRDRONE "drone_repair"
|
||||
#define REPAIRDRONE "drone_repair"
|
||||
/// Scout Drone icon_state
|
||||
#define SCOUTDRONE "drone_scout"
|
||||
#define SCOUTDRONE "drone_scout"
|
||||
/// Clockwork Drone icon_state
|
||||
#define CLOCKDRONE "drone_clock"
|
||||
#define CLOCKDRONE "drone_clock"
|
||||
|
||||
/// [MAINTDRONE] hacked icon_state
|
||||
#define MAINTDRONE_HACKED "drone_maint_red"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
|
||||
#define BEE_IDLE_ROAMING 70 //The value of idle at which a bee in a beebox will try to wander
|
||||
#define BEE_IDLE_GOHOME 0 //The value of idle at which a bee will try to go home
|
||||
#define BEE_PROB_GOHOME 35 //Probability to go home when idle is below BEE_IDLE_GOHOME
|
||||
#define BEE_PROB_GOROAM 5 //Probability to go roaming when idle is above BEE_IDLE_ROAMING
|
||||
#define BEE_TRAY_RECENT_VISIT 200 //How long in deciseconds until a tray can be visited by a bee again
|
||||
#define BEE_DEFAULT_COLOUR "#e5e500" //the colour we make the stripes of the bee if our reagent has no colour (or we have no reagent)
|
||||
#define BEE_IDLE_ROAMING 70 //The value of idle at which a bee in a beebox will try to wander
|
||||
#define BEE_IDLE_GOHOME 0 //The value of idle at which a bee will try to go home
|
||||
#define BEE_PROB_GOHOME 35 //Probability to go home when idle is below BEE_IDLE_GOHOME
|
||||
#define BEE_PROB_GOROAM 5 //Probability to go roaming when idle is above BEE_IDLE_ROAMING
|
||||
#define BEE_TRAY_RECENT_VISIT 200 //How long in deciseconds until a tray can be visited by a bee again
|
||||
#define BEE_DEFAULT_COLOUR "#e5e500" //the colour we make the stripes of the bee if our reagent has no colour (or we have no reagent)
|
||||
|
||||
#define BEE_POLLINATE_YIELD_CHANCE 33
|
||||
#define BEE_POLLINATE_PEST_CHANCE 33
|
||||
#define BEE_POLLINATE_POTENCY_CHANCE 50
|
||||
#define BEE_POLLINATE_YIELD_CHANCE 33
|
||||
#define BEE_POLLINATE_PEST_CHANCE 33
|
||||
#define BEE_POLLINATE_POTENCY_CHANCE 50
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees
|
||||
name = "bee"
|
||||
|
||||
@@ -10,19 +10,19 @@
|
||||
|
||||
var/dodging = FALSE
|
||||
var/approaching_target = FALSE //We should dodge now
|
||||
var/in_melee = FALSE //We should sidestep now
|
||||
var/in_melee = FALSE //We should sidestep now
|
||||
var/dodge_prob = 30
|
||||
var/sidestep_per_cycle = 1 //How many sidesteps per npcpool cycle when in melee
|
||||
|
||||
var/projectiletype //set ONLY it and NULLIFY casingtype var, if we have ONLY projectile
|
||||
var/projectiletype //set ONLY it and NULLIFY casingtype var, if we have ONLY projectile
|
||||
var/projectilesound
|
||||
var/casingtype //set ONLY it and NULLIFY projectiletype, if we have projectile IN CASING
|
||||
var/casingtype //set ONLY it and NULLIFY projectiletype, if we have projectile IN CASING
|
||||
var/move_to_delay = 3 //delay for the automated movement.
|
||||
var/list/friends = list()
|
||||
var/list/emote_taunt = list()
|
||||
var/taunt_chance = 0
|
||||
|
||||
var/rapid_melee = 1 //Number of melee attacks between each npc pool tick. Spread evenly.
|
||||
var/rapid_melee = 1 //Number of melee attacks between each npc pool tick. Spread evenly.
|
||||
var/melee_queue_distance = 4 //If target is close enough start preparing to hit them if we have rapid_melee enabled
|
||||
|
||||
var/ranged_message = "fires" //Fluff text for ranged mobs
|
||||
@@ -93,8 +93,8 @@
|
||||
if(!QDELETED(target) && !targets_from.Adjacent(target))
|
||||
DestroyPathToTarget()
|
||||
if(!MoveToTarget(possible_targets)) //if we lose our target
|
||||
if(AIShouldSleep(possible_targets)) // we try to acquire a new one
|
||||
toggle_ai(AI_IDLE) // otherwise we go idle
|
||||
if(AIShouldSleep(possible_targets)) // we try to acquire a new one
|
||||
toggle_ai(AI_IDLE) // otherwise we go idle
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/handle_automated_movement()
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
exit_mecha(mecha)
|
||||
return
|
||||
|
||||
//Smoke if there's too many targets - Smoke Power
|
||||
//Smoke if there's too many targets - Smoke Power
|
||||
if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance))
|
||||
if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_smoke) && !mecha.smoke_charges)
|
||||
var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_smoke]
|
||||
@@ -263,7 +263,7 @@
|
||||
if(ismecha(the_target))
|
||||
var/obj/vehicle/sealed/mecha/M = the_target
|
||||
if(mecha)
|
||||
if(M == mecha) //Dont kill yourself
|
||||
if(M == mecha) //Dont kill yourself
|
||||
return FALSE
|
||||
else //we're not in a mecha, so we check if we can steal it instead.
|
||||
if(is_valid_mecha(M))
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
var/tab = "megafauna_kills"
|
||||
if(crusher_kill)
|
||||
tab = "megafauna_kills_crusher"
|
||||
if(!elimination) //used so the achievment only occurs for the last legion to die.
|
||||
if(!elimination) //used so the achievment only occurs for the last legion to die.
|
||||
grant_achievement(achievement_type, score_achievement_type, crusher_kill, force_grant)
|
||||
SSblackbox.record_feedback("tally", tab, 1, "[initial(name)]")
|
||||
return ..()
|
||||
|
||||
@@ -188,7 +188,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
|
||||
if(is_type_in_typecache(the_target, sharedWanted)) //always eat
|
||||
return TRUE
|
||||
|
||||
return ..() //else, have a nibble, see if it's food
|
||||
return ..() //else, have a nibble, see if it's food
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/ai/resource/OpenFire(atom/A)
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
// Pickup loot
|
||||
/mob/living/simple_animal/hostile/mimic/crate/Initialize(mapload)
|
||||
. = ..()
|
||||
if(mapload) //eat shit
|
||||
if(mapload) //eat shit
|
||||
for(var/obj/item/I in loc)
|
||||
I.forceMove(src)
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Lobstrosities, the poster boy of charging AI mobs. Drops crab meat and bones.
|
||||
* Lobstrosities, the poster boy of charging AI mobs. Drops crab meat and bones.
|
||||
* Outside of charging, it's intended behavior is that it is generally slow moving, but makes up for that with a knockdown attack to score additional hits.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/asteroid/lobstrosity
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/// The carp rift is currently charging.
|
||||
#define CHARGE_ONGOING 0
|
||||
#define CHARGE_ONGOING 0
|
||||
/// The carp rift is currently charging and has output a final warning.
|
||||
#define CHARGE_FINALWARNING 1
|
||||
#define CHARGE_FINALWARNING 1
|
||||
/// The carp rift is now fully charged.
|
||||
#define CHARGE_COMPLETED 2
|
||||
#define CHARGE_COMPLETED 2
|
||||
/// The darkness threshold for space dragon when choosing a color
|
||||
#define DARKNESS_THRESHOLD 50
|
||||
#define DARKNESS_THRESHOLD 50
|
||||
|
||||
/**
|
||||
* # Space Dragon
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/* Parrots!
|
||||
* Contains
|
||||
* Defines
|
||||
* Inventory (headset stuff)
|
||||
* Attack responces
|
||||
* AI
|
||||
* Procs / Verbs (usable by players)
|
||||
* Sub-types
|
||||
* Hear & say (the things we do for gimmicks)
|
||||
* Defines
|
||||
* Inventory (headset stuff)
|
||||
* Attack responces
|
||||
* AI
|
||||
* Procs / Verbs (usable by players)
|
||||
* Sub-types
|
||||
* Hear & say (the things we do for gimmicks)
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -15,15 +15,15 @@
|
||||
|
||||
//Only a maximum of one action and one intent should be active at any given time.
|
||||
//Actions
|
||||
#define PARROT_PERCH (1<<0) //Sitting/sleeping, not moving
|
||||
#define PARROT_SWOOP (1<<1) //Moving towards or away from a target
|
||||
#define PARROT_WANDER (1<<2) //Moving without a specific target in mind
|
||||
#define PARROT_PERCH (1<<0) //Sitting/sleeping, not moving
|
||||
#define PARROT_SWOOP (1<<1) //Moving towards or away from a target
|
||||
#define PARROT_WANDER (1<<2) //Moving without a specific target in mind
|
||||
|
||||
//Intents
|
||||
#define PARROT_STEAL (1<<3) //Flying towards a target to steal it/from it
|
||||
#define PARROT_ATTACK (1<<4) //Flying towards a target to attack it
|
||||
#define PARROT_RETURN (1<<5) //Flying towards its perch
|
||||
#define PARROT_FLEE (1<<6) //Flying away from its attacker
|
||||
#define PARROT_STEAL (1<<3) //Flying towards a target to steal it/from it
|
||||
#define PARROT_ATTACK (1<<4) //Flying towards a target to attack it
|
||||
#define PARROT_RETURN (1<<5) //Flying towards its perch
|
||||
#define PARROT_FLEE (1<<6) //Flying away from its attacker
|
||||
|
||||
|
||||
/mob/living/simple_animal/parrot
|
||||
@@ -74,7 +74,7 @@
|
||||
|
||||
var/parrot_speed = 5 //"Delay in world ticks between movement." according to byond. Yeah, that's BS but it does directly affect movement. Higher number = slower.
|
||||
var/parrot_lastmove = null //Updates/Stores position of the parrot while it's moving
|
||||
var/parrot_stuck = 0 //If parrot_lastmove hasn't changed, this will increment until it reaches parrot_stuck_threshold
|
||||
var/parrot_stuck = 0 //If parrot_lastmove hasn't changed, this will increment until it reaches parrot_stuck_threshold
|
||||
var/parrot_stuck_threshold = 10 //if this == parrot_stuck, it'll force the parrot back to wandering
|
||||
|
||||
var/list/speech_buffer = list()
|
||||
@@ -299,7 +299,7 @@
|
||||
if(health > 30) //Let's get in there and squawk it up!
|
||||
parrot_state |= PARROT_ATTACK
|
||||
else
|
||||
parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell!
|
||||
parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell!
|
||||
drop_held_item(0)
|
||||
if(stat != DEAD && !M.combat_mode)
|
||||
handle_automated_speech(1) //assured speak/emote
|
||||
@@ -470,12 +470,12 @@
|
||||
if(!held_item && !parrot_perch) //If we've got nothing to do.. look for something to do.
|
||||
var/atom/movable/AM = search_for_perch_and_item() //This handles checking through lists so we know it's either a perch or stealable item
|
||||
if(AM)
|
||||
if(istype(AM, /obj/item) || isliving(AM)) //If stealable item
|
||||
if(istype(AM, /obj/item) || isliving(AM)) //If stealable item
|
||||
parrot_interest = AM
|
||||
manual_emote("turns and flies towards [parrot_interest].")
|
||||
parrot_state = PARROT_SWOOP | PARROT_STEAL
|
||||
return
|
||||
else //Else it's a perch
|
||||
else //Else it's a perch
|
||||
parrot_perch = AM
|
||||
parrot_state = PARROT_SWOOP | PARROT_RETURN
|
||||
return
|
||||
@@ -929,9 +929,9 @@
|
||||
/mob/living/simple_animal/parrot/poly/proc/Read_Memory()
|
||||
if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new
|
||||
var/savefile/S = new /savefile("data/npc_saves/Poly.sav")
|
||||
S["phrases"] >> speech_buffer
|
||||
S["roundssurvived"] >> rounds_survived
|
||||
S["longestsurvival"] >> longest_survival
|
||||
S["phrases"] >> speech_buffer
|
||||
S["roundssurvived"] >> rounds_survived
|
||||
S["longestsurvival"] >> longest_survival
|
||||
S["longestdeathstreak"] >> longest_deathstreak
|
||||
fdel("data/npc_saves/Poly.sav")
|
||||
else
|
||||
|
||||
@@ -295,7 +295,7 @@
|
||||
/mob/living/simple_animal/proc/handle_automated_movement()
|
||||
set waitfor = FALSE
|
||||
if(!stop_automated_movement && wander)
|
||||
if((isturf(loc) || allow_movement_on_non_turfs) && (mobility_flags & MOBILITY_MOVE)) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||
if((isturf(loc) || allow_movement_on_non_turfs) && (mobility_flags & MOBILITY_MOVE)) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||
turns_since_move++
|
||||
if(turns_since_move >= turns_per_move)
|
||||
if(!(stop_automated_movement_when_pulled && pulledby)) //Some animals don't move when pulled
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#define SIZE_DOESNT_MATTER -1
|
||||
#define BABIES_ONLY 0
|
||||
#define ADULTS_ONLY 1
|
||||
#define SIZE_DOESNT_MATTER -1
|
||||
#define BABIES_ONLY 0
|
||||
#define ADULTS_ONLY 1
|
||||
|
||||
#define NO_GROWTH_NEEDED 0
|
||||
#define GROWTH_NEEDED 1
|
||||
#define NO_GROWTH_NEEDED 0
|
||||
#define GROWTH_NEEDED 1
|
||||
|
||||
/datum/action/innate/slime
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
. = ..()
|
||||
var/mod = 0
|
||||
if(bodytemperature >= 330.23) // 135 F or 57.08 C
|
||||
mod = -1 // slimes become supercharged at high temperatures
|
||||
mod = -1 // slimes become supercharged at high temperatures
|
||||
else if(bodytemperature < 283.222)
|
||||
mod = ((283.222 - bodytemperature) / 10) * 1.75
|
||||
if(mod)
|
||||
|
||||
@@ -26,11 +26,11 @@
|
||||
if(!client)
|
||||
return FALSE
|
||||
add_to_player_list()
|
||||
lastKnownIP = client.address
|
||||
computer_id = client.computer_id
|
||||
lastKnownIP = client.address
|
||||
computer_id = client.computer_id
|
||||
log_access("Mob Login: [key_name(src)] was assigned to a [type]")
|
||||
world.update_status()
|
||||
client.screen = list() //remove hud items just in case
|
||||
client.screen = list() //remove hud items just in case
|
||||
client.images = list()
|
||||
client.set_right_click_menu_mode(shift_to_open_context_menu)
|
||||
|
||||
|
||||
@@ -118,8 +118,8 @@
|
||||
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
var/t = "<span class='notice'>Coordinates: [x],[y] </span>\n"
|
||||
t += "<span class='danger'>Temperature: [environment.temperature] </span>\n"
|
||||
var/t = "<span class='notice'>Coordinates: [x],[y] </span>\n"
|
||||
t += "<span class='danger'>Temperature: [environment.temperature] </span>\n"
|
||||
for(var/id in environment.gases)
|
||||
var/gas = environment.gases[id]
|
||||
if(gas[MOLES])
|
||||
@@ -544,7 +544,7 @@
|
||||
*
|
||||
* Note that if either party has their face obscured, the other won't get the notice about the eye contact
|
||||
* Also note that examine_more() doesn't proc this or extend the timer, just because it's simpler this way and doesn't lose much.
|
||||
* The nice part about relying on examining is that we don't bother checking visibility, because we already know they were both visible to each other within the last second, and the one who triggers it is currently seeing them
|
||||
* The nice part about relying on examining is that we don't bother checking visibility, because we already know they were both visible to each other within the last second, and the one who triggers it is currently seeing them
|
||||
*/
|
||||
/mob/proc/handle_eye_contact(mob/living/examined_mob)
|
||||
return
|
||||
@@ -603,7 +603,7 @@
|
||||
|
||||
///Can this mob resist (default FALSE)
|
||||
/mob/proc/can_resist()
|
||||
return FALSE //overridden in living.dm
|
||||
return FALSE //overridden in living.dm
|
||||
|
||||
///Spin this mob around it's central axis
|
||||
/mob/proc/spin(spintime, speed)
|
||||
|
||||
@@ -28,15 +28,15 @@
|
||||
var/static/next_mob_id = 0
|
||||
|
||||
/// List of movement speed modifiers applying to this mob
|
||||
var/list/movespeed_modification //Lazy list, see mob_movespeed.dm
|
||||
var/list/movespeed_modification //Lazy list, see mob_movespeed.dm
|
||||
/// List of movement speed modifiers ignored by this mob. List -> List (id) -> List (sources)
|
||||
var/list/movespeed_mod_immunities //Lazy list, see mob_movespeed.dm
|
||||
var/list/movespeed_mod_immunities //Lazy list, see mob_movespeed.dm
|
||||
/// The calculated mob speed slowdown based on the modifiers list
|
||||
var/cached_multiplicative_slowdown
|
||||
/// List of action speed modifiers applying to this mob
|
||||
var/list/actionspeed_modification //Lazy list, see mob_movespeed.dm
|
||||
var/list/actionspeed_modification //Lazy list, see mob_movespeed.dm
|
||||
/// List of action speed modifiers ignored by this mob. List -> List (id) -> List (sources)
|
||||
var/list/actionspeed_mod_immunities //Lazy list, see mob_movespeed.dm
|
||||
var/list/actionspeed_mod_immunities //Lazy list, see mob_movespeed.dm
|
||||
/// The calculated mob action speed slowdown based on the modifiers list
|
||||
var/cached_multiplicative_actions_slowdown
|
||||
/// List of action hud items the user has
|
||||
@@ -74,12 +74,12 @@
|
||||
* Set when you're being turned into something else and also used in a bunch of places
|
||||
* it probably shouldn't really be
|
||||
*/
|
||||
var/notransform = null //Carbon
|
||||
var/notransform = null //Carbon
|
||||
|
||||
/// Is the mob blind
|
||||
var/eye_blind = 0 //Carbon
|
||||
var/eye_blind = 0 //Carbon
|
||||
/// Does the mob have blurry sight
|
||||
var/eye_blurry = 0 //Carbon
|
||||
var/eye_blurry = 0 //Carbon
|
||||
/// What is the mobs real name (name is overridden for disguises etc)
|
||||
var/real_name = null
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
var/name_archive //For admin things like possession
|
||||
|
||||
/// Default body temperature
|
||||
var/bodytemperature = BODYTEMP_NORMAL //310.15K / 98.6F
|
||||
var/bodytemperature = BODYTEMP_NORMAL //310.15K / 98.6F
|
||||
/// Drowsyness level of the mob
|
||||
var/drowsyness = 0//Carbon
|
||||
/// Dizziness level of the mob
|
||||
@@ -106,7 +106,7 @@
|
||||
var/satiety = 0//Carbon
|
||||
|
||||
/// How many ticks this mob has been over reating
|
||||
var/overeatduration = 0 // How long this guy is overeating //Carbon
|
||||
var/overeatduration = 0 // How long this guy is overeating //Carbon
|
||||
|
||||
/// The movement intent of the mob (run/wal)
|
||||
var/m_intent = MOVE_INTENT_RUN//Living
|
||||
@@ -192,7 +192,7 @@
|
||||
var/list/observers = null
|
||||
|
||||
///List of progress bars this mob is currently seeing for actions
|
||||
var/list/progressbars = null //for stacking do_after bars
|
||||
var/list/progressbars = null //for stacking do_after bars
|
||||
|
||||
///For storing what do_after's someone has, key = string, value = amount of interactions of that type happening.
|
||||
var/list/do_afters
|
||||
|
||||
@@ -304,7 +304,7 @@
|
||||
* * notify_volume How loud the sound should be to spook the user
|
||||
*/
|
||||
/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, atom/source = null, mutable_appearance/alert_overlay = null, action = NOTIFY_JUMP, flashwindow = TRUE, ignore_mapload = TRUE, ignore_key, header = null, notify_suiciders = TRUE, notify_volume = 100) //Easy notification of ghosts.
|
||||
if(ignore_mapload && SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load
|
||||
if(ignore_mapload && SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load
|
||||
return
|
||||
for(var/mob/dead/observer/O in GLOB.player_list)
|
||||
if(!notify_suiciders && (O in GLOB.suicided_mob_list))
|
||||
@@ -357,7 +357,7 @@
|
||||
|
||||
///Is the passed in mob a ghost with admin powers, doesn't check for AI interact like isAdminGhost() used to
|
||||
/proc/isAdminObserver(mob/user)
|
||||
if(!user) //Are they a mob? Auto interface updates call this with a null src
|
||||
if(!user) //Are they a mob? Auto interface updates call this with a null src
|
||||
return
|
||||
if(!user.client) // Do they have a client?
|
||||
return
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
if(!n || !direct)
|
||||
return FALSE
|
||||
if(mob.notransform)
|
||||
return FALSE //This is sota the goto stop mobs from moving var
|
||||
return FALSE //This is sota the goto stop mobs from moving var
|
||||
if(mob.control_object)
|
||||
return Move_object(direct)
|
||||
if(!isliving(mob))
|
||||
@@ -98,11 +98,11 @@
|
||||
//SKYRAT EDIT ADDITION END
|
||||
|
||||
var/mob/living/L = mob //Already checked for isliving earlier
|
||||
if(L.incorporeal_move) //Move though walls
|
||||
if(L.incorporeal_move) //Move though walls
|
||||
Process_Incorpmove(direct)
|
||||
return FALSE
|
||||
|
||||
if(mob.remote_control) //we're controlling something, our movement is relayed to it
|
||||
if(mob.remote_control) //we're controlling something, our movement is relayed to it
|
||||
return mob.remote_control.relaymove(mob, direct)
|
||||
|
||||
if(isAI(mob))
|
||||
@@ -111,13 +111,13 @@
|
||||
if(Process_Grab()) //are we restrained by someone's grip?
|
||||
return
|
||||
|
||||
if(mob.buckled) //if we're buckled to something, tell it we moved.
|
||||
if(mob.buckled) //if we're buckled to something, tell it we moved.
|
||||
return mob.buckled.relaymove(mob, direct)
|
||||
|
||||
if(!(L.mobility_flags & MOBILITY_MOVE))
|
||||
return FALSE
|
||||
|
||||
if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
|
||||
if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
|
||||
var/atom/O = mob.loc
|
||||
return O.relaymove(mob, direct)
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
if(typing_indicator)
|
||||
set_typing_indicator(FALSE)
|
||||
//SKYRAT EDIT ADDITION END
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
if(message)
|
||||
@@ -18,7 +18,7 @@
|
||||
/mob/verb/whisper_verb(message as text)
|
||||
set name = "Whisper"
|
||||
set category = "IC"
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
whisper(message)
|
||||
@@ -39,7 +39,7 @@
|
||||
set_typing_indicator(FALSE)
|
||||
//SKYRAT EDIT ADDITION END
|
||||
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
var/name = real_name
|
||||
var/alt_name = ""
|
||||
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//Most of these are defined at this level to reduce on checks elsewhere in the code.
|
||||
//Having them here also makes for a nice reference list of the various overlay-updating procs available
|
||||
|
||||
/mob/proc/regenerate_icons() //TODO: phase this out completely if possible
|
||||
/mob/proc/regenerate_icons() //TODO: phase this out completely if possible
|
||||
return
|
||||
|
||||
/mob/proc/update_icons()
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
if(client)
|
||||
R.updatename(client)
|
||||
|
||||
if(mind) //TODO //TODO WHAT
|
||||
if(mind) //TODO //TODO WHAT
|
||||
if(!transfer_after)
|
||||
mind.active = FALSE
|
||||
mind.transfer_to(R)
|
||||
@@ -208,7 +208,7 @@
|
||||
|
||||
var/mob/living/simple_animal/slime/new_slime
|
||||
if(reproduce)
|
||||
var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring)
|
||||
var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring)
|
||||
var/list/babies = list()
|
||||
for(var/i=1,i<=number,i++)
|
||||
var/mob/living/simple_animal/slime/M = new/mob/living/simple_animal/slime(loc)
|
||||
@@ -242,7 +242,7 @@
|
||||
regenerate_icons()
|
||||
icon = null
|
||||
invisibility = INVISIBILITY_MAXIMUM
|
||||
for(var/t in bodyparts) //this really should not be necessary
|
||||
for(var/t in bodyparts) //this really should not be necessary
|
||||
qdel(t)
|
||||
|
||||
var/mob/living/simple_animal/pet/dog/corgi/new_corgi = new /mob/living/simple_animal/pet/dog/corgi (loc)
|
||||
@@ -339,7 +339,7 @@
|
||||
|
||||
//Bad mobs! - Remember to add a comment explaining what's wrong with the mob
|
||||
if(!MP)
|
||||
return FALSE //Sanity, this should never happen.
|
||||
return FALSE //Sanity, this should never happen.
|
||||
|
||||
if(ispath(MP, /mob/living/simple_animal/hostile/construct))
|
||||
return FALSE //Verbs do not appear for players.
|
||||
|
||||
Reference in New Issue
Block a user