Merge remote-tracking branch 'VOREStation/master' into upstream-merge-7926

This commit is contained in:
Unknown
2021-02-28 17:53:22 -05:00
190 changed files with 379137 additions and 65237 deletions
+4 -3
View File
@@ -37,14 +37,15 @@
var/mob/M = mob
spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes.
if(M)
//VOREStation edit
if(istype(M, /mob/observer/dead/))
if(isobserver(M))
//VOREStation Edit Start
var/mob/observer/dead/D = M
if(ckey || (src in view(D)))
M.show_message(message, m_type)
message = "<span class='emote'><B>[src]</B> ([ghost_follow_link(src, M)]) [input]</span>"
else
M.show_message(message, m_type)
//End VOREStation edit
//VOREStation Edit End
for(var/obj in o_viewers)
var/obj/O = obj
+5 -5
View File
@@ -12,11 +12,11 @@
visualnet = cameranet
/mob/observer/eye/aiEye/Destroy()
if(owner)
var/mob/living/silicon/ai/ai = owner
ai.all_eyes -= src
owner = null
. = ..()
if(owner)
var/mob/living/silicon/ai/ai = owner
ai.all_eyes -= src
owner = null
. = ..()
/mob/observer/eye/aiEye/setLoc(var/T, var/cancel_tracking = 1)
if(owner)
+2 -2
View File
@@ -38,8 +38,8 @@
updateVisibility(src)
return ..()
/obj/effect/New()
..()
/obj/effect/Initialize()
. = ..()
updateVisibility(src)
// DOORS
@@ -140,6 +140,6 @@
to_wear_r_hand = null
/mob/living/carbon/human/ai_controlled/replicant/Initialize()
..()
. = ..()
name = species.get_random_name(gender)
add_modifier(/datum/modifier/homeothermic, 0, null)
+4 -3
View File
@@ -69,7 +69,8 @@
//Organs and blood
handle_organs()
stabilize_body_temperature() //Body temperature adjusts itself (self-regulation)
weightgain() //VORESTATION EDIT
weightgain() //VOREStation Addition
process_weaver_silk() //VOREStation Addition
handle_shock()
handle_pain()
@@ -77,7 +78,7 @@
handle_medical_side_effects()
handle_heartbeat()
handle_nif() //VOREStation Add
handle_nif() //VOREStation Addition
if(!client)
species.handle_npc(src)
@@ -1291,7 +1292,7 @@
clear_alert("blind")
var/apply_nearsighted_overlay = FALSE
if(disabilities & NEARSIGHTED)
if(disabilities & NEARSIGHTED)
apply_nearsighted_overlay = TRUE
if(glasses)
@@ -6,6 +6,14 @@
else if (nutrition <= MAX_NUTRITION_TO_LOSE && stat != 2 && weight > MIN_MOB_WEIGHT && weight_loss)
weight -= species.metabolism*(0.01*weight_loss) // starvation weight loss
/mob/living/carbon/human/proc/process_weaver_silk()
if(!species || !(species.is_weaver))
return
if(species.silk_reserve < species.silk_max_reserve && species.silk_production == TRUE && nutrition > 100)
species.silk_reserve = min(species.silk_reserve + 2, species.silk_max_reserve)
adjust_nutrition(-0.4)
/mob/living/carbon/human/proc/handle_hud_list_vr()
//Right-side status hud updates with left side one.
@@ -60,13 +68,13 @@
//Overriding carbon move proc that forces default hunger factor
/mob/living/carbon/Moved(atom/old_loc, direction, forced = FALSE)
. = ..()
// Technically this does mean being dragged takes nutrition
if(stat != DEAD)
adjust_nutrition(hunger_rate/-10)
if(m_intent == "run")
adjust_nutrition(hunger_rate/-10)
// Moving around increases germ_level faster
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
germ_level++
@@ -52,6 +52,8 @@
var/active_regen_mult = 1 // Multiplier for 'Regenerate' power speed, in human_powers.dm
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
var/allergens = null // Things that will make this species very sick
var/allergen_severity = 0.5 // How bad are reactions to the allergen? This is raw toxin damage per metabolism tick, multiplied by the amount metabolized
var/min_age = 17
var/max_age = 70
@@ -21,6 +21,22 @@
var/icon_height = 32
var/agility = 20 //prob() to do agile things
var/organic_food_coeff = 1
var/synthetic_food_coeff = 0
//var/vore_numbing = 0
var/metabolism = 0.0015
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
var/trashcan = FALSE //It's always sunny in the wrestling ring.
var/eat_minerals = FALSE //HEAVY METAL DIET
var/base_species = null // Unused outside of a few species
var/selects_bodytype = FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect.
var/is_weaver = FALSE
var/silk_production = FALSE
var/silk_reserve = 100
var/silk_max_reserve = 500
var/silk_color = "#FFFFFF"
var/list/traits = list()
/datum/species/proc/update_attack_types()
@@ -1,14 +1,3 @@
/datum/species
//var/vore_numbing = 0
var/gets_food_nutrition = TRUE // If this is set to 0, the person can't get nutrition from food.
var/metabolism = 0.0015
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
var/trashcan = FALSE //It's always sunny in the wrestling ring.
var/eat_minerals = FALSE //HEAVY METAL DIET
var/base_species = null //Used in every UpdateAppearance call.
var/selects_bodytype = FALSE // Allows the species to choose from body types intead of being forced to be just one.
/datum/species/New()
if(!base_species)
base_species = name
@@ -19,7 +19,6 @@
color_mult = 1
mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping
trashcan = 1 //They have goopy bodies. They can just dissolve things within them.
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
@@ -225,6 +225,7 @@
base_color = "#333333"
reagent_tag = IS_TAJARA
allergens = COFFEE
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
@@ -312,6 +313,7 @@
breath_heat_level_3 = 1350 //Default 1250
reagent_tag = IS_SKRELL
allergens = MEAT|FISH|DAIRY
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
@@ -850,3 +850,150 @@
set category = "Abilities"
pass_flags ^= PASSTABLE //I dunno what this fancy ^= is but Aronai gave it to me.
to_chat(src, "You [pass_flags&PASSTABLE ? "will" : "will NOT"] move over tables/railings/trays!")
/mob/living/carbon/human/proc/check_silk_amount()
set name = "Check Silk Amount"
set category = "Abilities"
if(species.is_weaver)
to_chat(src, "Your silk reserves are at [species.silk_reserve]/[species.silk_max_reserve].")
else
to_chat(src, "<span class='warning'>You are not a weaver! How are you doing this? Tell a developer!</span>")
/mob/living/carbon/human/proc/toggle_silk_production()
set name = "Toggle Silk Production"
set category = "Abilities"
if(species.is_weaver)
species.silk_production = !(species.silk_production)
to_chat(src, "You are [species.silk_production ? "now" : "no longer"] producing silk.")
else
to_chat(src, "<span class='warning'>You are not a weaver! How are you doing this? Tell a developer!</span>")
/mob/living/carbon/human/proc/weave_structure()
set name = "Weave Structure"
set category = "Abilities"
if(!(species.is_weaver))
to_chat(src, "<span class='warning'>You are not a weaver! How are you doing this? Tell a developer!</span>")
return
var/choice
var/datum/weaver_recipe/structure/desired_result
var/finalized = "No"
while(finalized == "No" && src.client)
choice = input(src,"What would you like to weave?") as null|anything in weavable_structures
desired_result = weavable_structures[choice]
if(!desired_result || !istype(desired_result))
return
if(choice)
finalized = alert(src, "Are you sure you want to weave [desired_result.title]? It will cost you [desired_result.cost] silk.","Confirmation","Yes","No")
if(!desired_result || !istype(desired_result))
return
if(desired_result.cost > species.silk_reserve)
to_chat(src, "<span class='warning'>You don't have enough silk to weave that!</span>")
return
if(stat)
to_chat(src, "<span class='warning'>You can't do that in your current state!</span>")
return
if(locate(desired_result.result_type) in src.loc)
to_chat(src, "<span class='warning'>You can't create another weaversilk [desired_result.title] here!</span>")
return
if(!isturf(src.loc))
to_chat(src, "<span class='warning'>You can't weave here!</span>")
return
if(do_after(src, desired_result.time, exclusive = TRUE))
if(desired_result.cost > species.silk_reserve)
to_chat(src, "<span class='warning'>You don't have enough silk to weave that!</span>")
return
if(locate(desired_result.result_type) in src.loc)
to_chat(src, "<span class='warning'>You can't create another weaversilk [desired_result.title] here!</span>")
return
if(!isturf(src.loc))
to_chat(src, "<span class='warning'>You can't weave here!</span>")
return
species.silk_reserve = max(species.silk_reserve - desired_result.cost, 0)
//new desired_result.result_type(src.loc)
var/atom/O = new desired_result.result_type(src.loc)
O.color = species.silk_color
/mob/living/carbon/human/proc/weave_item()
set name = "Weave Item"
set category = "Abilities"
if(!(species.is_weaver))
return
var/choice
var/datum/weaver_recipe/item/desired_result
var/finalized = "No"
while(finalized == "No" && src.client)
choice = input(src,"What would you like to weave?") as null|anything in weavable_items
desired_result = weavable_items[choice]
if(!desired_result || !istype(desired_result))
return
if(choice)
finalized = alert(src, "Are you sure you want to weave [desired_result.title]? It will cost you [desired_result.cost] silk.","Confirmation","Yes","No")
if(!desired_result || !istype(desired_result))
return
if(!(species.is_weaver))
to_chat(src, "<span class='warning'>You are not a weaver! How are you doing this? Tell a developer!</span>")
return
if(desired_result.cost > species.silk_reserve)
to_chat(src, "<span class='warning'>You don't have enough silk to weave that!</span>")
return
if(stat)
to_chat(src, "<span class='warning'>You can't do that in your current state!</span>")
return
if(!isturf(src.loc))
to_chat(src, "<span class='warning'>You can't weave here!</span>")
return
if(do_after(src, desired_result.time, exclusive = TRUE))
if(desired_result.cost > species.silk_reserve)
to_chat(src, "<span class='warning'>You don't have enough silk to weave that!</span>")
return
if(!isturf(src.loc))
to_chat(src, "<span class='warning'>You can't weave here!</span>")
return
species.silk_reserve = max(species.silk_reserve - desired_result.cost, 0)
//new desired_result.result_type(src.loc)
var/atom/O = new desired_result.result_type(src.loc)
O.color = species.silk_color
/mob/living/carbon/human/proc/set_silk_color()
set name = "Set Silk Color"
set category = "Abilities"
if(!(species.is_weaver))
to_chat(src, "<span class='warning'>You are not a weaver! How are you doing this? Tell a developer!</span>")
return
var/new_silk_color = input("Pick a color for your woven products:","Silk Color", species.silk_color) as null|color
if(new_silk_color)
species.silk_color = new_silk_color
@@ -380,7 +380,11 @@
icobase_tail = 1
inherent_verbs = list(
/mob/living/proc/weaveWebBindings)
/mob/living/carbon/human/proc/check_silk_amount,
/mob/living/carbon/human/proc/toggle_silk_production,
/mob/living/carbon/human/proc/weave_structure,
/mob/living/carbon/human/proc/weave_item,
/mob/living/carbon/human/proc/set_silk_color)
min_age = 18
max_age = 80
@@ -412,6 +416,10 @@
base_color = "#333333" //Blackish-gray
blood_color = "#0952EF" //Spiders have blue blood.
is_weaver = TRUE
silk_reserve = 500
silk_max_reserve = 1000
/datum/species/spider/handle_environment_special(var/mob/living/carbon/human/H)
if(H.stat == DEAD) // If they're dead they won't need anything.
return
@@ -226,7 +226,7 @@
dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \
culture both feared and respected for their scientific breakthroughs. Discovery, loyalty, and utilitarianism dominates their lifestyles \
to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \
which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
wikilink="https://wiki.vore-station.net/Backstory#Vulpkanin"
@@ -265,6 +265,7 @@
tail_animation = 'icons/mob/species/tajaran/tail_vr.dmi'
color_mult = 1
min_age = 18
allergens = null
gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds)
heat_discomfort_level = 295 //Prevents heat discomfort spam at 20c
@@ -279,6 +280,7 @@
color_mult = 1
min_age = 18
reagent_tag = null
allergens = null
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
genders = list(MALE, FEMALE, PLURAL, NEUTER)
wikilink="https://wiki.vore-station.net/Skrell"
@@ -67,7 +67,7 @@
desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey."
cost = 0
custom_only = FALSE
var_changes = list("gets_food_nutrition" = 0) //The verb is given in human.dm
var_changes = list("organic_food_coeff" = 0) //The verb is given in human.dm
/datum/trait/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
@@ -121,11 +121,19 @@
desc = "You only gain nutrition from raw ore and refined minerals. There's nothing that sates the appetite better than precious gems, exotic or rare minerals and you have damn fine taste. Anything else is beneath you."
cost = 0
custom_only = FALSE
var_changes = list("gets_food_nutrition" = 0, "eat_minerals" = 1)
var_changes = list("organic_food_coeff" = 0, "eat_minerals" = 1)
/datum/trait/gem_eater/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/eat_minerals
/datum/trait/synth_chemfurnace
name = "Biofuel Processor"
desc = "You are able to gain energy through consuming and processing normal food. Energy-dense foods such as protein bars and survival food will yield the best results."
cost = 0
custom_only = FALSE
can_take = SYNTHETICS
var_changes = list("organic_food_coeff" = 0, "synthetic_food_coeff" = 0.25)
/datum/trait/glowing_eyes
name = "Glowing Eyes"
@@ -145,6 +153,33 @@
H.verbs |= /mob/living/proc/glow_toggle
H.verbs |= /mob/living/proc/glow_color
//Allergen traits! Not available to any species with a base allergens var.
/datum/trait/allergy_gluten
name = "Allergy: Gluten"
desc = "You're highly allergic to gluten proteins, which are found in most common grains."
cost = 0
custom_only = FALSE
var_changes = list("allergens" = 16)
excludes = list(/datum/trait/allergy_nuts,/datum/trait/allergy_soy)
/datum/trait/allergy_nuts
name = "Allergy: Nuts"
desc = "You're highly allergic to hard-shell seeds, such as peanuts."
cost = 0
custom_only = FALSE
var_changes = list("allergens" = 64)
excludes = list(/datum/trait/allergy_gluten,/datum/trait/allergy_soy)
/datum/trait/allergy_soy
name = "Allergy: Soy"
desc = "You're highly allergic to soybeans, and some other kinds of bean."
cost = 0
custom_only = FALSE
var_changes = list("allergens" = 32)
excludes = list(/datum/trait/allergy_gluten,/datum/trait/allergy_nuts)
// Spicy Food Traits, from negative to positive.
/datum/trait/spice_intolerance_extreme
name = "Extreme Spice Intolerance"
@@ -126,7 +126,7 @@
/datum/trait/antiseptic_saliva/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
H.verbs |= /mob/living/carbon/human/proc/lick_wounds
H.verbs |= /mob/living/carbon/human/proc/lick_wounds
/datum/trait/traceur
name = "Traceur"
@@ -139,3 +139,17 @@
desc = "You are able to move unhindered on snow."
cost = 1
var_changes = list("snow_movement" = -2)
/datum/trait/weaver
name = "Weaver"
desc = "You can produce silk and create various articles of clothing and objects."
cost = 2
var_changes = list("is_weaver" = 1)
/datum/trait/weaver/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
H.verbs |= /mob/living/carbon/human/proc/check_silk_amount
H.verbs |= /mob/living/carbon/human/proc/toggle_silk_production
H.verbs |= /mob/living/carbon/human/proc/weave_structure
H.verbs |= /mob/living/carbon/human/proc/weave_item
H.verbs |= /mob/living/carbon/human/proc/set_silk_color
@@ -6,9 +6,10 @@
var/desc = "Contact a developer if you see this trait."
var/cost = 0 // 0 is neutral, negative cost means negative, positive cost means positive.
var/list/var_changes // A list to apply to the custom species vars.
var/list/var_changes // A list to apply to the custom species vars.
var/list/excludes // Store a list of paths of traits to exclude, but done automatically if they change the same vars.
var/can_take = ORGANICS|SYNTHETICS // Can freaking synths use those.
var/list/banned_species // A list of species that can't take this trait
var/custom_only = TRUE // Trait only available for custom species
//Proc can be overridden lower to include special changes, make sure to call up though for the vars changes
@@ -0,0 +1,108 @@
// Structures
/obj/effect/weaversilk
name = "weaversilk web"
desc = "A thin layer of fiberous webs. It looks like it can be torn down with one strong hit."
icon = 'icons/vore/weaver_icons_vr.dmi'
anchored = 1
density = 0
/obj/effect/weaversilk/attack_hand(mob/user as mob)
..()
if(user.a_intent == I_HURT)
to_chat(user,"<span class='warning'>You easily tear down [name].</span>")
qdel(src)
/obj/effect/weaversilk/floor
var/possible_icon_states = list("floorweb1", "floorweb2", "floorweb3", "floorweb4", "floorweb5", "floorweb6", "floorweb7", "floorweb8")
plane = DIRTY_PLANE
/obj/effect/weaversilk/floor/Initialize()
..()
icon_state = pick(possible_icon_states)
/obj/effect/weaversilk/wall
name = "weaversilk web wall"
desc = "A thin layer of fiberous webs, but just thick enough to block your way. It looks like it can be torn down with one strong hit."
icon_state = "wallweb1"
var/possible_icon_states = list("wallweb1", "wallweb2", "wallweb3")
density = 1
/obj/effect/weaversilk/wall/Initialize()
..()
icon_state = pick(possible_icon_states)
/obj/effect/weaversilk/wall/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /mob/living/carbon/human))
var/mob/living/carbon/human/H = mover
if(H.species.is_weaver)
return TRUE
..()
/obj/structure/bed/double/weaversilk_nest
name = "weaversilk nest"
desc = "A nest of some kind, made of fiberous material."
icon = 'icons/vore/weaver_icons_vr.dmi'
icon_state = "nest"
base_icon = "nest"
/obj/structure/bed/double/weaversilk_nest/update_icon()
return
/obj/structure/bed/double/weaversilk_nest/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.is_wrench() || istype(W,/obj/item/stack) || W.is_wirecutter())
return
..()
/obj/structure/bed/double/weaversilk_nest/attack_hand(mob/user as mob)
..()
if(user.a_intent == I_HURT && !has_buckled_mobs())
to_chat(user,"<span class='warning'>You easily tear down [name].</span>")
qdel(src)
/obj/effect/weaversilk/trap
name = "weaversilk trap"
desc = "A silky, yet firm trap. Be careful not to step into it! Or don't..."
icon_state = "trap"
var/trap_active = TRUE
/obj/effect/weaversilk/trap/Crossed(atom/movable/AM as mob|obj)
if(AM.is_incorporeal())
return
if(istype(AM, /mob/living/carbon/human))
var/mob/living/carbon/human/H = AM
if(H.species.is_weaver)
return
if(isliving(AM) && trap_active)
var/mob/living/L = AM
if(L.m_intent == "run")
L.visible_message(
"<span class='danger'>[L] steps on \the [src].</span>",
"<span class='danger'>You step on \the [src]!</span>",
"<b>You hear a squishy noise!</b>"
)
set_dir(L.dir)
can_buckle = 1
buckle_mob(L)
L.Stun(1 SECOND)
to_chat(L, "<span class='danger'>The sticky fibers of \the [src] ensnare, trapping you in place!</span>")
trap_active = 0
can_buckle = initial(can_buckle)
desc += " Actually, it looks like it's been all spent."
..()
// Items
// TODO: Spidersilk clothing and actual bindings, once sprites are ready.
/obj/item/clothing/suit/weaversilk_bindings
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_override = 'icons/vore/custom_clothes_vr.dmi'
name = "weaversilk bindings"
desc = "A webbed cocoon that completely restrains the wearer."
icon_state = "web_bindings"
item_state = "web_bindings_mob"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
@@ -0,0 +1,36 @@
/datum/weaver_recipe
var/title = null
var/result_type
var/cost = 0
var/time = 5 SECONDS
/datum/weaver_recipe/structure
/datum/weaver_recipe/structure/floor
title = "floor"
result_type = /obj/effect/weaversilk/floor
cost = 25
time = 1 SECOND
/datum/weaver_recipe/structure/wall
title = "wall"
result_type = /obj/effect/weaversilk/wall
cost = 100
/datum/weaver_recipe/structure/nest
title = "nest"
result_type = /obj/structure/bed/double/weaversilk_nest
cost = 100
/datum/weaver_recipe/structure/trap
title = "trap"
result_type = /obj/effect/weaversilk/trap
cost = 250
time = 15 SECONDS
/datum/weaver_recipe/item
cost = 50
/datum/weaver_recipe/item/bindings
title = "bindings"
result_type = /obj/item/clothing/suit/weaversilk_bindings
@@ -141,6 +141,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/desired_scale_y = size_multiplier * icon_scale_y
desired_scale_x *= species.icon_scale_x
desired_scale_y *= species.icon_scale_y
appearance_flags |= PIXEL_SCALE
if(fuzzy)
appearance_flags &= ~PIXEL_SCALE
//VOREStation Edit End
// Regular stuff again.
-379
View File
@@ -74,214 +74,6 @@
usr.visible_message("<b>[src]</b> points to [A]")
return 1
/*one proc, four uses
swapping: if it's 1, the mobs are trying to switch, if 0, non-passive is pushing passive
default behaviour is:
- non-passive mob passes the passive version
- passive mob checks to see if its mob_bump_flag is in the non-passive's mob_bump_flags
- if si, the proc returns
*/
/mob/living/proc/can_move_mob(var/mob/living/swapped, swapping = 0, passive = 0)
if(!swapped)
return 1
if(!passive)
return swapped.can_move_mob(src, swapping, 1)
else
var/context_flags = 0
if(swapping)
context_flags = swapped.mob_swap_flags
else
context_flags = swapped.mob_push_flags
if(!mob_bump_flag) //nothing defined, go wild
return 1
if(mob_bump_flag & context_flags)
return 1
return 0
/mob/living/Bump(atom/movable/AM)
if(now_pushing || !loc || buckled == AM)
return
now_pushing = 1
if (istype(AM, /mob/living))
var/mob/living/tmob = AM
//Even if we don't push/swap places, we "touched" them, so spread fire
spread_fire(tmob)
for(var/mob/living/M in range(tmob, 1))
if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
if ( !(world.time % 5) )
to_chat(src, "<span class='warning'>[tmob] is restrained, you cannot push past</span>")
now_pushing = 0
return
if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
if ( !(world.time % 5) )
to_chat(src, "<span class='warning'>[tmob] is restraining [M], you cannot push past</span>")
now_pushing = 0
return
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
var/can_swap = 1
if(loc.density || tmob.loc.density)
can_swap = 0
if(can_swap)
for(var/atom/movable/A in loc)
if(A == src)
continue
if(!A.CanPass(tmob, loc))
can_swap = 0
if(!can_swap) break
if(can_swap)
for(var/atom/movable/A in tmob.loc)
if(A == tmob)
continue
if(!A.CanPass(src, tmob.loc))
can_swap = 0
if(!can_swap) break
//Leaping mobs just land on the tile, no pushing, no anything.
if(status_flags & LEAPING)
loc = tmob.loc
status_flags &= ~LEAPING
now_pushing = 0
return
if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && can_swap && can_move_mob(tmob, 1, 0)) // mutual brohugs all around!
var/turf/oldloc = loc
//VOREstation Edit - Begin
//check bumpnom chance, if it's a simplemob that's doing the bumping
var/mob/living/simple_mob/srcsimp = src
if(istype(srcsimp))
if(srcsimp.tryBumpNom(tmob))
now_pushing = 0
return
//if it's a simplemob being bumped, and the above didn't make them start getting bumpnommed, they get a chance to bumpnom
var/mob/living/simple_mob/tmobsimp = tmob
if(istype(tmobsimp))
if(tmobsimp.tryBumpNom(src))
now_pushing = 0
return
//VOREstation Edit - End
forceMove(tmob.loc)
//VOREstation Edit - Begin
// In case of micros, we don't swap positions; instead occupying the same square!
if (handle_micro_bump_helping(tmob))
now_pushing = 0
return
// TODO - Check if we need to do something about the slime.UpdateFeed() we are skipping below.
// VOREStation Edit - End
tmob.forceMove(oldloc)
now_pushing = 0
return
//VOREStation Edit - Begin
else if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && canmove && can_swap && handle_micro_bump_helping(tmob))
forceMove(tmob.loc)
now_pushing = 0
return
//VOREStation Edit - End
if(!can_move_mob(tmob, 0, 0))
now_pushing = 0
return
if(a_intent == I_HELP || src.restrained())
now_pushing = 0
return
// VOREStation Edit - Begin
// Plow that nerd.
if(ishuman(tmob))
var/mob/living/carbon/human/H = tmob
if(H.species.lightweight == 1 && prob(50))
H.visible_message("<span class='warning'>[src] bumps into [H], knocking them off balance!</span>")
H.Weaken(5)
now_pushing = 0
return
// Handle grabbing, stomping, and such of micros!
if(handle_micro_bump_other(tmob)) return
// VOREStation Edit - End
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(40) && !(FAT in src.mutations))
to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
if(prob(99))
now_pushing = 0
return
if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
if(prob(99))
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
return
tmob.LAssailant = src
now_pushing = 0
. = ..()
if (!istype(AM, /atom/movable) || AM.anchored)
//VOREStation Edit - object-specific proc for running into things
if(((confused || is_blind()) && stat == CONSCIOUS && prob(50) && m_intent=="run") || flying)
AM.stumble_into(src)
//VOREStation Edit End
/* VOREStation Removal - See above
if(confused && prob(50) && m_intent=="run")
Weaken(2)
playsound(src, "punch", 25, 1, -1)
visible_message("<span class='warning'>[src] [pick("ran", "slammed")] into \the [AM]!</span>")
src.apply_damage(5, BRUTE)
to_chat(src, "<span class='warning'>You just [pick("ran", "slammed")] into \the [AM]!</span>")
*/ // VOREStation Removal End
return
if (!now_pushing)
if(isobj(AM))
var/obj/I = AM
if(!can_pull_size || can_pull_size < I.w_class)
return
now_pushing = 1
var/t = get_dir(src, AM)
if (istype(AM, /obj/structure/window))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
var/turf/T = AM.loc
var/turf/T2 = get_step(AM,t)
if(!T2) // Map edge
now_pushing = 0
return
var/move_time = movement_delay(loc, t)
move_time = DS2NEARESTTICK(move_time)
if(AM.Move(T2, t, move_time))
Move(T, t, move_time)
if(ishuman(AM) && AM:grabbed_by)
for(var/obj/item/weapon/grab/G in AM:grabbed_by)
step(G:assailant, get_dir(G:assailant, AM))
G.adjust_position()
now_pushing = 0
/mob/living/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /obj/structure/blob) && faction == "blob") //Blobs should ignore things on their faction.
return TRUE
return ..()
// Called when something steps onto us. This allows for mulebots and vehicles to run things over. <3
/mob/living/Crossed(var/atom/movable/AM) // Transplanting this from /mob/living/carbon/human/Crossed()
if(AM == src || AM.is_incorporeal()) // We're not going to run over ourselves or ghosts
return
if(istype(AM, /mob/living/bot/mulebot))
var/mob/living/bot/mulebot/MB = AM
MB.runOver(src)
if(istype(AM, /obj/vehicle))
var/obj/vehicle/V = AM
V.RunOver(src)
/mob/living/verb/succumb()
set hidden = 1
if ((src.health < 0 && src.health > (5-src.getMaxHealth()))) // Health below Zero but above 5-away-from-death, as before, but variable
@@ -682,36 +474,6 @@ default behaviour is:
// ++++ROCKDTBEN++++ MOB PROCS //END
// Applies direct "cold" damage while checking protection against the cold.
/mob/living/proc/inflict_cold_damage(amount)
amount *= 1 - get_cold_protection(50) // Within spacesuit protection.
if(amount > 0)
adjustFireLoss(amount)
// Ditto, but for "heat".
/mob/living/proc/inflict_heat_damage(amount)
amount *= 1 - get_heat_protection(10000) // Within firesuit protection.
if(amount > 0)
adjustFireLoss(amount)
// and one for electricity because why not
/mob/living/proc/inflict_shock_damage(amount)
electrocute_act(amount, null, 1 - get_shock_protection(), pick(BP_HEAD, BP_TORSO, BP_GROIN))
// also one for water (most things resist it entirely, except for slimes)
/mob/living/proc/inflict_water_damage(amount)
amount *= 1 - get_water_protection()
if(amount > 0)
adjustToxLoss(amount)
// one for abstracted away ""poison"" (mostly because simplemobs shouldn't handle reagents)
/mob/living/proc/inflict_poison_damage(amount)
if(isSynthetic())
return
amount *= 1 - get_poison_protection()
if(amount > 0)
adjustToxLoss(amount)
/mob/proc/get_contents()
@@ -762,50 +524,6 @@ default behaviour is:
return 1
return 0
/mob/living/proc/can_inject()
return 1
/mob/living/proc/get_organ_target()
var/mob/shooter = src
var/t = shooter:zone_sel.selecting
if ((t in list( O_EYES, O_MOUTH )))
t = BP_HEAD
var/obj/item/organ/external/def_zone = ran_zone(t)
return def_zone
// heal ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/heal_organ_damage(var/brute, var/burn)
adjustBruteLoss(-brute)
adjustFireLoss(-burn)
src.updatehealth()
// damage ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/take_organ_damage(var/brute, var/burn, var/emp=0)
if(status_flags & GODMODE) return 0 //godmode
adjustBruteLoss(brute)
adjustFireLoss(burn)
src.updatehealth()
// heal MANY external organs, in random order
/mob/living/proc/heal_overall_damage(var/brute, var/burn)
adjustBruteLoss(-brute)
adjustFireLoss(-burn)
src.updatehealth()
// damage MANY external organs, in random order
/mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null)
if(status_flags & GODMODE) return 0 //godmode
adjustBruteLoss(brute)
adjustFireLoss(burn)
src.updatehealth()
/mob/living/proc/restore_all_organs()
return
/mob/living/proc/revive()
rejuvenate()
if(buckled)
@@ -903,103 +621,6 @@ default behaviour is:
return
// Almost all of this handles pulling movables behind us
/mob/living/Move(atom/newloc, direct, movetime)
if(buckled && buckled.loc != newloc) //not updating position
if(!buckled.anchored && buckled.buckle_movable)
return buckled.Move(newloc, direct)
else
return 0
var/atom/movable/pullee = pulling
// Prior to our move it's already too far away
if(pullee && get_dist(src, pullee) > 1)
stop_pulling()
// Shenanigans! Pullee closed into locker for eg.
if(pullee && !isturf(pullee.loc) && pullee.loc != loc)
stop_pulling()
// Can't pull with no hands
if(restrained())
stop_pulling()
// Will move our mob (probably)
. = ..() // Moved() called at this point if successful
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //seperated from our puller and not in the middle of a diagonal move
pulledby.stop_pulling()
if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much.
s_active.close(src)
/mob/living/proc/dragged(var/mob/living/dragger, var/oldloc)
var/area/A = get_area(src)
if(lying && !buckled && pull_damage() && A.has_gravity() && (prob(getBruteLoss() * 200 / maxHealth)))
adjustBruteLoss(2)
visible_message("<span class='danger'>\The [src]'s [isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!</span>")
/mob/living/Moved(var/atom/oldloc, direct, forced, movetime)
. = ..()
handle_footstep(loc)
// Begin VOREstation edit
if(is_shifted)
is_shifted = FALSE
pixel_x = default_pixel_x
pixel_y = default_pixel_y
// End VOREstation edit
if(pulling) // we were pulling a thing and didn't lose it during our move.
var/pull_dir = get_dir(src, pulling)
if(pulling.anchored || !isturf(pulling.loc))
stop_pulling()
else if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) // puller and pullee more than one tile away or in diagonal position
// If it is too far away or across z-levels from old location, stop pulling.
if(get_dist(pulling.loc, oldloc) > 1 || pulling.loc.z != oldloc?.z)
stop_pulling()
// living might take damage from drags
else if(isliving(pulling))
var/mob/living/M = pulling
M.dragged(src, oldloc)
pulling.Move(oldloc, 0, movetime) // the pullee tries to reach our previous position
if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up
stop_pulling()
if(!isturf(loc))
return
else if(lastarea?.has_gravity == 0)
inertial_drift()
//VOREStation Edit Start
else if(flying)
inertial_drift()
make_floating(1)
//VOREStation Edit End
else if(!isspace(loc))
inertia_dir = 0
make_floating(0)
/mob/living/proc/inertial_drift()
if(x > 1 && x < (world.maxx) && y > 1 && y < (world.maxy))
if(Process_Spacemove(1))
inertia_dir = 0
return
var/locthen = loc
spawn(5)
if(!anchored && !pulledby && loc == locthen)
var/stepdir = inertia_dir ? inertia_dir : last_move
if(!stepdir)
return
var/turf/T = get_step(src, stepdir)
if(!T)
return
Move(T, stepdir, 5)
/mob/living/proc/handle_footstep(turf/T)
return FALSE
/mob/living/verb/resist()
set name = "Resist"
set category = "IC"
+71 -1
View File
@@ -571,4 +571,74 @@
if(confused)
accuracy_penalty += 45
return accuracy_penalty
return accuracy_penalty
// Applies direct "cold" damage while checking protection against the cold.
/mob/living/proc/inflict_cold_damage(amount)
amount *= 1 - get_cold_protection(50) // Within spacesuit protection.
if(amount > 0)
adjustFireLoss(amount)
// Ditto, but for "heat".
/mob/living/proc/inflict_heat_damage(amount)
amount *= 1 - get_heat_protection(10000) // Within firesuit protection.
if(amount > 0)
adjustFireLoss(amount)
// and one for electricity because why not
/mob/living/proc/inflict_shock_damage(amount)
electrocute_act(amount, null, 1 - get_shock_protection(), pick(BP_HEAD, BP_TORSO, BP_GROIN))
// also one for water (most things resist it entirely, except for slimes)
/mob/living/proc/inflict_water_damage(amount)
amount *= 1 - get_water_protection()
if(amount > 0)
adjustToxLoss(amount)
// one for abstracted away ""poison"" (mostly because simplemobs shouldn't handle reagents)
/mob/living/proc/inflict_poison_damage(amount)
if(isSynthetic())
return
amount *= 1 - get_poison_protection()
if(amount > 0)
adjustToxLoss(amount)
/mob/living/proc/can_inject()
return 1
/mob/living/proc/get_organ_target()
var/mob/shooter = src
var/t = shooter:zone_sel.selecting
if ((t in list( O_EYES, O_MOUTH )))
t = BP_HEAD
var/obj/item/organ/external/def_zone = ran_zone(t)
return def_zone
// heal ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/heal_organ_damage(var/brute, var/burn)
adjustBruteLoss(-brute)
adjustFireLoss(-burn)
src.updatehealth()
// damage ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/take_organ_damage(var/brute, var/burn, var/emp=0)
if(status_flags & GODMODE) return 0 //godmode
adjustBruteLoss(brute)
adjustFireLoss(burn)
src.updatehealth()
// heal MANY external organs, in random order
/mob/living/proc/heal_overall_damage(var/brute, var/burn)
adjustBruteLoss(-brute)
adjustFireLoss(-burn)
src.updatehealth()
// damage MANY external organs, in random order
/mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null)
if(status_flags & GODMODE) return 0 //godmode
adjustBruteLoss(brute)
adjustFireLoss(burn)
src.updatehealth()
/mob/living/proc/restore_all_organs()
return
+299 -1
View File
@@ -18,4 +18,302 @@
if(!n.is_safe_to_enter(src))
to_chat(src, span("warning", "\The [n] is dangerous to move into."))
return FALSE // In case any code wants to know if movement happened.
return ..() // Parent call should make the mob move.
return ..() // Parent call should make the mob move.
/*one proc, four uses
swapping: if it's 1, the mobs are trying to switch, if 0, non-passive is pushing passive
default behaviour is:
- non-passive mob passes the passive version
- passive mob checks to see if its mob_bump_flag is in the non-passive's mob_bump_flags
- if si, the proc returns
*/
/mob/living/proc/can_move_mob(var/mob/living/swapped, swapping = 0, passive = 0)
if(!swapped)
return 1
if(!passive)
return swapped.can_move_mob(src, swapping, 1)
else
var/context_flags = 0
if(swapping)
context_flags = swapped.mob_swap_flags
else
context_flags = swapped.mob_push_flags
if(!mob_bump_flag) //nothing defined, go wild
return 1
if(mob_bump_flag & context_flags)
return 1
return 0
/mob/living/Bump(atom/movable/AM)
if(now_pushing || !loc || buckled == AM)
return
now_pushing = 1
if (istype(AM, /mob/living))
var/mob/living/tmob = AM
//Even if we don't push/swap places, we "touched" them, so spread fire
spread_fire(tmob)
for(var/mob/living/M in range(tmob, 1))
if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
if ( !(world.time % 5) )
to_chat(src, "<span class='warning'>[tmob] is restrained, you cannot push past</span>")
now_pushing = 0
return
if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
if ( !(world.time % 5) )
to_chat(src, "<span class='warning'>[tmob] is restraining [M], you cannot push past</span>")
now_pushing = 0
return
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
var/can_swap = 1
if(loc.density || tmob.loc.density)
can_swap = 0
if(can_swap)
for(var/atom/movable/A in loc)
if(A == src)
continue
if(!A.CanPass(tmob, loc))
can_swap = 0
if(!can_swap) break
if(can_swap)
for(var/atom/movable/A in tmob.loc)
if(A == tmob)
continue
if(!A.CanPass(src, tmob.loc))
can_swap = 0
if(!can_swap) break
//Leaping mobs just land on the tile, no pushing, no anything.
if(status_flags & LEAPING)
loc = tmob.loc
status_flags &= ~LEAPING
now_pushing = 0
return
if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && can_swap && can_move_mob(tmob, 1, 0)) // mutual brohugs all around!
var/turf/oldloc = loc
//VOREstation Edit - Begin
//check bumpnom chance, if it's a simplemob that's doing the bumping
var/mob/living/simple_mob/srcsimp = src
if(istype(srcsimp))
if(srcsimp.tryBumpNom(tmob))
now_pushing = 0
return
//if it's a simplemob being bumped, and the above didn't make them start getting bumpnommed, they get a chance to bumpnom
var/mob/living/simple_mob/tmobsimp = tmob
if(istype(tmobsimp))
if(tmobsimp.tryBumpNom(src))
now_pushing = 0
return
//VOREstation Edit - End
forceMove(tmob.loc)
//VOREstation Edit - Begin
// In case of micros, we don't swap positions; instead occupying the same square!
if (handle_micro_bump_helping(tmob))
now_pushing = 0
return
// TODO - Check if we need to do something about the slime.UpdateFeed() we are skipping below.
// VOREStation Edit - End
tmob.forceMove(oldloc)
now_pushing = 0
return
//VOREStation Edit - Begin
else if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && canmove && can_swap && handle_micro_bump_helping(tmob))
forceMove(tmob.loc)
now_pushing = 0
return
//VOREStation Edit - End
if(!can_move_mob(tmob, 0, 0))
now_pushing = 0
return
if(a_intent == I_HELP || src.restrained())
now_pushing = 0
return
// VOREStation Edit - Begin
// Plow that nerd.
if(ishuman(tmob))
var/mob/living/carbon/human/H = tmob
if(H.species.lightweight == 1 && prob(50))
H.visible_message("<span class='warning'>[src] bumps into [H], knocking them off balance!</span>")
H.Weaken(5)
now_pushing = 0
return
// Handle grabbing, stomping, and such of micros!
if(handle_micro_bump_other(tmob)) return
// VOREStation Edit - End
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(40) && !(FAT in src.mutations))
to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0
return
if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
if(prob(99))
now_pushing = 0
return
if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
if(prob(99))
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
return
tmob.LAssailant = src
now_pushing = 0
. = ..()
if (!istype(AM, /atom/movable) || AM.anchored)
//VOREStation Edit - object-specific proc for running into things
if(((confused || is_blind()) && stat == CONSCIOUS && prob(50) && m_intent=="run") || flying)
AM.stumble_into(src)
//VOREStation Edit End
/* VOREStation Removal - See above
if(confused && prob(50) && m_intent=="run")
Weaken(2)
playsound(src, "punch", 25, 1, -1)
visible_message("<span class='warning'>[src] [pick("ran", "slammed")] into \the [AM]!</span>")
src.apply_damage(5, BRUTE)
to_chat(src, "<span class='warning'>You just [pick("ran", "slammed")] into \the [AM]!</span>")
*/ // VOREStation Removal End
return
if (!now_pushing)
if(isobj(AM))
var/obj/I = AM
if(!can_pull_size || can_pull_size < I.w_class)
return
now_pushing = 1
var/t = get_dir(src, AM)
if (istype(AM, /obj/structure/window))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
step(AM, t)
if(ishuman(AM) && AM:grabbed_by)
for(var/obj/item/weapon/grab/G in AM:grabbed_by)
step(G:assailant, get_dir(G:assailant, AM))
G.adjust_position()
now_pushing = 0
/mob/living/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /obj/structure/blob) && faction == "blob") //Blobs should ignore things on their faction.
return TRUE
return ..()
// Called when something steps onto us. This allows for mulebots and vehicles to run things over. <3
/mob/living/Crossed(var/atom/movable/AM) // Transplanting this from /mob/living/carbon/human/Crossed()
if(AM == src || AM.is_incorporeal()) // We're not going to run over ourselves or ghosts
return
if(istype(AM, /mob/living/bot/mulebot))
var/mob/living/bot/mulebot/MB = AM
MB.runOver(src)
if(istype(AM, /obj/vehicle))
var/obj/vehicle/V = AM
V.RunOver(src)
// Almost all of this handles pulling movables behind us
/mob/living/Move(atom/newloc, direct, movetime)
if(buckled && buckled.loc != newloc) //not updating position
if(!buckled.anchored && buckled.buckle_movable)
return buckled.Move(newloc, direct)
else
return 0
var/atom/movable/pullee = pulling
// Prior to our move it's already too far away
if(pullee && get_dist(src, pullee) > 1)
stop_pulling()
// Shenanigans! Pullee closed into locker for eg.
if(pullee && !isturf(pullee.loc) && pullee.loc != loc)
stop_pulling()
// Can't pull with no hands
if(restrained())
stop_pulling()
// Will move our mob (probably)
. = ..() // Moved() called at this point if successful
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //seperated from our puller and not in the middle of a diagonal move
pulledby.stop_pulling()
if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much.
s_active.close(src)
/mob/living/proc/dragged(var/mob/living/dragger, var/oldloc)
var/area/A = get_area(src)
if(lying && !buckled && pull_damage() && A.has_gravity() && (prob(getBruteLoss() * 200 / maxHealth)))
adjustBruteLoss(2)
visible_message("<span class='danger'>\The [src]'s [isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!</span>")
/mob/living/Moved(var/atom/oldloc, direct, forced, movetime)
. = ..()
handle_footstep(loc)
// Begin VOREstation edit
if(is_shifted)
is_shifted = FALSE
pixel_x = default_pixel_x
pixel_y = default_pixel_y
// End VOREstation edit
if(pulling) // we were pulling a thing and didn't lose it during our move.
var/pull_dir = get_dir(src, pulling)
if(pulling.anchored || !isturf(pulling.loc))
stop_pulling()
else if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) // puller and pullee more than one tile away or in diagonal position
// If it is too far away or across z-levels from old location, stop pulling.
if(get_dist(pulling.loc, oldloc) > 1 || pulling.loc.z != oldloc?.z)
stop_pulling()
// living might take damage from drags
else if(isliving(pulling))
var/mob/living/M = pulling
M.dragged(src, oldloc)
pulling.Move(oldloc, 0, movetime) // the pullee tries to reach our previous position
if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up
stop_pulling()
if(!isturf(loc))
return
else if(lastarea?.has_gravity == 0)
inertial_drift()
//VOREStation Edit Start
else if(flying)
inertial_drift()
make_floating(1)
//VOREStation Edit End
else if(!isspace(loc))
inertia_dir = 0
make_floating(0)
/mob/living/proc/inertial_drift()
if(x > 1 && x < (world.maxx) && y > 1 && y < (world.maxy))
if(Process_Spacemove(1))
inertia_dir = 0
return
var/locthen = loc
spawn(5)
if(!anchored && !pulledby && loc == locthen)
var/stepdir = inertia_dir ? inertia_dir : last_move
if(!stepdir)
return
var/turf/T = get_step(src, stepdir)
if(!T)
return
Move(T, stepdir, 5)
/mob/living/proc/handle_footstep(turf/T)
return FALSE
+1 -1
View File
@@ -978,7 +978,7 @@ var/list/ai_verbs_default = list(
drop_new_multicam()
//Special subtype kept around for global announcements
/mob/living/silicon/ai/announcer/
/mob/living/silicon/ai/announcer
is_dummy = 1
/mob/living/silicon/ai/announcer/Initialize()
@@ -57,7 +57,7 @@
)
/mob/living/silicon/robot/drone/swarm/Initialize()
..()
. = ..()
add_language(LANGUAGE_SWARMBOT, 1)
@@ -158,5 +158,5 @@
)
/obj/item/weapon/gun/energy/xray/swarm/Initialize()
..()
. = ..()
adjust_scale(-1, 1)
@@ -131,7 +131,7 @@
var/dummy_card_type = /obj/item/weapon/card/id/science/roboticist/dummy_cyborg
/obj/item/weapon/card/robot/Initialize()
..()
. = ..()
dummy_card = new dummy_card_type(src)
/obj/item/weapon/card/robot/Destroy()
@@ -149,7 +149,7 @@
access = list(access_robotics)
/obj/item/weapon/card/id/syndicate/dummy_cyborg/Initialize()
..()
. = ..()
access |= access_robotics
//A harvest item for serviceborgs.
@@ -46,7 +46,7 @@
catalogue_data = list(/datum/category_item/catalogue/fauna/sif_crab)
/mob/living/simple_mob/animal/passive/crab/sif/Initialize()
..()
. = ..()
adjust_scale(rand(5,12) / 10)
// Meat!
@@ -34,7 +34,7 @@
var/randomize_location = TRUE
/mob/living/simple_mob/animal/passive/fish/Initialize()
..()
. = ..()
if(!default_pixel_x && randomize_location)
default_pixel_x = rand(-12, 12)
@@ -174,7 +174,7 @@
var/image/belly_image
/mob/living/simple_mob/animal/passive/fish/icebass/Initialize()
..()
. = ..()
dorsal_color = rgb(rand(min_red,max_red), rand(min_green,max_green), rand(min_blue,max_blue))
belly_color = rgb(rand(min_red,max_red), rand(min_green,max_green), rand(min_blue,max_blue))
update_icon()
@@ -248,7 +248,7 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
/mob/living/simple_mob/animal/passive/fish/rockfish/Initialize()
..()
. = ..()
head_color = rgb(rand(min_red,max_red), rand(min_green,max_green), rand(min_blue,max_blue))
update_icon()
@@ -34,7 +34,7 @@
attack_sharp = TRUE
/mob/living/simple_mob/animal/passive/lizard/large/Initialize()
..()
. = ..()
adjust_scale(rand(12, 20) / 10)
/mob/living/simple_mob/animal/passive/lizard/large/defensive
@@ -81,7 +81,7 @@
return 1 // It literally produces a cryogenic mist inside itself. Cold doesn't bother it.
/mob/living/simple_mob/animal/sif/frostfly/Initialize()
. = ..() //VOREStation Edit
. = ..()
smoke_special = new
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
@@ -62,7 +62,7 @@
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/glitterfly
/mob/living/simple_mob/animal/sif/glitterfly/Initialize()
..()
. = ..()
var/colorlist = list(rgb(rand(100,255), rand(100,255), rand(100,255)) = 10, rgb(rand(5,100), rand(5,100), rand(5,100)) = 2, "#222222" = 1)
color = pickweight(colorlist)
@@ -85,7 +85,7 @@
plane = PLANE_LIGHTING_ABOVE
/mob/living/simple_mob/animal/sif/glitterfly/rare/Initialize()
..()
. = ..()
/mob/living/simple_mob/animal/sif/glitterfly/unique_tame_check(var/obj/O, var/mob/user)
. = ..()
@@ -92,7 +92,7 @@
instinct = 50
/mob/living/simple_mob/animal/sif/kururak/Initialize()
..()
. = ..()
if(!instinct)
if(prob(20))
instinct = rand(6, 10)
@@ -331,7 +331,7 @@
remove_modifiers_of_type(/datum/modifier/ace)
/mob/living/simple_mob/animal/sif/kururak/hibernate/Initialize()
..()
. = ..()
lay_down()
instinct = 0
@@ -115,7 +115,7 @@
emote_hear = list("chitters", "clicks", "gurgles")
/mob/living/simple_mob/animal/sif/leech/Initialize()
..()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
@@ -116,7 +116,7 @@
return FALSE
/mob/living/simple_mob/animal/sif/tymisian/Initialize()
..()
. = ..()
smoke_spore = new
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
@@ -108,7 +108,7 @@
icon_state = "[icon_state]_dead"
/mob/living/simple_mob/animal/space/space_worm/head/Initialize()
..()
. = ..()
var/mob/living/simple_mob/animal/space/space_worm/current = src
+2 -2
View File
@@ -7,13 +7,13 @@
emote_type = 2 //This lets them emote through containers. The communicator has a image feed of the person calling them so...
/mob/living/voice/New(loc)
/mob/living/voice/Initialize(loc)
add_language(LANGUAGE_GALCOM)
set_default_language(GLOB.all_languages[LANGUAGE_GALCOM])
if(istype(loc, /obj/item/device/communicator))
comm = loc
..()
. = ..()
// Proc: transfer_identity()
// Parameters: 1 (speaker - the mob (usually an observer) to copy information from)