Rebalances Golems, Refactors Species Based Equipping (#12358)

This commit is contained in:
Fox McCloud
2019-09-21 06:10:37 -07:00
committed by variableundefined
parent 4fabdfb78e
commit d5759a0db5
27 changed files with 449 additions and 510 deletions
+7 -1
View File
@@ -37,12 +37,18 @@
if(holder)
holder.update_icon()
/obj/item/assembly/mousetrap/proc/triggered(mob/target, var/type = "feet")
/obj/item/assembly/mousetrap/proc/triggered(mob/target, type = "feet")
if(!armed)
return
var/obj/item/organ/external/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(PIERCEIMMUNE in H.dna.species.species_traits)
playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
armed = FALSE
update_icon()
pulse(FALSE)
return FALSE
switch(type)
if("feet")
if(!H.shoes)
+1
View File
@@ -4,6 +4,7 @@
icon_state = "boxing"
item_state = "boxing"
put_on_delay = 60
species_exception = list(/datum/species/golem) // now you too can be a golem boxing champion
/obj/item/clothing/gloves/boxing/green
icon_state = "boxinggreen"
+1 -1
View File
@@ -9,7 +9,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
species_exception = list(/datum/species/golem)
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Grey" = 'icons/mob/species/grey/suit.dmi'
+4
View File
@@ -266,6 +266,10 @@
ui = new(user, src, ui_key, "personal_crafting.tmpl", "Crafting Menu", 700, 800, state = state)
ui.open()
/datum/personal_crafting/proc/close(mob/user)
var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
ui.close()
/datum/personal_crafting/ui_data(mob/user)
var/list/data = list()
var/list/subs = list()
+4 -2
View File
@@ -50,10 +50,12 @@
/obj/item/grown/nettle/pickup(mob/living/user)
..()
if(!ishuman(user))
return TRUE
return FALSE
var/mob/living/carbon/human/H = user
if(H.gloves)
return TRUE
return FALSE
if(PIERCEIMMUNE in H.dna.species.species_traits)
return FALSE
var/organ = ((H.hand ? "l_":"r_") + "arm")
var/obj/item/organ/external/affecting = H.get_organ(organ)
if(affecting)
+4 -12
View File
@@ -149,18 +149,10 @@
regrowth_time_low = 4800
regrowth_time_high = 7200
/obj/structure/flora/ash/cacti/Crossed(mob/AM, oldloc)
if(ishuman(AM) && has_gravity(loc) && prob(70))
var/mob/living/carbon/human/H = AM
if(!H.shoes && !H.lying) //ouch, my feet.
var/picked_def_zone = pick("l_leg", "r_leg")
var/obj/item/organ/external/affected = H.get_organ(picked_def_zone)
if(!istype(affected))
return
H.apply_damage(rand(3, 6), BRUTE, picked_def_zone)
H.Weaken(2)
H.visible_message("<span class='danger'>[H] steps on a cactus!</span>", \
"<span class='userdanger'>You step on a cactus!</span>")
/obj/structure/flora/ash/cacti/Initialize(mapload)
. = ..()
// min dmg 3, max dmg 6, prob(70)
AddComponent(/datum/component/caltrop, 3, 6, 70)
/obj/item/reagent_containers/food/snacks/grown/ash_flora
name = "mushroom shavings"
@@ -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)
@@ -318,7 +318,7 @@ emp_act
else if(I)
if(I.throw_speed >= EMBED_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
@@ -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
@@ -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()
@@ -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"
@@ -715,54 +741,4 @@
/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)
/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)
/obj/item/clothing/shoes/golem
name = "golem's feet"
desc = "sturdy golem feet"
icon_state = "golem"
item_state = "golem"
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"
unacidable = 1
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
flags = ABSTRACT | NODROP
miss_sound = null
@@ -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!",
@@ -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
+13
View File
@@ -621,6 +621,19 @@
var/brightness_power = 1
var/brightness_color = null
/obj/item/light/ComponentInitialize()
. = ..()
AddComponent(/datum/component/caltrop, force)
/obj/item/light/Crossed(mob/living/L)
if(istype(L) && has_gravity(loc))
if(L.incorporeal_move || L.flying)
return
playsound(loc, 'sound/effects/glass_step.ogg', 50, TRUE)
if(status == LIGHT_BURNED || status == LIGHT_OK)
shatter()
return ..()
/obj/item/light/tube
name = "light tube"
desc = "A replacement light tube."
@@ -1,34 +1,66 @@
// Slime limbs.
/obj/item/organ/external/chest/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/groin/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/arm/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/arm/right/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/leg/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/leg/right/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/foot/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/foot/right/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/hand/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/hand/right/unbreakable
cannot_break = 1
cannot_break = TRUE
/obj/item/organ/external/head/unbreakable
cannot_break = 1
cannot_break = TRUE
// Cannot dismember or break
/obj/item/organ/external/chest/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/groin/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/arm/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/arm/right/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/leg/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/leg/right/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/foot/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/foot/right/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/hand/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/hand/right/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/head/unbreakable/sturdy
cannot_amputate = TRUE