diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm index f5044b1de28..b9d21b36934 100644 --- a/code/game/objects/items/policetape.dm +++ b/code/game/objects/items/policetape.dm @@ -9,6 +9,9 @@ var/tape_type = /obj/item/tape var/icon_base +var/list/image/hazard_overlays +var/list/tape_roll_applications = list() + /obj/item/tape name = "tape" icon = 'icons/policetape.dmi' @@ -16,6 +19,24 @@ density = 1 var/icon_base +/obj/item/tape/New() + ..() + if(!hazard_overlays) + hazard_overlays = list() + hazard_overlays["[NORTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "N") + hazard_overlays["[EAST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "E") + hazard_overlays["[SOUTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "S") + hazard_overlays["[WEST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "W") + +/obj/item/taperoll/New() //just using tape is not enough to guarantee the overlays are genned + ..() + if(!hazard_overlays) + hazard_overlays = list() + hazard_overlays["[NORTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "N") + hazard_overlays["[EAST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "E") + hazard_overlays["[SOUTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "S") + hazard_overlays["[WEST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "W") + /obj/item/taperoll/police name = "police tape" desc = "A roll of police tape used to block off crime scenes from the public." @@ -97,7 +118,10 @@ usr << "\blue You finish placing the [src]." //Git Test /obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity) - if (proximity && istype(A, /obj/machinery/door/airlock)) + if (!proximity) + return + + if(istype(A, /obj/machinery/door/airlock)) var/turf/T = get_turf(A) var/obj/item/tape/P = new tape_type(T.x,T.y,T.z) P.loc = locate(T.x,T.y,T.z) @@ -105,6 +129,23 @@ P.layer = 3.2 user << "\blue You finish placing the [src]." + if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor)) + var/turf/F = A + var/direction = user.loc == F ? user.dir : turn(user.dir, 180) + var/icon/hazard_overlay = hazard_overlays["[direction]"] + if(tape_roll_applications[F] == null) + tape_roll_applications[F] = 0 + + if(tape_roll_applications[F] & direction) // hazard_overlay in F.overlays wouldn't work. + user.visible_message("[user] uses the adhesive of \the [src] to remove area markings from \the [F].", "You use the adhesive of \the [src] to remove area markings from \the [F].") + F.overlays -= hazard_overlay + tape_roll_applications[F] &= ~direction + else + user.visible_message("[user] applied \the [src] on \the [F] to create area markings.", "You apply \the [src] on \the [F] to create area markings.") + F.overlays |= hazard_overlay + tape_roll_applications[F] |= direction + return + /obj/item/tape/Bumped(M as mob) if(src.allowed(M)) var/turf/T = get_turf(src) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 66dd12bf0b9..3914207e538 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -25,6 +25,10 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ new/datum/stack_recipe("brown comfy chair", /obj/structure/stool/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("lime comfy chair", /obj/structure/stool/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("teal comfy chair", /obj/structure/stool/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("red comfy chair", /obj/structure/stool/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("blue comfy chair", /obj/structure/stool/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("purple comfy chair", /obj/structure/stool/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("green comfy chair", /obj/structure/stool/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \ ), 2), \ null, \ new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \ diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index 532454b445f..aeabb4e887b 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -2,6 +2,7 @@ icon = 'icons/obj/barsigns.dmi' icon_state = "empty" anchored = 1 + var/nopick = 0 New() ChangeSign(pick("magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thecavern", "cindikate", "theorchard", "lv426", "zocalo", "4theemprah", "ishimura", "tardis", "quarks", "tenforward", "thepranicngpony", "vault13", "solaris", "thehive", "cantina", "theouterspess", "milliways42", "thetimeofeve", "spaceasshole", "dwarffortress", "thebark", "thedrunkcarp", "theharmbaton", "thenest", "officerbeersky", "thesingulo")) return @@ -10,3 +11,18 @@ //on = 0 //brightness_on = 4 //uncomment these when the lighting fixes get in return + +/obj/structure/sign/double/barsign/attackby(obj/item/I, mob/user) + if(nopick) + return + + if(istype(I, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/card = I + if(access_bar in card.GetAccess()) + var/sign_type = input(user, "What would you like to change the barsign to?") as null|anything in list("Off", "Magma Sea", "Limbo", "Rusty Axe", "Armok Bar", "Broken Drum", "Mead bay", "The Cavern", "Cindi Kate", "The Orchard", "LV 426", "Zocalo", "4 The Emprah", "Ishimura", "Tardis", "Quarks", "Ten Forward", "The Pranicng Pony", "Vault 13", "Solaris", "The Hive", "Cantina", "The Outer Spess", "Milliways 42", "The Time Of Eve", "Space Asshole", "Dwarf Fortress", "The Bark", "The Drunk Carp", "The Harm Baton", "The Nest", "Officer Beersky", "The Singulo", "On") + if(sign_type == null) + return + else + sign_type = replacetext(lowertext(sign_type), " ", "") // lowercase, strip spaces - along with choices for user options, avoids huge if-else-else + src.ChangeSign(sign_type) + user << "You change the barsign." \ No newline at end of file diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index e48e8419d2c..53cc69d98ae 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -1,14 +1,17 @@ +#define SHOWER_OPEN_LAYER OBJ_LAYER + 0.4 +#define SHOWER_CLOSED_LAYER MOB_LAYER + 0.1 + /obj/structure/curtain icon = 'icons/obj/curtain.dmi' name = "curtain" icon_state = "closed" - layer = MOB_LAYER + 0.1 + layer = SHOWER_CLOSED_LAYER opacity = 1 density = 0 /obj/structure/curtain/open icon_state = "open" - layer = OBJ_LAYER + layer = SHOWER_OPEN_LAYER opacity = 0 /obj/structure/curtain/bullet_act(obj/item/projectile/P, def_zone) @@ -27,10 +30,10 @@ opacity = !opacity if(opacity) icon_state = "closed" - layer = MOB_LAYER + 0.1 + layer = SHOWER_CLOSED_LAYER else icon_state = "open" - layer = OBJ_LAYER + layer = SHOWER_OPEN_LAYER /obj/structure/curtain/black name = "black curtain" @@ -45,3 +48,12 @@ name = "shower curtain" color = "#ACD1E9" alpha = 200 + +/obj/structure/curtain/open/shower/engineering + color = "#FFA500" + +/obj/structure/curtain/open/shower/security + color = "#AA0000" + +#undef SHOWER_OPEN_LAYER +#undef SHOWER_CLOSED_LAYER \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 2a493bdff37..5d6dac37720 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -54,13 +54,20 @@ buckle_mob(M, user) return +/obj/structure/stool/bed/proc/afterbuckle(mob/M as mob) //Called after somebody buckled / unbuckled + return + /obj/structure/stool/bed/proc/unbuckle() if(buckled_mob) if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt buckled_mob.buckled = null buckled_mob.anchored = initial(buckled_mob.anchored) buckled_mob.update_canmove() + + var/M = buckled_mob buckled_mob = null + + afterbuckle(M) return /obj/structure/stool/bed/proc/manual_unbuckle(mob/user as mob) @@ -110,6 +117,7 @@ M.update_canmove() src.buckled_mob = M src.add_fingerprint(user) + afterbuckle(M) return /* diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 4a020c255bb..3206b08d6f0 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -97,26 +97,53 @@ /obj/structure/stool/bed/chair/comfy name = "comfy chair" desc = "It looks comfy." + icon_state = "comfychair" + color = rgb(255,255,255) + var/image/armrest = null + +/obj/structure/stool/bed/chair/comfy/New() + armrest = image("icons/obj/objects.dmi", "comfychair_armrest") + armrest.layer = MOB_LAYER + 0.1 + + return ..() + +/obj/structure/stool/bed/chair/comfy/afterbuckle() + if(buckled_mob) + overlays += armrest + else + overlays -= armrest /obj/structure/stool/bed/chair/comfy/brown - icon_state = "comfychair_brown" + color = rgb(141,70,0) -/obj/structure/stool/bed/chair/comfy/beige - icon_state = "comfychair_beige" +/obj/structure/stool/bed/chair/comfy/red + color = rgb(218,2,10) /obj/structure/stool/bed/chair/comfy/teal - icon_state = "comfychair_teal" + color = rgb(0,234,250) + +/obj/structure/stool/bed/chair/comfy/black + color = rgb(60,60,60) + +/obj/structure/stool/bed/chair/comfy/green + color = rgb(1,196,8) + +/obj/structure/stool/bed/chair/comfy/purp + color = rgb(112,2,176) + +/obj/structure/stool/bed/chair/comfy/blue + color = rgb(2,9,210) + +/obj/structure/stool/bed/chair/comfy/beige + color = rgb(255,253,195) + +/obj/structure/stool/bed/chair/comfy/lime + color = rgb(255,251,0) /obj/structure/stool/bed/chair/office anchored = 0 movable = 1 -/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) diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 7021deb3613..49cfe687eb1 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -19,6 +19,10 @@ var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc if (tank) tank.explode() + if (istype(src.loc.loc, /obj/item/weapon/reagent_containers/glass/beaker/)) + var/obj/item/weapon/reagent_containers/glass/beaker/beakerbomb = src.loc.loc + if(beakerbomb) + beakerbomb.ignite() var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index e6a1bc6f322..0a8a9f6a0c0 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -1,5 +1,3 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - /obj/item/device/assembly/infra name = "infrared emitter" desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted." @@ -10,173 +8,133 @@ bomb_name = "tripwire mine" - secured = 0 - var/on = 0 var/visible = 0 var/obj/effect/beam/i_beam/first = null + var/obj/effect/beam/i_beam/last = null - proc - trigger_beam() - - describe() - return "The infrared trigger is [on?"on":"off"]." - - activate() - if(!..()) return 0//Cooldown check - on = !on - update_icon() - return 1 - - - toggle_secure() - secured = !secured - if(secured) - processing_objects.Add(src) - else - on = 0 - if(first) del(first) - processing_objects.Remove(src) - update_icon() - return secured - +/obj/item/device/assembly/infra/describe() + return "The infrared trigger is [on?"on":"off"]." +/obj/item/device/assembly/infra/activate() + if(!..()) return 0//Cooldown check + on = !on update_icon() - overlays.Cut() - attached_overlays = list() - if(on) - overlays += "infrared_on" - attached_overlays += "infrared_on" + return 1 - if(holder) - holder.update_icon() - return +/obj/item/device/assembly/infra/toggle_secure() + secured = !secured + if(secured) + processing_objects.Add(src) + else + on = 0 + if(first) qdel(first) + processing_objects.Remove(src) + update_icon() + return secured +/obj/item/device/assembly/infra/update_icon() + overlays.Cut() + attached_overlays = list() + if(on) + overlays += "infrared_on" + attached_overlays += "infrared_on" - process()//Old code - if(!on) - if(first) - del(first) - return - if(first || !secured) return - var/turf/T = null - if(istype(loc,/turf)) - T = loc - else if (holder) - if (istype(holder.loc,/turf)) - T = holder.loc - else if (holder.master && istype(holder.master.loc,/turf)) //for onetankbombs and other tertiary builds with assemblies - T = holder.loc.loc - else if(istype(loc,/obj/item/weapon/grenade) && istype(loc.loc,/turf)) - T = loc.loc - if(T) - var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T) - I.master = src - I.density = 1 - I.dir = dir - step(I, I.dir) - if(I) - I.density = 0 - first = I - I.vis_spread(visible) - spawn(0) - if(I) - //world << "infra: setting limit" - I.limit = 8 - //world << "infra: processing beam \ref[I]" - I.process() - return - return + if(holder) + holder.update_icon() + return - - attack_hand() - del(first) - ..() - return - - - Move() - var/t = dir - ..() - dir = t - del(first) - return - - - holder_movement() - if(!holder) return 0 - del(first) - return 1 - - - trigger_beam() - if((!secured)||(!on)||(cooldown > 0)) return 0 - pulse(0) - visible_message("\icon[src] *beep* *beep*") - cooldown = 2 - spawn(10) - process_cooldown() - return - - - interact(mob/user as mob)//TODO: change this this to the wire control panel - if(!secured) return - user.set_machine(src) - var/dat = text("Infrared Laser\nStatus: []
\nVisibility: []
\n
", (on ? text("On", src) : text("Off", src)), (src.visible ? text("Visible", src) : text("Invisible", src))) - if(holder) - dat += "
Beam direction: [dir2text(dir)] Counter-clockwise | Clockwise" - dat += "

Refresh" - dat += "

Close" - user << browse(dat, "window=infra") - onclose(user, "infra") - return - - - Topic(href, href_list) - ..() - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) - usr << browse(null, "window=infra") - onclose(usr, "infra") +/obj/item/device/assembly/infra/process() + if(!on) + if(first) + qdel(first) return + if(!secured) + return + if(first && last) + last.process() + return + var/turf/T = get_turf(src) + if(T) + var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T) + I.master = src + I.density = 1 + I.dir = dir + first = I + step(I, I.dir) + if(first) + I.density = 0 + I.vis_spread(visible) + I.limit = 8 + I.process() - if(href_list["rotate"]) - switch(href_list["rotate"]) - if("-1") - dir = turn(dir,90) - update_icon() - del(first) - if("1") - dir = turn(dir,-90) - update_icon() - del(first) +/obj/item/device/assembly/infra/attack_hand() + qdel(first) + ..() + return - if(href_list["state"]) - on = !(on) - update_icon() +/obj/item/device/assembly/infra/Move() + var/t = dir + ..() + dir = t + qdel(first) + return - if(href_list["visible"]) - visible = !(visible) - spawn(0) - if(first) - first.vis_spread(visible) +/obj/item/device/assembly/infra/holder_movement() + if(!holder) return 0 +// dir = holder.dir + qdel(first) + return 1 - if(href_list["close"]) - usr << browse(null, "window=infra") - return +/obj/item/device/assembly/infra/proc/trigger_beam() + if((!secured)||(!on)||(cooldown > 0)) + return 0 + pulse(0) + audible_message("\icon[src] *beep* *beep*", null, 3) + cooldown = 2 + spawn(10) + process_cooldown() + return - if(usr) - attack_self(usr) +/obj/item/device/assembly/infra/interact(mob/user as mob)//TODO: change this this to the wire control panel + if(!secured) return + user.set_machine(src) + var/dat = text("Infrared Laser\nStatus: []
\nVisibility: []
\n
", (on ? text("On", src) : text("Off", src)), (src.visible ? text("Visible", src) : text("Invisible", src))) + dat += "

Refresh" + dat += "

Close" + user << browse(dat, "window=infra") + onclose(user, "infra") + return +/obj/item/device/assembly/infra/Topic(href, href_list) + ..() + if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + usr << browse(null, "window=infra") + onclose(usr, "infra") + return + if(href_list["state"]) + on = !(on) + update_icon() + if(href_list["visible"]) + visible = !(visible) + if(first) + first.vis_spread(visible) + if(href_list["close"]) + usr << browse(null, "window=infra") + return + if(usr) + attack_self(usr) + +/obj/item/device/assembly/infra/verb/rotate()//This could likely be better + set name = "Rotate Infrared Laser" + set category = "Object" + set src in usr + + if(usr.stat || !usr.canmove || usr.restrained()) return - - verb/rotate()//This could likely be better - set name = "Rotate Infrared Laser" - set category = "Object" - set src in usr - - dir = turn(dir, 90) - return + dir = turn(dir, 90) + return @@ -187,41 +145,30 @@ icon = 'icons/obj/projectiles.dmi' icon_state = "ibeam" var/obj/effect/beam/i_beam/next = null + var/obj/effect/beam/i_beam/previous = null var/obj/item/device/assembly/infra/master = null var/limit = null var/visible = 0.0 var/left = null anchored = 1.0 - flags = 0 /obj/effect/beam/i_beam/proc/hit() - //world << "beam \ref[src]: hit" if(master) - //world << "beam hit \ref[src]: calling master \ref[master].hit" master.trigger_beam() - del(src) + qdel(src) return /obj/effect/beam/i_beam/proc/vis_spread(v) - //world << "i_beam \ref[src] : vis_spread" visible = v - spawn(0) - if(next) - //world << "i_beam \ref[src] : is next [next.type] \ref[next], calling spread" - next.vis_spread(v) - return - return + if(next) + next.vis_spread(v) + /obj/effect/beam/i_beam/process() - //world << "i_beam \ref[src] : process" - if((loc.density || !(master))) - // world << "beam hit loc [loc] or no master [master], deleting" - del(src) + qdel(src) return - //world << "proccess: [src.left] left" - if(left > 0) left-- if(left < 1) @@ -232,58 +179,40 @@ else invisibility = 0 - - //world << "now [src.left] left" - var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(loc) - I.master = master - I.density = 1 - I.dir = dir - //world << "created new beam \ref[I] at [I.x] [I.y] [I.z]" - step(I, I.dir) - - if(I) - //world << "step worked, now at [I.x] [I.y] [I.z]" - if(!(next)) - //world << "no next" + if(!next && (limit > 0)) + var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(loc) + I.master = master + I.density = 1 + I.dir = dir + I.previous = src + next = I + step(I, I.dir) + if(next) I.density = 0 - //world << "spreading" I.vis_spread(visible) - next = I - spawn(0) - //world << "limit = [limit] " - if((I && limit > 0)) - I.limit = limit - 1 - //world << "calling next process" - I.process() - return - else - //world << "is a next: \ref[next], deleting beam \ref[I]" - del(I) - else - //world << "step failed, deleting \ref[next]" - del(next) - spawn(10) - process() - return - return + I.limit = limit - 1 + master.last = I + I.process() /obj/effect/beam/i_beam/Bump() - del(src) + qdel(src) return /obj/effect/beam/i_beam/Bumped() hit() - return /obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) if(istype(AM, /obj/effect/beam)) return - spawn(0) - hit() - return - return + hit() /obj/effect/beam/i_beam/Destroy() - del(next) - ..() - return + if(master.first == src) + master.first = null + if(next) + qdel(next) + next = null + if(previous) + previous.next = null + master.last = previous + ..() \ No newline at end of file diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index df5eb1a35cb..d207130aeee 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -53,6 +53,7 @@ affecting = H.get_organ(type) H.Stun(3) if(affecting) + affecting.take_damage(1, 0) H.updatehealth() else if(ismouse(target)) var/mob/living/simple_animal/mouse/M = target diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 887371b4f48..d325d657b52 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -324,10 +324,10 @@ proc/get_damage_icon_part(damage_state, body_part) //Underwear if(underwear && species.flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', underwear), ICON_OVERLAY) + stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY) if(undershirt && species.flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', undershirt), ICON_OVERLAY) + stand_icon.Blend(new /icon('icons/mob/human.dmi', "undershirt[undershirt]_s"), ICON_OVERLAY) if(update_icons) update_icons() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index a10372b8be8..c7c4205bc1c 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -310,7 +310,11 @@ pc.Blend(tiny_img,ICON_OVERLAY, 12, 19) var/datum/picture/P = new() - P.fields["name"] = "photo" + if(istype(src,/obj/item/device/camera/digital)) + P.fields["name"] = input(user,"Name photo:","photo") + P.name = P.fields["name"]//So the name is displayed on the print/delete list. + else + P.fields["name"] = "photo" P.fields["author"] = user P.fields["icon"] = ic P.fields["tiny"] = pc @@ -351,6 +355,82 @@ return p +/***************** +* digital camera * +******************/ +/obj/item/device/camera/digital + name = "digital camera" + desc = "A digital camera. A small screen shows there is space for 10 photos left." + var/list/datum/picture/saved_pictures = list() + pictures_left = 30 + var/max_storage = 10 + +/obj/item/device/camera/digital/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) + if(!on || !pictures_left || ismob(target.loc)) return + captureimage(target, user, flag) + + playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) + + desc = "A digital camera. A small screen shows that there are currently [saved_pictures.len] pictures stored." + icon_state = icon_off + on = 0 + spawn(64) + icon_state = icon_on + on = 1 + +/obj/item/device/camera/digital/captureimage(atom/target, mob/user, flag) + if(saved_pictures.len >= max_storage) + user << "Maximum photo storage capacity reached." + return + user << "Picture saved." + var/x_c = target.x - (size-1)/2 + var/y_c = target.y + (size-1)/2 + var/z_c = target.z + var/list/turfs = list() + var/mobs = "" + for(var/i = 1; i <= size; i++) + for(var/j = 1; j <= size; j++) + var/turf/T = locate(x_c, y_c, z_c) + if(can_capture_turf(T, user)) + turfs.Add(T) + mobs += get_mobs(T) + x_c++ + y_c-- + x_c = x_c - size + + var/datum/picture/P = createpicture(target, user, turfs, mobs, flag) + saved_pictures += P + +/obj/item/device/camera/digital/verb/print_picture() + set name = "Print picture" + set category = "Object" + set src in usr + + if(saved_pictures.len == 0) + usr << "No images saved." + return + if(pictures_left == 0) + usr << "There is no film left to print." + return + + var/datum/picture/P = null + P = input("Select image to print:",P) as null|anything in saved_pictures + if(P) + printpicture(usr,P) + pictures_left -- + +/obj/item/device/camera/digital/verb/delete_picture() + set name = "Delete picture" + set category = "Object" + set src in usr + + if(saved_pictures.len == 0) + usr << "No images saved" + return + var/datum/picture/P = null + P = input("Select image to delete:",P) as null|anything in saved_pictures + if(P) + saved_pictures -= P /************** *video camera * diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index e88c22556f5..04c9f14e092 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -1,4 +1,4 @@ -//////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// /// (Mixing)Glass. //////////////////////////////////////////////////////////////////////////////// /obj/item/weapon/reagent_containers/glass @@ -190,6 +190,7 @@ item_state = "beaker" m_amt = 0 g_amt = 500 + var/obj/item/device/assembly_holder/assembly = null on_reagent_change() update_icon() @@ -228,6 +229,55 @@ if (!is_open_container()) var/image/lid = image(icon, src, "lid_[initial(icon_state)]") overlays += lid + if(assembly) + overlays += "assembly" + +/obj/item/weapon/reagent_containers/glass/beaker/verb/remove_assembly() + set name = "Remove Assembly" + set category = "Object" + set src in usr + if(usr.stat || !usr.canmove || usr.restrained()) + return + if (assembly) + usr << "You detach [assembly] from \the [src]" + usr.put_in_hands(assembly) + assembly = null + update_icon() + else + usr << "There is no assembly to remove." + +/obj/item/weapon/reagent_containers/glass/beaker/ignite() + if(reagents) + reagents.chem_temp += 30 + reagents.handle_reactions() + +/obj/item/weapon/reagent_containers/glass/beaker/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if (istype(W,/obj/item/device/assembly_holder)) + if (assembly) + usr << "The [src] already has an assembly." + return ..() + assembly = W + user.drop_item() + W.loc = src + overlays += "assembly" + else + ..() + +/obj/item/weapon/reagent_containers/glass/beaker/HasProximity(atom/movable/AM) + if(assembly) + assembly.HasProximity(AM) + +/obj/item/weapon/reagent_containers/glass/beaker/Crossed(atom/movable/AM) + if(assembly) + assembly.Crossed(AM) + +/obj/item/weapon/reagent_containers/glass/beaker/on_found(mob/finder as mob) //for mousetraps + if(assembly) + assembly.on_found(finder) + +/obj/item/weapon/reagent_containers/glass/beaker/hear_talk(mob/living/M, msg) + if(assembly) + assembly.hear_talk(M, msg) /obj/item/weapon/reagent_containers/glass/beaker/large name = "large beaker" diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 2c5c73f5374..b3efb13975a 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -178,6 +178,14 @@ build_path = /obj/item/device/assembly/prox_sensor category = list("initial", "Miscellaneous") +/datum/design/mousetrap + name = "Mousetrap" + id = "mousetrap" + build_type = AUTOLATHE + materials = list("$metal" = 800, "$glass" = 200) + build_path = /obj/item/device/assembly/mousetrap + category = list("initial", "Miscellaneous") + /datum/design/timer name = "Timer" id = "timer" diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 4b0dc6425e9..403e5745ca8 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -39,4 +39,14 @@ build_type = PROTOLATHE | AUTOLATHE materials = list("$metal" = 30, "$glass" = 10) build_path = /obj/item/weapon/disk/tech_disk + category = list("Miscellaneous") + +/datum/design/digital_camera + name = "Digital Camera" + desc = "Produce an enhanced version of the standard issue camera." + id = "digitalcamera" + req_tech = list("programming" = 2, "materials" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 500, "$glass" = 300) + build_path = /obj/item/device/camera/digital category = list("Miscellaneous") \ No newline at end of file diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi index cacaf71b156..cd7408a46d5 100644 Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index db617d819bf..b67e0602781 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 3120f49eb9d..4636f769664 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm index f9f956d3aed..1f14f8ddec7 100644 --- a/maps/cyberiad.dmm +++ b/maps/cyberiad.dmm @@ -3087,7 +3087,7 @@ "bhs" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bht" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate_elite/mothership) "bhu" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) -"bhv" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/wardrobe/white,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) +"bhv" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/dresser,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) "bhw" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) "bhx" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) "bhy" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/crew_quarters/locker) @@ -3852,7 +3852,7 @@ "bwd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/lattice,/turf/space,/area) "bwe" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravitygenerator) "bwf" = (/obj/machinery/light{dir = 4},/obj/machinery/hologram/holopad,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravitygenerator) -"bwg" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Captain's Quarters APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_y = 24},/obj/structure/closet/cabinet,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) +"bwg" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Captain's Quarters APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_y = 24},/obj/structure/dresser,/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bwh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bwi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bwj" = (/obj/machinery/door/airlock{name = "Private Restroom"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom) @@ -8252,7 +8252,7 @@ "dcJ" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "dcK" = (/obj/structure/stool{pixel_y = 8},/obj/effect/landmark{name = "Syndicate-Spawn"},/obj/effect/decal/warning_stripes/east,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "dcL" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership) -"dcM" = (/obj/structure/closet/cabinet,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) +"dcM" = (/obj/structure/dresser,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) "dcN" = (/obj/structure/table/woodentable,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) "dcO" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) "dcP" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)