Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into shadowling

Conflicts:
	code/modules/mob/living/carbon/human/human.dm
	code/setup.dm
This commit is contained in:
DZD
2015-04-21 18:56:34 -04:00
219 changed files with 3416 additions and 2007 deletions
+38
View File
@@ -987,3 +987,41 @@ proc/formatLocation(var/location)
proc/formatPlayerPanel(var/mob/U,var/text="PP")
return "<A HREF='?_src_=holder;adminplayeropts=\ref[U]'>[text]</A>"
//returns 1 to let the dragdrop code know we are trapping this event
//returns 0 if we don't plan to trap the event
/datum/admins/proc/cmd_ghost_drag(var/mob/dead/observer/frommob, var/mob/living/tomob)
if(!istype(frommob))
return //extra sanity check to make sure only observers are shoved into things
//same as assume-direct-control perm requirements.
if (!check_rights(R_VAREDIT,0) || !check_rights(R_ADMIN|R_DEBUG,0))
return 0
if (!frommob.ckey)
return 0
var/question = ""
if (tomob.ckey)
question = "This mob already has a user ([tomob.key]) in control of it! "
question += "Are you sure you want to place [frommob.name]([frommob.key]) in control of [tomob.name]?"
var/ask = alert(question, "Place ghost in control of mob?", "Yes", "No")
if (ask != "Yes")
return 1
if(!frommob || !tomob) //make sure the mobs don't go away while we waited for a response
return 1
if(tomob.client) //no need to ghostize if there is no client
tomob.ghostize(0)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].</span>")
log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].")
feedback_add_details("admin_verb","CGD")
tomob.ckey = frommob.ckey
qdel(frommob)
return 1
+1 -1
View File
@@ -268,7 +268,7 @@ var/list/forbidden_varedit_object_types = list(
/client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
if(!check_rights(R_VAREDIT)) return
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "cuffed", "ka", "last_eaten", "icon", "icon_state", "mutantrace")
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "cuffed", "ka", "last_eaten", "icon", "icon_state")
for(var/p in forbidden_varedit_object_types)
if( istype(O,p) )
@@ -516,7 +516,6 @@ client/proc/one_click_antag()
new_vox.real_name = capitalize(newname)
new_vox.name = new_vox.real_name
new_vox.age = rand(12,20)
new_vox.dna.mutantrace = "vox"
new_vox.set_species("Vox")
new_vox.languages = list() // Removing language from chargen.
new_vox.flavor_text = ""
+1 -1
View File
@@ -45,7 +45,7 @@
if(!status)
status = 1
bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]"
msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]")
msg_admin_attack("[key_name_admin(user)][isAntag(user) ? "(ANTAG)" : ""] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]")
user << "<span class='notice'>A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.</span>"
else
status = 0
-1
View File
@@ -23,7 +23,6 @@
var/corpseidjob = null // Needs to be in quotes, such as "Clown" or "Chef." This just determines what the ID reads as, not their access
var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access.
var/corpseidicon = null //For setting it to be a gold, silver, centcomm etc ID
var/mutantrace = "human"
var/timeofdeath = null
var/coffin = 0
@@ -80,19 +80,40 @@
user.mutations.Add(LASER)
user.mutations.Add(RESIST_COLD)
user.mutations.Add(XRAY)
user.dna.mutantrace = "shadow"
if(ishuman(user))
var/mob/living/carbon/human/human = user
if(human.species.name != "Shadow")
user << "\red Your flesh rapidly mutates!"
user << "<b>You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.</b>"
user << "\red Your body reacts violently to light. \green However, it naturally heals in darkness."
user << "Aside from your new traits, you are mentally unchanged and retain your prior obligations."
human.set_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"
if(ishuman(user))
var/mob/living/carbon/human/human = user
if(human.species.name != "Shadow")
user << "\red Your flesh rapidly mutates!"
user << "<b>You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.</b>"
user << "\red Your body reacts violently to light. \green However, it naturally heals in darkness."
user << "Aside from your new traits, you are mentally unchanged and retain your prior obligations."
human.set_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"
if(ishuman(user))
var/mob/living/carbon/human/human = user
if(human.species.name != "Shadow")
user << "\red Your flesh rapidly mutates!"
user << "<b>You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.</b>"
user << "\red Your body reacts violently to light. \green However, it naturally heals in darkness."
user << "Aside from your new traits, you are mentally unchanged and retain your prior obligations."
human.set_species("Shadow")
user.regenerate_icons()
if("To Kill")
user << "<B>Your wish is granted, but at a terrible cost...</B>"
@@ -107,7 +128,14 @@
for(var/datum/objective/OBJ in user.mind.objectives)
user << "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]"
obj_count++
user.dna.mutantrace = "shadow"
if(ishuman(user))
var/mob/living/carbon/human/human = user
if(human.species.name != "Shadow")
user << "\red Your flesh rapidly mutates!"
user << "<b>You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.</b>"
user << "\red Your body reacts violently to light. \green However, it naturally heals in darkness."
user << "Aside from your new traits, you are mentally unchanged and retain your prior obligations."
human.set_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>"
+1 -19
View File
@@ -123,8 +123,6 @@ datum/preferences
var/species = "Human"
var/language = "None" //Secondary language
var/slime_color = "blue" //need this for assigning to chars
var/HRslime_color = ""
var/speciesprefs = 0//I hate having to do this, I really do (Using this for oldvox code, making names universal I guess
@@ -354,15 +352,10 @@ datum/preferences
dat += "<br><b>Eyes</b><br>"
dat += "<a href='?_src_=prefs;preference=eyes;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]'><tr><td>__</td></tr></table></font><br>"
if(species == "Unathi" || species == "Tajaran" || species == "Skrell")
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People")
dat += "<br><b>Body Color</b><br>"
dat += "<a href='?_src_=prefs;preference=skin;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin)]'><tr><td>__</td></tr></table></font>"
if(species == "Slime People")
HRslime_color = capitalize(slime_color)
dat += "<br><b>Slime Color</b><br>"
dat += "<a href='?_src_=prefs;preference=slime_color;task=input'>Change Slime Color</a> <b>[HRslime_color]</b>"
dat += "</td></tr></table><hr><center>"
if (1) // General Preferences
@@ -1216,15 +1209,6 @@ datum/preferences
g_skin = hex2num(copytext(new_skin, 4, 6))
b_skin = hex2num(copytext(new_skin, 6, 8))
if("slime_color")
var/list/slime_colors
slime_colors = slime_colorh
if(species == "Slime People")
var/new_slime = input(user, "Choose your slime color: ", "Character Preference") as null|anything in slime_colors
if(new_slime)
slime_color = slime_colors[slime_colors.Find(new_slime)]
ShowChoices(user)
if("ooccolor")
var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference") as color|null
@@ -1482,8 +1466,6 @@ datum/preferences
character.h_style = h_style
character.f_style = f_style
character.slime_color = slime_color
// Destroy/cyborgize organs
+2 -4
View File
@@ -120,7 +120,6 @@
rlimb_data = params2list(query.item[51])
nanotrasen_relation = query.item[52]
speciesprefs = text2num(query.item[53])
slime_color = query.item[54]
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
@@ -129,7 +128,6 @@
if(isnull(language)) language = "None"
if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
if(isnull(speciesprefs)) speciesprefs = initial(speciesprefs)
if(isnull(slime_color)) slime_color = initial(slime_color)
if(!real_name) real_name = random_name(gender,species)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
gender = sanitize_gender(gender)
@@ -192,14 +190,14 @@
firstquery.Execute()
while(firstquery.NextRow())
if(text2num(firstquery.item[1]) == default_slot)
var/DBQuery/query = dbcon.NewQuery("UPDATE characters SET OOC_Notes='[sql_sanitize_text(metadata)]',real_name='[sql_sanitize_text(real_name)]',name_is_always_random='[be_random_name]',gender='[gender]',age='[age]',species='[sql_sanitize_text(species)]',language='[sql_sanitize_text(language)]',hair_red='[r_hair]',hair_green='[g_hair]',hair_blue='[b_hair]',facial_red='[r_facial]',facial_green='[g_facial]',facial_blue='[b_facial]',skin_tone='[s_tone]',skin_red='[r_skin]',skin_green='[g_skin]',skin_blue='[b_skin]',hair_style_name='[sql_sanitize_text(h_style)]',facial_style_name='[sql_sanitize_text(f_style)]',eyes_red='[r_eyes]',eyes_green='[g_eyes]',eyes_blue='[b_eyes]',underwear='[underwear]',undershirt='[undershirt]',backbag='[backbag]',b_type='[b_type]',alternate_option='[alternate_option]',job_support_high='[job_support_high]',job_support_med='[job_support_med]',job_support_low='[job_support_low]',job_medsci_high='[job_medsci_high]',job_medsci_med='[job_medsci_med]',job_medsci_low='[job_medsci_low]',job_engsec_high='[job_engsec_high]',job_engsec_med='[job_engsec_med]',job_engsec_low='[job_engsec_low]',job_karma_high='[job_karma_high]',job_karma_med='[job_karma_med]',job_karma_low='[job_karma_low]',flavor_text='[sql_sanitize_text(flavor_text)]',med_record='[sql_sanitize_text(med_record)]',sec_record='[sql_sanitize_text(sec_record)]',gen_record='[sql_sanitize_text(gen_record)]',player_alt_titles='[playertitlelist]',be_special='[be_special]',disabilities='[disabilities]',organ_data='[organlist]',rlimb_data='[rlimblist]',nanotrasen_relation='[nanotrasen_relation]', speciesprefs='[speciesprefs]', slime_color='[slime_color]' WHERE ckey='[C.ckey]' AND slot='[default_slot]'")
var/DBQuery/query = dbcon.NewQuery("UPDATE characters SET OOC_Notes='[sql_sanitize_text(metadata)]',real_name='[sql_sanitize_text(real_name)]',name_is_always_random='[be_random_name]',gender='[gender]',age='[age]',species='[sql_sanitize_text(species)]',language='[sql_sanitize_text(language)]',hair_red='[r_hair]',hair_green='[g_hair]',hair_blue='[b_hair]',facial_red='[r_facial]',facial_green='[g_facial]',facial_blue='[b_facial]',skin_tone='[s_tone]',skin_red='[r_skin]',skin_green='[g_skin]',skin_blue='[b_skin]',hair_style_name='[sql_sanitize_text(h_style)]',facial_style_name='[sql_sanitize_text(f_style)]',eyes_red='[r_eyes]',eyes_green='[g_eyes]',eyes_blue='[b_eyes]',underwear='[underwear]',undershirt='[undershirt]',backbag='[backbag]',b_type='[b_type]',alternate_option='[alternate_option]',job_support_high='[job_support_high]',job_support_med='[job_support_med]',job_support_low='[job_support_low]',job_medsci_high='[job_medsci_high]',job_medsci_med='[job_medsci_med]',job_medsci_low='[job_medsci_low]',job_engsec_high='[job_engsec_high]',job_engsec_med='[job_engsec_med]',job_engsec_low='[job_engsec_low]',job_karma_high='[job_karma_high]',job_karma_med='[job_karma_med]',job_karma_low='[job_karma_low]',flavor_text='[sql_sanitize_text(flavor_text)]',med_record='[sql_sanitize_text(med_record)]',sec_record='[sql_sanitize_text(sec_record)]',gen_record='[sql_sanitize_text(gen_record)]',player_alt_titles='[playertitlelist]',be_special='[be_special]',disabilities='[disabilities]',organ_data='[organlist]',rlimb_data='[rlimblist]',nanotrasen_relation='[nanotrasen_relation]', speciesprefs='[speciesprefs]' WHERE ckey='[C.ckey]' AND slot='[default_slot]'")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during character slot saving. Error : \[[err]\]\n")
message_admins("SQL ERROR during character slot saving. Error : \[[err]\]\n")
return
return 1
var/DBQuery/query = dbcon.NewQuery("INSERT INTO characters (ckey,slot,OOC_Notes,real_name,name_is_always_random,gender,age,species,language,hair_red,hair_green,hair_blue,facial_red,facial_green,facial_blue,skin_tone,skin_red,skin_green,skin_blue,hair_style_name,facial_style_name,eyes_red,eyes_green,eyes_blue,underwear,undershirt,backbag,b_type,alternate_option,job_support_high,job_support_med,job_support_low,job_medsci_high,job_medsci_med,job_medsci_low,job_engsec_high,job_engsec_med,job_engsec_low,job_karma_high,job_karma_med,job_karma_low,flavor_text,med_record,sec_record,gen_record,player_alt_titles,be_special,disabilities,organ_data,rlimb_data,nanotrasen_relation, speciesprefs, slime_color) VALUES ('[C.ckey]','[default_slot]','[sql_sanitize_text(metadata)]','[sql_sanitize_text(real_name)]','[be_random_name]','[gender]','[age]','[sql_sanitize_text(species)]','[sql_sanitize_text(language)]','[r_hair]','[g_hair]','[b_hair]','[r_facial]','[g_facial]','[b_facial]','[s_tone]','[r_skin]','[g_skin]','[b_skin]','[sql_sanitize_text(h_style)]','[sql_sanitize_text(f_style)]','[r_eyes]','[g_eyes]','[b_eyes]','[underwear]','[undershirt]','[backbag]','[b_type]','[alternate_option]','[job_support_high]','[job_support_med]','[job_support_low]','[job_medsci_high]','[job_medsci_med]','[job_medsci_low]','[job_engsec_high]','[job_engsec_med]','[job_engsec_low]','[job_karma_high]','[job_karma_med]','[job_karma_low]','[sql_sanitize_text(flavor_text)]','[sql_sanitize_text(med_record)]','[sql_sanitize_text(sec_record)]','[sql_sanitize_text(gen_record)]','[playertitlelist]','[be_special]','[disabilities]','[organlist]','[rlimblist]','[nanotrasen_relation]', '[speciesprefs]', '[slime_color]')")
var/DBQuery/query = dbcon.NewQuery("INSERT INTO characters (ckey,slot,OOC_Notes,real_name,name_is_always_random,gender,age,species,language,hair_red,hair_green,hair_blue,facial_red,facial_green,facial_blue,skin_tone,skin_red,skin_green,skin_blue,hair_style_name,facial_style_name,eyes_red,eyes_green,eyes_blue,underwear,undershirt,backbag,b_type,alternate_option,job_support_high,job_support_med,job_support_low,job_medsci_high,job_medsci_med,job_medsci_low,job_engsec_high,job_engsec_med,job_engsec_low,job_karma_high,job_karma_med,job_karma_low,flavor_text,med_record,sec_record,gen_record,player_alt_titles,be_special,disabilities,organ_data,rlimb_data,nanotrasen_relation, speciesprefs) VALUES ('[C.ckey]','[default_slot]','[sql_sanitize_text(metadata)]','[sql_sanitize_text(real_name)]','[be_random_name]','[gender]','[age]','[sql_sanitize_text(species)]','[sql_sanitize_text(language)]','[r_hair]','[g_hair]','[b_hair]','[r_facial]','[g_facial]','[b_facial]','[s_tone]','[r_skin]','[g_skin]','[b_skin]','[sql_sanitize_text(h_style)]','[sql_sanitize_text(f_style)]','[r_eyes]','[g_eyes]','[b_eyes]','[underwear]','[undershirt]','[backbag]','[b_type]','[alternate_option]','[job_support_high]','[job_support_med]','[job_support_low]','[job_medsci_high]','[job_medsci_med]','[job_medsci_low]','[job_engsec_high]','[job_engsec_med]','[job_engsec_low]','[job_karma_high]','[job_karma_med]','[job_karma_low]','[sql_sanitize_text(flavor_text)]','[sql_sanitize_text(med_record)]','[sql_sanitize_text(sec_record)]','[sql_sanitize_text(gen_record)]','[playertitlelist]','[be_special]','[disabilities]','[organlist]','[rlimblist]','[nanotrasen_relation]', '[speciesprefs]')")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during character slot saving. Error : \[[err]\]\n")
+14 -1
View File
@@ -131,9 +131,22 @@
else
src << "You will no longer hear ambient sounds."
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels.
set name = "Hear/Silence White Noise"
set category = "Preferences"
set desc = "Toggles hearing ambient white noise"
prefs.sound ^= SOUND_BUZZ
prefs.save_preferences(src)
if(prefs.sound & SOUND_BUZZ)
src << "You will now hear ambient white noise."
else
src << "You will no longer hear ambient white noise."
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/Toggle_Heartbeat() //to toggle off heartbeat sounds, in case they get too annoying
set name = "Hear/Silence Heartbeat"
set category = "Preferences"
+8 -1
View File
@@ -133,6 +133,9 @@
var/vision_flags = 0
var/darkness_view = 0//Base human is 2
var/invisa_view = 0
var/flash_protect = 0 //Mal: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Mal: Sets the item's level of visual impairment tint, normally set to the same as flash_protect
// but seperated to allow items to protect but not impair vision, like space helmets
species_restricted = list("exclude","Kidan")
/*
SEE_SELF // can see self, no matter what
@@ -236,7 +239,8 @@ BLIND // can't see anything
slot_flags = SLOT_HEAD
var/loose = 10 // probability (0..100) of coming off your head when you fall over or lay down
var/blockTracking // Do we block AI tracking?
var/flash_protect = 0
var/tint = 0
//Mask
/obj/item/clothing/mask
@@ -247,6 +251,8 @@ BLIND // can't see anything
var/mask_adjusted = 0
var/ignore_maskadjust = 1
var/adjusted_flags = null
var/flash_protect = 0
var/tint = 0
//Proc that moves gas/breath masks out of the way
/obj/item/clothing/mask/proc/adjustmask(var/mob/user)
@@ -324,6 +330,7 @@ BLIND // can't see anything
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona","Vox")
loose = 0 // What kind of idiot designs a pressurized suit where the helmet can fall off?
flash_protect = 2
/obj/item/clothing/suit/space
name = "Space suit"
+19
View File
@@ -137,6 +137,8 @@
icon_state = "sun"
item_state = "sunglasses"
darkness_view = 1
flash_protect = 1
tint = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
@@ -148,6 +150,8 @@
icon_state = "sun"
item_state = "sunglasses"
darkness_view = 1
flash_protect = 1
tint = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
@@ -160,6 +164,8 @@
item_state = "welding-g"
icon_action_button = "action_welding_g"
var/up = 0
flash_protect = 2
tint = 2
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
@@ -184,12 +190,16 @@
flags_inv |= HIDEEYES
icon_state = initial(icon_state)
usr << "You flip the [src] down to protect your eyes."
flash_protect = 2
tint = initial(tint) //better than istype
else
src.up = !src.up
src.flags &= ~HEADCOVERSEYES
flags_inv &= ~HIDEEYES
icon_state = "[initial(icon_state)]up"
usr << "You push the [src] up out of your face."
flash_protect = 0
tint = 0
usr.update_inv_glasses()
@@ -198,6 +208,8 @@
desc = "Welding goggles made from more expensive materials, strangely smells like potatoes."
icon_state = "rwelding-g"
item_state = "rwelding-g"
flash_protect = 2
tint = 0
icon_action_button = "action_welding_g"
species_fit = list("Vox")
sprite_sheets = list(
@@ -213,6 +225,8 @@
icon_state = "blindfold"
item_state = "blindfold"
//vision_flags = BLIND
flash_protect = 2
tint = 3 //to make them blind
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
@@ -230,6 +244,8 @@
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks many flashes."
icon_state = "bigsunglasses"
item_state = "bigsunglasses"
flash_protect = 1
tint = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
@@ -240,6 +256,8 @@
desc = "Sunglasses with a HUD."
icon_state = "sunhud"
darkness_view = 1
flash_protect = 1
tint = 1
var/obj/item/clothing/glasses/hud/security/hud = null
species_fit = list("Vox")
sprite_sheets = list(
@@ -259,6 +277,7 @@
origin_tech = "magnets=3"
vision_flags = SEE_MOBS
invisa_view = 2
flash_protect = -1
emp_act(severity)
if(istype(src.loc, /mob/living/carbon/human))
+2
View File
@@ -19,6 +19,7 @@
name = "Advanced Health Scanner HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their health status. Includes anti-flash filter."
icon_state = "advmedhud"
flash_protect = 1
/obj/item/clothing/glasses/hud/health/night
name = "Night Vision Health Scanner HUD"
@@ -40,6 +41,7 @@
desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records."
icon_state = "securityhud"
var/global/list/jobs[0]
flash_protect = 1
/obj/item/clothing/glasses/hud/security/jensenshades
name = "Augmented shades"
@@ -20,6 +20,8 @@
m_amt = 1750
g_amt = 400
var/up = 0
flash_protect = 2
tint = 2
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
icon_action_button = "action_welding"
@@ -44,12 +46,16 @@
flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
icon_state = initial(icon_state)
usr << "You flip the [src] down to protect your eyes."
flash_protect = 2
tint = 2
else
src.up = !src.up
src.flags &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH)
flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
icon_state = "[initial(icon_state)]up"
usr << "You push the [src] up out of your face."
flash_protect = 0
tint = 0
usr.update_inv_head() //so our mob-overlays update
@@ -126,6 +126,7 @@
desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies."
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
flash_protect = 0
//Mime's Hardsuit
/obj/item/clothing/head/helmet/space/eva/mime
+1
View File
@@ -490,6 +490,7 @@
_color = "medical"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
flash_protect = 0
/obj/item/clothing/suit/space/rig/medical
icon_state = "rig-medical"
-1
View File
@@ -140,7 +140,6 @@
/datum/file/data/genome/SE
name = "Structural Enzymes"
var/mutantrace = null
/datum/file/data/genome/UE
name = "Unique Enzymes"
+1 -1
View File
@@ -26,6 +26,6 @@
var/obj/vent = pick(vents)
var/obj/effect/spider/spiderling/S = new(vent.loc)
if(prob(66))
S.grow_as = /mob/living/simple_animal/hostile/giant_spider/nurse
S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse
vents -= vent
spawncount--
+2 -19
View File
@@ -44,25 +44,8 @@
spawn(rand(30,120))
var/blocked = list(/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/pirate,
/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/russian,
/mob/living/simple_animal/hostile/russian/ranged,
/mob/living/simple_animal/hostile/syndicate,
/mob/living/simple_animal/hostile/syndicate/melee,
/mob/living/simple_animal/hostile/syndicate/melee/space,
/mob/living/simple_animal/hostile/syndicate/ranged,
/mob/living/simple_animal/hostile/syndicate/ranged/space,
/mob/living/simple_animal/hostile/alien/queen/large,
/mob/living/simple_animal/hostile/faithless,
/mob/living/simple_animal/hostile/panther,
/mob/living/simple_animal/hostile/snake,
/mob/living/simple_animal/hostile/retaliate,
/mob/living/simple_animal/hostile/retaliate/clown,
/mob/living/simple_animal/hostile/spaceWorm/,
/mob/living/simple_animal/hostile/spaceWorm/wormHead/
)//exclusion list for things you don't want the reaction to create.
var/blocked = blocked_mobs //global variable for blocked mobs
var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
for(var/i = 1, i <= 5, i++)
+2 -2
View File
@@ -22,8 +22,8 @@
var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","psilocybin","lube",
"atrazine","banana","charcoal","space_drugs","methamphetamine","holywater","ethanol","hot_coco","facid",
"blood","morphine","fluorine","mutadone","mutagen","hydrocodone","fuel","cryptobiolin",
"haloperidol","mindbreaker","nanites","lipolicide","frostoil","salglu_solution","beepskysmash",
"blood","morphine","fluorine","mutadone","mutagen","hydrocodone","fuel",
"haloperidol","lsd","nanites","lipolicide","frostoil","salglu_solution","beepskysmash",
"omnizine", "amanitin", "adminordrazine", "neurotoxin", "synaptizine")
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = vent
+1 -2
View File
@@ -323,8 +323,7 @@
for(var/i=1,i<efficiency,i++)
cooked = new cooked.type(loc)
if(byproduct)
byproduct.loc = src.loc
byproduct = new byproduct.type(loc)
new byproduct(loc)
return
/obj/machinery/candy_maker/proc/wzhzhzh(var/seconds as num)
+4 -19
View File
@@ -218,29 +218,14 @@
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meatball
)
result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL
proc/warm_up(var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked)
being_cooked.warm = 1
being_cooked.reagents.add_reagent("omnizine", 15)
being_cooked.bitesize = 6
being_cooked.name = "Warm " + being_cooked.name
being_cooked.cooltime()
make_food(var/obj/container as obj)
var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked = ..(container)
warm_up(being_cooked)
return being_cooked
result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket
/datum/recipe/microwave/donkpocket/warm
reagents = list() //This is necessary since this is a child object of the above recipe and we don't want donk pockets to need flour
/datum/recipe/microwave/warmdonkpocket
items = list(
/obj/item/weapon/reagent_containers/food/snacks/donkpocket
)
result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL
make_food(var/obj/container as obj)
var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked = locate() in container
if(being_cooked && !being_cooked.warm)
warm_up(being_cooked)
return being_cooked
result = /obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket
/*
/datum/recipe/microwave/meatbread
+1 -1
View File
@@ -167,7 +167,7 @@
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Had the [src.name] used on them by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] on [M.name] ([M.ckey])</font>")
msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] on [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] used the [src.name] on [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+3 -3
View File
@@ -762,7 +762,7 @@ proc/populate_seed_list()
mutants = list("reishi","amanita","plumphelmet")
packet_icon = "mycelium-chanter"
plant_icon = "chanter"
chems = list("nutriment" = list(1,25))
chems = list("nutriment" = list(1,25), "fungus" = list(1,10))
lifespan = 35
maturation = 7
@@ -1255,7 +1255,7 @@ proc/populate_seed_list()
packet_icon = "seed-corn"
products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/corn)
plant_icon = "corn"
chems = list("nutriment" = list(1,10))
chems = list("nutriment" = list(1,10), "corn_starch" = list(3,5))
lifespan = 25
maturation = 8
@@ -1287,7 +1287,7 @@ proc/populate_seed_list()
packet_icon = "seed-wheat"
products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/wheat)
plant_icon = "wheat"
chems = list("nutriment" = list(1,25), "corn_starch" = list(3,5))
chems = list("nutriment" = list(1,25))
lifespan = 25
maturation = 6
+1 -1
View File
@@ -58,7 +58,7 @@
//*******************************//
var/list/fruit_icon_states = list("badrecipe","kudzupod","reishi","lime","grapes","boiledrorocore","chocolateegg")
var/list/reagent_effects = list("toxin","charcoal","morphine","space_drugs","mindbreaker","haloperidol")
var/list/reagent_effects = list("toxin","charcoal","morphine","space_drugs","lsd","haloperidol")
var/jungle_plants_init = 0
/proc/init_jungle_plants()
@@ -487,6 +487,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
src << browse(dat, "window=manifest;size=370x420;can_close=1")
//this is called when a ghost is drag clicked to something.
/mob/dead/observer/MouseDrop(atom/over)
if(!usr || !over) return
if (isobserver(usr) && usr.client && usr.client.holder && isliving(over))
if (usr.client.holder.cmd_ghost_drag(src,over))
return
return ..()
//BEGIN TELEPORT HREF CODE
/mob/dead/observer/Topic(href, href_list)
if(usr != src)
+35 -1
View File
@@ -260,7 +260,7 @@
desc = "The common galactic tongue."
speech_verb = "says"
whisper_verb = "whispers"
key = "0"
key = "9"
flags = RESTRICTED
syllables = list("blah","blah","blah","bleh","meh","neh","nah","wah")
@@ -468,6 +468,12 @@
. = (L in languages)
languages.Remove(L)
/mob/living/remove_language(rem_language)
var/datum/language/L = all_languages[rem_language]
if(default_language == L)
default_language = null
return ..()
// Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak(datum/language/speaking)
@@ -488,4 +494,32 @@
src << browse(dat, "window=checklanguage")
return
/mob/living/check_languages()
var/dat = "<b><font size = 5>Known Languages</font></b><br/><br/>"
if(default_language)
dat += "Current default language: [default_language] - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br/><br/>"
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
if(L == default_language)
dat += "<b>[L.name] (:[L.key])</b> - default - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br/>[L.desc]<br/><br/>"
else
dat += "<b>[L.name] (:[L.key])</b> - <a href='byond://?src=\ref[src];default_lang=[L]'>set default</a><br/>[L.desc]<br/><br/>"
src << browse(dat, "window=checklanguage")
/mob/living/Topic(href, href_list)
if(href_list["default_lang"])
if(href_list["default_lang"] == "reset")
set_default_language(null)
else
var/datum/language/L = all_languages[href_list["default_lang"]]
if(L)
set_default_language(L)
check_languages()
return 1
else
return ..()
#undef SCRAMBLE_CACHE_LEN
@@ -1,6 +1,6 @@
/mob/living/carbon/alien/hitby(atom/movable/AM)
..(AM, 1)
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
In all, this is a lot like the monkey code. /N
@@ -25,23 +25,8 @@ In all, this is a lot like the monkey code. /N
visible_message("<span class='notice'>[M.name] nuzzles [src] trying to wake it up!</span>")
if ("grab")
if (M == src || anchored)
return
if (!(status_flags & CANPUSH))
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
M.put_in_active_hand(G)
grabbed_by += G
G.synch()
LAssailant = M
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
src.grabbedby(M)
return 1
else
if (health > 0)
@@ -69,23 +54,7 @@ In all, this is a lot like the monkey code. /N
if("help")
help_shake_act(M)
if("grab")
if (M == src || anchored)
return
if (!(status_flags & CANPUSH))
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
M.put_in_active_hand(G)
grabbed_by += G
G.synch()
LAssailant = M
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
src.grabbedby(M)
if ("harm", "disarm")
return 1
return 0
@@ -47,7 +47,7 @@
real_name = src.name
verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/resin)
verbs -= /mob/living/carbon/alien/verb/alien_ventcrawl
verbs -= /mob/living/carbon/alien/verb/ventcrawl
..()
/mob/living/carbon/alien/humanoid/empress
@@ -65,9 +65,9 @@
return (tally + move_delay_add + config.alien_delay)
/mob/living/carbon/alien/humanoid/Process_Spacemove(var/check_drift = 0)
if(..())
if(..())
return 1
return 0
///mob/living/carbon/alien/humanoid/bullet_act(var/obj/item/projectile/Proj) taken care of in living
@@ -24,7 +24,7 @@
real_name = src.name
verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin,/mob/living/carbon/alien/humanoid/proc/resin)
verbs -= /mob/living/carbon/alien/verb/alien_ventcrawl
verbs -= /mob/living/carbon/alien/verb/ventcrawl
..()
@@ -1,5 +1,5 @@
/mob/living/carbon/alien/verb/alien_ventcrawl() // -- TLE
set name = "Crawl through vent (alien)"
/mob/living/carbon/alien/verb/ventcrawl(var/atom/pipe) // -- TLE
set name = "Crawl Through Vent(Alien)"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Alien"
handle_ventcrawl()
handle_ventcrawl(pipe)
+6 -1
View File
@@ -16,10 +16,15 @@
return emote(copytext(message,2))
var/datum/language/speaking = parse_language(message)
if(speaking)
message = copytext(message,2+length(speaking.key))
else
speaking = all_languages["Xenomorph"]
var/quickcheck = get_default_language()
if(quickcheck)
speaking = get_default_language()
else //because no clue how to actually set xeno's default language since they aren't a species, just do it here
speaking = all_languages["Xenomorph"]
var/ending = copytext(message, length(message))
if (speaking)
@@ -67,7 +67,9 @@
if(target.key)
target.ghostize()
var/mob/living/carbon/C = target
if(istype(C))
C.brain_op_stage = 1.0
if(brainmob)
if(brainmob.mind)
brainmob.mind.transfer_to(target)
@@ -78,13 +80,11 @@
/obj/item/organ/brain/slime
name = "slime core"
desc = "A complex, organic knot of jelly and crystalline particles."
robotic = 2
icon = 'icons/mob/slimes.dmi'
icon_state = "green slime extract"
/obj/item/organ/brain/golem
name = "chem"
desc = "A tightly furled roll of paper, covered with indecipherable runes."
robotic = 2
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"
+78 -93
View File
@@ -1,3 +1,6 @@
mob/living
var/canEnterVentWith = "/obj/item/weapon/implant=0&/obj/item/clothing/mask/facehugger=0&/obj/item/device/radio/borg=0&/obj/machinery/camera=0"
/mob/living/carbon/Login()
..()
update_hud()
@@ -244,6 +247,9 @@
/mob/living/carbon/proc/eyecheck()
return 0
/mob/living/carbon/proc/tintcheck()
return 0
/mob/living/carbon/proc/getDNA()
return dna
@@ -253,104 +259,83 @@
/mob/living/carbon/can_use_vents()
return
/mob/living/proc/handle_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent_found = null, var/ignore_items = 0) // -- TLE -- Merged by Carn
if(stat)
src << "You must be conscious to do this!"
return
if(lying)
src << "You can't vent crawl while you're stunned!"
return
/mob/living/proc/handle_ventcrawl(var/atom/clicked_on) // -- TLE -- Merged by Carn
diary << "[src] is ventcrawling."
if(!stat)
if(!lying)
var/special_fail_msg = can_use_vents()
if(special_fail_msg)
src << "\red [special_fail_msg]"
return
/*
if(clicked_on)
world << "We start with [clicked_on], and [clicked_on.type]"
*/
var/obj/machinery/atmospherics/unary/vent_found
if(clicked_on && Adjacent(clicked_on))
vent_found = clicked_on
if(!istype(vent_found) || !vent_found.can_crawl_through())
vent_found = null
if(!vent_found)
for(var/obj/machinery/atmospherics/machine in range(1,src))
if(is_type_in_list(machine, ventcrawl_machinery))
vent_found = machine
if(!vent_found.can_crawl_through())
vent_found = null
if(vent_found)
break
if(vent_found)
if(vent_found.network && (vent_found.network.normal_members.len || vent_found.network.line_members.len))
src << "You begin climbing into the ventilation system..."
if(!do_after(src, 45))
return
if(!client)
return
if(contents.len && !isrobot(src))
for(var/obj/item/carried_item in contents)//If the ventcrawler got on objects.
if(!(isInTypes(carried_item, canEnterVentWith)))
src << "<SPAN CLASS='warning'>You can't be carrying items or have items equipped when vent crawling!</SPAN>"
return
visible_message("<B>[src] scrambles into the ventilation ducts!</B>", "You climb into the ventilation system.")
loc = vent_found
add_ventcrawl(vent_found)
else
src << "This vent is not connected to anything."
else
src << "You must be standing on or beside an air vent to enter it."
else
src << "You can't vent crawl while you're stunned!"
if(vent_found) // one was passed in, probably from vent/AltClick()
if(vent_found.welded)
src << "That vent is welded shut."
return
if(!vent_found.Adjacent(src))
return // don't even acknowledge that
else
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
if(!v.welded)
if(v.Adjacent(src))
vent_found = v
if(!vent_found)
src << "You'll need a non-welded vent to crawl into!"
return
src << "You must be conscious to do this!"
return
if(!vent_found.network || !vent_found.network.normal_members.len)
src << "This vent is not connected to anything."
return
/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/unary/starting_machine)
for(var/datum/pipeline/pipeline in starting_machine.network.line_members)
for(var/atom/A in (pipeline.members || pipeline.edges))
var/image/new_image = image(A, A.loc, dir = A.dir)
pipes_shown += new_image
client.images += new_image
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
if(temp_vent.welded)
continue
if(temp_vent in loc)
continue
var/turf/T = get_turf(temp_vent)
/mob/living/proc/remove_ventcrawl()
for(var/image/current_image in pipes_shown)
client.images -= current_image
if(!T || T.z != loc.z)
continue
pipes_shown.len = 0
var/i = 1
var/index = "[T.loc.name]\[[i]\]"
while(index in vents)
i++
index = "[T.loc.name]\[[i]\]"
vents[index] = temp_vent
if(!vents.len)
src << "\red There are no available vents to travel to, they could be welded."
return
var/obj/selection = input("Select a destination.", "Duct System") as null|anything in sortAssoc(vents)
if(!selection) return
if(!vent_found.Adjacent(src))
src << "Never mind, you left."
return
if(!ignore_items)
for(var/obj/item/carried_item in contents)//If the monkey got on objects.
if( !istype(carried_item, /obj/item/weapon/implant) && !istype(carried_item, /obj/item/clothing/mask/facehugger) )//If it's not an implant or a facehugger
src << "\red You can't be carrying items or have items equipped when vent crawling!"
return
if(isslime(src))
var/mob/living/carbon/slime/S = src
if(S.Victim)
src << "\red You'll have to let [S.Victim] go or finish eating \him first."
return
var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection]
if(!target_vent)
return
for(var/mob/O in viewers(src, null))
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
loc = target_vent
var/travel_time = round(get_dist(loc, target_vent.loc) / 2)
spawn(travel_time)
if(!target_vent) return
for(var/mob/O in hearers(target_vent,null))
O.show_message("You hear something squeezing through the ventilation ducts.",2)
sleep(travel_time)
if(!target_vent) return
if(target_vent.welded) //the vent can be welded while alien scrolled through the list or travelled.
target_vent = vent_found //travel back. No additional time required.
src << "\red The vent you were heading to appears to be welded."
loc = target_vent.loc
var/area/new_area = get_area(loc)
if(new_area)
new_area.Entered(src)
if(client)
client.eye = src
/mob/living/carbon/clean_blood()
. = ..()
@@ -414,7 +399,7 @@
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
msg_admin_attack("[usr.name] ([usr.ckey]) has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
msg_admin_attack("[usr.name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
if(!iscarbon(usr))
M.LAssailant = null
@@ -631,4 +616,4 @@
return 0
/mob/living/carbon/is_muzzled()
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
+44 -28
View File
@@ -42,6 +42,9 @@
prev_gender = gender // Debug for plural genders
make_blood()
var/mob/M = src
faction |= "\ref[M]"
// Set up DNA.
if(!delay_ready_dna)
dna.ready_dna(src)
@@ -98,6 +101,14 @@
h_style = "blue IPC screen"
..(new_loc, "Machine")
/mob/living/carbon/human/shadow/New(var/new_loc)
h_style = "Bald"
..(new_loc, "Shadow")
/mob/living/carbon/human/golem/New(var/new_loc)
h_style = "Bald"
..(new_loc, "Golem")
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
if ((!( yes ) || now_pushing))
return
@@ -1027,29 +1038,32 @@
///Returns a number between -1 to 2
/mob/living/carbon/human/eyecheck()
var/number = 0
if(istype(src.head, /obj/item/clothing/head/welding))
if(!src.head:up)
number += 2
if(istype(src.head, /obj/item/clothing/head/helmet/space))
number += 2
if(istype(src.head, /obj/item/clothing/head/helmet/space/eva))
number -= 2
if(istype(src.head, /obj/item/clothing/head/helmet/space/rig/medical))
number -= 2
if(istype(src.glasses, /obj/item/clothing/glasses/thermal))
number -= 1
if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses))
number += 1
if(istype(src.glasses, /obj/item/clothing/glasses/hud/health_advanced)) // New blueshield / brig phys no flash medi hud
number += 1
if(istype(src.glasses, /obj/item/clothing/glasses/night/shadowling))
number += 2
if(istype(src.glasses, /obj/item/clothing/glasses/welding))
var/obj/item/clothing/glasses/welding/W = src.glasses
if(!W.up)
number += 2
if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head
var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item
number += HFP.flash_protect
if(istype(src.glasses, /obj/item/clothing/glasses)) //glasses
var/obj/item/clothing/glasses/GFP = src.glasses
number += GFP.flash_protect
if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask
var/obj/item/clothing/mask/MFP = src.wear_mask
number += MFP.flash_protect
return number
///tintcheck()
///Checks eye covering items for visually impairing tinting, such as welding masks
///Checked in life.dm. 0 & 1 = no impairment, 2 = welding mask overlay, 3 = You can see jack, but you can't see shit.
/mob/living/carbon/human/tintcheck()
var/tinted = 0
if(istype(src.head, /obj/item/clothing/head))
var/obj/item/clothing/head/HT = src.head
tinted += HT.tint
if(istype(src.glasses, /obj/item/clothing/glasses))
var/obj/item/clothing/glasses/GT = src.glasses
tinted += GT.tint
if(istype(src.wear_mask, /obj/item/clothing/mask))
var/obj/item/clothing/mask/MT = src.wear_mask
tinted += MT.tint
return tinted
/mob/living/carbon/human/IsAdvancedToolUser()
return 1//Humans can use guns and such
@@ -1074,9 +1088,6 @@
if(!species)
set_species()
if(dna && dna.mutantrace == "golem")
return "Animated Construct"
return species.name
/mob/living/carbon/human/proc/play_xylophone()
@@ -1379,7 +1390,6 @@
dna = new /datum/dna(null)
dna.species = species.name
dna.real_name = real_name
dna.mutantrace = null
species.handle_post_spawn(src)
@@ -1394,6 +1404,15 @@
else
return 0
/mob/living/carbon/human/get_default_language()
if(default_language)
return default_language
if(!species)
return null
return species.default_language ? all_languages[species.default_language] : null
/mob/living/carbon/human/proc/bloody_doodle()
set category = "IC"
set name = "Write in blood"
@@ -1628,9 +1647,6 @@
if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/rig/wizard))
threatcount += 2
//Check for nonhuman scum
if(dna && dna.mutantrace && dna.mutantrace != "none")
threatcount += 1
//Loyalty implants imply trustworthyness
if(isloyal(src))
@@ -53,6 +53,8 @@
// log_debug("No gloves, [M] is truing to infect [src]")
M.spread_disease_to(src, "Contact")
var/datum/martial_art/attacker_style = M.martial_art
switch(M.a_intent)
if("help")
if(health >= config.health_threshold_crit)
@@ -81,149 +83,142 @@
return 1
if("grab")
if(M == src || anchored)
return 0
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)
grabbed_by += 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>")
add_logs(src, M, "grabbed", addition="passively")
return 1
if(attacker_style && attacker_style.grab_act(H, src))
return 1
else
src.grabbedby(M)
return 1
if("harm")
var/datum/unarmed_attack/attack = M.species.unarmed
//Vampire code
if(M.zone_sel && M.zone_sel.selecting == "head" && src != M)
if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining)
if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove their mask!"
return 0
if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove your mask!"
return 0
if(mind && mind.vampire && (mind in ticker.mode.vampires))
M << "\red Your fangs fail to pierce [src.name]'s cold flesh"
return 0
if(SKELETON in mutations)
M << "\red There is no blood in a skeleton!"
return 0
//we're good to suck the blood, blaah
M.handle_bloodsucking(src)
add_logs(src, M, "vampirebit")
message_admins("[M.name] ([M.ckey]) vampirebit [src.name] ([src.ckey])")
return
//end vampire codes
M.do_attack_animation(src)
add_logs(src, M, "[pick(attack.attack_verb)]ed")
if(!iscarbon(M))
LAssailant = null
if(attacker_style && attacker_style.harm_act(H, src))
return 1
else
LAssailant = M
var/datum/unarmed_attack/attack = M.species.unarmed
var/damage = rand(0, M.species.max_hurt_damage)//BS12 EDIT
if(!damage)
playsound(loc, attack.miss_sound, 25, 1, -1)
visible_message("\red <B>[M] tried to [pick(attack.attack_verb)] [src]!</B>")
return 0
//Vampire code
if(M.zone_sel && M.zone_sel.selecting == "head" && src != M)
if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining)
if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove their mask!"
return 0
if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove your mask!"
return 0
if(mind && mind.vampire && (mind in ticker.mode.vampires))
M << "\red Your fangs fail to pierce [src.name]'s cold flesh"
return 0
if(SKELETON in mutations)
M << "\red There is no blood in a skeleton!"
return 0
//we're good to suck the blood, blaah
M.handle_bloodsucking(src)
add_logs(src, M, "vampirebit")
message_admins("[M.name] ([M.ckey]) vampirebit [src.name] ([src.ckey])")
return
//end vampire codes
M.do_attack_animation(src)
add_logs(src, M, "[pick(attack.attack_verb)]ed")
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
if(HULK in M.mutations)
damage += 5
Weaken(4)
playsound(loc, attack.attack_sound, 25, 1, -1)
visible_message("\red <B>[M] [pick(attack.attack_verb)]ed [src]!</B>")
damage += attack.damage
apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
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(src, M, "disarmed")
if(w_uniform)
w_uniform.add_fingerprint(M)
var/obj/item/organ/external/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("\red <B>[M] has pushed [src]!</B>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Pushed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been pushed by [M.name] ([M.ckey])</font>")
if(!iscarbon(M))
LAssailant = null
else
LAssailant = M
log_attack("[M.name] ([M.ckey]) pushed [src.name] ([src.ckey])")
return
var/damage = rand(0, M.species.max_hurt_damage)//BS12 EDIT
if(!damage)
playsound(loc, attack.miss_sound, 25, 1, -1)
visible_message("\red <B>[M] tried to [pick(attack.attack_verb)] [src]!</B>")
return 0
/* if(randn <= 45 && !lying)
if(head)
var/obj/item/clothing/head/H = head
if(!istype(H) || prob(H.loose))
if(unEquip(H))
if(prob(60))
step_away(H,M)
visible_message("<span class='warning'>[M] has knocked [src]'s [H] off!</span>",
"<span class='warning'>[M] knocked \the [H] clean off your head!</span>") */
var/talked = 0 // BubbleWrap
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
if(randn <= 60)
//BubbleWrap: Disarming breaks a pull
if(pulling)
visible_message("\red <b>[M] has broken [src]'s grip on [pulling]!</B>")
talked = 1
stop_pulling()
if(HULK in M.mutations)
damage += 5
Weaken(4)
//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("\red <b>[M] has broken [src]'s grip on [lgrab.affecting]!</B>")
playsound(loc, attack.attack_sound, 25, 1, -1)
visible_message("\red <B>[M] [pick(attack.attack_verb)]ed [src]!</B>")
damage += attack.damage
apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
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")
if(attacker_style && attacker_style.disarm_act(H, src))
return 1
else
add_logs(src, M, "disarmed")
if(w_uniform)
w_uniform.add_fingerprint(M)
var/obj/item/organ/external/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("\red <B>[M] has pushed [src]!</B>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Pushed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been pushed by [M.name] ([M.ckey])</font>")
if(!iscarbon(M))
LAssailant = null
else
LAssailant = M
log_attack("[M.name] ([M.ckey]) pushed [src.name] ([src.ckey])")
return
/* if(randn <= 45 && !lying)
if(head)
var/obj/item/clothing/head/H = head
if(!istype(H) || prob(H.loose))
if(unEquip(H))
if(prob(60))
step_away(H,M)
visible_message("<span class='warning'>[M] has knocked [src]'s [H] off!</span>",
"<span class='warning'>[M] knocked \the [H] clean off your head!</span>") */
var/talked = 0 // BubbleWrap
if(randn <= 60)
//BubbleWrap: Disarming breaks a pull
if(pulling)
visible_message("\red <b>[M] has broken [src]'s grip on [pulling]!</B>")
talked = 1
spawn(1)
del(lgrab)
if(istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/rgrab = r_hand
if(rgrab.affecting)
visible_message("\red <b>[M] has broken [src]'s grip on [rgrab.affecting]!</B>")
talked = 1
spawn(1)
del(rgrab)
//End BubbleWrap
stop_pulling()
if(!talked) //BubbleWrap
if(drop_item())
visible_message("\red <B>[M] has disarmed [src]!</B>")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
return
//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("\red <b>[M] has broken [src]'s grip on [lgrab.affecting]!</B>")
talked = 1
spawn(1)
del(lgrab)
if(istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/rgrab = r_hand
if(rgrab.affecting)
visible_message("\red <b>[M] has broken [src]'s grip on [rgrab.affecting]!</B>")
talked = 1
spawn(1)
del(rgrab)
//End BubbleWrap
if(!talked) //BubbleWrap
if(drop_item())
visible_message("\red <B>[M] has disarmed [src]!</B>")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
return
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
@@ -310,17 +310,7 @@ This function restores all organs.
damage = damage*species.brute_mod
if(organ.take_damage(damage, 0, sharp, edge, used_weapon))
UpdateDamageIcon()
var/list/attack_bubble_recipients = list()
var/mob/living/user
for(var/mob/O in viewers(user, src))
if (O.client && !( O.blinded ))
attack_bubble_recipients.Add(O.client)
spawn(0)
var/image/dmgIcon = image('icons/mob/hit_blips.dmi', src, "dmg[rand(1,2)]",MOB_LAYER+1)
dmgIcon.pixel_x = (!lying) ? rand(-3,3) : rand(-11,12)
dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1)
//world << "x: [dmgIcon.pixel_x] AND y: [dmgIcon.pixel_y]"
flick_overlay(dmgIcon, attack_bubble_recipients, 9)
receive_damage()
if(BURN)
damageoverlaytemp = 20
if(species && species.burn_mod)
@@ -218,7 +218,7 @@ emp_act
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
if(istype(I, /obj/item/weapon/butch/meatcleaver) && src.stat == DEAD && user.a_intent == "harm")
if((istype(I, /obj/item/weapon/butch/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == "harm")
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc))
newmeat.name = src.real_name + newmeat.name
newmeat.subjectname = src.real_name
@@ -231,7 +231,7 @@ emp_act
if(!src.meatleft)
src.attack_log += "\[[time_stamp()]\] Was chopped up into meat by <b>[user]/[user.ckey]</b>"
user.attack_log += "\[[time_stamp()]\] Chopped up <b>[src]/[src.ckey]</b> into meat</b>"
msg_admin_attack("[user.name] ([user.ckey]) chopped up [src] ([src.ckey]) into meat (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] chopped up [src] ([src.ckey]) into meat (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(!iscarbon(user))
LAssailant = null
else
@@ -384,7 +384,7 @@ emp_act
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey])[isAntag(M) ? "(ANTAG)" : ""] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
//thrown weapon embedded object code.
if(dtype == BRUTE && istype(O,/obj/item))
@@ -24,6 +24,7 @@
var/b_skin = 0
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
var/lip_color = "white"
var/age = 30 //Player's age (pure fluff)
var/b_type = "A+" //Player's bloodtype
@@ -55,6 +56,8 @@
var/speech_problem_flag = 0
var/datum/martial_art/martial_art = null
var/miming = null //Toggle for the mime's abilities.
var/special_voice = "" // For changing our voice. Used by a symptom.
var/said_last_words=0
@@ -111,6 +111,9 @@
if(!. || !I)
return
var/obj/item/organ/O = I //Organs shouldn't be removed unless you call droplimb.
if(istype(O) && O.owner == src)
return
if(I == wear_suit)
if(s_store)
+24 -83
View File
@@ -24,6 +24,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
"4" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay4"),\
"5" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay5"),\
"6" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay6"))
#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
@@ -36,6 +40,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
var/exposedtimenow = 0
var/firstexposed = 0
var/heartbeat = 0
var/tinttotal = 0 // Total level of visually impairing items
/mob/living/carbon/human/Life()
set invisibility = 0
@@ -52,6 +57,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
//to find it.
blinded = null
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
// update the current life tick, can be used to e.g. only do something every 4 ticks
@@ -697,63 +703,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
return min(1,thermal_protection)
/*
proc/add_fire_protection(var/temp)
var/fire_prot = 0
if(head)
if(head.protective_temperature > temp)
fire_prot += (head.protective_temperature/10)
if(wear_mask)
if(wear_mask.protective_temperature > temp)
fire_prot += (wear_mask.protective_temperature/10)
if(glasses)
if(glasses.protective_temperature > temp)
fire_prot += (glasses.protective_temperature/10)
if(ears)
if(ears.protective_temperature > temp)
fire_prot += (ears.protective_temperature/10)
if(wear_suit)
if(wear_suit.protective_temperature > temp)
fire_prot += (wear_suit.protective_temperature/10)
if(w_uniform)
if(w_uniform.protective_temperature > temp)
fire_prot += (w_uniform.protective_temperature/10)
if(gloves)
if(gloves.protective_temperature > temp)
fire_prot += (gloves.protective_temperature/10)
if(shoes)
if(shoes.protective_temperature > temp)
fire_prot += (shoes.protective_temperature/10)
return fire_prot
proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity)
if(nodamage)
return
//world <<"body_part = [body_part], exposed_temperature = [exposed_temperature], exposed_intensity = [exposed_intensity]"
var/discomfort = min(abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0)
if(exposed_temperature > bodytemperature)
discomfort *= 4
if(mutantrace == "plant")
discomfort *= TEMPERATURE_DAMAGE_COEFFICIENT * 2 //I don't like magic numbers. I'll make mutantraces a datum with vars sometime later. -- Urist
else
discomfort *= TEMPERATURE_DAMAGE_COEFFICIENT //Dangercon 2011 - now with less magic numbers!
//world <<"[discomfort]"
switch(body_part)
if(HEAD)
apply_damage(2.5*discomfort, BURN, "head")
if(UPPER_TORSO)
apply_damage(2.5*discomfort, BURN, "chest")
if(LEGS)
apply_damage(0.6*discomfort, BURN, "l_leg")
apply_damage(0.6*discomfort, BURN, "r_leg")
if(ARMS)
apply_damage(0.4*discomfort, BURN, "l_arm")
apply_damage(0.4*discomfort, BURN, "r_arm")
*/
proc/get_covered_bodyparts()
var/covered = 0
@@ -828,7 +777,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
SetWeakened(0)
SetStunned(0)
if(dna && dna.mutantrace == "shadow")
if(species.light_dam)
var/light_amount = 0
if(isturf(loc))
var/turf/T = loc
@@ -836,11 +785,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
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
if(light_amount > species.light_dam) //if there's enough light, start dying
take_overall_damage(1,1)
else if (light_amount < 2) //heal in the dark
else //heal in the dark
heal_overall_damage(1,1)
//The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered.
if(species.flags & CAN_BE_FAT)
if(FAT in mutations)
@@ -1028,9 +978,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
else if(eye_blind) //blindness, heals slowly over time
eye_blind = max(eye_blind-1,0)
blinded = 1
else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster
else if(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster
eye_blurry = max(eye_blurry-3, 0)
blinded = 1
// blinded = 1 //now handled under /handle_regular_hud_updates()
else if(eye_blurry) //blurry eyes heal slowly
eye_blurry = max(eye_blurry-1, 0)
@@ -1188,14 +1138,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(healths) healths.icon_state = "health7" //DEAD healthmeter
else
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
if(dna)
switch(dna.mutantrace)
if("slime")
see_in_dark = 3
see_invisible = SEE_INVISIBLE_LEVEL_ONE
if("shadow")
see_in_dark = 8
see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
if(mind && mind.vampire)
if((VAMP_VISION in mind.vampire.powers) && !(VAMP_FULL in mind.vampire.powers))
@@ -1358,6 +1300,16 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
bodytemp.icon_state = "temp-1"
else
bodytemp.icon_state = "temp0"
// 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
@@ -1373,19 +1325,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(eye_blurry) client.screen += global_hud.blurry
if(druggy) client.screen += global_hud.druggy
var/masked = 0
if( istype(head, /obj/item/clothing/head/welding) || istype(head, /obj/item/clothing/head/helmet/space/unathi))
var/obj/item/clothing/head/welding/O = head
if(!O.up && tinted_weldhelh)
client.screen += global_hud.darkMask
masked = 1
if(!masked && istype(glasses, /obj/item/clothing/glasses/welding) )
var/obj/item/clothing/glasses/welding/O = glasses
if(!O.up && tinted_weldhelh)
client.screen += global_hud.darkMask
if(machine)
if(!machine.check_eye(src)) reset_view(null)
else
@@ -1636,6 +1575,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
var/obj/item/clothing/mask/M = H.wear_mask
if(M && (M.flags & MASKCOVERSMOUTH))
return
if(H.species && H.species.flags & NO_BREATHE)
return //no puking if you can't smell!
H << "<spawn class='warning'>You smell something foul..."
H.fakevomit()
+3 -3
View File
@@ -16,7 +16,7 @@
if(stat == 2)
return say_dead(message)
return
if (is_muzzled())
src << "<span class='danger'>You're muzzled and cannot speak!</span>"
return
@@ -40,8 +40,8 @@
var/datum/language/speaking = parse_language(message)
if(speaking)
message = copytext(message,2+length(speaking.key))
else if(species.default_language)
speaking = all_languages[species.default_language]
else
speaking = get_default_language()
var/ending = copytext(message, length(message))
if (speaking)
@@ -0,0 +1,100 @@
/datum/species/golem
name = "Golem"
icobase = 'icons/mob/human_races/r_golem.dmi'
deform = 'icons/mob/human_races/r_golem.dmi'
default_language = "Galactic Common"
flags = NO_BREATHE | NO_PAIN | NO_BLOOD | NO_SCAN
blood_color = "#515573"
flesh_color = "#137E8F"
has_organ = list(
"brain" = /obj/item/organ/brain/golem
)
/datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H)
if(H.mind)
H.mind.assigned_role = "Golem"
H.mind.special_role = "Golem"
H.real_name = "adamantine golem ([rand(1, 1000)])"
H.name = H.real_name
H.equip_to_slot_or_del(new /obj/item/clothing/under/golem(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/golem(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/golem(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/golem(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/golem(H), slot_gloves)
..()
////////Adamantine Golem stuff I dunno where else to put it
/obj/item/clothing/under/golem
name = "adamantine skin"
desc = "a golem's skin"
icon_state = "golem"
item_state = "golem"
_color = "golem"
has_sensor = 0
flags = ABSTRACT | NODROP
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/golem
name = "adamantine shell"
desc = "a golem's thick outter shell"
icon_state = "golem"
item_state = "golem"
w_class = 4//bulky item
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD
slowdown = 1.0
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
flags = ONESIZEFITSALL | STOPSPRESSUREDMAGE | ABSTRACT | NODROP
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/shoes/golem
name = "golem's feet"
desc = "sturdy adamantine feet"
icon_state = "golem"
item_state = "golem"
flags = NOSLIP | ABSTRACT | MASKINTERNALS | MASKCOVERSMOUTH | NODROP
slowdown = SHOES_SLOWDOWN+1
/obj/item/clothing/mask/gas/golem
name = "golem's face"
desc = "the imposing face of an adamantine golem"
icon_state = "golem"
item_state = "golem"
siemens_coefficient = 0
unacidable = 1
flags = ABSTRACT | NODROP
/obj/item/clothing/gloves/golem
name = "golem's hands"
desc = "strong adamantine hands"
icon_state = "golem"
item_state = null
siemens_coefficient = 0
flags = ABSTRACT | NODROP
/obj/item/clothing/head/space/golem
icon_state = "golem"
item_state = "dermal"
_color = "dermal"
name = "golem's head"
desc = "a golem's head"
unacidable = 1
flags = STOPSPRESSUREDMAGE | ABSTRACT | NODROP
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
@@ -187,37 +187,30 @@
src << "\red You feel your face freezing and an icicle forming in your lungs!"
else if(breath.temperature > heat_level_1)
if(prob(20))
if(H.dna.mutantrace == "slime")
src << "\red You feel supercharged by the extreme heat!"
else
src << "\red You feel your face burning and a searing heat in your lungs!"
if(H.dna.mutantrace == "slime")
if(breath.temperature < cold_level_1)
H.adjustToxLoss(round(cold_level_1 - breath.temperature))
src << "\red You feel your face burning and a searing heat in your lungs!"
switch(breath.temperature)
if(-INFINITY to cold_level_3)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
else
switch(breath.temperature)
if(-INFINITY to cold_level_3)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_3 to cold_level_2)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_3 to cold_level_2)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_2 to cold_level_1)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_2 to cold_level_1)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(heat_level_1 to heat_level_2)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_1 to heat_level_2)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_2 to heat_level_3)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_2 to heat_level_3)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_3 to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_3 to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
return 1
@@ -0,0 +1,23 @@
/datum/species/shadow
name = "Shadow"
icobase = 'icons/mob/human_races/r_shadow.dmi'
deform = 'icons/mob/human_races/r_shadow.dmi'
default_language = "Galactic Common"
unarmed_type = /datum/unarmed_attack/claws
light_dam = 2
darksight = 8
blood_color = "#CCCCCC"
flesh_color = "#AAAAAA"
has_organ = list(
"brain" = /obj/item/organ/brain
)
flags = NO_BLOOD | NO_BREATHE | NO_SCAN
bodyflags = FEET_NOSLIP
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
H.dust()
@@ -332,6 +332,12 @@ proc/get_damage_icon_part(damage_state, body_part)
if(update_icons)
update_icons()
if(lip_style && species && species.flags & HAS_LIPS)
var/icon/lips = icon("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]_s")
lips.Blend(lip_color, ICON_ADD)
stand_icon.Blend(lips, ICON_OVERLAY)
//tail
update_tail_showing(0)
@@ -433,11 +439,6 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/proc/update_mutantrace(var/update_icons=1)
var/fat
if( FAT in mutations )
fat = "fat"
// var/g = "m"
// if (gender == FEMALE) g = "f"
//BS12 EDIT
var/skel = (SKELETON in src.mutations)
if(skel)
@@ -445,18 +446,6 @@ proc/get_damage_icon_part(damage_state, body_part)
else
skeleton = null
if(dna)
switch(dna.mutantrace)
if("golem","shadow","adamantine")
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s")
if("slime")
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/slimemutant.dmi', "icon_state" = "[slime_color]_[dna.mutantrace][fat]_[gender]_s")
else
overlays_standing[MUTANTRACE_LAYER] = null
if(!dna || !(dna.mutantrace in list("golem","metroid")))
update_body(0)
update_hair(0)
if(update_icons) update_icons()
@@ -345,11 +345,10 @@
if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence
targets += L // Possible target found!
if(istype(L, /mob/living/carbon/human) && dna) //Ignore slime(wo)men
if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men
var/mob/living/carbon/human/H = L
if(H.dna)
if(H.dna.mutantrace == "slime")
continue
if(H.species.name == "Slime People")
continue
if(!L.canmove) // Only one slime can latch on at a time.
var/notarget = 0
@@ -686,15 +686,6 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
..()
create_reagents(100)
/obj/item/slime_extract/attack(mob/living/carbon/human/M as mob, mob/user as mob) //changing slime people colors
if(M.dna.mutantrace != "slime" || M != user) return
M.slime_color = _color
user <<"You absorb the core and your color shifts!"
M.update_mutantrace()
del(src) //Finally a tidy way to remove all the used cores lying about
/obj/item/slime_extract/grey
name = "grey slime extract"
@@ -899,90 +890,6 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
/*afterattack(obj/target, mob/user , flag)
if(istype(target, /obj/item/slime_extract))
if(target.enhanced == 1)
user << "<span class='warning'> This extract has already been enhanced!</span>"
return ..()
if(target.Uses == 0)
user << "<span class='warning'> You can't enhance a used extract!</span>"
return ..()
user <<"You apply the enhancer. It now has triple the amount of uses."
target.Uses = 3
target.enahnced = 1
del(src)*/
////////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"
icon_state = "golem"
item_state = "golem"
_color = "golem"
has_sensor = 0
flags = ABSTRACT | NODROP
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/golem
name = "adamantine shell"
desc = "a golem's thick outter shell"
icon_state = "golem"
item_state = "golem"
w_class = 4//bulky item
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD
slowdown = 1.0
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
flags = ONESIZEFITSALL | STOPSPRESSUREDMAGE | ABSTRACT | NODROP
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/shoes/golem
name = "golem's feet"
desc = "sturdy adamantine feet"
icon_state = "golem"
item_state = "golem"
flags = NOSLIP | ABSTRACT | MASKINTERNALS | MASKCOVERSMOUTH | NODROP
slowdown = SHOES_SLOWDOWN+1
/obj/item/clothing/mask/gas/golem
name = "golem's face"
desc = "the imposing face of an adamantine golem"
icon_state = "golem"
item_state = "golem"
siemens_coefficient = 0
unacidable = 1
flags = ABSTRACT | NODROP
/obj/item/clothing/gloves/golem
name = "golem's hands"
desc = "strong adamantine hands"
icon_state = "golem"
item_state = null
siemens_coefficient = 0
flags = ABSTRACT | NODROP
/obj/item/clothing/head/space/golem
icon_state = "golem"
item_state = "dermal"
_color = "dermal"
name = "golem's head"
desc = "a golem's head"
unacidable = 1
flags = STOPSPRESSUREDMAGE | ABSTRACT | NODROP
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/effect/goleRUNe
anchored = 1
@@ -1014,16 +921,8 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
if(!ghost)
user << "The rune fizzles uselessly. There is no spirit nearby."
return
var/mob/living/carbon/human/G = new /mob/living/carbon/human
G.dna.mutantrace = "adamantine"
var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem
if(prob(50)) G.gender = "female"
G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
G.equip_to_slot_or_del(new /obj/item/clothing/under/golem(G), slot_w_uniform)
G.equip_to_slot_or_del(new /obj/item/clothing/suit/golem(G), slot_wear_suit)
G.equip_to_slot_or_del(new /obj/item/clothing/shoes/golem(G), slot_shoes)
G.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/golem(G), slot_wear_mask)
G.equip_to_slot_or_del(new /obj/item/clothing/gloves/golem(G), slot_gloves)
//G.equip_to_slot_or_del(new /obj/item/clothing/head/space/golem(G), slot_head)
G.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."
@@ -1064,115 +963,4 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
O << "\red You are not eligable."
return
ghosts.Add(O)
O << "\blue You are signed up to be a golem."
//////////////////////////////Old shit from metroids/RoRos, and the old cores, would not take much work to re-add them////////////////////////
/*
// Basically this slime Core catalyzes reactions that normally wouldn't happen anywhere
/obj/item/slime_core
name = "slime extract"
desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
icon = 'icons/mob/slimes.dmi'
icon_state = "slime extract"
force = 1.0
w_class = 1.0
throwforce = 1.0
throw_speed = 2
throw_range = 6
origin_tech = "biotech=4"
var/POWERFLAG = 0 // sshhhhhhh
var/Flush = 30
var/Uses = 5 // uses before it goes inert
/obj/item/slime_core/New()
..()
create_reagents(100)
POWERFLAG = rand(1,10)
Uses = rand(7, 25)
//flags |= NOREACT
/*
spawn()
Life()
proc/Life()
while(src)
sleep(25)
Flush--
if(Flush <= 0)
reagents.clear_reagents()
Flush = 30
*/
/obj/item/weapon/reagent_containers/food/snacks/egg/slime
name = "slime egg"
desc = "A small, gelatinous egg."
icon = 'icons/mob/mob.dmi'
icon_state = "slime egg-growing"
bitesize = 12
origin_tech = "biotech=4"
var/grown = 0
/obj/item/weapon/reagent_containers/food/snacks/egg/slime/New()
..()
reagents.add_reagent("nutriment", 4)
reagents.add_reagent("slimejelly", 1)
spawn(rand(1200,1500))//the egg takes a while to "ripen"
Grow()
/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Grow()
grown = 1
icon_state = "slime egg-grown"
processing_objects.Add(src)
return
/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Hatch()
processing_objects.Remove(src)
var/turf/T = get_turf(src)
src.visible_message("<span class='warning'> The [name] pulsates and quivers!</span>")
spawn(rand(50,100))
src.visible_message("<span class='warning'> The [name] bursts open!</span>")
new/mob/living/carbon/slime(T)
del(src)
/obj/item/weapon/reagent_containers/food/snacks/egg/slime/process()
var/turf/location = get_turf(src)
var/datum/gas_mixture/environment = location.return_air()
if (environment.toxins > MOLES_PLASMA_VISIBLE)//plasma exposure causes the egg to hatch
src.Hatch()
/obj/item/weapon/reagent_containers/food/snacks/egg/slime/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype( W, /obj/item/toy/crayon ))
return
else
..()
*/
/obj/item/slime_color
name = "slimeperson color selector"
desc = "Allows you to change your slimeperson color, once."
icon = 'icons/obj/device.dmi'
icon_state = "t-ray0"
force = 1.0
w_class = 1.0
throwforce = 1.0
throw_speed = 3
throw_range = 6
origin_tech = "biotech=4"
_color = "grey"
var/Uses = 1 // uses before it goes inert
var/list/slimecolor = list("grey","gold","silver","metal","purple","darkpurple","orange","yellow","red","blue","darkblue","pink","green","lightpink","black","oil","adamantine")
/obj/item/slime_color/attack(mob/living/carbon/human/M as mob, mob/user as mob) //changing slime people colors
if(M.dna.mutantrace != "slime" || M != user) return
var/pickedcolor = input("Please select a slime color", "Slimeperson color chooser") as null|anything in slimecolor
M.slime_color = pickedcolor
user << "You absorb the pigment and your color shifts!"
M.update_mutantrace()
del(src) //Finally a tidy way to remove all the used cores lying about
O << "\blue You are signed up to be a golem."
@@ -104,7 +104,7 @@
adjustBruteLoss(-10)
adjustFireLoss(-10)
adjustCloneLoss(-10)
updatehealth()
if(Victim)
Victim.updatehealth()
@@ -227,9 +227,9 @@
else
src << "<i>I am not old enough to reproduce yet...</i>"
/mob/living/carbon/slime/verb/ventcrawl()
/mob/living/carbon/slime/verb/ventcrawl(var/atom/pipe)
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Slime"
if(Victim) return
handle_ventcrawl()
handle_ventcrawl(pipe)
@@ -15,7 +15,6 @@
..()
gender = NEUTER
dna.mutantrace = "plant"
greaterform = "Diona"
add_language("Rootspeak")
verbs -= /mob/living/carbon/monkey/verb/ventcrawl
@@ -46,7 +45,6 @@
..()
gender = NEUTER
dna.mutantrace = "plant"
greaterform = "Diona"
add_language("Rootspeak")
src.verbs += /mob/living/carbon/monkey/diona/proc/merge
@@ -80,7 +80,6 @@
/mob/living/carbon/monkey/unathi/New()
..()
dna.mutantrace = "lizard"
greaterform = "Unathi"
dna.species = "Unathi"
add_language("Sinta'unathi")
@@ -88,7 +87,6 @@
/mob/living/carbon/monkey/skrell/New()
..()
dna.mutantrace = "skrell"
greaterform = "Skrell"
dna.species = "Skrell"
add_language("Skrellian")
@@ -96,7 +94,6 @@
/mob/living/carbon/monkey/tajara/New()
..()
dna.mutantrace = "tajaran"
greaterform = "Tajaran"
dna.species = "Tajaran"
add_language("Siik'tajr")
@@ -106,7 +103,6 @@
..()
alien = 1
gender = NEUTER
dna.mutantrace = "plant"
greaterform = "Diona"
dna.species = "Diona"
add_language("Rootspeak")
@@ -1,5 +1,5 @@
/mob/living/carbon/monkey/verb/ventcrawl()
/mob/living/carbon/monkey/verb/ventcrawl(var/atom/pipe)
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Monkey"
handle_ventcrawl()
handle_ventcrawl(pipe)
+24 -37
View File
@@ -14,7 +14,6 @@
var/tail // Name of tail image in species effects icon file.
var/unarmed //For empty hand harm-intent attack
var/unarmed_type = /datum/unarmed_attack
var/mutantrace // Safeguard due to old code.
var/breath_type = "oxygen" // Non-oxygen gas breathed, if any.
var/poison_type = "plasma" // Poisonous air.
@@ -42,6 +41,8 @@
var/brute_mod = null // Physical damage reduction/malus.
var/burn_mod = null // Burn damage reduction/malus.
var/light_dam
var/max_hurt_damage = 9 // Max melee damage dealt + 5 if hulk
var/list/default_genes = list()
@@ -250,41 +251,34 @@
H << "\red You feel your face freezing and an icicle forming in your lungs!"
else if(breath.temperature > heat_level_1)
if(prob(20))
if(H.dna.mutantrace == "slime")
H << "\red You feel supercharged by the extreme heat!"
else
H << "\red You feel your face burning and a searing heat in your lungs!"
H << "\red You feel your face burning and a searing heat in your lungs!"
if(H.dna.mutantrace == "slime")
if(breath.temperature < cold_level_1)
H.adjustToxLoss(round(cold_level_1 - breath.temperature))
switch(breath.temperature)
if(-INFINITY to cold_level_3)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(H.dna.mutantrace != "slime")
switch(breath.temperature)
if(-INFINITY to cold_level_3)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_3 to cold_level_2)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_3 to cold_level_2)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_2 to cold_level_1)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_2 to cold_level_1)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(heat_level_1 to heat_level_2)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_1 to heat_level_2)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_2 to heat_level_3_breathe)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_2 to heat_level_3_breathe)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_3_breathe to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_3_breathe to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
return
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
@@ -554,6 +548,7 @@
unarmed_type = /datum/unarmed_attack/punch
flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN
bodyflags = HAS_SKIN_COLOR
bloodflags = BLOOD_SLIME
has_organ = list(
@@ -561,14 +556,6 @@
)
/datum/species/slime/handle_post_spawn(var/mob/living/carbon/human/H)
H.dna = new /datum/dna(null)
H.dna.real_name = H.real_name
H.dna.species = H.species.name
H.dna.mutantrace = "slime"
..()
/datum/species/grey
name = "Grey"
icobase = 'icons/mob/human_races/r_grey.dmi'
@@ -0,0 +1,25 @@
/mob/living
var/datum/language/default_language
/mob/living/verb/set_default_language(language as null|anything in languages)
set name = "Set Default Language"
set category = "IC"
if(language)
src << "<span class='notice'>You will now speak [language] if you do not specify a language when speaking.</span>"
else
src << "<span class='notice'>You will now speak whatever your standard default language is if you do not specify one when speaking.</span>"
default_language = language
// Silicons can't neccessarily speak everything in their languages list
/mob/living/silicon/set_default_language(language as null|anything in speech_synthesizer_langs)
..()
/mob/living/verb/check_default_language()
set name = "Check Default Language"
set category = "IC"
if(default_language)
src << "<span class='notice'>You are currently speaking [default_language] by default.</span>"
else
src << "<span class='notice'>Your current default language is your species or mob type default.</span>"
+11
View File
@@ -808,6 +808,17 @@
..()
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
/atom/movable/proc/receive_damage(atom/A)
var/pixel_x_diff = rand(-3,3)
var/pixel_y_diff = rand(-3,3)
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2)
/mob/living/receive_damage(atom/A)
..()
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
/mob/living/proc/do_jitter_animation(jitteriness)
var/amplitude = min(4, (jitteriness/100) + 1)
var/pixel_x_diff = rand(-amplitude, amplitude)
+22 -1
View File
@@ -144,7 +144,7 @@
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey])[isAntag(M) ? "(ANTAG)" : ""] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
// Begin BS12 momentum-transfer code.
if(O.throw_source && speed >= 15)
@@ -257,3 +257,24 @@
IgniteMob()
//Mobs on Fire end
/mob/living/proc/grabbedby(mob/living/carbon/user,var/supress_message = 0)
if(user == src || anchored)
return 0
if(!(status_flags & CANPUSH))
return 0
add_logs(user, src, "grabbed", addition="passively")
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src)
if(buckled)
user << "<span class='notice'>You cannot grab [src], \he is buckled in!</span>"
if(!G) //the grab will delete itself in New if src is anchored
return 0
user.put_in_active_hand(G)
G.synch()
LAssailant = user
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(!supress_message)
visible_message("<span class='warning'>[user] has grabbed [src] passively!</span>")
@@ -44,3 +44,6 @@
var/silent = null //Can't talk. Value goes down every life proc.
var/floating = 0
var/nightvision = 0
var/list/icon/pipes_shown = list()
var/last_played_vent
+3
View File
@@ -64,6 +64,9 @@ proc/get_radio_key_from_channel(var/channel)
if(!istype(dongle)) return
if(dongle.translate_binary) return 1
/mob/living/proc/get_default_language()
return default_language
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/sound/speech_sound, var/sound_vol)
var/turf/T = get_turf(src)
@@ -14,10 +14,10 @@
/obj/item/weapon/airlock_electronics,
/obj/item/weapon/module/power_control,
/obj/item/weapon/stock_parts,
/obj/item/light_fixture_frame,
/obj/item/apc_frame,
/obj/item/alarm_frame,
/obj/item/firealarm_frame,
/obj/item/mounted/frame/light_fixture,
/obj/item/mounted/frame/apc_frame,
/obj/item/mounted/frame/alarm_frame,
/obj/item/mounted/frame/firealarm,
/obj/item/weapon/table_parts,
/obj/item/weapon/rack_parts,
/obj/item/weapon/camera_assembly,
+8 -2
View File
@@ -71,9 +71,15 @@
//parse language key and consume it
var/datum/language/speaking = parse_language(message)
if (speaking)
verb = speaking.speech_verb
message = trim(copytext(message,2+length(speaking.key)))
message = trim(copytext(message,2+length(speaking.key)))
else
speaking = get_default_language()
if (speaking)
verb = speaking.speech_verb
// This is broadcast to all mobs with the language,
// irrespective of distance or anything else.
if(speaking.flags & HIVEMIND)
speaking.broadcast(src,trim(message))
return 1
+11 -1
View File
@@ -237,9 +237,19 @@
var/dat = "<b><font size = 5>Known Languages</font></b><br/><br/>"
if(default_language)
dat += "Current default language: [default_language] - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br/><br/>"
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
dat += "<b>[L.name] (:[L.key])</b><br/>Speech Synthesizer: <i>[(L in speech_synthesizer_langs)? "YES":"NOT SUPPORTED"]</i><br/>[L.desc]<br/><br/>"
var/default_str
if(L == default_language)
default_str = " - default - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a>"
else
default_str = " - <a href='byond://?src=\ref[src];default_lang=[L]'>set default</a>"
var/synth = (L in speech_synthesizer_langs)
dat += "<b>[L.name] (:[L.key])</b>[synth ? default_str : null]<br/>Speech Synthesizer: <i>[synth ? "YES" : "NOT SUPPORTED"]</i><br/>[L.desc]<br/><br/>"
src << browse(dat, "window=checklanguage")
return
@@ -456,11 +456,11 @@ mob/living/simple_animal/borer/proc/detatch()
host_brain.real_name = M.real_name
host.status_flags |= PASSEMOTES
/mob/living/simple_animal/borer/verb/ventcrawl()
/mob/living/simple_animal/borer/verb/ventcrawl(var/atom/pipe)
set name = "Crawl through vent (borer)"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Alien"
handle_ventcrawl()
handle_ventcrawl(pipe)
/mob/living/simple_animal/borer/can_use_vents()
return
@@ -70,58 +70,11 @@
client.time_died_as_mouse = world.time
//copy paste from alien/larva, if that func is updated please update this one also
/mob/living/simple_animal/mouse/verb/ventcrawl()
/mob/living/simple_animal/mouse/verb/ventcrawl(var/atom/pipe)
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Mouse"
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
// return
if(src.stat != CONSCIOUS) return
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
var/welded = 0
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
if(!v.welded)
vent_found = v
break
else
welded = 1
if(vent_found)
if(vent_found.network&&vent_found.network.normal_members.len)
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
if(temp_vent.loc == loc)
continue
vents.Add(temp_vent)
var/list/choices = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
if(vent.loc.z != loc.z)
continue
var/atom/a = get_turf(vent)
choices.Add(a.loc)
var/turf/startloc = loc
var/obj/selection = input("Select a destination.", "Duct System") in choices
var/selection_position = choices.Find(selection)
if(loc==startloc)
var/obj/target_vent = vents[selection_position]
if(target_vent)
/*
for(var/mob/O in oviewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
*/
loc = target_vent.loc
else
src << "\blue You need to remain still while entering a vent."
else
src << "\blue This vent is not connected to anything."
else if(welded)
src << "\red That vent is welded."
else
src << "\blue You must be standing on or beside an air vent to enter it."
return
handle_ventcrawl(pipe)
//make mice fit under tables etc? this was hacky, and not working
/*
@@ -140,7 +140,7 @@
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with the [O]. ")
/mob/living/simple_animal/spiderbot/emag_act(user as mob)
if (emagged)
user << "\red [src] is already overloaded - better run."
@@ -219,51 +219,11 @@
return
//copy paste from alien/larva, if that func is updated please update this one also
/mob/living/simple_animal/spiderbot/verb/ventcrawl()
/mob/living/simple_animal/spiderbot/verb/ventcrawl(var/atom/pipe)
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Spiderbot"
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
// return
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
var/welded = 0
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
if(!v.welded)
vent_found = v
break
else
welded = 1
if(vent_found)
if(vent_found.network&&vent_found.network.normal_members.len)
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
if(temp_vent.loc == loc)
continue
vents.Add(temp_vent)
var/list/choices = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
if(vent.loc.z != loc.z)
continue
var/atom/a = get_turf(vent)
choices.Add(a.loc)
var/turf/startloc = loc
var/obj/selection = input("Select a destination.", "Duct System") in choices
var/selection_position = choices.Find(selection)
if(loc==startloc)
var/obj/target_vent = vents[selection_position]
if(target_vent)
loc = target_vent.loc
else
src << "\blue You need to remain still while entering a vent."
else
src << "\blue This vent is not connected to anything."
else if(welded)
src << "\red That vent is welded."
else
src << "\blue You must be standing on or beside an air vent to enter it."
return
handle_ventcrawl(pipe)
//Cannibalized from the parrot mob. ~Zuhayr
/mob/living/simple_animal/spiderbot/verb/drop_held_item()
@@ -10,11 +10,11 @@
speak_chance = 0
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
meat_amount = 1
meat_amount = 2
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
speed = 4
speed = 0
maxHealth = 25
health = 25
@@ -23,6 +23,7 @@
melee_damage_upper = 15
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
speak_emote = list("gnashes")
//Space carp aren't affected by atmos.
min_oxy = 0
@@ -34,6 +35,7 @@
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 1500
@@ -4,8 +4,24 @@
#define MOVING_TO_TARGET 3
#define SPINNING_COCOON 4
/mob/living/simple_animal/hostile/poison
var/poison_per_bite = 5
var/poison_type = "venom"
/mob/living/simple_animal/hostile/poison/AttackingTarget()
..()
if(isliving(target))
var/mob/living/L = target
if(L.reagents)
L.reagents.add_reagent("venom", poison_per_bite)
if(prob(poison_per_bite))
L << "<span class='danger'>You feel a tiny prick.</span>"
L.reagents.add_reagent(poison_type, poison_per_bite)
//basic spider mob, these generally guard nests
/mob/living/simple_animal/hostile/giant_spider
/mob/living/simple_animal/hostile/poison/giant_spider
name = "giant spider"
desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes."
icon_state = "guard"
@@ -22,27 +38,27 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
stop_automated_movement_when_pulled = 0
maxHealth = 60
health = 60
maxHealth = 200
health = 200
melee_damage_lower = 15
melee_damage_upper = 20
heat_damage_per_tick = 20
cold_damage_per_tick = 20
var/poison_per_bite = 5
var/poison_type = "toxin"
heat_damage_per_tick = 20 //amount of damage applied if animal's body temperature is higher than maxbodytemp
cold_damage_per_tick = 20 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
faction = list("spiders")
var/busy = 0
pass_flags = PASSTABLE
move_to_delay = 6
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/giant_spider/nurse
/mob/living/simple_animal/hostile/poison/giant_spider/nurse
desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes."
icon_state = "nurse"
icon_living = "nurse"
icon_dead = "nurse_dead"
meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidereggs
meat_amount = 4
maxHealth = 40
health = 40
melee_damage_lower = 5
@@ -53,31 +69,21 @@
var/fed = 0
//hunters have the most poison and move the fastest, so they can find prey
/mob/living/simple_animal/hostile/giant_spider/hunter
/mob/living/simple_animal/hostile/poison/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
icon_state = "hunter"
icon_living = "hunter"
icon_dead = "hunter_dead"
maxHealth = 50
health = 50
maxHealth = 120
health = 120
melee_damage_lower = 10
melee_damage_upper = 20
poison_per_bite = 5
move_to_delay = 4
move_to_delay = 5
/mob/living/simple_animal/hostile/giant_spider/AttackingTarget()
/mob/living/simple_animal/hostile/poison/giant_spider/Life()
..()
if(isliving(target))
var/mob/living/L = target
if(L.reagents)
L.reagents.add_reagent("toxin", poison_per_bite)
if(prob(poison_per_bite))
L << "\red You feel a tiny prick."
L.reagents.add_reagent(poison_type, 5)
/mob/living/simple_animal/hostile/giant_spider/Life()
..()
if(!stat)
if(!stat && !ckey)
if(stance == HOSTILE_STANCE_IDLE)
//1% chance to skitter madly away
if(!busy && prob(1))
@@ -92,7 +98,7 @@
// Chops off each leg with a 50/50 chance of harvesting one, until finally calling
// default harvest action
/mob/living/simple_animal/hostile/giant_spider/harvest()
/mob/living/simple_animal/hostile/poison/giant_spider/harvest()
if(butcher_state > 0)
butcher_state--
icon_state = icon_dead + "[butcher_state]"
@@ -103,7 +109,7 @@
else
return ..()
/mob/living/simple_animal/hostile/giant_spider/nurse/proc/GiveUp(var/C)
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/GiveUp(var/C)
spawn(100)
if(busy == MOVING_TO_TARGET)
if(cocoon_target == C && get_dist(src,cocoon_target) > 1)
@@ -111,16 +117,16 @@
busy = 0
stop_automated_movement = 0
/mob/living/simple_animal/hostile/giant_spider/nurse/Life()
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Life()
..()
if(!stat)
if(!stat && !ckey)
if(stance == HOSTILE_STANCE_IDLE)
var/list/can_see = view(src, 10)
//30% chance to stop wandering and do something
if(!busy && prob(30))
//first, check for potential food nearby to cocoon
for(var/mob/living/C in can_see)
if(C.stat && !istype(C,/mob/living/simple_animal/hostile/giant_spider))
if(C.stat && !istype(C,/mob/living/simple_animal/hostile/poison/giant_spider))
cocoon_target = C
busy = MOVING_TO_TARGET
Goto(C, move_to_delay)
@@ -131,29 +137,11 @@
//second, spin a sticky spiderweb on this tile
var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
if(!W)
busy = SPINNING_WEB
src.visible_message("\blue \the [src] begins to secrete a sticky substance.")
stop_automated_movement = 1
spawn(40)
if(busy == SPINNING_WEB)
new /obj/effect/spider/stickyweb(src.loc)
busy = 0
stop_automated_movement = 0
Web()
else
//third, lay an egg cluster there
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
if(!E && fed > 0)
busy = LAYING_EGGS
src.visible_message("\blue \the [src] begins to lay a cluster of eggs.")
stop_automated_movement = 1
spawn(50)
if(busy == LAYING_EGGS)
E = locate() in get_turf(src)
if(!E)
new /obj/effect/spider/eggcluster(src.loc)
fed--
busy = 0
stop_automated_movement = 0
if(fed)
LayEggs()
else
//fourthly, cocoon any nearby items so those pesky pinkskins can't use them
for(var/obj/O in can_see)
@@ -171,115 +159,112 @@
else if(busy == MOVING_TO_TARGET && cocoon_target)
if(get_dist(src, cocoon_target) <= 1)
busy = SPINNING_COCOON
src.visible_message("\blue \the [src] begins to secrete a sticky substance around \the [cocoon_target].")
stop_automated_movement = 1
walk(src,0)
spawn(50)
if(busy == SPINNING_COCOON)
if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1)
var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
var/large_cocoon = 0
C.pixel_x = cocoon_target.pixel_x
C.pixel_y = cocoon_target.pixel_y
for(var/mob/living/M in C.loc)
if(istype(M, /mob/living/simple_animal/hostile/giant_spider))
continue
large_cocoon = 1
fed++
src.visible_message("\red \the [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.")
M.loc = C
C.pixel_x = M.pixel_x
C.pixel_y = M.pixel_y
break
for(var/obj/item/I in C.loc)
I.loc = C
for(var/obj/structure/S in C.loc)
if(!S.anchored)
S.loc = C
large_cocoon = 1
for(var/obj/machinery/M in C.loc)
if(!M.anchored)
M.loc = C
large_cocoon = 1
if(large_cocoon)
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
busy = 0
stop_automated_movement = 0
Wrap()
else
busy = 0
stop_automated_movement = 0
/mob/living/simple_animal/hostile/poison/giant_spider/verb/Web()
set name = "Lay Web"
set category = "Spider"
set desc = "Spread a sticky web to slow down prey."
var/T = src.loc
if(busy != SPINNING_WEB)
busy = SPINNING_WEB
src.visible_message("<span class='notice'>\the [src] begins to secrete a sticky substance.</span>")
stop_automated_movement = 1
spawn(40)
if(busy == SPINNING_WEB && src.loc == T)
new /obj/effect/spider/stickyweb(T)
busy = 0
stop_automated_movement = 0
/mob/living/simple_animal/hostile/giant_spider/verb/web()
set category = "Alien"
set name = "Spin Web"
set desc = "Create a web that slows down movement."
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/Wrap()
set name = "Wrap"
set category = "Spider"
set desc = "Wrap up prey to feast upon and objects for safe keeping."
var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
if(!W)
src.visible_message("\blue \the [src] begins to secrete a sticky substance.")
if(!do_after(src, 30)) return
new /obj/effect/spider/stickyweb(src.loc)
if(!cocoon_target)
var/list/choices = list()
for(var/mob/living/L in view(1,src))
if(L == src)
continue
if(Adjacent(L))
choices += L
for(var/obj/O in src.loc)
if(Adjacent(O))
choices += O
cocoon_target = input(src,"What do you wish to cocoon?") in null|choices
/mob/living/simple_animal/hostile/giant_spider/nurse/verb/cocoon()
set category = "Alien"
set name = "Cocoon and Feed"
set desc = "Cocooned an incapacitated mob so you can feed upon it."
for(var/mob/living/P in range(1,src))
cocoon_target = P
if(P.stat && !istype(P,/mob/living/simple_animal/hostile/giant_spider))
if(get_dist(src, cocoon_target) <= 1)
src.visible_message("\blue \the [src] begins to secrete a sticky substance around \the [cocoon_target].")
if(!do_after(src, 30)) return
if(cocoon_target && busy != SPINNING_COCOON)
busy = SPINNING_COCOON
src.visible_message("<span class='notice'>\the [src] begins to secrete a sticky substance around \the [cocoon_target].</span>")
stop_automated_movement = 1
walk(src,0)
spawn(50)
if(busy == SPINNING_COCOON)
if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1)
var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
var/large_cocoon = 0
C.pixel_x = cocoon_target.pixel_x
C.pixel_y = cocoon_target.pixel_y
for(var/mob/living/M in C.loc)
if(istype(M, /mob/living/simple_animal/hostile/giant_spider))
continue
large_cocoon = 1
fed++
src.visible_message("\red \the [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.")
M.loc = C
C.pixel_x = M.pixel_x
C.pixel_y = M.pixel_y
break
for(var/obj/item/I in C.loc)
I.loc = C
for(var/obj/structure/S in C.loc)
if(!S.anchored)
S.loc = C
large_cocoon = 1
large_cocoon = 1
for(var/obj/machinery/M in C.loc)
if(!M.anchored)
M.loc = C
large_cocoon = 1
for(var/mob/living/L in C.loc)
if(istype(L, /mob/living/simple_animal/hostile/poison/giant_spider))
continue
large_cocoon = 1
L.loc = C
C.pixel_x = L.pixel_x
C.pixel_y = L.pixel_y
fed++
visible_message("<span class='danger'>\the [src] sticks a proboscis into \the [L] and sucks a viscous substance out.</span>")
break
if(large_cocoon)
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
cocoon_target = null
busy = 0
stop_automated_movement = 0
/mob/living/simple_animal/hostile/giant_spider/nurse/verb/eggs()
set category = "Alien"
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/LayEggs()
set name = "Lay Eggs"
set desc = "Lay a clutch of eggs to make new spiderlings. Requires you to have fed."
set category = "Spider"
set desc = "Lay a clutch of eggs, but you must wrap a creature for feeding first."
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
if(!E && fed > 0)
src.visible_message("\blue \the [src] begins to lay a cluster of eggs.")
if(!do_after(src, 30)) return
E = locate() in get_turf(src)
if(!E)
new /obj/effect/spider/eggcluster(src.loc)
fed--
if(E)
src << "<span class='notice'>There is already a cluster of eggs here!</span>"
else if(!fed)
src << "<span class='warning'>You are too hungry to do this!</span>"
else if(busy != LAYING_EGGS)
busy = LAYING_EGGS
src.visible_message("<span class='notice'>\the [src] begins to lay a cluster of eggs.</span>")
stop_automated_movement = 1
spawn(50)
if(busy == LAYING_EGGS)
E = locate() in get_turf(src)
if(!E)
var/obj/effect/spider/eggcluster/C = new /obj/effect/spider/eggcluster(src.loc)
if(ckey)
C.player_spiders = 1
fed--
busy = 0
stop_automated_movement = 0
#undef SPINNING_WEB
#undef LAYING_EGGS
#undef MOVING_TO_TARGET
#undef SPINNING_COCOON
#undef SPINNING_COCOON
+7
View File
@@ -156,6 +156,13 @@ proc/isorgan(A)
return 1
return 0
proc/isAntag(A)
if(istype(A, /mob/living/carbon))
var/mob/living/carbon/C = A
if(C.mind && C.mind.special_role)
return 1
return 0
proc/isnewplayer(A)
if(istype(A, /mob/new_player))
return 1
@@ -254,10 +254,6 @@ datum/preferences
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
eyes_s.Blend(facial_s, ICON_OVERLAY)
//Slime People Overlays
if(current_species && (current_species.bloodflags & BLOOD_SLIME))
var/icon/temp = new/icon("icon" = 'icons/effects/slimemutant.dmi', "icon_state" = "[slime_color]_slime[fat]_[gender]_s")
preview_icon.Blend(temp, ICON_OVERLAY)
var/icon/underwear_s = null
if(underwear > 0 && underwear < 7 && current_species.flags & HAS_UNDERWEAR)
-2
View File
@@ -465,8 +465,6 @@
//Antag Creatures!
/* if(ispath(MP, /mob/living/simple_animal/hostile/carp) && !jobban_isbanned(src, "Syndicate"))
return 1
if(ispath(MP, /mob/living/simple_animal/hostile/giant_spider) && !jobban_isbanned(src, "Syndicate"))
return 1 */
if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, "alien") && !jobban_isbanned(src, "Syndicate"))
return 1
+3 -39
View File
@@ -16,9 +16,7 @@ var/list/organ_cache = list()
var/parent_organ = "chest"
var/robotic = 0 //For being a robot
var/rejecting // Is this organ already being rejected?
var/list/transplant_data
var/list/datum/autopsy_data/autopsy_data = list()
var/list/trace_chemicals = list() // traces of chemicals in the organ,
// links chemical IDs to number of ticks for which they'll stay in the blood
@@ -76,14 +74,14 @@ var/list/organ_cache = list()
if(B && prob(40))
reagents.remove_reagent("blood",0.1)
blood_splatter(src,B,1)
if(prob(5)) //How about we not have organs become completely useless less than a minute after removal?
damage += 1
damage += rand(1,3)
if(damage >= max_damage)
die()
else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
//** Handle antibiotics and curing infections
handle_antibiotics()
handle_rejection()
handle_germ_effects()
/obj/item/organ/proc/handle_germ_effects()
@@ -111,28 +109,6 @@ var/list/organ_cache = list()
if (prob(3)) //about once every 30 seconds
take_damage(1,silent=prob(30))
/obj/item/organ/proc/handle_rejection()
// Process unsuitable transplants. TODO: consider some kind of
// immunosuppressant that changes transplant data to make it match.
if(transplant_data)
if(!rejecting && prob(20) && owner.dna && blood_incompatible(transplant_data["blood_type"],owner.dna.b_type,owner.species,transplant_data["species"]))
rejecting = 1
else
rejecting++ //Rejection severity increases over time.
if(rejecting % 10 == 0) //Only fire every ten rejection ticks.
switch(rejecting)
if(1 to 50)
take_damage(1)
if(51 to 200)
owner.reagents.add_reagent("toxin", 1)
take_damage(1)
if(201 to 500)
take_damage(rand(2,3))
owner.reagents.add_reagent("toxin", 2)
if(501 to INFINITY)
take_damage(4)
owner.reagents.add_reagent("toxin", rand(3,5))
/obj/item/organ/proc/receive_chem(chemical as obj)
return 0
@@ -245,7 +221,6 @@ var/list/organ_cache = list()
loc = get_turf(owner)
processing_objects |= src
rejecting = null
var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
if(!organ_blood || !organ_blood.data["blood_DNA"])
owner.vessel.trans_to(src, 5, 1, 1)
@@ -254,7 +229,7 @@ var/list/organ_cache = list()
if(user)
user.attack_log += "\[[time_stamp()]\]<font color='red'> removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)])</font>"
owner.attack_log += "\[[time_stamp()]\]<font color='orange'> had a vital organ ([src]) removed by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])</font>"
msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
owner.death()
owner = null
@@ -262,17 +237,6 @@ var/list/organ_cache = list()
if(!istype(target)) return
var/datum/reagent/blood/transplant_blood = locate(/datum/reagent/blood) in reagents.reagent_list
transplant_data = list()
if(!transplant_blood)
transplant_data["species"] = target.species.name
transplant_data["blood_type"] = target.dna.b_type
transplant_data["blood_DNA"] = target.dna.unique_enzymes
else
transplant_data["species"] = transplant_blood.data["species"]
transplant_data["blood_type"] = transplant_blood.data["blood_type"]
transplant_data["blood_DNA"] = transplant_blood.data["blood_DNA"]
owner = target
processing_objects -= src
target.internal_organs |= src
+8 -4
View File
@@ -75,7 +75,11 @@
if(contents.len)
var/obj/item/removing = pick(contents)
removing.loc = get_turf(user.loc)
if(!(user.l_hand && user.r_hand))
var/obj/item/organ/O = removing
if(istype(O))
O.status |= ORGAN_CUT_AWAY
O.removed(user)
else if(!(user.l_hand && user.r_hand))
user.put_in_hands(removing)
user.visible_message("<span class='danger'><b>[user]</b> extracts [removing] from [src] with [W]!")
else
@@ -201,7 +205,7 @@
// sync the organ's damage with its wounds
src.update_damages()
var/mob/living/carbon/owner_old = owner //Need to update health, but need a reference in case the below check cuts off a limb.
//If limb took enough damage, try to cut or tear it off
if(owner && loc == owner)
if(!cannot_amputate && config.limbs_can_break && (brute_dam + burn_dam) >= (max_damage * config.organ_health_multiplier))
@@ -216,7 +220,7 @@
else
droplimb(0,DROPLIMB_BLUNT)
owner.updatehealth()
owner_old.updatehealth()
return update_icon()
/obj/item/organ/external/proc/heal_damage(brute, burn, internal = 0, robo_repair = 0)
@@ -661,7 +665,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(DROPLIMB_BURN)
new /obj/effect/decal/cleanable/ash(get_turf(victim))
if(DROPLIMB_BLUNT)
var/obj/effect/decal/cleanable/blood/gibs/gore = new owner.species.single_gib_type(get_turf(victim))
var/obj/effect/decal/cleanable/blood/gibs/gore = new victim.species.single_gib_type(get_turf(victim))
if(victim.species.flesh_color)
gore.fleshcolor = victim.species.flesh_color
if(victim.species.blood_color)
+3 -1
View File
@@ -42,7 +42,9 @@ var/global/list/limb_icon_cache = list()
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
if(owner.lip_style && (owner.species && (owner.species.flags & HAS_LIPS)))
mob_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s"), ICON_OVERLAY)
var/image/lips = image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[owner.lip_style]_s")
lips.color = owner.lip_color
mob_icon.Blend(lips, ICON_OVERLAY)
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
+1 -1
View File
@@ -147,7 +147,7 @@
owner.adjustToxLoss(0.1 * PROCESS_ACCURACY)
// Can't cope with toxins at all
for(var/toxin in list("toxin", "plasma", "sacid", "facid", "cyanide", "amanitin", "carpotoxin", "mindbreaker"))
for(var/toxin in list("toxin", "plasma", "sacid", "facid", "cyanide", "amanitin", "carpotoxin"))
if(owner.reagents.has_reagent(toxin))
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/item/organ/external/stump
name = "limb stump"
icon_name = ""
cannot_amputate = 1
cannot_amputate = 0 //You need to remove stumps to attach new limbs, but you can't remove stumps... What the fuck?
/obj/item/organ/external/stump/New(var/mob/living/carbon/holder, var/internal, var/obj/item/organ/external/limb)
if(istype(limb))
+10 -6
View File
@@ -114,21 +114,25 @@
"<span class='notice'> [user] holds up a paper and shows it to [M]. </span>")
src.examine(user)
else if(user.zone_sel.selecting == "mouth") // lipstick wiping
else if(user.zone_sel.selecting == "mouth")
if(!istype(M, /mob)) return
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H == user)
user << "<span class='notice'>You wipe off the lipstick with [src].</span>"
user << "<span class='notice'>You wipe off your face with [src].</span>"
H.lip_style = null
H.update_body()
else
user.visible_message("<span class='warning'>[user] begins to wipe [H]'s lipstick off with \the [src].</span>", \
"<span class='notice'>You begin to wipe off [H]'s lipstick.</span>")
user.visible_message("<span class='warning'>[user] begins to wipe [H]'s face clean with \the [src].</span>", \
"<span class='notice'>You begin to wipe off [H]'s face.</span>")
if(do_after(user, 10) && do_after(H, 10, 5, 0)) //user needs to keep their active hand, H does not.
user.visible_message("<span class='notice'>[user] wipes [H]'s lipstick off with \the [src].</span>", \
"<span class='notice'>You wipe off [H]'s lipstick.</span>")
user.visible_message("<span class='notice'>[user] wipes [H]'s face clean with \the [src].</span>", \
"<span class='notice'>You wipe off [H]'s face.</span>")
H.lip_style = null
H.update_body()
else
..()
/obj/item/weapon/paper/proc/addtofield(var/id, var/text, var/links = 0)
var/locid = 0
+1 -1
View File
@@ -57,7 +57,7 @@
// M << "<span class='danger'>You feel a tiny prick!</span>"
. = 1
add_logs(user, M, "stabbed", object="[name]")
add_logs(M, user, "stabbed", object="[name]")
/*
* Sleepypens
+3 -3
View File
@@ -525,14 +525,14 @@
"You disassembled the broken APC frame.",\
"\red You hear welding.")
else
new /obj/item/apc_frame(loc)
new /obj/item/mounted/frame/apc_frame(loc)
user.visible_message(\
"\red [src] has been cut from the wall by [user.name] with the weldingtool.",\
"You cut the APC frame from the wall.",\
"\red You hear welding.")
del(src)
return
else if (istype(W, /obj/item/apc_frame) && opened && emagged)
else if (istype(W, /obj/item/mounted/frame/apc_frame) && opened && emagged)
emagged = 0
if (opened==2)
opened = 1
@@ -541,7 +541,7 @@
"You replace the damaged APC frontal panel with a new one.")
del(W)
update_icon()
else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack))
else if (istype(W, /obj/item/mounted/frame/apc_frame) && opened && ((stat & BROKEN) || malfhack))
if (has_electronics)
user << "You cannot repair this APC until you remove the electronics still inside."
return
-58
View File
@@ -9,64 +9,6 @@
#define LIGHT_BROKEN 2
#define LIGHT_BURNED 3
/obj/item/light_fixture_frame
name = "light fixture frame"
desc = "Used for building lights."
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-item"
flags = CONDUCT
var/fixture_type = "tube"
var/obj/machinery/light/newlight = null
var/sheets_refunded = 2
/obj/item/light_fixture_frame/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params)
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded )
del(src)
return
..()
/obj/item/light_fixture_frame/proc/try_build(turf/on_wall)
if (get_dist(on_wall,usr)>1)
return
var/ndir = get_dir(usr,on_wall)
if (!(ndir in cardinal))
return
var/turf/loc = get_turf_loc(usr)
if (!istype(loc, /turf/simulated/floor))
usr << "\red [src.name] cannot be placed on this spot."
return
usr << "Attaching [src] to the wall."
playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
var/constrdir = usr.dir
var/constrloc = usr.loc
if (!do_after(usr, 30))
return
switch(fixture_type)
if("bulb")
newlight = new /obj/machinery/light_construct/small(constrloc)
if("tube")
newlight = new /obj/machinery/light_construct(constrloc)
newlight.dir = constrdir
newlight.fingerprints = src.fingerprints
newlight.fingerprintshidden = src.fingerprintshidden
newlight.fingerprintslast = src.fingerprintslast
usr.visible_message("[usr.name] attaches [src] to the wall.", \
"You attach [src] to the wall.")
del(src)
/obj/item/light_fixture_frame/small
name = "small light fixture frame"
desc = "Used for building small lights."
icon = 'icons/obj/lighting.dmi'
icon_state = "bulb-construct-item"
flags = CONDUCT
fixture_type = "bulb"
sheets_refunded = 1
/obj/machinery/light_construct
name = "light fixture frame"
desc = "A light fixture under construction."
+3 -3
View File
@@ -62,7 +62,7 @@
if(src.active==1)
src.active = 0
user << "You turn off the [src]."
msg_admin_attack("Emitter turned off by [key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
msg_admin_attack("Emitter turned off by [key_name(user, user.client)][isAntag(user) ? "(ANTAG)" : ""](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])")
investigate_log("turned <font color='red'>off</font> by [user.key]","singulo")
else
@@ -70,7 +70,7 @@
user << "You turn on the [src]."
src.shot_number = 0
src.fire_delay = 100
msg_admin_attack("Emitter turned on by [key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
msg_admin_attack("Emitter turned on by [key_name(user, user.client)][isAntag(user) ? "(ANTAG)" : ""](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Emitter turned on by [user.ckey]([user]) in ([x],[y],[z])")
investigate_log("turned <font color='green'>on</font> by [user.key]","singulo")
update_icon()
@@ -224,7 +224,7 @@
..()
return
/obj/machinery/power/emitter/emag_act(user as mob)
if(!emagged)
if(!ishuman(user))
@@ -113,7 +113,7 @@
if(strength > strength_upper_limit)
strength = strength_upper_limit
else
msg_admin_attack("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
msg_admin_attack("PA Control Computer increased to [strength] by [key_name(usr, usr.client)][isAntag(usr) ? "(ANTAG)" : ""](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("PA Control Computer increased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])")
use_log += text("\[[time_stamp()]\] <font color='red'>[usr.name] ([usr.ckey]) has increased the PA Control Computer to [strength].</font>")
investigate_log("increased to <font color='red'>[strength]</font> by [usr.key]","singulo")
@@ -206,7 +206,7 @@
src.active = !src.active
investigate_log("turned [active?"<font color='red'>ON</font>":"<font color='green'>OFF</font>"] by [usr ? usr.key : "outside forces"]","singulo")
if (active)
msg_admin_attack("PA Control Computer turned ON by [key_name(usr, usr.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
msg_admin_attack("PA Control Computer turned ON by [key_name(usr, usr.client)][isAntag(usr) ? "(ANTAG)" : ""](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("PA Control Computer turned ON by [usr.ckey]([usr]) in ([x],[y],[z])")
use_log += text("\[[time_stamp()]\] <font color='red'>[usr.name] ([usr.ckey]) has turned on the PA Control Computer.</font>")
if(src.active)
+2 -1
View File
@@ -104,7 +104,8 @@
M << "\red Your meaty finger is much too large for the trigger guard!"
return
if(ishuman(user))
if(user.dna && user.dna.mutantrace == "adamantine")
var/mob/living/carbon/human/H = user
if(H.species.name == "Golem")
user << "\red Your metal fingers don't fit in the trigger guard!"
return
if(user.dna && user.dna.species == "Shadowling")
+1 -1
View File
@@ -133,7 +133,7 @@
M.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>[reagent_note]"
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>[reagent_note]"
if(M.ckey && chatlog_attacks)
msg_admin_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src][reagent_note] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[firer.x];Y=[firer.y];Z=[firer.z]'>JMP</a>)") //BS12 EDIT ALG
msg_admin_attack("[firer] ([firer.ckey])[isAntag(firer) ? "(ANTAG)" : ""] shot [M] ([M.ckey]) with a [src][reagent_note] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[firer.x];Y=[firer.y];Z=[firer.z]'>JMP</a>)") //BS12 EDIT ALG
if(!iscarbon(firer))
M.LAssailant = null
else
+2 -6
View File
@@ -210,15 +210,11 @@ proc/wabbajack(mob/living/M)
new_mob.universal_speak = 1
if("human")
new_mob = new /mob/living/carbon/human/human(M.loc)
var/mob/living/carbon/human/H = new_mob
H.set_species(pick(all_species))
var/datum/preferences/A = new() //Randomize appearance for the human
A.copy_to(new_mob)
var/mob/living/carbon/human/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()
else
return
@@ -96,7 +96,6 @@
on_hit(var/atom/target, var/blocked = 0)
var/mob/living/M = target
// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays.
if(ishuman(target))
var/mob/living/carbon/human/H = M
if((H.species.flags & IS_PLANT) && (M.nutrition < 500))
@@ -136,7 +135,6 @@
on_hit(var/atom/target, var/blocked = 0)
var/mob/M = target
// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //These rays make plantmen fat.
if(ishuman(target)) //These rays make plantmen fat.
var/mob/living/carbon/human/H = M
if((H.species.flags & IS_PLANT) && (M.nutrition < 500))
+8 -8
View File
@@ -185,9 +185,9 @@ mob/living/proc/Targeted(var/obj/item/weapon/gun/I) //Self explanitory.
else
I.lower_aim()
return
if(m_intent == "run" && T.client.target_can_move == 1 && T.client.target_can_run == 0 && (ishuman(T)))
/*if(m_intent == "run" && T.client.target_can_move == 1 && T.client.target_can_run == 0 && (ishuman(T)))
src << "\red Your move intent is now set to walk, as your targeter permits it." //Self explanitory.
set_m_intent("walk")
set_m_intent("walk")*/
//Processing the aiming. Should be probably in separate object with process() but lasy.
while(targeted_by && T.client)
@@ -249,18 +249,18 @@ client/var
//These are called by the on-screen buttons, adjusting what the victim can and cannot do.
client/proc/add_gun_icons()
screen += usr.item_use_icon
screen += usr.gun_move_icon
/*screen += usr.gun_move_icon
if (target_can_move)
screen += usr.gun_run_icon
screen += usr.gun_run_icon*/
client/proc/remove_gun_icons()
if(!usr) return
screen -= usr.item_use_icon
screen -= usr.gun_move_icon
/*screen -= usr.gun_move_icon
if (target_can_move)
screen -= usr.gun_run_icon
screen -= usr.gun_run_icon*/
client/verb/ToggleGunMode()
set hidden = 1
@@ -276,7 +276,7 @@ client/verb/ToggleGunMode()
usr.gun_setting_icon.icon_state = "gun[gun_mode]"
client/verb/AllowTargetMove()
/*client/verb/AllowTargetMove()
set hidden=1
//Changing client's permissions
@@ -339,7 +339,7 @@ client/verb/AllowTargetRun()
if(target_can_run)
M << "Your character may now <b>run</b> at the discretion of their targeter."
else
M << "\red <b>Your character will now be shot if they run.</b>"
M << "\red <b>Your character will now be shot if they run.</b>"*/
client/verb/AllowTargetClick()
set hidden=1
+1 -1
View File
@@ -352,7 +352,7 @@ datum
ME2.name = "used slime extract"
ME2.desc = "This extract has been used up."
playsound(get_turf(my_atom), 'sound/effects/bubbles.ogg', 80, 1)
playsound(get_turf(my_atom), C.mix_sound, 80, 1)
C.on_reaction(src, created_volume)
reaction_occured = 1
@@ -177,6 +177,10 @@
R.add_reagent(href_list["dispense"], min(amount, energy * 10, space))
energy = max(energy - min(amount, energy * 10, space) / 10, 0)
overlays.Cut()
icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position.
icon_beaker.pixel_x = rand(-10,5)
overlays += icon_beaker
if(href_list["remove"])
if(beaker)
+31 -27
View File
@@ -268,6 +268,10 @@ datum
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped)
cube.Expand()
// Dehydrated carp
if(istype(O,/obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
return
hellwater
@@ -355,16 +359,17 @@ datum
if(!M) M = holder.my_atom
if(ishuman(M))
var/mob/living/carbon/human/human = M
if(human.dna.mutantrace == null)
if(human.species.name != "Shadow")
M << "\red Your flesh rapidly mutates!"
M << "<b>You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.</b>"
M << "\red Your body reacts violently to light. \green However, it naturally heals in darkness."
M << "Aside from your new traits, you are mentally unchanged and retain your prior obligations."
human.dna.mutantrace = "shadow"
human.update_mutantrace()
human.set_species("Shadow")
..()
return
aslimetoxin
name = "Advanced Mutation Toxin"
id = "amutationtoxin"
@@ -1075,6 +1080,11 @@ datum
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.lip_style)
H.lip_style = null
H.update_body()
if(C.r_hand)
C.r_hand.clean_blood()
if(C.l_hand)
@@ -1119,23 +1129,6 @@ datum
M.adjust_fire_stacks(volume / 5)
..()
return
cryptobiolin
name = "Cryptobiolin"
id = "cryptobiolin"
description = "Cryptobiolin causes confusion and dizzyness."
reagent_state = LIQUID
color = "#FFD1DC" // rgb: 255, 209, 220
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.Dizzy(1)
if(!M.confused) M.confused = 1
M.confused = max(M.confused, 20)
holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM)
..()
return
lexorin
name = "Lexorin"
id = "lexorin"
@@ -1317,9 +1310,9 @@ datum
spaceacillin
name = "Spaceacillin"
id = "spaceacillin"
description = "An all-purpose antiviral agent."
description = "An all-purpose antibiotic agent extracted from space fungus."
reagent_state = LIQUID
color = "#228B22" // rgb: 34, 139, 34
color = "#0AB478"
on_mob_life(var/mob/living/M as mob)
..()
@@ -1351,12 +1344,12 @@ datum
data = max(data - 1, 3)
..()
mindbreaker
name = "Mindbreaker Toxin"
id = "mindbreaker"
description = "A powerful hallucinogen. Not a thing to be messed with."
lsd
name = "Lysergic acid diethylamide"
id = "lsd"
description = "A highly potent hallucinogenic substance. Far out, maaaan."
reagent_state = LIQUID
color = "#B31008" // rgb: 139, 166, 233
color = "#0000D8"
on_mob_life(var/mob/living/M)
if(!M) M = holder.my_atom
@@ -2384,10 +2377,12 @@ datum
reagent_state = LIQUID
nutriment_factor = 0 //So alcohol can fill you up! If they want to.
color = "#404030" // rgb: 64, 64, 48
var/datum/martial_art/drunk_brawling/F = new
var/dizzy_adj = 3
var/slurr_adj = 3
var/confused_adj = 2
var/slur_start = 65 //amount absorbed after which mob starts slurring
var/brawl_start = 75 //amount absorbed after which mob switches to drunken brawling as a fighting style
var/confused_start = 130 //amount absorbed after which mob starts confusing directions
var/vomit_start = 180 //amount absorbed after which mob starts vomitting
var/blur_start = 260 //amount absorbed after which mob starts getting blurred vision
@@ -2417,6 +2412,12 @@ datum
if(d >= slur_start && d < pass_out)
if (!M:slurring) M:slurring = 1
M:slurring += slurr_adj/sober_str
if(d >= brawl_start && ishuman(M))
var/mob/living/carbon/human/H = M
F.teach(H,1)
if(src.volume < 3)
if(H.martial_art == F)
F.remove(H)
if(d >= confused_start && prob(33))
if (!M:confused) M:confused = 1
M.confused = max(M:confused+(confused_adj/sober_str),0)
@@ -2490,6 +2491,7 @@ datum
description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything."
color = "#664300" // rgb: 102, 67, 0
slur_start = 30 //amount absorbed after which mob starts slurring
brawl_start = 40
gin
name = "Gin"
@@ -2506,6 +2508,7 @@ datum
overdose_threshold = 30
dizzy_adj = 5
slur_start = 25
brawl_start = 40
confused_start = 100
//copy paste from LSD... shoot me
@@ -2583,6 +2586,7 @@ datum
slurr_adj = 20
confused_adj = 3
slur_start = 15
brawl_start = 25
confused_start = 40
blur_start = 60
pass_out = 80
+18 -56
View File
@@ -16,6 +16,7 @@ datum
var/list/secondary_results = list() //additional reagents produced by the reaction
var/required_temp = 0
var/mix_message = "The solution begins to bubble."
var/mix_sound = 'sound/effects/bubbles.ogg'
proc
@@ -30,6 +31,8 @@ datum
result = null
required_reagents = list("water" = 1, "potassium" = 1)
result_amount = 2
mix_message = "The mixture explodes!"
on_reaction(var/datum/reagents/holder, var/created_volume)
var/datum/effect/effect/system/reagents_explosion/e = new()
e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0)
@@ -120,13 +123,6 @@ datum
result_amount = 3
mix_message = "The water somehow seems purified. Or maybe defiled."
cryptobiolin
name = "Cryptobiolin"
id = "cryptobiolin"
result = "cryptobiolin"
required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1)
result_amount = 3
cryoxadone
name = "Cryoxadone"
id = "cryoxadone"
@@ -147,8 +143,9 @@ datum
name = "Spaceacillin"
id = "spaceacillin"
result = "spaceacillin"
required_reagents = list("cryptobiolin" = 1, "epinephrine" = 1)
required_reagents = list("fungus" = 1, "ethanol" = 1)
result_amount = 2
mix_message = "The solvent extracts an antibiotic compound from the fungus."
Audioline
name = "Audioline"
@@ -190,15 +187,16 @@ datum
name = "Rezadone"
id = "rezadone"
result = "rezadone"
required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1)
required_reagents = list("carpotoxin" = 1, "spaceacillin" = 1, "copper" = 1)
result_amount = 3
mindbreaker
name = "Mindbreaker Toxin"
id = "mindbreaker"
result = "mindbreaker"
required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1)
result_amount = 5
lsd
name = "Lysergic acid diethylamide"
id = "lsd"
result = "lsd"
required_reagents = list("diethylamine" = 1, "fungus" = 1)
result_amount = 3
mix_message = "The mixture turns a rather unassuming color and settles."
plastication
name = "Plastic"
@@ -487,23 +485,8 @@ datum
required_other = 1
on_reaction(var/datum/reagents/holder)
var/blocked = list(/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/pirate,
/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/russian,
/mob/living/simple_animal/hostile/russian/ranged,
/mob/living/simple_animal/hostile/syndicate,
/mob/living/simple_animal/hostile/syndicate/melee,
/mob/living/simple_animal/hostile/syndicate/melee/space,
/mob/living/simple_animal/hostile/syndicate/ranged,
/mob/living/simple_animal/hostile/syndicate/ranged/space,
/mob/living/simple_animal/hostile/alien/queen/large,
/mob/living/simple_animal/hostile/faithless,
/mob/living/simple_animal/hostile/panther,
/mob/living/simple_animal/hostile/snake,
/mob/living/simple_animal/hostile/retaliate,
/mob/living/simple_animal/hostile/retaliate/clown
)//exclusion list for things you don't want the reaction to create.
var/blocked = blocked_mobs //global variable of blocked mobs
var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
playsound(get_turf_loc(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
@@ -535,34 +518,13 @@ datum
on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
O.show_message(text("<span class='danger'>The slime extract begins to vibrate violently !</span>"), 1)
O.show_message(text("<span class='danger'>The slime extract begins to vibrate violently!</span>"), 1)
spawn(50)
if(holder && holder.my_atom)
var/blocked = list(/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/pirate,
/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/russian,
/mob/living/simple_animal/hostile/russian/ranged,
/mob/living/simple_animal/hostile/syndicate,
/mob/living/simple_animal/hostile/syndicate/melee,
/mob/living/simple_animal/hostile/syndicate/melee/space,
/mob/living/simple_animal/hostile/syndicate/ranged,
/mob/living/simple_animal/hostile/syndicate/ranged/space,
/mob/living/simple_animal/hostile/alien/queen/large,
/mob/living/simple_animal/hostile/retaliate,
/mob/living/simple_animal/hostile/retaliate/clown,
/mob/living/simple_animal/hostile/mushroom,
/mob/living/simple_animal/hostile/asteroid,
/mob/living/simple_animal/hostile/asteroid/basilisk,
/mob/living/simple_animal/hostile/asteroid/goldgrub,
/mob/living/simple_animal/hostile/asteroid/goliath,
/mob/living/simple_animal/hostile/asteroid/hivelord,
/mob/living/simple_animal/hostile/asteroid/hivelordbrood,
/mob/living/simple_animal/hostile/carp/holocarp,
/mob/living/simple_animal/hostile/mining_drone
)//exclusion list for things you don't want the reaction to create.
var/blocked = blocked_mobs
var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+1 -1
View File
@@ -180,7 +180,7 @@
M.attack_log += "\[[time_stamp()]\] <b>[user]/[user.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>dartgun</b> ([R])"
user.attack_log += "\[[time_stamp()]\] <b>[user]/[user.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>dartgun</b> ([R])"
if(M.ckey)
msg_admin_attack("[user] ([user.ckey]) shot [M] ([M.ckey]) with a dartgun ([R]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
msg_admin_attack("[user] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] shot [M] ([M.ckey]) with a dartgun ([R]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(!iscarbon(user))
M.LAssailant = null
else
+4 -1
View File
@@ -407,6 +407,7 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
required_reagents = list("corn_starch" = 1, "blood" = 1)
result_amount = 2
mix_message = "The mixture congeals into a bloody mass."
mix_sound = 'sound/effects/blobattack.ogg'
/datum/reagent/mashedpotatoes
name = "Mashed potatoes"
@@ -457,6 +458,7 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
required_reagents = list("hydrogenated_soybeanoil" = 2, "meatslurry" = 1, "plasma" = 1)
result_amount = 4
mix_message = "The mixture solidifies, taking a crystalline appearance."
mix_sound = 'sound/effects/blobattack.ogg'
/datum/reagent/pepperoni
name = "Pepperoni"
@@ -493,4 +495,5 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol
result = "pepperoni"
required_reagents = list("beff" = 1, "saltpetre" = 1, "synthflesh" = 1)
result_amount = 2
mix_message = "The beff and the synthflesh combine to form a smoky red log."
mix_message = "The beff and the synthflesh combine to form a smoky red log."
mix_sound = 'sound/effects/blobattack.ogg'
+12 -33
View File
@@ -148,6 +148,7 @@ datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob)
required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1)
result_amount = 3
mix_message = "The mixture knits together into a fibrous, bloody mass."
mix_sound = 'sound/effects/blobattack.ogg'
/datum/chemical_reaction/styptic_powder
name = "Styptic Powder"
@@ -693,30 +694,8 @@ datum/reagent/life
proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon")
if(holder && holder.my_atom)
var/blocked = list(/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/pirate,
/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/russian,
/mob/living/simple_animal/hostile/russian/ranged,
/mob/living/simple_animal/hostile/syndicate,
/mob/living/simple_animal/hostile/syndicate/melee,
/mob/living/simple_animal/hostile/syndicate/melee/space,
/mob/living/simple_animal/hostile/syndicate/ranged,
/mob/living/simple_animal/hostile/syndicate/ranged/space,
/mob/living/simple_animal/hostile/alien/queen/large,
/mob/living/simple_animal/hostile/retaliate,
/mob/living/simple_animal/hostile/retaliate/clown,
/mob/living/simple_animal/hostile/mushroom,
/mob/living/simple_animal/hostile/asteroid,
/mob/living/simple_animal/hostile/asteroid/basilisk,
/mob/living/simple_animal/hostile/asteroid/goldgrub,
/mob/living/simple_animal/hostile/asteroid/goliath,
/mob/living/simple_animal/hostile/asteroid/hivelord,
/mob/living/simple_animal/hostile/asteroid/hivelordbrood,
/mob/living/simple_animal/hostile/carp/holocarp,
/mob/living/simple_animal/hostile/mining_drone,
/mob/living/simple_animal/hostile/spaceWorm
)//exclusion list for things you don't want the reaction to create.
var/blocked = blocked_mobs //global variable for blocked mobs
var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
@@ -905,15 +884,15 @@ datum/reagent/haloperidol
datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.reagents.remove_reagent("crank",5)
M.reagents.remove_reagent("methamphetamine",5)
M.reagents.remove_reagent("space_drugs",5)
M.reagents.remove_reagent("psilocybin",5)
M.reagents.remove_reagent("ephedrine",5)
M.reagents.remove_reagent("epinephrine",5)
M.reagents.remove_reagent("stimulants",5)
M.reagents.remove_reagent("bath_salts",5)
M.reagents.remove_reagent("mindbreaker",5)
M.reagents.remove_reagent("crank", 5)
M.reagents.remove_reagent("methamphetamine", 5)
M.reagents.remove_reagent("space_drugs", 5)
M.reagents.remove_reagent("psilocybin", 5)
M.reagents.remove_reagent("ephedrine", 5)
M.reagents.remove_reagent("epinephrine", 5)
M.reagents.remove_reagent("stimulants", 5)
M.reagents.remove_reagent("bath_salts", 5)
M.reagents.remove_reagent("lsd", 5)
M.druggy -= 5
M.hallucination -= 5
M.jitteriness -= 5
+48 -2
View File
@@ -73,7 +73,7 @@ datum/reagent/acetone
name = "carpet"
id = "carpet"
result = "carpet"
required_reagents = list("space_drugs" = 1, "blood" = 1)
required_reagents = list("fungus" = 1, "blood" = 1)
result_amount = 2
mix_message = "The substance turns thick and stiff, yet soft."
@@ -101,6 +101,7 @@ datum/reagent/acetone
required_reagents = list("oil" = 1)
result_amount = 0.5
required_temp = 480
mix_sound = null
datum/reagent/colorful_reagent
name = "Colorful Reagent"
@@ -117,6 +118,12 @@ datum/reagent/colorful_reagent
result_amount = 6
mix_message = "The substance flashes multiple colors and emits the smell of a pocket protector."
datum/reagent/colorful_reagent/reaction_mob(var/mob/living/simple_animal/M, var/method=TOUCH, var/volume)
if(M)
M.color = pick(random_color_list)
..()
return
datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume)
if(O)
O.color = pick(random_color_list)
@@ -157,6 +164,7 @@ datum/reagent/corgium
required_reagents = list("egg" = 1, "colorful_reagent" = 1, "chicken_soup" = 1, "strange_reagent" = 1, "blood" = 1)
result_amount = 5
required_temp = 374
mix_message = "The substance turns an airy sky-blue and foams up into a new shape."
/datum/chemical_reaction/flaptonium/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
@@ -287,4 +295,42 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
M << "<span class = 'danger'>THE PAIN!"
M.adjustBruteLoss(1)
..()
return
return
///Alchemical Reagents
datum/reagent/eyenewt
name = "Eye of newt"
id = "eyenewt"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#050519"
datum/reagent/toefrog
name = "Toe of frog"
id = "toefrog"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#092D09"
datum/reagent/woolbat
name = "Wool of bat"
id = "woolbat"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#080808"
datum/reagent/tonguedog
name = "Tongue of dog"
id = "tonguedog"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#2D0909"
datum/reagent/triplepiss
name = "Triplepiss"
id = "triplepiss"
description = "Ewwwwwwwww."
reagent_state = LIQUID
color = "#857400"
+19 -7
View File
@@ -32,7 +32,7 @@
id = "clf3"
result = "clf3"
required_reagents = list("chlorine" = 1, "fluorine" = 3)
result_amount = 4
result_amount = 2
required_temp = 424
/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob)
@@ -46,7 +46,6 @@
var/turf/T = get_turf(holder.my_atom)
for(var/turf/turf in range(1,T))
new /obj/fire(turf)
holder.chem_temp = 1000 // hot as shit
return
/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume)
@@ -70,7 +69,7 @@
if(method == TOUCH && isliving(M))
M.adjust_fire_stacks(5)
M.IgniteMob()
new /obj/fire(M.loc)
M.bodytemperature += 30
return
/datum/reagent/sorium
@@ -145,9 +144,11 @@
if(istype(X, /atom/movable))
if((X) && !X.anchored)
if(setting_type)
playsound(T, 'sound/effects/bang.ogg', 25, 1)
for(var/i = 0, i < pull_times, i++)
step_away(X,T)
else
playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this.
for(var/i = 0, i < pull_times, i++)
step_towards(X,T)
@@ -175,28 +176,38 @@
result_amount = 1
required_temp = 474
mix_message = "sparks start flying about."
mix_sound = null
datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
src = null
if(volume >= 5)
if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in get_turf(T)) //let's not have hundreds of decals of black powder on the same turf
new /obj/effect/decal/cleanable/dirt/blackpowder(T)
return
/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, location)
s.start()
sleep(rand(30,50))
sleep(rand(20,30))
blackpowder_detonate(holder, created_volume)
return
/datum/reagent/blackpowder/on_ex_act()
blackpowder_detonate(holder, volume)
holder.remove_reagent("blackpowder", volume)
return
/proc/blackpowder_detonate(var/datum/reagents/holder, var/created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
var/ex_severe = round(created_volume / 100)
var/ex_heavy = round(created_volume / 42)
var/ex_light = round(created_volume / 21)
var/ex_light = round(created_volume / 20)
var/ex_flash = round(created_volume / 8)
explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1)
return
/datum/reagent/flash_powder
name = "Flash Powder"
id = "flash_powder"
@@ -208,7 +219,7 @@
name = "Flash powder"
id = "flash_powder"
result = "flash_powder"
required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1 )
required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1)
result_amount = 3
/datum/chemical_reaction/flash_powder_flash
@@ -261,7 +272,7 @@
id = "smoke_powder"
result = "smoke_powder"
required_reagents = list("stabilizing_agent" = 1, "potassium" = 1, "sugar" = 1, "phosphorus" = 1)
result_amount = 1
result_amount = 3
mix_message = "The mixture sets into a greyish powder!"
/datum/chemical_reaction/smoke
@@ -297,6 +308,7 @@
secondary = 1
result_amount = 1
forbidden_reagents = list()
mix_sound = null
/datum/reagent/sonic_powder
name = "Sonic Powder"
+4 -2
View File
@@ -142,6 +142,7 @@ datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob)
required_reagents = list("space_drugs" = 1)
result_amount = 1
required_temp = 674
mix_sound = null
datum/reagent/cyanide
name = "Cyanide"
@@ -206,9 +207,10 @@ datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob)
name = "Itching Powder"
id = "itching_powder"
result = "itching_powder"
required_reagents = list("fuel" = 1, "ammonia" = 1, "charcoal" = 1)
required_reagents = list("fuel" = 1, "ammonia" = 1, "fungus" = 1)
result_amount = 3
mix_message = "The mixture congeals and dries up, leaving behind an abrasive powder."
mix_sound = 'sound/effects/blobattack.ogg'
datum/reagent/facid/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -602,7 +604,7 @@ datum/reagent/atrazine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volu
if(ismonkey(M))
var/mob/living/carbon/monkey/MO = M
if(MO.dna)
if(MO.dna.mutantrace == "plant") //plantmen monkeys (diona) take EVEN MORE damage
if(istype(MO,/mob/living/carbon/monkey/diona)) //plantmen monkeys (diona) take EVEN MORE damage
MO.adjustToxLoss(100)
..()
return
@@ -73,7 +73,7 @@
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been squirted with [src.name] by [user.name] ([user.ckey]). Reagents: [contained]</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to squirt [M.name] ([M.key]). Reagents: [contained]</font>")
if(M.ckey)
msg_admin_attack("[user.name] ([user.ckey]) squirted [M.name] ([M.key]) with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] squirted [M.name] ([M.key]) with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(!iscarbon(user))
M.LAssailant = null
else
@@ -44,7 +44,7 @@
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Fed [M.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]</font>")
msg_admin_attack("[key_name(user)] fed [key_name(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
msg_admin_attack("[key_name(user)][isAntag(user) ? "(ANTAG)" : ""] fed [key_name(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(reagents.total_volume)
reagents.trans_to_ingest(M, gulp_size)
@@ -318,3 +318,96 @@
New()
..()
reagents.add_reagent("sodawater", 50)
//Donk Co. Cola//
/obj/item/weapon/reagent_containers/food/drinks/cans/pubber
name = "Dr. Pubber"
desc = "The beverage of an original crowd. Tastes like an industrial tranquilizer."
icon_state = "dr_gibb"
New()
..()
reagents.add_reagent("haloperidol", 4)
reagents.add_reagent("morphine", 4)
reagents.add_reagent("vhfcs", 10)
reagents.add_reagent("cola", 12)
/obj/item/weapon/reagent_containers/food/drinks/cans/robust
name = "Robust-Eeze"
desc = "A carbonated robustness tonic. It has quite a kick."
icon_state = "cola"
New()
..()
reagents.add_reagent("methamphetamine", 3)
reagents.add_reagent("vhfcs", 10)
reagents.add_reagent("cola", 17)
/obj/item/weapon/reagent_containers/food/drinks/cans/grifeo
name = "Grife-O"
desc = "The carbonated beverage of a space generation. Contains actual space dust!"
icon_state = "griefo"
New()
..()
reagents.add_reagent("radium", 3)
reagents.add_reagent("ephedrine", 6)
reagents.add_reagent("vhfcs", 10)
reagents.add_reagent("cola", 11)
/obj/item/weapon/reagent_containers/food/drinks/cans/orangeaid
name = "Orange-Aid"
desc = "A vitamin tonic that promotes good eyesight and health."
icon_state = "starkist"
New()
..()
reagents.add_reagent("orangejuice", 20)
reagents.add_reagent("oculine", 20)
/obj/item/weapon/reagent_containers/food/drinks/cans/limeaid
name = "Lime-Aid"
desc = "Antihol mixed with lime juice. A well-known cure for hangovers."
icon_state = "space-up"
New()
..()
reagents.add_reagent("limejuice", 20)
reagents.add_reagent("antihol", 20)
/obj/item/weapon/reagent_containers/food/drinks/cans/runoff
name = "Spooky Dan's Runoffa Cola"
desc = "A spoooky cola for Halloween! Rumors that Runoff Cola contains actual industrial runoff are unsubstantiated."
icon_state = "purple_can"
New()
..()
reagents.add_reagent("chlorine", 5)
reagents.add_reagent("phosphorus", 5)
reagents.add_reagent("mercury", 5)
reagents.add_reagent("vhfcs", 10)
reagents.add_reagent("cola", 15)
/obj/item/weapon/reagent_containers/food/drinks/cans/horror
name = "Spooky Dan's Horrortastic Cola"
desc = "A terrifying Halloween soda. It's especially frightening if you're diabetic."
icon_state = "glowingbeer"
New()
..()
reagents.add_reagent("ectoplasm", 10)
reagents.add_reagent("sulfur", 5)
reagents.add_reagent("vhfcs", 5)
reagents.add_reagent("cola", 20)
/obj/item/weapon/reagent_containers/food/drinks/cans/grones
name = "Grones Soda"
desc = "Bursting with 10 different flavors!"
icon_state = "grones"
New()
..()
reagents.add_reagent("cola", 20)
reagents.add_reagent(pick("atropine","serotrotium","lithium","mercury","charcoal","diphenhydramine","spaceacillin","hairgrownium","ephedrine","capsaicin"), 10)
/obj/item/weapon/reagent_containers/food/drinks/cans/decirprevo
name = "Decirprevo Bottled Water"
desc = "Bottled from our cool natural springs on Europa."
icon_state = "waterbottle"
New()
..()
reagents.add_reagent("water", 45)
reagents.add_reagent("iodine", 5)
@@ -51,7 +51,7 @@
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Fed [src.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]</font>")
if(M.ckey)
msg_admin_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(!iscarbon(user))
M.LAssailant = null
else
@@ -235,8 +235,6 @@
New()
..()
reagents.add_reagent("tea", 30)
if(prob(10))
reagents.add_reagent("mugwort", 3)
src.pixel_x = rand(-10.0, 10)
src.pixel_y = rand(-10.0, 10)
@@ -272,6 +270,30 @@
src.pixel_x = rand(-10.0, 10)
src.pixel_y = rand(-10.0, 10)
/obj/item/weapon/reagent_containers/food/drinks/chocolate
name = "Hot Chocolate"
desc = "Made in Space Switzerland."
icon_state = "hot_coco"
item_state = "coffee"
New()
..()
reagents.add_reagent("chocolate", 45)
src.pixel_x = rand(-10.0, 10)
src.pixel_y = rand(-10.0, 10)
/obj/item/weapon/reagent_containers/food/drinks/weightloss
name = "Weight-Loss Shake"
desc = "A shake designed to cause weight loss. The package proudly proclaims that it is 'tapeworm free.'"
icon_state = "coffee"
item_state = "coffee"
New()
..()
reagents.add_reagent("lipolicide", 30)
reagents.add_reagent("chocolate", 5)
src.pixel_x = rand(-10.0, 10)
src.pixel_y = rand(-10.0, 10)
/obj/item/weapon/reagent_containers/food/drinks/dry_ramen
name = "Cup Ramen"
desc = "Just add 10ml water, self heats! A taste that reminds you of your school years."
@@ -279,8 +301,6 @@
New()
..()
reagents.add_reagent("dry_ramen", 30)
if(prob(10))
reagents.add_reagent("enzyme", 3)
src.pixel_x = rand(-10.0, 10)
src.pixel_y = rand(-10.0, 10)
@@ -345,3 +365,211 @@
desc = "A cup with the british flag emblazoned on it."
icon_state = "britcup"
volume = 30
////Stinkeye/// Holy buns don't ever drink this -Fox
/obj/item/weapon/reagent_containers/food/drinks/stinkeye
name = "Stinkeye's Special Reserve"
desc = "An old bottle labelled 'The Good Stuff'. This probably has enough kick to knock an elephant on its ass."
icon_state = "whiskeybottle"
volume = 250
New()
..()
reagents.add_reagent("beer", 30)
reagents.add_reagent("wine", 30)
reagents.add_reagent("cider", 30)
reagents.add_reagent("vodka", 30)
reagents.add_reagent("ethanol", 30)
reagents.add_reagent("eyenewt", 30)
////Discount Dan's Soup////// May God have mercy on your souls---and stomachs. -Fox
/obj/item/weapon/reagent_containers/food/drinks/dansoup
name = "Discount Dan's Quik-Noodles"
desc = "A self-heating cup of noodles. There's enough sodium in these to put the Dead Sea to shame."
icon_state = "dansoup"
volume = 65
var/selfheat = 0
/obj/item/weapon/reagent_containers/food/drinks/dansoup/attack_self(mob/user as mob) //self-heating action!
if(selfheat)
return
else
selfheat = 1
user << "<span class='notice'>You twist the bottom of the cup. The cup emits a soft clack as the heater triggers.</span>"
reagents.add_reagent("pyrosium", 2)
reagents.add_reagent("oxygen", 2)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/random
New()
..()
var/list/list = typesof(/obj/item/weapon/reagent_containers/food/drinks/dansoup) - list(/obj/item/weapon/reagent_containers/food/drinks/dansoup,/obj/item/weapon/reagent_containers/food/drinks/dansoup/random)
var/T = pick(list)
new T(loc)
spawn(0)
del src
/obj/item/weapon/reagent_containers/food/drinks/dansoup/bbq
name = "Devil Dan's Quik-Noodles - Brimstone BBQ Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("sulfur", 5)
reagents.add_reagent("beff", 5)
// reagents.add_reagent("ghostchili", 5) uncomment once ghost chili juice is added
/obj/item/weapon/reagent_containers/food/drinks/dansoup/macaroni
name = "Discount Dan's Quik-Noodles - Macaroni and Imitation Processed Cheese Product Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 9)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("fake_cheese", 2)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/beef
name = "Comrade Dan's Quik-Noodles - Beef Perestroikanoff Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("milk", 3)
reagents.add_reagent("enzyme", 3)
reagents.add_reagent("beff", 4)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/teriyaki
name = "Discount Deng's Quik-Noodles - Teriyaki TVP Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("hydrogenated_soybeanoil", 1)
reagents.add_reagent("msg", 14)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("synthflesh", 5)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/gamer
name = "Dan's Quik-Noodles - Gamer Grubs Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("????", 10)
reagents.add_reagent("potassium", 5)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/mushroom
name = "Frycook Dan's Quik-Noodles - Mushroom-Swiss Burger-Bake Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("beff", 2)
reagents.add_reagent("weird_cheese", 2)
reagents.add_reagent("psilocybin", 6)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/ketchup
name = "Frycook Dan's Quik-Noodles - Curly Fry Ketchup Hoedown Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("hydrogenated_soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("tomatojuice", 4)
reagents.add_reagent("mugwort", 3)
reagents.add_reagent("capsaicin", 3)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/sundae
name = "Dessert Dan's Quik-Noodles - Sweet Sundae Noodle Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("vhfcs", 10)
reagents.add_reagent("chocolate", 2)
reagents.add_reagent("cream", 2)
reagents.add_reagent("chocolate_milk", 6)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/tuna
name = "Descuento Danito's Quik-Noodles - Tuna Melt Taco Fiesta Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("fake_cheese", 3)
reagents.add_reagent("mercury", 3)
reagents.add_reagent("capsaicin", 4)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/lomein
name = "Discount Deng's Quik-Noodles - Sweet and Sour Lo Mein Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("sacid", 3)
reagents.add_reagent("vhfcs", 7)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/crab
name = "Pirate Dan's Quik-Noodles - Spicy Imitation Crab Meat Paste Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("synthflesh", 3)
reagents.add_reagent("saltpetre", 3)
reagents.add_reagent("capsaicin", 14)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/sausage
name = "Morning Dan's Quik-Noodles - Mechanically Reclaimed Sausage Biscuit Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("hydrogenated_soybeanoil", 4)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("ammonia", 3)
reagents.add_reagent("gravy", 4)
reagents.add_reagent("coffee", 3)
/obj/item/weapon/reagent_containers/food/drinks/dansoup/italian
name = "Sconto Danilo's Quik-Noodles - Italian Strozzapreti Lunare Flavor"
New()
..()
reagents.add_reagent("chicken_soup", 10)
reagents.add_reagent("soybeanoil", 1)
reagents.add_reagent("msg", 9)
reagents.add_reagent("sodiumchloride", 10)
reagents.add_reagent("nicotine", 8)
reagents.add_reagent("tomatojuice", 4)
reagents.add_reagent("wine", 2)
reagents.add_reagent("water", 2)
@@ -100,7 +100,7 @@
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has attacked [target.name] ([target.ckey]) with a bottle!</font>")
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been smashed with a bottle by [user.name] ([user.ckey])</font>")
if(target.ckey)
msg_admin_attack("[user.name] ([user.ckey]) attacked [target.name] ([target.ckey]) with a bottle. (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] attacked [target.name] ([target.ckey]) with a bottle. (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(!iscarbon(user))
target.LAssailant = null
else

Some files were not shown because too many files have changed in this diff Show More