diff --git a/baystation12.dme b/baystation12.dme
index 24731e803e..bc352f8f24 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1037,15 +1037,22 @@
#include "code\modules\mob\living\carbon\human\login.dm"
#include "code\modules\mob\living\carbon\human\logout.dm"
#include "code\modules\mob\living\carbon\human\say.dm"
-#include "code\modules\mob\living\carbon\human\species.dm"
#include "code\modules\mob\living\carbon\human\unarmed_attack.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
#include "code\modules\mob\living\carbon\human\whisper.dm"
-#include "code\modules\mob\living\carbon\human\alien\alien.dm"
-#include "code\modules\mob\living\carbon\human\alien\alien_embryo.dm"
-#include "code\modules\mob\living\carbon\human\alien\alien_facehugger.dm"
-#include "code\modules\mob\living\carbon\human\alien\alien_powers.dm"
-#include "code\modules\mob\living\carbon\human\alien\alien_species.dm"
+#include "code\modules\mob\living\carbon\human\species\species.dm"
+#include "code\modules\mob\living\carbon\human\species\species_attack.dm"
+#include "code\modules\mob\living\carbon\human\species\species_hud.dm"
+#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm"
+#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm"
+#include "code\modules\mob\living\carbon\human\species\station\golem.dm"
+#include "code\modules\mob\living\carbon\human\species\station\slime.dm"
+#include "code\modules\mob\living\carbon\human\species\station\station.dm"
+#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm"
+#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_facehugger.dm"
+#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm"
+#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm"
+#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm"
#include "code\modules\mob\living\carbon\metroid\death.dm"
#include "code\modules\mob\living\carbon\metroid\emote.dm"
#include "code\modules\mob\living\carbon\metroid\examine.dm"
diff --git a/code/WorkInProgress/computer3/computers/scanconsole.dm b/code/WorkInProgress/computer3/computers/scanconsole.dm
index 3092f51fb8..446fb5c8ff 100644
--- a/code/WorkInProgress/computer3/computers/scanconsole.dm
+++ b/code/WorkInProgress/computer3/computers/scanconsole.dm
@@ -189,17 +189,10 @@
target.unique_enzymes = md5(target.real_name)
updateappearance(scanner.occupant,target.uni_identity)
domutcheck(scanner.occupant, scanner, 1)
-
- if(ishuman(scanner.occupant))
- target.mutantrace = buffer.mutantrace
- scanner.occupant:update_mutantrace()
if("se")
if(buffer.struc_enzymes)
target.struc_enzymes = buffer.struc_enzymes
domutcheck(scanner.occupant, scanner, 1)
- if(ishuman(scanner.occupant))
- target.mutantrace = buffer.mutantrace
- scanner.occupant:update_mutantrace()
if("ui")
if(buffer.uni_identity)
target.uni_identity = buffer.uni_identity
diff --git a/code/WorkInProgress/computer3/file.dm b/code/WorkInProgress/computer3/file.dm
index 849312ec50..1cbb363894 100644
--- a/code/WorkInProgress/computer3/file.dm
+++ b/code/WorkInProgress/computer3/file.dm
@@ -140,7 +140,6 @@
/datum/file/data/genome/SE
name = "Structural Enzymes"
- var/mutantrace = null
/datum/file/data/genome/UE
name = "Unique Enzymes"
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index c16aac30f7..67e7dd2948 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -22,8 +22,9 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI
//Languages/species/whitelist.
var/global/list/all_species[0]
var/global/list/all_languages[0]
-var/global/list/language_keys[0] //table of say codes for all languages
-var/global/list/whitelisted_species = list("Human")
+var/global/list/language_keys[0] // Table of say codes for all languages
+var/global/list/whitelisted_species = list("Human") // Species that require a whitelist check.
+var/global/list/playable_species = list("Human") // A list of ALL playable species, whitelisted, latejoin or otherwise.
// Posters
var/global/list/poster_designs = list()
@@ -119,6 +120,8 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
S.race_key = rkey //Used in mob icon caching.
all_species[S.name] = S
+ if(!(S.flags & IS_RESTRICTED))
+ playable_species += S.name
if(S.flags & IS_WHITELISTED)
whitelisted_species += S.name
@@ -127,7 +130,7 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
for(var/T in paths)
var/datum/poster/P = new T
poster_designs += P
-
+
return 1
/* // Uncomment to debug chemical reaction list.
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index ceaca9c3ee..e666a03653 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -268,7 +268,6 @@ client
body += ""
if(ishuman(D))
body += ""
- body += ""
body += ""
body += ""
body += ""
@@ -582,7 +581,7 @@ client
usr << "This can only be used on instances of type /mob/living/carbon/human"
return
- H.makeSkeleton()
+ H.ChangeToSkeleton()
href_list["datumrefresh"] = href_list["make_skeleton"]
else if(href_list["delall"])
@@ -744,27 +743,6 @@ client
return
holder.Topic(href, list("makeai"=href_list["makeai"]))
- else if(href_list["setmutantrace"])
- if(!check_rights(R_SPAWN)) return
-
- var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
- if(!istype(H))
- usr << "This can only be done to instances of type /mob/living/carbon/human"
- return
-
- var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow","tajaran","skrell","vox")
- switch(new_mutantrace)
- if(null)
- return
- if("NONE")
- new_mutantrace = ""
- if(!H)
- usr << "Mob doesn't exist anymore"
- return
- if(H.dna)
- H.dna.mutantrace = new_mutantrace
- H.update_mutantrace()
-
else if(href_list["setspecies"])
if(!check_rights(R_SPAWN)) return
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 32c7ef1dd6..e30de18f4e 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -80,7 +80,6 @@ var/global/list/datum/dna/gene/dna_genes[0]
// From old dna.
var/b_type = "A+" // Should probably change to an integer => string map but I'm lazy.
- var/mutantrace = null // The type of mutant race the player is, if applicable (i.e. potato-man)
var/real_name // Stores the real name of the person who originally got this dna datum. Used primarily for changelings,
// New stuff
@@ -92,7 +91,6 @@ var/global/list/datum/dna/gene/dna_genes[0]
var/datum/dna/new_dna = new()
new_dna.unique_enzymes=unique_enzymes
new_dna.b_type=b_type
- new_dna.mutantrace=mutantrace
new_dna.real_name=real_name
new_dna.species=species
for(var/b=1;b<=DNA_SE_LENGTH;b++)
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 14e1b5a30e..8157acc1a0 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -102,7 +102,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
vox.name = vox.real_name
newraider.name = vox.name
vox.age = rand(12,20)
- vox.dna.mutantrace = "vox"
vox.set_species("Vox")
vox.languages = list() // Removing language from chargen.
vox.flavor_text = ""
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index a005d0e9d4..cad72d9d96 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -8,8 +8,11 @@
anchored = 1
var/operating = 0 //Is it on?
var/dirty = 0 // Does it need cleaning?
- var/gibtime = 40 // Time from starting until meat appears
var/mob/living/occupant // Mob who has been put inside
+
+ var/gib_time = 40 // Time from starting until meat appears
+ var/gib_throw_dir // Direction to spit meat and gibs in.
+
use_power = 1
idle_power_usage = 2
active_power_usage = 500
@@ -18,31 +21,31 @@
/obj/machinery/gibber/autogibber
var/turf/input_plate
- New()
- ..()
- spawn(5)
- for(var/i in cardinal)
- var/obj/machinery/mineral/input/input_obj = locate( /obj/machinery/mineral/input, get_step(src.loc, i) )
- if(input_obj)
- if(isturf(input_obj.loc))
- input_plate = input_obj.loc
- del(input_obj)
- break
+/obj/machinery/gibber/autogibber/New()
+ ..()
+ spawn(5)
+ for(var/i in cardinal)
+ var/obj/machinery/mineral/input/input_obj = locate( /obj/machinery/mineral/input, get_step(src.loc, i) )
+ if(input_obj)
+ if(isturf(input_obj.loc))
+ input_plate = input_obj.loc
+ del(input_obj)
+ break
- if(!input_plate)
- log_misc("a [src] didn't find an input plate.")
- return
+ if(!input_plate)
+ log_misc("a [src] didn't find an input plate.")
+ return
- Bumped(var/atom/A)
- if(!input_plate) return
+/obj/machinery/gibber/autogibber/Bumped(var/atom/A)
+ if(!input_plate) return
- if(ismob(A))
- var/mob/M = A
+ if(ismob(A))
+ var/mob/M = A
- if(M.loc == input_plate
- )
- M.loc = src
- M.gib()
+ if(M.loc == input_plate
+ )
+ M.loc = src
+ M.gib()
/obj/machinery/gibber/New()
@@ -70,43 +73,70 @@
if(stat & (NOPOWER|BROKEN))
return
if(operating)
- user << "\red It's locked and running"
+ user << "The gibber is locked and running, wait for it to finish."
return
else
src.startgibbing(user)
-/obj/machinery/gibber/attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
- if(src.occupant)
- user << "\red The gibber is full, empty it first!"
+/obj/machinery/gibber/attackby(var/obj/item/W, var/mob/user)
+
+ if(istype(W,/obj/item/weapon/card/emag))
+ if(emagged)
+ user << "The gibber safety guard is already disabled."
+ return
+ user << "You disable the gibber safety guard."
+ emagged = 1
return
- if( !(istype(G, /obj/item/weapon/grab)) )
- user << "\red This item is not suitable for the gibber!"
- return
+ var/obj/item/weapon/grab/G = W
- if( !(istype(G.affecting, /mob/living/carbon)) && !(istype(G.affecting, /mob/living/simple_animal)) )
- user << "\red This item is not suitable for the gibber!"
- return
+ if(!istype(G))
+ return ..()
if(G.state < 2)
- user << "\red You need a better grip to do that!"
+ user << "You need a better grip to do that!"
return
- if(G.affecting.abiotic(1))
- user << "\red Subject may not have abiotic items on."
+ move_into_gibber(user,G.affecting)
+ // Grab() process should clean up the grab item, no need to del it.
+
+/obj/machinery/gibber/MouseDrop_T(mob/target, mob/user)
+ if(user.stat || user.restrained())
+ return
+ move_into_gibber(user,target)
+
+/obj/machinery/gibber/proc/move_into_gibber(var/mob/user,var/mob/living/victim)
+
+ if(src.occupant)
+ user << "The gibber is full, empty it first!"
return
- user.visible_message("\red [user] starts to put [G.affecting] into the gibber!")
+ if(operating)
+ user << "The gibber is locked and running, wait for it to finish."
+ return
+
+ if(!(istype(victim, /mob/living/carbon)) && !(istype(victim, /mob/living/simple_animal)) )
+ user << "This is not suitable for the gibber!"
+ return
+
+ if(istype(victim,/mob/living/carbon/human) && !emagged)
+ user << "The gibber safety guard is engaged!"
+ return
+
+
+ if(victim.abiotic(1))
+ user << "Subject may not have abiotic items on."
+ return
+
+ user.visible_message("\red [user] starts to put [victim] into the gibber!")
src.add_fingerprint(user)
- if(do_after(user, 30) && G && G.affecting && !occupant)
- user.visible_message("\red [user] stuffs [G.affecting] into the gibber!")
- var/mob/M = G.affecting
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.loc = src
- src.occupant = M
- del(G)
+ if(do_after(user, 30) && victim.Adjacent(src) && user.Adjacent(src) && victim.Adjacent(user) && !occupant)
+ user.visible_message("\red [user] stuffs [victim] into the gibber!")
+ if(victim.client)
+ victim.client.perspective = EYE_PERSPECTIVE
+ victim.client.eye = src
+ victim.loc = src
+ src.occupant = victim
update_icon()
/obj/machinery/gibber/verb/eject()
@@ -121,7 +151,7 @@
return
/obj/machinery/gibber/proc/go_out()
- if (!src.occupant)
+ if(operating || !src.occupant)
return
for(var/obj/O in src)
O.loc = src.loc
@@ -138,86 +168,62 @@
if(src.operating)
return
if(!src.occupant)
- visible_message("\red You hear a loud metallic grinding sound.")
+ visible_message("You hear a loud metallic grinding sound.")
return
use_power(1000)
- visible_message("\red You hear a loud squelchy grinding sound.")
+ visible_message("You hear a loud squelchy grinding sound.")
src.operating = 1
update_icon()
- var/totalslabs = 3
- var/obj/item/weapon/reagent_containers/food/snacks/meat/allmeat[totalslabs]
+ var/slab_name = occupant.name
+ var/slab_count = 3
+ var/slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat
+ var/slab_nutrition = src.occupant.nutrition / 15
- if( istype(src.occupant, /mob/living/carbon/human/) )
- var/sourcename = src.occupant.real_name
- var/sourcejob = src.occupant.job
- var/sourcenutriment = src.occupant.nutrition / 15
- var/sourcetotalreagents = src.occupant.reagents.total_volume
+ // Some mobs have specific meat item types.
+ if(istype(src.occupant,/mob/living/simple_animal))
+ var/mob/living/simple_animal/critter = src.occupant
+ if(critter.meat_amount)
+ slab_count = critter.meat_amount
+ if(critter.meat_type)
+ slab_type = critter.meat_type
+ else if(istype(src.occupant,/mob/living/carbon/human))
+ slab_name = src.occupant.real_name
+ slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
+ else if(istype(src.occupant, /mob/living/carbon/monkey))
+ slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey
- for(var/i=1 to totalslabs)
- var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new
- newmeat.name = sourcename + newmeat.name
- newmeat.subjectname = sourcename
- newmeat.subjectjob = sourcejob
- newmeat.reagents.add_reagent("nutriment", sourcenutriment / totalslabs) // Thehehe. Fat guys go first
- src.occupant.reagents.trans_to(newmeat, round (sourcetotalreagents / totalslabs, 1)) // Transfer all the reagents from the
- allmeat[i] = newmeat
+ // Small mobs don't give as much nutrition.
+ if(src.occupant.small)
+ slab_nutrition *= 0.5
+ slab_nutrition /= slab_count
- src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [user]/[user.ckey]" //One shall not simply gib a mob unnoticed!
- user.attack_log += "\[[time_stamp()]\] Gibbed [src.occupant]/[src.occupant.ckey]"
- msg_admin_attack("[user.name] ([user.ckey]) gibbed [src.occupant] ([src.occupant.ckey]) (JMP)")
+ for(var/i=1 to slab_count)
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/new_meat = new slab_type(get_turf(src))
+ new_meat.name = "[slab_name] [new_meat.name]"
+ new_meat.reagents.add_reagent("nutriment",slab_nutrition)
- src.occupant.death(1)
- src.occupant.ghostize()
+ if(src.occupant.reagents)
+ src.occupant.reagents.trans_to(new_meat, round(occupant.reagents.total_volume/slab_count,1))
- else if( istype(src.occupant, /mob/living/carbon/) || istype(src.occupant, /mob/living/simple_animal/ ) )
+ src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [user]/[user.ckey]" //One shall not simply gib a mob unnoticed!
+ user.attack_log += "\[[time_stamp()]\] Gibbed [src.occupant]/[src.occupant.ckey]"
+ msg_admin_attack("[user.name] ([user.ckey]) gibbed [src.occupant] ([src.occupant.ckey]) (JMP)")
- var/sourcename = src.occupant.name
- var/sourcenutriment = src.occupant.nutrition / 15
- var/sourcetotalreagents = 0
+ src.occupant.ghostize()
- if( istype(src.occupant, /mob/living/carbon/monkey/) || istype(src.occupant, /mob/living/carbon/alien/) ) // why are you gibbing aliens? oh well
- totalslabs = 3
- sourcetotalreagents = src.occupant.reagents.total_volume
- else if( istype(src.occupant, /mob/living/simple_animal/cow) || istype(src.occupant, /mob/living/simple_animal/hostile/bear) )
- totalslabs = 2
- else
- totalslabs = 1
- sourcenutriment = src.occupant.nutrition / 30 // small animals don't have as much nutrition
+ spawn(gib_time)
- for(var/i=1 to totalslabs)
- var/obj/item/weapon/reagent_containers/food/snacks/meat/newmeat = new
- newmeat.name = "[sourcename]-[newmeat.name]"
+ src.operating = 0
+ src.occupant.gib()
+ del(src.occupant)
- newmeat.reagents.add_reagent("nutriment", sourcenutriment / totalslabs)
-
- // Transfer reagents from the old mob to the meat
- if( istype(src.occupant, /mob/living/carbon/) )
- src.occupant.reagents.trans_to(newmeat, round(sourcetotalreagents / totalslabs, 1))
-
- allmeat[i] = newmeat
-
- if(src.occupant.client) // Gibbed a cow with a client in it? log that shit
- src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [user]/[user.ckey]"
- user.attack_log += "\[[time_stamp()]\] Gibbed [src.occupant]/[src.occupant.ckey]"
- msg_admin_attack("\[[time_stamp()]\] [key_name(user)] gibbed [key_name(src.occupant)]")
-
- src.occupant.death(1)
- src.occupant.ghostize()
-
- del(src.occupant)
-
- spawn(src.gibtime)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
operating = 0
- for (var/i=1 to totalslabs)
- var/obj/item/meatslab = allmeat[i]
- var/turf/Tx = locate(src.x - i, src.y, src.z)
- meatslab.loc = src.loc
- meatslab.throw_at(Tx,i,3,src)
- if (!Tx.density)
- new /obj/effect/decal/cleanable/blood/gibs(Tx,i)
- src.operating = 0
+ for (var/obj/item/thing in contents)
+ thing.loc = get_turf(thing) // Drop it onto the turf for throwing.
+ thing.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) // Being pelted with bits of meat and bone would hurt.
+
update_icon()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 62a24d714d..616ef4c6c9 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -378,7 +378,7 @@ Class Procs:
if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee))
threatcount += 2
- if(perp.dna && perp.dna.mutantrace && perp.dna.mutantrace != "none")
+ if(perp.species.name != "Human") //beepsky so racist.
threatcount += 2
if(check_records || check_arrest)
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index db7abda850..03619c1350 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -557,18 +557,9 @@ steam.start() -- spawns the effect
/obj/effect/effect/foam/Crossed(var/atom/movable/AM)
if(metal)
return
-
- if (istype(AM, /mob/living/carbon))
- var/mob/M = AM
- if (istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) || M.buckled)
- return
-
- M.stop_pulling()
- M << "\blue You slipped on the foam!"
- playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(5)
- M.Weaken(2)
-
+ if(istype(AM, /mob/living))
+ var/mob/living/M = AM
+ M.slip("the foam",6)
/datum/effect/effect/system/foam_spread
var/amount = 5 // the size of the foam spread.
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index 619935b8b2..c112e55fce 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -1,14 +1,7 @@
-/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) //CARN MARKER
- new /obj/effect/gibspawner/generic(get_turf(location),viruses,MobDNA)
-
-/proc/hgibs(atom/location, var/list/viruses, var/datum/dna/MobDNA, var/fleshcolor, var/bloodcolor)
- new /obj/effect/gibspawner/human(get_turf(location),viruses,MobDNA,fleshcolor,bloodcolor)
-
-/proc/xgibs(atom/location, var/list/viruses)
- new /obj/effect/gibspawner/xeno(get_turf(location),viruses)
-
-/proc/robogibs(atom/location, var/list/viruses)
- new /obj/effect/gibspawner/robot(get_turf(location),viruses)
+/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA, var/spawn_inside, gibber_type = /obj/effect/gibspawner/generic, var/fleshcolor, var/bloodcolor)
+ if(!spawn_inside)
+ location = get_turf(location)
+ new gibber_type(location,viruses,MobDNA,fleshcolor,bloodcolor)
/obj/effect/gibspawner
var/sparks = 0 //whether sparks spread on Gib()
@@ -67,8 +60,6 @@
gib.blood_DNA = list()
if(MobDNA)
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
- else if(istype(src, /obj/effect/gibspawner/xeno))
- gib.blood_DNA["UNKNOWN DNA"] = "X*"
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
gib.blood_DNA["Non-human DNA"] = "A+"
var/list/directions = gibdirections[i]
diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm
index 5446ba348e..b145b77ed2 100644
--- a/code/game/objects/effects/spawners/gibspawner.dm
+++ b/code/game/objects/effects/spawners/gibspawner.dm
@@ -16,15 +16,6 @@
gibamounts[6] = pick(0,1,2)
..()
- xeno
- gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up,/obj/effect/decal/cleanable/blood/gibs/xeno/down,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno/body,/obj/effect/decal/cleanable/blood/gibs/xeno/limb,/obj/effect/decal/cleanable/blood/gibs/xeno/core)
- gibamounts = list(1,1,1,1,1,1,1)
-
- New()
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
- gibamounts[6] = pick(0,1,2)
- ..()
-
robot
sparks = 1
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index b69f85af38..fcdec82edf 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -1343,21 +1343,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
..()
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
- if (istype(AM, /mob/living/carbon))
- var/mob/M = AM
- if ((istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) || M.m_intent == "walk")
- return
+ if (istype(AM, /mob/living))
+ var/mob/living/M = AM
- if ((istype(M, /mob/living/carbon/human) && (M.real_name != src.owner) && (istype(src.cartridge, /obj/item/weapon/cartridge/clown))))
- if (src.cartridge.charges < 5)
+ if(M.slip("the PDA",8) && M.real_name != src.owner && istype(src.cartridge, /obj/item/weapon/cartridge/clown))
+ if(src.cartridge.charges < 5)
src.cartridge.charges++
- M.stop_pulling()
- M << "\blue You slipped on the PDA!"
- playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(8)
- M.Weaken(5)
-
/obj/item/device/pda/proc/available_pdas()
var/list/names = list()
var/list/plist = list()
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index afd33fdf08..0203bf0846 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -102,6 +102,7 @@
/obj/machinery/door,
/obj/machinery/telecomms,
/obj/machinery/mecha_part_fabricator,
+ /obj/machinery/gibber,
/obj/vehicle
)
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index fe6e94ad07..656197fee0 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -9,31 +9,16 @@
* Banana Peals
*/
/obj/item/weapon/bananapeel/Crossed(AM as mob|obj)
- if (istype(AM, /mob/living/carbon))
- var/mob/M = AM
- if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled)
- return
-
- M.stop_pulling()
- M << "\blue You slipped on the [name]!"
- playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(4)
- M.Weaken(2)
-
+ if (istype(AM, /mob/living))
+ var/mob/living/M = AM
+ M.slip("the [src.name]",4)
/*
* Soap
*/
/obj/item/weapon/soap/Crossed(AM as mob|obj) //EXACTLY the same as bananapeel for now, so it makes sense to put it in the same dm -- Urist
- if (istype(AM, /mob/living/carbon))
- var/mob/M = AM
- if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled)
- return
-
- M.stop_pulling()
- M << "\blue You slipped on the [name]!"
- playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(3)
- M.Weaken(2)
+ if (istype(AM, /mob/living))
+ var/mob/living/M = AM
+ M.slip("the [src.name]",3)
/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity)
if(!proximity) return
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 42a63f26e5..8f66524076 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -79,66 +79,29 @@
noslip = 1
if (noslip)
return // no slipping while sitting in a chair, plz
- switch (src.wet)
- if(1)
- if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes
- if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP))
- M.stop_pulling()
- step(M, M.dir)
- M << "\blue You slipped on the wet floor!"
- playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(5)
- M.Weaken(3)
- else
- M.inertia_dir = 0
- return
- else if(!istype(M, /mob/living/carbon/slime))
- if (M.m_intent == "run")
- M.stop_pulling()
- step(M, M.dir)
- M << "\blue You slipped on the wet floor!"
- playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
- M.Stun(5)
- M.Weaken(3)
- else
- M.inertia_dir = 0
- return
- if(2) //lube //can cause infinite loops - needs work
- if(!istype(M, /mob/living/carbon/slime) && !M.buckled)
- M.stop_pulling()
+ if(src.wet)
+ var/slip_dist = 1
+ var/slip_stun = 6
+ var/floor_type = "wet"
+
+ switch(src.wet)
+ if(2) // Lube
+ floor_type = "slippery"
+ slip_dist = 4
+ slip_stun = 10
+ if(3) // Ice
+ floor_type = "icy"
+ slip_stun = 4
+
+ if(M.slip("the [floor_type] floor",slip_stun))
+ for(var/i = 0;i
"
dat += "Language: [current_species.language] "
dat += ""
+ if(current_species.flags & CAN_JOIN)
+ dat += "Often present on human stations."
if(current_species.flags & IS_WHITELISTED)
dat += "Whitelist restricted."
if(current_species.flags & NO_BLOOD)
@@ -632,14 +634,20 @@ datum/preferences
dat += ""
dat += "
"
- var/restricted
+ var/restricted = 0
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
- if((current_species.flags & IS_WHITELISTED) && !is_alien_whitelisted(user,current_species))
+ if(!(current_species.flags & CAN_JOIN))
+ restricted = 2
+ else if((current_species.flags & IS_WHITELISTED) && !is_alien_whitelisted(user,current_species))
restricted = 1
- if(restricted)
- dat += "You cannot play as this species.If you wish to be whitelisted, you can make an application post on the forums."
- else
- dat += "\[select\]"
+
+ if(restricted && !check_rights(R_ADMIN, 0))
+ if(restricted == 1)
+ dat += "You cannot play as this species.If you wish to be whitelisted, you can make an application post on the forums."
+ else if(restricted == 2)
+ dat += "You cannot play as this species.This species is not available for play as a station race.."
+ else
+ dat += "\[select\]"
dat += "