Merge remote-tracking branch 'upstream/master' into universal-damage

# Conflicts:
#	code/modules/clothing/suits/labcoat.dm
#	code/modules/clothing/under/miscellaneous.dm
#	code/modules/mob/living/carbon/human/species/golem.dm
#	code/modules/mob/living/simple_animal/bot/ed209bot.dm
This commit is contained in:
Fox McCloud
2019-09-21 12:40:07 -04:00
280 changed files with 2015 additions and 77150 deletions
@@ -1,3 +1,3 @@
//can't unequip since it can't equip anything
/mob/living/carbon/alien/larva/unEquip(obj/item/W as obj)
/mob/living/carbon/alien/larva/unEquip(obj/item/W as obj, force)
return
+1 -1
View File
@@ -610,7 +610,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
return
/mob/living/carbon/unEquip(obj/item/I) //THIS PROC DID NOT CALL ..()
/mob/living/carbon/unEquip(obj/item/I, force) //THIS PROC DID NOT CALL ..()
. = ..() //Sets the default return value to what the parent returns.
if(!. || !I) //We don't want to set anything to null if the parent returned 0.
return
@@ -406,7 +406,7 @@
else
dat += "<tr><td><B>Uniform:</B></td><td><A href='?src=[UID()];item=[slot_w_uniform]'>[(w_uniform && !(w_uniform.flags&ABSTRACT)) ? w_uniform : "<font color=grey>Empty</font>"]</A></td></tr>"
if(w_uniform == null || (slot_w_uniform in obscured))
if((w_uniform == null && !(dna && dna.species.nojumpsuit)) || (slot_w_uniform in obscured))
dat += "<tr><td><font color=grey>&nbsp;&#8627;<B>Pockets:</B></font></td></tr>"
dat += "<tr><td><font color=grey>&nbsp;&#8627;<B>ID:</B></font></td></tr>"
dat += "<tr><td><font color=grey>&nbsp;&#8627;<B>Belt:</B></font></td></tr>"
@@ -1015,6 +1015,10 @@
else
target_zone = user.zone_sel.selecting
if(PIERCEIMMUNE in dna.species.species_traits)
. = 0
var/obj/item/organ/external/affecting = get_organ(target_zone)
var/fail_msg
if(!affecting)
@@ -464,7 +464,7 @@ emp_act
else if(I)
if(((throwingdatum ? throwingdatum.speed : I.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || I.embedded_ignore_throwspeed_threshold)
if(can_embed(I))
if(prob(I.embed_chance))
if(prob(I.embed_chance) && !(PIERCEIMMUNE in dna.species.species_traits))
throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
var/obj/item/organ/external/L = pick(bodyparts)
L.embedded_objects |= I
@@ -74,7 +74,7 @@
if(istype(O) && O.owner == src)
. = 0 // keep a good grip on your heart
/mob/living/carbon/human/unEquip(obj/item/I)
/mob/living/carbon/human/unEquip(obj/item/I, force)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
return
@@ -411,148 +411,8 @@
..(what, who, where, silent = is_silent)
/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0)
switch(dna.species.handle_can_equip(I, slot, disable_warning, src))
if(1) return TRUE
if(2) return FALSE //if it returns 2, it wants no normal handling
if(!has_organ_for_slot(slot))
return FALSE
if(istype(I, /obj/item/clothing/under) || istype(I, /obj/item/clothing/suit))
if(FAT in mutations)
//testing("[M] TOO FAT TO WEAR [src]!")
if(!(I.flags_size & ONESIZEFITSALL))
if(!disable_warning)
to_chat(src, "<span class='alert'>You're too fat to wear the [I].</span>")
return FALSE
switch(slot)
if(slot_l_hand)
return !l_hand && !incapacitated()
if(slot_r_hand)
return !r_hand && !incapacitated()
if(slot_wear_mask)
return !wear_mask && (I.slot_flags & SLOT_MASK)
if(slot_back)
return !back && (I.slot_flags & SLOT_BACK)
if(slot_wear_suit)
return !wear_suit && (I.slot_flags & SLOT_OCLOTHING)
if(slot_gloves)
return !gloves && (I.slot_flags & SLOT_GLOVES)
if(slot_shoes)
return !shoes && (I.slot_flags & SLOT_FEET)
if(slot_belt)
if(belt)
return 0
if(!w_uniform)
if(!disable_warning)
to_chat(src, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return 0
if(!(I.slot_flags & SLOT_BELT))
return
return 1
if(slot_glasses)
return !glasses && (I.slot_flags & SLOT_EYES)
if(slot_head)
return !head && (I.slot_flags & SLOT_HEAD)
if(slot_l_ear)
return !l_ear && (I.slot_flags & SLOT_EARS) && !((I.slot_flags & SLOT_TWOEARS) && r_ear)
if(slot_r_ear)
return !r_ear && (I.slot_flags & SLOT_EARS) && !((I.slot_flags & SLOT_TWOEARS) && l_ear)
if(slot_w_uniform)
return !w_uniform && (I.slot_flags & SLOT_ICLOTHING)
if(slot_wear_id)
if(wear_id)
return 0
if(!w_uniform)
if(!disable_warning)
to_chat(src, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return 0
if(!(I.slot_flags & SLOT_ID))
return 0
return 1
if(slot_wear_pda)
if(wear_pda)
return 0
if(!w_uniform)
if(!disable_warning)
to_chat(src, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return 0
if(!(I.slot_flags & SLOT_PDA))
return 0
return 1
if(slot_l_store)
if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them.
return 0
if(l_store)
return 0
if(!w_uniform)
if(!disable_warning)
to_chat(src, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return
if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET))
return 1
if(slot_r_store)
if(I.flags & NODROP)
return 0
if(r_store)
return 0
if(!w_uniform)
if(!disable_warning)
to_chat(src, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return 0
if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET))
return 1
return 0
if(slot_s_store)
if(I.flags & NODROP) //Suit storage NODROP items drop if you take a suit off, this is to prevent people exploiting this.
return 0
if(s_store)
return 0
if(!wear_suit)
if(!disable_warning)
to_chat(src, "<span class='alert'>You need a suit before you can attach this [name].</span>")
return 0
if(!wear_suit.allowed)
if(!disable_warning)
to_chat(src, "You somehow have a suit with no defined allowed items for suit storage, stop that.")
return 0
if(I.w_class > WEIGHT_CLASS_BULKY)
if(!disable_warning)
to_chat(src, "The [name] is too big to attach.")
return 0
if(istype(I, /obj/item/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, wear_suit.allowed))
return 1
return 0
if(slot_handcuffed)
return !handcuffed && istype(I, /obj/item/restraints/handcuffs)
if(slot_legcuffed)
return !legcuffed && istype(I, /obj/item/restraints/legcuffs)
if(slot_in_backpack)
if(back && istype(back, /obj/item/storage/backpack))
var/obj/item/storage/backpack/B = back
if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class)
return 1
return 0
if(slot_tie)
if(!w_uniform)
if(!disable_warning)
to_chat(src, "<span class='warning'>You need a jumpsuit before you can attach this [name].</span>")
return 0
var/obj/item/clothing/under/uniform = w_uniform
if(uniform.accessories.len && !uniform.can_attach_accessory(src))
if(!disable_warning)
to_chat(src, "<span class='warning'>You already have an accessory of this type attached to your [uniform].</span>")
return 0
if(!(I.slot_flags & SLOT_TIE))
return 0
return 1
return 0 //Unsupported slot
/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = FALSE)
return dna.species.can_equip(I, slot, disable_warning, src)
/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
var/datum/outfit/O = null
@@ -572,5 +432,3 @@
/mob/living/carbon/human/proc/delete_equipment()
for(var/slot in get_all_slots())//order matters, dependant slots go first
qdel(slot)
for(var/obj/item/I in l_hand, r_hand)
qdel(I)
+1 -1
View File
@@ -991,7 +991,7 @@
/mob/living/carbon/human/proc/handle_decay()
var/decaytime = world.time - timeofdeath
if(isSynthetic())
if(NO_DECAY in dna.species.species_traits)
return
if(reagents.has_reagent("formaldehyde")) //embalming fluid stops decay
@@ -4,6 +4,7 @@
icon_state = "punpun"
item_color = "punpun"
species_restricted = list("Monkey")
species_exception = list(/datum/species/monkey)
/mob/living/carbon/human/monkey/punpun/Initialize(mapload)
..()
@@ -53,7 +53,6 @@
var/stamina_mod = 1
var/stun_mod = 1 // If a species is more/less impacated by stuns/weakens/paralysis
var/speedmod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster
var/armor = 0 // overall defense for the race... or less defense, if it's negative.
var/blood_damage_type = OXY //What type of damage does this species take if it's low on blood?
var/obj/item/mutanthands
var/total_health = 100
@@ -74,6 +73,10 @@
var/clothing_flags = 0 // Underwear and socks.
var/exotic_blood
var/skinned_type
var/list/no_equip = list() // slots the race can't equip stuff to
var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids
var/can_craft = TRUE // Can this mob using crafting or not?
var/bodyflags = 0
var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods
@@ -271,7 +274,12 @@
return .
/datum/species/proc/on_species_gain(mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment.
return
for(var/slot_id in no_equip)
var/obj/item/thing = H.get_item_by_slot(slot_id)
if(thing && (!thing.species_exception || !is_type_in_list(src, thing.species_exception)))
H.unEquip(thing)
if(H.hud_used)
H.hud_used.update_locked_slots()
/datum/species/proc/on_species_loss(mob/living/carbon/human/H)
if(H.butcher_results) //clear it out so we don't butcher a actual human.
@@ -585,8 +593,158 @@
attack_verb = list("slash", "claw")
damage = 6
/datum/species/proc/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
return FALSE
/datum/species/proc/can_equip(obj/item/I, slot, disable_warning = FALSE, mob/living/carbon/human/H)
if(slot in no_equip)
if(!I.species_exception || !is_type_in_list(src, I.species_exception))
return FALSE
if(!H.has_organ_for_slot(slot))
return FALSE
if(istype(I, /obj/item/clothing/under) || istype(I, /obj/item/clothing/suit))
if(FAT in H.mutations)
if(!(I.flags_size & ONESIZEFITSALL))
if(!disable_warning)
to_chat(H, "<span class='alert'>You're too fat to wear the [I].</span>")
return FALSE
switch(slot)
if(slot_l_hand)
return !H.l_hand && !H.incapacitated()
if(slot_r_hand)
return !H.r_hand && !H.incapacitated()
if(slot_wear_mask)
return !H.wear_mask && (I.slot_flags & SLOT_MASK)
if(slot_back)
return !H.back && (I.slot_flags & SLOT_BACK)
if(slot_wear_suit)
return !H.wear_suit && (I.slot_flags & SLOT_OCLOTHING)
if(slot_gloves)
return !H.gloves && (I.slot_flags & SLOT_GLOVES)
if(slot_shoes)
return !H.shoes && (I.slot_flags & SLOT_FEET)
if(slot_belt)
if(H.belt)
return FALSE
var/obj/item/organ/external/O = H.get_organ(BODY_ZONE_CHEST)
if(!H.w_uniform && !nojumpsuit && (!O || !(O.status & ORGAN_ROBOT)))
if(!disable_warning)
to_chat(H, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return FALSE
if(!(I.slot_flags & SLOT_BELT))
return
return TRUE
if(slot_glasses)
return !H.glasses && (I.slot_flags & SLOT_EYES)
if(slot_head)
return !H.head && (I.slot_flags & SLOT_HEAD)
if(slot_l_ear)
return !H.l_ear && (I.slot_flags & SLOT_EARS) && !((I.slot_flags & SLOT_TWOEARS) && H.r_ear)
if(slot_r_ear)
return !H.r_ear && (I.slot_flags & SLOT_EARS) && !((I.slot_flags & SLOT_TWOEARS) && H.l_ear)
if(slot_w_uniform)
return !H.w_uniform && (I.slot_flags & SLOT_ICLOTHING)
if(slot_wear_id)
if(H.wear_id)
return FALSE
var/obj/item/organ/external/O = H.get_organ(BODY_ZONE_CHEST)
if(!H.w_uniform && !nojumpsuit && (!O || !(O.status & ORGAN_ROBOT)))
if(!disable_warning)
to_chat(H, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return FALSE
if(!(I.slot_flags & SLOT_ID))
return FALSE
return TRUE
if(slot_wear_pda)
if(H.wear_pda)
return FALSE
var/obj/item/organ/external/O = H.get_organ(BODY_ZONE_CHEST)
if(!H.w_uniform && !nojumpsuit && (!O || !(O.status & ORGAN_ROBOT)))
if(!disable_warning)
to_chat(H, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return FALSE
if(!(I.slot_flags & SLOT_PDA))
return FALSE
return TRUE
if(slot_l_store)
if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them.
return FALSE
if(H.l_store)
return FALSE
var/obj/item/organ/external/O = H.get_organ(BODY_ZONE_L_LEG)
if(!H.w_uniform && !nojumpsuit && (!O || !(O.status & ORGAN_ROBOT)))
if(!disable_warning)
to_chat(H, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return FALSE
if(I.slot_flags & SLOT_DENYPOCKET)
return
if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET))
return TRUE
if(slot_r_store)
if(I.flags & NODROP)
return FALSE
if(H.r_store)
return FALSE
var/obj/item/organ/external/O = H.get_organ(BODY_ZONE_R_LEG)
if(!H.w_uniform && !nojumpsuit && (!O || !(O.status & ORGAN_ROBOT)))
if(!disable_warning)
to_chat(H, "<span class='alert'>You need a jumpsuit before you can attach this [name].</span>")
return FALSE
if(I.slot_flags & SLOT_DENYPOCKET)
return FALSE
if(I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET))
return TRUE
return FALSE
if(slot_s_store)
if(I.flags & NODROP) //Suit storage NODROP items drop if you take a suit off, this is to prevent people exploiting this.
return FALSE
if(H.s_store)
return FALSE
if(!H.wear_suit)
if(!disable_warning)
to_chat(H, "<span class='alert'>You need a suit before you can attach this [name].</span>")
return FALSE
if(!H.wear_suit.allowed)
if(!disable_warning)
to_chat(H, "You somehow have a suit with no defined allowed items for suit storage, stop that.")
return FALSE
if(I.w_class > WEIGHT_CLASS_BULKY)
if(!disable_warning)
to_chat(H, "The [name] is too big to attach.")
return FALSE
if(istype(I, /obj/item/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, H.wear_suit.allowed))
return TRUE
return FALSE
if(slot_handcuffed)
return !H.handcuffed && istype(I, /obj/item/restraints/handcuffs)
if(slot_legcuffed)
return !H.legcuffed && istype(I, /obj/item/restraints/legcuffs)
if(slot_in_backpack)
if(H.back && istype(H.back, /obj/item/storage/backpack))
var/obj/item/storage/backpack/B = H.back
if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class)
return TRUE
return FALSE
if(slot_tie)
if(!H.w_uniform)
if(!disable_warning)
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [name].</span>")
return FALSE
var/obj/item/clothing/under/uniform = H.w_uniform
if(uniform.accessories.len && !uniform.can_attach_accessory(H))
if(!disable_warning)
to_chat(H, "<span class='warning'>You already have an accessory of this type attached to your [uniform].</span>")
return FALSE
if(!(I.slot_flags & SLOT_TIE))
return FALSE
return TRUE
return FALSE //Unsupported slot
/datum/species/proc/get_perceived_trauma(mob/living/carbon/human/H)
return H.health - H.getStaminaLoss()
@@ -21,7 +21,7 @@
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
water and other radiation."
species_traits = list(IS_PLANT)
species_traits = list(IS_PLANT, NO_GERMS, NO_DECAY)
clothing_flags = HAS_SOCKS
default_hair_colour = "#000000"
has_gender = FALSE
@@ -5,37 +5,41 @@
icobase = 'icons/mob/human_races/r_golem.dmi'
deform = 'icons/mob/human_races/r_golem.dmi'
species_traits = list(NO_BREATHE, NO_BLOOD, NO_PAIN, RADIMMUNE, VIRUSIMMUNE, NOGUNS)
species_traits = list(NO_BREATHE, NO_BLOOD, NO_PAIN, RADIMMUNE, NOGUNS, PIERCEIMMUNE)
dies_at_threshold = TRUE
slowdown = 2
brute_mod = 0.45 //55% damage reduction
burn_mod = 0.45
tox_mod = 0.45
clone_mod = 0.45
brain_mod = 0.45
stamina_mod = 0.45
siemens_coeff = 0
punchdamagelow = 5
punchdamagehigh = 14
punchstunthreshold = 11 //about 40% chance to stun
no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store)
nojumpsuit = TRUE
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
reagent_tag = PROCESS_ORG
punchdamagelow = 5
punchdamagehigh = 14
punchstunthreshold = 11 //about 40% chance to stun
warning_low_pressure = -INFINITY
hazard_low_pressure = -INFINITY
hazard_high_pressure = INFINITY
warning_high_pressure = INFINITY
warning_low_pressure = -1
hazard_low_pressure = -1
hazard_high_pressure = 999999999
warning_high_pressure = 999999999
cold_level_1 = -INFINITY
cold_level_2 = -INFINITY
cold_level_3 = -INFINITY
cold_level_1 = -1
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = 999999999
heat_level_2 = 999999999
heat_level_3 = 999999999
heat_level_1 = INFINITY
heat_level_2 = INFINITY
heat_level_3 = INFINITY
blood_color = "#515573"
flesh_color = "#137E8F"
skinned_type = /obj/item/stack/sheet/metal
slowdown = 3
siemens_coeff = 0
blacklisted = TRUE // To prevent golem subtypes from overwhelming the odds when random species changes, only the Random Golem type can be chosen
dangerous_existence = TRUE
@@ -45,6 +49,19 @@
"adamantine_resonator" = /obj/item/organ/internal/adamantine_resonator
) //Has standard darksight of 2.
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/unbreakable/sturdy),
"groin" = list("path" = /obj/item/organ/external/groin/unbreakable/sturdy),
"head" = list("path" = /obj/item/organ/external/head/unbreakable/sturdy),
"l_arm" = list("path" = /obj/item/organ/external/arm/unbreakable/sturdy),
"r_arm" = list("path" = /obj/item/organ/external/arm/right/unbreakable/sturdy),
"l_leg" = list("path" = /obj/item/organ/external/leg/unbreakable/sturdy),
"r_leg" = list("path" = /obj/item/organ/external/leg/right/unbreakable/sturdy),
"l_hand" = list("path" = /obj/item/organ/external/hand/unbreakable/sturdy),
"r_hand" = list("path" = /obj/item/organ/external/hand/right/unbreakable/sturdy),
"l_foot" = list("path" = /obj/item/organ/external/foot/unbreakable/sturdy),
"r_foot" = list("path" = /obj/item/organ/external/foot/right/unbreakable/sturdy))
suicide_messages = list(
"is crumbling into dust!",
"is smashing their body apart!")
@@ -79,27 +96,8 @@
H.mind.special_role = SPECIAL_ROLE_FREE_GOLEM
H.real_name = get_random_name()
H.name = H.real_name
H.equip_to_slot_or_del(new /obj/item/clothing/under/golem(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/golem(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/golem(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/golem(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/golem(H), slot_gloves)
H.regenerate_icons()
to_chat(H, info_text)
/datum/species/golem/on_species_loss(mob/living/carbon/human/H)
..()
if(istype(H.w_uniform, /obj/item/clothing/under/golem)) // Doing these if checks here just in case the golem is somehow wearing something other than their golem shell, which should be impossible but you never know.
qdel(H.w_uniform)
if(istype(H.wear_suit, /obj/item/clothing/suit/golem))
qdel(H.wear_suit)
if(istype(H.shoes, /obj/item/clothing/shoes/golem))
qdel(H.shoes)
if(istype(H.wear_mask, /obj/item/clothing/mask/gas/golem))
qdel(H.wear_mask)
if(istype(H.gloves, /obj/item/clothing/gloves/golem))
qdel(H.gloves)
//Random Golem
/datum/species/golem/random
@@ -204,6 +202,9 @@
brute_mod = 0.3 //70% damage reduction up from 55%
burn_mod = 0.3
tox_mod = 0.3
clone_mod = 0.3
brain_mod = 0.3
stamina_mod = 0.3
skinned_type = /obj/item/stack/ore/diamond
info_text = "As a <span class='danger'>Diamond Golem</span>, you are more resistant than the average golem."
prefix = "Diamond"
@@ -213,10 +214,13 @@
/datum/species/golem/gold
name = "Gold Golem"
golem_colour = rgb(204, 204, 0)
slowdown = 2
slowdown = 1
brute_mod = 0.75 //25% damage reduction down from 55%
burn_mod = 0.75
tox_mod = 0.75
clone_mod = 0.75
brain_mod = 0.75
stamina_mod = 0.75
skinned_type = /obj/item/stack/ore/gold
info_text = "As a <span class='danger'>Gold Golem</span>, you are faster but less resistant than the average golem."
prefix = "Golden"
@@ -240,7 +244,7 @@
punchdamagelow = 12
punchdamagehigh = 21
punchstunthreshold = 18 //still 40% stun chance
slowdown = 5 //diona speed
slowdown = 4 //pretty fucking slow
skinned_type = /obj/item/stack/ore/iron
info_text = "As a <span class='danger'>Plasteel Golem</span>, you are slower, but harder to stun, and hit very hard when punching."
prefix = "Plasteel"
@@ -257,7 +261,7 @@
golem_colour = rgb(255, 255, 255)
skinned_type = /obj/item/stack/ore/titanium
info_text = "As a <span class='danger'>Titanium Golem</span>, you are resistant to burn damage and immune to ash storms."
burn_mod = 0.3
burn_mod = 0.405
prefix = "Titanium"
special_names = list("Dioxide")
@@ -275,7 +279,7 @@
golem_colour = rgb(136, 136, 136)
skinned_type = /obj/item/stack/ore/titanium
info_text = "As a <span class='danger'>Plastitanium Golem</span>, you are very resistant to burn damage and immune to both ash storms and lava."
burn_mod = 0.15
burn_mod = 0.36
prefix = "Plastitanium"
special_names = null
@@ -296,7 +300,7 @@
skinned_type = /obj/item/stack/sheet/mineral/abductor
language = "Golem Mindlink"
default_language = "Golem Mindlink"
slowdown = 2 //faster
slowdown = 1 //faster
info_text = "As an <span class='danger'>Alloy Golem</span>, you are made of advanced alien materials: you are faster and regenerate over time. You are, however, only able to speak telepathically to other alloy golems."
prefix = "Alien"
special_names = list("Outsider", "Technology", "Watcher", "Stranger") //ominous and unknown
@@ -323,10 +327,14 @@
name = "Wood Golem"
golem_colour = rgb(158, 112, 75)
skinned_type = /obj/item/stack/sheet/wood
species_traits = list(NO_BREATHE, NO_BLOOD, NO_PAIN, RADIMMUNE, VIRUSIMMUNE, NOGUNS, IS_PLANT)
species_traits = list(NO_BREATHE, NO_BLOOD, NO_PAIN, RADIMMUNE, NOGUNS, PIERCEIMMUNE, IS_PLANT)
//Can burn and take damage from heat
brute_mod = 0.7 //30% damage reduction down from 55%
burn_mod = 1
burn_mod = 0.875
tox_mod = 0.7
clone_mod = 0.7
brain_mod = 0.7
stamina_mod = 0.7
heatmod = 1.5
heat_level_1 = 300
@@ -343,25 +351,35 @@
special_name_chance = 100
/datum/species/golem/wood/handle_life(mob/living/carbon/human/H)
if(H.stat == DEAD)
return
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights
H.nutrition = min(H.nutrition+light_amount, NUTRITION_LEVEL_WELL_FED+10)
light_amount = min(1, T.get_lumcount()) - 0.5
if(light_amount > 0)
H.clear_alert("nolight")
else
H.throw_alert("nolight", /obj/screen/alert/nolight)
H.nutrition += light_amount * 10
if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL)
H.nutrition = NUTRITION_LEVEL_ALMOST_FULL
if(light_amount > 0.2 && !H.suiciding) //if there's enough light, heal
H.adjustBruteLoss(-1)
H.adjustFireLoss(-1)
H.adjustToxLoss(-1)
H.adjustOxyLoss(-1)
if(light_amount > 0)
H.clear_alert("nolight")
else
H.throw_alert("nolight", /obj/screen/alert/nolight)
if((light_amount >= 5) && !H.suiciding) //if there's enough light, heal
H.adjustBruteLoss(-(light_amount/2))
H.adjustFireLoss(-(light_amount/4))
if(H.nutrition < NUTRITION_LEVEL_STARVING+50)
H.take_overall_damage(10,0)
if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
H.adjustBruteLoss(2)
..()
/datum/species/golem/wood/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
if(R.id == "glyphosate" || R.id == "atrazine")
H.adjustToxLoss(3) //Deal aditional damage
return TRUE
return ..()
//Radioactive
/datum/species/golem/uranium
name = "Uranium Golem"
@@ -392,7 +410,7 @@
/datum/species/golem/plastic/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
C.ventcrawler = 1
C.ventcrawler = VENTCRAWLER_NUDE
/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C)
. = ..()
@@ -404,7 +422,11 @@
golem_colour = rgb(255, 220, 143)
skinned_type = /obj/item/stack/ore/glass //this is sand
brute_mod = 0.25
burn_mod = 3
burn_mod = 3 //melts easily
tox_mod = 1
clone_mod = 1
brain_mod = 1
stamina_mod = 1
info_text = "As a <span class='danger'>Sand Golem</span>, you are immune to physical bullets and take very little brute damage, but are extremely vulnerable to burn damage and energy weapons. You will also turn to sand when dying, preventing any form of recovery."
unarmed_type = /datum/unarmed_attack/golem/sand
prefix = "Sand"
@@ -437,6 +459,10 @@
skinned_type = /obj/item/shard
brute_mod = 3 //very fragile
burn_mod = 0.25
tox_mod = 1
clone_mod = 1
brain_mod = 1
stamina_mod = 1
info_text = "As a <span class='danger'>Glass Golem</span>, you reflect lasers and energy weapons, and are very resistant to burn damage. However, you are extremely vulnerable to brute damage. On death, you'll shatter beyond any hope of recovery."
unarmed_type = /datum/unarmed_attack/golem/glass
prefix = "Glass"
@@ -607,8 +633,8 @@
name = "Bananium Golem"
golem_colour = rgb(255, 255, 0)
punchdamagelow = 0
punchdamagehigh = 0
punchstunthreshold = 1 //Harmless and can't stun
punchdamagehigh = 1
punchstunthreshold = 2 //Harmless and can't stun
skinned_type = /obj/item/stack/ore/bananium
info_text = "As a <span class='danger'>Bananium Golem</span>, you are made for pranking. Your body emits natural honks, and punching people will just harmlessly honk them. Your skin also bleeds banana peels when damaged."
prefix = "Bananium"
@@ -714,59 +740,4 @@
H.mind.miming = TRUE
/datum/unarmed_attack/golem/tranquillite
attack_sound = null
miss_sound = null
//Golem abstract items
/obj/item/clothing/under/golem
name = "golem skin"
desc = "a golem's skin"
icon_state = "golem"
item_state = "golem"
item_color = "golem"
has_sensor = 0
flags = ABSTRACT | NODROP
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/clothing/suit/golem
name = "golem shell"
desc = "a golem's thick outter shell"
icon_state = "golem"
item_state = "golem"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
body_parts_covered = HEAD | UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
flags_inv = HIDEGLOVES | HIDESHOES
flags = STOPSPRESSUREDMAGE | ABSTRACT | NODROP | THICKMATERIAL
flags_size = ONESIZEFITSALL
cold_protection = HEAD | UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0, fire = 100, acid = 100)
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/clothing/shoes/golem
name = "golem's feet"
desc = "sturdy golem feet"
icon_state = "golem"
item_state = "golem"
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags = ABSTRACT | NODROP
/obj/item/clothing/mask/gas/golem
name = "golem's face"
desc = "the imposing face of a golem"
icon_state = "golem"
item_state = "golem"
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags = ABSTRACT | NODROP
flags_inv = HIDEEARS | HIDEEYES
/obj/item/clothing/gloves/golem
name = "golem's hands"
desc = "strong golem hands"
icon_state = "golem"
item_state = null
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags = ABSTRACT | NODROP
attack_sound = null
@@ -21,7 +21,7 @@
clone_mod = 0
death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..."
species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING)
species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NO_GERMS, NO_DECAY, NOTRANSSTING) //Computers that don't decay? What a lie!
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS
dietflags = 0 //IPCs can't eat, so no diet
@@ -13,6 +13,8 @@
species_traits = list(NO_EXAMINE)
skinned_type = /obj/item/stack/sheet/animalhide/monkey
greater_form = /datum/species/human
no_equip = list(slot_belt, slot_wear_id, slot_l_ear, slot_r_ear, slot_glasses, slot_gloves, slot_shoes, slot_wear_suit, slot_w_uniform, slot_l_store, slot_r_store, slot_s_store, slot_wear_pda)
can_craft = FALSE
is_small = 1
has_fine_manipulation = 0
ventcrawler = 1
@@ -58,44 +60,6 @@
H.dna.SetSEState(MONKEYBLOCK, TRUE)
genemutcheck(H, MONKEYBLOCK, null, MUTCHK_FORCED)
/datum/species/monkey/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
if(!user.has_organ_for_slot(slot))
return 2
switch(slot)
if(slot_l_hand)
if(user.l_hand)
return 2
return 1
if(slot_r_hand)
if(user.r_hand)
return 2
return 1
if(slot_wear_mask)
if(user.wear_mask)
return 2
if(!(I.slot_flags & SLOT_MASK))
return 2
return 1
if(slot_back)
if(user.back)
return 2
if(!(I.slot_flags & SLOT_BACK))
return 2
return 1
if(slot_handcuffed)
if(user.handcuffed)
return 2
if(!istype(I, /obj/item/restraints/handcuffs))
return 2
return 1
if(slot_in_backpack)
if(user.back && istype(user.back, /obj/item/storage/backpack))
var/obj/item/storage/backpack/B = user.back
if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class)
return 1
return 2
return 2
/datum/species/monkey/tajaran
name = "Farwa"
name_plural = "Farwa"
@@ -10,25 +10,25 @@
blood_color = "#FFFFFF"
flesh_color = "#E6E6C6"
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE)
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE, PIERCEIMMUNE)
dies_at_threshold = TRUE
skinned_type = /obj/item/stack/sheet/bone
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
warning_low_pressure = -1
hazard_low_pressure = -1
hazard_high_pressure = 999999999
warning_high_pressure = 999999999
warning_low_pressure = -INFINITY
hazard_low_pressure = -INFINITY
hazard_high_pressure = INFINITY
warning_high_pressure = INFINITY
cold_level_1 = -1
cold_level_2 = -1
cold_level_3 = -1
cold_level_1 = -INFINITY
cold_level_2 = -INFINITY
cold_level_3 = -INFINITY
heat_level_1 = 999999999
heat_level_2 = 999999999
heat_level_3 = 999999999
heat_level_1 = INFINITY
heat_level_2 = INFINITY
heat_level_3 = INFINITY
suicide_messages = list(
"is snapping their own bones!",
@@ -19,22 +19,17 @@
brute_mod = 1.2 //20% more brute damage. Fragile bird bones.
warning_low_pressure = 50
hazard_low_pressure = 0
cold_level_1 = 80
cold_level_2 = 50
cold_level_3 = 0
breathid = "n2"
eyes = "vox_eyes_s"
species_traits = list(NO_SCAN, IS_WHITELISTED, NOTRANSSTING)
species_traits = list(NO_SCAN, NO_GERMS, NO_DECAY, IS_WHITELISTED, NOTRANSSTING)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS //Species-fitted 'em all.
dietflags = DIET_OMNI
bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS
silent_steps = TRUE
blood_color = "#2299FC"
flesh_color = "#808D11"
//Default styles for created mobs.
@@ -43,7 +38,7 @@
default_hair_colour = "#614f19" //R: 97, G: 79, B: 25
butt_sprite = "vox"
reagent_tag = PROCESS_ORG
reagent_tag = PROCESS_ORG | PROCESS_SYN
scream_verb = "shrieks"
male_scream_sound = 'sound/voice/shriek1.ogg'
female_scream_sound = 'sound/voice/shriek1.ogg'
@@ -66,10 +61,9 @@
"lungs" = /obj/item/organ/internal/lungs/vox,
"liver" = /obj/item/organ/internal/liver/vox,
"kidneys" = /obj/item/organ/internal/kidneys/vox,
"brain" = /obj/item/organ/internal/brain/vox,
"cortical stack" = /obj/item/organ/internal/brain/vox,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/vox, //Default darksight of 2.
"stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
suicide_messages = list(
@@ -172,7 +166,7 @@
eyes = "blank_eyes"
species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED)
species_traits = list(NO_SCAN, NO_GERMS, NO_DECAY, NO_BLOOD, NO_PAIN, IS_WHITELISTED)
clothing_flags = 0 //IDK if you've ever seen underwear on an Armalis, but it ain't pretty.
bodyflags = HAS_TAIL
dies_at_threshold = TRUE
@@ -190,9 +184,8 @@
"lungs" = /obj/item/organ/internal/lungs/vox,
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"cortical stack" = /obj/item/organ/internal/brain/vox,
"eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
"stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
suicide_messages = list(
@@ -37,7 +37,11 @@
mutanthands = /obj/item/zombie_hand
icobase = 'icons/mob/human_races/r_zombie.dmi'
deform = 'icons/mob/human_races/r_def_zombie.dmi'
armor = 20 // 120 damage to KO a zombie, which kills it
brute_mod = 0.8 // 120 damage to KO a zombie, which kills it
burn_mod = 0.8
clone_mod = 0.8
brain_mod = 0.8
stamina_mod = 0.8
speedmod = 1.6
default_language = "Zombie"
var/heal_rate = 1
@@ -234,7 +234,7 @@
Feedon(Food)
..()
/mob/living/carbon/slime/unEquip(obj/item/W as obj)
/mob/living/carbon/slime/unEquip(obj/item/W as obj, force)
return
/mob/living/carbon/slime/attack_ui(slot)
@@ -348,6 +348,6 @@
return
density = 0 //this is reset every canmove update otherwise
/mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
/mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
if(affect_silicon)
return ..()
@@ -242,7 +242,7 @@
return
/mob/living/silicon/robot/unEquip(obj/item/I)
/mob/living/silicon/robot/unEquip(obj/item/I, force)
if(I == module_active)
uneq_active(I)
return ..()
+1 -1
View File
@@ -114,7 +114,7 @@
return 2
/mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0)
/mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0, var/negate_armor = 0)
return 0//The only effect that can hit them atm is flashes and they still directly edit so this works for now
/*
if(!effect || (blocked >= 2)) return 0
@@ -551,7 +551,7 @@
retaliate(H)
..()
/mob/living/simple_animal/bot/ed209/RangedAttack(atom/A)
/mob/living/simple_animal/bot/ed209/RangedAttack(atom/A, params)
if(!on)
return
shootAt(A)
@@ -19,7 +19,7 @@
ventcrawler = 2
mob_size = MOB_SIZE_TINY
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 0)
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/butterfly/New()
..()
@@ -22,7 +22,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
collar_type = "cat"
var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target
@@ -37,7 +37,7 @@
icon_dead = "cat_dead"
icon_resting = "cat_rest"
gender = FEMALE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
var/list/family = list()
var/memory_saved = 0
@@ -190,6 +190,8 @@
/mob/living/simple_animal/pet/cat/Proc
name = "Proc"
gender = MALE
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
/mob/living/simple_animal/pet/cat/kitten
@@ -215,7 +217,7 @@
gender = FEMALE
mutations = list(BREATHLESS)
faction = list("syndicate")
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
eats_mice = 0
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -14,9 +14,9 @@
response_help = "pokes"
response_disarm = "shoos"
response_harm = "splats"
density = 0
ventcrawler = 2
gold_core_spawnable = 2
density = FALSE
ventcrawler = VENTCRAWLER_ALWAYS
gold_core_spawnable = FRIENDLY_SPAWN
var/squish_chance = 50
loot = list(/obj/effect/decal/cleanable/insectguts)
del_on_death = 1
@@ -19,7 +19,7 @@
ventcrawler = 2
can_hide = 1
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/crab/handle_automated_movement()
//CRAB movement
@@ -39,239 +39,17 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
//LOOK AT THIS - ..()??
/*/mob/living/simple_animal/crab/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/wirecutters))
if(prob(50))
to_chat(user, "<span class='boldwarning'>This kills the crab.</span>")
health -= 20
death()
else
GetMad()
get
if(istype(O, /obj/item/stack/medical))
if(stat != DEAD)
var/obj/item/stack/medical/MED = O
if(health < maxHealth)
if(MED.amount >= 1)
health = min(maxHealth, health + MED.heal_brute)
MED.amount -= 1
if(MED.amount <= 0)
qdel(MED)
user.visible_message("<span class='notice'>[user] applies the [MED] on [src]</span>")
else
to_chat(user, "<span class='notice'>this [src] is dead, medical items won't bring it back to life.</span>")
else
if(O.force)
health -= O.force
visible_message("<span class='boldwarning'>[src] has been attacked with the [O] by [user]. </span>")
else
user.visible_message("<span class='warning'>[user] gently taps [src] with the [O]. </span>","<span class='warning'>This weapon is ineffective, it does no damage.</span>")
/mob/living/simple_animal/crab/Topic(href, href_list)
if(usr.stat) return
//Removing from inventory
if(href_list["remove_inv"])
if(get_dist(src,usr) > 1 || !(ishuman(usr) || isrobot(usr) || isalienadult(usr)))
return
var/remove_from = href_list["remove_inv"]
switch(remove_from)
if("head")
if(inventory_head)
name = real_name
desc = initial(desc)
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
desc = "Free crabs!"
src.sd_set_light(0)
inventory_head.loc = src.loc
inventory_head = null
else
to_chat(usr, "<span class='warning'>There is nothing to remove from its [remove_from].</span>")
return
if("mask")
if(inventory_mask)
inventory_mask.loc = src.loc
inventory_mask = null
else
to_chat(usr, "<span class='warning'>There is nothing to remove from its [remove_from].</span>")
return
//show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying.
//Adding things to inventory
else if(href_list["add_inv"])
if(get_dist(src,usr) > 1 || !(ishuman(usr) || isrobot(usr) || isalienadult(usr)))
return
var/add_to = href_list["add_inv"]
if(!usr.get_active_hand())
to_chat(usr, "<span class='warning'>You have nothing in your hand to put on its [add_to].</span>")
return
switch(add_to)
if("head")
if(inventory_head)
to_chat(usr, "<span class='warning'>It's is already wearing something.</span>")
return
else
var/obj/item/item_to_add = usr.get_active_hand()
if(!item_to_add)
return
//Corgis are supposed to be simpler, so only a select few objects can actually be put
//to be compatible with them. The objects are below.
//Many hats added, Some will probably be removed, just want to see which ones are popular.
var/list/allowed_types = list(
/obj/item/clothing/head/helmet,
/obj/item/clothing/glasses/sunglasses,
/obj/item/clothing/head/caphat,
/obj/item/clothing/head/collectable/captain,
/obj/item/clothing/head/that,
/obj/item/clothing/head/that,
/obj/item/clothing/head/kitty,
/obj/item/clothing/head/collectable/kitty,
/obj/item/clothing/head/rabbitears,
/obj/item/clothing/head/collectable/rabbitears,
/obj/item/clothing/head/beret,
/obj/item/clothing/head/collectable/beret,
/obj/item/clothing/head/det_hat,
/obj/item/clothing/head/nursehat,
/obj/item/clothing/head/pirate,
/obj/item/clothing/head/collectable/pirate,
/obj/item/clothing/head/chefhat,
/obj/item/clothing/head/collectable/chef,
/obj/item/clothing/head/collectable/police,
/obj/item/clothing/head/wizard/fake,
/obj/item/clothing/head/wizard,
/obj/item/clothing/head/collectable/wizard,
/obj/item/clothing/head/hardhat,
/obj/item/clothing/head/collectable/hardhat,
/obj/item/clothing/head/hardhat/white,
/obj/item/bedsheet,
/obj/item/clothing/head/soft
)
if( ! ( item_to_add.type in allowed_types ) )
to_chat(usr, "<span class='warning'>It doesn't seem too keen on wearing that item.</span>")
return
usr.drop_item()
item_to_add.loc = src
src.inventory_head = item_to_add
regenerate_icons()
//Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a HAT is removed.
switch(inventory_head && inventory_head.type)
if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain)
name = "Captain [real_name]"
desc = "Probably better than the last captain."
if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty)
name = "Runtime"
emote_see = list("coughs up a furball", "stretches")
emote_hear = list("purrs")
speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW")
desc = "It's a cute little kitty-cat! ... wait ... what the hell?"
if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
name = "Hoppy"
emote_see = list("twitches its nose", "hops around a bit")
desc = "This is hoppy. It's a corgi-...urmm... bunny rabbit"
if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
name = "Yann"
desc = "Mon dieu! C'est un chien!"
speak = list("le woof!", "le bark!", "JAPPE!!")
emote_see = list("cowers in fear", "surrenders", "plays dead","looks as though there is a wall in front of /him")
if(/obj/item/clothing/head/det_hat)
name = "Detective [real_name]"
desc = "[name] sees through your lies..."
emote_see = list("investigates the area","sniffs around for clues","searches for scooby snacks")
if(/obj/item/clothing/head/nursehat)
name = "Nurse [real_name]"
desc = "[name] needs 100cc of beef jerky...STAT!"
if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate)
name = "'[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]'"
desc = "Yaarghh!! Thar' be a scurvy dog!"
emote_see = list("hunts for treasure","stares coldly...","gnashes his tiny corgi teeth")
emote_hear = list("growls ferociously", "snarls")
speak = list("Arrrrgh!!","Grrrrrr!")
if(/obj/item/clothing/head/collectable/police)
name = "Officer [real_name]"
emote_see = list("drools","looks for donuts")
desc = "Stop right there criminal scum!"
if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
name = "Grandwizard [real_name]"
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!")
if(/obj/item/bedsheet)
name = "\improper Ghost"
speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU")
emote_see = list("stumbles around", "shivers")
emote_hear = list("howls","groans")
desc = "Spooky!"
if(/obj/item/clothing/head/soft)
name = "Corgi Tech [real_name]"
speak = list("Needs a stamp!", "Request DENIED!", "Fill these out in triplicate!")
desc = "The reason your yellow gloves have chew-marks."
if("mask")
if(inventory_mask)
to_chat(usr, "<span class='warning'>It's already wearing something.</span>")
return
else
var/obj/item/item_to_add = usr.get_active_hand()
if(!item_to_add)
return
//Corgis are supposed to be simpler, so only a select few objects can actually be put
//to be compatible with them. The objects are below.
var/list/allowed_types = list(
/obj/item/clothing/suit/armor/vest,
/obj/item/radio
)
if( ! ( item_to_add.type in allowed_types ) )
to_chat(usr, "<span class='warning'>This object won't fit.</span>")
return
usr.drop_item()
item_to_add.loc = src
src.inventory_mask = item_to_add
regenerate_icons()
//show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying.
else
..()
*/
/mob/living/simple_animal/crab/proc/GetMad()
name = "MEGAMADCRAB"
real_name = "MEGAMADCRAB"
desc = "OH NO YOU DUN IT NOW."
icon = 'icons/mob/animal.dmi'
/mob/living/simple_animal/crab/evil
name = "Evil Crab"
real_name = "Evil Crab"
desc = "Unnerving, isn't it? It has to be planning something nefarious..."
icon_state = "evilcrab"
icon_living = "evilcrab"
icon_dead = "evilcrab_dead"
speak_emote = list("clicks")
emote_hear = list("clicks with fury", "clicks angrily")
emote_see = list("clacks")
speak_chance = 1
universal_speak = 1 //So that the entire station may know its fury.
turns_per_move = 15//Gotta go fast
speed = -1//Gotta go fast when controlled by a player.
maxHealth = 100//So they don't die as quickly
health = 100
melee_damage_lower = 3
melee_damage_upper = 10//Kill them. Kill them all
/*if(inventory_head)//Drops inventory so it doesn't have to be dealt with
inventory_head.loc = src.loc
inventory_head = null
if(inventory_mask)
inventory_mask.loc = src.loc
inventory_mask = null*/ //Currently does not have the ability to equip anything.
response_help = "pokes"
response_disarm = "shoves"
response_harm = "stomps"
gold_core_spawnable = HOSTILE_SPAWN
@@ -15,4 +15,4 @@
response_disarm = "gently pushes aside"
response_harm = "kicks"
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
@@ -16,7 +16,7 @@
see_in_dark = 5
speak_chance = 1
turns_per_move = 10
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
var/bark_sound = list('sound/creatures/dog_bark1.ogg','sound/creatures/dog_bark2.ogg') //Used in emote.
var/yelp_sound = 'sound/creatures/dog_yelp.ogg' //Used on death.
var/last_eaten = 0
@@ -100,7 +100,6 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1)
childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5)
animal_species = /mob/living/simple_animal/pet/dog
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
collar_type = "corgi"
var/obj/item/inventory_head
var/obj/item/inventory_back
@@ -417,7 +416,7 @@
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
var/age = 0
var/record_age = 1
@@ -568,7 +567,7 @@
icon_living = "narsian"
icon_dead = "narsian_dead"
faction = list("neutral", "cult")
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
nofur = TRUE
unique_pet = TRUE
@@ -637,7 +636,7 @@
real_name = "Lisa"
gender = FEMALE
desc = "It's a corgi with a cute pink bow."
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
icon_state = "lisa"
icon_living = "lisa"
@@ -753,7 +752,6 @@
icon_living = "pug"
icon_dead = "pug_dead"
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/pug = 3)
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
collar_type = "pug"
/mob/living/simple_animal/pet/dog/pug/handle_automated_movement()
@@ -123,7 +123,7 @@
health = 50
maxHealth = 50
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
blood_volume = BLOOD_VOLUME_NORMAL
var/obj/item/udder/udder = null
@@ -192,7 +192,7 @@
mob_size = MOB_SIZE_TINY
can_hide = 1
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/chick/New()
..()
@@ -247,7 +247,7 @@ var/global/chicken_count = 0
var/list/feedMessages = list("It clucks happily.","It clucks happily.")
var/list/layMessage = EGG_LAYING_MESSAGES
var/list/validColors = list("brown","black","white")
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/chicken/New()
..()
@@ -327,7 +327,7 @@ var/global/chicken_count = 0
health = 50
maxHealth = 50
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
blood_volume = BLOOD_VOLUME_NORMAL
/mob/living/simple_animal/turkey
@@ -351,7 +351,7 @@ var/global/chicken_count = 0
health = 50
maxHealth = 50
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/goose
name = "goose"
@@ -374,7 +374,7 @@ var/global/chicken_count = 0
health = 50
maxHealth = 50
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/seal
name = "seal"
@@ -397,7 +397,7 @@ var/global/chicken_count = 0
health = 50
maxHealth = 50
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
blood_volume = BLOOD_VOLUME_NORMAL
/mob/living/simple_animal/walrus
@@ -421,7 +421,7 @@ var/global/chicken_count = 0
health = 50
maxHealth = 50
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
blood_volume = BLOOD_VOLUME_NORMAL
/obj/item/udder
@@ -17,14 +17,13 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
//Captain fox
/mob/living/simple_animal/pet/dog/fox/Renault
name = "Renault"
desc = "Renault, the Captain's trustworthy fox. I wonder what it says?"
unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
//Syndi fox
/mob/living/simple_animal/pet/dog/fox/Syndifox
@@ -37,7 +36,7 @@
mutations = list(BREATHLESS)
faction = list("syndicate")
unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
melee_damage_lower = 10
@@ -22,4 +22,4 @@
can_hide = 1
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 1)
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
@@ -33,7 +33,7 @@
can_hide = 1
holder_type = /obj/item/holder/mouse
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
var/chew_probability = 1
/mob/living/simple_animal/mouse/Initialize(mapload)
@@ -169,7 +169,7 @@
response_disarm = "gently pushes aside"
response_harm = "splats"
unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/mouse/blobinfected
@@ -177,7 +177,7 @@
health = 100
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
var/cycles_alive = 0
var/cycles_limit = 30
var/has_burst = FALSE
@@ -231,6 +231,6 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stamps on"
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
can_collar = 0
butcher_results = list(/obj/item/stack/sheet/metal = 1)
@@ -28,7 +28,7 @@
icon_living = "penguin"
icon_dead = "penguin_dead"
butcher_results = list()
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/pet/penguin/eldrich
name = "Albino penguin"
@@ -51,6 +51,8 @@
desc = "Shameful of all he surveys."
icon_state = "penguin_shamebrero"
icon_living = "penguin_shamebrero"
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
/mob/living/simple_animal/pet/penguin/baby
speak = list("gah", "noot noot", "noot!", "noot", "squeee!", "noo!")
@@ -16,7 +16,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
melee_damage_lower = 0
melee_damage_upper = 0
health = 50
@@ -29,4 +29,4 @@
name = "Paperwork"
desc = "Cargo's pet sloth. About as useful as the rest of the techs."
unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
@@ -6,13 +6,14 @@
icon_living = "alienh_running"
icon_dead = "alienh_dead"
icon_gib = "syndicate_gib"
response_help = "pokes the"
response_disarm = "shoves the"
response_harm = "hits the"
gender = FEMALE
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
speed = 0
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 3)
maxHealth = 100
health = 100
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 3, /obj/item/stack/sheet/animalhide/xeno = 1)
maxHealth = 125
health = 125
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 25
@@ -29,7 +30,7 @@
minbodytemp = 0
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
death_sound = 'sound/voice/hiss6.ogg'
deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..."
@@ -39,8 +40,6 @@
icon_state = "aliend_running"
icon_living = "aliend_running"
icon_dead = "aliend_dead"
health = 60
maxHealth = 60
melee_damage_lower = 15
melee_damage_upper = 15
var/plant_cooldown = 30
@@ -60,8 +59,8 @@
icon_state = "aliens_running"
icon_living = "aliens_running"
icon_dead = "aliens_dead"
health = 120
maxHealth = 120
health = 150
maxHealth = 150
melee_damage_lower = 15
melee_damage_upper = 15
ranged = 1
@@ -84,6 +83,7 @@
retreat_distance = 5
minimum_distance = 5
move_to_delay = 4
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 4, /obj/item/stack/sheet/animalhide/xeno = 1)
projectiletype = /obj/item/projectile/neurotox
projectilesound = 'sound/weapons/pierce.ogg'
status_flags = 0
@@ -106,7 +106,7 @@
LayEggs()
/mob/living/simple_animal/hostile/alien/proc/SpreadPlants()
if(!isturf(loc) || istype(loc, /turf/space))
if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/weeds/node) in get_turf(src))
return
@@ -114,7 +114,7 @@
new /obj/structure/alien/weeds/node(loc)
/mob/living/simple_animal/hostile/alien/proc/LayEggs()
if(!isturf(loc) || istype(loc, /turf/space))
if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/egg) in get_turf(src))
return
@@ -130,8 +130,9 @@
move_to_delay = 4
maxHealth = 400
health = 400
butcher_results = list(/obj/item/reagent_containers/food/snacks/xenomeat = 10, /obj/item/stack/sheet/animalhide/xeno = 2)
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
/obj/item/projectile/neurotox
name = "neurotoxin"
@@ -145,14 +146,14 @@
a_intent = INTENT_HELP
friendly = "caresses"
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
gold_core_spawnable = HOSTILE_SPAWN
icon_state = "maid"
icon_living = "maid"
icon_dead = "maid_dead"
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //no fun allowed
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget()
if(istype(target, /atom/movable))
if(ismovableatom(target))
if(istype(target, /obj/effect/decal/cleanable))
visible_message("<span class='notice'>\The [src] cleans up \the [target].</span>")
qdel(target)
@@ -32,7 +32,7 @@
faction = list("scarybat")
var/mob/living/owner
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/scarybat/New(loc, mob/living/L as mob)
..()
@@ -73,4 +73,4 @@
pass_flags = PASSTABLE
universal_speak = 1
universal_understand = 1
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //badmin only
gold_core_spawnable = NO_SPAWN //badmin only
@@ -32,7 +32,7 @@
minbodytemp = 0
faction = list("russian")
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
//SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!!
/mob/living/simple_animal/hostile/bear/Hudson
@@ -36,6 +36,7 @@
density = FALSE
mob_size = MOB_SIZE_TINY
flying = TRUE
gold_core_spawnable = HOSTILE_SPAWN
search_objects = TRUE //have to find those plant trays!
//Spaceborn beings don't get hurt by space
@@ -1,20 +1,25 @@
#define REGENERATION_DELAY 60 // After taking damage, how long it takes for automatic regeneration to begin for megacarps (ty robustin!)
/mob/living/simple_animal/hostile/carp
name = "space carp"
desc = "A ferocious, fang-bearing creature that resembles a fish."
icon = 'icons/mob/carp.dmi'
icon_state = "carp"
icon_state = "base"
icon_living = "base"
icon_dead = "base_dead"
icon_gib = "carp_gib"
speak_chance = 0
turns_per_move = 5
butcher_results = list(/obj/item/reagent_containers/food/snacks/carpmeat = 2)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
emote_taunt = list("gnashes")
taunt_chance = 30
speed = 0
maxHealth = 25
health = 25
harm_intent_damage = 8
obj_damage = 50
melee_damage_lower = 15
@@ -27,31 +32,68 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 1500
faction = list("carp")
flying = 1
flying = TRUE
pressure_resistance = 200
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
var/carp_color = "carp" //holder for icon set
var/list/icon_sets = list("carp", "blue", "yellow", "grape", "rust", "teal", "purple")
var/random_color = TRUE //if the carp uses random coloring
var/rarechance = 1 //chance for rare color variant
var/static/list/carp_colors = list(\
"lightpurple" = "#c3b9f1", \
"lightpink" = "#da77a8", \
"green" = "#70ff25", \
"grape" = "#df0afb", \
"swamp" = "#e5e75a", \
"turquoise" = "#04e1ed", \
"brown" = "#ca805a", \
"teal" = "#20e28e", \
"lightblue" = "#4d88cc", \
"rusty" = "#dd5f34", \
"beige" = "#bbaeaf", \
"yellow" = "#f3ca4a", \
"blue" = "#09bae1", \
"palegreen" = "#7ef099", \
)
var/static/list/carp_colors_rare = list(\
"silver" = "#fdfbf3", \
)
/mob/living/simple_animal/hostile/carp/Initialize(mapload)
. = ..()
carp_randomify()
carp_randomify(rarechance)
update_icons()
/mob/living/simple_animal/hostile/carp/proc/carp_randomify()
if(prob(1))
carp_color = pick("white", "black")
else
carp_color = pick(icon_sets)
icon_state = "[carp_color]"
icon_living = "[carp_color]"
icon_dead = "[carp_color]_dead"
/mob/living/simple_animal/hostile/carp/proc/carp_randomify(rarechance)
if(random_color)
var/our_color
if(prob(rarechance))
our_color = pick(carp_colors_rare)
add_atom_colour(carp_colors_rare[our_color], FIXED_COLOUR_PRIORITY)
else
our_color = pick(carp_colors)
add_atom_colour(carp_colors[our_color], FIXED_COLOUR_PRIORITY)
add_carp_overlay()
/mob/living/simple_animal/hostile/carp/Process_Spacemove(var/movement_dir = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/proc/add_carp_overlay()
if(!random_color)
return
cut_overlays()
var/mutable_appearance/base_overlay = mutable_appearance(icon, "base_mouth")
base_overlay.appearance_flags = RESET_COLOR
add_overlay(base_overlay)
/mob/living/simple_animal/hostile/carp/proc/add_dead_carp_overlay()
if(!random_color)
return
cut_overlays()
var/mutable_appearance/base_dead_overlay = mutable_appearance(icon, "base_dead_mouth")
base_dead_overlay.appearance_flags = RESET_COLOR
add_overlay(base_dead_overlay)
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0)
return TRUE //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/AttackingTarget()
. = ..()
@@ -59,15 +101,34 @@
var/mob/living/carbon/human/H = target
H.adjustStaminaLoss(8)
/mob/living/simple_animal/hostile/carp/death(gibbed)
. = ..()
cut_overlays()
if(!random_color || gibbed)
return
add_dead_carp_overlay()
/mob/living/simple_animal/hostile/carp/revive()
..()
regenerate_icons()
/mob/living/simple_animal/hostile/carp/regenerate_icons()
cut_overlays()
if(!random_color)
return
if(stat != DEAD)
add_carp_overlay()
else
add_dead_carp_overlay()
..()
/mob/living/simple_animal/hostile/carp/holocarp
icon_state = "holocarp"
icon_living = "holocarp"
maxbodytemp = INFINITY
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
del_on_death = 1
/mob/living/simple_animal/hostile/carp/holocarp/carp_randomify()
return
random_color = FALSE
/mob/living/simple_animal/hostile/carp/megacarp
icon = 'icons/mob/alienqueen.dmi'
@@ -77,13 +138,34 @@
icon_living = "megacarp"
icon_dead = "megacarp_dead"
icon_gib = "megacarp_gib"
maxHealth = 65
health = 65
maxHealth = 20
health = 20
pixel_x = -16
mob_size = MOB_SIZE_LARGE
random_color = FALSE
obj_damage = 80
melee_damage_lower = 20
melee_damage_upper = 20
/mob/living/simple_animal/hostile/carp/megacarp/carp_randomify()
return
var/regen_cooldown = 0
/mob/living/simple_animal/hostile/carp/megacarp/Initialize()
. = ..()
name = "[pick(GLOB.megacarp_first_names)] [pick(GLOB.megacarp_last_names)]"
melee_damage_lower += rand(2, 10)
melee_damage_upper += rand(10, 20)
maxHealth += rand(30, 60)
move_to_delay = rand(3, 7)
/mob/living/simple_animal/hostile/carp/megacarp/adjustHealth(amount, updating_health = TRUE)
. = ..()
if(.)
regen_cooldown = world.time + REGENERATION_DELAY
/mob/living/simple_animal/hostile/carp/megacarp/Life()
..()
if(regen_cooldown < world.time)
heal_overall_damage(4)
#undef REGENERATION_DELAY
@@ -13,5 +13,5 @@
attacktext = "chomps"
attack_sound = 'sound/weapons/bite.ogg'
faction = list("creature")
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
@@ -29,7 +29,7 @@
see_in_dark = 8
mob_size = MOB_SIZE_LARGE
ventcrawler = 0
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
@@ -26,7 +26,7 @@
minbodytemp = 0
faction = list("faithless")
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(var/movement_dir = 0)
return 1
@@ -34,7 +34,7 @@
move_to_delay = 6
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
var/venom_per_bite = 0 // While the /poison/ type path remains as-is for consistency reasons, we're really talking about venom, not poison.
var/busy = 0
@@ -18,7 +18,7 @@
attack_sound = 'sound/creatures/headcrab_attack.ogg'
speak_emote = list("hisses")
var/is_zombie = 0
stat_attack = DEAD //so they continue to attack when they are on the ground.
stat_attack = DEAD //so they continue to attack when they are on the ground.
var/host_species = ""
var/list/human_overlays = list()
@@ -94,7 +94,7 @@
/mob/living/simple_animal/hostile/headcrab/update_icons()
..()
. = ..()
if(is_zombie)
overlays.Cut()
overlays = human_overlays
@@ -104,3 +104,69 @@
else if(host_species == "Gray")
I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod_gray")
overlays += I
/mob/living/simple_animal/hostile/headcrab/fast
name = "fast headcrab"
desc = "A fast parasitic creature that would like to connect with your brain stem."
icon = 'icons/mob/headcrab.dmi'
icon_state = "fast_headcrab"
icon_living = "fast_headcrab"
icon_dead = "fast_headcrab_dead"
health = 30
maxHealth = 30
ranged_cooldown_time = 30
jumpdistance = 8
jumpspeed = 2
speak_emote = list("screech")
/mob/living/simple_animal/hostile/headcrab/fast/update_icons()
. = ..()
if(is_zombie)
overlays.Cut()
overlays = human_overlays
var/image/I = image('icons/mob/headcrab.dmi', icon_state = "fast_headcrabpod")
if(host_species == "Vox")
I = image('icons/mob/headcrab.dmi', icon_state = "fast_headcrabpod_vox")
else if(host_species == "Gray")
I = image('icons/mob/headcrab.dmi', icon_state = "fast_headcrabpod_gray")
overlays += I
/mob/living/simple_animal/hostile/headcrab/fast/Zombify(mob/living/carbon/human/H)
. = ..()
speak = list('sound/creatures/fast_zombie_idle1.ogg','sound/creatures/fast_zombie_idle2.ogg','sound/creatures/fast_zombie_idle3.ogg')
/mob/living/simple_animal/hostile/headcrab/poison
name = "poison headcrab"
desc = "A poison parasitic creature that would like to connect with your brain stem."
icon = 'icons/mob/headcrab.dmi'
icon_state = "poison_headcrab"
icon_living = "poison_headcrab"
icon_dead = "poison_headcrab_dead"
health = 60
maxHealth = 60
ranged_cooldown_time = 50
jumpdistance = 3
jumpspeed = 1
attack_sound = 'sound/creatures/ph_scream1.ogg'
speak_emote = list("screech")
/mob/living/simple_animal/hostile/headcrab/poison/update_icons()
. = ..()
if(is_zombie)
overlays.Cut()
overlays = human_overlays
var/image/I = image('icons/mob/headcrab.dmi', icon_state = "poison_headcrabpod")
if(host_species == "Vox")
I = image('icons/mob/headcrab.dmi', icon_state = "poison_headcrabpod_vox")
else if(host_species == "Gray")
I = image('icons/mob/headcrab.dmi', icon_state = "poison_headcrabpod_gray")
overlays += I
/mob/living/simple_animal/hostile/headcrab/poison/AttackingTarget()
. = ..()
var/mob/living/carbon/C = target
if(C.can_inject(null, 0, "head", 0))
C.reagents.add_reagent("lsd", 5)
@@ -8,7 +8,7 @@
icon_dead = "hellhound_dead"
icon_resting = "hellhound_rest"
mutations = list(BREATHLESS)
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
@@ -126,4 +126,4 @@
melee_damage_lower = 20
melee_damage_upper = 30
environment_smash = 2
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
@@ -22,7 +22,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
speak_emote = list("states")
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
deathmessage = "blows apart!"
del_on_death = 1
@@ -34,7 +34,7 @@
layer = 3.1 //so they can stay hidde under the /obj/structure/bush
var/stalk_tick_delay = 3
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/panther/AttackingTarget()
. = ..()
@@ -76,7 +76,7 @@
layer = 3.1 //so they can stay hidde under the /obj/structure/bush
var/stalk_tick_delay = 3
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/snake/AttackingTarget()
. =..()
@@ -23,4 +23,4 @@
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 150
maxbodytemp = 500
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
@@ -29,6 +29,7 @@ Difficulty: Medium
icon_living = "miner"
icon = 'icons/mob/alienqueen.dmi'
light_color = "#E4C7C5"
flying = FALSE
speak_emote = list("roars")
speed = 3
move_to_delay = 3
@@ -28,7 +28,7 @@
move_to_delay = 9
var/is_electronic = 0
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
del_on_death = 1
/mob/living/simple_animal/hostile/mimic/emp_act(severity)
@@ -110,7 +110,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
var/destroy_objects = 0
var/knockdown_people = 0
var/image/googly_eyes = null
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/mimic/copy/New(loc, obj/copy, mob/living/creator, destroy_original = 0)
..(loc)
@@ -30,7 +30,7 @@
vision_range = 2
aggro_vision_range = 9
turns_per_move = 5
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER},
/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER})
@@ -23,7 +23,7 @@
friendly = "pinches"
a_intent = INTENT_HELP
ventcrawler = VENTCRAWLER_ALWAYS
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
stat_attack = UNCONSCIOUS
gender = NEUTER
stop_automated_movement = FALSE
@@ -137,7 +137,7 @@
/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch
name = "grublunch"
wanted_objects = list() //They don't eat.
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
var/growth = 0
//Baby gutlunch
@@ -2,6 +2,7 @@
/mob/living/simple_animal/hostile/asteroid
vision_range = 2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
heat_damage_per_tick = 20
faction = list("mining")
weather_immunities = list("lava","ash")
obj_damage = 30
@@ -62,10 +63,4 @@
..(gibbed)
/mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot()
butcher_results[crusher_loot] = 1
/mob/living/simple_animal/hostile/asteroid/handle_temperature_damage()
if(bodytemperature < minbodytemp)
adjustBruteLoss(2)
else if(bodytemperature > maxbodytemp)
adjustBruteLoss(20)
butcher_results[crusher_loot] = 1
@@ -13,7 +13,7 @@
attack_sound = 'sound/weapons/bladeslice.ogg'
faction = list("creature")
speak_emote = list("screams")
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
faction = list("nether")
@@ -56,7 +56,7 @@
icon_state = "blank-body"
icon_living = "blank-body"
icon_dead = "blank-dead"
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
health = 100
maxHealth = 100
melee_damage_lower = 5
@@ -60,7 +60,7 @@
minbodytemp = 0
maxbodytemp = 1500
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/retaliate/carp/koi/Initialize(mapload)
. = ..()
@@ -47,6 +47,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
pressure_resistance = 300
gold_core_spawnable = NO_SPAWN //too spooky for science
faction = list("undead") // did I mention ghost
loot = list(/obj/item/reagent_containers/food/snacks/ectoplasm)
del_on_death = 1
@@ -23,7 +23,7 @@
unsuitable_atmos_damage = 10
robust_searching = 1
stat_attack = UNCONSCIOUS
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
faction = list("skeleton")
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
@@ -39,7 +39,7 @@
maxHealth = 55
health = 55
weather_immunities = list("snow")
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
melee_damage_lower = 17
melee_damage_upper = 20
deathmessage = "collapses into a pile of bones, its gear falling to the floor!"
@@ -350,6 +350,6 @@
minbodytemp = 0
mob_size = MOB_SIZE_TINY
flying = 1
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
del_on_death = 1
deathmessage = "is smashed into pieces!"
@@ -32,7 +32,7 @@
faction = list("hostile", "winter")
loot = list(/obj/item/stack/sheet/wood)
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
deathmessage = "is hacked into pieces!"
del_on_death = 1
@@ -32,7 +32,7 @@
bodytemperature = 73.0 //it's made of snow and hatred, so it's pretty cold.
maxbodytemp = 280.15 //at roughly 7 C, these will start melting (dying) from the warmth. Mind over matter or something.
heat_damage_per_tick = 10 //Now With Rapid Thawing Action!
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/winter/snowman/death(gibbed)
@@ -64,7 +64,7 @@
health = 80
melee_damage_lower = 5
melee_damage_upper = 10
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/winter/santa
maxHealth = 150 //if this seems low for a "boss", it's because you have to fight him multiple times, with him fully healing between stages
@@ -86,7 +86,7 @@
//Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding.
var/obj/item/held_item = null
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/parrot/New()
@@ -698,7 +698,7 @@
"Goddam emaggers!"
)
unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/parrot/Poly/New()
ears = new /obj/item/radio/headset/headset_eng(src)
@@ -36,7 +36,7 @@
//Temperature effect
var/minbodytemp = 250
var/maxbodytemp = 350
var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp
var/heat_damage_per_tick = 2 //amount of damage applied if animal's body temperature is higher than maxbodytemp
var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
//Healable by medical stacks? Defaults to yes.
@@ -72,7 +72,7 @@
var/animal_species //Sorry, no spider+corgi buttbabies.
var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against
var/gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //if CHEM_MOB_SPAWN_HOSTILE can be spawned by plasma with gold core, CHEM_MOB_SPAWN_FRIENDLY are 'friendlies' spawned with blood
var/gold_core_spawnable = NO_SPAWN //If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood
var/mob/living/carbon/human/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions).
@@ -277,8 +277,10 @@
handle_temperature_damage()
/mob/living/simple_animal/proc/handle_temperature_damage()
if((bodytemperature < minbodytemp) || (bodytemperature > maxbodytemp))
adjustHealth(unsuitable_atmos_damage)
if(bodytemperature < minbodytemp)
adjustHealth(cold_damage_per_tick)
else if(bodytemperature > maxbodytemp)
adjustHealth(heat_damage_per_tick)
/mob/living/simple_animal/gib()
if(icon_gib)
+7 -5
View File
@@ -1,8 +1,10 @@
/mob/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0)
return 1
if(istype(mover, /obj/item/projectile) || mover.throwing)
if(istype(mover, /obj/item/projectile))
return (!density || lying)
if(mover.throwing)
return (!density || lying || (mover.throwing.thrower == src))
if(mover.checkpass(PASSMOB))
return 1
if(buckled == mover)
@@ -431,10 +433,10 @@
/client/verb/body_l_arm()
set name = "body-l-arm"
set hidden = 1
if(!check_has_body_select())
return
var/next_in_line
if(mob.zone_sel.selecting == BODY_ZONE_L_ARM)
next_in_line = BODY_ZONE_PRECISE_L_HAND
@@ -450,7 +452,7 @@
if(!check_has_body_select())
return
var/next_in_line
if(mob.zone_sel.selecting == BODY_ZONE_R_LEG)
next_in_line = BODY_ZONE_PRECISE_R_FOOT
@@ -476,7 +478,7 @@
if(!check_has_body_select())
return
var/next_in_line
if(mob.zone_sel.selecting == BODY_ZONE_L_LEG)
next_in_line = BODY_ZONE_PRECISE_L_FOOT