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. --> +
+

19 May 2012

+

TG updated:

+ +
+

17 May 2012

TG updated:

diff --git a/icons/minimap.dmi b/icons/minimap.dmi new file mode 100644 index 00000000000..26aecb84b96 Binary files /dev/null and b/icons/minimap.dmi differ diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi index 72a66aed989..105bdf47502 100644 Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 3b6bcd8adc2..64b1c35e22d 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index a92ebe5488f..6b8eaf69893 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/doors/Dooratmo.dmi b/icons/obj/doors/Dooratmo.dmi index 55cff1c433d..787d1483d60 100644 Binary files a/icons/obj/doors/Dooratmo.dmi and b/icons/obj/doors/Dooratmo.dmi differ diff --git a/icons/obj/doors/Doormining.dmi b/icons/obj/doors/Doormining.dmi index e152c7782cd..6829029b164 100644 Binary files a/icons/obj/doors/Doormining.dmi and b/icons/obj/doors/Doormining.dmi differ diff --git a/icons/obj/doors/Doorminingglass.dmi b/icons/obj/doors/Doorminingglass.dmi new file mode 100644 index 00000000000..41d1ff24562 Binary files /dev/null and b/icons/obj/doors/Doorminingglass.dmi differ diff --git a/icons/obj/doors/door_assembly.dmi b/icons/obj/doors/door_assembly.dmi index af58305920a..dcb5a91adcd 100644 Binary files a/icons/obj/doors/door_assembly.dmi and b/icons/obj/doors/door_assembly.dmi differ diff --git a/icons/obj/doors/doorresearch.dmi b/icons/obj/doors/doorresearch.dmi index ac6c60d6e71..24771c4114c 100644 Binary files a/icons/obj/doors/doorresearch.dmi and b/icons/obj/doors/doorresearch.dmi differ diff --git a/icons/obj/doors/doorresearchglass.dmi b/icons/obj/doors/doorresearchglass.dmi new file mode 100644 index 00000000000..9bc2db4610c Binary files /dev/null and b/icons/obj/doors/doorresearchglass.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 4fee2a243c3..11a133c079f 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index bb3e6d1c056..ce38d4553de 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 8077cfa5c37..6ca93940eb7 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 3defcc522f6..a7fb4994df9 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -327,6 +327,53 @@ menu "menu" is-disabled = false saved-params = "is-checked" +menu "minimap_menu" + elem + name = "Size" + command = "" + category = "" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" + elem + name = "50%" + command = ".winset \"minimap.icon-size=16\"" + category = "Size" + is-checked = false + can-check = true + group = "minimap_size" + is-disabled = false + saved-params = "is-checked" + elem + name = "100%" + command = ".winset \"minimap.icon-size=32\"" + category = "Size" + is-checked = true + can-check = true + group = "minimap_size" + is-disabled = false + saved-params = "is-checked" + elem + name = "200%" + command = ".winset \"minimap.icon-size=64\"" + category = "Size" + is-checked = false + can-check = true + group = "minimap_size" + is-disabled = false + saved-params = "is-checked" + elem + name = "stretch" + command = ".winset \"minimap.icon-size=0\"" + category = "Size" + is-checked = false + can-check = true + group = "minimap_size" + is-disabled = false + saved-params = "is-checked" + window "Telecomms IDE" elem "Telecomms IDE" @@ -1207,6 +1254,71 @@ window "mapwindow" on-show = ".winset\"mainwindow.mainvsplit.left=mapwindow\"" on-hide = ".winset\"mainwindow.mainvsplit.left=\"" +window "minimapwindow" + elem "minimapwindow" + type = MAIN + pos = 281,0 + size = 640x480 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = false + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "pos;size;is-minimized;is-maximized" + on-size = "" + title = "" + titlebar = true + statusbar = true + can-close = true + can-minimize = true + can-resize = true + is-pane = false + is-minimized = false + is-maximized = false + can-scroll = none + icon = "" + image = "" + image-mode = stretch + keep-aspect = false + transparent-color = none + alpha = 255 + macro = "" + menu = "minimap_menu" + on-close = "" + elem "minimap" + type = MAP + pos = 0,0 + size = 640x480 + anchor1 = 0,0 + anchor2 = 100,100 + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = true + right-click = false + saved-params = "icon-size" + on-size = "" + icon-size = 32 + text-mode = false + on-show = "" + on-hide = "" + window "outputwindow" elem "outputwindow" type = MAIN