Merge pull request #3959 from CollenN/mutrace-final

Finalizes Mutantrace Datum Update
This commit is contained in:
Cheridan
2014-06-20 21:47:54 -05:00
60 changed files with 2219 additions and 1289 deletions
+16 -1
View File
@@ -46,4 +46,19 @@
#define PASSTABLE 1
#define PASSGLASS 2
#define PASSGRILLE 4
#define PASSBLOB 8
#define PASSBLOB 8
//flags for species
#define MUTCOLORS 1
#define HAIR 2
#define FACEHAIR 4
#define EYECOLOR 8
#define LIPS 16
#define COLDRES 32
#define HEATRES 64
#define RADIMMUNE 128
#define NOBREATH 256
#define NOGUNS 512
#define NOBLOOD 1024
#define NOFIRE 2048
+9
View File
@@ -10,6 +10,15 @@
//underwear
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, underwear_all, underwear_m, underwear_f)
//Species
for(var/spath in typesof(/datum/species))
if(spath == /datum/species)
continue
var/datum/species/S = new spath()
if(S.roundstart)
roundstart_species[S.name] = S.type
species_list[S.id] = S.type
//Surgeries
for(var/path in typesof(/datum/surgery))
if(path == /datum/surgery)
+2 -4
View File
@@ -56,10 +56,8 @@ var/list/skin_tones = list(
"african2"
)
var/list/mutant_races = list(
"human",
"lizard",
)
var/global/list/species_list[0]
var/global/list/roundstart_species[0]
proc/age2agedescription(age)
switch(age)
+3
View File
@@ -86,6 +86,7 @@
var/shuttle_refuel_delay = 12000
var/show_game_type_odds = 0 //if set this allows players to see the odds of each roundtype on the get revision screen
var/mutant_races = 0 //players can choose their mutant race before joining the game
var/mutant_colors = 0
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
var/alert_desc_blue_upto = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted."
@@ -388,6 +389,8 @@
config.default_laws = text2num(value)
if("join_with_mutant_race")
config.mutant_races = 1
if("mutant_colors")
config.mutant_colors = 1
else
diary << "Unknown setting in configuration: '[name]'"
+10 -23
View File
@@ -249,12 +249,11 @@ client
body += "<option value='?_src_=vars;godmode=\ref[D]'>Toggle Godmode</option>"
body += "<option value='?_src_=vars;build_mode=\ref[D]'>Toggle Build Mode</option>"
body += "<option value='?_src_=vars;direct_control=\ref[D]'>Assume Direct Control</option>"
body += "<option value='?_src_=vars;make_skeleton=\ref[D]'>Make 2spooky</option>"
body += "<option value='?_src_=vars;drop_everything=\ref[D]'>Drop Everything</option>"
body += "<option value='?_src_=vars;regenerateicons=\ref[D]'>Regenerate Icons</option>"
if(ishuman(D))
body += "<option value>---</option>"
body += "<option value='?_src_=vars;setmutantrace=\ref[D]'>Set Mutantrace</option>"
body += "<option value='?_src_=vars;setspecies=\ref[D]'>Set Species</option>"
body += "<option value='?_src_=vars;makeai=\ref[D]'>Make AI</option>"
body += "<option value='?_src_=vars;makerobot=\ref[D]'>Make cyborg</option>"
body += "<option value='?_src_=vars;makemonkey=\ref[D]'>Make monkey</option>"
@@ -581,17 +580,6 @@ client
if(usr.client)
usr.client.cmd_assume_direct_control(M)
else if(href_list["make_skeleton"])
if(!check_rights(R_FUN)) return
var/mob/living/carbon/human/H = locate(href_list["make_skeleton"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
return
H.makeSkeleton()
href_list["datumrefresh"] = href_list["make_skeleton"]
else if(href_list["delall"])
if(!check_rights(R_DEBUG|R_SERVER)) return
@@ -786,25 +774,24 @@ client
return
holder.Topic(href, list("makeai"=href_list["makeai"]))
else if(href_list["setmutantrace"])
else if(href_list["setspecies"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
var/mob/living/carbon/human/H = locate(href_list["setspecies"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow", "fly", "skeleton")
switch(new_mutantrace)
if(null) return
if("NONE") new_mutantrace = ""
var/result = input(usr, "Please choose a new species","Species") as null|anything in species_list
if(!H)
usr << "Mob doesn't exist anymore"
return
if(H.dna)
H.dna.mutantrace = new_mutantrace
H.update_body()
H.update_hair()
if(result)
var/newtype = species_list[result]
H.dna.species = new newtype()
H.regenerate_icons()
else if(href_list["adjustDamage"] && href_list["mobToDamage"])
if(!check_rights(0)) return
+4 -5
View File
@@ -139,15 +139,14 @@
..()
switch(stage)
if(1)
if(ishuman(affected_mob) && affected_mob.dna && affected_mob.dna.mutantrace == "slime")
if(ishuman(affected_mob) && affected_mob.dna && affected_mob.dna.species.id == "slime")
stage = 5
if(3)
if(ishuman(affected_mob))
var/mob/living/carbon/human/human = affected_mob
if(human.dna && !human.dna.mutantrace)
human.dna.mutantrace = "slime"
human.update_body()
if(human.dna && human.dna.species.id != "slime")
human.dna.species = new /datum/species/slime()
human.update_icons()
/datum/disease/transformation/corgi
name = "The Barkening"
+5 -1
View File
@@ -250,6 +250,10 @@ var/list/blood_splatter_icons = list()
//returns 1 if made bloody, returns 0 otherwise
/atom/proc/add_blood(mob/living/carbon/M)
if(ishuman(M) && M.dna)
var/mob/living/carbon/human/H = M
if(NOBLOOD in H.dna.species.specflags)
return 0
if(rejects_blood())
return 0
if(!istype(M))
@@ -270,7 +274,7 @@ var/list/blood_splatter_icons = list()
//try to find a pre-processed blood-splatter. otherwise, make a new one
var/index = blood_splatter_index()
var/icon/blood_splatter_icon = blood_splatter_icons[index]
if(!blood_splatter_icon )
if(!blood_splatter_icon)
blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object
blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
+17 -12
View File
@@ -20,7 +20,8 @@
var/struc_enzymes
var/uni_identity
var/blood_type
var/mutantrace = null //The type of mutant race the player is if applicable (i.e. potato-man)
var/datum/species/species = new /datum/species/human() //The type of mutant race the player is if applicable (i.e. potato-man)
var/mutant_color = "FFF" // What color you are if you have certain speciess
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
/datum/dna/proc/generate_uni_identity(mob/living/carbon/character)
@@ -30,6 +31,8 @@
L[DNA_GENDER_BLOCK] = construct_block((character.gender!=MALE)+1, 2)
if(istype(character, /mob/living/carbon/human))
var/mob/living/carbon/human/H = character
if(!H.dna.species)
H.dna.species = new /datum/species/human()
L[DNA_HAIR_STYLE_BLOCK] = construct_block(hair_styles_list.Find(H.hair_style), hair_styles_list.len)
L[DNA_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.hair_color)
L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(facial_hair_styles_list.Find(H.facial_hair_style), facial_hair_styles_list.len)
@@ -62,11 +65,17 @@
. += repeat_string(DNA_UNIQUE_ENZYMES_LEN, "0")
return .
/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, mutantrace, blood_type)
/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, mcolor)
if(!istype(owner, /mob/living/carbon/monkey) && !istype(owner, /mob/living/carbon/human))
return
if(!owner.dna)
create_dna(owner)
create_dna(owner, mrace)
if(mrace)
owner.dna.species = new mrace()
if(mcolor)
owner.dna.mutant_color = mcolor
if(real_name)
owner.real_name = real_name
@@ -79,18 +88,13 @@
owner.dna.uni_identity = ui
updateappearance(owner)
var/update_mutantrace = (mutantrace != owner.dna.mutantrace)
owner.dna.mutantrace = mutantrace
if(update_mutantrace && istype(owner, /mob/living/carbon/human))
var/mob/living/carbon/human/H = owner
H.update_body()
H.update_hair()
if(se)
owner.dna.struc_enzymes = se
domutcheck(owner)
check_dna_integrity(owner)
owner.regenerate_icons()
return
/proc/check_dna_integrity(mob/living/carbon/character)
@@ -122,8 +126,9 @@
character.dna.unique_enzymes = character.dna.generate_unique_enzymes(character)
return character.dna
/proc/create_dna(mob/living/carbon/C) //don't use this unless you're about to use hardset_dna or ready_dna
/proc/create_dna(mob/living/carbon/C, datum/species/S) //don't use this unless you're about to use hardset_dna or ready_dna
C.dna = new /datum/dna()
if(S) C.dna.species = new S() // do not remove; this is here to prevent runtimes
/////////////////////////// DNA DATUM
@@ -981,7 +986,7 @@ proc/deconstruct_block(value, values, blocksize=DNA_BLOCK_SIZE)
/datum/dna/proc/is_same_as(var/datum/dna/D)
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name)
if(mutantrace == D.mutantrace && blood_type == D.blood_type)
if(species == D.species && mutant_color == D.mutant_color && blood_type == D.blood_type)
return 1
return 0
@@ -90,7 +90,8 @@
new_dna.uni_identity = T.dna.uni_identity
new_dna.struc_enzymes = T.dna.struc_enzymes
new_dna.real_name = T.dna.real_name
new_dna.mutantrace = T.dna.mutantrace
new_dna.species = T.dna.species
new_dna.mutant_color = T.dna.mutant_color
new_dna.blood_type = T.dna.blood_type
absorbed_dna |= new_dna //And add the target DNA to our absorbed list.
absorbedcount++ //all that done, let's increment the objective counter.
@@ -88,7 +88,7 @@
var/datum/dna/NewDNA = selected_dna
if(ismonkey(target))
user << "<span class='notice'>We stealthily sting [target.name].</span>"
hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.mutantrace, NewDNA.blood_type)
hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species, NewDNA.mutant_color)
updateappearance(target)
feedback_add_details("changeling_powers","TS")
return 1
@@ -8,16 +8,17 @@
max_genetic_damage = 3
//Change our DNA to that of somebody we've absorbed.
/obj/effect/proc_holder/changeling/transform/sting_action(var/mob/living/carbon/user)
/obj/effect/proc_holder/changeling/transform/sting_action(var/mob/living/carbon/human/user)
var/datum/changeling/changeling = user.mind.changeling
var/datum/dna/chosen_dna = changeling.select_dna("Select the target DNA: ", "Target DNA")
if(!chosen_dna)
return
user.dna = chosen_dna
user.real_name = chosen_dna.real_name
user.dna.species = new chosen_dna.species.type(user)
user.dna.mutant_color = chosen_dna.mutant_color
updateappearance(user)
domutcheck(user, null)
+6
View File
@@ -74,8 +74,14 @@
equip_backpack(H)
//Equip the rest of the gear
if(H.dna)
H.dna.species.before_equip_job(src, H)
equip_items(H)
if(H.dna)
H.dna.species.after_equip_job(src, H)
//Equip ID
var/obj/item/weapon/card/id/C = new default_id(H)
C.access = get_access()
-3
View File
@@ -698,9 +698,6 @@ Auto Patrol: []"},
if(istype(perp:wear_suit, /obj/item/clothing/suit/wizrobe))
threatcount += 2
if(perp.dna && perp.dna.mutantrace && perp.dna.mutantrace != "none")
threatcount += 2
//Agent cards lower threatlevel when normal idchecking is off.
if((perp.wear_id && istype(perp:wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) && src.idcheck)
threatcount -= 2
+1 -4
View File
@@ -630,9 +630,6 @@ Auto Patrol: []"},
if(istype(humanperp.head, /obj/item/clothing/head/wizard) || istype(humanperp.head, /obj/item/clothing/head/helmet/space/rig/wizard))
threatcount += 2
if(humanperp.dna && humanperp.dna.mutantrace && humanperp.dna.mutantrace != "none")
threatcount += 2
//Agent cards lower threatlevel.
if(humanperp.wear_id && istype(humanperp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
threatcount -= 2
@@ -789,4 +786,4 @@ Auto Patrol: []"},
overlays -= "hs_arm"
new /obj/item/robot_parts/l_arm(get_turf(src))
user << "<span class='notice'>You remove the robot arm from [src].</span>"
build_step--
build_step--
+5 -2
View File
@@ -123,7 +123,7 @@
//Clonepod
//Start growing a human clone in the pod!
/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/mrace)
/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/mcolor)
if(panel_open)
return 0
if(mess || attempting)
@@ -188,7 +188,8 @@
// -- End mode specific stuff
hardset_dna(H, ui, se, null, mrace)
hardset_dna(H, ui, se, null, null, mrace, mcolor)
if(efficiency > 2)
for(var/A in bad_se_blocks)
setblock(H.dna.struc_enzymes, A, construct_block(0,2))
@@ -203,6 +204,8 @@
H.facial_hair_style = "Shaved"
H.hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
H.regenerate_icons()
H.suiciding = 0
src.attempting = 0
return 1
+6 -5
View File
@@ -34,7 +34,7 @@
if(!(pod1.occupant || pod1.mess) && (pod1.efficiency > 5))
for(var/datum/data/record/R in records)
if(!(pod1.occupant || pod1.mess))
if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"]))
if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["mcolor"]))
records -= R
/obj/machinery/computer/cloning/proc/updatemodules()
@@ -328,7 +328,7 @@
temp = "<font class='bad'>Clonepod malfunction.</font>"
else if(!config.revival_cloning)
temp = "<font class='bad'>Unable to initiate cloning cycle.</font>"
else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"]))
else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["mcolor"]))
temp = "[C.fields["name"]] => <font class='good'>Cloning cycle in progress...</font>"
records.Remove(C)
if(active_record == C)
@@ -368,10 +368,10 @@
return
var/datum/data/record/R = new()
if(subject.dna)
R.fields["mrace"] = subject.dna.mutantrace
if(subject.dna.species)
R.fields["mrace"] = subject.dna.species.type
else
R.fields["mrace"] = null
R.fields["mrace"] = /datum/species/human
R.fields["ckey"] = subject.ckey
R.fields["name"] = subject.real_name
R.fields["id"] = copytext(md5(subject.real_name), 2, 6)
@@ -379,6 +379,7 @@
R.fields["UI"] = subject.dna.uni_identity
R.fields["SE"] = subject.dna.struc_enzymes
R.fields["blood_type"] = subject.dna.blood_type
R.fields["mcolor"] = subject.dna.mutant_color
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
+3 -4
View File
@@ -247,11 +247,10 @@
if(prob(30 - (accurate * 10))) //oh dear a problem
if(ishuman(M))//don't remove people from the round randomly you jerks
var/mob/living/carbon/human/human = M
if(human.dna && !human.dna.mutantrace)
if(human.dna && human.dna.species.id == "human")
M << "<span class='danger'>You hear a buzzing in your ears.</span>"
human.dna.mutantrace = "fly"
human.update_body()
human.update_hair()
human.dna.species = new /datum/species/fly()
human.regenerate_icons()
human.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), IRRADIATE, 0)
return
+2
View File
@@ -32,6 +32,8 @@
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
var/reflect_chance = 0 //This var dictates what % of a time an object will reflect an energy based weapon's shot
var/list/species_exception = list() // even if a species cannot put items in a certain slot, if the species id is in the item's exception list, it will be able to wear that item
/obj/item/device
icon = 'icons/obj/device.dmi'
@@ -81,10 +81,10 @@
if(user.has_mutation(HULK))
user << "<span class='warning'>Your meaty finger is too large for the button!</span>"
return
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.is_mutantrace("adamantine"))
user << "<span class='warning'>Your metal fingers can't press the button!</span>"
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.dna && NOGUNS in H.dna.species.specflags)
user << "<span class='warning'>Your fingers can't press the button!</span>"
return
add_fingerprint(user)
+7 -2
View File
@@ -108,9 +108,14 @@ MASS SPECTROMETER
mob_status = "<font color='red'>Deceased</font>"
oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [mob_status]</span>", 1)
user.show_message(text("<span class='notice'>Analyzing Results for []:\n\t Overall Status: []</span>", M, mob_status), 1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.dna)// Show target's species, if they have one
user.show_message("<span class='notice'>Species: <b>[H.dna.species.name]</b></span>", 1)
else // Otherwise we can assume that they are a regular human
user.show_message("<span class='notice'>Species: <b>Human</b></span>", 1)
user.show_message("<span class='notice'>\t Damage Specifics: <font color='blue'>[oxy_loss]</font>-<font color='green'>[tox_loss]</font>-<font color='#FF8000'>[fire_loss]</font>-<font color='red'>[brute_loss]</font></span>", 1)
user.show_message("<span class='notice'>Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FF8000'>Burn</font>/<font color='red'>Brute</font></span>", 1)
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)</span>", 1)
@@ -89,20 +89,20 @@
user.see_in_dark = 8
user.see_invisible = SEE_INVISIBLE_LEVEL_TWO
user << "\blue The walls suddenly disappear."
user.dna.mutantrace = "shadow"
user.update_body()
user.dna.species = new /datum/species/shadow()
user.regenerate_icons()
if("Wealth")
user << "<B>Your wish is granted, but at a terrible cost...</B>"
user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart."
new /obj/structure/closet/syndicate/resources/everything(loc)
user.dna.mutantrace = "shadow"
user.update_body()
user.dna.species = new /datum/species/shadow()
user.regenerate_icons()
if("Immortality")
user << "<B>Your wish is granted, but at a terrible cost...</B>"
user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart."
user.verbs += /mob/living/carbon/proc/immortality
user.dna.mutantrace = "shadow"
user.update_body()
user.dna.species = new /datum/species/shadow()
user.regenerate_icons()
if("To Kill")
user << "<B>Your wish is granted, but at a terrible cost...</B>"
user << "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart."
@@ -116,8 +116,8 @@
for(var/datum/objective/OBJ in user.mind.objectives)
user << "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]"
obj_count++
user.dna.mutantrace = "shadow"
user.update_body()
user.dna.species = new /datum/species/shadow()
user.regenerate_icons()
if("Peace")
user << "<B>Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.</B>"
user << "You feel as if you just narrowly avoided a terrible fate..."
+43 -12
View File
@@ -53,7 +53,8 @@ datum/preferences
var/facial_hair_color = "000" //Facial hair color
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/mutant_race = "human" //Mutant race
var/datum/species/pref_species = new /datum/species/human() //Mutant race
var/mutant_color = "FFF" //Mutant race skin color
//Mob preview
var/icon/preview_icon_front = null
@@ -165,16 +166,17 @@ datum/preferences
dat += "<table width='100%'><tr><td width='24%' valign='top'>"
if(config.mutant_races)
dat += "<b>Mutant Race:</b><BR><a href='?_src_=prefs;preference=mutant_race;task=input'>[mutant_race]</a><BR>"
dat += "<b>Species:</b><BR><a href='?_src_=prefs;preference=species;task=input'>[pref_species.name]</a><BR>"
else
dat += "<b>Mutant Race:</b> Human<BR>"
dat += "<b>Species:</b> Human<BR>"
dat += "<b>Blood Type:</b> [blood_type]<BR>"
dat += "<b>Skin Tone:</b><BR><a href='?_src_=prefs;preference=s_tone;task=input'>[skin_tone]</a><BR>"
dat += "<b>Underwear:</b><BR><a href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a><BR>"
dat += "<b>Backpack:</b><BR><a href ='?_src_=prefs;preference=bag;task=input'>[backbaglist[backbag]]</a><BR>"
dat += "</td><td valign='top' width='28%'>"
dat += "</td><td valign='top' width='21%'>"
dat += "<h3>Hair Style</h3>"
@@ -182,7 +184,7 @@ datum/preferences
dat += "<span style='border:1px solid #161616; background-color: #[hair_color];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=hair;task=input'>Change</a><BR>"
dat += "</td><td valign='top' width='28%'>"
dat += "</td><td valign='top' width='21%'>"
dat += "<h3>Facial Hair Style</h3>"
@@ -190,12 +192,17 @@ datum/preferences
dat += "<span style='border: 1px solid #161616; background-color: #[facial_hair_color];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=facial;task=input'>Change</a><BR>"
dat += "</td><td valign='top'>"
dat += "</td><td valign='top' width='21%'>"
dat += "<h3>Eye Color</h3>"
dat += "<span style='border: 1px solid #161616; background-color: #[eye_color];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=eyes;task=input'>Change</a><BR>"
dat += "</td><td valign='top' width='21%'>"
dat += "<h3>Alien Color</h3>" // even if choosing your mutantrace is off, this is here in case you gain one during a round
dat += "<span style='border: 1px solid #161616; background-color: #[mutant_color];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=mutant_color;task=input'>Change</a><BR>"
dat += "</td></tr></table>"
@@ -618,10 +625,27 @@ datum/preferences
if(new_eyes)
eye_color = sanitize_hexcolor(new_eyes)
if("mutant_race")
var/new_mutant_race = input(user, "Choose your character's mutant race:", "Character Preference") as null|anything in mutant_races
if(new_mutant_race)
mutant_race = new_mutant_race
if("species")
var/result = input(user, "Select a species", "Species Selection") as null|anything in roundstart_species
if(result)
var/newtype = roundstart_species[result]
pref_species = new newtype()
if(!config.mutant_colors)
mutant_color = pref_species.default_color
if("mutant_color")
if(!config.mutant_colors)
user << "<span class='danger'>Alien colors are disabled.</span>"
return
var/new_mutantcolor = input(user, "Choose your character's alien skin color:", "Character Preference") as color|null
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
mutant_color = sanitize_hexcolor(new_mutantcolor)
else
user << "<span class='danger'>Invalid color. Your color is not bright enough.</span>"
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones
@@ -685,8 +709,10 @@ datum/preferences
if("ghost_sight")
toggles ^= CHAT_GHOSTSIGHT
if("pull_requests")
toggles ^= CHAT_PULLR
if("save")
save_preferences()
save_character()
@@ -722,10 +748,15 @@ datum/preferences
character.real_name = real_name
character.name = character.real_name
if(character.dna)
character.dna.real_name = character.real_name
if(mutant_race != "human" && config.mutant_races)
character.dna.mutantrace = mutant_race
if(pref_species != /datum/species/human && config.mutant_races)
character.dna.species = new pref_species.type()
else
character.dna.species = new /datum/species/human()
character.dna.mutant_color = mutant_color
character.update_mutcolor()
character.gender = gender
character.age = age
+12 -3
View File
@@ -73,6 +73,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(11) underwear = "Ladies Kinky"
if(12) underwear = "Tankini"
if(13) underwear = "Nude"
if(!(pref_species in species_list))
pref_species = new /datum/species/human()
return
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
@@ -151,6 +153,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(needs_update == -2) //fatal, can't load any data
return 0
if(!S["species"] || !config.mutant_races)
S["species"] << new /datum/species/human()
//Character
S["OOC_Notes"] >> metadata
S["real_name"] >> real_name
@@ -165,7 +170,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["facial_style_name"] >> facial_hair_style
S["underwear"] >> underwear
S["backbag"] >> backbag
S["mutant_race"] >> mutant_race
S["species"] >> pref_species
S["mutant_color"] >> mutant_color
//Jobs
S["userandomjob"] >> userandomjob
@@ -186,6 +192,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name)
if(!(pref_species in species_list))
pref_species = new /datum/species/human()
if(!real_name) real_name = random_name(gender)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
gender = sanitize_gender(gender)
@@ -203,7 +211,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, skin_tones)
backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
mutant_race = sanitize_text(mutant_race, initial(mutant_race))
mutant_color = sanitize_hexcolor(mutant_color, 3, 0)
userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
@@ -240,7 +248,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["facial_style_name"] << facial_hair_style
S["underwear"] << underwear
S["backbag"] << backbag
S["mutant_race"] << mutant_race
S["species"] << pref_species
S["mutant_color"] << mutant_color
//Jobs
S["userandomjob"] << userandomjob
+1
View File
@@ -3,6 +3,7 @@
desc = "Because you really needed another excuse to punch your crewmates."
icon_state = "boxing"
item_state = "boxing"
species_exception = list(/datum/species/golem, /datum/species/golem/adamantine) // now you too can be a golem boxing champion
/obj/item/clothing/gloves/boxing/green
icon_state = "boxinggreen"
+2 -2
View File
@@ -9,9 +9,9 @@
/datum/round_event/spooky/start()
for(var/mob/living/carbon/human/H in mob_list)
if(H.dna)
hardset_dna(H, null, null, null, "skeleton")
hardset_dna(H, null, null, null, null, /datum/species/skeleton)
for(var/mob/living/simple_animal/corgi/Ian/Ian in mob_list)
Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian))
/datum/round_event/spooky/announce()
priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE")
priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE")
+1 -1
View File
@@ -909,7 +909,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
podman.gender = ghost.gender
//dna stuff
hardset_dna(podman, ui, se, null, !prob(potency) ? "plant" : null) //makes sure podman has dna and sets the dna's ui/se/mutantrace/real_name etc variables
hardset_dna(podman, ui, se, null, null, null, !prob(potency) ? /datum/species/plant/pod : null, "#59CE00") //makes sure podman has dna and sets the dna's ui/se/mutantrace/real_name etc variables
else //else, one packet of seeds. maybe two
var/seed_count = 1
+1 -8
View File
@@ -205,7 +205,7 @@
src << "<span class='info'>You're completely exhausted.</span>"
else
src << "<span class='info'>You feel fatigued.</span>"
if(dna && (dna.mutantrace == "skeleton") && !H.w_uniform && !H.wear_suit)
if(dna && (dna.species == /datum/species/skeleton) && !H.w_uniform && !H.wear_suit)
H.play_xylophone()
else
if(ishuman(src))
@@ -458,13 +458,6 @@
..(message, bubble_type)
/mob/living/carbon/proc/is_mutantrace(var/mrace)
if(mrace)
if(src.dna && src.dna.mutantrace == mrace)
return 1
else
return src.dna && src.dna.mutantrace ? 1 : 0
/mob/living/carbon/getTrail()
if(getBruteLoss() < 300)
if(prob(50))
@@ -8,7 +8,10 @@
..()
/mob/living/carbon/human/spawn_gibs()
hgibs(loc, viruses, dna)
if(dna)
hgibs(loc, viruses, dna)
else
hgibs(loc, viruses, null)
/mob/living/carbon/human/spawn_dust()
new /obj/effect/decal/remains/human(loc)
@@ -31,6 +34,9 @@
update_canmove()
if(client) blind.layer = 0
if(dna)
dna.species.spec_death(gibbed,src)
tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0)
if(ticker && ticker.mode)
@@ -40,11 +46,9 @@
return ..(gibbed)
/mob/living/carbon/human/proc/makeSkeleton()
if(!check_dna_integrity(src) || (dna.mutantrace == "skeleton")) return
dna.mutantrace = "skeleton"
if(!check_dna_integrity(src)) return
status_flags |= DISFIGURED
update_hair()
update_body()
dna.species = new /datum/species/skeleton(src)
return 1
/mob/living/carbon/proc/ChangeToHusk()
+21 -2
View File
@@ -341,7 +341,7 @@
dat += "<BR><font color=grey><B>Uniform:</B> Obscured by [wear_suit]</font>"
else
dat += "<BR><B>Uniform:</B> <A href='?src=\ref[src];item=[slot_w_uniform]'> [(w_uniform && !(w_uniform.flags&ABSTRACT)) ? w_uniform : "<font color=grey>Empty</font>"]</A>"
if(w_uniform)
if(w_uniform || dna.species.nojumpsuit)
dat += "<BR>[TAB]&#8627;<B>Belt:</B> <A href='?src=\ref[src];item=[slot_belt]'> [(belt && !(belt.flags&ABSTRACT)) ? belt : "<font color=grey>Empty</font>"]</A>"
if(has_breathable_mask && istype(belt, /obj/item/weapon/tank))
dat += "<BR>[TAB][TAB]&#8627;<A href='?src=\ref[src];internal=[slot_belt]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
@@ -349,12 +349,31 @@
dat += " <A href='?src=\ref[src];pockets=right'>[(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "<font color=grey>Right (Empty)</font>"]</A>"
dat += "<BR>[TAB]&#8627;<B>ID:</B> <A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "<font color=grey>Empty</font>"]</A>"
if(dna)
if(dna.species.nojumpsuit)
dat += "<BR><B>ID:</B> <A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Nothing"]</A>"
else if(w_uniform)
dat += "<BR><B>ID:</B> <A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Nothing"]</A>"
else if(w_uniform)
dat += "<BR><B>ID:</B> <A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Nothing"]</A>"
dat += "<BR>"
if(handcuffed)
dat += "<BR><B>Handcuffed:</B> <A href='?src=\ref[src];item=[slot_handcuffed]'>Remove</A>"
if(legcuffed)
dat += "<BR><B>Legcuffed:</B> <A href='?src=\ref[src];item=[slot_legcuffed]'>Remove</A>"
dat += "<BR><A href='?src=\ref[src];item=[slot_legcuffed]'>Legcuffed</A>"
if(dna)
if(dna.species.nojumpsuit)
dat += "<BR><BR><A href='?src=\ref[src];pockets=left'>Left Pocket ([(l_store && !(l_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
dat += " - <A href='?src=\ref[src];pockets=right'>Right Pocket ([(r_store && !(r_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
else if(w_uniform)
dat += "<BR><BR><A href='?src=\ref[src];pockets=left'>Left Pocket ([(l_store && !(l_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
dat += " - <A href='?src=\ref[src];pockets=right'>Right Pocket ([(r_store && !(r_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
else if(w_uniform)
dat += "<BR><BR><A href='?src=\ref[src];pockets=left'>Left Pocket ([(l_store && !(l_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
dat += " - <A href='?src=\ref[src];pockets=right'>Right Pocket ([(r_store && !(r_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
dat += {"
<BR>
@@ -2,163 +2,9 @@
if(..()) //to allow surgery to return properly.
return
if((M != src) && check_shields(0, M.name))
add_logs(M, src, "attempted to touch")
visible_message("<span class='warning'>[M] attempted to touch [src]!</span>")
return 0
if(dna)
dna.species.spec_attack_hand(M, src)
switch(M.a_intent)
if("help")
if(health >= 0)
help_shake_act(M)
if(src != M)
add_logs(M, src, "shaked")
return 1
//CPR
if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
M << "<span class='notice'>Remove your mask!</span>"
return 0
if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
M << "<span class='notice'>Remove their mask!</span>"
return 0
if(cpr_time < world.time + 30)
add_logs(src, M, "CPRed")
visible_message("<span class='notice'>[M] is trying to perform CPR on [src]!</span>")
if(!do_mob(M, src))
return 0
if((health >= -99 && health <= 0))
cpr_time = world.time
var/suff = min(getOxyLoss(), 7)
adjustOxyLoss(-suff)
updatehealth()
M.visible_message("[M] performs CPR on [src]!")
src << "<span class='unconscious'>You feel a breath of fresh air enter your lungs. It feels good.</span>"
if("grab")
if(M == src || anchored)
return 0
add_logs(M, src, "grabbed", addition="passively")
if(w_uniform)
w_uniform.add_fingerprint(M)
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
if(buckled)
M << "<span class='notice'>You cannot grab [src], \he is buckled in!</span>"
if(!G) //the grab will delete itself in New if affecting is anchored
return
M.put_in_active_hand(G)
G.synch()
LAssailant = M
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("<span class='warning'>[M] has grabbed [src] passively!</span>")
return 1
if("harm")
add_logs(M, src, "punched")
var/attack_verb = "punch"
if(lying)
attack_verb = "kick"
else if(M.dna)
switch(M.dna.mutantrace)
if("lizard")
attack_verb = "scratch"
if("plant")
attack_verb = "slash"
var/damage = rand(0, 9)
if(!damage)
switch(attack_verb)
if("slash")
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
else
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='warning'>[M] has attempted to [attack_verb] [src]!</span>")
return 0
var/obj/item/organ/limb/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
if(HULK in M.mutations)
damage += 5
switch(attack_verb)
if("slash")
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
else
playsound(loc, "punch", 25, 1, -1)
visible_message("<span class='danger'>[M] has [attack_verb]ed [src]!</span>", \
"<span class='userdanger'>[M] has [attack_verb]ed [src]!</span>")
apply_damage(damage, BRUTE, affecting, armor_block)
if((stat != DEAD) && damage >= 9)
visible_message("<span class='danger'>[M] has weakened [src]!</span>", \
"<span class='userdanger'>[M] has weakened [src]!</span>")
apply_effect(4, WEAKEN, armor_block)
forcesay(hit_appends)
else if(lying)
forcesay(hit_appends)
if("disarm")
add_logs(M, src, "disarmed")
if(w_uniform)
w_uniform.add_fingerprint(M)
var/obj/item/organ/limb/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/randn = rand(1, 100)
if(randn <= 25)
apply_effect(2, WEAKEN, run_armor_check(affecting, "melee"))
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("<span class='danger'>[M] has pushed [src]!</span>",
"<span class='userdanger'>[M] has pushed [src]!</span>")
forcesay(hit_appends)
return
var/talked = 0 // BubbleWrap
if(randn <= 60)
//BubbleWrap: Disarming breaks a pull
if(pulling)
visible_message("<span class='warning'>[M] has broken [src]'s grip on [pulling]!</span>")
talked = 1
stop_pulling()
//BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it?
if(istype(l_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/lgrab = l_hand
if(lgrab.affecting)
visible_message("<span class='warning'>[M] has broken [src]'s grip on [lgrab.affecting]!</span>")
talked = 1
spawn(1)
qdel(lgrab)
if(istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/rgrab = r_hand
if(rgrab.affecting)
visible_message("<span class='warning'>[M] has broken [src]'s grip on [rgrab.affecting]!</span>")
talked = 1
spawn(1)
qdel(rgrab)
//End BubbleWrap
if(!talked) //BubbleWrap
if(drop_item())
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
"<span class='userdanger'>[M] has disarmed [src]!</span>")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
return
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] attempted to disarm [src]!</span>", \
"<span class='userdanger'>[M] attemped to disarm [src]!</span>")
return
/mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params)
@@ -102,6 +102,7 @@ mob/living/carbon/human/proc/hat_fall_prob()
var/obj/item/organ/limb/picked = pick(parts)
if(picked.take_damage(brute,burn))
update_damage_overlays(0)
updatehealth()
@@ -128,6 +129,7 @@ mob/living/carbon/human/proc/hat_fall_prob()
// damage MANY external organs, in random order
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn)
if(status_flags & GODMODE) return //godmode
var/list/obj/item/organ/limb/parts = get_damageable_organs()
var/update = 0
while(parts.len && (brute>0 || burn>0) )
@@ -143,7 +145,9 @@ mob/living/carbon/human/proc/hat_fall_prob()
burn -= (picked.burn_dam - burn_was)
parts -= picked
updatehealth()
if(update) update_damage_overlays(0)
@@ -159,34 +163,38 @@ mob/living/carbon/human/proc/hat_fall_prob()
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0)
if((damagetype != BRUTE) && (damagetype != BURN))
..(damage, damagetype, def_zone, blocked)
return 1
blocked = (100-blocked)/100
if(blocked <= 0) return 0
var/obj/item/organ/limb/organ = null
if(isorgan(def_zone))
organ = def_zone
if(dna) // if you have a species, it will run the apply_damage code there instead
dna.species.apply_damage(damage, damagetype, def_zone, blocked, src)
else
if(!def_zone) def_zone = ran_zone(def_zone)
organ = get_organ(check_zone(def_zone))
if(!organ) return 0
if((damagetype != BRUTE) && (damagetype != BURN))
..(damage, damagetype, def_zone, blocked)
return 1
damage = (damage * blocked)
else
blocked = (100-blocked)/100
if(blocked <= 0) return 0
switch(damagetype)
if(BRUTE)
damageoverlaytemp = 20
if(organ.take_damage(damage, 0))
update_damage_overlays(0)
if(BURN)
damageoverlaytemp = 20
if(organ.take_damage(0, damage))
update_damage_overlays(0)
var/obj/item/organ/limb/organ = null
if(isorgan(def_zone))
organ = def_zone
else
if(!def_zone) def_zone = ran_zone(def_zone)
organ = get_organ(check_zone(def_zone))
if(!organ) return 0
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
damage = (damage * blocked)
updatehealth()
switch(damagetype)
if(BRUTE)
damageoverlaytemp = 20
if(organ.take_damage(damage, 0))
update_damage_overlays(0)
if(BURN)
damageoverlaytemp = 20
if(organ.take_damage(0, damage))
update_damage_overlays(0)
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
updatehealth()
return 1
@@ -36,6 +36,11 @@ emp_act
protection += C.armor[type]
return protection
/mob/living/carbon/human/on_hit(proj_type)
if(dna)
dna.species.on_hit(proj_type, src)
return
/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone)
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
if(check_reflect(def_zone)) // Checks if you've passed a reflection% check
@@ -118,94 +123,93 @@ emp_act
/mob/living/carbon/human/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
var/obj/item/organ/limb/target_limb = get_organ(user.zone_sel.selecting)
var/obj/item/organ/limb/affecting = get_organ(ran_zone(user.zone_sel.selecting))
var/hit_area = parse_zone(affecting.name)
var/target_area = parse_zone(target_limb.name)
if((user != src) && check_shields(I.force, "the [I.name]"))
return 0
if(dna) // allows your species to affect the attacked_by code
return dna.species.spec_attacked_by(I,user,def_zone,affecting,hit_area,src.a_intent,target_limb,target_area,src)
if(I.attack_verb && I.attack_verb.len)
visible_message("<span class='danger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!</span>", \
"<span class='userdanger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!</span>")
else if(I.force)
visible_message("<span class='danger'>[src] has been attacked in the [hit_area] with [I] by [user]!</span>", \
"<span class='userdanger'>[src] has been attacked in the [hit_area] with [I] by [user]!</span>")
else
return 0
if((user != src) && check_shields(I.force, "the [I.name]"))
return 0
var/armor = run_armor_check(affecting, "melee", "<span class='warning'>Your armour has protected your [hit_area].</span>", "<span class='warning'>Your armour has softened a hit to your [hit_area].</span>")
if(armor >= 100) return 0
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
if(I.attack_verb && I.attack_verb.len)
visible_message("<span class='danger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!</span>", \
"<span class='userdanger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!</span>")
else if(I.force)
visible_message("<span class='danger'>[src] has been attacked in the [hit_area] with [I] by [user]!</span>", \
"<span class='userdanger'>[src] has been attacked in the [hit_area] with [I] by [user]!</span>")
else
return 0
apply_damage(I.force, I.damtype, affecting, armor , I)
var/armor = run_armor_check(affecting, "melee", "<span class='warning'>Your armour has protected your [hit_area].</span>", "<span class='warning'>Your armour has softened a hit to your [hit_area].</span>")
if(armor >= 100) return 0
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
var/bloody = 0
if(((I.damtype == BRUTE) && prob(25 + (I.force * 2))))
if(affecting.status == ORGAN_ORGANIC)
I.add_blood(src) //Make the weapon bloody, not the person.
if(prob(I.force * 2)) //blood spatter!
bloody = 1
var/turf/location = loc
if(istype(location, /turf/simulated))
location.add_blood(src)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood
if(H.wear_suit)
H.wear_suit.add_blood(src)
H.update_inv_wear_suit(0) //updates mob overlays to show the new blood (no refresh)
else if(H.w_uniform)
H.w_uniform.add_blood(src)
H.update_inv_w_uniform(0) //updates mob overlays to show the new blood (no refresh)
if (H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
G.add_blood(H)
else
H.add_blood(H)
H.update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves
apply_damage(I.force, I.damtype, affecting, armor , I)
var/bloody = 0
if(((I.damtype == BRUTE) && prob(25 + (I.force * 2))))
if(affecting.status == ORGAN_ORGANIC)
I.add_blood(src) //Make the weapon bloody, not the person.
if(prob(I.force * 2)) //blood spatter!
bloody = 1
var/turf/location = loc
if(istype(location, /turf/simulated))
location.add_blood(src)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood
if(H.wear_suit)
H.wear_suit.add_blood(src)
H.update_inv_wear_suit(0) //updates mob overlays to show the new blood (no refresh)
else if(H.w_uniform)
H.w_uniform.add_blood(src)
H.update_inv_w_uniform(0) //updates mob overlays to show the new blood (no refresh)
if (H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
G.add_blood(H)
else
H.add_blood(H)
H.update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves
switch(hit_area)
if("head") //Harder to score a stun but if you do it lasts a bit longer
if(stat == CONSCIOUS && prob(I.force))
if(Iforce >= 5)
switch(hit_area)
if("head") //Harder to score a stun but if you do it lasts a bit longer
if(stat == CONSCIOUS && prob(I.force))
visible_message("<span class='danger'>[src] has been knocked unconscious!</span>", \
"<span class='userdanger'>[src] has been knocked unconscious!</span>")
apply_effect(20, PARALYZE, armor)
if(src != user && I.damtype == BRUTE)
ticker.mode.remove_revolutionary(mind)
if(bloody) //Apply blood
if(wear_mask)
wear_mask.add_blood(src)
update_inv_wear_mask(0)
if(head)
head.add_blood(src)
update_inv_head(0)
if(glasses && prob(33))
glasses.add_blood(src)
update_inv_glasses(0)
if(bloody) //Apply blood
if(wear_mask)
wear_mask.add_blood(src)
update_inv_wear_mask(0)
if(head)
head.add_blood(src)
update_inv_head(0)
if(glasses && prob(33))
glasses.add_blood(src)
update_inv_glasses(0)
if("chest") //Easier to score a stun but lasts less time
if(stat == CONSCIOUS && prob(I.force + 10))
if(Iforce >= 5)
if("chest") //Easier to score a stun but lasts less time
if(stat == CONSCIOUS && prob(I.force + 10))
visible_message("<span class='danger'>[src] has been knocked down!</span>", \
"<span class='userdanger'>[src] has been knocked down!</span>")
apply_effect(5, WEAKEN, armor)
if(bloody)
if(wear_suit)
wear_suit.add_blood(src)
update_inv_wear_suit(0)
if(w_uniform)
w_uniform.add_blood(src)
update_inv_w_uniform(0)
if(Iforce > 10 || Iforce >= 5 && prob(33))
forcesay(hit_appends) //forcesay checks stat already.
if(bloody)
if(wear_suit)
wear_suit.add_blood(src)
update_inv_wear_suit(0)
if(w_uniform)
w_uniform.add_blood(src)
update_inv_w_uniform(0)
if(Iforce > 10 || Iforce >= 5 && prob(33))
forcesay(hit_appends) //forcesay checks stat already
/mob/living/carbon/human/emp_act(severity)
var/informed = 0
@@ -34,7 +34,7 @@
var/obj/item/l_store = null
var/obj/item/s_store = null
var/base_icon_state = "caucasian1_m"
var/icon/base_icon_state = "caucasian1_m"
var/list/organs = list() //Gets filled up in the constructor (human.dm, New() proc, line 24. I'm sick and tired of missing comments. -Agouri
@@ -119,4 +119,11 @@
return 1//Humans can use guns and such
/mob/living/carbon/human/InCritical()
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
/mob/living/carbon/human/reagent_check(datum/reagent/R)
if(dna)
var/bypass = dna.species.handle_chemicals(R,src)
return bypass // if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species.
else
return 0
@@ -1,29 +1,6 @@
/mob/living/carbon/human/movement_delay()
if(!has_gravity(src))
return -1 //It's hard to be slowed down in space by... anything
else if(status_flags & GOTTAGOFAST)
return -1
. = 0
var/health_deficiency = (100 - health + staminaloss)
if(health_deficiency >= 40)
. += (health_deficiency / 25)
var/hungry = (500 - nutrition) / 5 //So overeat would be 100 and default level would be 80
if(hungry >= 70)
. += hungry / 50
if(wear_suit)
. += wear_suit.slowdown
if(shoes)
. += shoes.slowdown
if(back)
. += back.slowdown
if(FAT in mutations)
. += 1.5
if(bodytemperature < 283.222)
. += (283.222 - bodytemperature) / 10 * 1.75
if(dna)
. += dna.species.movement_delay(src)
. += ..()
. += config.human_delay
+149 -147
View File
@@ -1,153 +1,156 @@
/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0)
switch(slot)
if(slot_l_hand)
if(l_hand)
return 0
return 1
if(slot_r_hand)
if(r_hand)
return 0
return 1
if(slot_wear_mask)
if(wear_mask)
return 0
if( !(I.slot_flags & SLOT_MASK) )
return 0
return 1
if(slot_back)
if(back)
return 0
if( !(I.slot_flags & SLOT_BACK) )
return 0
return 1
if(slot_wear_suit)
if(wear_suit)
return 0
if( !(I.slot_flags & SLOT_OCLOTHING) )
return 0
return 1
if(slot_gloves)
if(gloves)
return 0
if( !(I.slot_flags & SLOT_GLOVES) )
return 0
return 1
if(slot_shoes)
if(shoes)
return 0
if( !(I.slot_flags & SLOT_FEET) )
return 0
return 1
if(slot_belt)
if(belt)
return 0
if(!w_uniform)
if(!disable_warning)
src << "\red You need a jumpsuit before you can attach this [I.name]."
return 0
if( !(I.slot_flags & SLOT_BELT) )
return
return 1
if(slot_glasses)
if(glasses)
return 0
if( !(I.slot_flags & SLOT_EYES) )
return 0
return 1
if(slot_head)
if(head)
return 0
if( !(I.slot_flags & SLOT_HEAD) )
return 0
return 1
if(slot_ears)
if(ears)
return 0
if( !(I.slot_flags & SLOT_EARS) )
return 0
return 1
if(slot_w_uniform)
if(w_uniform)
return 0
if( !(I.slot_flags & SLOT_ICLOTHING) )
return 0
return 1
if(slot_wear_id)
if(wear_id)
return 0
if(!w_uniform)
if(!disable_warning)
src << "\red You need a jumpsuit before you can attach this [I.name]."
return 0
if( !(I.slot_flags & SLOT_ID) )
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)
src << "\red You need a jumpsuit before you can attach this [I.name]."
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return
if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) )
if(dna)
return dna.species.can_equip(I, slot, disable_warning, src)
else
switch(slot)
if(slot_l_hand)
if(l_hand)
return 0
return 1
if(slot_r_store)
if(I.flags & NODROP)
return 0
if(r_store)
return 0
if(!w_uniform)
if(!disable_warning)
src << "\red You need a jumpsuit before you can attach this [I.name]."
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return 0
if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) )
if(slot_r_hand)
if(r_hand)
return 0
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)
src << "\red You need a suit before you can attach this [I.name]."
return 0
if(!wear_suit.allowed)
if(!disable_warning)
usr << "You somehow have a suit with no defined allowed items for suit storage, stop that." //should be src?
return 0
if(I.w_class > 4)
if(!disable_warning)
usr << "The [I.name] is too big to attach." //should be src?
return 0
if( istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, wear_suit.allowed) ) //ugly and un-polymorphic.
if(slot_wear_mask)
if(wear_mask)
return 0
if( !(I.slot_flags & SLOT_MASK) )
return 0
return 1
return 0
if(slot_handcuffed)
if(handcuffed)
return 0
if(!istype(I, /obj/item/weapon/handcuffs))
return 0
return 1
if(slot_legcuffed)
if(legcuffed)
return 0
if(!istype(I, /obj/item/weapon/legcuffs))
return 0
return 1
if(slot_in_backpack)
if (back && istype(back, /obj/item/weapon/storage/backpack))
var/obj/item/weapon/storage/backpack/B = back
if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class)
if(slot_back)
if(back)
return 0
if( !(I.slot_flags & SLOT_BACK) )
return 0
return 1
if(slot_wear_suit)
if(wear_suit)
return 0
if( !(I.slot_flags & SLOT_OCLOTHING) )
return 0
return 1
if(slot_gloves)
if(gloves)
return 0
if( !(I.slot_flags & SLOT_GLOVES) )
return 0
return 1
if(slot_shoes)
if(shoes)
return 0
if( !(I.slot_flags & SLOT_FEET) )
return 0
return 1
if(slot_belt)
if(belt)
return 0
if(!w_uniform)
if(!disable_warning)
src << "\red You need a jumpsuit before you can attach this [I.name]."
return 0
if( !(I.slot_flags & SLOT_BELT) )
return
return 1
if(slot_glasses)
if(glasses)
return 0
if( !(I.slot_flags & SLOT_EYES) )
return 0
return 1
if(slot_head)
if(head)
return 0
if( !(I.slot_flags & SLOT_HEAD) )
return 0
return 1
if(slot_ears)
if(ears)
return 0
if( !(I.slot_flags & SLOT_EARS) )
return 0
return 1
if(slot_w_uniform)
if(w_uniform)
return 0
if( !(I.slot_flags & SLOT_ICLOTHING) )
return 0
return 1
if(slot_wear_id)
if(wear_id)
return 0
if(!w_uniform)
if(!disable_warning)
src << "\red You need a jumpsuit before you can attach this [I.name]."
return 0
if( !(I.slot_flags & SLOT_ID) )
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)
src << "\red You need a jumpsuit before you can attach this [I.name]."
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return
if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) )
return 1
return 0
return 0 //Unsupported slot
if(slot_r_store)
if(I.flags & NODROP)
return 0
if(r_store)
return 0
if(!w_uniform)
if(!disable_warning)
src << "\red You need a jumpsuit before you can attach this [I.name]."
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return 0
if( I.w_class <= 2 || (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)
src << "\red You need a suit before you can attach this [I.name]."
return 0
if(!wear_suit.allowed)
if(!disable_warning)
usr << "You somehow have a suit with no defined allowed items for suit storage, stop that." //should be src?
return 0
if(I.w_class > 4)
if(!disable_warning)
usr << "The [I.name] is too big to attach." //should be src?
return 0
if( istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, wear_suit.allowed) ) //ugly and un-polymorphic.
return 1
return 0
if(slot_handcuffed)
if(handcuffed)
return 0
if(!istype(I, /obj/item/weapon/handcuffs))
return 0
return 1
if(slot_legcuffed)
if(legcuffed)
return 0
if(!istype(I, /obj/item/weapon/legcuffs))
return 0
return 1
if(slot_in_backpack)
if (back && istype(back, /obj/item/weapon/storage/backpack))
var/obj/item/weapon/storage/backpack/B = back
if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class)
return 1
return 0
return 0 //Unsupported slot
@@ -383,5 +386,4 @@
return
else
src << "\red You are trying to equip this item to an unsupported inventory slot. Report this to a coder!"
return
return
+45 -554
View File
@@ -1,6 +1,11 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
//NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick!
#define TINT_IMPAIR 2 //Threshold of tint level to apply weld mask overlay
#define TINT_BLIND 3 //Threshold of tint level to obscure vision fully
#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
#define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /3) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks.
@@ -21,9 +26,6 @@
#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
#define TINT_IMPAIR 2 //Threshold of tint level to apply weld mask overlay
#define TINT_BLIND 3 //Threshold of tint level to obscure vision fully
/mob/living/carbon/human
var/oxygen_alert = 0
var/toxins_alert = 0
@@ -51,7 +53,6 @@
fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it.
tinttotal = tintcheck() //here as both hud updates and status updates call it
//TODO: seperate this out
var/datum/gas_mixture/environment = loc.return_air()
@@ -98,6 +99,9 @@
handle_regular_hud_updates()
if(dna)
dna.species.spec_life(src) // for mutantraces
// Grabbing
for(var/obj/item/weapon/grab/G in src)
G.process()
@@ -163,132 +167,14 @@
proc/handle_mutations_and_radiation()
if(getFireLoss())
if((COLD_RESISTANCE in mutations) || (prob(1)))
heal_organ_damage(0,1)
if ((HULK in mutations) && health <= 25)
mutations.Remove(HULK)
update_mutations() //update our mutation overlays
src << "\red You suddenly feel very weak."
Weaken(3)
emote("collapse")
if (radiation)
if (radiation > 100)
radiation = 100
Weaken(10)
src << "\red You feel weak."
emote("collapse")
if (radiation < 0)
radiation = 0
else
switch(radiation)
if(1 to 49)
radiation--
if(prob(25))
adjustToxLoss(1)
updatehealth()
if(50 to 74)
radiation -= 2
adjustToxLoss(1)
if(prob(5))
radiation -= 5
Weaken(3)
src << "\red You feel weak."
emote("collapse")
if(prob(15))
if(!( hair_style == "Shaved") || !(hair_style == "Bald"))
src << "<span class='danger'>Your hair starts to fall out in clumps...<span>"
spawn(50)
facial_hair_style = "Shaved"
hair_style = "Bald"
update_hair()
updatehealth()
if(75 to 100)
radiation -= 3
adjustToxLoss(3)
if(prob(1))
src << "\red You mutate!"
randmutb(src)
domutcheck(src,null)
emote("gasp")
updatehealth()
if(dna)
dna.species.handle_mutations_and_radiation(src)
proc/breathe()
if(dna)
dna.species.breathe(src)
if(reagents.has_reagent("lexorin")) return
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
var/datum/gas_mixture/environment = loc.return_air()
var/datum/gas_mixture/breath
// HACK NEED CHANGING LATER
if(health <= config.health_threshold_crit)
losebreath++
if(losebreath>0) //Suffocating so do not take a breath
losebreath--
if (prob(10)) //Gasp per 10 ticks? Sounds about right.
spawn emote("gasp")
if(istype(loc, /obj/))
var/obj/location_as_object = loc
location_as_object.handle_internal_lifeform(src, 0)
else
//First, check for air from internal atmosphere (using an air tank and mask generally)
breath = get_breath_from_internal(BREATH_VOLUME) // Super hacky -- TLE
//breath = get_breath_from_internal(0.5) // Manually setting to old BREATH_VOLUME amount -- TLE
//No breath from internal atmosphere so get breath from location
if(!breath)
if(isobj(loc))
var/obj/location_as_object = loc
breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME)
else if(isturf(loc))
var/breath_moles = 0
/*if(environment.return_pressure() > ONE_ATMOSPHERE)
// Loads of air around (pressure effect will be handled elsewhere), so lets just take a enough to fill our lungs at normal atmos pressure (using n = Pv/RT)
breath_moles = (ONE_ATMOSPHERE*BREATH_VOLUME/R_IDEAL_GAS_EQUATION*environment.temperature)
else*/
// Not enough air around, take a percentage of what's there to model this properly
breath_moles = environment.total_moles()*BREATH_PERCENTAGE
breath = loc.remove_air(breath_moles)
// Handle chem smoke effect -- Doohl
var/block = 0
if(wear_mask)
if(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)
block = 1
if(glasses)
if(glasses.flags & BLOCK_GAS_SMOKE_EFFECT)
block = 1
if(head)
if(head.flags & BLOCK_GAS_SMOKE_EFFECT)
block = 1
if(!block)
for(var/obj/effect/effect/chem_smoke/smoke in view(1, src))
if(smoke.reagents.total_volume)
smoke.reagents.reaction(src, INGEST)
spawn(5)
if(smoke)
smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs?
break // If they breathe in the nasty stuff once, no need to continue checking
else //Still give containing object the chance to interact
if(istype(loc, /obj/))
var/obj/location_as_object = loc
location_as_object.handle_internal_lifeform(src, 0)
handle_breath(breath)
if(breath)
loc.assume_air(breath)
return
proc/get_breath_from_internal(volume_needed)
@@ -304,229 +190,45 @@
return null
proc/handle_breath(datum/gas_mixture/breath)
/*proc/handle_breath(datum/gas_mixture/breath)
if((status_flags & GODMODE))
return
if(!breath || (breath.total_moles() == 0) || suiciding)
if(reagents.has_reagent("inaprovaline"))
return
if(suiciding)
adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster
failed_last_breath = 1
oxygen_alert = max(oxygen_alert, 1)
return 0
if(health >= config.health_threshold_crit)
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
failed_last_breath = 1
else
adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
failed_last_breath = 1
if(dna)
dna.species.handle_breath(breath)
oxygen_alert = max(oxygen_alert, 1)
return 0
var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
//var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now)
var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
var/safe_toxins_max = 0.005
var/SA_para_min = 1
var/SA_sleep_min = 5
var/oxygen_used = 0
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
//Partial pressure of the O2 in our breath
var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure
// Same, but for the toxins
var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure
// And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun)
var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure // Tweaking to fit the hacky bullshit I've done with atmo -- TLE
//var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*0.5 // The default pressure value
if(O2_pp < safe_oxygen_min) // Too little oxygen
if(prob(20))
spawn(0) emote("gasp")
if(O2_pp > 0)
var/ratio = safe_oxygen_min/O2_pp
adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!)
failed_last_breath = 1
oxygen_used = breath.oxygen*ratio/6
else
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
failed_last_breath = 1
oxygen_alert = max(oxygen_alert, 1)
/*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose)
spawn(0) emote("cough")
var/ratio = O2_pp/safe_oxygen_max
oxyloss += 5*ratio
oxygen_used = breath.oxygen*ratio/6
oxygen_alert = max(oxygen_alert, 1)*/
else // We're in safe limits
failed_last_breath = 0
adjustOxyLoss(-5)
oxygen_used = breath.oxygen/6
oxygen_alert = 0
breath.oxygen -= oxygen_used
breath.carbon_dioxide += oxygen_used
//CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick.
if(CO2_pp > safe_co2_max)
if(!co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so.
co2overloadtime = world.time
else if(world.time - co2overloadtime > 120)
Paralyse(3)
adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
if(world.time - co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
adjustOxyLoss(8)
if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
spawn(0) emote("cough")
else
co2overloadtime = 0
if(Toxins_pp > safe_toxins_max) // Too much toxins
var/ratio = (breath.toxins/safe_toxins_max) * 10
//adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second
if(reagents)
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
else
toxins_alert = 0
if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here.
for(var/datum/gas/sleeping_agent/SA in breath.trace_gases)
var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
sleeping = max(sleeping+2, 10)
else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
spawn(0) emote(pick("giggle", "laugh"))
if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :(
if(breath.temperature < 260.15)
if(prob(20))
src << "\red You feel your face freezing and an icicle forming in your lungs!"
else if(breath.temperature > 360.15)
if(prob(20))
src << "\red You feel your face burning and a searing heat in your lungs!"
switch(breath.temperature)
if(-INFINITY to 120)
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head")
fire_alert = max(fire_alert, 1)
if(120 to 200)
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head")
fire_alert = max(fire_alert, 1)
if(200 to 260)
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head")
fire_alert = max(fire_alert, 1)
if(360 to 400)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head")
fire_alert = max(fire_alert, 2)
if(400 to 1000)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head")
fire_alert = max(fire_alert, 2)
if(1000 to INFINITY)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head")
fire_alert = max(fire_alert, 2)
//Temporary fixes to the alerts.
return 1
return 1*/
proc/handle_environment(datum/gas_mixture/environment)
if(!environment)
return
var/loc_temp = get_temperature(environment)
//world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]"
//Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit.
if(stat != 2)
stabilize_temperature_from_calories()
//After then, it reacts to the surrounding atmosphere based on your thermal protection
if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
if(loc_temp < bodytemperature)
//Place is colder than we are
var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
if(thermal_protection < 1)
bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX)
else
//Place is hotter than we are
var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
if(thermal_protection < 1)
bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
// +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt.
if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT)
//Body temperature is too hot.
fire_alert = max(fire_alert, 1)
switch(bodytemperature)
if(360 to 400)
apply_damage(HEAT_DAMAGE_LEVEL_1, BURN)
fire_alert = max(fire_alert, 2)
if(400 to 460)
apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
fire_alert = max(fire_alert, 2)
if(460 to INFINITY)
if(on_fire)
apply_damage(HEAT_DAMAGE_LEVEL_3, BURN)
fire_alert = max(fire_alert, 2)
else
apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
fire_alert = max(fire_alert, 2)
else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
fire_alert = max(fire_alert, 1)
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
switch(bodytemperature)
if(200 to 260)
apply_damage(COLD_DAMAGE_LEVEL_1, BURN)
fire_alert = max(fire_alert, 1)
if(120 to 200)
apply_damage(COLD_DAMAGE_LEVEL_2, BURN)
fire_alert = max(fire_alert, 1)
if(-INFINITY to 120)
apply_damage(COLD_DAMAGE_LEVEL_3, BURN)
fire_alert = max(fire_alert, 1)
// Account for massive pressure differences. Done by Polymorph
// Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense!
var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
switch(adjusted_pressure)
if(HAZARD_HIGH_PRESSURE to INFINITY)
adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
pressure_alert = 2
if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
pressure_alert = 1
if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
pressure_alert = 0
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
pressure_alert = -1
else
if( !(COLD_RESISTANCE in mutations) )
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
pressure_alert = -2
else
pressure_alert = -1
if(dna)
dna.species.handle_environment(environment, src)
return
///FIRE CODE
handle_fire()
if(dna)
dna.species.handle_fire(src)
if(..())
return
var/thermal_protection = get_heat_protection(30000) //If you don't have fire suit level protection, you get a temperature increase
if((1 - thermal_protection) > 0.0001)
bodytemperature += BODYTEMP_HEATING_MAX
return
IgniteMob()
if(dna)
dna.species.IgniteMob(src)
else
..()
ExtinguishMob()
if(dna)
dna.species.ExtinguishMob(src)
else
..()
//END FIRE CODE
/*
@@ -650,6 +352,9 @@
if(COLD_RESISTANCE in mutations)
return 1 //Fully protected from the cold.
if(dna && COLDRES in dna.species.specflags)
return 1
temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
var/thermal_protection_flags = get_cold_protection_flags(temperature)
@@ -739,82 +444,8 @@
*/
proc/handle_chemicals_in_body()
if(reagents) reagents.metabolize(src)
if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(loc)) //else, there's considered to be no light
var/turf/T = loc
var/area/A = T.loc
if(A)
if(A.lighting_use_dynamic) light_amount = min(10,T.lighting_lumcount) - 5 //hardcapped so it's not abused by having a ton of flashlights
else light_amount = 5
nutrition += light_amount
if(nutrition > 500)
nutrition = 500
if(light_amount > 2) //if there's enough light, heal
heal_overall_damage(1,1)
adjustToxLoss(-1)
adjustOxyLoss(-1)
if(dna && dna.mutantrace == "shadow")
var/light_amount = 0
if(isturf(loc))
var/turf/T = loc
var/area/A = T.loc
if(A)
if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount
else light_amount = 10
if(light_amount > 2) //if there's enough light, start dying
take_overall_damage(1,1)
else if (light_amount < 2) //heal in the dark
heal_overall_damage(1,1)
//The fucking FAT mutation is the dumbest shit ever. It makes the code so difficult to work with
if(FAT in mutations)
if(overeatduration < 100)
src << "\blue You feel fit again!"
mutations -= FAT
update_inv_w_uniform(0)
update_inv_wear_suit()
else
if(overeatduration > 500)
src << "\red You suddenly feel blubbery!"
mutations |= FAT
update_inv_w_uniform(0)
update_inv_wear_suit()
// nutrition decrease
if (nutrition > 0 && stat != 2)
nutrition = max (0, nutrition - HUNGER_FACTOR)
if (nutrition > 450)
if(overeatduration < 600) //capped so people don't take forever to unfat
overeatduration++
else
if(overeatduration > 1)
overeatduration -= 2 //doubled the unfat rate
if(dna && dna.mutantrace == "plant")
if(nutrition < 200)
take_overall_damage(2,0)
if (drowsyness)
drowsyness--
eye_blurry = max(2, eye_blurry)
if (prob(5))
sleeping += 1
Paralyse(5)
confused = max(0, confused - 1)
// decrement dizziness counter, clamped to 0
if(resting)
dizziness = max(0, dizziness - 15)
jitteriness = max(0, jitteriness - 15)
else
dizziness = max(0, dizziness - 3)
jitteriness = max(0, jitteriness - 3)
updatehealth()
if(dna)
dna.species.handle_chemicals_in_body(src)
return //TODO: DEFERRED
@@ -1048,155 +679,15 @@
damageoverlay.overlays += I
damageoverlay.overlays += black
if( stat == DEAD )
sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
see_in_dark = 8
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(healths) healths.icon_state = "health7" //DEAD healthmeter
else
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
var/see_temp = see_invisible
see_invisible = SEE_INVISIBLE_LIVING
if(dna)
switch(dna.mutantrace)
if("slime")
see_in_dark = 3
see_invisible = SEE_INVISIBLE_LEVEL_ONE
if("shadow")
see_in_dark = 8
else
see_in_dark = 2
if(XRAY in mutations)
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(seer)
see_invisible = SEE_INVISIBLE_OBSERVER
if(mind && mind.changeling)
hud_used.lingchemdisplay.invisibility = 0
hud_used.lingchemdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font color='#dd66dd'>[src.mind.changeling.chem_charges]</font></div>"
else
hud_used.lingchemdisplay.invisibility = 101
if(istype(wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja))
var/obj/item/clothing/mask/gas/voice/space_ninja/O = wear_mask
switch(O.mode)
if(0)
var/target_list[] = list()
for(var/mob/living/target in oview(src))
if( target.mind&&(target.mind.special_role||issilicon(target)) )//They need to have a mind.
target_list += target
if(target_list.len)//Everything else is handled by the ninja mask proc.
O.assess_targets(target_list, src)
see_invisible = SEE_INVISIBLE_LIVING
if(1)
see_in_dark = 5
see_invisible = SEE_INVISIBLE_LIVING
if(2)
sight |= SEE_MOBS
see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(3)
sight |= SEE_TURFS
see_invisible = SEE_INVISIBLE_LIVING
if(glasses)
if(istype(glasses, /obj/item/clothing/glasses))
var/obj/item/clothing/glasses/G = glasses
sight |= G.vision_flags
see_in_dark = G.darkness_view
see_invisible = G.invis_view
if(G.hud)
G.process_hud(src)
if(druggy) //Override for druggy
see_invisible = see_temp
if(see_override) //Override all
see_invisible = see_override
if(healths)
switch(hal_screwyhud)
if(1) healths.icon_state = "health6"
if(2) healths.icon_state = "health7"
else
switch(health - staminaloss)
if(100 to INFINITY) healths.icon_state = "health0"
if(80 to 100) healths.icon_state = "health1"
if(60 to 80) healths.icon_state = "health2"
if(40 to 60) healths.icon_state = "health3"
if(20 to 40) healths.icon_state = "health4"
if(0 to 20) healths.icon_state = "health5"
else healths.icon_state = "health6"
if(nutrition_icon)
switch(nutrition)
if(450 to INFINITY) nutrition_icon.icon_state = "nutrition0"
if(350 to 450) nutrition_icon.icon_state = "nutrition1"
if(250 to 350) nutrition_icon.icon_state = "nutrition2"
if(150 to 250) nutrition_icon.icon_state = "nutrition3"
else nutrition_icon.icon_state = "nutrition4"
if(pressure)
pressure.icon_state = "pressure[pressure_alert]"
if(pullin)
if(pulling) pullin.icon_state = "pull"
else pullin.icon_state = "pull0"
// if(rest) //Not used with new UI
// if(resting || lying || sleeping) rest.icon_state = "rest1"
// else rest.icon_state = "rest0"
if(toxin)
if(hal_screwyhud == 4 || toxins_alert) toxin.icon_state = "tox1"
else toxin.icon_state = "tox0"
if(oxygen)
if(hal_screwyhud == 3 || oxygen_alert) oxygen.icon_state = "oxy1"
else oxygen.icon_state = "oxy0"
if(fire)
if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat.
else fire.icon_state = "fire0"
if(bodytemp)
switch(bodytemperature) //310.055 optimal body temp
if(370 to INFINITY) bodytemp.icon_state = "temp4"
if(350 to 370) bodytemp.icon_state = "temp3"
if(335 to 350) bodytemp.icon_state = "temp2"
if(320 to 335) bodytemp.icon_state = "temp1"
if(300 to 320) bodytemp.icon_state = "temp0"
if(295 to 300) bodytemp.icon_state = "temp-1"
if(280 to 295) bodytemp.icon_state = "temp-2"
if(260 to 280) bodytemp.icon_state = "temp-3"
else bodytemp.icon_state = "temp-4"
// This checks how much the mob's eyewear impairs their vision
if(tinttotal >= TINT_IMPAIR)
if(tinted_weldhelh)
if(tinttotal >= TINT_BLIND)
blinded = 1 // You get the sudden urge to learn to play keyboard
client.screen += global_hud.darkMask
else
client.screen += global_hud.darkMask
if(blind)
if(blinded) blind.layer = 18
else blind.layer = 0
if( disabilities & NEARSIGHTED && !istype(glasses, /obj/item/clothing/glasses/regular) )
client.screen += global_hud.vimpaired
if(eye_blurry) client.screen += global_hud.blurry
if(druggy) client.screen += global_hud.druggy
if(eye_stat > 20)
if(eye_stat > 30) client.screen += global_hud.darkMask
else client.screen += global_hud.vimpaired
if(machine)
if(!machine.check_eye(src)) reset_view(null)
else
if(!client.adminobs) reset_view(null)
if(dna)
dna.species.handle_vision(src)
dna.species.handle_hud_icons(src)
return 1
proc/handle_random_events()
@@ -0,0 +1,22 @@
var/global/list/colored_mutraces = list( // these mutantraces are affected by mutant color
"lizard",
"plant",
"pod",
"slime",
"jelly",
"golem"
)
var/global/list/mutants_with_eyes = list( // these mutantraces have eyes
"lizard",
"plant",
"pod",
"jelly",
)
/mob/living/carbon/human/proc/check_mutrace(var/mutneeded = "mut1", var/mutneededalt = "mut2")
if(dna)
if(dna.mutantrace == mutneeded || dna.mutantrace == mutneededalt)
return 1
return 0
+20 -17
View File
@@ -22,24 +22,8 @@
return
if(dna)
if(dna.mutantrace == "lizard")
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "s", stutter("ss"))
message = dna.species.handle_speech(message,src)
if(dna.mutantrace == "fly")
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "z", stutter("zz"))
/*if(dna.mutantrace == "slime" && prob(5))
if(copytext(message, 1, 2) != "*")
if(copytext(message, 1, 2) == ";")
message = ";"
else
message = ""
message += "SKR"
var/imax = rand(5,20)
for(var/i = 0,i<imax,i++)
message += "E"*/
if(viruses.len)
for(var/datum/disease/pierrot_throat/D in viruses)
var/list/temp_message = text2list(message, " ") //List each word in the message
@@ -63,6 +47,25 @@
..(message)
/mob/living/carbon/human/say_quote(text)
if(!text)
return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
var/ending = copytext(text, length(text))
if (src.stuttering)
return "stammers, \"[text]\"";
if(isliving(src))
var/mob/living/L = src
if (L.getBrainLoss() >= 60)
return "gibbers, \"[text]\"";
if (ending == "?")
return "asks, \"[text]\"";
if (ending == "!")
return "exclaims, \"[text]\"";
if(dna)
return "[dna.species.say_mod], \"[text]\"";
return "says, \"[text]\"";
/mob/living/carbon/human/proc/forcesay(list/append)
if(stat == CONSCIOUS)
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,221 @@
/*
HUMANS
*/
/datum/species/human
name = "Human"
id = "human"
roundstart = 1
specflags = list(EYECOLOR,HAIR,FACEHAIR,LIPS)
use_skintones = 1
/datum/species/human/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "mutationtoxin")
H << "<span class='danger'>Your flesh rapidly mutates!</span>"
H.dna.species = new /datum/species/slime()
H.regenerate_icons()
H.reagents.del_reagent(chem.type)
return 1
/*
LIZARDPEOPLE
*/
/datum/species/lizard
// Reptilian humanoids with scaled skin and tails.
name = "Lizardperson"
id = "lizard"
say_mod = "hisses"
default_color = "00FF00"
roundstart = 1
specflags = list(MUTCOLORS,EYECOLOR,LIPS)
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
/datum/species/lizard/handle_speech(message)
// jesus christ why
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "s", stutter("ss"))
return message
/*
PLANTPEOPLE
*/
/datum/species/plant
// Creatures made of leaves and plant matter.
name = "Plant"
id = "plant"
default_color = "59CE00"
specflags = list(MUTCOLORS,EYECOLOR)
attack_verb = "slice"
attack_sound = 'sound/weapons/slice.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
burnmod = 1.25
heatmod = 1.5
/datum/species/plant/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "plantbgone")
H.adjustToxLoss(3)
H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM)
return 1
/datum/species/plant/on_hit(proj_type, mob/living/carbon/human/H)
switch(proj_type)
if(/obj/item/projectile/energy/floramut)
if(prob(15))
H.apply_effect((rand(30,80)),IRRADIATE)
H.Weaken(5)
for (var/mob/V in viewers(H))
V.show_message("<span class='danger'>[H] writhes in pain as \his vacuoles boil.</span>", 3, "<span class='danger'>You hear the crunching of leaves.</span>", 2)
if(prob(80))
randmutb(H)
domutcheck(H,null)
else
randmutg(H)
domutcheck(H,null)
else
H.adjustFireLoss(rand(5,15))
H.show_message("<span class='danger'>The radiation beam singes you!</span>")
if(/obj/item/projectile/energy/florayield)
H.nutrition = min(H.nutrition+30, 500)
return
/*
PODPEOPLE
*/
/datum/species/plant/pod
// A mutation caused by a human being ressurected in a revival pod. These regain health in light, and begin to wither in darkness.
name = "Podperson"
id = "pod"
/datum/species/plant/pod/spec_life(mob/living/carbon/human/H)
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
var/area/A = T.loc
if(A)
if(A.lighting_use_dynamic) light_amount = min(10,T.lighting_lumcount) - 5
else light_amount = 5
H.nutrition += light_amount
if(H.nutrition > 500)
H.nutrition = 500
if(light_amount > 2) //if there's enough light, heal
H.heal_overall_damage(1,1)
H.adjustToxLoss(-1)
H.adjustOxyLoss(-1)
if(H.nutrition < 200)
H.take_overall_damage(2,0)
/*
SHADOWPEOPLE
*/
/datum/species/shadow
// Humans cursed to stay in the darkness, lest their life forces drain. They regain health in shadow and die in light.
name = "???"
id = "shadow"
darksight = 8
sexes = 0
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
/datum/species/shadow/spec_life(mob/living/carbon/human/H)
var/light_amount = 0
if(isturf(H.loc))
var/turf/T = H.loc
var/area/A = T.loc
if(A)
if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount
else light_amount = 10
if(light_amount > 2) //if there's enough light, start dying
H.take_overall_damage(1,1)
else if (light_amount < 2) //heal in the dark
H.heal_overall_damage(1,1)
/*
SLIMEPEOPLE
*/
/datum/species/slime
// Humans mutated by slime mutagen, produced from green slimes. They are not targetted by slimes.
name = "Slimeperson"
id = "slime"
default_color = "00FFFF"
darksight = 3
invis_sight = SEE_INVISIBLE_LEVEL_ONE
specflags = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR)
hair_color = "mutcolor"
hair_alpha = 150
ignored_by = list(/mob/living/carbon/slime)
/*
JELLYPEOPLE
*/
/datum/species/jelly
// Entirely alien beings that seem to be made entirely out of gel. They have three eyes and a skeleton visible within them.
name = "Xenobiological Jelly Entity"
id = "jelly"
default_color = "00FF90"
say_mod = "chirps"
eyes = "jelleyes"
specflags = list(MUTCOLORS,EYECOLOR)
/*
GOLEMS
*/
/datum/species/golem
// Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck.
name = "Golem"
id = "golem"
specflags = list(NOBREATH,HEATRES,COLDRES,NOGUNS,NOBLOOD,RADIMMUNE)
speedmod = 3
armor = 55
punchmod = 5
no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_head, slot_w_uniform)
nojumpsuit = 1
/*
ADAMANTINE GOLEMS
*/
/datum/species/golem/adamantine
name = "Adamantine Golem"
id = "adamantine"
/*
FLIES
*/
/datum/species/fly
// Humans turned into fly-like abominations in teleporter accidents.
name = "Human?"
id = "fly"
say_mod = "buzzes"
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "pestkiller")
H.adjustToxLoss(3)
H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM)
return 1
/datum/species/fly/handle_speech(message)
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "z", stutter("zz"))
return message
/*
SKELETONS
*/
/datum/species/skeleton
// 2spooky
name = "Spooky Scary Skeleton"
id = "skeleton"
sexes = 0
@@ -56,6 +56,7 @@ Please contact me on #coderbus IRC. ~Carnie x
*/
//Human Overlays Indexes/////////
#define SPECIES_LAYER 23 // mutantrace colors... these are on a seperate layer in order to prvent
#define BODY_LAYER 22 //underwear, eyes, lips(makeup)
#define MUTATIONS_LAYER 21 //Tk headglows etc.
#define AUGMENTS_LAYER 20
@@ -78,28 +79,28 @@ Please contact me on #coderbus IRC. ~Carnie x
#define L_HAND_LAYER 3
#define R_HAND_LAYER 2 //Having the two hands seperate seems rather silly, merge them together? It'll allow for code to be reused on mobs with arbitarily many hands
#define FIRE_LAYER 1 //If you're on fire
#define TOTAL_LAYERS 22 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
#define TOTAL_LAYERS 23 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
//////////////////////////////////
/mob/living/carbon/human
var/list/overlays_standing[TOTAL_LAYERS]
/mob/living/carbon/human/proc/update_base_icon_state()
var/race = dna ? dna.mutantrace : null
switch(race)
if("lizard","golem","slime","shadow","adamantine","fly","plant")
base_icon_state = "[dna.mutantrace]_[(gender == FEMALE) ? "f" : "m"]"
if("skeleton")
base_icon_state = "skeleton"
//var/race = dna ? dna.mutantrace : null
if(dna)
base_icon_state = dna.species.update_base_icon_state(src)
else
if(HUSK in mutations)
base_icon_state = "husk"
else
if(HUSK in mutations)
base_icon_state = "husk"
else
base_icon_state = "[skin_tone]_[(gender == FEMALE) ? "f" : "m"]"
base_icon_state = "[skin_tone]_[(gender == FEMALE) ? "f" : "m"]"
icon_state = "[base_icon_state]_s"
/mob/living/carbon/human/proc/apply_overlay(cache_index)
var/image/I = overlays_standing[cache_index]
if(I)
overlays += I
@@ -145,42 +146,11 @@ Please contact me on #coderbus IRC. ~Carnie x
//Reset our hair
remove_overlay(HAIR_LAYER)
//mutants don't have hair. masks and helmets can obscure our hair too.
if( (HUSK in mutations) || (dna && dna.mutantrace) || (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)) )
if( (HUSK in mutations) || (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)) )
return
//base icons
var/datum/sprite_accessory/S
var/list/standing = list()
if(facial_hair_style)
S = facial_hair_styles_list[facial_hair_style]
if(S)
var/image/img_facial_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER)
var/new_color = "#" + facial_hair_color
img_facial_s.color = new_color
standing += img_facial_s
//Applies the debrained overlay if there is no brain
if(!getorgan(/obj/item/organ/brain))
standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s", "layer" = -HAIR_LAYER)
else if(hair_style)
S = hair_styles_list[hair_style]
if(S)
var/image/img_hair_s = image("icon" = S.icon, "icon_state" = "[S.icon_state]_s", "layer" = -HAIR_LAYER)
var/new_color = "#" + hair_color
img_hair_s.color = new_color
standing += img_hair_s
if(standing.len)
overlays_standing[HAIR_LAYER] = standing
apply_overlay(HAIR_LAYER)
if(dna)
dna.species.handle_hair(src)
/mob/living/carbon/human/update_mutations()
remove_overlay(MUTATIONS_LAYER)
@@ -188,6 +158,7 @@ Please contact me on #coderbus IRC. ~Carnie x
var/list/standing = list()
var/g = (gender == FEMALE) ? "f" : "m"
for(var/mut in mutations)
switch(mut)
if(HULK)
@@ -203,41 +174,22 @@ Please contact me on #coderbus IRC. ~Carnie x
apply_overlay(MUTATIONS_LAYER)
/mob/living/carbon/human/proc/update_mutcolor()
if(dna && !(HUSK in mutations))
dna.species.update_color(src)
/mob/living/carbon/human/proc/update_body()
remove_overlay(BODY_LAYER)
update_base_icon_state()
if(dna)
base_icon_state = dna.species.update_base_icon_state(src)
else
update_base_icon_state()
icon_state = "[base_icon_state]_s"
var/list/standing = list()
//Mouth (lipstick!)
if(lip_style)
standing += image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]_s", "layer" = -BODY_LAYER)
//Eyes
if(!dna || dna.mutantrace != "skeleton")
var/image/img_eyes_s = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes_s", "layer" = -BODY_LAYER)
var/new_color = "#" + eye_color
img_eyes_s.color = new_color
standing += img_eyes_s
//Underwear
if(underwear)
var/datum/sprite_accessory/underwear/U = underwear_all[underwear]
if(U)
standing += image("icon"=U.icon, "icon_state"="[U.icon_state]_s", "layer"=-BODY_LAYER)
if(standing.len)
overlays_standing[BODY_LAYER] = standing
apply_overlay(BODY_LAYER)
if(dna) // didn't want to have a duplicate if(dna) here, but due to the ordering of the code this was the only way
dna.species.handle_body(src)
/mob/living/carbon/human/update_fire()
@@ -274,8 +226,6 @@ Please contact me on #coderbus IRC. ~Carnie x
apply_overlay(AUGMENTS_LAYER)
/* --------------------------------------- */
//For legacy support.
/mob/living/carbon/human/regenerate_icons()
@@ -305,6 +255,8 @@ Please contact me on #coderbus IRC. ~Carnie x
update_transform()
//Hud Stuff
update_hud()
// Mutantrace colors
update_mutcolor()
/* --------------------------------------- */
//vvvvvv UPDATE_INV PROCS vvvvvv
@@ -322,16 +274,18 @@ Please contact me on #coderbus IRC. ~Carnie x
var/t_color = w_uniform.item_color
if(!t_color) t_color = icon_state
var/image/standing = image("icon"='icons/mob/uniform.dmi', "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER)
overlays_standing[UNIFORM_LAYER] = standing
var/G = (gender == FEMALE) ? "f" : "m"
if(G == "f" && U.fitted == 1)
var/index = "[t_color]_s"
var/icon/female_uniform_icon = female_uniform_icons[index]
if(!female_uniform_icon ) //Create standing/laying icons if they don't exist
generate_uniform(index,t_color)
standing = image("icon"=female_uniform_icons["[t_color]_s"], "layer"=-UNIFORM_LAYER)
overlays_standing[UNIFORM_LAYER] = standing
if(dna && dna.species.sexes)
var/G = (gender == FEMALE) ? "f" : "m"
if(G == "f" && U.fitted == 1)
var/index = "[t_color]_s"
var/icon/female_uniform_icon = female_uniform_icons[index]
if(!female_uniform_icon ) //Create standing/laying icons if they don't exist
generate_uniform(index,t_color)
standing = image("icon"=female_uniform_icons["[t_color]_s"], "layer"=-UNIFORM_LAYER)
overlays_standing[UNIFORM_LAYER] = standing
if(w_uniform.blood_DNA)
standing.overlays += image("icon"='icons/effects/blood.dmi', "icon_state"="uniformblood")
@@ -375,6 +329,7 @@ Please contact me on #coderbus IRC. ~Carnie x
if(gloves.blood_DNA)
standing.overlays += image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands")
else
if(blood_DNA)
overlays_standing[GLOVES_LAYER] = image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands")
@@ -532,7 +487,6 @@ Please contact me on #coderbus IRC. ~Carnie x
if(wear_mask.blood_DNA && !istype(wear_mask, /obj/item/clothing/mask/cigarette))
standing.overlays += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood")
apply_overlay(FACEMASK_LAYER)
@@ -628,7 +582,9 @@ Please contact me on #coderbus IRC. ~Carnie x
apply_overlay(L_HAND_LAYER)
//Human Overlays Indexes/////////
#undef SPECIES_LAYER
#undef BODY_LAYER
#undef MUTATIONS_LAYER
#undef DAMAGE_LAYER
@@ -331,13 +331,10 @@
if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence
targets += L // Possible target found!
if(isanimal(L) && (rabid || attacked || hungry >= 2)) //Simple_Animals only get retaliated against.
targets += L
if(istype(L, /mob/living/carbon/human)) // Ignore slime(wo)men
if(istype(L, /mob/living/carbon/human) && dna) //Ignore slime(wo)men
var/mob/living/carbon/human/H = L
if(H.dna)
if(H.dna.mutantrace == "slime")
if(/mob/living/carbon/slime in H.dna.species.ignored_by)
continue
if(!L.canmove) // Only one slime can latch on at a time.
@@ -568,4 +565,4 @@
if (hunger == 2 || rabid || attacked) return 1
if (Leader) return 0
if (holding_still) return 0
return 1
return 1
@@ -823,6 +823,8 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
////////Adamantine Golem stuff I dunno where else to put it
// This will eventually be removed.
/obj/item/clothing/under/golem
name = "adamantine skin"
desc = "a golem's skin"
@@ -831,7 +833,6 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
item_color = "golem"
flags = ABSTRACT | NODROP
has_sensor = 0
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/golem
name = "adamantine shell"
@@ -842,14 +843,8 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = FULL_BODY
slowdown = 1.0
flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
flags = STOPSPRESSUREDMAGE | ABSTRACT | NODROP
heat_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS | HEAD
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
flags = ABSTRACT | NODROP
/obj/item/clothing/shoes/golem
name = "golem's feet"
@@ -857,7 +852,6 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
icon_state = "golem"
item_state = null
flags = NOSLIP | ABSTRACT | NODROP
slowdown = SHOES_SLOWDOWN+1
/obj/item/clothing/mask/breath/golem
@@ -867,7 +861,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
item_state = "golem"
siemens_coefficient = 0
unacidable = 1
flags = ABSTRACT | NODROP | MASKINTERNALS | MASKCOVERSMOUTH
flags = ABSTRACT | NODROP
/obj/item/clothing/gloves/golem
@@ -886,10 +880,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
name = "golem's head"
desc = "a golem's head"
unacidable = 1
flags = STOPSPRESSUREDMAGE | ABSTRACT | NODROP
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
flags = ABSTRACT | NODROP
/obj/effect/golemrune
anchored = 1
@@ -928,14 +919,9 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
return
var/mob/living/carbon/human/G = new /mob/living/carbon/human
if(prob(50)) G.gender = "female"
hardset_dna(G, null, null, null, "adamantine")
hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine)
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/breath/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.dna.species.auto_equip(G)
G.loc = src.loc
G.key = ghost.key
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."
@@ -16,6 +16,8 @@
/mob/living/proc/getarmor(var/def_zone, var/type)
return 0
/mob/living/proc/on_hit(var/obj/item/projectile/proj_type)
return
/mob/living/bullet_act(obj/item/projectile/P, def_zone)
var/armor = run_armor_check(def_zone, P.flag)
@@ -111,6 +111,11 @@
return 0
if(L in friends)
return 0
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.dna)
if(src.type in H.dna.species.ignored_by)
return 0
return 1
if(isobj(the_target))
if(the_target.type in wanted_objects)
+4 -1
View File
@@ -420,6 +420,9 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h
var/list/hands = list(M.l_hand, M.r_hand)
return hands
/mob/proc/reagent_check(var/datum/reagent/R) // utilized in the species code
return 1
/proc/item_heal_robotic(var/mob/living/carbon/human/H, var/mob/user, var/brute, var/burn)
var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
@@ -442,4 +445,4 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h
user << "<span class='notice'>[H]'s [affecting.getDisplayName()] is already in good condition</span>"
return
else
return
return
@@ -12,6 +12,7 @@ datum/preferences
hair_color = random_short_color()
facial_hair_color = hair_color
eye_color = random_eye_color()
pref_species = new /datum/species/human()
backbag = 2
age = rand(AGE_MIN,AGE_MAX)
@@ -23,7 +24,11 @@ datum/preferences
var/g = "m"
if(gender == FEMALE) g = "f"
preview_icon = new /icon('icons/mob/human.dmi', "[skin_tone]_[g]_s")
if(pref_species.id == "human" || !config.mutant_races)
preview_icon = new /icon('icons/mob/human.dmi', "[skin_tone]_[g]_s")
else
preview_icon = new /icon('icons/mob/human.dmi', "[pref_species.id]_[g]_s")
preview_icon.Blend("#[mutant_color]", ICON_MULTIPLY)
var/datum/sprite_accessory/S
if(underwear)
@@ -31,17 +36,19 @@ datum/preferences
if(S)
preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes_s")
eyes_s.Blend("#[eye_color]", ICON_MULTIPLY)
var/icon/eyes_s = new/icon()
if(EYECOLOR in pref_species.specflags)
eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[pref_species.eyes]_s")
eyes_s.Blend("#[eye_color]", ICON_MULTIPLY)
S = hair_styles_list[hair_style]
if(S)
if(S && (HAIR in pref_species.specflags))
var/icon/hair_s = new/icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s")
hair_s.Blend("#[hair_color]", ICON_MULTIPLY)
eyes_s.Blend(hair_s, ICON_OVERLAY)
S = facial_hair_styles_list[facial_hair_style]
if(S)
if(S && (FACEHAIR in pref_species.specflags))
var/icon/facial_s = new/icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s")
facial_s.Blend("#[facial_hair_color]", ICON_MULTIPLY)
eyes_s.Blend(facial_s, ICON_OVERLAY)
+6
View File
@@ -131,6 +131,12 @@
O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? FEMALE : MALE
O.dna = dna
if(!dna.species)
O.dna.species = new /datum/species/human()
else
O.dna.species = new dna.species.type()
dna = null
if (newname) //if there's a name as an argument, always take that one over the current name
O.real_name = newname
+2 -2
View File
@@ -80,8 +80,8 @@
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.dna && H.dna.mutantrace == "adamantine")
user << "<span class='notice'>Your metal fingers don't fit in the trigger guard!</span>"
if(H.dna && NOGUNS in H.dna.species.specflags)
user << "<span class='notice'>Your fingers don't fit in the trigger guard!</span>"
return
add_fingerprint(user)
+1
View File
@@ -58,6 +58,7 @@
if(!isliving(target)) return 0
if(isanimal(target)) return 0
var/mob/living/L = target
L.on_hit(type)
return L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, blocked)
proc/vol_by_damage()
+6 -2
View File
@@ -199,8 +199,12 @@ proc/wabbajack(mob/living/M)
var/mob/living/carbon/human/H = new_mob
ready_dna(H)
if(H.dna)
H.dna.mutantrace = pick("lizard","golem","slime","plant","fly","shadow","adamantine","skeleton",8;"")
H.update_body()
var/list/randspecies = list()
for(var/t in typesof(/datum/species)) // returns a bunch of types
var/datum/species/temp = new t()
randspecies += "[temp.type]"
var/datum/species/new_species = pick(randspecies)
H.dna.species = new new_species()
else
return
+5 -34
View File
@@ -82,32 +82,8 @@
flag = "energy"
on_hit(var/atom/target, var/blocked = 0)
if(iscarbon(target))
var/mob/living/carbon/M = target
if(check_dna_integrity(M) && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays.
if(prob(15))
M.apply_effect((rand(30,80)),IRRADIATE)
M.Weaken(5)
for (var/mob/V in viewers(src))
V.show_message("\red [M] writhes in pain as \his vacuoles boil.", 3, "\red You hear the crunching of leaves.", 2)
if(prob(35))
// for (var/mob/V in viewers(src)) //Public messages commented out to prevent possible metaish genetics experimentation and stuff. - Cheridan
// V.show_message("\red [M] is mutated by the radiation beam.", 3, "\red You hear the snapping of twigs.", 2)
if(prob(80))
randmutb(M)
domutcheck(M,null)
else
randmutg(M)
domutcheck(M,null)
else
M.adjustFireLoss(rand(5,15))
M.show_message("\red The radiation beam singes you!")
// for (var/mob/V in viewers(src))
// V.show_message("\red [M] is singed by the radiation beam.", 3, "\red You hear the crackle of burning leaves.", 2)
else
// for (var/mob/V in viewers(src))
// V.show_message("The radiation beam dissipates harmlessly through [M]", 3)
M.show_message("\blue The radiation beam dissipates harmlessly through your body.")
..()
return
/obj/item/projectile/energy/florayield
name = "beta somatoray"
@@ -117,14 +93,9 @@
nodamage = 1
flag = "energy"
on_hit(mob/living/carbon/target, var/blocked = 0)
if(iscarbon(target))
if(ishuman(target) && target.dna && target.dna.mutantrace == "plant") //These rays make plantmen fat.
target.nutrition = min(target.nutrition+30, 500)
else
target.show_message("\blue The radiation beam dissipates harmlessly through your body.")
else
return 1
on_hit(mob/living/carbon/human/target, var/blocked = 0)
..()
return
/obj/item/projectile/beam/mindflayer
+3 -1
View File
@@ -200,7 +200,9 @@ datum
for(var/A in reagent_list)
var/datum/reagent/R = A
if(M && R)
R.on_mob_life(M)
if(M.reagent_check(R) != 1)
R.on_mob_life(M)
update_total()
conditional_update_move(var/atom/A, var/Running = 0)
@@ -342,18 +342,6 @@ datum
reagent_state = LIQUID
color = "#13BC5E" // rgb: 19, 188, 94
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(ishuman(M))
var/mob/living/carbon/human/human = M
if(human.dna && !human.dna.mutantrace)
M << "<span class='danger'>Your flesh rapidly mutates!</span>"
human.dna.mutantrace = "slime"
human.update_body()
human.update_hair()
..()
return
aslimetoxin
name = "Advanced Mutation Toxin"
id = "amutationtoxin"
@@ -1507,11 +1495,6 @@ datum
var/mob/living/carbon/C = M
if(!C.wear_mask) // If not wearing a mask
C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.dna)
if(H.dna.mutantrace == "plant") //plantmen take a LOT of damage
H.adjustToxLoss(10)
toxin/plantbgone/weedkiller
name = "Weed Killer"
@@ -1534,11 +1517,6 @@ datum
var/mob/living/carbon/C = M
if(!C.wear_mask) // If not wearing a mask
C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.dna)
if(H.dna.mutantrace == "fly") //Botanists can now genocide plant and fly people alike.
H.adjustToxLoss(10)
toxin/stoxin
name = "Sleep Toxin"
@@ -59,6 +59,12 @@
return
if(ismob(target)) //Blood!
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H.dna)
if(NOBLOOD in H.dna.species.specflags)
user << "<span class='notice'>You are unable to locate any blood.</span>"
return
if(reagents.has_reagent("blood"))
user << "<span class='notice'>There is already a blood sample in this syringe.</span>"
return
+6 -2
View File
@@ -191,5 +191,9 @@ SEC_START_BRIG
## Set to 2 for "random", silicons will start with a random lawset picked from (at the time of writing): P.A.L.A.D.I.N., Corporate, Asimov. More can be added by changing the law datum paths in ai_laws.dm.
DEFAULT_LAWS 1
## Uncoment to give players the choice of their mutantrace before they join the game
#JOIN_WITH_MUTANT_RACE
## Uncoment to give players the choice of their species before they join the game
#JOIN_WITH_MUTANT_RACE
## Uncomment to allow certain species to have custom colors
#MUTANT_COLORS
Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 31 KiB

+2
View File
@@ -963,6 +963,8 @@
#include "code\modules\mob\living\carbon\human\life.dm"
#include "code\modules\mob\living\carbon\human\login.dm"
#include "code\modules\mob\living\carbon\human\say.dm"
#include "code\modules\mob\living\carbon\human\species.dm"
#include "code\modules\mob\living\carbon\human\species_types.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
#include "code\modules\mob\living\carbon\human\whisper.dm"
#include "code\modules\mob\living\carbon\metroid\death.dm"