diff --git a/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm b/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm
index 4ebc9469da3..dbfa94043ec 100644
--- a/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm
+++ b/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm
@@ -83,7 +83,7 @@
shuttle_status = "Standing-by at station."
else
shuttle_status = "Standing-by at offsite location."
- if(WAIT_LAUNCH)
+ if(WAIT_LAUNCH, FORCE_LAUNCH)
shuttle_status = "Shuttle has recieved command and will depart shortly."
if(WAIT_ARRIVE)
shuttle_status = "Proceeding to destination."
diff --git a/code/WorkInProgress/computer3/component.dm b/code/WorkInProgress/computer3/component.dm
index 18cf2de1c76..f484e04c645 100644
--- a/code/WorkInProgress/computer3/component.dm
+++ b/code/WorkInProgress/computer3/component.dm
@@ -215,9 +215,12 @@
if(reader)
reader.loc = loc
if(istype(L) && !L.get_active_hand())
- L.put_in_hands(reader)
+ if(istype(L,/mob/living/carbon/human))
+ L.put_in_hands(reader)
+ else
+ reader.loc = get_turf(computer)
else
- reader.loc = computer.loc
+ reader.loc = get_turf(computer)
reader = null
return 1
return 0
@@ -226,16 +229,16 @@
if(writer && dualslot)
writer.loc = loc
if(istype(L) && !L.get_active_hand())
- L.put_in_hands(writer)
+ if(istype(L,/mob/living/carbon/human))
+ L.put_in_hands(writer)
+ else
+ writer.loc = get_turf(computer)
else
- writer.loc = computer.loc
+ writer.loc = get_turf(computer)
writer = null
return 1
return 0
-
-
-
// Authorizes the user based on the computer's requirements
proc/authenticate()
return computer.check_access(reader)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index e69ed4b5ddd..3df48454de7 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -794,6 +794,9 @@ client
var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages
+ if(!new_language)
+ return
+
if(!H)
usr << "Mob doesn't exist anymore"
return
@@ -817,6 +820,9 @@ client
var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages
+ if(!rem_language)
+ return
+
if(!H)
usr << "Mob doesn't exist anymore"
return
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 6de75c2b9df..79074cfbe68 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -634,4 +634,4 @@
icon = 'icons/obj/stock_parts.dmi'
icon_state = "capacitor"
desc = "A debug item for research."
- origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8"
+ origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8;phorontech=8;engineering=8"
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 0309eccee0b..d353c77ad06 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -457,7 +457,7 @@
changeling.chem_charges -= 20
// restore us to health
- C.rejuvenate()
+ C.revive()
// remove our fake death flag
C.status_flags &= ~(FAKEDEATH)
diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm
index 1bf2406db5b..3dac9f21488 100644
--- a/code/game/gamemodes/events/space_ninja.dm
+++ b/code/game/gamemodes/events/space_ninja.dm
@@ -531,20 +531,31 @@ As such, it's hard-coded for now. No reason for it not to be, really.
else
equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform)
+ equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask)
+ equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt)
+
var/obj/item/weapon/rig/light/ninja/ninjasuit = new(src)
// Make sure the ninja can actually equip the suit.
if(src.dna && src.dna.unique_enzymes)
- src << "Suit hardware locked to your DNA hash."
ninjasuit.locked_dna = src.dna.unique_enzymes
+ spawn(10)
+ src << "Suit hardware locked to your DNA hash."
else
ninjasuit.req_access = list()
equip_to_slot_or_del(ninjasuit,slot_back)
+
+ if(istype(wear_suit,/obj/item/weapon/rig))
+ var/obj/item/weapon/rig/rig = wear_suit
+ if(rig.air_supply)
+ internal = rig.air_supply
+ if(!internal && s_store)
+ internal = s_store
+ if(internal)
+ internals.icon_state = "internal1"
+
spawn(10)
ninjasuit.toggle_seals(src,1)
- equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask)
- equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt)
- equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(src), slot_s_store)
- return 1
+ return 1
\ No newline at end of file
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 085ca17a80b..b3c6ad7e98f 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -27,16 +27,14 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
-
-
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
/datum/job/doctor
title = "Medical Doctor"
@@ -54,6 +52,8 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
@@ -90,14 +90,12 @@
else
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
return 1
@@ -123,13 +121,13 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit)
return 1
@@ -153,48 +151,15 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
- return 1
-
-/*/datum/job/virologist
- title = "Virologist"
- flag = VIROLOGIST
- department_flag = MEDSCI
- faction = "Station"
- total_positions = 1
- spawn_positions = 1
- supervisors = "the chief medical officer"
- selection_color = "#ffeef0"
- access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
- minimal_access = list(access_medical, access_virology)
- alt_titles = list("Pathologist","Microbiologist")
-
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/viro(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
- return 1*/
+ return 1
/datum/job/psychiatrist
title = "Psychiatrist"
@@ -224,10 +189,10 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform)
else
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
\ No newline at end of file
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index b18e8b8ec16..e387e0d4be0 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -25,7 +25,6 @@
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
@@ -33,6 +32,7 @@
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
return 1
@@ -58,13 +58,13 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
return 1
@@ -89,16 +89,15 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
return 1
-
/datum/job/roboticist
title = "Roboticist"
flag = ROBOTICIST
@@ -122,11 +121,10 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/roboticist(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
-// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(H), slot_l_hand)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
- return 1
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
+ return 1
\ No newline at end of file
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index cc0628c2849..6d25f7fe58b 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -106,17 +106,8 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
-/* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H)
- CIG.light("")
- H.equip_to_slot_or_del(CIG, slot_wear_mask) */
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician")
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/flame/lighter/zippo(H), slot_l_store)
-
if(H.backbag == 1)//Why cant some of these things spawn in his office?
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
@@ -125,7 +116,11 @@
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack)
-
+ if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician")
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
+ else
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head)
return 1
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 326f705a5da..b3918713e79 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -379,16 +379,17 @@ var/global/datum/controller/occupations/job_master
continue
if(G.slot && !(G.slot in custom_equip_slots))
- if(H.equip_to_slot_or_del(new G.path(H), G.slot))
+ // This is a miserable way to fix the loadout overwrite bug, but the alternative requires
+ // adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z
+ if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
+ custom_equip_leftovers += thing
+ else if(H.equip_to_slot_or_del(new G.path(H), G.slot))
H << "\blue Equipping you with [thing]!"
custom_equip_slots.Add(G.slot)
else
custom_equip_leftovers.Add(thing)
-
else
spawn_in_storage += thing
-
-
//Equip job items.
job.equip(H)
job.apply_fingerprints(H)
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 4342778f9af..76d1e0fb939 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -40,13 +40,13 @@
if(scan)
usr << "You remove \the [scan] from \the [src]."
scan.loc = get_turf(src)
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
usr.put_in_hands(scan)
scan = null
else if(modify)
usr << "You remove \the [modify] from \the [src]."
modify.loc = get_turf(src)
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
usr.put_in_hands(modify)
modify = null
else
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index a03edba52ad..1a7a8ea33a2 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -26,7 +26,7 @@
if(scan)
usr << "You remove \the [scan] from \the [src]."
scan.loc = get_turf(src)
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
usr.put_in_hands(scan)
scan = null
else
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index e97d9f6865d..5aed27cc564 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -32,7 +32,7 @@
if(scan)
usr << "You remove \the [scan] from \the [src]."
scan.loc = get_turf(src)
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
usr.put_in_hands(scan)
scan = null
else
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 40a38621bef..847663ee4a1 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -341,7 +341,7 @@
if(slot_w_uniform)
if(H.w_uniform)
return 0
- if(H.wear_suit)
+ if(H.wear_suit && (H.wear_suit.body_parts_covered & src.body_parts_covered))
if(!disable_warning)
H << "\The [H.wear_suit] is in the way."
return 0
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 6945729b5fe..7767ecd3074 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -67,7 +67,7 @@
/obj/item/device/aicard/Topic(href, href_list)
var/mob/U = usr
- if (!(get_turf(U) == get_turf(src)) || U.machine != src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else).
+ if (get_dist(get_turf(U),get_turf(src)) > 1 || U.machine != src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else).
U << browse(null, "window=aicard")
U.unset_machine()
return
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index fc41725ef46..3b7e66b7dfd 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -309,4 +309,10 @@
/obj/item/device/paicard/emp_act(severity)
for(var/mob/M in src)
M.emp_act(severity)
- ..()
\ No newline at end of file
+ ..()
+
+/obj/item/device/paicard/ex_act(severity)
+ if(pai)
+ pai.ex_act(severity)
+ else
+ del(src)
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index 3dc57db6549..03776c78ded 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -3,128 +3,159 @@
/obj/item/weapon/implantcase
name = "Glass Case"
desc = "A case containing an implant."
+ icon = 'icons/obj/items.dmi'
icon_state = "implantcase-0"
item_state = "implantcase"
throw_speed = 1
throw_range = 5
w_class = 1.0
var/obj/item/weapon/implant/imp = null
- proc
- update()
+/obj/item/weapon/implantcase/proc/update()
+ if (src.imp)
+ src.icon_state = text("implantcase-[]", src.imp.item_color)
+ else
+ src.icon_state = "implantcase-0"
+ return
- update()
- if (src.imp)
- src.icon_state = text("implantcase-[]", src.imp.item_color)
+/obj/item/weapon/implantcase/attackby(obj/item/weapon/I as obj, mob/user as mob)
+ ..()
+ if (istype(I, /obj/item/weapon/pen))
+ var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
+ if (user.get_active_hand() != I)
+ return
+ if((!in_range(src, usr) && src.loc != user))
+ return
+ t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
+ if(t)
+ src.name = text("Glass Case - '[]'", t)
else
- src.icon_state = "implantcase-0"
- return
-
-
- attackby(obj/item/weapon/I as obj, mob/user as mob)
- ..()
- if (istype(I, /obj/item/weapon/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
- if (user.get_active_hand() != I)
+ src.name = "Glass Case"
+ else if(istype(I, /obj/item/weapon/reagent_containers/syringe))
+ if(!src.imp) return
+ if(!src.imp.allow_reagents) return
+ if(src.imp.reagents.total_volume >= src.imp.reagents.maximum_volume)
+ user << "\red [src] is full."
+ else
+ spawn(5)
+ I.reagents.trans_to(src.imp, 5)
+ user << "\blue You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units."
+ else if (istype(I, /obj/item/weapon/implanter))
+ var/obj/item/weapon/implanter/M = I
+ if (M.imp)
+ if ((src.imp || M.imp.implanted))
return
- if((!in_range(src, usr) && src.loc != user))
- return
- t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
- if(t)
- src.name = text("Glass Case- '[]'", t)
- else
- src.name = "Glass Case"
- else if(istype(I, /obj/item/weapon/reagent_containers/syringe))
- if(!src.imp) return
- if(!src.imp.allow_reagents) return
- if(src.imp.reagents.total_volume >= src.imp.reagents.maximum_volume)
- user << "\red [src] is full."
- else
- spawn(5)
- I.reagents.trans_to(src.imp, 5)
- user << "\blue You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units."
- else if (istype(I, /obj/item/weapon/implanter))
- if (I:imp)
- if ((src.imp || I:imp.implanted))
+ M.imp.loc = src
+ src.imp = M.imp
+ M.imp = null
+ src.update()
+ M.update()
+ else
+ if (src.imp)
+ if (M.imp)
return
- I:imp.loc = src
- src.imp = I:imp
- I:imp = null
- src.update()
- I:update()
- else
- if (src.imp)
- if (I:imp)
- return
- src.imp.loc = I
- I:imp = src.imp
- src.imp = null
- update()
- I:update()
- return
-
+ src.imp.loc = M
+ M.imp = src.imp
+ src.imp = null
+ update()
+ M.update()
+ return
/obj/item/weapon/implantcase/tracking
- name = "Glass Case- 'Tracking'"
+ name = "Glass Case - 'Tracking'"
desc = "A case containing a tracking implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-b"
-
- New()
- src.imp = new /obj/item/weapon/implant/tracking( src )
- ..()
- return
-
+/obj/item/weapon/implantcase/tracking/New()
+ src.imp = new /obj/item/weapon/implant/tracking( src )
+ ..()
+ return
/obj/item/weapon/implantcase/explosive
- name = "Glass Case- 'Explosive'"
+ name = "Glass Case - 'Explosive'"
desc = "A case containing an explosive implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-r"
-
- New()
- src.imp = new /obj/item/weapon/implant/explosive( src )
- ..()
- return
-
+/obj/item/weapon/implantcase/explosive/New()
+ src.imp = new /obj/item/weapon/implant/explosive( src )
+ ..()
+ return
/obj/item/weapon/implantcase/chem
- name = "Glass Case- 'Chem'"
+ name = "Glass Case - 'Chem'"
desc = "A case containing a chemical implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-b"
-/obj/item/weapon/implantcase/chem/New()
+/obj/item/weapon/implantcase/chem/New()
src.imp = new /obj/item/weapon/implant/chem( src )
..()
return
/obj/item/weapon/implantcase/loyalty
- name = "Glass Case- 'Loyalty'"
+ name = "Glass Case - 'Loyalty'"
desc = "A case containing a loyalty implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-r"
-
- New()
- src.imp = new /obj/item/weapon/implant/loyalty( src )
- ..()
- return
+/obj/item/weapon/implantcase/loyalty/New()
+ src.imp = new /obj/item/weapon/implant/loyalty( src )
+ ..()
+ return
/obj/item/weapon/implantcase/death_alarm
- name = "Glass Case- 'Death Alarm'"
+ name = "Glass Case - 'Death Alarm'"
desc = "A case containing a death alarm implant."
- icon = 'icons/obj/items.dmi'
icon_state = "implantcase-b"
- New()
- src.imp = new /obj/item/weapon/implant/death_alarm( src )
- ..()
- return
+/obj/item/weapon/implantcase/death_alarm/New()
+ src.imp = new /obj/item/weapon/implant/death_alarm( src )
+ ..()
+ return
+
+
+/obj/item/weapon/implantcase/freedom
+ name = "Glass Case - 'Freedom'"
+ desc = "A case containing a freedom implant."
+ icon_state = "implantcase-r"
+
+/obj/item/weapon/implantcase/freedom/New()
+ src.imp = new /obj/item/weapon/implant/freedom( src )
+ ..()
+ return
+
+
+/obj/item/weapon/implantcase/adrenalin
+ name = "Glass Case - 'Adrenalin'"
+ desc = "A case containing an adrenalin implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/adrenalin/New()
+ src.imp = new /obj/item/weapon/implant/adrenalin( src )
+ ..()
+ return
+
+
+/obj/item/weapon/implantcase/dexplosive
+ name = "Glass Case - 'Explosive'"
+ desc = "A case containing an explosive."
+ icon_state = "implantcase-r"
+
+/obj/item/weapon/implantcase/dexplosive/New()
+ src.imp = new /obj/item/weapon/implant/dexplosive( src )
+ ..()
+ return
+
+
+/obj/item/weapon/implantcase/health
+ name = "Glass Case - 'Health'"
+ desc = "A case containing a health tracking implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/health/New()
+ src.imp = new /obj/item/weapon/implant/health( src )
+ ..()
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index 3d21575c749..e67fea38494 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -1,4 +1,5 @@
//Alium nests. Essentially beds with an unbuckle delay that only aliums can buckle mobs to.
+#define NEST_RESIST_TIME 1200
/obj/structure/stool/bed/nest
name = "alien nest"
@@ -19,12 +20,16 @@
buckled_mob.old_y = 0
unbuckle()
else
+ if(world.time <= buckled_mob.last_special+NEST_RESIST_TIME)
+ return
+ buckled_mob.last_special = world.time
buckled_mob.visible_message(\
"[buckled_mob.name] struggles to break free of the gelatinous resin...",\
"You struggle to break free from the gelatinous resin...",\
"You hear squelching...")
- spawn(1200)
+ spawn(NEST_RESIST_TIME)
if(user && buckled_mob && user.buckled == src)
+ buckled_mob.last_special = world.time
buckled_mob.pixel_y = 0
buckled_mob.old_y = 0
unbuckle()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 4ac8aa6c465..608bd782dc7 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -163,31 +163,32 @@
/obj/structure/window/attackby(obj/item/W as obj, mob/user as mob)
if(!istype(W)) return//I really wish I did not need this
- if(W.flags & NOBLUDGEON) return
-
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
- if (istype(G.affecting, /mob/living))
+ if(istype(G.affecting,/mob/living))
var/mob/living/M = G.affecting
var/state = G.state
del(W) //gotta delete it here because if window breaks, it won't get deleted
switch (state)
if(1)
+ M.visible_message("[user] slams [M] against \the [src]!")
M.apply_damage(7)
hit(10)
- visible_message("\red [user] slams [M] against \the [src]!")
if(2)
+ M.visible_message("[user] bashes [M] against \the [src]!")
if (prob(50))
M.Weaken(1)
M.apply_damage(10)
hit(25)
- visible_message("\red [user] bashes [M] against \the [src]!")
if(3)
+ M.visible_message("[user] crushes [M] against \the [src]!")
M.Weaken(5)
M.apply_damage(20)
hit(50)
- visible_message("\red [user] crushes [M] against \the [src]!")
return
+
+ if(W.flags & NOBLUDGEON) return
+
if(istype(W, /obj/item/weapon/screwdriver))
if(reinf && state >= 1)
state = 3 - state
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 80a70d5c049..d2cd7a18d54 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -86,7 +86,7 @@
//Finally, check objects/mobs to block entry that are not on the border
for(var/atom/movable/obstacle in src)
- if(obstacle.flags & ~ON_BORDER)
+ if(!(obstacle.flags & ON_BORDER))
if(!obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != obstacle))
mover.Bump(obstacle, 1)
return 0
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 9461b9477c4..721becf039f 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -460,8 +460,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
call(/datum/game_mode/proc/equip_syndicate)(new_character)
if("Ninja")
new_character.equip_space_ninja()
- new_character.internal = new_character.s_store
- new_character.internals.icon_state = "internal1"
if(ninjastart.len == 0)
new_character << "\red A proper starting location for you could not be found, please report this bug!"
new_character << "\red Attempting to place at a carpspawn."
diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm
index 7b7e2374d4c..71293ef4503 100644
--- a/code/modules/clothing/spacesuits/rig/modules/computer.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm
@@ -138,11 +138,15 @@
if(ai_card)
if(istype(ai_card, /obj/item/device/aicard))
- if(integrated_ai && integrated_ai.client)
+ if(integrated_ai && !integrated_ai.stat)
if(user)
user << "You cannot eject your currently stored AI. Purge it manually."
return 0
- del(ai_card)
+ user << "You purge the remaining scraps of data from your previous AI, freeing it for use."
+ if(integrated_ai)
+ integrated_ai.ghostize()
+ del(integrated_ai)
+ if(ai_card) del(ai_card)
else if(user)
user.put_in_hands(ai_card)
else
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index 06a72bc3525..3a09ad41b16 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -58,7 +58,9 @@
desc = "You think it's called an Elder Sarsparilla or something."
interface_name = "Alden-Saraspova counter"
interface_desc = "An exotic particle detector commonly used by xenoarchaeologists."
- selectable = 1
+ engage_string = "Begin Scan"
+ usable = 1
+ selectable = 0
device_type = /obj/item/device/ano_scanner
/obj/item/rig_module/device/orescanner
@@ -66,12 +68,9 @@
desc = "A clunky old ore scanner."
interface_name = "ore detector"
interface_desc = "A sonar system for detecting large masses of ore."
-
engage_string = "Begin Scan"
-
usable = 1
selectable = 0
-
device_type = /obj/item/weapon/mining_scanner
/obj/item/rig_module/device/rcd
diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm
index ba5f4dbc310..75169cd30cc 100644
--- a/code/modules/hydroponics/hydro_tray.dm
+++ b/code/modules/hydroponics/hydro_tray.dm
@@ -129,8 +129,6 @@
create_reagents(200)
connect()
update_icon()
- if(closed_system)
- flags &= ~OPENCONTAINER
/obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj)
@@ -777,11 +775,6 @@
closed_system = !closed_system
usr << "You [closed_system ? "close" : "open"] the tray's lid."
- if(closed_system)
- flags &= ~OPENCONTAINER
- else
- flags |= OPENCONTAINER
-
update_icon()
/obj/machinery/portable_atmospherics/hydroponics/soil
diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm
index a08de942d01..9fe3702eac4 100644
--- a/code/modules/hydroponics/seed_mobs.dm
+++ b/code/modules/hydroponics/seed_mobs.dm
@@ -25,7 +25,7 @@
/datum/seed/proc/request_player(var/mob/living/host)
if(!host) return
for(var/mob/dead/observer/O in player_list)
- if(jobban_isbanned(O, "Dionaea") || (!is_alien_whitelisted(O, "Diona") && config.usealienwhitelist))
+ if(jobban_isbanned(O, "Dionaea"))
continue
if(O.client)
if(O.client.prefs.be_special & BE_PLANT && !(O.client in currently_querying))
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index dc1ca257276..ab9c64eebfe 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -1,31 +1,31 @@
//This is the proc for gibbing a mob. Cannot gib ghosts.
//added different sort of gibs and animations. N
-/mob/proc/gib()
+/mob/proc/gib(anim="gibbed-m",do_gibs)
death(1)
- var/atom/movable/overlay/animation = null
monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
+ update_canmove()
+ dead_mob_list -= src
+ var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
-// flick("gibbed-m", animation)
- gibs(loc, viruses, dna)
+ flick(anim, animation)
+ if(do_gibs) gibs(loc, viruses, dna)
- dead_mob_list -= src
spawn(15)
if(animation) del(animation)
if(src) del(src)
-
//This is the proc for turning a mob into ash. Mostly a copy of gib code (above).
//Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here.
//Dusting robots does not eject the MMI, so it's a bit more powerful than gib() /N
-/mob/proc/dust()
+/mob/proc/dust(anim="dust-m",remains=/obj/effect/decal/cleanable/ash)
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
@@ -38,8 +38,8 @@
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
-// flick("dust-m", animation)
- new /obj/effect/decal/cleanable/ash(loc)
+ flick(anim, animation)
+ new remains(loc)
dead_mob_list -= src
spawn(15)
@@ -47,17 +47,45 @@
if(src) del(src)
-/mob/proc/death(gibbed)
+/mob/proc/death(gibbed,deathmessage="seizes up and falls limp...")
+
+ if(stat == DEAD)
+ return 0
+
+ if(!gibbed)
+ src.visible_message("\The [src.name] [deathmessage]")
+
+ stat = DEAD
+
+ update_canmove()
+
+ dizziness = 0
+ jitteriness = 0
+
+ layer = MOB_LAYER
+
+ if(blind && client)
+ blind.layer = 0
+
+ sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_LEVEL_TWO
- //Quick fix for corpses kept propped up in chairs. ~Z
drop_r_hand()
drop_l_hand()
- //End of fix.
+
+ if(healths)
+ healths.icon_state = "health6"
timeofdeath = world.time
-
- var/tod = worldtime2text() //weasellos time of death patch
- if(mind) mind.store_memory("Time of death: [tod]", 0)
+ if(mind) mind.store_memory("Time of death: [worldtime2text()]", 0)
living_mob_list -= src
- dead_mob_list += src
- return ..(gibbed)
+ dead_mob_list |= src
+
+ updateicon()
+
+ if(ticker && ticker.mode)
+ ticker.mode.check_win()
+
+
+ return 1
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 04fa4273a07..ffe9df9839b 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -8,7 +8,7 @@
//Does the speaker have a client? It's either random stuff that observers won't care about (Experiment 97B says, 'EHEHEHEHEHEHEHE')
//Or someone snoring. So we make it where they won't hear it.
return
-
+
//make sure the air can transmit speech - hearer's side
var/turf/T = get_turf(src)
if (T)
@@ -16,22 +16,22 @@
var/pressure = (environment)? environment.return_pressure() : 0
if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1)
return
-
+
if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
italics = 1
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
-
+
if(sleeping || stat == 1)
hear_sleep(message)
return
var/style = "body"
-
+
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if (language && (language.flags & NONVERBAL))
if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
message = stars(message)
-
+
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
@@ -89,11 +89,14 @@
if (language && (language.flags & NONVERBAL))
if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
message = stars(message)
-
+
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
- message = pick(S.speak)
+ if(S.speak && S.speak.len)
+ message = pick(S.speak)
+ else
+ return
else
message = stars(message)
@@ -173,7 +176,7 @@
/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null)
if(!client)
return
-
+
if(say_understands(speaker, language))
message = "[src] [verb], \"[message]\""
else
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index d1adff7de2c..1b8cf6eee6f 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -58,6 +58,7 @@
desc = "It's a tiny plant critter."
icon_state = "nymph"
origin_tech = "magnets=3;biotech=5"
+ slot_flags = SLOT_HEAD | SLOT_OCLOTHING
/obj/item/weapon/holder/drone
name = "maintenance drone"
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 2e627330a06..b3ac9864874 100755
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -81,7 +81,7 @@
ask_verb = "creels"
exclaim_verb = "SHRIEKS"
colour = "vox"
- key = "v"
+ key = "5"
flags = RESTRICTED
/datum/language/diona
diff --git a/code/modules/mob/living/blob/blob.dm b/code/modules/mob/living/blob/blob.dm
index ec90c4fb7ff..2b82ccbedbf 100644
--- a/code/modules/mob/living/blob/blob.dm
+++ b/code/modules/mob/living/blob/blob.dm
@@ -52,14 +52,8 @@
death(gibbed)
- if(key)
- var/mob/dead/observer/ghost = new(src)
- ghost.name = ghost_name
- ghost.real_name = ghost_name
- ghost.key = key
- if (ghost.client)
- ghost.client.eye = ghost
- return ..(gibbed)
+ ghostize()
+ ..(gibbed)
blob_act()
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index 7dfd2cc0ebc..3c561652137 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -1,13 +1,4 @@
/mob/living/carbon/alien/death(gibbed)
-
- if(stat == DEAD) return
- if(healths) healths.icon_state = "health6"
- stat = DEAD
-
- if(dead_icon) icon_state = dead_icon
-
- if(!gibbed)
- update_canmove()
- if(client) blind.layer = 0
-
- return ..(gibbed)
\ No newline at end of file
+ if(!gibbed && dead_icon)
+ icon_state = dead_icon
+ return ..(gibbed,"lets out a waning guttural screech, green blood bubbling from its maw.")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm
index a91f55d4b6b..d2e362269ad 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona.dm
@@ -12,8 +12,8 @@
var/list/donors = list()
var/last_checked_stage = 0
- universal_understand = 0 // Dionaea do not need to speak to people
- universal_speak = 0 // before becoming an adult. Use *chirp.
+ universal_understand = 1
+ universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
holder_type = /obj/item/weapon/holder/diona
/mob/living/carbon/alien/diona/New()
diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
index b8a47501a8f..bac7c75d2bf 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
@@ -5,6 +5,9 @@
set name = "Merge with gestalt"
set desc = "Merge with another diona."
+ if(stat == DEAD || paralysis || weakened || stunned || restrained())
+ return
+
if(istype(src.loc,/mob/living/carbon))
src.verbs -= /mob/living/carbon/alien/diona/proc/merge
return
@@ -40,6 +43,9 @@
set name = "Split from gestalt"
set desc = "Split away from your gestalt as a lone nymph."
+ if(stat == DEAD || paralysis || weakened || stunned || restrained())
+ return
+
if(!(istype(src.loc,/mob/living/carbon)))
src.verbs -= /mob/living/carbon/alien/diona/proc/split
return
@@ -64,6 +70,9 @@
set name = "Steal Blood"
set desc = "Take a blood sample from a suitable donor."
+ if(stat == DEAD || paralysis || weakened || stunned || restrained())
+ return
+
var/list/choices = list()
for(var/mob/living/carbon/human/H in oview(1,src))
if(src.Adjacent(H))
diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm
index 0efcae7c911..b3b0ae53c18 100644
--- a/code/modules/mob/living/carbon/alien/emote.dm
+++ b/code/modules/mob/living/carbon/alien/emote.dm
@@ -36,6 +36,9 @@
if (!muzzled)
message = "[src] burps."
m_type = 2
+ if("deathgasp")
+ message = "The [src.name] lets out a waning guttural screech, green blood bubbling from its maw."
+ m_type = 2
if("scratch")
if (!src.restrained())
message = "The [src.name] scratches."
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index 7a51069fe87..67488df9ebc 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -61,28 +61,28 @@
silent = 0
else
updatehealth()
-
+ handle_stunned()
+ handle_weakened()
if(health <= 0)
death()
blinded = 1
silent = 0
return 1
- if(paralysis)
- AdjustParalysis(-1)
+ if(paralysis && paralysis > 0)
+ handle_paralysed()
blinded = 1
stat = UNCONSCIOUS
if(halloss > 0)
adjustHalLoss(-3)
- else if(sleeping)
+ if(sleeping)
adjustHalLoss(-3)
if (mind)
if((mind.active && client != null) || immune_to_ssd)
sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
-
else if(resting)
if(halloss > 0)
adjustHalLoss(-3)
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index 897b03c8a14..ecb729ece90 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -1,43 +1,12 @@
/mob/living/carbon/brain/death(gibbed)
- if(stat == DEAD) return
- if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container.
- for(var/mob/O in viewers(container, null))
- O.show_message(text("\red []'s MMI flatlines!", src), 1, "\red You hear something flatline.", 2)
+ if(!gibbed && istype(container, /obj/item/device/mmi)) //If not gibbed but in a container.
container.icon_state = "mmi_dead"
- stat = DEAD
-
- if(blind) blind.layer = 0
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_LEVEL_TWO
-
- tod = worldtime2text() //weasellos time of death patch
- if(mind) mind.store_memory("Time of death: [tod]", 0) //mind. ?
-
- return ..(gibbed)
+ return ..(gibbed,"beeps shrilly as the MMI flatlines!")
/mob/living/carbon/brain/gib()
- death(1)
- var/atom/movable/overlay/animation = null
- monkeyizing = 1
- canmove = 0
- icon = null
- invisibility = 101
-
- animation = new(loc)
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
-
-// flick("gibbed-m", animation)
- gibs(loc, viruses, dna)
-
- dead_mob_list -= src
- if(container && istype(container, /obj/item/device/mmi))
+ if(istype(container, /obj/item/device/mmi))
del(container)//Gets rid of the MMI if there is one
if(loc)
if(istype(loc,/obj/item/organ/brain))
del(loc)//Gets rid of the brain item
- spawn(15)
- if(animation) del(animation)
- if(src) del(src)
\ No newline at end of file
+ ..(null,1)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 67197567440..e1e43926c31 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -57,7 +57,7 @@
for(var/mob/N in viewers(src, null))
if(N.client)
N.show_message(text("\red [M] bursts out of [src]!"), 2)
- . = ..()
+ . = ..(null,1)
/mob/living/carbon/attack_hand(mob/M as mob)
if(!istype(M, /mob/living/carbon)) return
diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm
index 7dc0f45087a..6f52ac106c5 100644
--- a/code/modules/mob/living/carbon/carbon_powers.dm
+++ b/code/modules/mob/living/carbon/carbon_powers.dm
@@ -6,6 +6,9 @@
set name = "Fertilize plant"
set desc = "Turn your food into nutrients for plants."
+ if(stat == DEAD || paralysis || weakened || stunned || restrained())
+ return
+
var/list/trays = list()
for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
if(tray.nutrilevel < 10 && src.Adjacent(tray))
@@ -25,6 +28,9 @@
set name = "Eat Weeds"
set desc = "Clean the weeds out of soil or a hydroponics tray."
+ if(stat == DEAD || paralysis || weakened || stunned || restrained())
+ return
+
var/list/trays = list()
for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
if(tray.weedlevel > 0 && src.Adjacent(tray))
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index d8f4e313c6d..d71404e624a 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -1,15 +1,4 @@
/mob/living/carbon/human/gib()
- death(1)
- var/atom/movable/overlay/animation = null
- monkeyizing = 1
- canmove = 0
- icon = null
- invisibility = 101
-
- animation = new(loc)
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
for(var/datum/organ/external/E in src.organs)
if(istype(E, /datum/organ/external/chest))
@@ -19,49 +8,25 @@
// Override the current limb status and don't cause an explosion
E.droplimb(1,1)
+ ..(species ? species.gibbed_anim : "gibbed-h")
+
if(species)
- flick(species.gibbed_anim, animation)
hgibs(loc, viruses, dna, species.flesh_color, species.blood_color)
else
- flick("gibbed-h", animation)
hgibs(loc, viruses, dna)
- spawn(15)
- if(animation) del(animation)
- if(src) del(src)
-
/mob/living/carbon/human/dust()
- death(1)
- var/atom/movable/overlay/animation = null
- monkeyizing = 1
- canmove = 0
- icon = null
- invisibility = 101
-
- animation = new(loc)
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
-
- flick(species.dusted_anim, animation)
- new species.remains_type(loc)
-
- spawn(15)
- if(animation) del(animation)
- if(src) del(src)
-
+ if(species)
+ ..(species.dusted_anim, species.remains_type)
+ else
+ ..()
/mob/living/carbon/human/death(gibbed)
- if(stat == DEAD) return
- if(healths) healths.icon_state = "health5"
- stat = DEAD
- dizziness = 0
- jitteriness = 0
+ if(stat == DEAD) return
hud_updateflag |= 1 << HEALTH_HUD
hud_updateflag |= 1 << STATUS_HUD
-
handle_hud_list()
//Handle species-specific deaths.
@@ -88,30 +53,17 @@
callHook("death", list(src, gibbed))
- //Check for heist mode kill count.
- if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist) ) )
- //Check for last assailant's mutantrace.
- /*if( LAssailant && ( istype( LAssailant,/mob/living/carbon/human ) ) )
- var/mob/living/carbon/human/V = LAssailant
- if (V.dna && (V.dna.mutantrace == "vox"))*/ //Not currently feasible due to terrible LAssailant tracking.
- //world << "Vox kills: [vox_kills]"
- vox_kills++ //Bad vox. Shouldn't be killing humans.
+ if(!gibbed && species.death_sound)
+ playsound(loc, species.death_sound, 80, 1, 1)
- if(!gibbed)
- emote("deathgasp") //let the world KNOW WE ARE DEAD // Doing this with the deathgasp emote seems odd.
- if(species && species.death_sound) playsound(loc, species.death_sound, 80, 1, 1)
-
- update_canmove()
- if(client) blind.layer = 0
-
- tod = worldtime2text() //weasellos time of death patch
- if(mind) mind.store_memory("Time of death: [tod]", 0)
if(ticker && ticker.mode)
-// world.log << "k"
sql_report_death(src)
- ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
- return ..(gibbed)
+ ticker.mode.check_win()
+ if(istype(ticker.mode,/datum/game_mode/heist))
+ vox_kills++ //Bad vox. Shouldn't be killing humans.
+
+ return ..(gibbed,species.death_message)
/mob/living/carbon/human/proc/makeSkeleton()
if(SKELETON in src.mutations) return
diff --git a/code/modules/mob/living/carbon/metroid/death.dm b/code/modules/mob/living/carbon/metroid/death.dm
index b8e004e2016..2ebc5c576b5 100644
--- a/code/modules/mob/living/carbon/metroid/death.dm
+++ b/code/modules/mob/living/carbon/metroid/death.dm
@@ -1,4 +1,8 @@
/mob/living/carbon/slime/death(gibbed)
+
+ if(stat == DEAD) return
+ stat = DEAD
+
if(!gibbed)
if(is_adult)
var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc)
@@ -12,17 +16,7 @@
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return
- if(stat == DEAD) return
- stat = DEAD
icon_state = "[colour] baby slime dead"
- overlays.len = 0
- for(var/mob/O in viewers(src, null))
- O.show_message("The [name] seizes up and falls limp...", 1) //ded -- Urist
-
- update_canmove()
- if(blind) blind.layer = 0
-
- if(ticker && ticker.mode)
- ticker.mode.check_win()
+ overlays.Cut()
return ..(gibbed)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm
index 8e982eb9356..6d0c48c804c 100644
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ b/code/modules/mob/living/carbon/monkey/death.dm
@@ -1,56 +1,8 @@
/mob/living/carbon/monkey/gib()
- death(1)
- var/atom/movable/overlay/animation = null
- monkeyizing = 1
- canmove = 0
- icon = null
- invisibility = 101
-
- animation = new(loc)
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
-
- flick("gibbed-m", animation)
- gibs(loc, viruses, dna)
-
- spawn(15)
- if(animation) del(animation)
- if(src) del(src)
+ ..(null,1)
/mob/living/carbon/monkey/dust()
- death(1)
- var/atom/movable/overlay/animation = null
- monkeyizing = 1
- canmove = 0
- icon = null
- invisibility = 101
-
- animation = new(loc)
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
-
- flick("dust-m", animation)
- new /obj/effect/decal/cleanable/ash(loc)
-
- spawn(15)
- if(animation) del(animation)
- if(src) del(src)
-
+ ..("dust-m")
/mob/living/carbon/monkey/death(gibbed)
- if(stat == DEAD) return
- if(healths) healths.icon_state = "health5"
- stat = DEAD
-
- if(!gibbed)
- for(var/mob/O in viewers(src, null))
- O.show_message("The [name] lets out a faint chimper as it collapses and stops moving...", 1) //ded -- Urist
-
- update_canmove()
- if(blind) blind.layer = 0
-
- ticker.mode.check_win()
-
- return ..(gibbed)
\ No newline at end of file
+ ..(gibbed,"lets out a faint chimper as it collapses and stops moving...")
\ No newline at end of file
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f883ce46ff1..5ca7d569dd3 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -457,8 +457,9 @@
set name = "Resist"
set category = "IC"
- if(!isliving(usr) || usr.next_move > world.time)
+ if(usr.stat || !isliving(usr) || usr.next_move > world.time)
return
+
usr.next_move = world.time + 20
var/mob/living/L = usr
diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm
index d2a8e35320e..da94c1abdef 100644
--- a/code/modules/mob/living/living_powers.dm
+++ b/code/modules/mob/living/living_powers.dm
@@ -2,14 +2,20 @@
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Abilities"
+
+ if(stat == DEAD || paralysis || weakened || stunned || restrained())
+ return
+
handle_ventcrawl()
- return
/mob/living/proc/hide()
set name = "Hide"
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
set category = "Abilities"
+ if(stat == DEAD || paralysis || weakened || stunned || restrained())
+ return
+
if (layer != TURF_LAYER+0.2)
layer = TURF_LAYER+0.2
src << text("\blue You are now hiding.")
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 28404b3d8a9..622ee23bc7b 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -13,7 +13,7 @@ var/list/department_radio_keys = list(
":t" = "Mercenary", "#t" = "Mercenary", ".t" = "Mercenary",
":u" = "Supply", "#u" = "Supply", ".u" = "Supply",
":v" = "Service", "#v" = "Service", ".v" = "Service",
- ":o" = "AI Private", "#o" = "AI Private", ".o" = "AI Private",
+ ":p" = "AI Private", "#p" = "AI Private", ".p" = "AI Private",
":R" = "right ear", "#R" = "right ear", ".R" = "right ear",
":L" = "left ear", "#L" = "left ear", ".L" = "left ear",
@@ -28,7 +28,7 @@ var/list/department_radio_keys = list(
":T" = "Mercenary", "#T" = "Mercenary", ".T" = "Mercenary",
":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
":V" = "Service", "#V" = "Service", ".V" = "Service",
- ":O" = "AI Private", "#O" = "AI Private", ".O" = "AI Private",
+ ":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private",
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
@@ -91,7 +91,7 @@ proc/get_radio_key_from_channel(var/channel)
if (speaking.flags & SIGNLANG)
return say_signlang(message, pick(speaking.signlang_verb), speaking)
-
+
var/list/listening = list()
var/list/listening_obj = list()
@@ -101,11 +101,11 @@ proc/get_radio_key_from_channel(var/channel)
var/pressure = (environment)? environment.return_pressure() : 0
if(pressure < SOUND_MINIMUM_PRESSURE)
message_range = 1
-
+
if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
italics = 1
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
-
+
var/list/hear = hear(message_range, T)
var/list/hearturfs = list()
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 77aa73cb72b..12b6301c4bc 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -421,13 +421,6 @@ var/list/ai_verbs_default = list(
user.reset_view(camera)
return 1
-/mob/living/silicon/ai/blob_act()
- if (stat != 2)
- adjustBruteLoss(60)
- updatehealth()
- return 1
- return 0
-
/mob/living/silicon/ai/restrained()
return 0
@@ -440,26 +433,6 @@ var/list/ai_verbs_default = list(
ai_call_shuttle()
..()
-/mob/living/silicon/ai/ex_act(severity)
- if(!blinded)
- flick("flash", flash)
-
- switch(severity)
- if(1.0)
- if (stat != 2)
- adjustBruteLoss(100)
- adjustFireLoss(100)
- if(2.0)
- if (stat != 2)
- adjustBruteLoss(60)
- adjustFireLoss(60)
- if(3.0)
- if (stat != 2)
- adjustBruteLoss(30)
-
- updatehealth()
-
-
/mob/living/silicon/ai/Topic(href, href_list)
if(usr != src)
return
@@ -525,11 +498,6 @@ var/list/ai_verbs_default = list(
updatehealth()
return
-/mob/living/silicon/ai/bullet_act(var/obj/item/projectile/Proj)
- ..(Proj)
- updatehealth()
- return 2
-
/mob/living/silicon/ai/reset_view(atom/A)
if(camera)
camera.SetLuminosity(0)
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 596b7c397c1..34281e8c0c0 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -1,20 +1,19 @@
/mob/living/silicon/ai/death(gibbed)
- if(stat == DEAD) return
- stat = DEAD
+
+ if(stat == DEAD)
+ return
+
if (src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
icon_state = "[ckey]-ai-crash"
- else icon_state = "ai-crash"
- update_canmove()
+ else
+ icon_state = "ai-crash"
+
if(src.eyeobj)
src.eyeobj.setLoc(get_turf(src))
- if(blind) blind.layer = 0
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_LEVEL_TWO
+
remove_ai_verbs(src)
var/callshuttle = 0
-
for(var/obj/machinery/computer/communications/commconsole in world)
if(commconsole.z == 2)
continue
@@ -48,14 +47,11 @@
spawn(10)
explosion(src.loc, 3, 6, 12, 15)
- for(var/obj/machinery/ai_status_display/O in world) //change status
+ for(var/obj/machinery/ai_status_display/O in world)
spawn( 0 )
O.mode = 2
if (istype(loc, /obj/item/device/aicard))
var/obj/item/device/aicard/card = loc
card.update_icon()
- tod = worldtime2text() //weasellos time of death patch
- if(mind) mind.store_memory("Time of death: [tod]", 0)
-
return ..(gibbed)
diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm
index 45b0268437d..2b56af75378 100644
--- a/code/modules/mob/living/silicon/death.dm
+++ b/code/modules/mob/living/silicon/death.dm
@@ -1,41 +1,12 @@
/mob/living/silicon/gib()
- death(1)
- var/atom/movable/overlay/animation = null
- monkeyizing = 1
- canmove = 0
- icon = null
- invisibility = 101
-
- animation = new(loc)
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
-
-// flick("gibbed-r", animation)
+ ..("gibbed-r")
robogibs(loc, viruses)
- dead_mob_list -= src
- spawn(15)
- if(animation) del(animation)
- if(src) del(src)
-
/mob/living/silicon/dust()
- death(1)
- var/atom/movable/overlay/animation = null
- monkeyizing = 1
- canmove = 0
- icon = null
- invisibility = 101
+ ..("dust-r", /obj/effect/decal/remains/robot)
- animation = new(loc)
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
-
-// flick("dust-r", animation)
- new /obj/effect/decal/remains/robot(loc)
-
- dead_mob_list -= src
- spawn(15)
- if(animation) del(animation)
- if(src) del(src)
+/mob/living/silicon/death(gibbed,deathmessage)
+ if(in_contents_of(/obj/machinery/recharge_station))//exit the recharge station
+ var/obj/machinery/recharge_station/RC = loc
+ RC.go_out()
+ return ..(gibbed,deathmessage)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/decoy/death.dm b/code/modules/mob/living/silicon/decoy/death.dm
index d3996e2fa70..b94a311ef7a 100644
--- a/code/modules/mob/living/silicon/decoy/death.dm
+++ b/code/modules/mob/living/silicon/decoy/death.dm
@@ -1,10 +1,8 @@
/mob/living/silicon/decoy/death(gibbed)
if(stat == DEAD) return
- stat = DEAD
icon_state = "ai-crash"
spawn(10)
explosion(loc, 3, 6, 12, 15)
-
for(var/obj/machinery/ai_status_display/O in world) //change status
O.mode = 2
return ..(gibbed)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm
index 127091a854c..87e70393d0f 100644
--- a/code/modules/mob/living/silicon/pai/death.dm
+++ b/code/modules/mob/living/silicon/pai/death.dm
@@ -1,18 +1,13 @@
/mob/living/silicon/pai/death(gibbed)
- if(stat == DEAD) return
- stat = DEAD
- canmove = 0
- if(blind) blind.layer = 0
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_LEVEL_TWO
-
- //var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
- //mind.store_memory("Time of death: [tod]", 0)
-
- //New pAI's get a brand new mind to prevent meta stuff from their previous life. This new mind causes problems down the line if it's not deleted here.
- //Read as: I have no idea what I'm doing but asking for help got me nowhere so this is what you get. - Nodrak
- if(mind) del(mind)
- living_mob_list -= src
+ if(card)
+ card.removePersonality()
+ if(gibbed)
+ src.loc = get_turf(card)
+ del(card)
+ else
+ close_up()
+ if(mind)
+ del(mind)
+ ..(gibbed)
ghostize()
del(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm
index 423287f60c1..6c099af932a 100644
--- a/code/modules/mob/living/silicon/pai/life.dm
+++ b/code/modules/mob/living/silicon/pai/life.dm
@@ -1,6 +1,8 @@
/mob/living/silicon/pai/Life()
+
if (src.stat == 2)
return
+
if(src.cable)
if(get_dist(src, src.cable) > 1)
var/turf/T = get_turf_or_move(src.loc)
@@ -9,20 +11,26 @@
del(src.cable)
regular_hud_updates()
+
if(src.secHUD == 1)
process_sec_hud(src, 1)
+
if(src.medHUD == 1)
process_med_hud(src, 1)
+
if(silence_time)
if(world.timeofday >= silence_time)
silence_time = null
src << "Communication circuit reinitialized. Speech and messaging functionality restored."
+
handle_statuses()
+ if(health <= 0)
+ death(null,"gives one shrill beep before falling lifeless.")
+
/mob/living/silicon/pai/updatehealth()
if(status_flags & GODMODE)
health = 100
stat = CONSCIOUS
else
- health = 100 - getBruteLoss() - getFireLoss()
-
+ health = 100 - getBruteLoss() - getFireLoss()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index d8bf9706fd8..5f2926466b4 100755
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -169,28 +169,7 @@
if(3)
src << "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all."
-/mob/living/silicon/pai/ex_act(severity)
- if(!blinded)
- flick("flash", src.flash)
-
- switch(severity)
- if(1.0)
- if (src.stat != 2)
- adjustBruteLoss(100)
- adjustFireLoss(100)
- if(2.0)
- if (src.stat != 2)
- adjustBruteLoss(60)
- adjustFireLoss(60)
- if(3.0)
- if (src.stat != 2)
- adjustBruteLoss(30)
-
- src.updatehealth()
-
-
// See software.dm for Topic()
-
/mob/living/silicon/pai/meteorhit(obj/O as obj)
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [] has been hit by []", src, O), 1)
@@ -201,10 +180,6 @@
src.updatehealth()
return
-//mob/living/silicon/pai/bullet_act(var/obj/item/projectile/Proj)
-
-///mob/living/silicon/pai/attack_hand(mob/living/carbon/M as mob)
-
/mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C)
if(istype(usr, /mob/living))
var/mob/living/U = usr
@@ -376,7 +351,8 @@
src.updatehealth()
else
visible_message("[user.name] bonks [src] harmlessly with [W].")
- if(stat != 2) close_up()
+ spawn(1)
+ if(stat != 2) close_up()
return
/mob/living/silicon/pai/attack_hand(mob/user as mob)
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index b16efbc34f7..ca3c80d3a74 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -1,72 +1,15 @@
-/mob/living/silicon/robot/gib()
- //robots don't die when gibbed. instead they drop their MMI'd brain
- var/atom/movable/overlay/animation = null
- monkeyizing = 1
- canmove = 0
- icon = null
- invisibility = 101
-
- animation = new(loc)
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
-
- flick("gibbed-r", animation)
- robogibs(loc, viruses)
-
- living_mob_list -= src
- dead_mob_list -= src
- spawn(15)
- if(animation) del(animation)
- if(src) del(src)
-
/mob/living/silicon/robot/dust()
- death(1)
- var/atom/movable/overlay/animation = null
- monkeyizing = 1
- canmove = 0
- icon = null
- invisibility = 101
-
- animation = new(loc)
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
-
- flick("dust-r", animation)
- new /obj/effect/decal/remains/robot(loc)
- if(mmi) del(mmi) //Delete the MMI first so that it won't go popping out.
-
- dead_mob_list -= src
- spawn(15)
- if(animation) del(animation)
- if(src) del(src)
-
+ //Delete the MMI first so that it won't go popping out.
+ if(mmi)
+ del(mmi)
+ ..()
/mob/living/silicon/robot/death(gibbed)
- if(stat == DEAD) return
- if(!gibbed)
- emote("deathgasp")
- stat = DEAD
- update_canmove()
if(camera)
camera.status = 0
-
- if(in_contents_of(/obj/machinery/recharge_station))//exit the recharge station
- var/obj/machinery/recharge_station/RC = loc
- RC.go_out()
-
+ if(module)
+ var/obj/item/weapon/gripper/G = locate(/obj/item/weapon/gripper) in module
+ if(G) G.drop_item()
remove_robot_verbs()
-
- if(blind) blind.layer = 0
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_LEVEL_TWO
- updateicon()
-
- tod = worldtime2text() //weasellos time of death patch
- if(mind) mind.store_memory("Time of death: [tod]", 0)
-
sql_report_cyborg_death(src)
-
- return ..(gibbed)
\ No newline at end of file
+ ..(gibbed,"shudders violently for a moment, then becomes motionless, its eyes slowly darkening.")
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 505b2e47ffb..7443bd7464d 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -200,14 +200,6 @@
return
..()
-/mob/living/silicon/robot/drone/death(gibbed)
-
- if(module)
- var/obj/item/weapon/gripper/G = locate(/obj/item/weapon/gripper) in module
- if(G) G.drop_item()
-
- ..(gibbed)
-
//DRONE MOVEMENT.
/mob/living/silicon/robot/drone/Process_Spaceslipping(var/prob_slip)
//TODO: Consider making a magboot item for drones to equip. ~Z
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f2aa919eb00..8c1af389ad3 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -515,13 +515,6 @@ var/list/robot_verbs_default = list(
C.toggled = 1
src << "\red You enable [C.name]."
-/mob/living/silicon/robot/blob_act()
- if (stat != 2)
- adjustBruteLoss(60)
- updatehealth()
- return 1
- return 0
-
// this function shows information about the malf_ai gameplay type in the status screen
/mob/living/silicon/robot/show_malf_ai()
..()
@@ -575,29 +568,6 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/restrained()
return 0
-
-/mob/living/silicon/robot/ex_act(severity)
- if(!blinded)
- flick("flash", flash)
-
- switch(severity)
- if(1.0)
- if (stat != 2)
- adjustBruteLoss(100)
- adjustFireLoss(100)
- gib()
- return
- if(2.0)
- if (stat != 2)
- adjustBruteLoss(60)
- adjustFireLoss(60)
- if(3.0)
- if (stat != 2)
- adjustBruteLoss(30)
-
- updatehealth()
-
-
/mob/living/silicon/robot/meteorhit(obj/O as obj)
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [src] has been hit by [O]"), 1)
@@ -609,14 +579,11 @@ var/list/robot_verbs_default = list(
updatehealth()
return
-
/mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
- updatehealth()
if(prob(75) && Proj.damage > 0) spark_system.start()
return 2
-
/mob/living/silicon/robot/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
if ((!( yes ) || now_pushing))
@@ -977,7 +944,7 @@ var/list/robot_verbs_default = list(
return 1
return 0
-/mob/living/silicon/robot/proc/updateicon()
+/mob/living/silicon/robot/updateicon()
overlays.Cut()
if(stat == 0)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 93d4438d7b4..65f2d93acca 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -75,8 +75,14 @@
/mob/living/silicon/IsAdvancedToolUser()
return 1
-/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
+/mob/living/silicon/blob_act()
+ if (src.stat != 2)
+ src.adjustBruteLoss(60)
+ src.updatehealth()
+ return 1
+ return 0
+/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
if(!Proj.nodamage)
switch(Proj.damage_type)
@@ -86,7 +92,7 @@
adjustFireLoss(Proj.damage)
Proj.on_hit(src,2)
-
+ updatehealth()
return 2
/mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0)
@@ -251,3 +257,24 @@
return 1
return 0
+
+/mob/living/silicon/ex_act(severity)
+ if(!blinded)
+ flick("flash", flash)
+
+ switch(severity)
+ if(1.0)
+ if (stat != 2)
+ adjustBruteLoss(100)
+ adjustFireLoss(100)
+ if(!anchored)
+ gib()
+ if(2.0)
+ if (stat != 2)
+ adjustBruteLoss(60)
+ adjustFireLoss(60)
+ if(3.0)
+ if (stat != 2)
+ adjustBruteLoss(30)
+
+ updatehealth()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 444c98ea387..24b556649a6 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -35,14 +35,10 @@
spell_list += new spell(src)
/mob/living/simple_animal/construct/death()
- ..()
new /obj/item/weapon/ectoplasm (src.loc)
- for(var/mob/M in viewers(src, null))
- if((M.client && !( M.blinded )))
- M.show_message("\red [src] collapses in a shattered heap. ")
+ ..(null,"collapses in a shattered heap.")
ghostize()
del src
- return
/mob/living/simple_animal/construct/examine(mob/user)
..(user)
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 9900249c34f..4cd203ee08a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -43,11 +43,8 @@
/mob/living/simple_animal/hostile/mimic/death()
..()
- visible_message("\red [src] stops moving!")
del(src)
-
-
//
// Crate Mimic
//
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index 65f4e6f7874..c6d3052b5d0 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -158,8 +158,7 @@
walk(src,0)
/mob/living/simple_animal/hostile/retaliate/malf_drone/death()
- src.visible_message("\blue \icon[src] [src] suddenly breaks apart.")
- ..()
+ ..(null,"suddenly breaks apart.")
del(src)
/mob/living/simple_animal/hostile/retaliate/malf_drone/Del()
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 6a382021351..ebcdfc1194c 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -158,7 +158,5 @@
minbodytemp = 0
/mob/living/simple_animal/hostile/viscerator/death()
- ..()
- visible_message("\red [src] is smashed into pieces!")
- del src
- return
\ No newline at end of file
+ ..(null,"is smashed into pieces!")
+ del src
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index a908af98688..50b2191d3ed 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -51,7 +51,6 @@
L.visible_message("\the [src] knocks down \the [L]!")
/mob/living/simple_animal/hostile/tree/death()
- ..()
- visible_message("\red [src] is hacked into pieces!")
+ ..(null,"is hacked into pieces!")
new /obj/item/stack/sheet/wood(loc)
del(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 8695741ed82..831f3aa83a4 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -198,12 +198,10 @@
..()
/mob/living/simple_animal/gib()
- if(icon_gib)
- flick(icon_gib, src)
if(meat_amount && meat_type)
for(var/i = 0; i < meat_amount; i++)
new meat_type(src.loc)
- ..()
+ ..(icon_gib,1)
/mob/living/simple_animal/emote(var/act, var/type, var/desc)
if(act)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 6bf10756d0f..aee673df096 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1157,3 +1157,6 @@ mob/proc/yank_out_object()
return I
return 0
+
+/mob/proc/updateicon()
+ return
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index b4d20155389..91e97c0cb5b 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -11,7 +11,7 @@ nanoui is used to open and update nano browser uis
#define STATUS_UPDATE 1 // ORANGE Visability
#define STATUS_DISABLED 0 // RED Visability
-/datum/nanoui
+/datum/nanoui
// the user who opened this ui
var/mob/user
// the object this ui "belongs" to
@@ -103,13 +103,13 @@ nanoui is used to open and update nano browser uis
add_script("libraries.min.js") // A JS file comprising of jQuery, doT.js and jQuery Timer libraries (compressed together)
add_script("nano_utility.js") // The NanoUtility JS, this is used to store utility functions.
add_script("nano_template.js") // The NanoTemplate JS, this is used to render templates.
- add_script("nano_state_manager.js") // The NanoStateManager JS, it handles updates from the server and passes data to the current state
- add_script("nano_state.js") // The NanoState JS, this is the base state which all states must inherit from
- add_script("nano_state_default.js") // The NanoStateDefault JS, this is the "default" state (used by all UIs by default), which inherits from NanoState
+ add_script("nano_state_manager.js") // The NanoStateManager JS, it handles updates from the server and passes data to the current state
+ add_script("nano_state.js") // The NanoState JS, this is the base state which all states must inherit from
+ add_script("nano_state_default.js") // The NanoStateDefault JS, this is the "default" state (used by all UIs by default), which inherits from NanoState
add_script("nano_base_callbacks.js") // The NanoBaseCallbacks JS, this is used to set up (before and after update) callbacks which are common to all UIs
add_script("nano_base_helpers.js") // The NanoBaseHelpers JS, this is used to set up template helpers which are common to all UIs
add_stylesheet("shared.css") // this CSS sheet is common to all UIs
- add_stylesheet("icons.css") // this CSS sheet is common to all UIs
+ add_stylesheet("icons.css") // this CSS sheet is common to all UIs
/**
* Set the current status (also known as visibility) of this ui.
@@ -127,7 +127,7 @@ nanoui is used to open and update nano browser uis
update()
else
status = state
- if (push_update || status == 0)
+ if (push_update || status == 0)
push_data(null, 1) // Update the UI, force the update in case the status is 0, data is null so that previous data is used
/**
@@ -138,7 +138,7 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/update_status(var/push_update = 0)
- if (istype(user, /mob/living/silicon/ai))
+ if (istype(user, /mob/living/silicon/ai) || (get_dist(get_turf(user),get_turf(src_object)) <= 1))
set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility)
else if (istype(user, /mob/living/silicon/robot))
if (src_object in view(7, user)) // robots can see and interact with things they can see within 7 tiles
@@ -151,12 +151,12 @@ nanoui is used to open and update nano browser uis
if (dist > 4)
close()
return
-
+
if ((allowed_user_stat > -1) && (user.stat > allowed_user_stat))
set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility)
else if (user.restrained() || user.lying)
set_status(STATUS_UPDATE, push_update) // update only (orange visibility)
- else if (istype(src_object, /obj/item/device/uplink/hidden)) // You know what if they have the uplink open let them use the UI
+ else if (istype(src_object, /obj/item/device/uplink/hidden)) // You know what if they have the uplink open let them use the UI
set_status(STATUS_INTERACTIVE, push_update) // Will build in distance checks on the topics for sanity.
else if (!(src_object in view(4, user))) // If the src object is not in visable, set status to 0
set_status(STATUS_DISABLED, push_update) // interactive (green visibility)
@@ -203,7 +203,7 @@ nanoui is used to open and update nano browser uis
"showMap" = show_map,
"mapZLevel" = map_z_level,
"user" = list("name" = user.name)
- )
+ )
return config_data
/**
@@ -215,12 +215,12 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/get_send_data(var/list/data)
var/list/config_data = get_config_data()
-
+
var/list/send_data = list("config" = config_data)
-
+
if (!isnull(data))
send_data["data"] = data
-
+
return send_data
/**
@@ -267,11 +267,11 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/add_template(key, filename)
templates[key] = filename
-
+
/**
* Set the layout key for use in the frontend Javascript
* The layout key is the basic layout key for the page
- * Two files are loaded on the client based on the layout key varable:
+ * Two files are loaded on the client based on the layout key varable:
* -> a template in /nano/templates with the filename "layout_.tmpl
* -> a CSS stylesheet in /nano/css with the filename "layout_.css
*
@@ -301,7 +301,7 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/set_auto_update_content(nstate)
auto_update_content = nstate
-
+
/**
* Set the state key for use in the frontend Javascript
*
@@ -310,8 +310,8 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/set_state_key(nstate_key)
- state_key = nstate_key
-
+ state_key = nstate_key
+
/**
* Toggle showing the map ui
*
@@ -321,7 +321,7 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/set_show_map(nstate)
show_map = nstate
-
+
/**
* Toggle showing the map ui
*
@@ -352,15 +352,15 @@ nanoui is used to open and update nano browser uis
// before the UI opens, add the layout files based on the layout key
add_stylesheet("layout_[layout_key].css")
add_template("layout", "layout_[layout_key].tmpl")
-
+
var/head_content = ""
-
+
for (var/filename in scripts)
head_content += " "
-
+
for (var/filename in stylesheets)
head_content += " "
-
+
var/template_data_json = "{}" // An empty JSON object
if (templates.len > 0)
template_data_json = list2json(templates)
@@ -378,7 +378,7 @@ nanoui is used to open and update nano browser uis
[head_content]
-
+