diff --git a/code/WorkInProgress/AI_Visibility.dm b/code/WorkInProgress/AI_Visibility.dm
index a51e04b0cd..cf3eadb2b3 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 26b2ff53de..de50debbcf 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 06c6295f44..3fb9960be9 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 be2e9bc8bd..e004018be8 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 f0c1a7f737..0303b3f030 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 31172c7ddc..b7bd6f71fe 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 4d60c7d50a..17c3fa4574 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 3bf370b7d5..37cf507093 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 a30f5560be..a6cf27724a 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 d70d0259e5..144e3d8ce9 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 4d6d000091..97fae51ebc 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 85e59b83a4..97b77c918e 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 c9f05e3a3e..508a80cabb 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 7cc627d870..5d4d37c7e2 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 67cf74849b..57f4d63ad6 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 fbaf1ff3d6..51a56b40af 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 3a2bb3f1a1..26882cfba1 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 f5fb5c3858..4cf94bd067 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 3de05998d5..da6d46bdc0 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 a022f63f13..ee9871be0f 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 e9a2e2c619..750174757f 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 f83b1d2953..aa59d4153d 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 10914601d0..ad825ca068 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 59f7393eb7..77735e6ccc 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 281e451624..34ef0189cc 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 7a057f2b82..8216b01cfe 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 a5649e336c..a59fdb7d13 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 a6e7e687a2..2461e55f6e 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 675c3d72fc..99f67eab05 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. -->
+