Golems Are Now a Proper Race (#9274)

* Adds golems as a proper race.

* Adds golem name file.

* Fixes a couple names.

* Further fixes to names.

* Changes the golem language key from g to p.

* Adds groin states for golems, as well as deformed states for all golem limbs.

* Changes attack verb to "punches." Updates the changelog with more complete information as to the golems' capabilities.

* Adds some extra checks for golems. Golems can now walk over broken glass barefoot without being hurt.

* Fixes new macros.
This commit is contained in:
Shadowmech88
2016-04-15 02:44:08 -05:00
committed by clusterfack
parent cbb4370dac
commit d8674e9320
34 changed files with 248 additions and 62 deletions

View File

@@ -5,8 +5,30 @@
// fun if you want to typecast humans/monkeys/etc without writing long path-filled lines. // fun if you want to typecast humans/monkeys/etc without writing long path-filled lines.
#define ishuman(A) istype(A, /mob/living/carbon/human) #define ishuman(A) istype(A, /mob/living/carbon/human)
#define isjusthuman(A) (ishuman(A) && A.species && istype(A.species, /datum/species/human))
#define ismonkey(A) istype(A, /mob/living/carbon/monkey) #define ismonkey(A) istype(A, /mob/living/carbon/monkey)
#define isvox(A) (ishuman(A) && A.species && istype(A.species, /datum/species/vox))
#define isdiona(A) (ishuman(A) && A.species && istype(A.species, /datum/species/diona))
#define isgrey(A) (ishuman(A) && A.species && istype(A.species, /datum/species/grey))
#define isplasmaman(A) (ishuman(A) && A.species && istype(A.species, /datum/species/plasmaman))
#define isskellington(A) (ishuman(A) && A.species && istype(A.species, /datum/species/skellington))
#define iscatbeast(A) (ishuman(A) && A.species && istype(A.species, /datum/species/tajaran))
#define isunathi(A) (ishuman(A) && A.species && istype(A.species, /datum/species/unathi))
#define isskrell(A) (ishuman(A) && A.species && istype(A.species, /datum/species/skrell))
#define ismuton(A) (ishuman(A) && A.species && istype(A.species, /datum/species/muton))
#define isgolem(A) (ishuman(A) && A.species && istype(A.species, /datum/species/golem))
#define isbrain(A) istype(A, /mob/living/carbon/brain) #define isbrain(A) istype(A, /mob/living/carbon/brain)
#define isalien(A) istype(A, /mob/living/carbon/alien) #define isalien(A) istype(A, /mob/living/carbon/alien)

View File

@@ -305,6 +305,10 @@
if(!disable_warning) if(!disable_warning)
to_chat(H, "<span class='warning'>You're too fat to wear the [name].</span>") to_chat(H, "<span class='warning'>You're too fat to wear the [name].</span>")
return 0 return 0
if(H.species.flags & IS_BULKY && !(flags & ONESIZEFITSALL))
if(!disable_warning)
to_chat(H, "<span class='warning'>You can't get \the [src] to fit over your bulky exterior!</span>")
return 0
switch(slot) switch(slot)
if(slot_l_hand) if(slot_l_hand)
@@ -318,6 +322,10 @@
if(slot_wear_mask) if(slot_wear_mask)
if( !(slot_flags & SLOT_MASK) ) if( !(slot_flags & SLOT_MASK) )
return 0 return 0
if(H.species.flags & IS_BULKY && !(flags & ONESIZEFITSALL))
if(!disable_warning)
to_chat(H, "<span class='warning'>You can't get \the [src] to fasten around your thick head!</span>")
return 0
if(H.wear_mask) if(H.wear_mask)
if(automatic) if(automatic)
if(H.check_for_open_slot(src)) if(H.check_for_open_slot(src))
@@ -342,6 +350,10 @@
if(slot_wear_suit) if(slot_wear_suit)
if( !(slot_flags & SLOT_OCLOTHING) ) if( !(slot_flags & SLOT_OCLOTHING) )
return 0 return 0
if(H.species.flags & IS_BULKY && !(flags & ONESIZEFITSALL))
if(!disable_warning)
to_chat(H, "<span class='warning'>You can't get \the [src] to fit over your bulky exterior!</span>")
return 0
if(H.wear_suit) if(H.wear_suit)
if(automatic) if(automatic)
if(H.check_for_open_slot(src)) if(H.check_for_open_slot(src))
@@ -354,6 +366,10 @@
if(slot_gloves) if(slot_gloves)
if( !(slot_flags & SLOT_GLOVES) ) if( !(slot_flags & SLOT_GLOVES) )
return 0 return 0
if(H.species.flags & IS_BULKY && !(flags & ONESIZEFITSALL))
if(!disable_warning)
to_chat(H, "<span class='warning'>You can't get \the [src] to fit over your bulky fingers!</span>")
return 0
if(H.gloves) if(H.gloves)
if(automatic) if(automatic)
if(H.check_for_open_slot(src)) if(H.check_for_open_slot(src))
@@ -366,6 +382,10 @@
if(slot_shoes) if(slot_shoes)
if( !(slot_flags & SLOT_FEET) ) if( !(slot_flags & SLOT_FEET) )
return 0 return 0
if(H.species.flags & IS_BULKY && !(flags & ONESIZEFITSALL))
if(!disable_warning)
to_chat(H, "<span class='warning'>You can't get \the [src] to fit over your bulky feet!</span>")
return 0
if(H.shoes) if(H.shoes)
if(automatic) if(automatic)
if(H.check_for_open_slot(src)) if(H.check_for_open_slot(src))

View File

@@ -111,14 +111,15 @@
playsound(get_turf(src), 'sound/effects/glass_step.ogg', 50, 1) playsound(get_turf(src), 'sound/effects/glass_step.ogg', 50, 1)
if(ishuman(M)) if(ishuman(M))
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
if(!H.check_body_part_coverage(FEET)) if(!isgolem(H))
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot")) if(!H.check_body_part_coverage(FEET))
if(affecting.status & (ORGAN_ROBOT|ORGAN_PEG)) var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
return if(affecting.status & (ORGAN_ROBOT|ORGAN_PEG))
return
if(!(H.species && (H.species.flags & NO_PAIN))) if(!(H.species && (H.species.flags & NO_PAIN)))
H.Weaken(3) H.Weaken(3)
if(affecting.take_damage(5, 0)) if(affecting.take_damage(5, 0))
H.UpdateDamageIcon() H.UpdateDamageIcon()
H.updatehealth() H.updatehealth()
..() ..()

View File

@@ -453,8 +453,6 @@
var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if(!E) if(!E)
return return
if(H.species.flags & IS_SYNTHETIC)
return
if(safety < 2) if(safety < 2)
switch(safety) switch(safety)
if(1) if(1)

View File

@@ -13,7 +13,7 @@
//BS12: Species-restricted clothing check. //BS12: Species-restricted clothing check.
/obj/item/clothing/mob_can_equip(M as mob, slot) /obj/item/clothing/mob_can_equip(M as mob, slot)
. = ..() //Default return value. If 1, item can be equipped. If 0, it can't be. . = ..(M, slot, 1) //Default return value. If 1, item can be equipped. If 0, it can't be.
if(species_restricted && istype(M,/mob/living/carbon/human)) if(species_restricted && istype(M,/mob/living/carbon/human))

View File

@@ -200,6 +200,19 @@
space_chance = 95 space_chance = 95
syllables = list("CLICK", "CLACK") syllables = list("CLICK", "CLACK")
/datum/language/golem
name = "Golem"
desc = "A slow, guttural language produced by the grinding of a golem's joints against one another."
speech_verb = "grinds"
ask_verb = "groans"
exclaim_verb = "cracks"
whisper_verb = "grumbles"
colour = "brown"
native = 1
key = "p"
flags = RESTRICTED
syllables = list("oa","ur","ae","um","tu","gor","an","lo","ag","oon","po")
/datum/language/skellington/say_misunderstood(mob/M, message) /datum/language/skellington/say_misunderstood(mob/M, message)
message="CLICK" message="CLICK"
var/len = max(1,Ceiling(length(message)/5)) var/len = max(1,Ceiling(length(message)/5))

View File

@@ -91,6 +91,7 @@
// world.log << "k" // world.log << "k"
sql_report_death(src) sql_report_death(src)
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
species.handle_death(src)
return ..(gibbed) return ..(gibbed)
/mob/living/carbon/human/proc/makeSkeleton() /mob/living/carbon/human/proc/makeSkeleton()

View File

@@ -226,7 +226,10 @@
if(M_HARDCORE in mutations) if(M_HARDCORE in mutations)
message = "<B>[src]</B> whispers with his final breath, <i>'i told u i was hardcore..'</i>" message = "<B>[src]</B> whispers with his final breath, <i>'i told u i was hardcore..'</i>"
else else
message = "<B>[src]</B> seizes up and falls limp, \his eyes dead and lifeless..." if(isgolem(src))
message = "<B>[src]</B> crumbles into dust..."
else
message = "<B>[src]</B> seizes up and falls limp, \his eyes dead and lifeless..."
m_type = VISIBLE m_type = VISIBLE
if ("giggle") if ("giggle")

View File

@@ -58,6 +58,12 @@
h_style = "Bald" h_style = "Bald"
..(new_loc, "Grey") ..(new_loc, "Grey")
/mob/living/carbon/human/golem/New(var/new_loc, delay_ready_dna = 0)
h_style = "Bald"
..(new_loc, "Golem")
gender = NEUTER
meat_type = /obj/item/weapon/ore/diamond
/mob/living/carbon/human/generate_static_overlay() /mob/living/carbon/human/generate_static_overlay()
if(!istype(static_overlays,/list)) if(!istype(static_overlays,/list))
static_overlays = list() static_overlays = list()

View File

@@ -110,9 +110,6 @@
/mob/living/carbon/human/adjustCloneLoss(var/amount) /mob/living/carbon/human/adjustCloneLoss(var/amount)
..() ..()
if(species.flags & IS_SYNTHETIC)
return
var/heal_prob = max(0, 80 - getCloneLoss()) var/heal_prob = max(0, 80 - getCloneLoss())
var/mut_prob = min(80, getCloneLoss()+10) var/mut_prob = min(80, getCloneLoss()+10)
if (amount > 0) if (amount > 0)

View File

@@ -511,7 +511,7 @@ var/global/list/damage_icon_parts = list()
if(!t_color) t_color = icon_state if(!t_color) t_color = icon_state
var/image/standing = image("icon_state" = "[t_color]_s") var/image/standing = image("icon_state" = "[t_color]_s")
if((M_FAT in mutations) && (species.flags & CAN_BE_FAT)) if(((M_FAT in mutations) && (species.flags & CAN_BE_FAT)) || species.flags & IS_BULKY)
if(w_uniform.flags&ONESIZEFITSALL) if(w_uniform.flags&ONESIZEFITSALL)
standing.icon = 'icons/mob/uniform_fat.dmi' standing.icon = 'icons/mob/uniform_fat.dmi'
else else

View File

@@ -25,8 +25,8 @@
environment = loc.return_air() environment = loc.return_air()
if (stat != DEAD) //still breathing if (stat != DEAD) //still breathing
//Is not a Diona Nymph - Snowflake Code //Is not a Diona Nymph or Rock - Snowflake Code
if(!istype(src,/mob/living/carbon/monkey/diona)) if(!istype(src,/mob/living/carbon/monkey/diona) && !istype(src,/mob/living/carbon/monkey/rock))
//First, resolve location and get a breath //First, resolve location and get a breath
if(air_master.current_cycle%4==2) if(air_master.current_cycle%4==2)
//Only try to take a breath every 4 seconds, unless suffocating //Only try to take a breath every 4 seconds, unless suffocating

View File

@@ -105,7 +105,7 @@
update_muts=1 update_muts=1
if(!istype(src, /mob/living/carbon/monkey/diona)) if(type == /mob/living/carbon/monkey)
add_language(LANGUAGE_MONKEY) add_language(LANGUAGE_MONKEY)
default_language = all_languages[LANGUAGE_MONKEY] default_language = all_languages[LANGUAGE_MONKEY]

View File

@@ -0,0 +1,21 @@
/mob/living/carbon/monkey/rock
name = "rock"
voice_name = "rock"
speak_emote = list("grinds")
icon_state = "rock1"
meat_type = /obj/item/weapon/ore/diamond
species_type = /mob/living/carbon/monkey/rock
mob_bump_flag = MONKEY
mob_swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
mob_push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN
canWearClothes = 0
canWearHats = 1
canWearGlasses = 1
greaterform = "Golem"
/mob/living/carbon/monkey/rock/New()
..()
add_language("Golem")
default_language = all_languages["Golem"]

View File

@@ -1146,18 +1146,11 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
if(!ghost) if(!ghost)
to_chat(user, "The rune fizzles uselessly. There is no spirit nearby.") to_chat(user, "The rune fizzles uselessly. There is no spirit nearby.")
return return
var/mob/living/carbon/human/G = new /mob/living/carbon/human var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem
G.dna.mutantrace = "adamantine" G.real_name = G.species.makeName()
G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
G.equip_to_slot_or_del(new /obj/item/clothing/under/golem(G), slot_w_uniform)
G.equip_to_slot_or_del(new /obj/item/clothing/suit/golem(G), slot_wear_suit)
G.equip_to_slot_or_del(new /obj/item/clothing/shoes/golem(G), slot_shoes)
G.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/golem(G), slot_wear_mask)
G.equip_to_slot_or_del(new /obj/item/clothing/gloves/golem(G), slot_gloves)
//G.equip_to_slot_or_del(new /obj/item/clothing/head/space/golem(G), slot_head)
G.forceMove(src.loc) //we use move to get the entering procs - this fixes gravity G.forceMove(src.loc) //we use move to get the entering procs - this fixes gravity
G.key = ghost.key G.key = ghost.key
to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.") to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as impervious to burn damage. You are unable to wear most clothing, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.")
qdel (src) qdel (src)
if(ticker.mode.name == "sandbox") if(ticker.mode.name == "sandbox")
G.CanBuild() G.CanBuild()

View File

@@ -195,13 +195,6 @@ var/global/list/whitelisted_species = list("Human")
for(var/datum/organ/external/O in H.organs) for(var/datum/organ/external/O in H.organs)
O.owner = H O.owner = H
if(flags & IS_SYNTHETIC)
for(var/datum/organ/external/E in H.organs)
if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
E.status |= ORGAN_ROBOT
for(var/datum/organ/internal/I in H.internal_organs)
I.mechanize()
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. /datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment.
return return
@@ -235,15 +228,6 @@ var/global/list/whitelisted_species = list("Human")
else return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) else return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns). /datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
/*
if(flags & IS_SYNTHETIC)
//H.Jitter(200) //S-s-s-s-sytem f-f-ai-i-i-i-i-lure-ure-ure-ure
H.h_style = ""
spawn(100)
//H.is_jittery = 0
//H.jitteriness = 0
H.update_hair()
*/
return return
/datum/species/proc/equip(var/mob/living/carbon/human/H) /datum/species/proc/equip(var/mob/living/carbon/human/H)
@@ -665,3 +649,105 @@ var/global/list/whitelisted_species = list("Human")
burn_mod = 2.5 //treeeeees burn_mod = 2.5 //treeeeees
move_speed_mod = 7 move_speed_mod = 7
/datum/species/golem
name = "Golem"
icobase = 'icons/mob/human_races/r_golem.dmi'
deform = 'icons/mob/human_races/r_def_golem.dmi'
language = "Golem"
attack_verb = "punches"
has_sweat_glands = 0
flags = HAS_LIPS | NO_BREATHE | NO_BLOOD | NO_SKIN | NO_PAIN | IS_BULKY
uniform_icons = 'icons/mob/uniform_fat.dmi'
primitive = /mob/living/carbon/monkey/rock
blood_color = "#B4DBCB"
flesh_color = "#B4DBCB"
warning_low_pressure = -1
hazard_low_pressure = -1
body_temperature = 0
cold_level_1 = -1 // Cold damage level 1 below this point.
cold_level_2 = -1 // Cold damage level 2 below this point.
cold_level_3 = -1 // Cold damage level 3 below this point.
heat_level_1 = 3600
heat_level_2 = 4000
heat_level_3 = 10000
burn_mod = 0.0001
has_mutant_race = 0
move_speed_mod = 1
chem_flags = NO_INJECT
has_organ = list(
"brain" = /datum/organ/internal/brain,
)
/datum/species/golem/makeName()
return capitalize(pick(golem_names))
/datum/species/golem/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
if(!isgolem(H))
return
var/datum/mind/golemmind = H.mind
if(!istype(golemmind,/datum/mind)) //not a mind
golemmind = null
for(var/atom/movable/I in H.contents)
to_chat(world, "FOUND [I] IN [H], MOVING TO [H.loc]")
I.forceMove(H.loc)
anim(target = H, a_icon = 'icons/mob/mob.dmi', flick_anim = "dust-g", sleeptime = 15)
var/mob/living/adamantine_dust/A = new(H.loc)
if(golemmind)
A.mind = golemmind
H.mind = null
golemmind.current = A
if(A.real_name)
A.real_name = H.real_name
A.desc = "The remains of what used to be [A.real_name]."
A.key = H.key
H.key = null
qdel(H)
/mob/living/adamantine_dust //serves as the corpse of adamantine golems
name = "adamantine dust"
desc = "The remains of an adamantine golem."
stat = DEAD
icon = 'icons/mob/human_races/r_golem.dmi'
icon_state = "golem_dust"
density = 0
/mob/living/adamantine_dust/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/slime_extract/adamantine))
var/obj/item/slime_extract/adamantine/A = I
if(A.Uses)
if(!mind)
to_chat(user, "<span class='warning'>You press \the [A] into \the [src], but nothing happens.</span>")
else
if(!client)
to_chat(user, "<span class='notice'>As you press \the [A] into \the [src], it shudders briefly, but falls still.</span>")
for(var/mob/dead/observer/ghost in player_list)
if(ghost.mind == mind && ghost.client && ghost.can_reenter_corpse)
ghost << 'sound/effects/adminhelp.ogg'
to_chat(ghost, "<span class='interface'><b><font size = 3>Someone is trying to resurrect you. Return to your body if you want to live again!</b> \
(Verbs -> Ghost -> Re-enter corpse, or <a href='?src=\ref[ghost];reentercorpse=1'>click here!</a>)</font></span>")
else
to_chat(user, "<span class='notice'>As you press \the [A] into \the [src], it is consumed. [real_name] reconstitutes itself!.</span>")
qdel(A)
anim(target = src, a_icon = 'icons/mob/mob.dmi', flick_anim = "reverse-dust-g", sleeptime = 15)
var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem
G.real_name = real_name
G.forceMove(src.loc) //we use move to get the entering procs - this fixes gravity
var/datum/mind/dustmind = mind
G.mind = dustmind
dustmind.current = G
mind = null
G.key = key
to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as impervious to burn damage. You are unable to wear most clothing, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.")
qdel(src)
else
to_chat(user, "<span class='warning'>The used extract doesn't have any effect on \the [src].</span>")

View File

@@ -1173,8 +1173,14 @@ default behaviour is:
if(!can_move_mob(tmob, 0, 0)) if(!can_move_mob(tmob, 0, 0))
now_pushing = 0 now_pushing = 0
return return
if(istype(tmob, /mob/living/carbon/human) && (M_FAT in tmob.mutations)) var/mob/living/carbon/human/H = null
if(prob(40) && !(M_FAT in src.mutations)) if(ishuman(tmob))
H = tmob
if(H && ((M_FAT in H.mutations) || (H && H.species && H.species.flags & IS_BULKY)))
var/mob/living/carbon/human/U = null
if(ishuman(src))
U = src
if(prob(40) && !(U && ((M_FAT in U.mutations) || (U && U.species && U.species.flags & IS_BULKY))))
to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>") to_chat(src, "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>")
now_pushing = 0 now_pushing = 0
return return

View File

@@ -145,7 +145,7 @@
if(ishuman(L)) if(ishuman(L))
var/mob/living/carbon/human/H = L var/mob/living/carbon/human/H = L
if(H.dna) if(H.dna)
if((H.dna.mutantrace == "slime") || (H.dna.mutantrace == "adamantine") || (H.dna.mutantrace=="coalgolem")) if((H.dna.mutantrace == "slime") || (isgolem(H)) || (H.dna.mutantrace == "adamantine") || (H.dna.mutantrace=="coalgolem"))
return 0 return 0
//IF WE ARE MOBS SPAWNED BY THE ADMINBUS THEN WE DON'T ATTACK TEST DUMMIES OR IAN (wait what? man that's snowflaky as fuck) //IF WE ARE MOBS SPAWNED BY THE ADMINBUS THEN WE DON'T ATTACK TEST DUMMIES OR IAN (wait what? man that's snowflaky as fuck)
if((istype(L,/mob/living/simple_animal/corgi/Ian) || istype(L,/mob/living/carbon/human/dummy)) && (faction == "adminbus mob")) if((istype(L,/mob/living/simple_animal/corgi/Ian) || istype(L,/mob/living/carbon/human/dummy)) && (faction == "adminbus mob"))

View File

@@ -664,6 +664,9 @@ var/list/slot_equipment_priority = list( \
if(slot_wear_mask) if(slot_wear_mask)
if( !(slot_flags & SLOT_MASK) ) if( !(slot_flags & SLOT_MASK) )
return 0 return 0
// if(H.species.flags & IS_BULKY)
// to_chat(H, "<span class='warning'>You can't get \the [src] to fasten around your thick head!</span>")
// return 0
if(H.wear_mask) if(H.wear_mask)
return 0 return 0
return 1 return 1
@@ -679,6 +682,9 @@ var/list/slot_equipment_priority = list( \
if(slot_wear_suit) if(slot_wear_suit)
if( !(slot_flags & SLOT_OCLOTHING) ) if( !(slot_flags & SLOT_OCLOTHING) )
return 0 return 0
// if(H.species.flags & IS_BULKY)
// to_chat(H, "<span class='warning'>You can't get \the [src] to fit over your bulky exterior!</span>")
// return 0
if(H.wear_suit) if(H.wear_suit)
if(H.wear_suit.canremove) if(H.wear_suit.canremove)
return 2 return 2
@@ -688,6 +694,9 @@ var/list/slot_equipment_priority = list( \
if(slot_gloves) if(slot_gloves)
if( !(slot_flags & SLOT_GLOVES) ) if( !(slot_flags & SLOT_GLOVES) )
return 0 return 0
// if(H.species.flags & IS_BULKY)
// to_chat(H, "<span class='warning'>You can't get \the [src] to fit over your bulky fingers!</span>")
// return 0
if(H.gloves) if(H.gloves)
if(H.gloves.canremove) if(H.gloves.canremove)
return 2 return 2
@@ -697,6 +706,9 @@ var/list/slot_equipment_priority = list( \
if(slot_shoes) if(slot_shoes)
if( !(slot_flags & SLOT_FEET) ) if( !(slot_flags & SLOT_FEET) )
return 0 return 0
// if(H.species.flags & IS_BULKY)
// to_chat(H, "<span class='warning'>You can't get \the [src] to fit over your bulky feet!</span>")
// return 0
if(H.shoes) if(H.shoes)
if(H.shoes.canremove) if(H.shoes.canremove)
return 2 return 2
@@ -748,6 +760,9 @@ var/list/slot_equipment_priority = list( \
return 0 return 0
if((M_FAT in H.mutations) && (H.species && H.species.flags & CAN_BE_FAT) && !(flags & ONESIZEFITSALL)) if((M_FAT in H.mutations) && (H.species && H.species.flags & CAN_BE_FAT) && !(flags & ONESIZEFITSALL))
return 0 return 0
// if(H.species.flags & IS_BULKY && !(flags & ONESIZEFITSALL))
// to_chat(H, "<span class='warning'>You can't get \the [src] to fit over your bulky exterior!</span>")
// return 0
if(H.w_uniform) if(H.w_uniform)
if(H.w_uniform.canremove) if(H.w_uniform.canremove)
return 2 return 2

View File

@@ -37,7 +37,7 @@
else if(has_reagent_in_blood("detcoffee")) else if(has_reagent_in_blood("detcoffee"))
return NOIRMATRIX return NOIRMATRIX
var/datum/organ/internal/eyes/eyes = internal_organs_by_name["eyes"] var/datum/organ/internal/eyes/eyes = internal_organs_by_name["eyes"]
if(eyes.colourmatrix.len && !(eyes.robotic)) if(eyes && eyes.colourmatrix.len && !(eyes.robotic))
return eyes.colourmatrix return eyes.colourmatrix
else return default_colour_matrix else return default_colour_matrix

View File

@@ -56,7 +56,7 @@
name = "Bald" name = "Bald"
icon_state = "bald" icon_state = "bald"
gender = MALE gender = MALE
species_allowed = list("Human","Unathi","Grey","Plasmaman","Skellington") species_allowed = list("Human","Unathi","Grey","Plasmaman","Skellington","Diona","Muton","Golem")
short short
name = "Short Hair" // try to capatilize the names please~ name = "Short Hair" // try to capatilize the names please~
@@ -469,7 +469,7 @@
name = "Shaved" name = "Shaved"
icon_state = "bald" icon_state = "bald"
gender = NEUTER gender = NEUTER
species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Grey","Plasmaman","Skellington") species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Grey","Plasmaman","Skellington","Diona","Muton","Golem")
watson watson
name = "Watson Mustache" name = "Watson Mustache"

View File

@@ -748,6 +748,9 @@ Note that amputating the affected organ does in fact remove the infection from t
if(prob(25)) if(prob(25))
release_restraints() release_restraints()
if(isgolem(owner))
droplimb(1)
return return
/datum/organ/external/proc/robotize() /datum/organ/external/proc/robotize()
@@ -1100,10 +1103,7 @@ Note that amputating the affected organ does in fact remove the infection from t
/datum/organ/external/head/generate_dropped_organ(current_organ) /datum/organ/external/head/generate_dropped_organ(current_organ)
if(!current_organ) if(!current_organ)
if(owner.species.flags & IS_SYNTHETIC) current_organ = new /obj/item/weapon/organ/head(owner.loc, owner)
current_organ = new /obj/item/weapon/organ/head/posi(owner.loc, owner)
else
current_organ = new /obj/item/weapon/organ/head(owner.loc, owner)
var/datum/organ/internal/brain/B = owner.internal_organs_by_name["brain"] var/datum/organ/internal/brain/B = owner.internal_organs_by_name["brain"]
var/obj/item/weapon/organ/head/H = current_organ var/obj/item/weapon/organ/head/H = current_organ
if(B) if(B)

View File

@@ -107,7 +107,7 @@
if(ishuman(user)) if(ishuman(user))
var/mob/living/carbon/human/H=user var/mob/living/carbon/human/H=user
if(golem_check) if(golem_check)
if(user.dna && (user.dna.mutantrace == "adamantine" || user.dna.mutantrace=="coalgolem")) if(isgolem(H) || (H.dna && (H.dna.mutantrace == "adamantine" || H.dna.mutantrace=="coalgolem"))) //leaving the mutantrace checks in just in case
if(display_message) if(display_message)
to_chat(user, "<span class='warning'>Your fat fingers don't fit in the trigger guard!</span>") to_chat(user, "<span class='warning'>Your fat fingers don't fit in the trigger guard!</span>")
return 0 return 0

View File

@@ -542,7 +542,7 @@
AM.forceMove(src) AM.forceMove(src)
if(istype(AM, /mob/living/carbon/human)) if(istype(AM, /mob/living/carbon/human))
var/mob/living/carbon/human/H = AM var/mob/living/carbon/human/H = AM
if((M_FAT in H.mutations) && (H.species && H.species.flags & CAN_BE_FAT)) // is a human and fat? if(((M_FAT in H.mutations) && (H.species && H.species.flags & CAN_BE_FAT)) || H.species.flags & IS_BULKY) // is a human and fat?
has_fat_guy = 1 // set flag on holder has_fat_guy = 1 // set flag on holder
if(istype(AM, /obj/item/delivery/large) && !hasmob) if(istype(AM, /obj/item/delivery/large) && !hasmob)
var/obj/item/delivery/large/T = AM var/obj/item/delivery/large/T = AM

View File

@@ -18,8 +18,6 @@
return 0 return 0
if (affected.status & ORGAN_DESTROYED) if (affected.status & ORGAN_DESTROYED)
return 0 return 0
if (target_zone == "head" && target.species && (target.species.flags & IS_SYNTHETIC))
return 1
if (affected.status & ORGAN_ROBOT) if (affected.status & ORGAN_ROBOT)
return 0 return 0
if (affected.status & ORGAN_PEG) if (affected.status & ORGAN_PEG)

View File

@@ -15,4 +15,5 @@ var/list/adjectives = file2list("config/names/adjectives.txt")
//loaded on startup because of " //loaded on startup because of "
//would include in rsc if ' was used //would include in rsc if ' was used
var/list/vox_name_syllables = list("cha","chi","ha","hi","ka","kah","ki","ta","ti","ya","ya","yi") var/list/vox_name_syllables = list("cha","chi","ha","hi","ka","kah","ki","ta","ti","ya","ya","yi")
var/list/golem_names = file2list("config/names/golem.txt")

View File

@@ -918,7 +918,7 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
#define CAN_BE_FAT 8192 // /vg/ #define CAN_BE_FAT 8192 // /vg/
#define IS_SYNTHETIC 16384 // from baystation #define IS_BULKY 16384 //can't wear exosuits, gloves, masks, or hardsuits
#define NO_SKIN 32768 #define NO_SKIN 32768

BIN
config/names/golem.txt Normal file

Binary file not shown.

View File

@@ -0,0 +1,4 @@
author: Shadowmech88
delete-after: True
changes:
- tweak: Adamantine golems are now a proper race instead of humans in suits. They do not breathe, have no blood, are immune to burn damage, are unaffected by temperature extremes, and are immune to low pressure. They also cannot fire guns, cannot wear gloves, shoes, masks or exosuits, can only wear jumpsuits that fit obese people, and the breaking of a golem's limb results in complete detachment of it.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -1321,6 +1321,7 @@
#include "code\modules\mob\living\carbon\monkey\login.dm" #include "code\modules\mob\living\carbon\monkey\login.dm"
#include "code\modules\mob\living\carbon\monkey\monkey.dm" #include "code\modules\mob\living\carbon\monkey\monkey.dm"
#include "code\modules\mob\living\carbon\monkey\powers.dm" #include "code\modules\mob\living\carbon\monkey\powers.dm"
#include "code\modules\mob\living\carbon\monkey\rock.dm"
#include "code\modules\mob\living\carbon\monkey\say.dm" #include "code\modules\mob\living\carbon\monkey\say.dm"
#include "code\modules\mob\living\carbon\monkey\update_icons.dm" #include "code\modules\mob\living\carbon\monkey\update_icons.dm"
#include "code\modules\mob\living\carbon\monkey\vox.dm" #include "code\modules\mob\living\carbon\monkey\vox.dm"