diff --git a/baystation12.dme b/baystation12.dme
index d771304cc6b..528a42cfd82 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -5,65 +5,6 @@
// END_INTERNALS
// BEGIN_FILE_DIR
#define FILE_DIR .
-#define FILE_DIR "code"
-#define FILE_DIR "code/TriDimension"
-#define FILE_DIR "code/WorkInProgress"
-#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
-#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Jungle"
-#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
-#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/ShieldGen"
-#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
-#define FILE_DIR "code/WorkInProgress/Susan"
-#define FILE_DIR "html"
-#define FILE_DIR "icons"
-#define FILE_DIR "icons/48x48"
-#define FILE_DIR "icons/ass"
-#define FILE_DIR "icons/effects"
-#define FILE_DIR "icons/mecha"
-#define FILE_DIR "icons/misc"
-#define FILE_DIR "icons/mob"
-#define FILE_DIR "icons/mob/human_races"
-#define FILE_DIR "icons/mob/otherHuman"
-#define FILE_DIR "icons/NTOS"
-#define FILE_DIR "icons/obj"
-#define FILE_DIR "icons/obj/assemblies"
-#define FILE_DIR "icons/obj/atmospherics"
-#define FILE_DIR "icons/obj/clothing"
-#define FILE_DIR "icons/obj/doors"
-#define FILE_DIR "icons/obj/flora"
-#define FILE_DIR "icons/obj/machines"
-#define FILE_DIR "icons/obj/pipes"
-#define FILE_DIR "icons/obj/power_cond"
-#define FILE_DIR "icons/pda_icons"
-#define FILE_DIR "icons/pods"
-#define FILE_DIR "icons/spideros_icons"
-#define FILE_DIR "icons/stamp_icons"
-#define FILE_DIR "icons/Testing"
-#define FILE_DIR "icons/turf"
-#define FILE_DIR "icons/vending_icons"
-#define FILE_DIR "nano"
-#define FILE_DIR "nano/images"
-#define FILE_DIR "sound"
-#define FILE_DIR "sound/AI"
-#define FILE_DIR "sound/ambience"
-#define FILE_DIR "sound/effects"
-#define FILE_DIR "sound/effects/turret"
-#define FILE_DIR "sound/effects/wind"
-#define FILE_DIR "sound/hallucinations"
-#define FILE_DIR "sound/items"
-#define FILE_DIR "sound/machines"
-#define FILE_DIR "sound/mecha"
-#define FILE_DIR "sound/misc"
-#define FILE_DIR "sound/music"
-#define FILE_DIR "sound/piano"
-#define FILE_DIR "sound/turntable"
-#define FILE_DIR "sound/violin"
-#define FILE_DIR "sound/voice"
-#define FILE_DIR "sound/voice/complionator"
-#define FILE_DIR "sound/voice/Serithi"
-#define FILE_DIR "sound/vox"
-#define FILE_DIR "sound/vox_fem"
-#define FILE_DIR "sound/weapons"
// END_FILE_DIR
// BEGIN_PREFERENCES
#define DEBUG
@@ -919,10 +860,10 @@
#include "code\modules\customitems\item_spawning.dm"
#include "code\modules\customitems\definitions\base.dm"
#include "code\modules\destilery\main.dm"
-#include "code\modules\DetectiveWork\detective_work.dm"
-#include "code\modules\DetectiveWork\evidence.dm"
-#include "code\modules\DetectiveWork\footprints_and_rag.dm"
-#include "code\modules\DetectiveWork\scanner.dm"
+#include "code\modules\detectivework\detective_work.dm"
+#include "code\modules\detectivework\evidence.dm"
+#include "code\modules\detectivework\footprints_and_rag.dm"
+#include "code\modules\detectivework\scanner.dm"
#include "code\modules\economy\Accounts.dm"
#include "code\modules\economy\Accounts_DB.dm"
#include "code\modules\economy\ATM.dm"
diff --git a/code/WorkInProgress/ZomgPonies/mobs/metroid/powers.dm b/code/WorkInProgress/ZomgPonies/mobs/metroid/powers.dm
index 6c32146a234..cb123bb4323 100644
--- a/code/WorkInProgress/ZomgPonies/mobs/metroid/powers.dm
+++ b/code/WorkInProgress/ZomgPonies/mobs/metroid/powers.dm
@@ -14,7 +14,7 @@
if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C))
choices += C
- var/mob/living/carbon/M = input(src,"Who do you wish to feed on?") in null|choices
+ var/mob/living/carbon/M = pick(choices)
if(!M) return
if(Adjacent(M))
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index bc573f19c30..851cf505817 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -252,6 +252,9 @@
if ("mentors")
config.mods_are_mentors = 1
+ if ("mentors")
+ config.mods_are_mentors = 1
+
if("allow_admin_ooccolor")
config.allow_admin_ooccolor = 1
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 32bc87cd5bb..d5a56d5baf8 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -347,7 +347,43 @@ its easier to just keep the beam vertical.
var/full_print = md5(H.dna.uni_identity)
// Add the fingerprints
- fingerprints[full_print] = full_print
+ //
+ if(fingerprints[full_print])
+ switch(stringpercent(fingerprints[full_print])) //tells us how many stars are in the current prints.
+
+ if(28 to 32)
+ if(prob(1))
+ fingerprints[full_print] = full_print // You rolled a one buddy.
+ else
+ fingerprints[full_print] = stars(full_print, rand(0,40)) // 24 to 32
+
+ if(24 to 27)
+ if(prob(3))
+ fingerprints[full_print] = full_print //Sucks to be you.
+ else
+ fingerprints[full_print] = stars(full_print, rand(15, 55)) // 20 to 29
+
+ if(20 to 23)
+ if(prob(5))
+ fingerprints[full_print] = full_print //Had a good run didn't ya.
+ else
+ fingerprints[full_print] = stars(full_print, rand(30, 70)) // 15 to 25
+
+ if(16 to 19)
+ if(prob(5))
+ fingerprints[full_print] = full_print //Welp.
+ else
+ fingerprints[full_print] = stars(full_print, rand(40, 100)) // 0 to 21
+
+ if(0 to 15)
+ if(prob(5))
+ fingerprints[full_print] = stars(full_print, rand(0,50)) // small chance you can smudge.
+ else
+ fingerprints[full_print] = full_print
+
+ else
+ fingerprints[full_print] = stars(full_print, rand(0, 20)) //Initial touch, not leaving much evidence the first time.
+
return 1
else
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index abbfd884b80..b22aee7eadf 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -208,6 +208,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
var/list/absorbed_dna = list()
+ var/list/absorbed_species = list()
+ var/list/absorbed_languages = list()
var/absorbedcount = 0
var/chem_charges = 20
var/chem_recharge_rate = 0.5
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 539ef55529b..8eb8199e4f8 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -1,5 +1,6 @@
//Restores our verbs. It will only restore verbs allowed during lesser (monkey) form if we are not human
/mob/proc/make_changeling()
+
if(!mind) return
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
if(!ishuman(src) && !ismonkey(src)) return
@@ -24,6 +25,15 @@
src.verbs += P.verbpath
mind.changeling.absorbed_dna |= dna
+
+ var/mob/living/carbon/human/H = src
+ if(istype(H))
+ mind.changeling.absorbed_species += H.species.name
+
+ for(var/language in languages)
+ if(!(language in mind.changeling.absorbed_languages))
+ mind.changeling.absorbed_languages += language
+
return 1
//removes our changeling verbs
@@ -64,6 +74,54 @@
return changeling
+//Used to dump the languages from the changeling datum into the actual mob.
+/mob/proc/changeling_update_languages(var/updated_languages)
+
+ languages = list()
+ for(var/language in updated_languages)
+ languages += language
+
+ return
+
+//Used to switch species based on the changeling datum.
+/mob/proc/changeling_change_species()
+
+ set category = "Changeling"
+ set name = "Change Species (5)"
+
+ var/mob/living/carbon/human/H = src
+ if(!istype(H))
+ src << "We may only use this power while in humanoid form."
+ return
+
+ var/datum/changeling/changeling = changeling_power(5,1,0)
+ if(!changeling) return
+
+ if(changeling.absorbed_species.len < 2)
+ src << "We do not know of any other species genomes to use."
+ return
+
+ var/S = input("Select the target species: ", "Target Species", null) as null|anything in changeling.absorbed_species
+ if(!S) return
+
+ domutcheck(src, null)
+
+ changeling.chem_charges -= 5
+ changeling.geneticdamage = 30
+
+ src.visible_message("[src] transforms!")
+
+ src.verbs -= /mob/proc/changeling_change_species
+ spawn(10) src.verbs += /mob/proc/changeling_change_species
+
+ H.set_species(S)
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ feedback_add_details("changeling_powers","TR")
+
+ return 1
+
//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
//Doesn't cost anything as it's the most basic ability.
/mob/proc/changeling_absorb_dna()
@@ -83,6 +141,9 @@
src << "[T] is not compatible with our biology."
return
+ if(T.species.flags & NO_SCAN)
+ src << "We do not know how to parse this creature's DNA!"
+ return
if((M_NOCLONE || SKELETON) in T.mutations)
src << "This creature's DNA is ruined beyond useability!"
@@ -130,21 +191,35 @@
changeling.chem_charges += 10
changeling.geneticpoints += 2
- if(T.mind)
- T.mind.show_memory(src, 0) //I can read your mind, kekeke. Output all their notes.
- if(T.mind.changeling)
- if(T.mind.changeling.absorbed_dna)
- for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
- if(dna_data in changeling.absorbed_dna)
- continue
- changeling.absorbed_dna += dna_data
- changeling.absorbedcount++
- T.mind.changeling.absorbed_dna.len = 1
+ //Steal all of their languages!
+ for(var/language in T.languages)
+ if(!(language in changeling.absorbed_languages))
+ changeling.absorbed_languages += language
- if(T.mind.changeling.purchasedpowers)
- for(var/datum/power/changeling/Tp in T.mind.changeling.purchasedpowers)
- if(Tp in changeling.purchasedpowers)
- continue
+ changeling_update_languages(changeling.absorbed_languages)
+
+ //Steal their species!
+ if(T.species && !(T.species.name in changeling.absorbed_species))
+ changeling.absorbed_species += T.species.name
+
+ if(T.mind && T.mind.changeling)
+ if(T.mind.changeling.absorbed_dna)
+ for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
+ if(dna_data in changeling.absorbed_dna)
+ continue
+ changeling.absorbed_dna += dna_data
+ changeling.absorbedcount++
+ T.mind.changeling.absorbed_dna.len = 1
+
+ if(T.mind.changeling.purchasedpowers)
+ for(var/datum/power/changeling/Tp in T.mind.changeling.purchasedpowers)
+ if(Tp in changeling.purchasedpowers)
+ continue
+ else
+ changeling.purchasedpowers += Tp
+
+ if(!Tp.isVerb)
+ call(Tp.verbpath)()
else
changeling.purchasedpowers += Tp
@@ -265,6 +340,8 @@
O.make_changeling(1)
O.verbs += /mob/proc/changeling_lesser_transform
+ O.changeling_update_languages(changeling.absorbed_languages)
+
feedback_add_details("changeling_powers","LF")
del(C)
return 1
@@ -349,6 +426,7 @@
C.mind.transfer_to(O)
O.make_changeling()
+ O.changeling_update_languages(changeling.absorbed_languages)
feedback_add_details("changeling_powers","LFT")
del(C)
@@ -379,7 +457,7 @@
if(changeling_power(20,1,100,DEAD))
// charge the changeling chemical cost for stasis
changeling.chem_charges -= 20
-
+
// shut down various types of badness
C.setToxLoss(0)
C.setOxyLoss(0)
@@ -388,7 +466,7 @@
C.SetParalysis(0)
C.SetStunned(0)
C.SetWeakened(0)
-
+
// shut down ongoing problems
C.radiation = 0
C.nutrition = 400
@@ -396,59 +474,59 @@
C.sdisabilities = 0
C.disabilities = 0
C.blinded = 0
-
+
// fix blindness and deafness
C.eye_blind = 0
C.eye_blurry = 0
C.ear_deaf = 0
C.ear_damage = 0
-
+
// head actual damage numbers
C.heal_overall_damage(1000, 1000)
-
+
// get rid of the reagents
C.reagents.clear_reagents()
-
+
// cure diseases
for(var/datum/disease/D in viruses)
D.cure(0)
-
+
// fix all the organs
C.restore_all_organs()
-
+
// restore blood
if(ishuman(C))
var/mob/living/carbon/human/human_mob = C
human_mob.restore_blood()
-
+
// remove the character from the list of the dead
if(C.stat == 2)
dead_mob_list -= src
living_mob_list += src
-
+
// make us conscious again
C.stat = CONSCIOUS
-
+
// remove the time of death
C.tod = null
-
+
// fix all the icons
C.regenerate_icons()
-
+
// remove our fake death flag
C.status_flags &= ~(FAKEDEATH)
-
+
// let us move again
C.update_canmove()
-
+
// re-add out changeling powers
- C.make_changeling()
-
+ C.make_changeling()
+
// sending display messages
C << "We have regenerated."
C.visible_message("[src] appears to wake from the dead, having healed all wounds.")
-
-
+
+
feedback_add_details("changeling_powers","FD")
return 1
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 099d805c056..68458760855 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -26,6 +26,12 @@ var/list/datum/power/changeling/powerinstances = list()
genomecost = 0
verbpath = /mob/proc/changeling_transform
+/datum/power/changeling/change_species
+ name = "Change Species"
+ desc = "We take on the apperance of a species that we have absorbed."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_change_species
+
/datum/power/changeling/fakedeath
name = "Regenerative Stasis"
desc = "We become weakened to a death-like state, where we will rise again from death."
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 5c61d2cf226..467c42b33d8 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -164,6 +164,7 @@
/obj/machinery/body_scanconsole
var/obj/machinery/bodyscanner/connected
+ var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking)
var/delete
var/temphtml
name = "Body Scanner Console"
@@ -281,6 +282,7 @@
dat += ""
for(var/datum/organ/external/e in occupant.organs)
+
dat += "
"
var/AN = ""
var/open = ""
@@ -306,8 +308,16 @@
robot = "Prosthetic:"
if(e.open)
open = "Open:"
- if(e.implants.len)
- imp = "Unknown body present:"
+
+ var/unknown_body = 0
+ for(var/I in e.implants)
+ if(is_type_in_list(I,known_implants))
+ imp += "[I] implanted:"
+ else
+ unknown_body++
+
+ if(unknown_body || e.hidden)
+ imp += "Unknown body present:"
if(!AN && !open && !infected & !imp)
AN = "None:"
if(!(e.status & ORGAN_DESTROYED))
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 97bd65f820a..4630fe8253b 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -344,30 +344,35 @@
if(mineral == "diamond")
return
- overlays = list()
var/obj/effect/overlay/O = new/obj/effect/overlay( src )
- O.name = "thermite"
+ O.name = "Thermite"
O.desc = "Looks hot."
O.icon = 'icons/effects/fire.dmi'
O.icon_state = "2"
O.anchored = 1
- O.opacity = 1
O.density = 1
O.layer = 5
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ src.ChangeTurf(/turf/simulated/floor/plating)
- if(thermite >= 50)
- var/turf/simulated/floor/F = ChangeTurf(/turf/simulated/floor/plating)
- F.burn_tile()
- F.icon_state = "wall_thermite"
- F.add_hiddenprint(user)
- spawn(max(100,300-thermite))
- if(O) qdel(O)
- else
- thermite = 0
- spawn(50)
- if(O) qdel(O)
+ var/turf/simulated/floor/F = src
+ if(!F)
+ if(O)
+ message_admins("[user.real_name] ([formatPlayerPanel(user,user.ckey)]) thermited a wall into space at [formatJumpTo(loc)]!")
+ del(O)
+ user << "The thermite melts through the wall."
+ return
+ F.burn_tile()
+ F.icon_state = "wall_thermite"
+ user << "The thermite melts through the wall."
+
+ var/pdiff=performWallPressureCheck(src.loc)
+ if(pdiff)
+ message_admins("[user.real_name] ([formatPlayerPanel(user,user.ckey)]) thermited a wall with a pdiff of [pdiff] at [formatJumpTo(loc)]!")
+
+ spawn(100)
+ if(O) del(O)
+// F.sd_LumReset() //TODO: ~Carn
return
/turf/simulated/wall/meteorhit(obj/M as obj)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index ab75c250ba9..571871cd7a0 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -234,6 +234,7 @@ var/list/admin_verbs_mod = list(
/client/proc/player_panel_new
)
+
var/list/admin_verbs_mentor = list(
/client/proc/cmd_admin_pm_context,
/client/proc/cmd_admin_pm_panel,
@@ -241,7 +242,7 @@ var/list/admin_verbs_mentor = list(
/client/proc/admin_ghost,
/client/proc/cmd_mod_say,
/datum/admins/proc/show_player_info,
- /client/proc/dsay,
+// /client/proc/dsay,
/client/proc/cmd_admin_subtle_message
)
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index 3d9ab9dffee..11c595d91b1 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -22,7 +22,7 @@
set name = "Msay"
set hidden = 1
- if(!check_rights(R_ADMIN|R_MOD)) return
+ if(!check_rights(R_ADMIN|R_MOD|R_MENTOR)) return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
log_admin("MOD: [key_name(src)] : [msg]")
@@ -32,6 +32,10 @@
var/color = "mod"
if (check_rights(R_ADMIN,0))
color = "adminmod"
+
+ var/channel = "MOD:"
+ if(config.mods_are_mentors)
+ channel = "MENTOR:"
for(var/client/C in admins)
- if((R_ADMIN|R_MOD) & C.holder.rights)
- C << "MOD: [key_name(src,1)] (JMP): [msg]"
+ if((R_ADMIN|R_MOD|R_MENTOR) & C.holder.rights)
+ C << "[channel] [key_name(src,1)] (JMP): [msg]"
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index 7176767fae9..5f653302b35 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -18,13 +18,25 @@
if (src.handle_spam_prevention(msg,MUTE_DEADCHAT))
return
+
+ var/stafftype = null
+
+ if (src.holder.rights & R_MOD)
+ stafftype = "MOD"
+
+ if (src.holder.rights & R_MENTOR)
+ stafftype = "MENTOR"
+
+ if (src.holder.rights & R_ADMIN)
+ stafftype = "ADMIN"
+
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
log_admin("[key_name(src)] : [msg]")
if (!msg)
return
- var/rendered = "DEAD: ADMIN says, \"[msg]\""
+ var/rendered = "DEAD: [stafftype] says, \"[msg]\""
for (var/mob/M in player_list)
if (istype(M, /mob/new_player))
@@ -36,4 +48,4 @@
else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to regular ghosts who have deadchat toggled on
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!
\ No newline at end of file
+ feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 48806371bf6..92d07c19652 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -124,10 +124,10 @@ var/const/MAX_ACTIVE_TIME = 400
var/list/choices = list()
for(var/mob/living/L in view(1,src))
- if(L.stat != 2 && src.Adjacent(L))
+ if(L.stat != 2 && !istype(L,/mob/living/carbon/alien) && src.Adjacent(L))
choices += L
- var/mob/living/M = input(src,"Who do you wish to infest?") in null|choices
+ var/mob/living/M = pick(choices)
if(!M || !src) return
@@ -235,4 +235,84 @@ var/const/MAX_ACTIVE_TIME = 400
/mob/living/carbon/alien/facehugger/death(gibbed)
icon_state = icon_dead
- return ..(gibbed)
\ No newline at end of file
+ return ..(gibbed)
+
+/mob/living/carbon/alien/facehugger/Life()
+ ..()
+ //Status updates, death etc.
+ handle_regular_status_updates()
+
+/mob/living/carbon/alien/facehugger/proc/handle_regular_status_updates()
+ updatehealth()
+
+ if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
+ blinded = 1
+ silent = 0
+ else //ALIVE. LIGHTS ARE ON
+ if(health < -5 || brain_op_stage == 4.0)
+ death()
+ blinded = 1
+ silent = 0
+ return 1
+
+ //UNCONSCIOUS. NO-ONE IS HOME
+ if( (getOxyLoss() > 5) || (0 > health) )
+ //if( health <= 20 && prob(1) )
+ // spawn(0)
+ // emote("gasp")
+ if(!reagents.has_reagent("inaprovaline"))
+ adjustOxyLoss(1)
+ Paralyse(3)
+
+ if(paralysis)
+ AdjustParalysis(-2)
+ blinded = 1
+ stat = UNCONSCIOUS
+ else if(sleeping)
+ sleeping = max(sleeping-1, 0)
+ blinded = 1
+ stat = UNCONSCIOUS
+ if( prob(10) && health )
+ spawn(0)
+ emote("hiss_")
+ //CONSCIOUS
+ else
+ stat = CONSCIOUS
+
+ /* What in the living hell is this?*/
+ if(move_delay_add > 0)
+ move_delay_add = max(0, move_delay_add - rand(1, 2))
+
+ //Eyes
+ if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
+ blinded = 1
+ else if(eye_blind) //blindness, heals slowly over time
+ eye_blind = max(eye_blind-1,0)
+ blinded = 1
+ else if(eye_blurry) //blurry eyes heal slowly
+ eye_blurry = max(eye_blurry-1, 0)
+
+ //Ears
+ if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own
+ ear_deaf = max(ear_deaf, 1)
+ else if(ear_deaf) //deafness, heals slowly over time
+ ear_deaf = max(ear_deaf-1, 0)
+ else if(ear_damage < 5) //ear damage heals slowly under this threshold.
+ ear_damage = max(ear_damage-0.05, 0)
+
+ //Other
+ if(stunned)
+ AdjustStunned(-1)
+
+ if(weakened)
+ weakened = max(weakened-1,0) //before you get mad Rockdtben: I done this so update_canmove isn't called multiple times
+
+ if(stuttering)
+ stuttering = max(stuttering-1, 0)
+
+ if(silent)
+ silent = max(silent-1, 0)
+
+ if(druggy)
+ druggy = max(druggy-1, 0)
+ return 1
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 1298118a985..f6b8cfd587a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1333,9 +1333,6 @@
else
see_invisible = SEE_INVISIBLE_LIVING
- if(species.name=="Slime People")
- dna.mutantrace = "slime"
-
if(species.default_mutations.len>0 || species.default_blocks.len>0)
do_deferred_species_setup=1
diff --git a/code/modules/mob/living/carbon/monkey/diona.dm b/code/modules/mob/living/carbon/monkey/diona.dm
index 4f1233515ee..dc2911cfcad 100644
--- a/code/modules/mob/living/carbon/monkey/diona.dm
+++ b/code/modules/mob/living/carbon/monkey/diona.dm
@@ -20,21 +20,21 @@
..()
processing_objects.Add(src)
-/obj/item/weapon/holder/Destroy()
- //Hopefully this will stop the icon from remaining on human mobs.
- if(istype(loc,/mob/living))
- var/mob/living/A = src.loc
- src.loc = null
- A.update_icons()
+/obj/item/weapon/holder/Del()
processing_objects.Remove(src)
..()
/obj/item/weapon/holder/process()
- if(!loc) del(src)
if(istype(loc,/turf) || !(contents.len))
+
for(var/mob/M in contents)
- M.loc = get_turf(src)
+
+ var/atom/movable/mob_container
+ mob_container = M
+ mob_container.forceMove(get_turf(src))
+ M.reset_view()
+
del(src)
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -199,8 +199,9 @@
return
src.split()
- src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark and twigs!","\red You begin to shift and quiver, then erupt in a shower of shed bark and twigs, attaining your adult form!")
- var/mob/living/carbon/human/diona/adult = new(loc)
+ src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.")
+
+ var/mob/living/carbon/human/diona/adult = new(get_turf(src.loc))
adult.set_species("Diona")
if(istype(loc,/obj/item/weapon/holder/diona))
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index 9c73a8719db..dfa92ace514 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -234,15 +234,18 @@
path = /mob/living/carbon/human/slime
primitive = /mob/living/carbon/slime/adult
- flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS
+ flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN
bloodflags = BLOOD_SLIME
bodyflags = FEET_NOSLIP
abilities = list(/mob/living/carbon/human/slime/proc/slimepeople_ventcrawl)
/datum/species/slime/handle_post_spawn(var/mob/living/carbon/human/H)
+ H.dna = new /datum/dna(null)
+ H.dna.species=H.species.name
H.dna.mutantrace = "slime"
H.update_mutantrace()
+ return ..()
/datum/species/grey // /vg/
name = "Grey"
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 2381f9741a8..bb3f1af8f61 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -451,9 +451,14 @@
//Getting out of someone's inventory.
if(istype(src.loc,/obj/item/weapon/holder))
- var/obj/item/weapon/holder/H = src.loc
- src.loc = get_turf(src.loc)
- del(H)
+ var/obj/item/weapon/holder/H = src.loc //Get our item holder.
+ var/mob/M = H.loc //Get our mob holder (if any).
+
+ if(istype(M))
+ M.drop_from_inventory(H)
+ M << "[H] wriggles out of your grip!"
+ src << "You wriggle out of [M]'s grip!"
+
return
//Resisting control by an alien mind.
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index 94a14d11c90..0198b881f5e 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -132,7 +132,8 @@
icon_state = "working"
construction_time = 200
construction_cost = list("metal"=5000)
-
+ var/brute = 0
+ var/burn = 0
/obj/item/robot_parts/robot_component/binary_communication_device
@@ -158,3 +159,4 @@
/obj/item/robot_parts/robot_component/radio
name = "radio"
icon_state = "radio"
+
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index d4fb5431fa7..5249c4c95a4 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -142,7 +142,7 @@
var/datum/robot_component/cell_component = components["power cell"]
cell_component.wrapped = cell
cell_component.installed = 1
-
+
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100")
hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
@@ -151,9 +151,9 @@
hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
-
-
+
+
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100")
@@ -619,6 +619,14 @@
user.drop_item()
W.loc = null
+ var/obj/item/robot_parts/robot_component/WC = W
+ if(istype(WC))
+ C.brute_damage = WC.brute
+ C.electronics_damage = WC.burn
+ else //This will nominally mean that removing and replacing a power cell will repair the mount, but I don't care at this point. ~Z
+ C.brute_damage = 0
+ C.electronics_damage = 0
+
usr << "\blue You install the [W.name]."
return
@@ -682,8 +690,12 @@
if(!remove)
return
var/datum/robot_component/C = components[remove]
- var/obj/item/I = C.wrapped
+ var/obj/item/robot_parts/robot_component/I = C.wrapped
user << "You remove \the [I]."
+ if(istype(I))
+ I.brute = C.brute_damage
+ I.burn = C.electronics_damage
+
I.loc = src.loc
if(C.installed == 1)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index e07a1975004..ba8e18c65d0 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -113,8 +113,17 @@
return 1
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
- if(!Proj.nodamage) adjustBruteLoss(Proj.damage)
+
+
+ if(!Proj.nodamage)
+ switch(Proj.damage_type)
+ if(BRUTE)
+ adjustBruteLoss(Proj.damage)
+ if(BURN)
+ adjustFireLoss(Proj.damage)
+
Proj.on_hit(src,2)
+
return 2
/mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0)
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index c952d0735d3..a2beecbbecb 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -1,4 +1,3 @@
-
//
// Gravity Generator
//
@@ -139,7 +138,10 @@ var/const/GRAV_NEEDS_WRENCH = 3
var/obj/machinery/gravity_generator/part/part = new(T)
if(count == 5) // Middle
middle = part
- part.sprite_number = count;
+ if(count <= 3) // Their sprite is the top part of the generator
+ part.density = 0
+ part.layer = MOB_LAYER + 0.1
+ part.sprite_number = count
part.main_part = src
parts += part
part.update_icon()
@@ -316,7 +318,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
charge_count -= 2
if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging.
- playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1)
+ playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1)
updateDialog()
if(prob(25)) // To help stop "Your clothes feel warm" spam.
@@ -354,7 +356,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
var/turf/their_turf = get_turf(M)
if(M.client && their_turf.z == our_turf.z)
shake_camera(M, 15, 1)
- M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5)
+ M.playsound_local(our_turf, 'sound/machines/signal.ogg', 100)
/obj/machinery/gravity_generator/main/proc/gravity_in_level()
var/turf/T = get_turf(src)
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 2e76ee01857..62bf3c9a554 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -44,7 +44,7 @@ obj/item/weapon/gun/energy/laser/retro
if(charge_tick < 4) return 0
charge_tick = 0
if(!power_supply) return 0
- power_supply.give(100)
+ power_supply.give(1000)
update_icon()
return 1
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index f45407d5c53..866aa1c7221 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -1122,14 +1122,11 @@ datum
reaction_turf(var/turf/T, var/volume)
src = null
- if(volume >= 1 && istype(T, /turf/simulated/wall))
- var/turf/simulated/wall/Wall = T
- if(istype(Wall, /turf/simulated/wall/r_wall))
- Wall.thermite = Wall.thermite+(volume*2.5)
- else
- Wall.thermite = Wall.thermite+(volume*10)
- Wall.overlays = list()
- Wall.overlays += image('icons/effects/effects.dmi',"thermite")
+ if(volume >= 5)
+ if(istype(T, /turf/simulated/wall))
+ T:thermite = 1
+ T.overlays.Cut()
+ T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
return
on_mob_life(var/mob/living/M as mob)
diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm
index 99d443306ed..44eddb312ef 100644
--- a/code/modules/surgery/ribcage.dm
+++ b/code/modules/surgery/ribcage.dm
@@ -181,6 +181,7 @@
for(var/mob/living/carbon/alien/embryo/A in target)
A.loc = A.loc.loc
+ A.death()
//////////////////////////////////////////////////////////////////
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 25fb9fb5a39..9bb27fef02c 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/human_races/r_diona.dmi b/icons/mob/human_races/r_diona.dmi
index c07e7088f9e..c09acaa9538 100644
Binary files a/icons/mob/human_races/r_diona.dmi and b/icons/mob/human_races/r_diona.dmi differ