mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
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:
committed by
clusterfack
parent
cbb4370dac
commit
d8674e9320
@@ -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)
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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()
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|
||||||
|
|||||||
21
code/modules/mob/living/carbon/monkey/rock.dm
Normal file
21
code/modules/mob/living/carbon/monkey/rock.dm
Normal 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"]
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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>")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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")
|
||||||
@@ -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
BIN
config/names/golem.txt
Normal file
Binary file not shown.
4
html/changelogs/Shadowmech88.yml
Normal file
4
html/changelogs/Shadowmech88.yml
Normal 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.
|
||||||
BIN
icons/mob/human_races/r_def_golem.dmi
Normal file
BIN
icons/mob/human_races/r_def_golem.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
BIN
icons/mob/human_races/r_golem.dmi
Normal file
BIN
icons/mob/human_races/r_golem.dmi
Normal file
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 |
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user