[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:
SkyratBot
2021-02-15 15:32:02 +00:00
committed by GitHub
co-authored by Mothblocks Gandalf2k15
parent 7635f198f4
commit b332b46b65
893 changed files with 6616 additions and 6605 deletions
+1 -1
View File
@@ -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)
+10 -10
View File
@@ -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"
+1 -1
View File
@@ -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)
+15 -15
View File
@@ -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
+2 -2
View File
@@ -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
+5 -5
View File
@@ -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 ..()
+6 -6
View File
@@ -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
+5 -5
View File
@@ -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>&nbsp;</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 += "&nbsp;<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)
+11 -11
View File
@@ -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
+10 -10
View File
@@ -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
+2 -2
View File
@@ -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()
+5 -5
View File
@@ -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
+9 -9
View File
@@ -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.
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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()
+12 -12
View File
@@ -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)
..()
+20 -20
View File
@@ -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,
+2 -2
View File
@@ -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
+21 -21
View File
@@ -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)
+3 -3
View File
@@ -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)
+4 -4
View File
@@ -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)
+10 -10
View File
@@ -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
+2 -2
View File
@@ -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
+5 -5
View File
@@ -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)
+4 -4
View File
@@ -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 -1
View File
@@ -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()
+4 -4
View File
@@ -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.