diff --git a/.travis.yml b/.travis.yml
index 5895a706b17..4171bbe84ac 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -17,5 +17,5 @@ install:
- cd ..
script:
- - (! grep -q 'step_[xy]' maps/tgstation2.dmm)
+ - $(for i in 1 2 3 4 5 6; do (grep -q 'step_[xy]' maps/exodus-$i.dmm; if [ $? -eq 1 ]; then exit 0; else exit 1; fi) done)
- DreamMaker baystation12.dme
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/WorkInProgress/computer3/computers/medical.dm b/code/WorkInProgress/computer3/computers/medical.dm
index 5cb984ee362..f7e6167e1df 100644
--- a/code/WorkInProgress/computer3/computers/medical.dm
+++ b/code/WorkInProgress/computer3/computers/medical.dm
@@ -377,6 +377,8 @@
src.active1.fields["p_stat"] = "Physically Unfit"
if("disabled")
src.active1.fields["p_stat"] = "Disabled"
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
if (href_list["m_stat"])
if (src.active1)
@@ -525,4 +527,4 @@
src.printing = null
interact()
- return
+ return
\ No newline at end of file
diff --git a/code/WorkInProgress/computer3/computers/security.dm b/code/WorkInProgress/computer3/computers/security.dm
index f3a3d3ae2bb..1c409da853e 100644
--- a/code/WorkInProgress/computer3/computers/security.dm
+++ b/code/WorkInProgress/computer3/computers/security.dm
@@ -594,6 +594,8 @@ What a mess.*/
R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released")
if(5)
R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
if(6)
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
continue
@@ -606,4 +608,4 @@ What a mess.*/
/obj/machinery/computer3/secure_data/detective_computer
icon = 'icons/obj/computer.dmi'
- icon_state = "messyfiles"
+ icon_state = "messyfiles"
\ No newline at end of file
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 1612f1ce7bf..cfac858e252 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -50,8 +50,10 @@
placeholder = 2
if (!( isnum(num) ))
return
- if (!( num ))
- return "0"
+ if (num == 0)
+ var/final = ""
+ for(var/i=1 to placeholder) final = "[final]0"
+ return final
var/hex = ""
var/i = 0
while(16 ** i < num)
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/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 7f115404b3d..3f7ddbceb2a 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1040,6 +1040,7 @@ var/list/ghostteleportlocs = list()
/area/holodeck/source_space
name = "\improper Holodeck - Space"
+ has_gravity = 0
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/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 961f38fc0d9..52f1ff6286e 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -2,6 +2,7 @@
icon_state = "paper_talisman"
var/imbue = null
var/uses = 0
+ info = "
"
attack_self(mob/living/user as mob)
if(iscultist(user))
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/adv_med.dm b/code/game/machinery/adv_med.dm
index 97e61e5707b..98ebc5a6265 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -330,9 +330,9 @@
dat += text("Inaprovaline: [] units
", occ["inaprovaline_amount"])
dat += text("Soporific: [] units
", occ["stoxin_amount"])
- dat += text("[]\tDermaline: [] units
", (occ["dermaline"] < 30 ? "" : ""), occ["dermaline"])
- dat += text("[]\tBicaridine: [] units
", (occ["bicaridine"] < 30 ? "" : ""), occ["bicaridine"])
- dat += text("[]\tDexalin: [] units
", (occ["dexalin"] < 30 ? "" : ""), occ["dexalin"])
+ dat += text("[]\tDermaline: [] units
", (occ["dermaline_amount"] < 30 ? "" : ""), occ["dermaline_amount"])
+ dat += text("[]\tBicaridine: [] units
", (occ["bicaridine_amount"] < 30 ? "" : ""), occ["bicaridine_amount"])
+ dat += text("[]\tDexalin: [] units
", (occ["dexalin_amount"] < 30 ? "" : ""), occ["dexalin_amount"])
for(var/datum/disease/D in occ["tg_diseases_list"])
if(!D.hidden[SCANNER])
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 984d6816ce4..1c9fe7cfe5a 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -19,11 +19,19 @@ var/global/list/holodeck_programs = list(
name = "Holodeck Control Computer"
desc = "A computer used to control a nearby holodeck."
icon_state = "holocontrol"
+
+ use_power = 1
+ active_power_usage = 8000 //8kW for the scenery + 500W per holoitem
+ var/item_power_usage = 500
+
var/area/linkedholodeck = null
var/area/target = null
var/active = 0
var/list/holographic_items = list()
+ var/list/holographic_mobs = list()
var/damaged = 0
+ var/safety_disabled = 0
+ var/mob/last_to_emag = null
var/last_change = 0
var/list/supported_programs = list( \
"Empty Court" = "emptycourt", \
@@ -38,84 +46,111 @@ var/global/list/holodeck_programs = list(
"Theatre" = "theatre", \
"Meeting Hall" = "meetinghall" \
)
- var/list/restricted_programs = list("Atmospheric Burn Simulation" = "burntest", "ildlife Simulation" = "wildlifecarp")
+ var/list/restricted_programs = list("Atmospheric Burn Simulation" = "burntest", "Wildlife Simulation" = "wildlifecarp")
- attack_ai(var/mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob)
+ return src.attack_hand(user)
- attack_hand(var/mob/user as mob)
+/obj/machinery/computer/HolodeckControl/attack_hand(var/mob/user as mob)
- if(..())
- return
- user.set_machine(src)
- var/dat
+ if(..())
+ return
+ user.set_machine(src)
+ var/dat
- dat += "Holodeck Control System
"
- dat += "
Current Loaded Programs:
"
- for(var/prog in supported_programs)
- dat += "(([prog]))
"
+ dat += "Holodeck Control System
"
+ dat += "
Current Loaded Programs:
"
+ for(var/prog in supported_programs)
+ dat += "(([prog]))
"
- dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
"
+ dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
"
- if(issilicon(user))
- if(emagged)
- dat += "(Re-Enable Safety Protocols?)
"
+ if(issilicon(user))
+ if(safety_disabled)
+ if (emagged)
+ dat += "ERROR: Cannot re-enable Safety Protocols.
"
else
- dat += "(Override Safety Protocols?)
"
-
- if(emagged)
- for(var/prog in restricted_programs)
- dat += "(Begin [prog])
"
- dat += "Ensure the holodeck is empty before testing.
"
- dat += "
"
- dat += "Safety Protocols are DISABLED
"
+ dat += "(Re-Enable Safety Protocols?)
"
else
- dat += "Safety Protocols are ENABLED
"
+ dat += "(Override Safety Protocols?)
"
- user << browse(dat, "window=computer;size=400x500")
- onclose(user, "computer")
+ if(safety_disabled)
+ for(var/prog in restricted_programs)
+ dat += "(Begin [prog])
"
+ dat += "Ensure the holodeck is empty before testing.
"
+ dat += "
"
+ dat += "Safety Protocols are DISABLED
"
+ else
+ dat += "Safety Protocols are ENABLED
"
+ user << browse(dat, "window=computer;size=400x500")
+ onclose(user, "computer")
+
+ return
+
+
+/obj/machinery/computer/HolodeckControl/Topic(href, href_list)
+ if(..())
return
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ usr.set_machine(src)
+ if(href_list["program"])
+ var/prog = href_list["program"]
+ if(prog in holodeck_programs)
+ target = locate(holodeck_programs[prog])
+ if(target)
+ loadProgram(target)
- Topic(href, href_list)
- if(..())
- return
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
+ else if(href_list["AIoverride"])
+ if(!issilicon(usr))
+ return
+
+ if(safety_disabled && emagged)
+ return //if a traitor has gone through the trouble to emag the thing, let them keep it.
+
+ safety_disabled = !safety_disabled
+ update_projections()
+ if(safety_disabled)
+ message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
+ log_game("[key_name(usr)] overrided the holodeck's safeties")
+ else
+ message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
+ log_game("[key_name(usr)] restored the holodeck's safeties")
- if(href_list["program"])
- var/prog = href_list["program"]
- if(prog in holodeck_programs)
- target = locate(holodeck_programs[prog])
- if(target)
- loadProgram(target)
-
- else if(href_list["AIoverride"])
- if(!issilicon(usr)) return
- emagged = !emagged
- if(emagged)
- message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
- log_game("[key_name(usr)] overrided the holodeck's safeties")
- else
- message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
- log_game("[key_name(usr)] restored the holodeck's safeties")
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
-
-
-/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
- if(istype(D, /obj/item/weapon/card/emag) && !emagged)
- playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
- emagged = 1
- user << "\blue You vastly increase projector power and override the safety and security protocols."
- user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator."
- log_game("[key_name(usr)] emagged the Holodeck Control Computer")
+ src.add_fingerprint(usr)
src.updateUsrDialog()
return
+/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
+ if(istype(D, /obj/item/weapon/card/emag))
+ playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
+ last_to_emag = user //emag again to change the owner
+ if (!emagged)
+ emagged = 1
+ safety_disabled = 1
+ update_projections()
+ user << "You vastly increase projector power and override the safety and security protocols."
+ user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator."
+ log_game("[key_name(usr)] emagged the Holodeck Control Computer")
+ src.updateUsrDialog()
+ return
+
+/obj/machinery/computer/HolodeckControl/proc/update_projections()
+ if (safety_disabled)
+ item_power_usage = 2500
+ for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
+ H.damtype = BRUTE
+ else
+ item_power_usage = initial(item_power_usage)
+ for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
+ H.damtype = initial(H.damtype)
+
+ for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
+ C.set_safety(!safety_disabled)
+ if (last_to_emag)
+ C.friends = list(last_to_emag)
+
/obj/machinery/computer/HolodeckControl/New()
..()
linkedholodeck = locate(/area/holodeck/alphadeck)
@@ -148,14 +183,27 @@ var/global/list/holodeck_programs = list(
emergencyShutdown()
..()
+/obj/machinery/computer/HolodeckControl/power_change()
+ var/oldstat
+ ..()
+ if (stat != oldstat && active && (stat & NOPOWER))
+ emergencyShutdown()
+
/obj/machinery/computer/HolodeckControl/process()
for(var/item in holographic_items) // do this first, to make sure people don't take items out when power is down.
if(!(get_turf(item) in linkedholodeck))
derez(item, 0)
-
+
+ if (!safety_disabled)
+ for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
+ if (get_area(C.loc) != linkedholodeck)
+ holographic_mobs -= C
+ C.derez()
+
if(!..())
return
if(active)
+ use_power(item_power_usage * (holographic_items.len + holographic_mobs.len))
if(!checkInteg(linkedholodeck))
damaged = 1
@@ -163,6 +211,7 @@ var/global/list/holodeck_programs = list(
if(target)
loadProgram(target)
active = 0
+ use_power = 1
for(var/mob/M in range(10,src))
M.show_message("The holodeck overloads!")
@@ -199,6 +248,7 @@ var/global/list/holodeck_programs = list(
return 1
+//Why is it called toggle if it doesn't toggle?
/obj/machinery/computer/HolodeckControl/proc/togglePower(var/toggleOn = 0)
if(toggleOn)
@@ -218,12 +268,14 @@ var/global/list/holodeck_programs = list(
T.hotspot_expose(50000,50000,1)
active = 1
+ use_power = 2
else
for(var/item in holographic_items)
derez(item)
var/area/targetsource = locate(/area/holodeck/source_plating)
targetsource.copy_contents_to(linkedholodeck , 1)
active = 0
+ use_power = 1
/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/area/A)
@@ -238,22 +290,20 @@ var/global/list/holodeck_programs = list(
last_change = world.time
active = 1
+ use_power = 2
for(var/item in holographic_items)
derez(item)
+ for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
+ holographic_mobs -= C
+ C.derez()
+
for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
del(B)
- for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck)
- del(C)
-
holographic_items = A.copy_contents_to(linkedholodeck , 1)
- if(emagged)
- for(var/obj/item/weapon/holo/esword/H in linkedholodeck)
- H.damtype = BRUTE
-
spawn(30)
for(var/obj/effect/landmark/L in linkedholodeck)
if(L.name=="Atmospheric Test Start")
@@ -266,13 +316,22 @@ var/global/list/holodeck_programs = list(
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
if(L.name=="Holocarp Spawn")
- new /mob/living/simple_animal/hostile/carp(L.loc)
+ holographic_mobs += new /mob/living/simple_animal/hostile/carp/holodeck(L.loc)
+
+ if(L.name=="Holocarp Spawn Random")
+ if (prob(4)) //With 4 spawn points, carp should only appear 15% of the time.
+ holographic_mobs += new /mob/living/simple_animal/hostile/carp/holodeck(L.loc)
+
+ update_projections()
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
//Get rid of any items
for(var/item in holographic_items)
derez(item)
+ for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
+ holographic_mobs -= C
+ C.derez()
//Turn it back to the regular non-holographic room
target = locate(/area/holodeck/source_plating)
if(target)
@@ -281,6 +340,7 @@ var/global/list/holodeck_programs = list(
var/area/targetsource = locate(/area/holodeck/source_plating)
targetsource.copy_contents_to(linkedholodeck , 1)
active = 0
+ use_power = 1
@@ -327,17 +387,6 @@ var/global/list/holodeck_programs = list(
/obj/structure/table/holotable/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
- var/obj/item/weapon/grab/G = W
- if(G.state<2)
- user << "\red You need a better grip to do that!"
- return
- G.affecting.loc = src.loc
- G.affecting.Weaken(5)
- visible_message("\red [G.assailant] puts [G.affecting] on the table.")
- del(W)
- return
-
if (istype(W, /obj/item/weapon/wrench))
user << "It's a holotable! There are no bolts!"
return
@@ -424,13 +473,13 @@ var/global/list/holodeck_programs = list(
icon_state = "sword[item_color]"
w_class = 4
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
- user << "\blue [src] is now active."
+ user << "[src] is now active."
else
force = 3
icon_state = "sword0"
w_class = 2
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
- user << "\blue [src] can now be concealed."
+ user << "[src] can now be concealed."
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -463,16 +512,16 @@ var/global/list/holodeck_programs = list(
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if(G.state<2)
- user << "\red You need a better grip to do that!"
+ user << "You need a better grip to do that!"
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
- visible_message("\red [G.assailant] dunks [G.affecting] into the [src]!", 3)
+ visible_message("[G.assailant] dunks [G.affecting] into the [src]!", 3)
del(W)
return
else if (istype(W, /obj/item) && get_dist(src,user)<2)
user.drop_item(src)
- visible_message("\blue [user] dunks [W] into the [src]!", 3)
+ visible_message("[user] dunks [W] into the [src]!", 3)
return
/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
@@ -482,9 +531,9 @@ var/global/list/holodeck_programs = list(
return
if(prob(50))
I.loc = src.loc
- visible_message("\blue Swish! \the [I] lands in \the [src].", 3)
+ visible_message("Swish! \the [I] lands in \the [src].", 3)
else
- visible_message("\red \the [I] bounces off of \the [src]'s rim!", 3)
+ visible_message("\The [I] bounces off of \the [src]'s rim!", 3)
return 0
else
return ..(mover, target, height, air_group)
@@ -577,4 +626,40 @@ var/global/list/holodeck_programs = list(
/obj/structure/rack/holorack/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
user << "It's a holorack! You can't unwrench it!"
- return
\ No newline at end of file
+ return
+
+//Holocarp
+
+/mob/living/simple_animal/hostile/carp/holodeck
+ icon = 'icons/mob/AI.dmi'
+ icon_state = "holo4"
+ icon_living = "holo4"
+ icon_dead = "holo4"
+ icon_gib = null
+ meat_amount = 0
+ meat_type = null
+
+/mob/living/simple_animal/hostile/carp/holodeck/proc/set_safety(var/safe)
+ if (safe)
+ faction = "neutral"
+ melee_damage_lower = 0
+ melee_damage_upper = 0
+ wall_smash = 0
+ destroy_surroundings = 0
+ else
+ faction = "carp"
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
+ wall_smash = initial(wall_smash)
+ destroy_surroundings = initial(destroy_surroundings)
+
+/mob/living/simple_animal/hostile/carp/holodeck/gib()
+ derez() //holograms can't gib
+
+/mob/living/simple_animal/hostile/carp/holodeck/death()
+ ..()
+ derez()
+
+/mob/living/simple_animal/hostile/carp/holodeck/proc/derez()
+ visible_message("\The [src] fades away!")
+ del(src)
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 f21322a3e20..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
@@ -364,6 +364,8 @@
src.active1.fields["p_stat"] = "Physically Unfit"
if("disabled")
src.active1.fields["p_stat"] = "Disabled"
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
if (href_list["m_stat"])
if (src.active1)
@@ -533,6 +535,8 @@
R.fields["b_type"] = pick("A-", "B-", "AB-", "O-", "A+", "B+", "AB+", "O+")
if(5)
R.fields["p_stat"] = pick("*SSD*", "Active", "Physically Unfit", "Disabled")
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
if(6)
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
continue
@@ -547,4 +551,4 @@
/obj/machinery/computer/med_data/laptop
name = "Medical Laptop"
desc = "Cheap Nanotrasen Laptop."
- icon_state = "medlaptop"
+ icon_state = "medlaptop"
\ No newline at end of file
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index f1f866864a7..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
@@ -598,6 +598,8 @@ What a mess.*/
R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released")
if(5)
R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
if(6)
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
continue
@@ -610,4 +612,4 @@ What a mess.*/
/obj/machinery/computer/secure_data/detective_computer
icon = 'icons/obj/computer.dmi'
- icon_state = "messyfiles"
+ icon_state = "messyfiles"
\ No newline at end of file
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 21d584fe8bc..98c75daf570 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -401,6 +401,8 @@ What a mess.*/
R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released")
if(5)
R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
if(6)
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
continue
@@ -409,4 +411,4 @@ What a mess.*/
del(R)
continue
- ..(severity)
+ ..(severity)
\ No newline at end of file
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/admin.dm b/code/modules/admin/admin.dm
index 93b2824ebe1..07bca599952 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -169,17 +169,29 @@ var/global/floorIsLava = 0
Shade
"}
-
- if (M.client)
- body += {"
+ body += {"
Other actions:
- Forcesay |
+ Forcesay
+ "}
+ if (M.client)
+ body += {" |
Thunderdome 1 |
Thunderdome 2 |
Thunderdome Admin |
Thunderdome Observer |
"}
+ // language toggles
+ body += "
Languages:
"
+ var/f = 1
+ for(var/k in all_languages)
+ var/datum/language/L = all_languages[k]
+ if(!f) body += " | "
+ else f = 0
+ if(L in M.languages)
+ body += "[k]"
+ else
+ body += "[k]"
body += {"