diff --git a/code/WorkInProgress/AI_Visibility.dm b/code/WorkInProgress/AI_Visibility.dm
index a51e04b0cd6..cf3eadb2b38 100644
--- a/code/WorkInProgress/AI_Visibility.dm
+++ b/code/WorkInProgress/AI_Visibility.dm
@@ -8,6 +8,9 @@
//(And therefore also be portable to another similar codebase simply by transferring the file and including it after the other AI code files.)
//There are probably a few parts that don't do that at the moment, but I'll fix them at some point.
+
+#define MINIMAP_UPDATE_DELAY 1200
+
/turf
var/image/obscured
var/image/dim
@@ -33,9 +36,128 @@
var/list/turfs = list()
var/list/seenby = list()
var/visible = 0
- var/changed = 0
+ var/changed = 1
var/updating = 0
+ var/x
+ var/y
+ var/z
+
+ var/minimap_updating = 0
+
+ var/icon/minimap_icon = new('minimap.dmi', "chunk_base")
+ var/obj/minimap_obj/minimap_obj = new()
+
+/obj/minimap_obj/Click(location, control, params)
+ if(!istype(usr, /mob/dead) && !istype(usr, /mob/living/silicon/ai) && !(usr.client && usr.client.holder && usr.client.holder.level >= 4))
+ return
+
+ var/list/par = params2list(params)
+ var/screen_loc = par["screen-loc"]
+
+ if(findtext(screen_loc, "minimap:") != 1)
+ return
+
+ screen_loc = copytext(screen_loc, length("minimap:") + 1)
+
+ var/x_text = copytext(screen_loc, 1, findtext(screen_loc, ","))
+ var/y_text = copytext(screen_loc, findtext(screen_loc, ",") + 1)
+
+ var/x = (text2num(copytext(x_text, 1, findtext(x_text, ":"))) - 1) * 16
+ x += round((text2num(copytext(x_text, findtext(x_text, ":") + 1)) + 1) / 2)
+
+ var/y = (text2num(copytext(y_text, 1, findtext(y_text, ":"))) - 1) * 16
+ y += round((text2num(copytext(y_text, findtext(y_text, ":") + 1)) + 1) / 2)
+
+ if(istype(usr, /mob/living/silicon/ai))
+ var/mob/living/silicon/ai/ai = usr
+ ai.freelook()
+ ai.eyeobj.loc = locate(max(1, x - 1), max(1, y - 1), ai.eyeobj.z)
+ cameranet.visibility(ai.eyeobj)
+
+ else
+ usr.loc = locate(max(1, x - 1), max(1, y - 1), usr.z)
+
+/mob/dead/verb/Open_Minimap()
+ set category = "Ghost"
+ winshow(src, "minimapwindow", 1)
+ client.screen |= cameranet.minimap
+
+ if(cameranet.generating_minimap)
+ cameranet.minimap_viewers += src
+
+/mob/living/silicon/ai/verb/Open_Minimap()
+ set category = "AI Commands"
+ winshow(src, "minimapwindow", 1)
+ client.screen |= cameranet.minimap
+
+ if(cameranet.generating_minimap)
+ cameranet.minimap_viewers += src
+
+/client/proc/Open_Minimap()
+ set category = "Admin"
+ winshow(src, "minimapwindow", 1)
+ screen |= cameranet.minimap
+
+ if(cameranet.generating_minimap)
+ cameranet.minimap_viewers += src.mob
+
+/datum/camerachunk/proc/update_minimap()
+ if(changed && !updating)
+ update()
+
+ minimap_icon.Blend(rgb(255, 0, 0), ICON_MULTIPLY)
+
+ var/list/turfs = visibleTurfs | dimTurfs
+
+ for(var/turf/turf in turfs)
+ var/x = (turf.x & 0xf) * 2
+ var/y = (turf.y & 0xf) * 2
+
+ if(turf.density)
+ minimap_icon.DrawBox(rgb(100, 100, 100), x + 1, y + 1, x + 2, y + 2)
+ continue
+
+ else if(istype(turf, /turf/space))
+ minimap_icon.DrawBox(rgb(0, 0, 0), x + 1, y + 1, x + 2, y + 2)
+
+ else
+ minimap_icon.DrawBox(rgb(200, 200, 200), x + 1, y + 1, x + 2, y + 2)
+
+ for(var/obj/structure/o in turf)
+ if(o.density)
+ if(istype(o, /obj/structure/window) && (o.dir == NORTH || o.dir == SOUTH || o.dir == EAST || o.dir == WEST))
+ if(o.dir == NORTH)
+ minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 2, x + 2, y + 2)
+ else if(o.dir == SOUTH)
+ minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 1, x + 2, y + 1)
+ else if(o.dir == EAST)
+ minimap_icon.DrawBox(rgb(150, 150, 200), x + 3, y + 1, x + 2, y + 2)
+ else if(o.dir == WEST)
+ minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 1, x + 1, y + 2)
+
+ else
+ minimap_icon.DrawBox(rgb(150, 150, 150), x + 1, y + 1, x + 2, y + 2)
+ break
+
+ for(var/obj/machinery/door/o in turf)
+ if(istype(o, /obj/machinery/door/window))
+ if(o.dir == NORTH)
+ minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 2, x + 2, y + 2)
+ else if(o.dir == SOUTH)
+ minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 2, y + 1)
+ else if(o.dir == EAST)
+ minimap_icon.DrawBox(rgb(100, 150, 100), x + 2, y + 1, x + 2, y + 2)
+ else if(o.dir == WEST)
+ minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 1, y + 2)
+
+ else
+ minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 2, y + 2)
+ break
+
+ minimap_obj.screen_loc = "minimap:[src.x / 16],[src.y / 16]"
+ minimap_obj.icon = minimap_icon
+
/mob/aiEye
var/list/visibleCameraChunks = list()
var/mob/ai = null
@@ -50,6 +172,7 @@
seenby += ai
if(changed && !updating)
update()
+ changed = 0
/datum/camerachunk/proc/remove(mob/aiEye/ai)
ai.visibleCameraChunks -= src
@@ -76,20 +199,28 @@
else
changed = 1
+ if(!minimap_updating)
+ minimap_updating = 1
+
+ spawn(MINIMAP_UPDATE_DELAY)
+ if(changed && !updating)
+ update()
+ changed = 0
+
+ update_minimap()
+ minimap_updating = 0
+
/datum/camerachunk/proc/update()
+
var/list/newDimTurfs = list()
var/list/newVisibleTurfs = list()
for(var/obj/machinery/camera/c in cameras)
var/lum = c.luminosity
c.luminosity = 7
- for(var/turf/t in view(7, c))
- if(t in turfs)
- newDimTurfs += t
- for(var/turf/t in view(6, c))
- if(t in turfs)
- newVisibleTurfs += t
+ newDimTurfs |= turfs & view(7, c)
+ newVisibleTurfs |= turfs & view(6, c)
c.luminosity = lum
@@ -154,29 +285,26 @@
m.ai.client.images += t.obscured
-
/datum/camerachunk/New(loc, x, y, z)
x &= ~0xf
y &= ~0xf
+ src.x = x
+ src.y = y
+ src.z = z
+
for(var/obj/machinery/camera/c in range(16, locate(x + 8, y + 8, z)))
if(c.status)
cameras += c
- for(var/turf/t in range(10, locate(x + 8, y + 8, z)))
- if(t.x >= x && t.y >= y && t.x < x + 16 && t.y < y + 16)
- turfs += t
+ turfs = block(locate(x, y, z), locate(min(world.maxx, x + 15), min(world.maxy, y + 15), z))
for(var/obj/machinery/camera/c in cameras)
var/lum = c.luminosity
c.luminosity = 7
- for(var/turf/t in view(7, c))
- if(t in turfs)
- dimTurfs += t
- for(var/turf/t in view(6, c))
- if(t in turfs)
- visibleTurfs += t
+ dimTurfs |= turfs & view(7, c)
+ visibleTurfs |= turfs & view(6, c)
c.luminosity = lum
@@ -197,6 +325,8 @@
dim += t.dim
+ cameranet.minimap += minimap_obj
+
var/datum/cameranet/cameranet = new()
/datum/cameranet
@@ -205,9 +335,27 @@ var/datum/cameranet/cameranet = new()
var/network = "net1"
var/ready = 0
+ var/list/minimap = list()
+
+ var/generating_minimap = TRUE
+ var/list/minimap_viewers = list()
+
/datum/cameranet/New()
..()
+ spawn(200)
+ for(var/x = 0, x <= world.maxx, x += 16)
+ for(var/y = 0, y <= world.maxy, y += 16)
+ sleep(1)
+ var/datum/camerachunk/c = getCameraChunk(x, y, 1)
+ c.update_minimap()
+
+ for(var/mob/m in minimap_viewers)
+ m.client.screen |= c.minimap_obj
+
+ generating_minimap = FALSE
+ minimap_viewers = list()
+
/datum/cameranet/proc/chunkGenerated(x, y, z)
var/key = "[x],[y],[z]"
return key in chunks
@@ -301,6 +449,7 @@ var/datum/cameranet/cameranet = new()
// machine = null
if(!eyeobj) //if it got deleted somehow (like an admin trying to fix things <.<')
eyeobj = new()
+ eyeobj.ai = src
client.eye = eyeobj
eyeobj.loc = loc
cameranet.visibility(eyeobj)
@@ -368,12 +517,6 @@ var/datum/cameranet/cameranet = new()
return 1
return 0
-/mob/living/silicon/ai/switchCamera(var/obj/machinery/camera/C)
- if(C && isturf(C.loc))
- eyeobj.loc = C.loc
- cameranet.visibility(eyeobj)
- return
-
/mob/living/silicon/ai/attack_ai(var/mob/user as mob)
if (user != src)
return
@@ -411,5 +554,20 @@ var/datum/cameranet/cameranet = new()
set category = "OOC"
reset_view(null)
machine = null
- del eyeobj
- src.freelook()
+
+/mob/living/silicon/ai/reset_view(atom/A)
+ if (client)
+ if(!eyeobj)
+ eyeobj = new()
+ eyeobj.ai = src
+
+ client.eye = eyeobj
+ client.perspective = EYE_PERSPECTIVE
+
+ if (istype(A, /atom/movable))
+ eyeobj.loc = locate(A.x, A.y, A.z)
+
+ else
+ eyeobj.loc = locate(src.x, src.y, src.z)
+
+ cameranet.visibility(eyeobj)
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
index 26b2ff53de0..de50debbcf0 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
@@ -239,9 +239,6 @@
overlays += image("icon" = 'belt_mirror.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
s_store.screen_loc = ui_sstore1
- if (h_store)
- h_store.screen_loc = ui_hstore1
-
if(client) hud_used.other_update() //Update the screenloc of the items on the 'other' inventory bar
//to hide / show them.
if (client)
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 06c6295f442..3fb9960be97 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -792,12 +792,21 @@
/obj/structure/stool/bed/chair/comfy/teal
icon_state = "comfychair_teal"
+/obj/structure/stool/bed/chair/office
+ anchored = 0
+
/obj/structure/stool/bed/chair/comfy/black
icon_state = "comfychair_black"
/obj/structure/stool/bed/chair/comfy/lime
icon_state = "comfychair_lime"
+/obj/structure/stool/bed/chair/office/Move()
+ ..()
+ if(buckled_mob)
+ if(buckled_mob.buckled == src)
+ buckled_mob.loc = src.loc
+ buckled_mob.dir = src.dir
/obj/structure/stool/bed/chair/office/light
icon_state = "officechair_white"
diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm
index be2e9bc8bda..e004018be81 100644
--- a/code/defines/obj/storage.dm
+++ b/code/defines/obj/storage.dm
@@ -129,8 +129,59 @@
desc = "It's a very robust satchel to wear on your back."
icon_state = "satchel"
+/obj/item/weapon/storage/backpack/satchel/withwallet
New()
..()
+ new /obj/item/weapon/storage/wallet/random( src )
+
+// Belt Bags/Satchels
+
+/obj/item/weapon/storage/backpack/satchel_norm
+ name = "satchel"
+ desc = "A trendy looking satchel."
+ icon_state = "satchel-norm"
+
+/obj/item/weapon/storage/backpack/satchel_eng
+ name = "industrial satchel"
+ desc = "A tough satchel with extra pockets."
+ icon_state = "satchel-eng"
+
+/obj/item/weapon/storage/backpack/satchel_med
+ name = "medical satchel"
+ desc = "A sterile satchel used in medical departments."
+ icon_state = "satchel-med"
+
+/obj/item/weapon/storage/backpack/satchel_vir
+ name = "virologist satchel"
+ desc = "A sterile satchel with virologist colours."
+ icon_state = "satchel-vir"
+
+/obj/item/weapon/storage/backpack/satchel_chem
+ name = "chemist satchel"
+ desc = "A sterile satchel with chemist colours."
+ icon_state = "satchel-chem"
+
+/obj/item/weapon/storage/backpack/satchel_gen
+ name = "geneticist satchel"
+ desc = "A sterile satchel with geneticist colours."
+ icon_state = "satchel-gen"
+
+/obj/item/weapon/storage/backpack/satchel_tox
+ name = "scientist satchel"
+ desc = "Useful for holding research materials."
+ icon_state = "satchel-tox"
+
+/obj/item/weapon/storage/backpack/satchel_sec
+ name = "security satchel"
+ desc = "A robust satchel for security related needs."
+ icon_state = "satchel-sec"
+
+/obj/item/weapon/storage/backpack/satchel_hyd
+ name = "hydroponics satchel"
+ desc = "A green satchel for plant related work."
+ icon_state = "satchel_hyd"
+
+
/obj/item/weapon/storage/backpack/bandolier
name = "bandolier"
@@ -211,6 +262,7 @@
desc = "It can hold a few small and personal things."
storage_slots = 4
icon_state = "wallet"
+ w_class = 2
can_hold = list(
"/obj/item/weapon/spacecash",
"/obj/item/weapon/card",
@@ -615,50 +667,3 @@
R.amount = R.max_amount
return
-
-// Belt Bags/Satchels
-
-/obj/item/weapon/storage/backpack/satchel_norm
- name = "satchel"
- desc = "A trendy looking satchel."
- icon_state = "satchel-norm"
-
-/obj/item/weapon/storage/backpack/satchel_eng
- name = "industrial satchel"
- desc = "A tough satchel with extra pockets."
- icon_state = "satchel-eng"
-
-/obj/item/weapon/storage/backpack/satchel_med
- name = "medical satchel"
- desc = "A sterile satchel used in medical departments."
- icon_state = "satchel-med"
-
-/obj/item/weapon/storage/backpack/satchel_vir
- name = "virologist satchel"
- desc = "A sterile satchel with virologist colours."
- icon_state = "satchel-vir"
-
-/obj/item/weapon/storage/backpack/satchel_chem
- name = "chemist satchel"
- desc = "A sterile satchel with chemist colours."
- icon_state = "satchel-chem"
-
-/obj/item/weapon/storage/backpack/satchel_gen
- name = "geneticist satchel"
- desc = "A sterile satchel with geneticist colours."
- icon_state = "satchel-gen"
-
-/obj/item/weapon/storage/backpack/satchel_tox
- name = "scientist satchel"
- desc = "Useful for holding research materials."
- icon_state = "satchel-tox"
-
-/obj/item/weapon/storage/backpack/satchel_sec
- name = "security satchel"
- desc = "A robust satchel for security related needs."
- icon_state = "satchel-sec"
-
-/obj/item/weapon/storage/backpack/satchel_hyd
- name = "hydroponics satchel"
- desc = "A green satchel for plant related work."
- icon_state = "satchel_hyd"
diff --git a/code/game/algorithm.dm b/code/game/algorithm.dm
index f0c1a7f737a..0303b3f0301 100644
--- a/code/game/algorithm.dm
+++ b/code/game/algorithm.dm
@@ -67,7 +67,6 @@ proc/countJob(rank)
slot_r_store = 16
slot_s_store = 17
slot_in_backpack = 18
- slot_h_store = 19
/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1)
for (var/slot in slots)
@@ -86,9 +85,6 @@ proc/countJob(rank)
if(slot == s_store && !src.wear_suit)
del(W)
return
- if(slot == h_store && !src.head)
- del(W)
- return
switch(slot)
if(slot_back)
if(!src.back)
@@ -167,10 +163,6 @@ proc/countJob(rank)
if(B.contents.len < B.storage_slots && W.w_class <= B.max_w_class)
W.loc = B
equipped = 1
- if(slot_h_store)
- if(!src.h_store)
- src.h_store = W
- equipped = 1
if(equipped)
W.layer = 20
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 31172c7ddc4..b7bd6f71fe5 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -71,7 +71,7 @@
sleep(10 * 60 * 20) // 30 minutes
command_alert("Diagnosis suite failure detected. Running backup diagnosis tool.", "Anomaly Alert")
sleep(100)
- command_alert("AI unit diagnosis failed. Unable to detect morality cores. Disabling of unit recommended.", "Anomaly Alert")
+ command_alert("Nanotrasen has received reports that some AI cores may have been tampered with. You are advised to monitor your assigned AI for any abberant bahavior, and are authorized to take corrective action, should it be necessary.", "Security Alert")
..()
diff --git a/code/game/hud.dm b/code/game/hud.dm
index 4d60c7d50ac..17c3fa45745 100644
--- a/code/game/hud.dm
+++ b/code/game/hud.dm
@@ -11,10 +11,10 @@
#define ui_storage1 "SOUTH-1,4"
#define ui_storage2 "SOUTH-1,5"
#define ui_sstore1 "SOUTH+1,4"
-#define ui_hstore1 "SOUTH+1,5"
+#define ui_hstore1 "SOUTH+1,6"
#define ui_resist "EAST+1,SOUTH-1"
#define ui_gloves "SOUTH,5"
-#define ui_glasses "SOUTH+1,6"
+#define ui_glasses "SOUTH+1,5"
#define ui_lear "SOUTH,7"
#define ui_rear "SOUTH,6"
#define ui_head "SOUTH+1,2"
@@ -68,7 +68,6 @@ obj/hud/New(var/type = 0)
if(mymob:r_ear) mymob:r_ear:screen_loc = ui_rear
if(mymob:s_store) mymob:s_store:screen_loc = ui_sstore1
if(mymob:glasses) mymob:glasses:screen_loc = ui_glasses
- if(mymob:h_store) mymob:h_store:screen_loc = ui_hstore1
else
if(istype(mymob, /mob/living/carbon/human))
if(mymob:shoes) mymob:shoes:screen_loc = null
@@ -77,7 +76,6 @@ obj/hud/New(var/type = 0)
if(mymob:r_ear) mymob:r_ear:screen_loc = null
if(mymob:s_store) mymob:s_store:screen_loc = null
if(mymob:glasses) mymob:glasses:screen_loc = null
- if(mymob:h_store) mymob:h_store:screen_loc = null
/obj/hud/var/show_otherinventory = 1
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 3bf370b7d56..37cf507093b 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -104,8 +104,6 @@
H.equip_if_possible(new /obj/item/device/detective_scanner(H), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/drinks/dflask(H.back), H.slot_in_backpack)
H.equip_if_possible(new /obj/item/weapon/lighter/zippo(H), H.slot_l_store)
-// H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/snacks/candy_corn(H), H.slot_h_store)
-// No... just no. --SkyMarshal
var/datum/organ/external/O = H.organs[pick(H.organs)]
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O)
O.implant += L
diff --git a/code/game/machinery/camera.dm b/code/game/machinery/camera.dm
index a30f5560bef..a6cf27724a1 100644
--- a/code/game/machinery/camera.dm
+++ b/code/game/machinery/camera.dm
@@ -98,19 +98,15 @@
usr:cameraFollow = target
usr << "Now tracking target on camera." //Unidentifieds are no longer screamed at you.
- if (usr.machine == null)
+
+ if (usr.machine == null && client.eye != eyeobj)
usr.machine = usr
spawn (0)
- if(client.eye == eyeobj)
- if(checkcameravis(target))
- eyeobj.loc = target.loc
- else
- usr << "Target is not on or near any active cameras on the station."
- return
while (usr:cameraFollow == target)
if (usr:cameraFollow == null)
return
+
else if (istype(target, /mob/living/carbon/human))
if(istype(target:wear_id, /obj/item/weapon/card/id/syndicate))
usr << "Follow camera mode terminated."
@@ -134,6 +130,17 @@
sleep(40) //because we're sleeping another second after this (a few lines down)
continue
+ else if(client.eye == eyeobj)
+ if(checkcameravis(target))
+ eyeobj.loc = target.loc
+ sleep(50)
+ continue
+
+ else
+ usr << "Target is not on or near any active cameras on the station."
+ usr:cameraFollow = null
+ return
+
var/obj/machinery/camera/C = usr:current
if ((C && istype(C, /obj/machinery/camera)) || C==null)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index d70d0259e5f..144e3d8ce93 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -195,10 +195,21 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
doortype = 17
glass = 1
+
glass_research
name = "Research Airlock"
icon = 'doorsciglass.dmi'
+ opacity = 0
doortype = 20
+ glass = 1
+
+
+ glass_mining
+ name = "Maintenance Hatch"
+ icon = 'doorminingglass.dmi'
+ opacity = 0
+ doortype = 22
+ glass = 1
centcom
name = "Airlock"
@@ -419,7 +430,11 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
if(15) new/obj/structure/door_assembly/door_assembly_eng/glass( src.loc ) //issue 301 -mysthic
if(16) new/obj/structure/door_assembly/door_assembly_sec/glass( src.loc )
if(17) new/obj/structure/door_assembly/door_assembly_med/glass( src.loc )
+ if(18) new/obj/structure/door_assembly/door_assembly_min( src.loc )
+ if(19) new/obj/structure/door_assembly/door_assembly_atmo( src.loc )
+ if(20) new/obj/structure/door_assembly/door_assembly_research( src.loc )
if(21) new/obj/structure/door_assembly/door_assembly_research( src.loc )
+ if(22) new/obj/structure/door_assembly/door_assembly_min/glass( src.loc )
var/obj/item/weapon/airlock_electronics/ae
if (!electronics)
ae = new/obj/item/weapon/airlock_electronics( src.loc )
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index 4d6d000091f..97fae51ebc6 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -1,5 +1,5 @@
/obj/machinery/hydroponics
- name = "Hydroponics Tray"
+ name = "hydroponics tray"
icon = 'hydroponics.dmi'
icon_state = "hydrotray3"
density = 1
@@ -404,7 +404,7 @@ obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent in
src.updateicon()
src.visible_message("\red The mutated weeds in [src] spawned a \blue [src.myseed.plantname]!")
else
- usr << "The few weeds in the tray seem to react, but only for a moment..."
+ usr << "The few weeds in the [src] seem to react, but only for a moment..."
return
@@ -441,7 +441,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
O.reagents.remove_reagent("water", b_amount)
src.waterlevel += b_amount
playsound(src.loc, 'slosh.ogg', 25, 1)
- user << "You fill the tray with [b_amount] units of water."
+ user << "You fill the [src] with [b_amount] units of water."
// Toxicity dilutation code. The more water you put in, the lesser the toxin concentration.
src.toxic -= round(b_amount/4)
@@ -449,7 +449,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
src.toxic = 0
else if(src.waterlevel >= 100)
- user << "\red The hydroponics tray is already full."
+ user << "\red The [src] is already full."
else
user << "\red The bucket is not filled with water."
src.updateicon()
@@ -460,7 +460,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
src.nutrilevel = 10
src.yieldmod = myNut.yieldmod
src.mutmod = myNut.mutmod
- user << "You replace the nutrient solution in the tray"
+ user << "You replace the nutrient solution in the [src]."
del(O)
src.updateicon()
@@ -661,7 +661,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
src.updateicon()
else
- user << "\red The tray already has seeds in it!"
+ user << "\red The [src] already has seeds in it!"
else if (istype(O, /obj/item/device/analyzer/plant_analyzer))
if(src.planted && src.myseed)
@@ -709,7 +709,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
else if (istype(O, /obj/item/weapon/minihoe)) // The minihoe
//var/deweeding
if(src.weedlevel > 0)
- user.visible_message("\red [user] starts uprooting the weeds.", "\red You remove the weeds from the tray.")
+ user.visible_message("\red [user] starts uprooting the weeds.", "\red You remove the weeds from the [src].")
src.weedlevel = 0
else
user << "\red This plot is completely devoid of weeds. It doesn't need uprooting."
@@ -723,7 +723,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
src.weedlevel = 0
if (src.toxic > 100 ) // Make sure it won't go overoboard
src.toxic = 100
- user << "You apply the weedkiller solution into the tray"
+ user << "You apply the weedkiller solution into the [src]."
playsound(src.loc, 'spray3.ogg', 50, 1, -6)
del(O)
src.updateicon()
@@ -737,7 +737,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
src.pestlevel = 0
if (src.toxic > 100 ) // Make sure it won't go overoboard
src.toxic = 100
- user << "You apply the pestkiller solution into the tray"
+ user << "You apply the pestkiller solution into the [src]."
playsound(src.loc, 'spray3.ogg', 50, 1, -6)
del(O)
src.updateicon()
@@ -754,22 +754,22 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
else if(src.dead)
src.planted = 0
src.dead = 0
- usr << text("You remove the dead plant from the tray")
+ usr << text("You remove the dead plant from the [src].")
del(src.myseed)
src.updateicon()
else
if(src.planted && !src.dead)
- usr << text("The hydroponics tray has \blue [src.myseed.plantname] \black planted")
+ usr << text("The [src] has \blue [src.myseed.plantname] \black planted.")
if(src.health <= (src.myseed.endurance / 2))
usr << text("The plant looks unhealthy")
else
- usr << text("The hydroponics tray is empty")
+ usr << text("The [src] is empty.")
usr << text("Water: [src.waterlevel]/100")
usr << text("Nutrient: [src.nutrilevel]/10")
if(src.weedlevel >= 5) // Visual aid for those blind
- usr << text("The tray is filled with weeds!")
+ usr << text("The [src] is filled with weeds!")
if(src.pestlevel >= 5) // Visual aid for those blind
- usr << text("The tray is filled with tiny worms!")
+ usr << text("The [src] is filled with tiny worms!")
usr << text ("") // Empty line for readability.
/obj/item/seeds/proc/harvest(mob/user = usr)
@@ -977,7 +977,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
harvest = 0
lastproduce = src.age
if((yieldmod * myseed.yield) <= 0)
- user << text("\red You fail to harvest anything useful")
+ user << text("\red You fail to harvest anything useful.")
else
user << text("You harvest from the [src.myseed.plantname]")
if(myseed.oneharvest)
diff --git a/code/game/objects/closets/secure/cargo.dm b/code/game/objects/closets/secure/cargo.dm
index 85e59b83a4f..97b77c918ef 100644
--- a/code/game/objects/closets/secure/cargo.dm
+++ b/code/game/objects/closets/secure/cargo.dm
@@ -1,14 +1,12 @@
/obj/structure/closet/secure_closet/cargotech
name = "Cargo Technician's Locker"
req_access = list(access_cargo)
- //icon_state = "secureeng1"
- //icon_closed = "secureeng"
- //icon_locked = "secureeng1"
- //icon_opened = "toolclosetopen"
- //icon_broken = "secureengbroken"
- //icon_off = "secureengoff"
-
- //Needs proper sprites
+ icon_state = "securecargo1"
+ icon_closed = "securecargo"
+ icon_locked = "securecargo1"
+ icon_opened = "securecargoopen"
+ icon_broken = "securecargobroken"
+ icon_off = "securecargooff"
New()
..()
diff --git a/code/game/objects/closets/secure/personal.dm b/code/game/objects/closets/secure/personal.dm
index c9f05e3a3e0..508a80cabb7 100644
--- a/code/game/objects/closets/secure/personal.dm
+++ b/code/game/objects/closets/secure/personal.dm
@@ -26,7 +26,7 @@
..()
spawn(4)
contents = list()
- new /obj/item/weapon/storage/backpack/satchel( src )
+ new /obj/item/weapon/storage/backpack/satchel/withwallet( src )
new /obj/item/device/radio/headset( src )
return
diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm
index 7cc627d870b..5d4d37c7e22 100644
--- a/code/game/objects/closets/secure/security.dm
+++ b/code/game/objects/closets/secure/security.dm
@@ -31,12 +31,12 @@
/obj/structure/closet/secure_closet/hop
name = "Head of Personnel"
req_access = list(access_hop)
- icon_state = "capsecure1"
- icon_closed = "capsecure"
- icon_locked = "capsecure1"
- icon_opened = "capsecureopen"
- icon_broken = "capsecurebroken"
- icon_off = "capsecureoff"
+ icon_state = "hopsecure1"
+ icon_closed = "hopsecure"
+ icon_locked = "hopsecure1"
+ icon_opened = "hopsecureopen"
+ icon_broken = "hopsecurebroken"
+ icon_off = "hopsecureoff"
New()
..()
diff --git a/code/game/objects/door_assembly.dm b/code/game/objects/door_assembly.dm
index 67cf74849be..57f4d63ad65 100644
--- a/code/game/objects/door_assembly.dm
+++ b/code/game/objects/door_assembly.dm
@@ -72,12 +72,18 @@ obj/structure/door_assembly
door_assembly_min
name = "Mining Airlock Assembly"
icon_state = "door_as_min1"
+ glass_base_icon_state = "door_as_gmin"
+ glass_type = /obj/machinery/door/airlock/glass/glass_mining
airlock_type = /obj/machinery/door/airlock/mining
anchored = 1
density = 1
state = 1
glass = 0
+ glass
+ glass = 1
+ icon_state = "door_as_gmin1"
+
door_assembly_atmo
name = "Atmospherics Airlock Assembly"
icon_state = "door_as_atmo1"
@@ -90,12 +96,18 @@ obj/structure/door_assembly
door_assembly_research
name = "Research Airlock Assembly"
icon_state = "door_as_res1"
+ glass_base_icon_state = "door_as_gres"
+ glass_type = /obj/machinery/door/airlock/glass/glass_research
airlock_type = /obj/machinery/door/airlock/research
anchored = 1
density = 1
state = 1
glass = 0
+ glass
+ glass = 1
+ icon_state = "door_as_gres1"
+
door_assembly_med
name = "Medical Airlock Assembly"
icon_state = "door_as_med1"
@@ -243,6 +255,8 @@ obj/structure/door_assembly
del(src)
else
W.loc = src.loc
+
+ //del(W)
else if(istype(W, /obj/item/weapon/crowbar) && state == 2 )
playsound(src.loc, 'Crowbar.ogg', 100, 1)
var/turf/T = get_turf(user)
@@ -266,7 +280,7 @@ obj/structure/door_assembly
if(do_after(user, 40))
if(G)
if(G.amount>=1)
- user << "\blue You installed glass windows into the airlock assembly!"
+ user << "\blue You installed glass windows the airlock assembly!"
G.use(1)
src.glass = 1
src.name = "Near finished Window Airlock Assembly"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index fbaf1ff3d6b..51a56b40af1 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -123,6 +123,7 @@
if (!safety)
if (src.reagents.total_volume < 1)
+ usr << "\red the [src] is empty."
return
if (world.time < src.last_use + 20)
@@ -134,6 +135,28 @@
var/direction = get_dir(src,target)
+ if(usr.buckled && isobj(usr.buckled) && !usr.buckled.anchored )
+ spawn(0)
+ var/obj/B = usr.buckled
+ var/movementdirection = turn(direction,180)
+ B.Move(get_step(usr,movementdirection), movementdirection)
+ sleep(1)
+ B.Move(get_step(usr,movementdirection), movementdirection)
+ sleep(1)
+ B.Move(get_step(usr,movementdirection), movementdirection)
+ sleep(1)
+ B.Move(get_step(usr,movementdirection), movementdirection)
+ sleep(2)
+ B.Move(get_step(usr,movementdirection), movementdirection)
+ sleep(2)
+ B.Move(get_step(usr,movementdirection), movementdirection)
+ sleep(3)
+ B.Move(get_step(usr,movementdirection), movementdirection)
+ sleep(3)
+ B.Move(get_step(usr,movementdirection), movementdirection)
+ sleep(3)
+ B.Move(get_step(usr,movementdirection), movementdirection)
+
var/turf/T = get_turf(target)
var/turf/T1 = get_step(T,turn(direction, 90))
var/turf/T2 = get_step(T,turn(direction, -90))
diff --git a/code/game/objects/stool.dm b/code/game/objects/stool.dm
index 3a2bb3f1a18..26882cfba12 100644
--- a/code/game/objects/stool.dm
+++ b/code/game/objects/stool.dm
@@ -118,6 +118,8 @@
return
/obj/structure/stool/bed/chair/New()
+ if(anchored)
+ src.verbs -= /atom/movable/verb/pull
if(src.dir == NORTH)
src.layer = FLY_LAYER
..()
diff --git a/code/game/objects/storage/storage.dm b/code/game/objects/storage/storage.dm
index f5fb5c38588..4cf94bd0670 100644
--- a/code/game/objects/storage/storage.dm
+++ b/code/game/objects/storage/storage.dm
@@ -207,6 +207,19 @@
/obj/item/weapon/storage/attack_hand(mob/user as mob)
playsound(src.loc, "rustle", 50, 1, -5)
+
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.l_store == src && !H.get_active_hand())
+ H.put_in_hand(src)
+ H.l_store = null
+ return
+ if(H.r_store == src && !H.get_active_hand())
+ H.put_in_hand(src)
+ H.r_store = null
+ return
+
+ src.orient2hud(user)
if (src.loc == user)
if (user.s_active)
user.s_active.close(user)
@@ -216,7 +229,6 @@
for(var/mob/M in range(1))
if (M.s_active == src)
src.close(M)
- src.orient2hud(user)
src.add_fingerprint(user)
return
diff --git a/code/game/objects/watercloset.dm b/code/game/objects/watercloset.dm
index 3de05998d50..da6d46bdc0a 100644
--- a/code/game/objects/watercloset.dm
+++ b/code/game/objects/watercloset.dm
@@ -40,27 +40,94 @@
density = 0
anchored = 1
var/on = 0
- var/mist = 0 //needs a var so we can make it linger~
+ var/obj/effect/mist/mymist = null
+ var/ismist = 0 //needs a var so we can make it linger~
//add heat controls? when emagged, you can freeze to death in it?
-/obj/structure/shower/attack_hand()
+/obj/effect/mist
+ name = "mist"
+ icon = 'watercloset.dmi'
+ icon_state = "mist"
+ layer = MOB_LAYER + 1
+ mouse_opacity = 0
+
+/obj/structure/shower/attack_hand(mob/M as mob)
on = !on
update_icon()
+ if(on && M.loc == loc)
+ wash(M)
+
+/obj/structure/shower/attackby(mob/M as mob)
+ attack_hand(M)
/obj/structure/shower/update_icon()
overlays = null
+ if(mymist)
+ del(mymist)
+
if(on)
overlays += image('watercloset.dmi', src, "water", MOB_LAYER + 1, dir)
- spawn(50)
- if(src && on)
- overlays += image('watercloset.dmi', src, "mist", MOB_LAYER + 1, dir)
- mist = 1
- else if(mist)
- overlays += image('watercloset.dmi', src, "mist", MOB_LAYER + 1, dir)
- spawn(100)
+ if(!ismist)
+ spawn(50)
+ if(src && on)
+ ismist = 1
+ mymist = new /obj/effect/mist(loc)
+ else
+ ismist = 1
+ mymist = new /obj/effect/mist(loc)
+ else if(ismist)
+ ismist = 1
+ mymist = new /obj/effect/mist(loc)
+ spawn(250)
if(src && !on)
- overlays = null
+ del(mymist)
+ ismist = 0
+
+/obj/structure/shower/HasEntered(atom/movable/O as obj|mob)
+ ..()
+ wash(O)
+
+//Yes, showers are super powerful as far as washing goes.
+/obj/structure/shower/proc/wash(atom/movable/O as obj|mob)
+ ..()
+ if(!on) return
+
+ O.clean_blood()
+
+ if(istype(O, /mob/living/carbon))
+ var/mob/living/carbon/monkey = O //it's not necessarily a monkey, but >accurate varnames
+ if(monkey.r_hand)
+ monkey.r_hand.clean_blood()
+ if(monkey.l_hand)
+ monkey.l_hand.clean_blood()
+ if(monkey.wear_mask)
+ monkey.wear_mask.clean_blood()
+
+ if(istype(O, /mob/living/carbon/human))
+ var/mob/living/carbon/human/washer = O
+ if(washer.head)
+ washer.head.clean_blood()
+ if(washer.w_uniform)
+ washer.w_uniform.clean_blood()
+ if(washer.wear_suit)
+ washer.wear_suit.clean_blood()
+ if(washer.shoes)
+ washer.shoes.clean_blood()
+ if(washer.gloves)
+ washer.gloves.clean_blood()
+ if(washer.head)
+ washer.head.clean_blood()
+
+ if(loc)
+ var/turf/tile = get_turf(loc)
+ loc.clean_blood()
+ for(var/obj/effect/rune/R in tile)
+ del(R)
+ for(var/obj/effect/decal/cleanable/R in tile)
+ del(R)
+ for(var/obj/effect/overlay/R in tile)
+ del(R)
@@ -69,4 +136,121 @@
desc = "Rubber ducky you're so fine, you make bathtime lots of fuuun. Rubber ducky I'm awfully fooooond of yooooouuuu~" //thanks doohl
icon = 'watercloset.dmi'
icon_state = "rubberducky"
- item_state = "rubberducky"
\ No newline at end of file
+ item_state = "rubberducky"
+
+
+
+/obj/structure/sink
+ name = "sink"
+ icon = 'watercloset.dmi'
+ icon_state = "sink"
+ desc = "A sink used for washing one's hands and face."
+ anchored = 1
+ var/busy = 0 //Something's being washed at the moment
+
+/obj/structure/sink/attack_hand(mob/M as mob)
+ if(isrobot(M) || isAI(M))
+ return
+
+ if(busy)
+ M << "\red Someone's already washing here."
+ return
+
+ var/turf/location = M.loc
+ if(!isturf(location)) return
+ usr << "\blue You start washing your hands."
+
+ busy = 1
+ sleep(40)
+ busy = 0
+
+ if(M.loc != location) return //Person has moved away from the sink
+
+ if(istype(M, /mob/living/carbon))
+ var/mob/living/carbon/C = M
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/washer = C
+ if(washer.gloves) //if they have gloves
+ washer.gloves.clean_blood() //clean the gloves
+ else //and if they don't,
+ washer.clean_blood() //wash their hands (a mob being bloody means they are 'red handed')
+ else
+ C.clean_blood() //other things that can't wear gloves should just wash the mob.
+ for(var/mob/V in viewers(src, null))
+ V.show_message(text("\blue [M] washes their hands using \the [src]."))
+
+/obj/structure/sink/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(busy)
+ user << "\red Someone's already washing here."
+ return
+
+ if (istype(O, /obj/item/weapon/reagent_containers/glass/bucket))
+ O:reagents.add_reagent("water", 70)
+ user.visible_message( \
+ "\blue [user] fills the [O] using \the [src].", \
+ "\blue You fill the [O] using \the [src].")
+ return
+
+ if (istype(O, /obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks))
+ O:reagents.add_reagent("water", 10)
+ user.visible_message( \
+ "\blue [user] fills the [O] using \the [src].", \
+ "\blue You fill the [O] using \the [src].")
+ return
+ else if (istype(O, /obj/item/weapon/melee/baton))
+ var/obj/item/weapon/melee/baton/B = O
+ if (B.charges > 0 && B.status == 1)
+ flick("baton_active", src)
+ user.Stun(10)
+ user.stuttering = 10
+ user.Weaken(10)
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ R.cell.charge -= 20
+ else
+ B.charges--
+ user.visible_message( \
+ "[user] was stunned by his wet [O].", \
+ "\red You have wet \the [O], it shocks you!")
+ return
+
+ var/turf/location = user.loc
+ if(!isturf(location)) return
+
+ var/obj/item/I = O
+ if(!I || !istype(I,/obj/item)) return
+
+ usr << "\blue You start washing \the [I]."
+
+ busy = 1
+ sleep(40)
+ busy = 0
+
+ if(user.loc != location) return //User has moved
+ if(!I) return //Item's been destroyed while washing
+ if(user.get_active_hand() != I) return //Person has switched hands or the item in their hands
+
+ O.clean_blood()
+ user.visible_message( \
+ "\blue [user] washes \a [I] using \the [src].", \
+ "\blue You wash \a [I] using \the [src].")
+
+
+/obj/structure/sink/kitchen
+ name = "kitchen sink"
+ icon_state = "sink_alt"
+
+
+/obj/structure/sink/puddle //splishy splashy ^_^
+ name = "puddle"
+ icon_state = "puddle"
+
+/obj/structure/sink/puddle/attack_hand(mob/M as mob)
+ icon_state = "puddle-splash"
+ ..()
+ icon_state = "puddle"
+
+/obj/structure/sink/puddle/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ icon_state = "puddle-splash"
+ ..()
+ icon_state = "puddle"
\ No newline at end of file
diff --git a/code/game/objects/window.dm b/code/game/objects/window.dm
index a022f63f137..ee9871be0fc 100644
--- a/code/game/objects/window.dm
+++ b/code/game/objects/window.dm
@@ -79,6 +79,7 @@
src.health = max(0, src.health - tforce)
if (src.health <= 7 && !reinf)
src.anchored = 0
+ update_nearby_icons()
step(src, get_dir(AM, src))
if (src.health <= 0)
new /obj/item/weapon/shard( src.loc )
@@ -201,22 +202,12 @@
usr << ( state==1? "You have unfastened the window from the frame." : "You have fastened the window to the frame." )
else if(reinf && state == 0)
anchored = !anchored
-
- for(var/obj/structure/window/w in range(src,1))
- if (w.anchored)
- w.relativewindow()
- src.relativewindow()
-
+ update_nearby_icons()
playsound(src.loc, 'Screwdriver.ogg', 75, 1)
user << (src.anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor.")
else if(!reinf)
src.anchored = !( src.anchored )
-
- for(var/obj/structure/window/w in range(src,1))
- if (w.anchored)
- w.relativewindow()
- src.relativewindow()
-
+ update_nearby_icons()
playsound(src.loc, 'Screwdriver.ogg', 75, 1)
user << (src.anchored ? "You have fastened the window to the floor." : "You have unfastened the window.")
else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <=1)
@@ -232,12 +223,7 @@
playsound(src.loc, 'Glasshit.ogg', 75, 1)
if (src.health <= 7)
src.anchored = 0
-
- for(var/obj/structure/window/w in range(src,1))
- if (w.anchored)
- w.relativewindow()
- src.relativewindow()
-
+ update_nearby_icons()
step(src, get_dir(user, src))
if (src.health <= 0)
if (src.dir == SOUTHWEST)
@@ -328,10 +314,7 @@
icon_state = "window"
update_nearby_tiles(need_rebuild=1)
- relativewindow()
- for(var/obj/structure/window/w in range(src,1))
- if (w.anchored)
- w.relativewindow()
+ update_nearby_icons()
return
@@ -339,10 +322,11 @@
density = 0
update_nearby_tiles()
- for(var/obj/structure/window/w in range(src,1))
- w.relativewindow()
playsound(src, "shatter", 70, 1)
+
+ update_nearby_icons()
+
..()
/obj/structure/window/Move()
@@ -355,6 +339,7 @@
return
+//This proc has to do with airgroups and atmos, it has nothing to do with smoothwindows, that's update_nearby_tiles().
/obj/structure/window/proc/update_nearby_tiles(need_rebuild)
if(!air_master) return 0
@@ -378,30 +363,40 @@
return 1
-
//checks if this window is full-tile one
/obj/structure/window/proc/is_fulltile()
- return (src.dir == SOUTHWEST || src.dir == SOUTHEAST || src.dir == NORTHWEST || src.dir == NORTHEAST)
+ if(dir in list(5,6,9,10))
+ return 1
+ return 0
+
+//This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc!
+/obj/structure/window/proc/update_nearby_icons()
+ src.update_icon()
+ for(var/direction in cardinal)
+ for(var/obj/structure/window/W in get_step(src,direction) )
+ W.update_icon()
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
-/obj/structure/window/proc/relativewindow()
+/obj/structure/window/update_icon()
//A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong.
//this way it will only update full-tile ones
- if (!is_fulltile())
- return
- var/junction = 0 //will be used to determine from which side the window is connected to other windows
- if (src.anchored)
- for(var/obj/structure/window/W in orange(src,1))
- if (W.anchored && W.density && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows.
- if (abs(src.x-W.x)-abs(src.y-W.y) ) //doesn't count windows, placed diagonally to src
- junction |= get_dir(src,W)
- if (istype(src,/obj/structure/window/basic))
- src.icon_state = "window[junction]"
- else if (istype(src,/obj/structure/window/reinforced))
- if (istype(src,/obj/structure/window/reinforced/tinted))
+ //This spawn is here so windows get properly updated when one gets deleted.
+ spawn(2)
+ if(!src) return
+ if (!is_fulltile())
+ return
+ var/junction = 0 //will be used to determine from which side the window is connected to other windows
+ if (src.anchored)
+ for(var/obj/structure/window/W in orange(src,1))
+ if (W.anchored && W.density && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows.
+ if (abs(src.x-W.x)-abs(src.y-W.y) ) //doesn't count windows, placed diagonally to src
+ junction |= get_dir(src,W)
+ if (opacity)
src.icon_state = "twindow[junction]"
else
- src.icon_state = "rwindow[junction]"
-
- return
+ if (reinf)
+ src.icon_state = "rwindow[junction]"
+ else
+ src.icon_state = "window[junction]"
+ return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index e9a2e2c6198..750174757f1 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -220,6 +220,7 @@
verbs += /client/proc/jumptokey
verbs += /client/proc/jumptomob
verbs += /client/proc/jumptoturf
+ verbs += /client/proc/Open_Minimap
verbs += /client/proc/cmd_admin_delete
verbs += /client/proc/cmd_admin_add_freeform_ai_law
verbs += /client/proc/cmd_admin_add_random_ai_law
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index f83b1d29539..aa59d4153d5 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -3279,6 +3279,12 @@ datum
reagent_state = LIQUID
color = "#2E6671" // rgb: 46, 102, 113
+ driestmartini
+ name = "Driest Martini"
+ id = "driestmartini"
+ description = "Only for the experienced. You think you see sand floating in the glass."
+ nutriment_factor = 1 * REAGENTS_METABOLISM
+ color = "#2E6671" // rgb: 46, 102, 113
//ALCHOHOL end
diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm
index 10914601d01..ad825ca068d 100644
--- a/code/modules/chemical/Chemistry-Recipes.dm
+++ b/code/modules/chemical/Chemistry-Recipes.dm
@@ -1012,7 +1012,6 @@ datum
required_reagents = list("gin" = 2, "tonic" = 1)
result_amount = 3
-
cuba_libre
name = "Cuba Libre"
id = "cubalibre"
@@ -1034,12 +1033,11 @@ datum
required_reagents = list("vodka" = 2, "vermouth" = 1)
result_amount = 3
-
white_russian
name = "White Russian"
id = "whiterussian"
result = "whiterussian"
- required_reagents = list("vodka" = 3, "cream" = 1, "kahlua" = 1)
+ required_reagents = list("blackrussian" = 3, "cream" = 2)
result_amount = 5
whiskey_cola
@@ -1221,15 +1219,15 @@ datum
name = "Singulo"
id = "singulo"
result = "singulo"
- required_reagents = list("vodka" = 5, "radium" = 1, "acid" = 1, "wine" = 5)
+ required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5)
result_amount = 10
-/* alliescocktail
+ alliescocktail
name = "Allies Cocktail"
id = "alliescocktail"
result = "alliescocktail"
- required_reagents = list("gin" = 1, "vermouth" = 1)
- result_amount = 2*/
+ required_reagents = list("martini" = 1, "vodka" = 1)
+ result_amount = 2
demonsblood
name = "Demons Blood"
@@ -1256,11 +1254,11 @@ datum
name = "Barefoot"
id = "barefoot"
result = "barefoot"
- required_reagents = list("vodka" = 1, "cream" = 1, "vermouth" = 1, "whiskey" = 1)
- result_amount = 4
+ required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1)
+ result_amount = 3
-////DRINKS THAT REQUIRE IMPROVED SPRITES BELOW:: -Agouri/////
+////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri/////
sbiten
name = "Sbiten"
@@ -1344,7 +1342,7 @@ datum
name = "Aloe"
id = "aloe"
result = "aloe"
- required_reagents = list("cream" = 1, "whiskey" = 1)
+ required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1)
result_amount = 2
andalusia
@@ -1372,15 +1370,15 @@ datum
name = "Irish Car Bomb"
id = "irishcarbomb"
result = "irishcarbomb"
- required_reagents = list("ale" = 1, "cream" = 1, "whiskey" = 1)
- result_amount = 3
+ required_reagents = list("ale" = 1, "irishcream" = 1)
+ result_amount = 2
syndicatebomb
name = "Syndicate Bomb"
id = "syndicatebomb"
result = "syndicatebomb"
- required_reagents = list("beer" = 1, "cola" = 1, "whiskey" = 1)
- result_amount = 3
+ required_reagents = list("beer" = 1, "whiskeycola" = 1)
+ result_amount = 2
erikasurprise
name = "Erika Surprise"
@@ -1389,7 +1387,6 @@ datum
required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1)
result_amount = 5
-
devilskiss
name = "Devils Kiss"
id = "devilskiss"
@@ -1418,6 +1415,10 @@ datum
required_reagents = list("nothing" = 1, "cream" = 1, "sugar" = 1)
result_amount = 3
-
-
+ driestmartini
+ name = "Driest Martini"
+ id = "driestmartini"
+ result = "driestmartini"
+ required_reagents = list("nothing" = 1, "gin" = 1)
+ result_amount = 2
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 59f7393eb73..77735e6ccc9 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -2310,7 +2310,7 @@
/obj/item/weapon/reagent_containers/glass/bottle/pacid
name = "Polytrinic Acid Bottle"
- desc = "A small bottle. Contains a small amount of Polytronic Acid"
+ desc = "A small bottle. Contains a small amount of Polytrinic Acid"
icon = 'chemical.dmi'
icon_state = "bottle17"
New()
@@ -3592,7 +3592,7 @@
desc = "Creepy time!"
if("changelingsting")
icon_state = "changelingsting"
- name = "Changeling sting"
+ name = "Changeling Sting"
desc = "A stingy drink."
if("irishcarbomb")
icon_state = "irishcarbomb"
@@ -3606,6 +3606,10 @@
icon_state = "erikasurprise"
name = "Erika Surprise"
desc = "The surprise is, it's green!"
+ if("driestmartini")
+ icon_state = "driestmartini"
+ name = "Driest Martini"
+ desc = "Only for the experienced. You think you see sand floating in the glass."
else
icon_state ="glass_brown"
name = "Glass of ..what?"
diff --git a/code/modules/mob/living/carbon/human/hud.dm b/code/modules/mob/living/carbon/human/hud.dm
index 281e451624f..34ef0189ccb 100644
--- a/code/modules/mob/living/carbon/human/hud.dm
+++ b/code/modules/mob/living/carbon/human/hud.dm
@@ -206,14 +206,6 @@
using.layer = 19
src.other += using
- using = new src.h_type( src )
- using.name = "hat storage"
- using.icon = ui_style
- using.icon_state = "hair"
- using.screen_loc = ui_hstore1
- using.layer = 19
- src.other += using
-
using = new src.h_type( src )
using.name = "resist"
using.icon = ui_style
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 7a057f2b826..8216b01cfe6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -39,7 +39,6 @@
var/obj/item/weapon/r_store = null
var/obj/item/weapon/l_store = null
var/obj/item/weapon/s_store = null
- var/obj/item/weapon/h_store = null
var/icon/stand_icon = null
var/icon/lying_icon = null
@@ -479,15 +478,6 @@
glasses = null
else if (W == head)
var/obj/item/prev_head = W
- W = h_store
- if (W)
- u_equip(W)
- if (client)
- client.screen -= W
- if (W)
- W.loc = loc
- W.dropped(src)
- W.layer = initial(W.layer)
head = null
if(prev_head && (prev_head.flags & BLOCKHAIR))
// rebuild face
@@ -522,8 +512,6 @@
l_store = null
else if (W == s_store)
s_store = null
- else if (W == h_store)
- h_store = null
else if (W == back)
back = null
else if (W == handcuffed)
@@ -754,22 +742,6 @@
u_equip(W)
s_store = W
- if("hat storage")
- if (h_store)
- if (emptyHand)
- h_store.DblClick()
- return
- var/confirm
- if (head)
- if (istype(W, /obj/item/weapon/pen))
- confirm = 1
- if (istype(head) && is_type_in_list(W, head.allowed)) // NOTE: head is /obj/item/clothing/head/ and parer hat is not /obj/item/clothing/ and does not have "allowed" --rastaf0
- confirm = 1
- if (!confirm) return
- else
- u_equip(W)
- h_store = W
-
update_clothing()
return
@@ -1085,9 +1057,6 @@
overlays += image("icon" = 'belt_mirror.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
s_store.screen_loc = ui_sstore1
- if (h_store)
- h_store.screen_loc = ui_hstore1
-
if(client) hud_used.other_update() //Update the screenloc of the items on the 'other' inventory bar
//to hide / show them.
if (client)
@@ -1703,8 +1672,6 @@
message = text("\red [] is trying to take off \a [] from []'s body!", source, target.w_uniform, target)
if("s_store")
message = text("\red [] is trying to take off \a [] from []'s suit!", source, target.s_store, target)
- if("h_store")
- message = text("\red [] is trying to empty []'s hat!", source, target)
if("pockets")
target.attack_log += text("\[[time_stamp()]\] Has had their pockets emptied by [source.name] ([source.ckey])")
source.attack_log += text("\[[time_stamp()]\] Attempted to empty [target.name]'s ([target.ckey]) pockets")
@@ -1728,7 +1695,7 @@
//SN src = null
del(src)
return
- message = text("\red [] is trying perform CPR on []!", source, target)
+ message = text("\red [] is trying to perform CPR on []!", source, target)
if("id")
target.attack_log += text("\[[time_stamp()]\] Has had their ID removed by [source.name] ([source.ckey])")
source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) ID")
@@ -2158,17 +2125,6 @@ It can still be worn/put on as normal.
item.layer = 20
target.back = item
item.loc = target
- if("h_store")
- if (target.h_store)
- var/obj/item/W = target.h_store
- target.u_equip(W)
- if (target.client)
- target.client.screen -= W
- if (W)
- W.loc = target.loc
- W.dropped(target)
- W.layer = initial(W.layer)
- W.add_fingerprint(source)
if("handcuff")
if (target.handcuffed)
var/obj/item/W = target.handcuffed
@@ -2319,7 +2275,6 @@ It can still be worn/put on as normal.
[(handcuffed ? text("Handcuffed") : text("Not Handcuffed"))]
[(internal ? text("Remove Internal") : "")]
Empty Pockets
-
Empty Hat
Refresh
Close
"}
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index a5649e336ce..a59fdb7d13d 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -441,6 +441,7 @@
if(client.eye == eyeobj)
eyeobj.loc = C.loc
+ cameranet.visibility(eyeobj)
else
machine = src
src:current = C
@@ -578,7 +579,9 @@
if(C.network == newnet)
cameralist.Add(C)
- switchCamera( pick(cameralist) )
+ if(length(cameralist))
+ switchCamera( pick(cameralist) )
+
src << "\blue Jumped to [newnet] camera network."
//End of code by Mord_Sith
//cael - with the multiple onstation networks all linked together, changing networks is legacy functionality
diff --git a/code/modules/mob/simple_animal/corgi.dm b/code/modules/mob/simple_animal/corgi.dm
index a6e7e687a2f..2461e55f6e6 100644
--- a/code/modules/mob/simple_animal/corgi.dm
+++ b/code/modules/mob/simple_animal/corgi.dm
@@ -171,7 +171,8 @@
/obj/item/clothing/head/helmet/hardhat/white,
/obj/item/weapon/bedsheet,
/obj/item/clothing/head/helmet/space/santahat,
- /obj/item/clothing/head/collectable/paper
+ /obj/item/clothing/head/collectable/paper,
+ /obj/item/clothing/head/cargosoft
)
if( ! ( item_to_add.type in allowed_types ) )
@@ -183,7 +184,7 @@
src.inventory_head = item_to_add
update_clothing()
- //Various hats and items (worn on his head) change Ian's behaviour. His attributesare reset when a HAT is removed.
+ //Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a HAT is removed.
switch(inventory_head && inventory_head.type)
@@ -240,6 +241,10 @@
emote_hear = list("barks christmas songs", "yaps")
desc = "He has a very shiny nose."
src.sd_SetLuminosity(6)
+ if(/obj/item/clothing/head/cargosoft)
+ name = "Corgi Tech [real_name]"
+ speak = list("Needs a stamp!", "Request DENIED!", "Fill these out in triplicate!")
+ desc = "The reason your yellow gloves have chew-marks."
if("back")
if(inventory_back)
diff --git a/html/changelog.html b/html/changelog.html
index 675c3d72fc4..99f67eab052 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -47,6 +47,20 @@ Stuff which is in development and not yet visible to players or just code relate
should be listed in the changelog upon commit though. Thanks. -->
+