mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-27 22:18:27 +01:00
Merge remote-tracking branch 'VOREStation/master' into upstream-merge-7926
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user