mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-17 19:14:15 +01:00
Conflicts 2/3
This commit is contained in:
@@ -220,7 +220,7 @@
|
||||
var/dat = "<B>Showing DNA from blood.</B><HR>"
|
||||
dat += "<table cellspacing=5><tr><th>Name</th><th>DNA</th><th>Blood Type</th></tr>"
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.dna && H.ckey)
|
||||
if(H.ckey)
|
||||
dat += "<tr><td>[H]</td><td>[H.dna.unique_enzymes]</td><td>[H.dna.blood_type]</td></tr>"
|
||||
dat += "</table>"
|
||||
usr << browse(dat, "window=DNA;size=440x410")
|
||||
@@ -231,12 +231,7 @@
|
||||
dat += "<table cellspacing=5><tr><th>Name</th><th>Fingerprints</th></tr>"
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.ckey)
|
||||
if(H.dna && H.dna.uni_identity)
|
||||
dat += "<tr><td>[H]</td><td>[md5(H.dna.uni_identity)]</td></tr>"
|
||||
else if(H.dna && !H.dna.uni_identity)
|
||||
dat += "<tr><td>[H]</td><td>H.dna.uni_identity = null</td></tr>"
|
||||
else if(!H.dna)
|
||||
dat += "<tr><td>[H]</td><td>H.dna = null</td></tr>"
|
||||
dat += "<tr><td>[H]</td><td>[md5(H.dna.uni_identity)]</td></tr>"
|
||||
dat += "</table>"
|
||||
usr << browse(dat, "window=fingerprints;size=440x410")
|
||||
|
||||
@@ -259,8 +254,7 @@
|
||||
message_admins("\blue [key_name_admin(usr)] turned all humans into [result]")
|
||||
var/newtype = species_list[result]
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
hardset_dna(H, null, null, null, null, newtype)
|
||||
H.regenerate_icons()
|
||||
H.set_species(newtype)
|
||||
|
||||
if("corgi")
|
||||
if(!check_rights(R_FUN))
|
||||
|
||||
@@ -1527,7 +1527,6 @@
|
||||
var/client/C = usr.client
|
||||
if(!isobserver(usr)) C.admin_ghost()
|
||||
var/mob/dead/observer/A = C.mob
|
||||
sleep(2)
|
||||
A.ManualFollow(M)
|
||||
log_admin("[key_name(usr)] followed [key_name(M)]")
|
||||
message_admins("[key_name_admin(usr)] followed [key_name_admin(M)]")
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
for (var/mob/M in player_list)
|
||||
if (istype(M, /mob/new_player))
|
||||
continue
|
||||
if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
|
||||
if (M.stat == DEAD || istype(M, /mob/living/simple_animal/revenant) || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -326,13 +326,13 @@
|
||||
//Spawn and equip the commando
|
||||
var/mob/living/carbon/human/Commando = new(spawnloc)
|
||||
chosen_candidate.client.prefs.copy_to(Commando)
|
||||
ready_dna(Commando)
|
||||
if(numagents == 1) //If Squad Leader
|
||||
Commando.real_name = "Officer [pick(commando_names)]"
|
||||
Commando.equipOutfit(/datum/outfit/death_commando/officer)
|
||||
else
|
||||
Commando.real_name = "Trooper [pick(commando_names)]"
|
||||
Commando.equipOutfit(/datum/outfit/death_commando)
|
||||
Commando.dna.update_dna_identity()
|
||||
Commando.key = chosen_candidate.key
|
||||
Commando.mind.assigned_role = "Death Commando"
|
||||
for(var/obj/machinery/door/poddoor/ert/door in airlocks)
|
||||
@@ -420,8 +420,8 @@
|
||||
//Create the official
|
||||
var/mob/living/carbon/human/newmob = new (pick(emergencyresponseteamspawn))
|
||||
chosen_candidate.client.prefs.copy_to(newmob)
|
||||
ready_dna(newmob)
|
||||
newmob.real_name = newmob.dna.species.random_name(newmob.gender,1)
|
||||
newmob.dna.update_dna_identity()
|
||||
newmob.key = chosen_candidate.key
|
||||
newmob.mind.assigned_role = "Centcom Official"
|
||||
newmob.equipOutfit(/datum/outfit/centcom_official)
|
||||
@@ -490,7 +490,6 @@
|
||||
var/mob/living/carbon/human/ERTOperative = new(spawnloc)
|
||||
var/list/lastname = last_names
|
||||
chosen_candidate.client.prefs.copy_to(ERTOperative)
|
||||
ready_dna(ERTOperative)
|
||||
var/ertname = pick(lastname)
|
||||
switch(numagents)
|
||||
if(1)
|
||||
@@ -514,6 +513,7 @@
|
||||
if(7)
|
||||
ERTOperative.real_name = "Engineer [ertname]"
|
||||
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer)
|
||||
ERTOperative.dna.update_dna_identity()
|
||||
ERTOperative.key = chosen_candidate.key
|
||||
ERTOperative.mind.assigned_role = "ERT"
|
||||
|
||||
|
||||
@@ -300,15 +300,13 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
new_character.real_name = record_found.fields["name"]
|
||||
new_character.gender = record_found.fields["sex"]
|
||||
new_character.age = record_found.fields["age"]
|
||||
new_character.dna.blood_type = record_found.fields["blood_type"]
|
||||
new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["features"])
|
||||
else
|
||||
new_character.gender = pick(MALE,FEMALE)
|
||||
var/datum/preferences/A = new()
|
||||
A.real_name = G_found.real_name
|
||||
A.copy_to(new_character)
|
||||
A.real_name = G_found.real_name
|
||||
new_character.dna.update_dna_identity()
|
||||
|
||||
if(!new_character.real_name)
|
||||
new_character.real_name = new_character.dna.species.random_name(new_character.gender,1)
|
||||
new_character.name = new_character.real_name
|
||||
|
||||
if(G_found.mind && !G_found.mind.active)
|
||||
@@ -316,13 +314,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
new_character.mind.special_verbs = list()
|
||||
else
|
||||
new_character.mind_initialize()
|
||||
if(!new_character.mind.assigned_role) new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role.
|
||||
|
||||
//DNA
|
||||
if(record_found)//Pull up their name from database records if they did have a mind.
|
||||
hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["features"])
|
||||
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
|
||||
ready_dna(new_character)
|
||||
if(!new_character.mind.assigned_role)
|
||||
new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role.
|
||||
|
||||
new_character.key = G_found.key
|
||||
|
||||
@@ -822,7 +815,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
|
||||
id_select += "<option value=\"[path]\">[path]</option>"
|
||||
id_select += "</select>"
|
||||
|
||||
var/dat = {"
|
||||
var/dat = {"
|
||||
<html><head><title>Create Outfit</title></head><body>
|
||||
<form name="outfit" action="byond://?src=\ref[src]" method="get">
|
||||
<input type="hidden" name="src" value="\ref[src]">
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
var/obj/machinery/gateway/centerstation/the_gateway = null
|
||||
|
||||
/obj/machinery/gateway
|
||||
name = "gateway"
|
||||
desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations."
|
||||
@@ -9,6 +11,18 @@
|
||||
var/active = 0
|
||||
|
||||
|
||||
/obj/machinery/gateway/centerstation/New()
|
||||
..()
|
||||
if(!the_gateway)
|
||||
the_gateway = src
|
||||
|
||||
|
||||
/obj/machinery/gateway/centerstation/Destroy()
|
||||
if(the_gateway == src)
|
||||
the_gateway = null
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/gateway/initialize()
|
||||
update_icon()
|
||||
if(dir == 2)
|
||||
|
||||
@@ -80,20 +80,17 @@
|
||||
user.dna.add_mutation(LASEREYES)
|
||||
user.dna.add_mutation(COLDRES)
|
||||
user.dna.add_mutation(XRAY)
|
||||
hardset_dna(user, null, null, null, null, /datum/species/shadow)
|
||||
user.regenerate_icons()
|
||||
user.set_species(/datum/species/shadow)
|
||||
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)
|
||||
hardset_dna(user, null, null, null, null, /datum/species/shadow)
|
||||
user.regenerate_icons()
|
||||
user.set_species(/datum/species/shadow)
|
||||
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
|
||||
hardset_dna(user, null, null, null, null, /datum/species/shadow)
|
||||
user.regenerate_icons()
|
||||
user.set_species(/datum/species/shadow)
|
||||
if("To Kill")
|
||||
user << "<B>Your wish is granted, but at a terrible cost...</B>"
|
||||
user << "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart."
|
||||
@@ -107,8 +104,7 @@
|
||||
for(var/datum/objective/OBJ in user.mind.objectives)
|
||||
user << "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]"
|
||||
obj_count++
|
||||
hardset_dna(user, null, null, null, null, /datum/species/shadow)
|
||||
user.regenerate_icons()
|
||||
user.set_species(/datum/species/shadow)
|
||||
if("Peace")
|
||||
user << "<B>Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.</B>"
|
||||
user << "You feel as if you just narrowly avoided a terrible fate..."
|
||||
|
||||
@@ -1049,7 +1049,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
|
||||
ShowChoices(user)
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/copy_to(mob/living/carbon/human/character)
|
||||
/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1)
|
||||
if(be_random_name)
|
||||
real_name = pref_species.random_name(gender)
|
||||
|
||||
@@ -1081,19 +1081,19 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
|
||||
character.undershirt = undershirt
|
||||
character.socks = socks
|
||||
|
||||
character.features = features
|
||||
|
||||
character.backbag = backbag
|
||||
|
||||
if(character.dna)
|
||||
var/datum/species/chosen_species
|
||||
|
||||
character.dna.real_name = character.real_name
|
||||
if(pref_species != /datum/species/human && config.mutant_races)
|
||||
chosen_species = pref_species.type
|
||||
else
|
||||
chosen_species = /datum/species/human
|
||||
hardset_dna(character, null, null, null, blood_type, chosen_species, features)
|
||||
character.dna.blood_type = blood_type
|
||||
character.dna.features = features
|
||||
character.dna.real_name = character.real_name
|
||||
var/datum/species/chosen_species
|
||||
if(pref_species != /datum/species/human && config.mutant_races)
|
||||
chosen_species = pref_species.type
|
||||
else
|
||||
chosen_species = /datum/species/human
|
||||
character.set_species(chosen_species, icon_update=0)
|
||||
|
||||
if(icon_updates)
|
||||
character.update_body()
|
||||
character.update_hair()
|
||||
character.update_hair()
|
||||
character.update_mutcolor()
|
||||
@@ -52,21 +52,19 @@
|
||||
if(isnull(M.key)) return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!istype(H.dna, /datum/dna))
|
||||
return 0
|
||||
if(H.gloves)
|
||||
if(fingerprintslast != H.ckey)
|
||||
fingerprintshidden += text("\[[time_stamp()]\] (Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
|
||||
fingerprintshidden += "\[[time_stamp()]\] (Wearing gloves). Real name: [H.real_name], Key: [H.key]"
|
||||
fingerprintslast = H.ckey
|
||||
return 0
|
||||
if(!( fingerprints ))
|
||||
if(!fingerprints)
|
||||
if(fingerprintslast != H.ckey)
|
||||
fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",H.real_name, H.key)
|
||||
fingerprintshidden += "\[[time_stamp()]\] Real name: [H.real_name], Key: [H.key]"
|
||||
fingerprintslast = H.ckey
|
||||
return 1
|
||||
else
|
||||
if(fingerprintslast != M.ckey)
|
||||
fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",M.real_name, M.key)
|
||||
fingerprintshidden += "\[[time_stamp()]\] Real name: [M.real_name], Key: [M.key]"
|
||||
fingerprintslast = M.ckey
|
||||
return
|
||||
|
||||
@@ -75,17 +73,15 @@
|
||||
if(isnull(M)) return
|
||||
if(isnull(M.key)) return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
//Add the list if it does not exist.
|
||||
if(!fingerprintshidden)
|
||||
fingerprintshidden = list()
|
||||
|
||||
//Fibers~
|
||||
add_fibers(M)
|
||||
add_fibers(H)
|
||||
|
||||
//Now, lets get to the dirty work.
|
||||
//First, make sure their DNA makes sense.
|
||||
var/mob/living/carbon/human/H = M
|
||||
check_dna_integrity(H) //sets up dna and its variables if it was missing somehow
|
||||
|
||||
//Check if the gloves (if any) hide fingerprints
|
||||
if(H.gloves)
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
if(ishuman(A))
|
||||
|
||||
var/mob/living/carbon/human/H = A
|
||||
if (istype(H.dna, /datum/dna) && !H.gloves)
|
||||
if(!H.gloves)
|
||||
fingerprints += md5(H.dna.uni_identity)
|
||||
|
||||
else if(!ismob(A))
|
||||
|
||||
@@ -11,11 +11,10 @@
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
var/obj/item/weapon/storage/backpack/b = locate() in H.contents
|
||||
new /obj/item/weapon/storage/spooky(b)
|
||||
if(H.dna)
|
||||
if(prob(50))
|
||||
hardset_dna(H, null, null, null, null, /datum/species/skeleton)
|
||||
else
|
||||
hardset_dna(H, null, null, null, null, /datum/species/zombie)
|
||||
if(prob(50))
|
||||
H.set_species(/datum/species/skeleton)
|
||||
else
|
||||
H.set_species(/datum/species/zombie)
|
||||
|
||||
for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in mob_list)
|
||||
Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian))
|
||||
|
||||
@@ -43,10 +43,9 @@
|
||||
if(prob(25))
|
||||
if(prob(75))
|
||||
randmutb(H)
|
||||
domutcheck(H, null, 1)
|
||||
else
|
||||
randmutg(H)
|
||||
domutcheck(H, null, 1)
|
||||
H.domutcheck()
|
||||
|
||||
else if(istype(C, /mob/living/carbon/monkey))
|
||||
var/mob/living/carbon/monkey/M = C
|
||||
|
||||
@@ -17,13 +17,11 @@
|
||||
PoolOrNew(/obj/effect/effect/smoke, W.loc)
|
||||
|
||||
var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc)
|
||||
I.real_name = W.real_name
|
||||
I.dna.unique_enzymes = W.dna.unique_enzymes
|
||||
I.name = W.real_name
|
||||
I.dna.blood_type = W.dna.blood_type
|
||||
I.dna.uni_identity = W.dna.uni_identity
|
||||
I.dna.struc_enzymes = W.dna.struc_enzymes
|
||||
updateappearance(I)
|
||||
W.dna.transfer_identity(I, transfer_SE=1)
|
||||
I.real_name = I.dna.real_name
|
||||
I.name = I.dna.real_name
|
||||
I.updateappearance(mutcolor_update=1)
|
||||
I.domutcheck()
|
||||
if(W.ears) I.equip_to_slot_or_del(new W.ears.type, slot_ears)
|
||||
if(W.w_uniform) I.equip_to_slot_or_del(new W.w_uniform.type , slot_w_uniform)
|
||||
if(W.shoes) I.equip_to_slot_or_del(new W.shoes.type, slot_shoes)
|
||||
|
||||
@@ -21,10 +21,9 @@
|
||||
all_the_same = 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in mob_list) //yes, even the dead
|
||||
if(H.dna)
|
||||
hardset_dna(H, null, null, null, null, new_species)
|
||||
H.real_name = new_species.random_name(H.gender,1)
|
||||
H.regenerate_icons()
|
||||
H << "<span class='notice'>You feel somehow... different?</span>"
|
||||
H.set_species(new_species)
|
||||
H.real_name = new_species.random_name(H.gender,1)
|
||||
H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
|
||||
H << "<span class='notice'>You feel somehow... different?</span>"
|
||||
if(!all_the_same)
|
||||
new_species = pick(all_species)
|
||||
|
||||
@@ -112,8 +112,8 @@
|
||||
for(var/datum/disease/D in O.viruses)
|
||||
if(!(D.spread_flags & SPECIAL))
|
||||
B.data["viruses"] += D.Copy()
|
||||
if(check_dna_integrity(O))
|
||||
B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0)
|
||||
if(O.has_dna())
|
||||
B.data["blood_DNA"] = O.dna.unique_enzymes
|
||||
|
||||
if(O.resistances&&O.resistances.len)
|
||||
B.data["resistances"] = O.resistances.Copy()
|
||||
|
||||
@@ -897,7 +897,7 @@
|
||||
podman.faction |= factions
|
||||
if(!features["mcolor"])
|
||||
features["mcolor"] = "#59CE00"
|
||||
hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
|
||||
podman.hardset_dna(null,null,podman.real_name,blood_type,/datum/species/plant/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
|
||||
podman.set_cloned_appearance()
|
||||
|
||||
else //else, one packet of seeds. maybe two
|
||||
|
||||
@@ -86,22 +86,14 @@
|
||||
|
||||
/mob/living/carbon/human/interactive/proc/random()
|
||||
//this is here because this has no client/prefs/brain whatever.
|
||||
underwear = random_underwear(gender)
|
||||
skin_tone = random_skin_tone()
|
||||
hair_style = random_hair_style(gender)
|
||||
facial_hair_style = random_facial_hair_style(gender)
|
||||
hair_color = random_short_color()
|
||||
facial_hair_color = hair_color
|
||||
eye_color = "blue"
|
||||
age = rand(AGE_MIN,AGE_MAX)
|
||||
ready_dna(src,random_blood_type())
|
||||
//job handling
|
||||
var/list/jobs = SSjob.occupations
|
||||
for(var/datum/job/J in jobs)
|
||||
if(J.title == "Cyborg" || J.title == "AI" || J.title == "Chaplain" || J.title == "Mime")
|
||||
jobs -= J
|
||||
myjob = pick(jobs)
|
||||
src.job = myjob.title
|
||||
job = myjob.title
|
||||
if(!graytide)
|
||||
myjob.equip(src)
|
||||
myjob.apply_fingerprints(src)
|
||||
@@ -120,25 +112,18 @@
|
||||
|
||||
/mob/living/carbon/human/interactive/New()
|
||||
..()
|
||||
gender = pick(MALE,FEMALE)
|
||||
if(gender == MALE)
|
||||
name = "[pick(first_names_male)] [pick(last_names)]"
|
||||
real_name = name
|
||||
else
|
||||
name = "[pick(first_names_female)] [pick(last_names)]"
|
||||
real_name = name
|
||||
random()
|
||||
MYID = new(src)
|
||||
MYID.name = "[src.real_name]'s ID Card ([myjob.title])"
|
||||
MYID.assignment = "[myjob.title]"
|
||||
MYID.registered_name = src.real_name
|
||||
MYID.access = myjob.access
|
||||
src.equip_to_slot_or_del(MYID, slot_wear_id)
|
||||
equip_to_slot_or_del(MYID, slot_wear_id)
|
||||
MYPDA = new(src)
|
||||
MYPDA.owner = src.real_name
|
||||
MYPDA.owner = real_name
|
||||
MYPDA.ownjob = "Crew"
|
||||
MYPDA.name = "PDA-[src.real_name] ([myjob.title])"
|
||||
src.equip_to_slot_or_del(MYPDA, slot_belt)
|
||||
MYPDA.name = "PDA-[real_name] ([myjob.title])"
|
||||
equip_to_slot_or_del(MYPDA, slot_belt)
|
||||
zone_sel = new /obj/screen/zone_sel()
|
||||
zone_sel.selecting = "chest"
|
||||
if(prob(10)) //my x is augmented
|
||||
@@ -371,9 +356,7 @@
|
||||
if(!l_hand || !r_hand)
|
||||
var/obj/item/clothing/C = TARGET
|
||||
take_to_slot(C)
|
||||
if(equip_to_appropriate_slot(C))
|
||||
C.update_icon()
|
||||
else
|
||||
if(!equip_to_appropriate_slot(C))
|
||||
var/obj/item/I = get_item_by_slot(C)
|
||||
unEquip(I)
|
||||
equip_to_appropriate_slot(C)
|
||||
@@ -384,7 +367,6 @@
|
||||
equip_to_appropriate_slot(MYPDA)
|
||||
if(MYID in src.loc)
|
||||
equip_to_appropriate_slot(MYID)
|
||||
update_icons()
|
||||
//THIEVING SKILLS END
|
||||
//-------------TOUCH ME
|
||||
if(istype(TARGET,/obj/structure))
|
||||
|
||||
@@ -31,11 +31,23 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction)
|
||||
|
||||
|
||||
/mob/living/proc/phaseout(obj/effect/decal/cleanable/B)
|
||||
if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
if(C.l_hand || C.r_hand)
|
||||
C << "<span class='warning'>You may not hold items while blood crawling!</span>"
|
||||
return 0
|
||||
var/obj/item/weapon/bloodcrawl/B1 = new(C)
|
||||
var/obj/item/weapon/bloodcrawl/B2 = new(C)
|
||||
B1.icon_state = "bloodhand_left"
|
||||
B2.icon_state = "bloodhand_right"
|
||||
C.put_in_hands(B1)
|
||||
C.put_in_hands(B2)
|
||||
C.regenerate_icons()
|
||||
var/mob/living/kidnapped = null
|
||||
var/turf/mobloc = get_turf(src.loc)
|
||||
src.notransform = TRUE
|
||||
spawn(0)
|
||||
src.visible_message("[src] sinks into the pool of blood.")
|
||||
src.visible_message("<span class='warning'>[src] sinks into the pool of blood!</span>")
|
||||
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
|
||||
var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
|
||||
src.ExtinguishMob()
|
||||
@@ -45,42 +57,71 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction)
|
||||
if(istype(src.pulling, /mob/living))
|
||||
var/mob/living/victim = src.pulling
|
||||
if(victim.stat == CONSCIOUS)
|
||||
src.visible_message("[victim] kicks free of the [src] at the last second!")
|
||||
src.visible_message("<span class='warning'>[victim] kicks free of the blood pool just before entering it!</span>")
|
||||
else
|
||||
victim.loc = holder
|
||||
src.visible_message("<span class='warning'><B>The [src] drags [victim] into the pool of blood!</B>")
|
||||
victim.emote("scream")
|
||||
src.visible_message("<span class='warning'><b>[src] drags [victim] into the pool of blood!</b></span>")
|
||||
kidnapped = victim
|
||||
src.loc = holder
|
||||
src.holder = holder
|
||||
if(kidnapped)
|
||||
src << "<B>You begin to feast on [kidnapped]. You can not move while you are doing this.</B>"
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
src << "<span class='danger'>You begin to feast on [kidnapped]. You can not move while you are doing this.</span>"
|
||||
for(var/i = 3; i > 0; i--)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
if(kidnapped)
|
||||
src << "<B>You devour [kidnapped]. Your health is fully restored.</B>"
|
||||
src << "<span class='danger'>You devour [kidnapped]. Your health is fully restored.</span>"
|
||||
src.adjustBruteLoss(-1000)
|
||||
src.adjustFireLoss(-1000)
|
||||
src.adjustOxyLoss(-1000)
|
||||
src.adjustToxLoss(-1000)
|
||||
kidnapped.ghostize()
|
||||
qdel(kidnapped)
|
||||
if(istype(src, /mob/living/simple_animal/slaughter))
|
||||
var/mob/living/simple_animal/slaughter/S = src
|
||||
kidnapped << "<span class='userdanger'>You feel teeth sink into your flesh, and the--</span>"
|
||||
kidnapped.adjustBruteLoss(1000)
|
||||
kidnapped.loc = src
|
||||
S.consumed_mobs.Add(kidnapped)
|
||||
else
|
||||
kidnapped.ghostize()
|
||||
qdel(kidnapped)
|
||||
else
|
||||
src << "<B>You happily devour...nothing? Your meal vanished at some point!</B>"
|
||||
src << "<span class='danger'>You happily devour... nothing? Your meal vanished at some point!</span>"
|
||||
src.notransform = 0
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/bloodcrawl
|
||||
name = "blood crawl"
|
||||
desc = "You are unable to hold anything while in this form."
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
flags = NODROP
|
||||
|
||||
/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
|
||||
if(src.notransform)
|
||||
src << "<B>Finish eating first!</B>"
|
||||
src << "<span class='warning'>Finish eating first!</span>"
|
||||
return 0
|
||||
|
||||
B.visible_message("<span class='warning'>[B] starts to bubble...</span>")
|
||||
if(!do_after(src, 20, target = B))
|
||||
return
|
||||
if(!B)
|
||||
return
|
||||
src.loc = B.loc
|
||||
src.client.eye = src
|
||||
src.visible_message("<span class='warning'><B>The [src] rises out of the pool of blood!</B>")
|
||||
src.visible_message("<span class='warning'><B>[src] rises out of the pool of blood!</B>")
|
||||
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
|
||||
if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
for(var/obj/item/weapon/bloodcrawl/BC in C)
|
||||
C.flags = null
|
||||
C.unEquip(BC)
|
||||
qdel(BC)
|
||||
var/oldcolor = src.color
|
||||
if(istype(B, /obj/effect/decal/cleanable/xenoblood)) //Makes the mob have the color of the blood pool it came out of for a few seconds
|
||||
src.color = rgb(43, 186, 0)
|
||||
else
|
||||
src.color = rgb(149, 10, 10)
|
||||
qdel(src.holder)
|
||||
src.holder = null
|
||||
return 1
|
||||
spawn(30)
|
||||
src.color = oldcolor
|
||||
return 1
|
||||
|
||||
@@ -85,15 +85,18 @@
|
||||
update_icon()
|
||||
name = "Man-Machine Interface"
|
||||
|
||||
/obj/item/device/mmi/proc/transfer_identity(mob/living/carbon/human/H) //Same deal as the regular brain proc. Used for human-->robot people.
|
||||
/obj/item/device/mmi/proc/transfer_identity(mob/living/L) //Same deal as the regular brain proc. Used for human-->robot people.
|
||||
brainmob = new(src)
|
||||
brainmob.name = H.real_name
|
||||
brainmob.real_name = H.real_name
|
||||
if(check_dna_integrity(H))
|
||||
brainmob.dna = H.dna
|
||||
brainmob.name = L.real_name
|
||||
brainmob.real_name = L.real_name
|
||||
if(L.has_dna())
|
||||
var/mob/living/carbon/C = L
|
||||
brainmob.dna = C.dna
|
||||
brainmob.dna.holder = brainmob
|
||||
brainmob.container = src
|
||||
|
||||
if(istype(H))
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
var/obj/item/organ/internal/brain/newbrain = H.getorgan(/obj/item/organ/internal/brain)
|
||||
newbrain.loc = src
|
||||
brain = newbrain
|
||||
|
||||
@@ -26,10 +26,10 @@
|
||||
|
||||
qdel(brainmob)
|
||||
|
||||
//Update the body's icon so it doesnt appear debrained anymore
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.update_hair(0)
|
||||
//Update the body's icon so it doesnt appear debrained anymore
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.update_hair(0)
|
||||
|
||||
/obj/item/organ/internal/brain/Remove(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
@@ -56,9 +56,10 @@
|
||||
brainmob.name = L.real_name
|
||||
brainmob.real_name = L.real_name
|
||||
brainmob.timeofhostdeath = L.timeofdeath
|
||||
if(iscarbon(L))
|
||||
if(L.has_dna())
|
||||
var/mob/living/carbon/C = L
|
||||
brainmob.dna = C.dna
|
||||
brainmob.dna.holder = brainmob
|
||||
if(L.mind)
|
||||
L.mind.transfer_to(brainmob)
|
||||
brainmob << "<span class='notice'>You feel slightly disoriented. That's normal when you're just a brain.</span>"
|
||||
|
||||
@@ -55,17 +55,20 @@ var/global/posibrain_notif_cooldown = 0
|
||||
return
|
||||
transfer_personality(user)
|
||||
|
||||
/obj/item/device/mmi/posibrain/transfer_identity(mob/living/carbon/H)
|
||||
name = "positronic brain ([H])"
|
||||
brainmob.name = H.real_name
|
||||
brainmob.real_name = H.real_name
|
||||
brainmob.dna = H.dna
|
||||
brainmob.timeofhostdeath = H.timeofdeath
|
||||
/obj/item/device/mmi/posibrain/transfer_identity(mob/living/carbon/C)
|
||||
name = "positronic brain ([C])"
|
||||
brainmob.name = C.real_name
|
||||
brainmob.real_name = C.real_name
|
||||
brainmob.dna = C.dna
|
||||
if(C.has_dna())
|
||||
brainmob.dna = C.dna
|
||||
brainmob.dna.holder = brainmob
|
||||
brainmob.timeofhostdeath = C.timeofdeath
|
||||
brainmob.stat = 0
|
||||
if(brainmob.mind)
|
||||
brainmob.mind.assigned_role = "Positronic Brain"
|
||||
if(H.mind)
|
||||
H.mind.transfer_to(brainmob)
|
||||
if(C.mind)
|
||||
C.mind.transfer_to(brainmob)
|
||||
|
||||
brainmob.mind.remove_all_antag()
|
||||
brainmob.mind.wipe_memory()
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
for(var/atom/movable/food in stomach_contents)
|
||||
qdel(food)
|
||||
remove_from_all_data_huds()
|
||||
if(dna)
|
||||
qdel(dna)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/Move(NewLoc, direct)
|
||||
|
||||
@@ -9,9 +9,6 @@
|
||||
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
|
||||
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
|
||||
|
||||
var/list/features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
|
||||
|
||||
|
||||
//inventory slots
|
||||
var/obj/item/back = null
|
||||
var/obj/item/clothing/mask/wear_mask = null
|
||||
|
||||
@@ -272,10 +272,9 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
source = M.get_blood(M.vessel)
|
||||
else if(istype(source,/mob/living/carbon/monkey))
|
||||
var/mob/living/carbon/monkey/donor = source
|
||||
if(donor.dna)
|
||||
source = new()
|
||||
source.data["blood_DNA"] = donor.dna.unique_enzymes
|
||||
source.data["blood_type"] = donor.dna.blood_type
|
||||
source = new()
|
||||
source.data["blood_DNA"] = donor.dna.unique_enzymes
|
||||
source.data["blood_type"] = donor.dna.blood_type
|
||||
|
||||
// Are we dripping or splattering?
|
||||
var/list/drips = list()
|
||||
|
||||
@@ -8,10 +8,7 @@
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/spawn_gibs()
|
||||
if(dna)
|
||||
hgibs(loc, viruses, dna)
|
||||
else
|
||||
hgibs(loc, viruses, null)
|
||||
hgibs(loc, viruses, dna)
|
||||
|
||||
/mob/living/carbon/human/spawn_dust()
|
||||
new /obj/effect/decal/remains/human(loc)
|
||||
@@ -35,8 +32,7 @@
|
||||
update_canmove()
|
||||
if(client) blind.layer = 0
|
||||
|
||||
if(dna)
|
||||
dna.species.spec_death(gibbed,src)
|
||||
dna.species.spec_death(gibbed,src)
|
||||
|
||||
tod = worldtime2text() //weasellos time of death patch
|
||||
if(mind) mind.store_memory("Time of death: [tod]", 0)
|
||||
@@ -47,9 +43,8 @@
|
||||
return ..(gibbed)
|
||||
|
||||
/mob/living/carbon/human/proc/makeSkeleton()
|
||||
if(!check_dna_integrity(src)) return
|
||||
status_flags |= DISFIGURED
|
||||
hardset_dna(src, null, null, null, null, /datum/species/skeleton)
|
||||
set_species(/datum/species/skeleton)
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/proc/ChangeToHusk()
|
||||
|
||||
@@ -308,7 +308,7 @@
|
||||
m_type = 2
|
||||
|
||||
if("wag","wags")
|
||||
if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || (features["tail_human"] != "None")))
|
||||
if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || (dna.features["tail_human"] != "None")))
|
||||
message = "<B>[src]</B> wags \his tail."
|
||||
startTailWag()
|
||||
else
|
||||
|
||||
@@ -16,6 +16,12 @@
|
||||
/mob/living/carbon/human/New()
|
||||
verbs += /mob/living/proc/mob_sleep
|
||||
verbs += /mob/living/proc/lay_down
|
||||
|
||||
//initialize dna. for spawned humans; overwritten by other code
|
||||
create_dna(src)
|
||||
randomize_human(src)
|
||||
dna.initialize_dna()
|
||||
|
||||
//initialise organs
|
||||
organs = newlist(/obj/item/organ/limb/chest, /obj/item/organ/limb/head, /obj/item/organ/limb/l_arm,
|
||||
/obj/item/organ/limb/r_arm, /obj/item/organ/limb/r_leg, /obj/item/organ/limb/l_leg)
|
||||
@@ -28,11 +34,6 @@
|
||||
for(var/obj/item/organ/internal/I in internal_organs)
|
||||
I.Insert(src)
|
||||
|
||||
// for spawned humans; overwritten by other code
|
||||
create_dna(src)
|
||||
randomize_human(src)
|
||||
ready_dna(src)
|
||||
|
||||
make_blood()
|
||||
|
||||
..()
|
||||
@@ -90,9 +91,8 @@
|
||||
stat("Energy Charge:", "[round(SN.cell.charge/100)]%")
|
||||
stat("Smoke Bombs:", "\Roman [SN.s_bombs]")
|
||||
//Ninja status
|
||||
if(dna)
|
||||
stat("Fingerprints:", "[md5(dna.uni_identity)]")
|
||||
stat("Unique Identity:", "[dna.unique_enzymes]")
|
||||
stat("Fingerprints:", "[md5(dna.uni_identity)]")
|
||||
stat("Unique Identity:", "[dna.unique_enzymes]")
|
||||
stat("Overall Status:", "[stat > 1 ? "dead" : "[health]% healthy"]")
|
||||
stat("Nutrition Status:", "[nutrition]")
|
||||
stat("Oxygen Loss:", "[getOxyLoss()]")
|
||||
@@ -663,7 +663,8 @@
|
||||
facial_hair_style = "Shaved"
|
||||
hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
|
||||
underwear = "Nude"
|
||||
regenerate_icons()
|
||||
update_body()
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/singularity_act()
|
||||
var/gain = 20
|
||||
|
||||
@@ -7,11 +7,7 @@
|
||||
/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M)
|
||||
if(..()) //to allow surgery to return properly.
|
||||
return
|
||||
|
||||
if(dna)
|
||||
dna.species.spec_attack_hand(M, src)
|
||||
|
||||
return
|
||||
dna.species.spec_attack_hand(M, src)
|
||||
|
||||
/mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params)
|
||||
return
|
||||
@@ -160,38 +160,5 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = 0)
|
||||
if(dna) // if you have a species, it will run the apply_damage code there instead
|
||||
dna.species.apply_damage(damage, damagetype, def_zone, blocked, src)
|
||||
else
|
||||
if((damagetype != BRUTE) && (damagetype != BURN))
|
||||
..(damage, damagetype, def_zone, blocked)
|
||||
return 1
|
||||
|
||||
else
|
||||
blocked = (100-blocked)/100
|
||||
if(blocked <= 0) return 0
|
||||
|
||||
var/obj/item/organ/limb/organ = null
|
||||
if(islimb(def_zone))
|
||||
organ = def_zone
|
||||
else
|
||||
if(!def_zone) def_zone = ran_zone(def_zone)
|
||||
organ = get_organ(check_zone(def_zone))
|
||||
if(!organ) return 0
|
||||
|
||||
damage = (damage * blocked)
|
||||
|
||||
switch(damagetype)
|
||||
if(BRUTE)
|
||||
damageoverlaytemp = 20
|
||||
if(organ.take_damage(damage, 0))
|
||||
update_damage_overlays(0)
|
||||
if(BURN)
|
||||
damageoverlaytemp = 20
|
||||
if(organ.take_damage(0, damage))
|
||||
update_damage_overlays(0)
|
||||
|
||||
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
|
||||
|
||||
updatehealth()
|
||||
return 1
|
||||
// depending on the species, it will run the corresponding apply_damage code there
|
||||
return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src)
|
||||
|
||||
@@ -37,9 +37,7 @@ emp_act
|
||||
return protection
|
||||
|
||||
/mob/living/carbon/human/on_hit(proj_type)
|
||||
if(dna)
|
||||
dna.species.on_hit(proj_type, src)
|
||||
return
|
||||
dna.species.on_hit(proj_type, src)
|
||||
|
||||
/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone)
|
||||
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
|
||||
@@ -128,91 +126,8 @@ emp_act
|
||||
feedback_add_details("item_used_for_combat","[I.type]|[I.force]")
|
||||
feedback_add_details("zone_targeted","[target_area]")
|
||||
|
||||
if(dna) // allows your species to affect the attacked_by code
|
||||
return dna.species.spec_attacked_by(I,user,def_zone,affecting,hit_area,src.a_intent,target_limb,target_area,src)
|
||||
|
||||
else
|
||||
if(user != src)
|
||||
user.do_attack_animation(src)
|
||||
if(check_shields(I.force, "the [I.name]", I))
|
||||
return 0
|
||||
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
visible_message("<span class='danger'>[user] has [pick(I.attack_verb)] [src] in the [hit_area] with [I]!</span>", \
|
||||
"<span class='userdanger'>[user] has [pick(I.attack_verb)] [src] in the [hit_area] with [I]!</span>")
|
||||
else if(I.force)
|
||||
visible_message("<span class='danger'>[user] has attacked [src] in the [hit_area] with [I]!</span>", \
|
||||
"<span class='userdanger'>[user] has attacked [src] in the [hit_area] with [I]!</span>")
|
||||
else
|
||||
return 0
|
||||
|
||||
var/armor = run_armor_check(affecting, "melee", "<span class='notice'>Your armor has protected your [hit_area].</span>", "<span class='notice'>Your armor has softened a hit to your [hit_area].</span>", I.armour_penetration)
|
||||
armor = min(90,armor) //cap damage reduction at 90%
|
||||
|
||||
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
|
||||
|
||||
apply_damage(I.force, I.damtype, affecting, armor , I)
|
||||
var/bloody = 0
|
||||
if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2))))
|
||||
if(affecting.status == ORGAN_ORGANIC)
|
||||
I.add_blood(src) //Make the weapon bloody, not the person.
|
||||
if(prob(I.force * 2)) //blood spatter!
|
||||
bloody = 1
|
||||
var/turf/location = loc
|
||||
if(istype(location, /turf/simulated))
|
||||
location.add_blood(src)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood
|
||||
if(H.wear_suit)
|
||||
H.wear_suit.add_blood(src)
|
||||
H.update_inv_wear_suit() //updates mob overlays to show the new blood (no refresh)
|
||||
else if(H.w_uniform)
|
||||
H.w_uniform.add_blood(src)
|
||||
H.update_inv_w_uniform() //updates mob overlays to show the new blood (no refresh)
|
||||
if (H.gloves)
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
G.add_blood(H)
|
||||
else
|
||||
H.add_blood(H)
|
||||
H.update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves
|
||||
|
||||
switch(hit_area)
|
||||
if("head") //Harder to score a stun but if you do it lasts a bit longer
|
||||
if(stat == CONSCIOUS)
|
||||
if(prob(I.force))
|
||||
visible_message("<span class='danger'>[src] has been knocked unconscious!</span>", \
|
||||
"<span class='userdanger'>[src] has been knocked unconscious!</span>")
|
||||
apply_effect(20, PARALYZE, armor)
|
||||
if(prob(I.force + min(100,100 - src.health)) && src != user && I.damtype == BRUTE)
|
||||
ticker.mode.remove_revolutionary(mind)
|
||||
if(bloody) //Apply blood
|
||||
if(wear_mask)
|
||||
wear_mask.add_blood(src)
|
||||
update_inv_wear_mask()
|
||||
if(head)
|
||||
head.add_blood(src)
|
||||
update_inv_head()
|
||||
if(glasses && prob(33))
|
||||
glasses.add_blood(src)
|
||||
update_inv_glasses()
|
||||
|
||||
if("chest") //Easier to score a stun but lasts less time
|
||||
if(stat == CONSCIOUS && I.force && prob(I.force + 10))
|
||||
visible_message("<span class='danger'>[src] has been knocked down!</span>", \
|
||||
"<span class='userdanger'>[src] has been knocked down!</span>")
|
||||
apply_effect(5, WEAKEN, armor)
|
||||
|
||||
if(bloody)
|
||||
if(wear_suit)
|
||||
wear_suit.add_blood(src)
|
||||
update_inv_wear_suit()
|
||||
if(w_uniform)
|
||||
w_uniform.add_blood(src)
|
||||
update_inv_w_uniform()
|
||||
|
||||
if(Iforce > 10 || Iforce >= 5 && prob(33))
|
||||
forcesay(hit_appends) //forcesay checks stat already
|
||||
// the attacked_by code varies among species
|
||||
return dna.species.spec_attacked_by(I,user,def_zone,affecting,hit_area,src.a_intent,target_limb,target_area,src)
|
||||
|
||||
/mob/living/carbon/human/emp_act(severity)
|
||||
var/informed = 0
|
||||
|
||||
@@ -128,11 +128,9 @@
|
||||
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
|
||||
|
||||
/mob/living/carbon/human/reagent_check(datum/reagent/R)
|
||||
if(dna)
|
||||
var/bypass = dna.species.handle_chemicals(R,src)
|
||||
return bypass // if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species.
|
||||
else
|
||||
return 0
|
||||
return dna.species.handle_chemicals(R,src)
|
||||
// if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species.
|
||||
|
||||
|
||||
/mob/living/carbon/human/can_track(mob/living/user)
|
||||
if(wear_id && istype(wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/carbon/human/movement_delay()
|
||||
if(dna)
|
||||
. += dna.species.movement_delay(src)
|
||||
|
||||
. += dna.species.movement_delay(src)
|
||||
|
||||
. += ..()
|
||||
. += config.human_delay
|
||||
@@ -46,9 +46,8 @@
|
||||
|
||||
/mob/living/carbon/human/Move(NewLoc, direct)
|
||||
. = ..()
|
||||
if(dna)
|
||||
for(var/datum/mutation/human/HM in dna.mutations)
|
||||
HM.on_move(src, NewLoc)
|
||||
for(var/datum/mutation/human/HM in dna.mutations)
|
||||
HM.on_move(src, NewLoc)
|
||||
if(shoes)
|
||||
if(!lying)
|
||||
if(loc == NewLoc)
|
||||
|
||||
@@ -1,158 +1,5 @@
|
||||
/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0)
|
||||
if(dna)
|
||||
return dna.species.can_equip(I, slot, disable_warning, src)
|
||||
else
|
||||
switch(slot)
|
||||
if(slot_l_hand)
|
||||
if(l_hand)
|
||||
return 0
|
||||
return 1
|
||||
if(slot_r_hand)
|
||||
if(r_hand)
|
||||
return 0
|
||||
return 1
|
||||
if(slot_wear_mask)
|
||||
if(wear_mask)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_MASK) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_back)
|
||||
if(back)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_BACK) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_wear_suit)
|
||||
if(wear_suit)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_OCLOTHING) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_gloves)
|
||||
if(gloves)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_GLOVES) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_shoes)
|
||||
if(shoes)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_FEET) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_belt)
|
||||
if(belt)
|
||||
return 0
|
||||
if(!w_uniform)
|
||||
if(!disable_warning)
|
||||
src << "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>"
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_BELT) )
|
||||
return
|
||||
return 1
|
||||
if(slot_glasses)
|
||||
if(glasses)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_EYES) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_head)
|
||||
if(head)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_HEAD) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_ears)
|
||||
if(ears)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_EARS) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_w_uniform)
|
||||
if(w_uniform)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_ICLOTHING) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_wear_id)
|
||||
if(wear_id)
|
||||
return 0
|
||||
if(!w_uniform)
|
||||
if(!disable_warning)
|
||||
src << "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>"
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_ID) )
|
||||
return 0
|
||||
return 1
|
||||
if(slot_l_store)
|
||||
if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them.
|
||||
return 0
|
||||
if(l_store)
|
||||
return 0
|
||||
if(!w_uniform)
|
||||
if(!disable_warning)
|
||||
src << "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>"
|
||||
return 0
|
||||
if(I.slot_flags & SLOT_DENYPOCKET)
|
||||
return
|
||||
if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) )
|
||||
return 1
|
||||
if(slot_r_store)
|
||||
if(I.flags & NODROP)
|
||||
return 0
|
||||
if(r_store)
|
||||
return 0
|
||||
if(!w_uniform)
|
||||
if(!disable_warning)
|
||||
src << "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>"
|
||||
return 0
|
||||
if(I.slot_flags & SLOT_DENYPOCKET)
|
||||
return 0
|
||||
if( I.w_class <= 2 || (I.slot_flags & SLOT_POCKET) )
|
||||
return 1
|
||||
return 0
|
||||
if(slot_s_store)
|
||||
if(I.flags & NODROP) //Suit storage NODROP items drop if you take a suit off, this is to prevent people exploiting this.
|
||||
return 0
|
||||
if(s_store)
|
||||
return 0
|
||||
if(!wear_suit)
|
||||
if(!disable_warning)
|
||||
src << "<span class='warning'>You need a suit before you can attach this [I.name]!</span>"
|
||||
return 0
|
||||
if(!wear_suit.allowed)
|
||||
if(!disable_warning)
|
||||
usr << "<span class='warning'>You somehow have a suit with no defined allowed items for suit storage, stop that!</span>" //should be src?
|
||||
return 0
|
||||
if(I.w_class > 4)
|
||||
if(!disable_warning)
|
||||
usr << "<span class='warning'>The [I.name] is too big to attach!</span>" //should be src?
|
||||
return 0
|
||||
if( istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, wear_suit.allowed) ) //ugly and un-polymorphic.
|
||||
return 1
|
||||
return 0
|
||||
if(slot_handcuffed)
|
||||
if(handcuffed)
|
||||
return 0
|
||||
if(!istype(I, /obj/item/weapon/restraints/handcuffs))
|
||||
return 0
|
||||
return 1
|
||||
if(slot_legcuffed)
|
||||
if(legcuffed)
|
||||
return 0
|
||||
if(!istype(I, /obj/item/weapon/restraints/legcuffs))
|
||||
return 0
|
||||
return 1
|
||||
if(slot_in_backpack)
|
||||
if (back && istype(back, /obj/item/weapon/storage/backpack))
|
||||
var/obj/item/weapon/storage/backpack/B = back
|
||||
if(B.contents.len < B.storage_slots && I.w_class <= B.max_w_class)
|
||||
return 1
|
||||
return 0
|
||||
return 0 //Unsupported slot
|
||||
|
||||
|
||||
return dna.species.can_equip(I, slot, disable_warning, src)
|
||||
|
||||
/mob/living/carbon/human/verb/quick_equip()
|
||||
set name = "quick-equip"
|
||||
@@ -477,7 +324,7 @@
|
||||
|
||||
/mob/living/carbon/human/proc/equipOutfit(outfit)
|
||||
var/datum/outfit/O = null
|
||||
|
||||
|
||||
if(ispath(outfit))
|
||||
O = new outfit
|
||||
else
|
||||
@@ -486,5 +333,5 @@
|
||||
return 0
|
||||
if(!O)
|
||||
return 0
|
||||
|
||||
|
||||
return O.equip(src)
|
||||
@@ -38,9 +38,8 @@
|
||||
tinttotal = tintcheck() //here as both hud updates and status updates call it
|
||||
|
||||
if(..())
|
||||
if(dna)
|
||||
for(var/datum/mutation/human/HM in dna.mutations)
|
||||
HM.on_life(src)
|
||||
for(var/datum/mutation/human/HM in dna.mutations)
|
||||
HM.on_life(src)
|
||||
|
||||
//heart attack stuff
|
||||
handle_heart()
|
||||
@@ -50,8 +49,7 @@
|
||||
//Update our name based on whether our face is obscured/disfigured
|
||||
name = get_visible_name()
|
||||
|
||||
if(dna)
|
||||
dna.species.spec_life(src) // for mutantraces
|
||||
dna.species.spec_life(src) // for mutantraces
|
||||
|
||||
|
||||
/mob/living/carbon/human/calculate_affecting_pressure(pressure)
|
||||
@@ -98,16 +96,15 @@
|
||||
reagents.metabolize(src, can_overdose=1)
|
||||
|
||||
/mob/living/carbon/human/breathe()
|
||||
if(!dna || !dna.species.breathe(src))
|
||||
if(!dna.species.breathe(src))
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/check_breath(datum/gas_mixture/breath)
|
||||
if(!dna || !dna.species.check_breath(breath, src))
|
||||
if(!dna.species.check_breath(breath, src))
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment)
|
||||
if(dna)
|
||||
dna.species.handle_environment(environment, src)
|
||||
dna.species.handle_environment(environment, src)
|
||||
|
||||
///FIRE CODE
|
||||
/mob/living/carbon/human/handle_fire()
|
||||
@@ -263,10 +260,7 @@
|
||||
|
||||
/mob/living/carbon/human/handle_chemicals_in_body()
|
||||
..()
|
||||
if(dna)
|
||||
dna.species.handle_chemicals_in_body(src)
|
||||
|
||||
return //TODO: DEFERRED
|
||||
dna.species.handle_chemicals_in_body(src)
|
||||
|
||||
/mob/living/carbon/human/handle_vision()
|
||||
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
|
||||
@@ -275,12 +269,10 @@
|
||||
else
|
||||
if(!client.adminobs) reset_view(null)
|
||||
|
||||
if(dna)
|
||||
dna.species.handle_vision(src)
|
||||
dna.species.handle_vision(src)
|
||||
|
||||
/mob/living/carbon/human/handle_hud_icons()
|
||||
if(dna)
|
||||
dna.species.handle_hud_icons(src)
|
||||
dna.species.handle_hud_icons(src)
|
||||
|
||||
/mob/living/carbon/human/handle_random_events()
|
||||
// Puke if toxloss is too high
|
||||
|
||||
@@ -9,8 +9,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/treat_message(message)
|
||||
if(dna)
|
||||
message = dna.species.handle_speech(message,src)
|
||||
message = dna.species.handle_speech(message,src)
|
||||
if(viruses.len)
|
||||
for(var/datum/disease/pierrot_throat/D in viruses)
|
||||
var/list/temp_message = text2list(message, " ") //List each word in the message
|
||||
@@ -25,8 +24,7 @@
|
||||
pick_list -= H //Make sure that you dont HONK the same word twice
|
||||
message = list2text(temp_message, " ")
|
||||
message = ..(message)
|
||||
if(dna)
|
||||
message = dna.mutations_say_mods(message)
|
||||
message = dna.mutations_say_mods(message)
|
||||
return message
|
||||
|
||||
/mob/living/carbon/human/get_spans()
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
if(H.undershirt)
|
||||
var/datum/sprite_accessory/undershirt/U2 = undershirt_list[H.undershirt]
|
||||
if(U2)
|
||||
if(H.dna && H.dna.species.sexes && H.gender == FEMALE)
|
||||
if(H.dna.species.sexes && H.gender == FEMALE)
|
||||
standing += H.wear_female_version(U2.icon_state, U2.icon, BODY_LAYER)
|
||||
else
|
||||
standing += image("icon"=U2.icon, "icon_state"="[U2.icon_state]_s", "layer"=-BODY_LAYER)
|
||||
@@ -804,8 +804,8 @@
|
||||
if(prob(1))
|
||||
H << "<span class='danger'>You mutate!</span>"
|
||||
randmutb(H)
|
||||
domutcheck(H,null)
|
||||
H.emote("gasp")
|
||||
H.domutcheck()
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -907,22 +907,14 @@
|
||||
else
|
||||
M.do_attack_animation(H)
|
||||
|
||||
var/atk_verb = "punch"
|
||||
var/atk_verb = M.dna.species.attack_verb
|
||||
if(H.lying)
|
||||
atk_verb = "kick"
|
||||
else if(M.dna)
|
||||
atk_verb = M.dna.species.attack_verb
|
||||
|
||||
var/damage = rand(0, 9)
|
||||
if(M.dna)
|
||||
damage += M.dna.species.punchmod
|
||||
var/damage = rand(0, 9) + M.dna.species.punchmod
|
||||
|
||||
if(!damage)
|
||||
if(M.dna)
|
||||
playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1)
|
||||
else
|
||||
playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
|
||||
playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1)
|
||||
H.visible_message("<span class='warning'>[M] has attempted to [atk_verb] [H]!</span>")
|
||||
return 0
|
||||
|
||||
@@ -930,11 +922,7 @@
|
||||
var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting))
|
||||
var/armor_block = H.run_armor_check(affecting, "melee")
|
||||
|
||||
if(M.dna)
|
||||
playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1)
|
||||
else
|
||||
playsound(H.loc, 'sound/weapons/punch1.ogg', 25, 1, -1)
|
||||
|
||||
playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1)
|
||||
|
||||
H.visible_message("<span class='danger'>[M] has [atk_verb]ed [H]!</span>", \
|
||||
"<span class='userdanger'>[M] has [atk_verb]ed [H]!</span>")
|
||||
@@ -1008,9 +996,9 @@
|
||||
|
||||
/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, def_zone, obj/item/organ/limb/affecting, hit_area, intent, obj/item/organ/limb/target_limb, target_area, mob/living/carbon/human/H)
|
||||
// Allows you to put in item-specific reactions based on species
|
||||
if(user != src)
|
||||
if(user != H)
|
||||
user.do_attack_animation(H)
|
||||
if((user != H) && H.check_shields(I.force, "the [I.name]", I))
|
||||
if(H.check_shields(I.force, "the [I.name]", I))
|
||||
return 0
|
||||
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
@@ -1022,11 +1010,11 @@
|
||||
else
|
||||
return 0
|
||||
|
||||
var/armor = H.run_armor_check(affecting, "melee", "<span class='notice'>Your armor has protected your [hit_area].</span>", "<span class='notice'>Your armor has softened a hit to your [hit_area].</span>",I.armour_penetration)
|
||||
armor = min(90,armor) //cap damage reduction at 90%
|
||||
var/armor_block = H.run_armor_check(affecting, "melee", "<span class='notice'>Your armor has protected your [hit_area].</span>", "<span class='notice'>Your armor has softened a hit to your [hit_area].</span>",I.armour_penetration)
|
||||
armor_block = min(90,armor_block) //cap damage reduction at 90%
|
||||
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
|
||||
|
||||
apply_damage(I.force, I.damtype, affecting, armor, H)
|
||||
apply_damage(I.force, I.damtype, affecting, armor_block, H)
|
||||
|
||||
var/bloody = 0
|
||||
if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2))))
|
||||
@@ -1037,28 +1025,30 @@
|
||||
var/turf/location = H.loc
|
||||
if(istype(location, /turf/simulated))
|
||||
location.add_blood(H)
|
||||
if(get_dist(H, H) <= 1) //people with TK won't get smeared with blood
|
||||
if(H.wear_suit)
|
||||
H.wear_suit.add_blood(H)
|
||||
H.update_inv_wear_suit() //updates mob overlays to show the new blood (no refresh)
|
||||
else if(H.w_uniform)
|
||||
H.w_uniform.add_blood(H)
|
||||
H.update_inv_w_uniform() //updates mob overlays to show the new blood (no refresh)
|
||||
if (H.gloves)
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
G.add_blood(H)
|
||||
else
|
||||
H.add_blood(H)
|
||||
H.update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/M = user
|
||||
if(get_dist(M, H) <= 1) //people with TK won't get smeared with blood
|
||||
if(M.wear_suit)
|
||||
M.wear_suit.add_blood(H)
|
||||
M.update_inv_wear_suit() //updates mob overlays to show the new blood (no refresh)
|
||||
else if(M.w_uniform)
|
||||
M.w_uniform.add_blood(H)
|
||||
M.update_inv_w_uniform() //updates mob overlays to show the new blood (no refresh)
|
||||
if (M.gloves)
|
||||
var/obj/item/clothing/gloves/G = M.gloves
|
||||
G.add_blood(H)
|
||||
else
|
||||
M.add_blood(H)
|
||||
M.update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves
|
||||
|
||||
|
||||
switch(hit_area)
|
||||
if("head") //Harder to score a stun but if you do it lasts a bit longer
|
||||
if(H.stat == CONSCIOUS && armor < 50)
|
||||
if(H.stat == CONSCIOUS && armor_block < 50)
|
||||
if(prob(I.force))
|
||||
H.visible_message("<span class='danger'>[H] has been knocked unconscious!</span>", \
|
||||
"<span class='userdanger'>[H] has been knocked unconscious!</span>")
|
||||
H.apply_effect(20, PARALYZE, armor)
|
||||
H.apply_effect(20, PARALYZE, armor_block)
|
||||
if(prob(I.force + ((100 - H.health)/2)) && H != user && I.damtype == BRUTE)
|
||||
ticker.mode.remove_revolutionary(H.mind)
|
||||
|
||||
@@ -1077,7 +1067,7 @@
|
||||
if(H.stat == CONSCIOUS && I.force && prob(I.force + 10))
|
||||
H.visible_message("<span class='danger'>[H] has been knocked down!</span>", \
|
||||
"<span class='userdanger'>[H] has been knocked down!</span>")
|
||||
H.apply_effect(5, WEAKEN, armor)
|
||||
H.apply_effect(5, WEAKEN, armor_block)
|
||||
|
||||
if(bloody)
|
||||
if(H.wear_suit)
|
||||
@@ -1091,34 +1081,9 @@
|
||||
H.forcesay(hit_appends) //forcesay checks stat already.
|
||||
return
|
||||
|
||||
/datum/species/proc/attacked_by(obj/item/I, mob/living/user, def_zone, mob/living/carbon/human/H)
|
||||
H.apply_damage(I.force, I.damtype)
|
||||
if(I.damtype == "brute")
|
||||
if(prob(33) && I.force && !(NOBLOOD in specflags))
|
||||
var/turf/location = H.loc
|
||||
if(istype(location, /turf/simulated))
|
||||
location.add_blood_floor(H)
|
||||
|
||||
var/message_verb = ""
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
message_verb = "[pick(I.attack_verb)]"
|
||||
else if(I.force)
|
||||
message_verb = "attacked"
|
||||
|
||||
var/attack_message = "[H] has been [message_verb] with [I]."
|
||||
if(user)
|
||||
user.do_attack_animation(src)
|
||||
if(user in viewers(src, null))
|
||||
attack_message = "[user] has [message_verb] [H] with [I]!"
|
||||
if(message_verb)
|
||||
H.visible_message("<span class='danger'>[attack_message]</span>",
|
||||
"<span class='userdanger'>[attack_message]</span>")
|
||||
|
||||
return
|
||||
|
||||
/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H)
|
||||
blocked = (100-(blocked+armor))/100
|
||||
if(blocked <= 0) return 0
|
||||
if(!damage || blocked <= 0) return 0
|
||||
|
||||
var/obj/item/organ/limb/organ = null
|
||||
if(islimb(def_zone))
|
||||
@@ -1147,6 +1112,7 @@
|
||||
H.adjustCloneLoss(damage * blocked)
|
||||
if(STAMINA)
|
||||
H.adjustStaminaLoss(damage * blocked)
|
||||
return 1
|
||||
|
||||
/datum/species/proc/on_hit(obj/item/projectile/proj_type, mob/living/carbon/human/H)
|
||||
// called when hit by a projectile
|
||||
|
||||
@@ -38,8 +38,7 @@
|
||||
/datum/species/human/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
|
||||
if(chem.id == "mutationtoxin")
|
||||
H << "<span class='danger'>Your flesh rapidly mutates!</span>"
|
||||
hardset_dna(H, null, null, null, null, /datum/species/slime)
|
||||
H.regenerate_icons()
|
||||
H.set_species(/datum/species/slime)
|
||||
H.reagents.del_reagent(chem.type)
|
||||
H.faction |= "slime"
|
||||
return 1
|
||||
@@ -128,10 +127,9 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
|
||||
H.visible_message("<span class='warning'>[H] writhes in pain as \his vacuoles boil.</span>", "<span class='userdanger'>You writhe in pain as your vacuoles boil!</span>", "<span class='italics'>You hear the crunching of leaves.</span>")
|
||||
if(prob(80))
|
||||
randmutb(H)
|
||||
domutcheck(H,null)
|
||||
else
|
||||
randmutg(H)
|
||||
domutcheck(H,null)
|
||||
H.domutcheck()
|
||||
else
|
||||
H.adjustFireLoss(rand(5,15))
|
||||
H.show_message("<span class='userdanger'>The radiation beam singes you!</span>")
|
||||
|
||||
@@ -53,30 +53,10 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/proc/update_base_icon_state()
|
||||
if(dna)
|
||||
base_icon_state = dna.species.update_base_icon_state(src)
|
||||
else
|
||||
if(disabilities & HUSK)
|
||||
base_icon_state = "husk"
|
||||
else
|
||||
base_icon_state = "[skin_tone]_[(gender == FEMALE) ? "f" : "m"]"
|
||||
|
||||
base_icon_state = dna.species.update_base_icon_state(src)
|
||||
icon_state = "[base_icon_state]_s"
|
||||
|
||||
|
||||
//UPDATES OVERLAYS FROM OVERLAYS_STANDING
|
||||
//TODO: Remove all instances where this proc is called. It used to be the fastest way to swap between standing/lying.
|
||||
/mob/living/carbon/human/update_icons()
|
||||
update_hud() //TODO: remove the need for this
|
||||
|
||||
if(overlays.len != overlays_standing.len)
|
||||
overlays.Cut()
|
||||
|
||||
for(var/thing in overlays_standing)
|
||||
if(thing) overlays += thing
|
||||
|
||||
update_transform()
|
||||
|
||||
//DAMAGE OVERLAYS
|
||||
//constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists
|
||||
/mob/living/carbon/human/update_damage_overlays()
|
||||
@@ -105,25 +85,21 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
if((wear_suit) && (wear_suit.hooded) && (wear_suit.suittoggled == 1))
|
||||
return
|
||||
|
||||
if(dna)
|
||||
dna.species.handle_hair(src)
|
||||
dna.species.handle_hair(src)
|
||||
|
||||
/mob/living/carbon/human/proc/update_mutcolor()
|
||||
if(dna && !(disabilities & HUSK))
|
||||
if(!(disabilities & HUSK))
|
||||
dna.species.update_color(src)
|
||||
|
||||
//used when putting/removing clothes that hide certain mutant body parts to just update those and not update the whole body.
|
||||
/mob/living/carbon/human/proc/update_mutant_bodyparts()
|
||||
if(dna)
|
||||
dna.species.handle_mutant_bodyparts(src)
|
||||
dna.species.handle_mutant_bodyparts(src)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/update_body()
|
||||
remove_overlay(BODY_LAYER)
|
||||
|
||||
update_base_icon_state()
|
||||
|
||||
if(dna)
|
||||
dna.species.handle_body(src)
|
||||
dna.species.handle_body(src)
|
||||
|
||||
/mob/living/carbon/human/update_fire()
|
||||
..("Standing")
|
||||
@@ -181,6 +157,8 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
update_hud()
|
||||
// Mutantrace colors
|
||||
update_mutcolor()
|
||||
//mutations
|
||||
update_mutations_overlay()
|
||||
|
||||
/* --------------------------------------- */
|
||||
//vvvvvv UPDATE_INV PROCS vvvvvv
|
||||
|
||||
@@ -38,8 +38,8 @@
|
||||
if(prob(1))
|
||||
src << "<span class='danger'>You mutate!</span>"
|
||||
randmutb(src)
|
||||
domutcheck(src,null)
|
||||
emote("gasp")
|
||||
domutcheck()
|
||||
..()
|
||||
|
||||
/mob/living/carbon/monkey/handle_chemicals_in_body()
|
||||
|
||||
@@ -16,16 +16,24 @@
|
||||
verbs += /mob/living/proc/mob_sleep
|
||||
verbs += /mob/living/proc/lay_down
|
||||
|
||||
gender = pick(MALE, FEMALE)
|
||||
real_name = name
|
||||
if(good_mutations.len) //genetic mutations have been set up.
|
||||
initialize()
|
||||
|
||||
internal_organs += new /obj/item/organ/internal/appendix
|
||||
internal_organs += new /obj/item/organ/internal/heart
|
||||
internal_organs += new /obj/item/organ/internal/brain
|
||||
|
||||
for(var/obj/item/organ/internal/I in internal_organs)
|
||||
I.Insert(src)
|
||||
gender = pick(MALE, FEMALE)
|
||||
|
||||
..()
|
||||
|
||||
/mob/living/carbon/monkey/initialize()
|
||||
create_dna(src)
|
||||
dna.initialize_dna(random_blood_type())
|
||||
|
||||
/mob/living/carbon/monkey/prepare_data_huds()
|
||||
//Prepare our med HUD...
|
||||
..()
|
||||
|
||||
@@ -605,8 +605,8 @@ Sorry Giacom. Please don't be mad :(
|
||||
if((!(newdir in H.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && H.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled)
|
||||
H.existing_dirs += newdir
|
||||
H.overlays.Add(image('icons/effects/blood.dmi',trail_type,dir = newdir))
|
||||
if(check_dna_integrity(M)) //blood DNA
|
||||
var/mob/living/carbon/DNA_helper = pulling
|
||||
if(M.has_dna()) //blood DNA
|
||||
var/mob/living/carbon/DNA_helper = M
|
||||
H.blood_DNA[DNA_helper.dna.unique_enzymes] = DNA_helper.dna.blood_type
|
||||
|
||||
/mob/living/proc/getTrail() //silicon and simple_animals don't get blood trails
|
||||
|
||||
@@ -375,7 +375,7 @@
|
||||
M.visible_message("<span class='notice'>[M] presses \his thumb against [P].</span>",\
|
||||
"<span class='notice'>You press your thumb against [P].</span>",\
|
||||
"<span class='notice'>[P] makes a sharp clicking sound as it extracts DNA material from [M].</span>")
|
||||
if(!check_dna_integrity(M))
|
||||
if(!M.has_dna())
|
||||
P << "<b>No DNA detected</b>"
|
||||
return
|
||||
P << "<font color = red><h3>[M]'s UE string : [M.dna.unique_enzymes]</h3></font>"
|
||||
|
||||
@@ -229,6 +229,9 @@
|
||||
/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>This biological resource is somehow resisting our bluespace transceiver. Aborting.</span>"
|
||||
|
||||
/obj/machinery/droneDispenser/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>This object is receiving unactivated swarmer shells to help us. Aborting.</span>"
|
||||
|
||||
|
||||
////END CTRL CLICK FOR SWARMERS////
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/datum/round_event_control/spawn_swarmer
|
||||
name = "Spawn Swarmer Shell"
|
||||
typepath = /datum/round_event/spawn_swarmer
|
||||
weight = 7
|
||||
max_occurrences = 1 //Only once okay fam
|
||||
earliest_start = 18000 //30 minutes
|
||||
|
||||
|
||||
/datum/round_event/spawn_swarmer
|
||||
|
||||
|
||||
/datum/round_event/spawn_swarmer/start()
|
||||
if(find_swarmer())
|
||||
return 0
|
||||
if(!the_gateway)
|
||||
return 0
|
||||
new /obj/item/unactivated_swarmer(get_turf(the_gateway))
|
||||
if(prob(25)) //25% chance to announce it to the crew
|
||||
var/swarmer_report = "<font size=3><b>[command_name()] High-Priority Update</b></span>"
|
||||
swarmer_report += "<br><br>Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come \
|
||||
through."
|
||||
print_command_report(swarmer_report,"Classified [command_name()] Update")
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
|
||||
|
||||
|
||||
/datum/round_event/spawn_swarmer/proc/find_swarmer()
|
||||
for(var/mob/living/M in mob_list)
|
||||
if(istype(M, /mob/living/simple_animal/hostile/swarmer) && M.client) //If there is a swarmer with an active client, we've found our swarmer
|
||||
return 1
|
||||
return 0
|
||||
@@ -1,9 +1,9 @@
|
||||
#define MORPH_COOLDOWN 50
|
||||
|
||||
/mob/living/simple_animal/hostile/morph
|
||||
name = "Morph"
|
||||
real_name = "Morph"
|
||||
desc = "some amorphous blob"
|
||||
name = "morph"
|
||||
real_name = "morph"
|
||||
desc = "A revolting, pulsating pile of flesh."
|
||||
speak_emote = list("gurgles")
|
||||
emote_hear = list("gurgles")
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
@@ -28,16 +28,25 @@
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
idle_vision_range = 1 // Only attack when target is close
|
||||
wander = 0
|
||||
attacktext = "glomps"
|
||||
attack_sound = 'sound/effects/blobattack.ogg'
|
||||
|
||||
var/morphed = 0
|
||||
var/atom/movable/form = null
|
||||
var/morph_time = 0
|
||||
|
||||
var/playstyle_string = "<b><font size=3 color='red'>You are a morph,</font> an abomination of science created primarily with changeling cells. \
|
||||
You may take the form of anything nearby by middle-clicking it. This process will alert any nearby \
|
||||
observers, and can only be performed once every five seconds. While morphed, you move faster, but do \
|
||||
less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \
|
||||
You can attack any item or dead creature to consume it - creatures will fully restore your health. \
|
||||
Finally, you can restore yourself to your original form while morphed by middle-clicking yourself.</b>"
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/examine(mob/user)
|
||||
if(morphed)
|
||||
form.examine(user) // Refactor examine to return desc so it's static? Not sure if worth it
|
||||
if(get_dist(user,src)<=3)
|
||||
user << "<span class='notice'>Looks odd!</span>"
|
||||
user << "<span class='warning'>It doesn't look quite right...</span>"
|
||||
else
|
||||
..()
|
||||
return
|
||||
@@ -57,6 +66,7 @@
|
||||
if(istype(A) && allowed(A))
|
||||
assume(A)
|
||||
else
|
||||
src << "<span class='warning'>Your chameleon skin is still repairing itself!</span>"
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target)
|
||||
@@ -72,11 +82,15 @@
|
||||
else
|
||||
overlays = target.overlays.Copy()
|
||||
|
||||
visible_message("<span class='warning'>[src] suddenly twists and changes shape, becoming a copy of [target]!</span>", \
|
||||
"<span class='notice'>You twist your body and assume the form of [target].</span>")
|
||||
|
||||
name = target.name
|
||||
icon = target.icon
|
||||
icon_state = target.icon_state
|
||||
overlays = target.overlays
|
||||
|
||||
|
||||
//Morphed is weaker
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
@@ -93,6 +107,8 @@
|
||||
|
||||
//anim(loc,src,'icons/mob/mob.dmi',,"morph",,src.dir)
|
||||
|
||||
visible_message("<span class='warning'>[src] suddenly collapses in on itself, dissolving into a pile of green flesh!</span>", \
|
||||
"<span class='notice'>You reform to your normal body.</span>")
|
||||
name = initial(name)
|
||||
icon = initial(icon)
|
||||
icon_state = initial(icon_state)
|
||||
@@ -108,7 +124,8 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/death()
|
||||
if(morphed)
|
||||
visible_message("<span class='danger'>The [src] dissolves!</span>")
|
||||
visible_message("<span class='warning'>[src] twists and dissolves into a pile of green flesh!</span>", \
|
||||
"<span class='userdanger'>Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--</span>")
|
||||
restore()
|
||||
|
||||
//Dump eaten stuff
|
||||
@@ -148,7 +165,7 @@
|
||||
var/mob/living/L = target
|
||||
if(L.stat == DEAD)
|
||||
if(do_after(src, 30, target = L))
|
||||
visible_message("<span class='warning'>[src] swallows the [target] whole!</span>")
|
||||
visible_message("<span class='warning'>[src] swallows [target] whole!</span>")
|
||||
L.loc = src
|
||||
adjustBruteLoss(-50)
|
||||
return
|
||||
@@ -156,7 +173,7 @@
|
||||
var/obj/item/I = target
|
||||
if(!I.anchored)
|
||||
if(do_after(src,20, target = I))
|
||||
visible_message("<span class='warning'>[src] swallows the [target] whole!</span>")
|
||||
visible_message("<span class='warning'>[src] swallows [target] whole!</span>")
|
||||
I.loc = src
|
||||
return
|
||||
target.attack_animal(src)
|
||||
@@ -198,15 +215,10 @@
|
||||
player_mind.assigned_role = "Morph"
|
||||
player_mind.special_role = "Morph"
|
||||
ticker.mode.traitors |= player_mind
|
||||
var/info = {"<B>You are a Morph, a shapeshifting alien creature.</B>
|
||||
You can assume the shape of anything in sight by Shift-Clicking it.
|
||||
You can only transform every 5 seconds.
|
||||
To return to your basic form Shift-Click on yourself.
|
||||
Base form is slow but strong, you're much weaker and faster when disguised.
|
||||
You can eat items and corpses by clicking on them,eating corpses will heal you."}
|
||||
S << info
|
||||
message_admins("[key_of_morph] has been made into Morph by an event.")
|
||||
log_game("[key_of_morph] was spawned as a Morph by an event.")
|
||||
S << S.playstyle_string
|
||||
S << 'sound/magic/Mutate.ogg'
|
||||
message_admins("[key_of_morph] has been made into morph by an event.")
|
||||
log_game("[key_of_morph] was spawned as a morph by an event.")
|
||||
return 1
|
||||
|
||||
/datum/round_event/morph/start()
|
||||
@@ -214,11 +226,11 @@
|
||||
|
||||
|
||||
/datum/round_event/morph/proc/find_morph()
|
||||
message_admins("Attempted to spawn a Morph but there was no players available. Will try again momentarily.")
|
||||
message_admins("Attempted to spawn a morph but there was no players available. Will try again momentarily.")
|
||||
spawn(50)
|
||||
if(get_morph(1))
|
||||
message_admins("Situation has been resolved, [key_of_morph] has been spawned as a Morph.")
|
||||
log_game("[key_of_morph] was spawned as a Morph by an event.")
|
||||
message_admins("Situation has been resolved, [key_of_morph] has been spawned as a morph.")
|
||||
log_game("[key_of_morph] was spawned as a morph by an event.")
|
||||
return 0
|
||||
message_admins("Unfortunately, no candidates were available for becoming a Morph. Shutting down.")
|
||||
message_admins("Unfortunately, no candidates were available for becoming a morph. Shutting down.")
|
||||
return kill()
|
||||
@@ -3,17 +3,19 @@
|
||||
//Don't hear deadchat and are NOT normal ghosts
|
||||
//Admin-spawn or random event
|
||||
|
||||
#define INVISIBILITY_REVENANT 30
|
||||
|
||||
/mob/living/simple_animal/revenant
|
||||
name = "revenant"
|
||||
desc = "A malevolent spirit."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "revenant_idle"
|
||||
incorporeal_move = 3
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
health = 25
|
||||
maxHealth = 25
|
||||
healable = 0
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
see_invisible = INVISIBILITY_REVENANT
|
||||
languages = ALL
|
||||
response_help = "passes through"
|
||||
response_disarm = "swings at"
|
||||
@@ -137,7 +139,8 @@
|
||||
if(target) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining.
|
||||
change_essence_amount(essence_drained * 5, 0, target)
|
||||
src << "<span class='info'>[target]'s soul has been considerably weakened and will yield no more essence for the time being.</span>"
|
||||
target.visible_message("<span class='warning'>[target] gently slumps back onto the ground.</span>")
|
||||
target.visible_message("<span class='warning'>[target] slumps onto the ground.</span>", \
|
||||
"<span class='userdanger'>Violets lights, dancing in your vision, getting clo--</span>")
|
||||
drained_mobs.Add(target)
|
||||
target.death(0)
|
||||
icon_state = "revenant_idle"
|
||||
@@ -150,7 +153,10 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/revenant/say(message)
|
||||
return 0 //Revenants cannot speak out loud.
|
||||
for(var/mob/M in mob_list)
|
||||
if(istype(M, /mob/living/simple_animal/revenant) || M.stat == DEAD)
|
||||
M << "<span class='deadsay'><b>REVENANT: [src]</b> says, \"[message]\"" //Can commune with the dead
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/revenant/Stat()
|
||||
..()
|
||||
@@ -182,14 +188,16 @@
|
||||
src.mind.objectives += objective2
|
||||
src << "<b>Objective #2</b>: [objective2.explanation_text]"
|
||||
ticker.mode.traitors |= src.mind //Necessary for announcing
|
||||
mob_spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_transmit
|
||||
mob_spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_light
|
||||
mob_spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_defile
|
||||
mob_spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_malf
|
||||
AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant_light(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant_defile(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant_malf(null))
|
||||
|
||||
/mob/living/simple_animal/revenant/death()
|
||||
if(!revealed) //Revenants cannot die if they aren't revealed
|
||||
return 0
|
||||
..(1)
|
||||
src << "<span class='userdanger'><b>NO! No... it's too late, you can feel yourself fading...</b></span>"
|
||||
src << "<span class='userdanger'>NO! No... it's too late, you can feel yourself fading...</span>"
|
||||
notransform = 1
|
||||
revealed = 1
|
||||
invisibility = 0
|
||||
@@ -199,8 +207,9 @@
|
||||
for(var/i = alpha, i > 0, i -= 10)
|
||||
sleep(0.1)
|
||||
alpha = i
|
||||
visible_message("<span class='danger'>[src]'s body breaks apart into blue dust.</span>")
|
||||
new /obj/item/weapon/ectoplasm/revenant(get_turf(src))
|
||||
visible_message("<span class='danger'>[src]'s body breaks apart into a fine pile of blue dust.</span>")
|
||||
var/obj/item/weapon/ectoplasm/revenant/R = new (get_turf(src))
|
||||
R.client_to_revive = src.client //If the essence reforms, the old revenant is put back in the body
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
@@ -209,7 +218,7 @@
|
||||
/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params)
|
||||
if(istype(W, /obj/item/weapon/nullrod))
|
||||
visible_message("<span class='warning'>[src] violently flinches!</span>", \
|
||||
"<span class='boldannounce'>As the null rod passes through you, you feel your essence draining away!</span>")
|
||||
"<span class='userdanger'>As the null rod passes through you, you feel your essence draining away!</span>")
|
||||
essence -= 25 //hella effective
|
||||
inhibited = 1
|
||||
spawn(30)
|
||||
@@ -263,7 +272,7 @@
|
||||
src << "<span class='warning'>You have been revealed.</span>"
|
||||
spawn(time)
|
||||
revealed = 0
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
src << "<span class='notice'>You are once more concealed.</span>"
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/stun(time)
|
||||
@@ -323,7 +332,8 @@
|
||||
icon_state = "revenantEctoplasm"
|
||||
w_class = 2
|
||||
var/reforming = 0
|
||||
var/reformed = 0
|
||||
var/inert = 0
|
||||
var/client/client_to_revive
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/New()
|
||||
..()
|
||||
@@ -332,17 +342,12 @@
|
||||
if(src && reforming)
|
||||
return reform()
|
||||
if(src && !reforming)
|
||||
reforming = 1
|
||||
visible_message("<span class='warning'>[src] settles down and seems lifeless.</span>")
|
||||
return
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/attack_hand(mob/user)
|
||||
if(reformed)
|
||||
user << "<span class='warning'>[src] keeps slipping out of your hands, you can't get a hold on it!</span>"
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/attack_self(mob/user)
|
||||
if(!reforming)
|
||||
if(!reforming || inert)
|
||||
return ..()
|
||||
user.visible_message("<span class='notice'>[user] scatters [src] in all directions.</span>", \
|
||||
"<span class='notice'>You scatter [src] across the area. The particles slowly fade away.</span>")
|
||||
@@ -351,6 +356,8 @@
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
if(inert)
|
||||
return
|
||||
visible_message("<span class='notice'>[src] breaks into particles upon impact, which fade away to nothingness.</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -364,20 +371,29 @@
|
||||
/obj/item/weapon/ectoplasm/revenant/proc/reform()
|
||||
if(!reforming || !src)
|
||||
return
|
||||
var/key_of_revenant
|
||||
message_admins("Revenant ectoplasm was left undestroyed for 1 minute and has reformed into a new revenant.")
|
||||
loc = get_turf(src) //In case it's in a backpack or someone's hand
|
||||
visible_message("<span class='boldannounce'>[src] suddenly rises into the air before fading away.</span>")
|
||||
var/mob/living/simple_animal/revenant/R = new(get_turf(src))
|
||||
qdel(src)
|
||||
var/list/candidates = get_candidates(BE_REVENANT)
|
||||
if(!candidates.len)
|
||||
message_admins("No candidates were found for the new revenant. Oh well!")
|
||||
return 0
|
||||
var/client/C = pick(candidates)
|
||||
var/key_of_revenant = C.key
|
||||
if(!key_of_revenant)
|
||||
message_admins("No ckey was found for the new revenant. Oh well!")
|
||||
return 0
|
||||
if(client_to_revive)
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.client == client_to_revive && M.stat == DEAD) //Only recreates the mob if the mob the client is in is dead
|
||||
message_admins("[R.client] was a revenant and died. Re-making them into the new revenant formed by ectoplasm.")
|
||||
R.client = client_to_revive
|
||||
key_of_revenant = client_to_revive.key
|
||||
break
|
||||
message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...")
|
||||
else
|
||||
var/list/candidates = get_candidates(BE_REVENANT)
|
||||
if(!candidates.len)
|
||||
message_admins("No candidates were found for the new revenant. Oh well!")
|
||||
return 0
|
||||
var/client/C = pick(candidates)
|
||||
key_of_revenant = C.key
|
||||
if(!key_of_revenant)
|
||||
message_admins("No ckey was found for the new revenant. Oh well!")
|
||||
return 0
|
||||
var/datum/mind/player_mind = new /datum/mind(key_of_revenant)
|
||||
player_mind.active = 1
|
||||
player_mind.transfer_to(R)
|
||||
@@ -386,4 +402,7 @@
|
||||
ticker.mode.traitors |= player_mind
|
||||
message_admins("[key_of_revenant] has been made into a revenant by reforming ectoplasm.")
|
||||
log_game("[key_of_revenant] was spawned as a revenant by reforming ectoplasm.")
|
||||
qdel(src)
|
||||
if(src) //Should never happen, but just in case
|
||||
inert = 1
|
||||
return 1
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
clothes_req = 0
|
||||
range = 7
|
||||
include_user = 0
|
||||
action_icon_state = "r_transmit"
|
||||
action_background_icon_state = "bg_revenant"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
|
||||
for(var/mob/living/M in targets)
|
||||
@@ -16,7 +18,7 @@
|
||||
charge_counter = charge_max
|
||||
return
|
||||
usr << "<span class='info'><b>You transmit to [M]:</b> [msg]</span>"
|
||||
M << "<span class='deadsay'><b>A strange voice resonates in your head...</b></span><i> [msg]</I>"
|
||||
M << "<span class='deadsay'><b>An alien voice resonates from all around...</b></span><i> [msg]</I>"
|
||||
|
||||
|
||||
//Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people.
|
||||
@@ -30,6 +32,8 @@
|
||||
var/reveal = 80
|
||||
var/stun = 20
|
||||
var/locked = 1
|
||||
action_icon_state = "overload_lights"
|
||||
action_background_icon_state = "bg_revenant"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/revenant_light/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
|
||||
if(locked)
|
||||
@@ -40,7 +44,7 @@
|
||||
name = "Overload Lights (20E)"
|
||||
panel = "Revenant Abilities"
|
||||
locked = 0
|
||||
range = 6
|
||||
range = 2
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!user.castcheck(-20))
|
||||
@@ -58,7 +62,7 @@
|
||||
s.set_up(4, 1, L)
|
||||
s.start()
|
||||
sleep(10)
|
||||
for(var/mob/living/M in orange(4, L))
|
||||
for(var/mob/living/M in range(4, L))
|
||||
if(M == user)
|
||||
return
|
||||
M.Beam(L,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
|
||||
@@ -73,8 +77,8 @@
|
||||
|
||||
//Defile: Corrupts nearby stuff, unblesses floor tiles.
|
||||
/obj/effect/proc_holder/spell/aoe_turf/revenant_defile
|
||||
name = "Defile (35E)"
|
||||
desc = "Twists and corrupts the nearby area. Also dispels holy auras on floors, but not salt lines."
|
||||
name = "Defile (20E)"
|
||||
desc = "Twists and corrupts the nearby area. Also dispels holy auras on floors."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 200
|
||||
clothes_req = 0
|
||||
@@ -82,6 +86,8 @@
|
||||
var/reveal = 100
|
||||
var/stun = 20
|
||||
var/locked = 1
|
||||
action_icon_state = "defile"
|
||||
action_background_icon_state = "bg_revenant"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/revenant_defile/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
|
||||
if(locked)
|
||||
@@ -89,7 +95,7 @@
|
||||
charge_counter = charge_max
|
||||
return
|
||||
user << "<span class='info'>You have unlocked Defile!</span>"
|
||||
name = "Defile (20E)"
|
||||
name = "Defile (10E)"
|
||||
panel = "Revenant Abilities"
|
||||
locked = 0
|
||||
range = 3
|
||||
@@ -102,10 +108,6 @@
|
||||
spawn(0)
|
||||
if(T.flags & NOJAUNT)
|
||||
T.flags -= NOJAUNT
|
||||
if(!istype(T, /turf/simulated/wall/cult) && istype(T, /turf/simulated/wall) && prob(40))
|
||||
T.ChangeTurf(/turf/simulated/wall/cult)
|
||||
if(!istype(T, /turf/simulated/floor/engine/cult) && istype(T, /turf/simulated/floor) && prob(40))
|
||||
T.ChangeTurf(/turf/simulated/floor/engine/cult)
|
||||
for(var/mob/living/carbon/human/human in T.contents)
|
||||
human << "<span class='warning'>You suddenly feel tired.</span>"
|
||||
human.adjustStaminaLoss(35)
|
||||
@@ -128,6 +130,8 @@
|
||||
var/reveal = 60
|
||||
var/stun = 30
|
||||
var/locked = 1
|
||||
action_icon_state = "malfunction"
|
||||
action_background_icon_state = "bg_revenant"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/revenant_malf/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
|
||||
if(locked)
|
||||
@@ -152,8 +156,19 @@
|
||||
bot.open = 1
|
||||
bot.Emag(null)
|
||||
for(var/obj/machinery/mach in T.contents)
|
||||
if(istype(mach, /obj/machinery/dominator) || istype(mach, /obj/machinery/power/apc)) //Doesn't work on dominators and APCs, to prevent kekkery
|
||||
continue
|
||||
if(prob(10))
|
||||
mach.emag_act(null)
|
||||
empulse(user.loc, 3, 5)
|
||||
else
|
||||
mach.emp_act(1)
|
||||
for(var/mob/living/silicon/robot/S in T.contents) //Only works on cyborgs, not AI
|
||||
S << "<span class='warning'><b>ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#</b></span>"
|
||||
S << 'sound/misc/interference.ogg'
|
||||
playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1)
|
||||
var/datum/effect/effect/system/spark_spread/sp = new /datum/effect/effect/system/spark_spread
|
||||
sp.set_up(5, 1, S)
|
||||
sp.start()
|
||||
S.Weaken(6)
|
||||
user.reveal(reveal)
|
||||
user.stun(stun)
|
||||
@@ -1,9 +1,9 @@
|
||||
//////////////////The Monster
|
||||
|
||||
/mob/living/simple_animal/slaughter
|
||||
name = "Slaughter Demon"
|
||||
real_name = "Slaughter Demon"
|
||||
desc = "You should run."
|
||||
name = "slaughter demon"
|
||||
real_name = "slaughter demon"
|
||||
desc = "A large, menacing creature covered in armored black scales."
|
||||
speak_emote = list("gurgles")
|
||||
emote_hear = list("wails","screeches")
|
||||
response_help = "thinks better of touching"
|
||||
@@ -31,10 +31,11 @@
|
||||
var/boost = 0
|
||||
bloodcrawl = BLOODCRAWL_EAT
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
var/playstyle_string = "<B>You are the Slaughter Demon, a terible creature from another existence. You have a single desire: To kill. \
|
||||
You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \
|
||||
Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. \
|
||||
You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. </B>"
|
||||
var/list/consumed_mobs = list()
|
||||
var/playstyle_string = "<B><font size=3 color='red'>You are a slaughter demon,</font> a terrible creature from another realm. You have a single desire: To kill. \
|
||||
You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and dissaapearing from the station at will. \
|
||||
Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \
|
||||
You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. </B>"
|
||||
|
||||
/mob/living/simple_animal/slaughter/New()
|
||||
..()
|
||||
@@ -52,10 +53,17 @@
|
||||
|
||||
/mob/living/simple_animal/slaughter/death()
|
||||
..(1)
|
||||
new /obj/effect/decal/cleanable/blood (src.loc)
|
||||
new /obj/item/weapon/demonheart (src.loc)
|
||||
new /obj/effect/decal/cleanable/blood (get_turf(src))
|
||||
var/obj/effect/decal/cleanable/blood/innards = new (get_turf(src))
|
||||
innards.icon = 'icons/obj/surgery.dmi'
|
||||
innards.icon_state = "innards"
|
||||
innards.name = "pile of viscera"
|
||||
innards.desc = "A repulsive pile of guts and gore."
|
||||
new /obj/item/organ/internal/heart/demon (src.loc)
|
||||
playsound(get_turf(src),'sound/magic/demon_dies.ogg', 200, 1)
|
||||
visible_message("<span class='danger'>The [src] screams in anger as its form collapes into a pool of viscera.</span>")
|
||||
visible_message("<span class='danger'>[src] screams in anger as it collapses into a puddle of viscera, its most recent meals spilling out of it.</span>")
|
||||
for(var/mob/living/M in consumed_mobs)
|
||||
M.loc = get_turf(src)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
@@ -64,26 +72,44 @@
|
||||
/mob/living/simple_animal/slaughter/phasein()
|
||||
. = ..()
|
||||
speed = 0
|
||||
boost = world.time + 30
|
||||
boost = world.time + 60
|
||||
|
||||
|
||||
//////////The Loot
|
||||
|
||||
/obj/item/weapon/demonheart
|
||||
name = "demon's heart"
|
||||
desc = "It's still faintly beating with rage"
|
||||
//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
|
||||
/obj/item/organ/internal/heart/demon
|
||||
name = "demon heart"
|
||||
desc = "Still it beats furiously, emanating an aura of utter hate."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "heart-on"
|
||||
icon_state = "demon_heart"
|
||||
origin_tech = "combat=5;biotech=8"
|
||||
|
||||
/obj/item/weapon/demonheart/attack_self(mob/living/user)
|
||||
visible_message("[user] feasts upon the [src].")
|
||||
/obj/item/organ/internal/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target)
|
||||
if(M != user)
|
||||
return ..()
|
||||
user.visible_message("<span class='warning'>[user] raises [src] to their mouth and tears into it with their teeth!</span>", \
|
||||
"<span class='danger'>An unnatural hunger consumes you. You raise [src] your mouth and devour it!</span>")
|
||||
playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1)
|
||||
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
|
||||
if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl)
|
||||
user <<"<span class='notice'>You already know how to blood crawl.</span>"
|
||||
user <<"<span class='warning'>...and you don't feel any different.</span>"
|
||||
qdel(src)
|
||||
return
|
||||
user << "You absorb some of the demon's power!"
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl)
|
||||
qdel(src)
|
||||
user.visible_message("<span class='warning'>[user]'s eyes flare a deep crimson!</span>", \
|
||||
"<span class='userdanger'>You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!</span>")
|
||||
/*for(var/obj/item/organ/internal/O in user.internal_organs)
|
||||
if(istype(O, /obj/item/organ/internal/heart))
|
||||
O.Remove(user, 1)
|
||||
O.loc = get_turf(user)
|
||||
qdel(O)*/
|
||||
user.drop_item()
|
||||
src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E
|
||||
|
||||
/obj/item/organ/internal/heart/demon/Insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
if(M.mind)
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null))
|
||||
|
||||
/obj/item/organ/internal/heart/demon/Remove(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
if(M.mind)
|
||||
M.mind.remove_spell(/obj/effect/proc_holder/spell/bloodcrawl)
|
||||
|
||||
@@ -44,9 +44,10 @@
|
||||
player_mind.special_role = "Slaughter Demon"
|
||||
ticker.mode.traitors |= player_mind
|
||||
S << S.playstyle_string
|
||||
S << "<B>You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.</B>"
|
||||
message_admins("[key_of_slaughter] has been made into a Slaughter Demon by an event.")
|
||||
log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
|
||||
S << "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>"
|
||||
S << 'sound/magic/demon_dies.ogg'
|
||||
message_admins("[key_of_slaughter] has been made into a slaughter demon by an event.")
|
||||
log_game("[key_of_slaughter] was spawned as a slaughter demon by an event.")
|
||||
return 1
|
||||
|
||||
|
||||
@@ -57,11 +58,11 @@
|
||||
|
||||
|
||||
/datum/round_event/slaughter/proc/find_slaughter()
|
||||
message_admins("Attempted to spawn a Slaughter Demon but there was no players available. Will try again momentarily.")
|
||||
message_admins("Attempted to spawn a slaughter demon but there was no players available. Will try again momentarily.")
|
||||
spawn(50)
|
||||
if(get_slaughter(1))
|
||||
message_admins("Situation has been resolved, [key_of_slaughter] has been spawned as a Slaughter Demon.")
|
||||
log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
|
||||
message_admins("Situation has been resolved, [key_of_slaughter] has been spawned as a slaughter demon.")
|
||||
log_game("[key_of_slaughter] was spawned as a slaughter demon by an event.")
|
||||
return 0
|
||||
message_admins("Unfortunately, no candidates were available for becoming a Slaugter Demon. Shutting down.")
|
||||
message_admins("Unfortunately, no candidates were available for becoming a slaughter demon. Shutting down.")
|
||||
return kill()
|
||||
|
||||
@@ -251,9 +251,8 @@
|
||||
|
||||
if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.dna)
|
||||
if(src.type in H.dna.species.ignored_by)
|
||||
continue
|
||||
if(src.type in H.dna.species.ignored_by)
|
||||
continue
|
||||
|
||||
if(!L.canmove) // Only one slime can latch on at a time.
|
||||
var/notarget = 0
|
||||
|
||||
@@ -40,15 +40,11 @@
|
||||
M.name = src.name
|
||||
M.real_name = src.real_name
|
||||
|
||||
if(check_dna_integrity(src))
|
||||
if(has_dna() && M.has_dna())
|
||||
var/mob/living/carbon/C = src
|
||||
var/mob/living/carbon/D = M
|
||||
D.dna = C.dna
|
||||
updateappearance(D)
|
||||
else
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
src.client.prefs.copy_to(M)
|
||||
ready_dna(M)
|
||||
C.dna.transfer_identity(D)
|
||||
D.updateappearance(mutcolor_update=1, mutations_overlay_update=1)
|
||||
|
||||
if(mind && istype(M, /mob/living))
|
||||
mind.transfer_to(M)
|
||||
|
||||
@@ -362,21 +362,17 @@
|
||||
var/mob/living/carbon/human/new_character = new(loc)
|
||||
new_character.lastarea = get_area(loc)
|
||||
|
||||
create_dna(new_character)
|
||||
|
||||
if(config.force_random_names || appearance_isbanned(src))
|
||||
client.prefs.random_character()
|
||||
client.prefs.real_name = client.prefs.pref_species.random_name(gender,1)
|
||||
client.prefs.copy_to(new_character)
|
||||
|
||||
new_character.dna.update_dna_identity()
|
||||
if(mind)
|
||||
mind.active = 0 //we wish to transfer the key manually
|
||||
mind.transfer_to(new_character) //won't transfer key since the mind is not active
|
||||
|
||||
new_character.name = real_name
|
||||
|
||||
ready_dna(new_character, client.prefs.blood_type)
|
||||
|
||||
new_character.key = key //Manually transfer the key to log them in
|
||||
new_character.stopLobbySound()
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null)
|
||||
/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG))
|
||||
if (notransform)
|
||||
return
|
||||
//Handle items on mob
|
||||
@@ -16,8 +16,11 @@
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
if(tr_flags & TR_KEEPITEMS)
|
||||
for(var/obj/item/W in (src.contents-implants-int_organs))
|
||||
unEquip(W)
|
||||
|
||||
//Make mob invisible and spawn animation
|
||||
regenerate_icons()
|
||||
notransform = 1
|
||||
canmove = 0
|
||||
stunned = 1
|
||||
@@ -35,18 +38,18 @@
|
||||
qdel(animation)
|
||||
|
||||
// hash the original name?
|
||||
if (tr_flags & TR_HASHNAME)
|
||||
if(tr_flags & TR_HASHNAME)
|
||||
O.name = "monkey ([copytext(md5(real_name), 2, 6)])"
|
||||
O.real_name = "monkey ([copytext(md5(real_name), 2, 6)])"
|
||||
if (newname) //if there's a name as an argument, always take that one over the current name
|
||||
O.name = newname
|
||||
O.real_name = newname
|
||||
|
||||
//handle DNA and other attributes
|
||||
if(dna)
|
||||
dna.transfer_identity(O)
|
||||
if(tr_flags & TR_KEEPSE)
|
||||
O.dna.struc_enzymes = dna.struc_enzymes
|
||||
dna.transfer_identity(O)
|
||||
O.updateappearance(icon_update=0)
|
||||
|
||||
if(tr_flags & TR_KEEPSE)
|
||||
O.dna.struc_enzymes = dna.struc_enzymes
|
||||
var/datum/mutation/human/race/R = mutations_list[RACEMUT]
|
||||
O.dna.struc_enzymes = R.set_se(O.dna.struc_enzymes, on=1)//we don't want to keep the race block inactive
|
||||
|
||||
if(suiciding)
|
||||
O.suiciding = suiciding
|
||||
@@ -70,9 +73,10 @@
|
||||
O.radiation = radiation
|
||||
|
||||
//re-add implants to new mob
|
||||
for(var/obj/item/weapon/implant/I in implants)
|
||||
I.loc = O
|
||||
I.implanted = O
|
||||
if (tr_flags & TR_KEEPIMPLANTS)
|
||||
for(var/obj/item/weapon/implant/I in implants)
|
||||
I.loc = O
|
||||
I.implanted = O
|
||||
|
||||
//re-add organs to new mob
|
||||
if(tr_flags & TR_KEEPORGANS)
|
||||
@@ -96,16 +100,14 @@
|
||||
if(loc.vars[A] == src)
|
||||
loc.vars[A] = O
|
||||
|
||||
updateappearance(O)
|
||||
. = O
|
||||
if ( !(tr_flags & TR_KEEPSRC) ) //flag should be used if monkeyize() is called inside another proc of src so that one does not crash
|
||||
qdel(src)
|
||||
|
||||
qdel(src)
|
||||
|
||||
////////////////////////// Humanize //////////////////////////////
|
||||
//Could probably be merged with monkeyize but other transformations got their own procs, too
|
||||
|
||||
/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null)
|
||||
/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG))
|
||||
if (notransform)
|
||||
return
|
||||
//Handle items on mob
|
||||
@@ -125,7 +127,7 @@
|
||||
|
||||
//now the rest
|
||||
if (tr_flags & TR_KEEPITEMS)
|
||||
for(var/obj/item/W in (src.contents-implants))
|
||||
for(var/obj/item/W in (src.contents-implants-int_organs))
|
||||
unEquip(W)
|
||||
if (client)
|
||||
client.screen -= W
|
||||
@@ -134,11 +136,7 @@
|
||||
W.dropped(src)
|
||||
W.layer = initial(W.layer)
|
||||
|
||||
// for(var/obj/item/W in src)
|
||||
// unEquip(W)
|
||||
|
||||
//Make mob invisible and spawn animation
|
||||
regenerate_icons()
|
||||
notransform = 1
|
||||
canmove = 0
|
||||
stunned = 1
|
||||
@@ -156,27 +154,21 @@
|
||||
O.equip_to_appropriate_slot(C)
|
||||
qdel(animation)
|
||||
|
||||
O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? FEMALE : MALE
|
||||
dna.transfer_identity(O)
|
||||
O.updateappearance(mutcolor_update=1)
|
||||
|
||||
if(dna)
|
||||
dna.transfer_identity(O)
|
||||
O.update_icons()
|
||||
if(tr_flags & TR_KEEPSE)
|
||||
O.dna.struc_enzymes = dna.struc_enzymes
|
||||
domutcheck(O)
|
||||
|
||||
if(!dna.species)
|
||||
hardset_dna(O, null, null, null, null, /datum/species/human)
|
||||
if(cmptext("monkey",copytext(O.dna.real_name,1,7)))
|
||||
O.real_name = random_unique_name(O.gender)
|
||||
O.dna.generate_unique_enzymes(O)
|
||||
else
|
||||
hardset_dna(O, null, null, null, null, dna.species.type)
|
||||
|
||||
if(newname) //if there's a name as an argument, always take that one over the current name
|
||||
O.real_name = newname
|
||||
else
|
||||
if(cmptext("monkey",copytext(O.dna.real_name,1,7)))
|
||||
O.dna.real_name = random_unique_name(O.gender)
|
||||
O.real_name = O.dna.real_name
|
||||
O.name = O.real_name
|
||||
O.name = O.real_name
|
||||
|
||||
if(tr_flags & TR_KEEPSE)
|
||||
O.dna.struc_enzymes = dna.struc_enzymes
|
||||
var/datum/mutation/human/race/R = mutations_list[RACEMUT]
|
||||
O.dna.struc_enzymes = R.set_se(O.dna.struc_enzymes, on=0)//we don't want to keep the race block active
|
||||
O.domutcheck()
|
||||
|
||||
if(suiciding)
|
||||
O.suiciding = suiciding
|
||||
@@ -201,10 +193,11 @@
|
||||
O.radiation = radiation
|
||||
|
||||
//re-add implants to new mob
|
||||
for(var/obj/item/weapon/implant/I in implants)
|
||||
I.loc = O
|
||||
I.implanted = O
|
||||
O.sec_hud_set_implants()
|
||||
if (tr_flags & TR_KEEPIMPLANTS)
|
||||
for(var/obj/item/weapon/implant/I in implants)
|
||||
I.loc = O
|
||||
I.implanted = O
|
||||
O.sec_hud_set_implants()
|
||||
|
||||
if(tr_flags & TR_KEEPORGANS)
|
||||
for(var/obj/item/organ/internal/I in O.internal_organs)
|
||||
@@ -215,21 +208,23 @@
|
||||
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
if(O.mind.changeling)
|
||||
for(var/obj/effect/proc_holder/changeling/humanform/HF in O.mind.changeling.purchasedpowers)
|
||||
mind.changeling.purchasedpowers -= HF
|
||||
|
||||
O.a_intent = "help"
|
||||
if (tr_flags & TR_DEFAULTMSG)
|
||||
O << "<B>You are now a human.</B>"
|
||||
|
||||
O.update_pipe_vision()
|
||||
|
||||
updateappearance(O)
|
||||
. = O
|
||||
|
||||
for(var/A in loc.vars)
|
||||
if(loc.vars[A] == src)
|
||||
loc.vars[A] = O
|
||||
|
||||
if ( !(tr_flags & TR_KEEPSRC) ) //don't delete src yet if it's needed to finish calling proc
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/mob/new_player/AIize()
|
||||
|
||||
@@ -170,7 +170,7 @@ Contents:
|
||||
var/datum/preferences/A = new()//Randomize appearance for the ninja.
|
||||
A.real_name = "[pick(ninja_titles)] [pick(ninja_names)]"
|
||||
A.copy_to(new_ninja)
|
||||
ready_dna(new_ninja)
|
||||
new_ninja.dna.update_dna_identity()
|
||||
new_ninja.equip_space_ninja()
|
||||
return new_ninja
|
||||
|
||||
|
||||
@@ -51,6 +51,10 @@
|
||||
|
||||
/obj/item/weapon/paper/examine(mob/user)
|
||||
..()
|
||||
if(istype(src, /obj/item/weapon/paper/talisman)) //Talismans cannot be read
|
||||
if(!iscultist(user) && !user.stat)
|
||||
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
|
||||
return
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
if( !(ishuman(user) || isobserver(user) || issilicon(user)) )
|
||||
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)]<HR>[stamps]</BODY></HTML>", "window=[name]")
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, distro, quiet)
|
||||
/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, distro, quiet, zone_override = "")
|
||||
distro += variance
|
||||
for (var/i = max(1, pellets), i > 0, i--)
|
||||
var/curloc = user.loc
|
||||
var/targloc = get_turf(target)
|
||||
ready_proj(target, user, quiet)
|
||||
ready_proj(target, user, quiet, zone_override)
|
||||
if(distro)
|
||||
targloc = spread(targloc, curloc, distro)
|
||||
if(!throw_proj(targloc, user, params))
|
||||
@@ -15,12 +15,15 @@
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/item/ammo_casing/proc/ready_proj(atom/target as mob|obj|turf, mob/living/user, quiet)
|
||||
/obj/item/ammo_casing/proc/ready_proj(atom/target as mob|obj|turf, mob/living/user, quiet, zone_override = "")
|
||||
if (!BB)
|
||||
return
|
||||
BB.original = target
|
||||
BB.firer = user
|
||||
BB.def_zone = user.zone_sel.selecting
|
||||
if (zone_override)
|
||||
BB.def_zone = zone_override
|
||||
else
|
||||
BB.def_zone = user.zone_sel.selecting
|
||||
BB.suppressed = quiet
|
||||
|
||||
if(reagents && BB.reagents)
|
||||
@@ -33,7 +36,7 @@
|
||||
return 0
|
||||
if(targloc == curloc)
|
||||
if(BB.original == user) //if we target ourselves we go straight to bullet_act()
|
||||
user.bullet_act(BB)
|
||||
user.bullet_act(BB, BB.def_zone)
|
||||
qdel(BB)
|
||||
return 1
|
||||
BB.loc = get_turf(user)
|
||||
|
||||
@@ -133,7 +133,8 @@
|
||||
var/mob/living/M = user
|
||||
if (M.disabilities & CLUMSY && prob(40))
|
||||
user << "<span class='userdanger'>You shoot yourself in the foot with \the [src]!</span>"
|
||||
process_fire(user,user,0,params)
|
||||
var/shot_leg = pick("l_leg", "r_leg")
|
||||
process_fire(user,user,0,params, zone_override = shot_leg)
|
||||
M.drop_item()
|
||||
return
|
||||
|
||||
@@ -155,7 +156,7 @@
|
||||
return 0
|
||||
|
||||
if(trigger_guard)
|
||||
if(istype(user) && user.dna)
|
||||
if(user.has_dna())
|
||||
if(user.dna.check_mutation(HULK))
|
||||
user << "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>"
|
||||
return 0
|
||||
@@ -177,7 +178,7 @@
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params)
|
||||
/obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override)
|
||||
add_fingerprint(user)
|
||||
|
||||
if(semicd)
|
||||
@@ -195,7 +196,7 @@
|
||||
if( i>1 && !(src in get_both_hands(user))) //for burst firing
|
||||
break
|
||||
if(chambered)
|
||||
if(!chambered.fire(target, user, params, , suppressed))
|
||||
if(!chambered.fire(target, user, params, , suppressed, zone_override))
|
||||
shoot_with_empty_chamber(user)
|
||||
break
|
||||
else
|
||||
@@ -211,7 +212,7 @@
|
||||
sleep(fire_delay)
|
||||
else
|
||||
if(chambered)
|
||||
if(!chambered.fire(target, user, params, , suppressed))
|
||||
if(!chambered.fire(target, user, params, , suppressed, zone_override))
|
||||
shoot_with_empty_chamber(user)
|
||||
return
|
||||
else
|
||||
@@ -359,4 +360,4 @@
|
||||
if(src && input && !M.stat && in_range(M,src) && !M.restrained() && M.canmove)
|
||||
name = input
|
||||
M << "You name the gun [input]. Say hello to your new friend."
|
||||
return
|
||||
return
|
||||
|
||||
@@ -98,13 +98,14 @@
|
||||
M << "<span class='danger'>You feel a wave of heat wash over you.</span>"
|
||||
M.irradiate(300)
|
||||
fail_state = 2 //break the gun so it stops recharging
|
||||
crit_fail = 1 //So that it may be properly perfected in this state.
|
||||
SSobj.processing.Remove(src)
|
||||
update_icon()
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity)
|
||||
..()
|
||||
reliability -= round(15/severity)
|
||||
reliability = max(reliability - round(15/severity), 0) //Do not allow it to go negative!
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/nuclear/update_icon()
|
||||
..()
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
user.visible_message("<span class='suicide'>[user] is putting the barrel of the [src.name] in \his mouth. It looks like \he's trying to commit suicide.</span>")
|
||||
sleep(25)
|
||||
if(user.l_hand == src || user.r_hand == src)
|
||||
process_fire(user, user, 0)
|
||||
process_fire(user, user, 0, zone_override = "head")
|
||||
user.visible_message("<span class='suicide'>[user] blows \his brains out with the [src.name]!</span>")
|
||||
return(BRUTELOSS)
|
||||
else
|
||||
@@ -157,4 +157,4 @@
|
||||
icon_state = "suppressor"
|
||||
w_class = 2
|
||||
var/oldsound = null
|
||||
var/initial_w_class = null
|
||||
var/initial_w_class = null
|
||||
|
||||
@@ -119,6 +119,9 @@
|
||||
can_suppress = 0
|
||||
burst_size = 0
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/wt550/ui_action_click()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/wt550/update_icon()
|
||||
..()
|
||||
icon_state = "wt550[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""]"
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
options["The Peacemaker"] = "detective_peacemaker"
|
||||
options["Cancel"] = null
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/detective/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params)
|
||||
/obj/item/weapon/gun/projectile/revolver/detective/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override = "")
|
||||
if(magazine.caliber != initial(magazine.caliber))
|
||||
if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
|
||||
@@ -216,19 +216,21 @@
|
||||
new_mob = new /mob/living/carbon/human(M.loc)
|
||||
|
||||
var/datum/preferences/A = new() //Randomize appearance for the human
|
||||
A.copy_to(new_mob)
|
||||
A.copy_to(new_mob, icon_updates=0)
|
||||
|
||||
var/mob/living/carbon/human/H = new_mob
|
||||
ready_dna(H)
|
||||
if(H.dna && prob(50))
|
||||
if(prob(50))
|
||||
var/list/all_species = list()
|
||||
for(var/speciestype in typesof(/datum/species) - /datum/species)
|
||||
var/datum/species/S = new speciestype()
|
||||
if(!S.dangerous_existence)
|
||||
all_species += speciestype
|
||||
hardset_dna(H, null, null, null, null, pick(all_species))
|
||||
H.set_species(pick(all_species), icon_update=0)
|
||||
H.real_name = H.dna.species.random_name(H.gender,1)
|
||||
H.update_icons()
|
||||
H.update_body()
|
||||
H.update_hair()
|
||||
H.update_mutcolor()
|
||||
H.dna.update_dna_identity()
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
@@ -132,10 +132,10 @@
|
||||
return
|
||||
|
||||
/datum/reagent/drug/krokodil/addiction_act_stage4(mob/living/carbon/human/M)
|
||||
if(M.dna && !istype(M.dna.species, /datum/species/cosmetic_zombie))
|
||||
if(M.has_dna() && M.dna.species.id != "zombie")
|
||||
M << "<span class='userdanger'>Your skin falls off easily!</span>"
|
||||
M.adjustBruteLoss(50*REM) // holy shit your skin just FELL THE FUCK OFF
|
||||
hardset_dna(M, null, null, null, null, /datum/species/cosmetic_zombie)
|
||||
M.set_species(/datum/species/cosmetic_zombie)
|
||||
else
|
||||
M.adjustBruteLoss(5*REM)
|
||||
..()
|
||||
|
||||
@@ -724,7 +724,7 @@
|
||||
|
||||
/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/human/M)
|
||||
M.jitteriness = 0
|
||||
if(istype(M) && M.dna)
|
||||
if(M.has_dna())
|
||||
M.dna.remove_all_mutations()
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -356,8 +356,7 @@
|
||||
var/datum/species/mutation = pick(possible_morphs)
|
||||
if(prob(90) && mutation && H.dna.species != /datum/species/golem && H.dna.species != /datum/species/golem/adamantine)
|
||||
H << "<span class='danger'>The pain subsides. You feel... different.</span>"
|
||||
hardset_dna(H, null, null, null, null, mutation)
|
||||
H.regenerate_icons()
|
||||
H.set_species(mutation)
|
||||
if(mutation == /datum/species/slime)
|
||||
H.faction |= "slime"
|
||||
else
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
/datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume)
|
||||
if(!..())
|
||||
return
|
||||
if(!istype(M) || !M.dna)
|
||||
if(!M.has_dna())
|
||||
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
|
||||
if((method==VAPOR && prob(min(33, reac_volume))) || method==INGEST || method == PATCH)
|
||||
randmuti(M)
|
||||
@@ -39,8 +39,8 @@
|
||||
randmutb(M)
|
||||
else
|
||||
randmutg(M)
|
||||
domutcheck(M, null)
|
||||
updateappearance(M)
|
||||
M.updateappearance()
|
||||
M.domutcheck()
|
||||
..()
|
||||
|
||||
/datum/reagent/toxin/mutagen/on_mob_life(mob/living/carbon/M)
|
||||
|
||||
@@ -66,20 +66,16 @@
|
||||
if(ismob(target)) //Blood!
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(H.dna)
|
||||
if(NOBLOOD in H.dna.species.specflags && !H.dna.species.exotic_blood)
|
||||
user << "<span class='warning'>You are unable to locate any blood!</span>"
|
||||
return
|
||||
if(NOBLOOD in H.dna.species.specflags && !H.dna.species.exotic_blood)
|
||||
user << "<span class='warning'>You are unable to locate any blood!</span>"
|
||||
return
|
||||
if(reagents.has_reagent("blood"))
|
||||
user << "<span class='warning'>There is already a blood sample in this syringe!</span>"
|
||||
return
|
||||
if(istype(target, /mob/living/carbon)) //maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea.
|
||||
var/amount = src.reagents.maximum_volume - src.reagents.total_volume
|
||||
var/mob/living/carbon/T = target
|
||||
if(!check_dna_integrity(T))
|
||||
user << "<span class='warning'>You are unable to locate any blood!</span>"
|
||||
return
|
||||
if(T.disabilities & NOCLONE) //target done been eat, no more blood in him
|
||||
if(!T.has_dna() || (T.disabilities & NOCLONE)) //target done been eat, no more blood in him
|
||||
user << "<span class='warning'>You are unable to locate any blood!</span>"
|
||||
return
|
||||
if(target != user)
|
||||
@@ -95,7 +91,7 @@
|
||||
|
||||
if(!B && ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(H.dna && H.dna.species.exotic_blood && H.reagents.total_volume)
|
||||
if(H.dna.species.exotic_blood && H.reagents.total_volume)
|
||||
target.reagents.trans_to(src, amount)
|
||||
else
|
||||
user << "<span class='warning'>You are unable to locate any blood!</span>"
|
||||
|
||||
@@ -695,6 +695,16 @@
|
||||
construction_time = 120
|
||||
category = list("Cyborg Upgrade Modules")
|
||||
|
||||
/datum/design/borg_upgrade_selfrepair
|
||||
name = "Cyborg Upgrade (Self-repair)"
|
||||
id = "borg_upgrade_selfrepair"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/selfrepair
|
||||
req_tech = list("materials" = 4, "engineering" = 4)
|
||||
materials = list(MAT_METAL=15000, MAT_GLASS=15000)
|
||||
construction_time = 120
|
||||
category = list("Cyborg Upgrade Modules")
|
||||
|
||||
//Misc
|
||||
/datum/design/mecha_tracking
|
||||
name = "Exosuit Tracking Beacon"
|
||||
|
||||
@@ -190,31 +190,31 @@
|
||||
category = list("Ammo")
|
||||
|
||||
/datum/design/mag_oldsmg/ap_mag
|
||||
name = "Submachine Gun Armour Piercing Magazine (9mmAP)"
|
||||
name = "WT-550 Auto Gun Armour Piercing Magazine (9mmAP)"
|
||||
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle"
|
||||
id = "mag_oldsmg_ap"
|
||||
materials = list(MAT_METAL = 6000, MAG_SILVER = 200)
|
||||
materials = list(MAT_METAL = 6000, MAT_SILVER = 200)
|
||||
build_path = /obj/item/ammo_box/magazine/wt550m9/wtap
|
||||
|
||||
/datum/design/mag_oldsmg/ic_mag
|
||||
name = "Submachine Gun Incindiary Magazine (9mmIC)"
|
||||
name = "WT-550 Auto Gun Incendiary Magazine (9mmIC)"
|
||||
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle"
|
||||
id = "mag_oldsmg_ic"
|
||||
materials = list(MAT_METAL = 6000, MAG_SILVER = 200, MAT_GLASS = 800)
|
||||
materials = list(MAT_METAL = 6000, MAT_SILVER = 200, MAT_GLASS = 800)
|
||||
build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
|
||||
|
||||
/datum/design/mag_oldsmg/tx_mag
|
||||
name = "Submachine Gun Urnaium Magazine (9mmTX)"
|
||||
name = "WT-550 Auto Gun Urnaium Magazine (9mmTX)"
|
||||
desc = "A 20 round urnaium tipped magazine for the out of date security WT-550 Auto Rifle"
|
||||
id = "mag_oldsmg_tx"
|
||||
materials = list(MAT_METAL = 6000, MAG_SILVER = 400, MAG_URNAIUM = 2000)
|
||||
materials = list(MAT_METAL = 6000, MAT_SILVER = 400, MAT_URANIUM = 2000)
|
||||
build_path = /obj/item/ammo_box/magazine/wt550m9/wttx
|
||||
|
||||
//SABR Mags
|
||||
|
||||
/datum/design/mag_smg
|
||||
name = "Submachine Gun Magazine (9mm)"
|
||||
desc = "A 42-round magazine for the prototype submachine gun."
|
||||
name = "SABR SMG Magazine (9mm)"
|
||||
desc = "A 30-round magazine for the prototype submachine gun."
|
||||
id = "mag_smg"
|
||||
req_tech = list("combat" = 4, "materials" = 3)
|
||||
build_type = PROTOLATHE
|
||||
@@ -223,24 +223,24 @@
|
||||
category = list("Ammo")
|
||||
|
||||
/datum/design/mag_smg/ap_mag
|
||||
name = "Submachine Gun Armour Piercing Magazine (9mmAP)"
|
||||
desc = "A 42-round armour piercing magazine for the prototype submachine gun. Deals slightly less damage by bypasses most armour"
|
||||
name = "SABR SMG Armour Piercing Magazine (9mmAP)"
|
||||
desc = "A 30-round armour piercing magazine for the prototype submachine gun. Deals slightly less damage by bypasses most armour"
|
||||
id = "mag_smg_ap"
|
||||
materials = list(MAT_METAL = 3000, MAG_SILVER = 100)
|
||||
materials = list(MAT_METAL = 3000, MAT_SILVER = 100)
|
||||
build_path = /obj/item/ammo_box/magazine/smgm9mm/ap
|
||||
|
||||
/datum/design/mag_smg/incin_mag
|
||||
name = "Submachine Gun Incindiary Magazine (9mmIC)"
|
||||
desc = "A 42-round incindiary round magazine for the prototype submachine gun. Deals significanlty less damage but sets the target on fire"
|
||||
name = "SABR SMG Incendiary Magazine (9mmIC)"
|
||||
desc = "A 30-round incindiary round magazine for the prototype submachine gun. Deals significanlty less damage but sets the target on fire"
|
||||
id = "mag_smg_ic"
|
||||
materials = list(MAT_METAL = 3000, MAG_SILVER = 100, MAT_GLASS = 400)
|
||||
materials = list(MAT_METAL = 3000, MAT_SILVER = 100, MAT_GLASS = 400)
|
||||
build_path = /obj/item/ammo_box/magazine/smgm9mm/fire
|
||||
|
||||
/datum/design/mag_smg/incin_tox
|
||||
name = "Submachine Gun Urnaium Magazine (9mmIC)"
|
||||
desc = "A 42-round urnaium tipped round magazine for the prototype submachine gun. Deals toxin damage, but less overall damage."
|
||||
name = "SABR SMG Urnaium Magazine (9mmTX)"
|
||||
desc = "A 30-round urnaium tipped round magazine for the prototype submachine gun. Deals toxin damage, but less overall damage."
|
||||
id = "mag_smg_tx"
|
||||
materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAG_URNAIUM = 1000)
|
||||
materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAT_URANIUM = 1000)
|
||||
build_path = /obj/item/ammo_box/magazine/smgm9mm/toxin
|
||||
|
||||
/datum/design/stunshell
|
||||
|
||||
@@ -394,11 +394,10 @@
|
||||
user << "<span class='warning'>The rune fizzles uselessly! There is no spirit nearby.</span>"
|
||||
return
|
||||
var/mob/living/carbon/human/G = new /mob/living/carbon/human
|
||||
if(prob(50)) G.gender = "female"
|
||||
hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine)
|
||||
|
||||
G.set_species(/datum/species/golem/adamantine)
|
||||
G.set_cloned_appearance()
|
||||
G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
|
||||
G.real_name = "Adamantine Golem ([rand(1, 1000)])"
|
||||
G.dna.unique_enzymes = G.dna.generate_unique_enzymes()
|
||||
G.dna.species.auto_equip(G)
|
||||
G.loc = src.loc
|
||||
G.key = ghost.key
|
||||
|
||||
Reference in New Issue
Block a user