From bccb7cb14fb4cadd4fdfc36940590fa1ac97b41e Mon Sep 17 00:00:00 2001 From: spasticVerbalizer Date: Mon, 11 May 2015 20:52:31 +0200 Subject: [PATCH 01/71] Standardized heat-proofing airlocks --- code/game/machinery/doors/airlock.dm | 20 ----------- code/game/machinery/doors/door.dm | 6 ++-- code/game/objects/structures/door_assembly.dm | 35 +++++++++++++++++++ 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 64117c66660..e738e8ef8ec 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -164,7 +164,6 @@ opacity = 0 doortype = /obj/structure/door_assembly/door_assembly_research/glass glass = 1 - heat_proof = 1 /obj/machinery/door/airlock/glass_mining name = "maintenance hatch" @@ -1114,35 +1113,27 @@ About the new airlock wires panel: if("Default") icon = 'icons/obj/doors/Doorglass.dmi' doortype = /obj/structure/door_assembly/door_assembly_glass - heat_proof = 0 if("Engineering") icon = 'icons/obj/doors/Doorengglass.dmi' doortype = /obj/structure/door_assembly/door_assembly_eng/glass - heat_proof = 0 if("Atmospherics") icon = 'icons/obj/doors/Dooratmoglass.dmi' doortype = /obj/structure/door_assembly/door_assembly_atmo/glass - heat_proof = 0 if("Security") icon = 'icons/obj/doors/Doorsecglass.dmi' doortype = /obj/structure/door_assembly/door_assembly_sec/glass - heat_proof = 0 if("Command") icon = 'icons/obj/doors/Doorcomglass.dmi' doortype = /obj/structure/door_assembly/door_assembly_com/glass - heat_proof = 0 if("Medical") icon = 'icons/obj/doors/Doormedglass.dmi' doortype = /obj/structure/door_assembly/door_assembly_med/glass - heat_proof = 0 if("Research") icon = 'icons/obj/doors/Doorresearchglass.dmi' doortype = /obj/structure/door_assembly/door_assembly_research/glass - heat_proof = 1 if("Mining") icon = 'icons/obj/doors/Doorminingglass.dmi' doortype = /obj/structure/door_assembly/door_assembly_min/glass - heat_proof = 0 else //These airlocks have a regular version. var optionlist = list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining", "Maintenance", "External", "High Security") @@ -1152,47 +1143,36 @@ About the new airlock wires panel: if("Default") icon = 'icons/obj/doors/Doorint.dmi' doortype = /obj/structure/door_assembly/door_assembly_0 - heat_proof = 0 if("Engineering") icon = 'icons/obj/doors/Dooreng.dmi' doortype = /obj/structure/door_assembly/door_assembly_eng - heat_proof = 0 if("Atmospherics") icon = 'icons/obj/doors/Dooratmo.dmi' doortype = /obj/structure/door_assembly/door_assembly_atmo - heat_proof = 0 if("Security") icon = 'icons/obj/doors/Doorsec.dmi' doortype = /obj/structure/door_assembly/door_assembly_sec - heat_proof = 0 if("Command") icon = 'icons/obj/doors/Doorcom.dmi' doortype = /obj/structure/door_assembly/door_assembly_com - heat_proof = 0 if("Medical") icon = 'icons/obj/doors/Doormed.dmi' doortype = /obj/structure/door_assembly/door_assembly_med - heat_proof = 0 if("Research") icon = 'icons/obj/doors/Doorresearch.dmi' doortype = /obj/structure/door_assembly/door_assembly_research - heat_proof = 0 if("Mining") icon = 'icons/obj/doors/Doormining.dmi' doortype = /obj/structure/door_assembly/door_assembly_min - heat_proof = 0 if("Maintenance") icon = 'icons/obj/doors/Doormaint.dmi' doortype = /obj/structure/door_assembly/door_assembly_mai - heat_proof = 0 if("External") icon = 'icons/obj/doors/Doorext.dmi' doortype = /obj/structure/door_assembly/door_assembly_ext - heat_proof = 0 if("High Security") icon = 'icons/obj/doors/hightechsecurity.dmi' doortype = /obj/structure/door_assembly/door_assembly_highsecurity - heat_proof = 0 update_icon() /obj/machinery/door/airlock/CanAStarPass(var/obj/item/weapon/card/id/ID) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 86434159b81..f30d3f3aa47 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -15,7 +15,7 @@ var/operating = 0 var/glass = 0 var/normalspeed = 1 - var/heat_proof = 0 // For glass airlocks/opacity firedoors + var/heat_proof = 0 // For plasteel-plated airlocks and firedoors var/emergency = 0 // Emergency access override var/sub_door = 0 // 1 if it's meant to go under another door. @@ -275,9 +275,7 @@ return !(stat & NOPOWER) /obj/machinery/door/BlockSuperconductivity() - if(opacity || heat_proof) - return 1 - return 0 + return heat_proof /obj/machinery/door/morgue icon = 'icons/obj/doors/doormorgue.dmi' \ No newline at end of file diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index d37ebc83076..9574134c749 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -15,6 +15,7 @@ obj/structure/door_assembly var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed var/glass_type = /obj/machinery/door/airlock/glass var/created_name = null + var/heat_proof_finished = 0 //will the airlock be heat proof when finished obj/structure/door_assembly/New() base_icon_state = copytext(icon_state,1,lentext(icon_state)) @@ -493,6 +494,29 @@ obj/structure/door_assembly/New() user << " You unsecure the airlock assembly." src.name = "airlock assembly" src.anchored = 0 + else if(istype(W, /obj/item/stack/sheet/plasteel) && state == 1) + var/obj/item/stack/sheet/plasteel/P = W + if (!heat_proof_finished) + if (P.get_amount() < 1) + user << "You need one sheet of plasteel to heat-proof the airlock assembly!" + return + user.visible_message("[user] adds heat-proof plating to the airlock assembly.", + "You start adding heat-proof plating to the airlock assembly...") + if(do_after(user, 40)) //TODO: does this need a sound? + if(P.get_amount() < 1) return + P.use(1) + src.heat_proof_finished = 1 + user << "You add heat-proof plating to the airlock assembly." + src.name = "heat-proofed wired airlock assembly " + else + user << "The airlock assembly already has heat-proof plating!" + else if(istype(W, /obj/item/weapon/crowbar) && state == 1 && heat_proof_finished) + playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + user << "You remove the heat-proof plating from the airlock assembly." + src.heat_proof_finished = 0 + new/obj/item/stack/sheet/plasteel(get_turf(user), 1) + src.name = "wired airlock assembly" + else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored ) var/obj/item/stack/cable_coil/C = W @@ -507,6 +531,8 @@ obj/structure/door_assembly/New() src.state = 1 user << "You wire the airlock assembly." src.name = "wired airlock assembly" + if(src.heat_proof_finished) + src.name = "heat-proofed [src.name]" else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 ) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) @@ -520,6 +546,8 @@ obj/structure/door_assembly/New() new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = 0 src.name = "secured airlock assembly" + if(src.heat_proof_finished) + src.name = "heat-proofed [src.name]" else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 ) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) @@ -536,6 +564,8 @@ obj/structure/door_assembly/New() user << " You install the airlock electronics." src.state = 2 src.name = "near finished airlock assembly" + if(src.heat_proof_finished) + src.name = "heat-proofed [src.name]" src.electronics = W @@ -550,6 +580,8 @@ obj/structure/door_assembly/New() user << " You remove the airlock electronics." src.state = 1 src.name = "wired airlock assembly" + if(src.heat_proof_finished) + src.name = "heat-proofed [src.name]" var/obj/item/weapon/airlock_electronics/ae if (!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) @@ -595,6 +627,8 @@ obj/structure/door_assembly/New() G.use(2) mineral = "[M]" name = "near finished [M] airlock assembly" + if(heat_proof_finished) + name = "heat-proofed [name]" airlock_type = text2path ("/obj/machinery/door/airlock/[M]") base_icon_state = "door_as_[M]" glass_base_icon_state = "door_as_g" @@ -615,6 +649,7 @@ obj/structure/door_assembly/New() door = new src.airlock_type( src.loc ) //door.req_access = src.req_access door.electronics = src.electronics + door.heat_proof = src.heat_proof_finished if(src.electronics.use_one_access) door.req_one_access = src.electronics.conf_access else From 1cc928fac35ec82c7d9ace70fd7b7e1d7485e689 Mon Sep 17 00:00:00 2001 From: spasticVerbalizer Date: Mon, 11 May 2015 21:12:18 +0200 Subject: [PATCH 02/71] Makes the plasteel sheet drop when the assembly is disassembled without removing the sheet, grammars a comment --- code/game/objects/structures/door_assembly.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 9574134c749..fe79a3bae90 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -15,7 +15,7 @@ obj/structure/door_assembly var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed var/glass_type = /obj/machinery/door/airlock/glass var/created_name = null - var/heat_proof_finished = 0 //will the airlock be heat proof when finished + var/heat_proof_finished = 0 //whether to heat-proof the finished airlock obj/structure/door_assembly/New() base_icon_state = copytext(icon_state,1,lentext(icon_state)) @@ -450,6 +450,8 @@ obj/structure/door_assembly/New() return user << " You disassemble the airlock assembly." new /obj/item/stack/sheet/metal(get_turf(src), 4) + if(heat_proof_finished) + new /obj/item/stack/sheet/plasteel(get_turf(src)) if (mineral) if (mineral == "glass") new /obj/item/stack/sheet/rglass(get_turf(src)) From cb084abd8feb43386986072be05fadd3efcd62c3 Mon Sep 17 00:00:00 2001 From: spasticVerbalizer Date: Mon, 11 May 2015 21:28:43 +0200 Subject: [PATCH 03/71] Heat-proofs pod doors --- code/game/machinery/doors/poddoor.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 9498dbb81c9..d25a773ad3a 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -6,6 +6,7 @@ var/id = 1 var/auto_close = 0 // Time in seconds to automatically close when opened, 0 if it doesn't. sub_door = 1 + var/heat_proof = 1 /obj/machinery/door/poddoor/preopen icon_state = "open" From c005035038cd992e68142be4b57512b117b2db19 Mon Sep 17 00:00:00 2001 From: spasticVerbalizer Date: Mon, 11 May 2015 21:31:14 +0200 Subject: [PATCH 04/71] Didn't test properly, fixes warning --- code/game/machinery/doors/poddoor.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index d25a773ad3a..e558ccbac61 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -6,7 +6,7 @@ var/id = 1 var/auto_close = 0 // Time in seconds to automatically close when opened, 0 if it doesn't. sub_door = 1 - var/heat_proof = 1 + heat_proof = 1 /obj/machinery/door/poddoor/preopen icon_state = "open" From 2b7ecf9e97b6940c6f5f10087b4a0b347537d166 Mon Sep 17 00:00:00 2001 From: spasticVerbalizer Date: Mon, 11 May 2015 22:22:06 +0200 Subject: [PATCH 05/71] Non-glass airlocks block heat again --- code/game/machinery/doors/door.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index f30d3f3aa47..ca3f9b5df1f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -274,8 +274,10 @@ /obj/machinery/door/proc/hasPower() return !(stat & NOPOWER) -/obj/machinery/door/BlockSuperconductivity() - return heat_proof +/obj/machinery/door/BlockSuperconductivity() // All non-glass airlocks block heat, this is intended. + if(opacity || heat_proof) + return 1 + return 0 /obj/machinery/door/morgue icon = 'icons/obj/doors/doormorgue.dmi' \ No newline at end of file From 1468ad5b6f00bab09b67565c75b145417b1ed1e0 Mon Sep 17 00:00:00 2001 From: spasticVerbalizer Date: Tue, 12 May 2015 11:33:21 +0200 Subject: [PATCH 06/71] Heat-proofness now determined by the type of glass in the airlock --- code/game/machinery/doors/airlock.dm | 3 +- code/game/machinery/doors/door.dm | 2 +- code/game/objects/structures/door_assembly.dm | 53 +++++-------------- 3 files changed, 15 insertions(+), 43 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e738e8ef8ec..73d37d489dc 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -928,7 +928,8 @@ About the new airlock wires panel: if(do_after(user,40)) if(src.loc) if(src.doortype) - new src.doortype(src.loc) + var/obj/structure/door_assembly/A = new src.doortype(src.loc) + A.heat_proof_finished = src.heat_proof //tracks whether there's rglass in if(emagged) user << "You discard the damaged electronics." diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index ca3f9b5df1f..d0a93d4ec41 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -15,7 +15,7 @@ var/operating = 0 var/glass = 0 var/normalspeed = 1 - var/heat_proof = 0 // For plasteel-plated airlocks and firedoors + var/heat_proof = 0 // For rglass-windowed airlocks and firedoors var/emergency = 0 // Emergency access override var/sub_door = 0 // 1 if it's meant to go under another door. diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index fe79a3bae90..e67788c29e0 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -450,11 +450,12 @@ obj/structure/door_assembly/New() return user << " You disassemble the airlock assembly." new /obj/item/stack/sheet/metal(get_turf(src), 4) - if(heat_proof_finished) - new /obj/item/stack/sheet/plasteel(get_turf(src)) if (mineral) if (mineral == "glass") - new /obj/item/stack/sheet/rglass(get_turf(src)) + if (heat_proof_finished) + new /obj/item/stack/sheet/rglass(get_turf(src)) + else + new /obj/item/stack/sheet/glass(get_turf(src)) else var/M = text2path("/obj/item/stack/sheet/mineral/[mineral]") new M(get_turf(src)) @@ -496,29 +497,6 @@ obj/structure/door_assembly/New() user << " You unsecure the airlock assembly." src.name = "airlock assembly" src.anchored = 0 - else if(istype(W, /obj/item/stack/sheet/plasteel) && state == 1) - var/obj/item/stack/sheet/plasteel/P = W - if (!heat_proof_finished) - if (P.get_amount() < 1) - user << "You need one sheet of plasteel to heat-proof the airlock assembly!" - return - user.visible_message("[user] adds heat-proof plating to the airlock assembly.", - "You start adding heat-proof plating to the airlock assembly...") - if(do_after(user, 40)) //TODO: does this need a sound? - if(P.get_amount() < 1) return - P.use(1) - src.heat_proof_finished = 1 - user << "You add heat-proof plating to the airlock assembly." - src.name = "heat-proofed wired airlock assembly " - else - user << "The airlock assembly already has heat-proof plating!" - else if(istype(W, /obj/item/weapon/crowbar) && state == 1 && heat_proof_finished) - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user << "You remove the heat-proof plating from the airlock assembly." - src.heat_proof_finished = 0 - new/obj/item/stack/sheet/plasteel(get_turf(user), 1) - src.name = "wired airlock assembly" - else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored ) var/obj/item/stack/cable_coil/C = W @@ -533,8 +511,6 @@ obj/structure/door_assembly/New() src.state = 1 user << "You wire the airlock assembly." src.name = "wired airlock assembly" - if(src.heat_proof_finished) - src.name = "heat-proofed [src.name]" else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 ) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) @@ -548,15 +524,11 @@ obj/structure/door_assembly/New() new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = 0 src.name = "secured airlock assembly" - if(src.heat_proof_finished) - src.name = "heat-proofed [src.name]" else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 ) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) user.visible_message("[user] installs the electronics into the airlock assembly.", \ "You start to install electronics into the airlock assembly...") - - if(do_after(user, 40)) if( src.state != 1 ) return @@ -566,8 +538,6 @@ obj/structure/door_assembly/New() user << " You install the airlock electronics." src.state = 2 src.name = "near finished airlock assembly" - if(src.heat_proof_finished) - src.name = "heat-proofed [src.name]" src.electronics = W @@ -582,8 +552,6 @@ obj/structure/door_assembly/New() user << " You remove the airlock electronics." src.state = 1 src.name = "wired airlock assembly" - if(src.heat_proof_finished) - src.name = "heat-proofed [src.name]" var/obj/item/weapon/airlock_electronics/ae if (!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) @@ -595,16 +563,21 @@ obj/structure/door_assembly/New() var/obj/item/stack/sheet/G = W if(G) if(G.get_amount() >= 1) - if(G.type == /obj/item/stack/sheet/rglass) + if(istype(G, /obj/item/stack/sheet/rglass) || istype(G, /obj/item/stack/sheet/glass)) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [G.name] to the airlock assembly.", \ "You start to install [G.name] into the airlock assembly...") if(do_after(user, 40)) if(G.get_amount() < 1 || mineral) return - user << "You install reinforced glass windows into the airlock assembly." + if (G.type == /obj/item/stack/sheet/rglass) + user << "You install reinforced glass windows into the airlock assembly." + heat_proof_finished = 1 //reinforced glass makes the airlock heat-proof + name = "near finished heat-proofed window airlock assembly" + else + user << "You install regular glass windows into the airlock assembly." + name = "near finished window airlock assembly" G.use(1) mineral = "glass" - name = "near finished window airlock assembly" //This list contains the airlock paintjobs that have a glass version: if(icontext in list("eng", "atmo", "sec", "com", "med", "res", "min")) src.airlock_type = text2path("/obj/machinery/door/airlock/[typetext]") @@ -629,8 +602,6 @@ obj/structure/door_assembly/New() G.use(2) mineral = "[M]" name = "near finished [M] airlock assembly" - if(heat_proof_finished) - name = "heat-proofed [name]" airlock_type = text2path ("/obj/machinery/door/airlock/[M]") base_icon_state = "door_as_[M]" glass_base_icon_state = "door_as_g" From 7e341e7e090a70e03ac7601125415e80fcb5e910 Mon Sep 17 00:00:00 2001 From: spasticVerbalizer Date: Tue, 12 May 2015 15:56:58 +0200 Subject: [PATCH 07/71] Changelog --- html/changelogs/spasticVerbalizer-heatproofAirlocks.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/spasticVerbalizer-heatproofAirlocks.yml diff --git a/html/changelogs/spasticVerbalizer-heatproofAirlocks.yml b/html/changelogs/spasticVerbalizer-heatproofAirlocks.yml new file mode 100644 index 00000000000..79bc5f162e5 --- /dev/null +++ b/html/changelogs/spasticVerbalizer-heatproofAirlocks.yml @@ -0,0 +1,6 @@ +author: spasticVerbalizer + +delete-after: True + +changes: + - tweak: "Glass airlocks can now be made heat-proof by using a sheet of reinforced glass to create the window, regular glass creates a normal glass airlock." From df02e068a04ccc81bbbb60639a614762b3f9c61c Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Sun, 17 May 2015 08:49:47 -0300 Subject: [PATCH 08/71] Fixes diseases not infecting people behind tables or other objects with density that do not block air. Fixes poly from smashing herself constantly against windows trying to reach unreacheable items. Changed the way AStar selects the adjacent turfs from each turf, taking in count the capabilities of the object or mob who will move. For example, being able to pass over tables. The new system will use the bitflag atmos_adjacent_turfs to reach for adjacent turfs and CanPass(). Fixes #436 --- code/__HELPERS/unsorted.dm | 90 ------------------- code/datums/diseases/_disease.dm | 2 +- .../gamemodes/changeling/powers/tiny_prick.dm | 2 +- code/game/machinery/bots/bots.dm | 6 +- code/game/machinery/bots/cleanbot.dm | 2 +- code/game/machinery/bots/floorbot.dm | 4 +- code/game/machinery/bots/medbot.dm | 2 +- code/game/machinery/bots/mulebot.dm | 2 +- code/game/turfs/turf.dm | 83 ----------------- .../mob/living/simple_animal/parrot.dm | 15 ++-- code/orphaned procs/AStar.dm | 75 +++++++++++++--- 11 files changed, 84 insertions(+), 199 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 49bbcb8d075..5d56a922280 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -138,96 +138,6 @@ Turf and target are seperate in case you want to teleport some distance from a t return destination -/////////////////// -//A* helpers procs -/////////////////// - -// Returns true if a link between A and B is blocked -// Movement through doors allowed if ID has access -/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/weapon/card/id/ID) - - if(A == null || B == null) return 1 - var/adir = get_dir(A,B) - var/rdir = get_dir(B,A) - if(adir & (adir-1)) // diagonal - var/turf/iStep = get_step(A,adir&(NORTH|SOUTH)) - if(!iStep.density && !LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID)) - return 0 - - var/turf/pStep = get_step(A,adir&(EAST|WEST)) - if(!pStep.density && !LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID)) - return 0 - - return 1 - - if(DirBlockedWithAccess(A,adir, ID)) - return 1 - - if(DirBlockedWithAccess(B,rdir, ID)) - return 1 - - for(var/obj/O in B) - if(O.density && !istype(O, /obj/machinery/door) && !(O.flags & ON_BORDER)) - return 1 - - return 0 - -// Returns true if direction is blocked from loc -// Checks doors against access with given ID -/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/weapon/card/id/ID) - for(var/obj/structure/window/D in loc) - if(!D.density) continue - if(D.dir == SOUTHWEST) return 1 //full-tile window - if(D.dir == dir) return 1 //matching border window - - for(var/obj/machinery/door/D in loc) - if(!D.CanAStarPass(ID,dir)) - return 1 - return 0 - -// Returns true if a link between A and B is blocked -// Movement through doors allowed if door is open -/proc/LinkBlocked(turf/A, turf/B) - if(A == null || B == null) - return 1 - var/adir = get_dir(A,B) - var/rdir = get_dir(B,A) - if(adir & (adir-1)) //diagonal - var/turf/iStep = get_step(A,adir & (NORTH|SOUTH)) //check the north/south component - if(!iStep.density && !LinkBlocked(A,iStep) && !LinkBlocked(iStep,B)) - return 0 - - var/turf/pStep = get_step(A,adir & (EAST|WEST)) //check the east/west component - if(!pStep.density && !LinkBlocked(A,pStep) && !LinkBlocked(pStep,B)) - return 0 - - return 1 - - if(DirBlocked(A,adir)) return 1 - if(DirBlocked(B,rdir)) return 1 - - for(var/obj/O in B) - if(O.density && !istype(O, /obj/machinery/door) && !(O.flags & ON_BORDER)) - return 1 - - return 0 - -// Returns true if direction is blocked from loc -// Checks if doors are open -/proc/DirBlocked(turf/loc,var/dir) - for(var/obj/structure/window/D in loc) - if(!D.density) continue - if(D.dir == SOUTHWEST) return 1 //full-tile window - if(D.dir == dir) return 1 //matching border window - - for(var/obj/machinery/door/D in loc) - if(!D.density)//if the door is open - continue - else return 1 // if closed, it's a real, air blocking door - return 0 - -///////////////////////////////////////////////////////////////////////// - /proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm var/px=M.x //starting x var/py=M.y diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 05ea21602c3..0de6ac8cebf 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -122,7 +122,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease if(isturf(source.loc)) for(var/mob/living/carbon/C in oview(spread_range, source)) if(isturf(C.loc)) - if(AStar(source.loc, C.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, spread_range)) + if(AStar(source.loc, C.loc, null, /turf/proc/Distance, spread_range)) C.ContractDisease(src) diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 2309d3ed850..9dd7ef6cbc7 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -40,7 +40,7 @@ return if(get_dist(user, target) > (user.mind.changeling.sting_range)) return //sanity check as AStar is still throwing insane stunts - if(!AStar(user.loc, target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, user.mind.changeling.sting_range)) + if(!AStar(user.loc, target.loc, null, /turf/proc/Distance, user.mind.changeling.sting_range)) return //hope this ancient magic still works if(target.mind && target.mind.changeling) sting_feedback(user,target) diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index ed60a26be70..79d7d10aedf 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -455,7 +455,7 @@ obj/machinery/bot/proc/bot_step(var/dest) var/datum/job/captain/All = new/datum/job/captain all_access.access = All.get_access() - path = get_path_to(src, waypoint, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 200, id=all_access) + path = get_path_to(src, waypoint, src, /turf/proc/Distance_cardinal, 0, 200, id=all_access) calling_ai = caller //Link the AI to the bot! ai_waypoint = waypoint @@ -657,12 +657,12 @@ obj/machinery/bot/proc/bot_summon() // given an optional turf to avoid /obj/machinery/bot/proc/calc_path(var/turf/avoid) check_bot_access() - path = get_path_to(loc, patrol_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 120, id=botcard, exclude=avoid) + path = get_path_to(loc, patrol_target, src, /turf/proc/Distance_cardinal, 0, 120, id=botcard, exclude=avoid) /obj/machinery/bot/proc/calc_summon_path(var/turf/avoid) check_bot_access() spawn() - path = get_path_to(loc, summon_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 150, id=botcard, exclude=avoid) + path = get_path_to(loc, summon_target, src, /turf/proc/Distance_cardinal, 0, 150, id=botcard, exclude=avoid) if(!path.len || tries >= 5) //Cannot reach target. Give up and announce the issue. speak("Summon command failed, destination unreachable.",radio_frequency) bot_reset() diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index 6b151a3d4f9..f1dd0e405c3 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -166,7 +166,7 @@ text("[on ? "On" : "Off"]")) if(target) if(!path || path.len == 0) //No path, need a new one //Try to produce a path to the target, and ignore airlocks to which it has access. - path = get_path_to(loc, target.loc, /turf/proc/AdjacentTurfsWithAccess, /turf/proc/Distance, 0, 30, id=botcard) + path = get_path_to(loc, target.loc, src, /turf/proc/Distance, 0, 30, id=botcard) if (!bot_move(target)) add_to_ignore(target) target = null diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index 9ab6f15d707..cfb4f7e5aed 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -260,9 +260,9 @@ if(path.len == 0) if(!istype(target, /turf/)) var/turf/TL = get_turf(target) - path = get_path_to(loc, TL, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard) + path = get_path_to(loc, TL, src, /turf/proc/Distance, 0, 30, id=botcard) else - path = get_path_to(loc, target, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard) + path = get_path_to(loc, target, src, /turf/proc/Distance, 0, 30, id=botcard) if(!bot_move(target)) add_to_ignore(target) diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 1aa670c9ac0..3040c71c68f 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -338,7 +338,7 @@ return if(patient && path.len == 0 && (get_dist(src,patient) > 1)) - path = get_path_to(loc, get_turf(patient), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 30,id=botcard) + path = get_path_to(loc, get_turf(patient), src, /turf/proc/Distance_cardinal, 0, 30,id=botcard) mode = BOT_MOVING if(!path.len) //Do not chase a patient we cannot reach. soft_reset() diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 639827db895..843cd92cc57 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -659,7 +659,7 @@ obj/machinery/bot/mulebot/bot_reset() // calculates a path to the current destination // given an optional turf to avoid /obj/machinery/bot/mulebot/calc_path(var/turf/avoid = null) - path = get_path_to(loc, target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 250, id=botcard, exclude=avoid) + path = get_path_to(loc, target, src, /turf/proc/Distance_cardinal, 0, 250, id=botcard, exclude=avoid) // sets the current destination diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 424dcb2c80a..b40e377a9e1 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -192,89 +192,6 @@ /turf/proc/Bless() flags |= NOJAUNT -///////////////////////////////////////////////////////////////////////// -// Navigation procs -// Used for A-star pathfinding -//////////////////////////////////////////////////////////////////////// - -/////////////////////////// -//Cardinal only movements -/////////////////////////// - -// Returns the surrounding cardinal turfs with open links -// Including through doors openable with the ID -/turf/proc/CardinalTurfsWithAccess(var/obj/item/weapon/card/id/ID) - var/list/L = new() - var/turf/simulated/T - - for(var/dir in cardinal) - T = get_step(src, dir) - if(istype(T) && !T.density) - if(!LinkBlockedWithAccess(src, T, ID)) - L.Add(T) - return L - -// Returns the surrounding cardinal turfs with open links -// Don't check for ID, doors passable only if open -/turf/proc/CardinalTurfs() - var/list/L = new() - var/turf/simulated/T - - for(var/dir in cardinal) - T = get_step(src, dir) - if(istype(T) && !T.density) - if(!LinkBlocked(src, T)) - L.Add(T) - return L - -/////////////////////////// -//All directions movements -/////////////////////////// - -// Returns the surrounding simulated turfs with open links -// Including through doors openable with the ID -/turf/proc/AdjacentTurfsWithAccess(var/obj/item/weapon/card/id/ID = null,var/list/closed)//check access if one is passed - var/list/L = new() - var/turf/simulated/T - for(var/dir in list(NORTHWEST,NORTHEAST,SOUTHEAST,SOUTHWEST,NORTH,EAST,SOUTH,WEST)) //arbitrarily ordered list to favor non-diagonal moves in case of ties - T = get_step(src,dir) - if(T in closed) //turf already proceeded in A* - continue - if(istype(T) && !T.density) - if(!LinkBlockedWithAccess(src, T, ID)) - L.Add(T) - return L - -//Idem, but don't check for ID and goes through open doors -/turf/proc/AdjacentTurfs(var/list/closed) - var/list/L = new() - var/turf/simulated/T - for(var/dir in list(NORTHWEST,NORTHEAST,SOUTHEAST,SOUTHWEST,NORTH,EAST,SOUTH,WEST)) //arbitrarily ordered list to favor non-diagonal moves in case of ties - T = get_step(src,dir) - if(T in closed) //turf already proceeded by A* - continue - if(istype(T) && !T.density) - if(!LinkBlocked(src, T)) - L.Add(T) - return L - -// check for all turfs, including unsimulated ones -/turf/proc/AdjacentTurfsSpace(var/obj/item/weapon/card/id/ID = null, var/list/closed)//check access if one is passed - var/list/L = new() - var/turf/T - for(var/dir in list(NORTHWEST,NORTHEAST,SOUTHEAST,SOUTHWEST,NORTH,EAST,SOUTH,WEST)) //arbitrarily ordered list to favor non-diagonal moves in case of ties - T = get_step(src,dir) - if(T in closed) //turf already proceeded by A* - continue - if(istype(T) && !T.density) - if(!ID) - if(!LinkBlocked(src, T)) - L.Add(T) - else - if(!LinkBlockedWithAccess(src, T, ID)) - L.Add(T) - return L - ////////////////////////////// //Distance procs ////////////////////////////// diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index ae532946cec..1f6e0713900 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -604,20 +604,25 @@ return 0 /mob/living/simple_animal/parrot/proc/search_for_item() + var/item for(var/atom/movable/AM in view(src)) //Skip items we already stole or are wearing or are too big if(parrot_perch && AM.loc == parrot_perch.loc || AM.loc == src) continue - if(istype(AM, /obj/item)) var/obj/item/I = AM if(I.w_class < 2) - return I - - if(iscarbon(AM)) + item = I + else if(iscarbon(AM)) var/mob/living/carbon/C = AM if((C.l_hand && C.l_hand.w_class <= 2) || (C.r_hand && C.r_hand.w_class <= 2)) - return C + item = C + if(item) + if(!AStar(loc, get_turf(item), src, /turf/proc/Distance)) + item = null + continue + return item + return null /mob/living/simple_animal/parrot/proc/search_for_perch() diff --git a/code/orphaned procs/AStar.dm b/code/orphaned procs/AStar.dm index 09939194154..bc0c4ed27bf 100644 --- a/code/orphaned procs/AStar.dm +++ b/code/orphaned procs/AStar.dm @@ -140,11 +140,11 @@ length to avoid portals or something i guess?? Not that they're counted right no ////////////////////// //the weighting function, used in the A* algorithm -proc/PathWeightCompare(PathNode/a, PathNode/b) +/proc/PathWeightCompare(PathNode/a, PathNode/b) return a.f - b.f //search if there's a PathNode that points to turf T in the Priority Queue -proc/SeekTurf(var/PriorityQueue/Queue, var/turf/T) +/proc/SeekTurf(var/PriorityQueue/Queue, var/turf/T) var/i = 1 var/PathNode/PN while(i < Queue.L.len + 1) @@ -154,8 +154,15 @@ proc/SeekTurf(var/PriorityQueue/Queue, var/turf/T) i++ return 0 +//wrapper that returns an empty list if A* failed to find a path +/proc/get_path_to(start, end, atom, dist, maxnodes, maxnodedepth = 30, mintargetdist, minnodedist, id=null, turf/exclude=null) + var/list/path = AStar(start, end, atom, dist, maxnodes, maxnodedepth, mintargetdist, minnodedist,id, exclude) + if(!path) + path = list() + return path + //the actual algorithm -proc/AStar(start,end,adjacent,dist,maxnodes,maxnodedepth = 30,mintargetdist,minnodedist,id=null, var/turf/exclude=null) +proc/AStar(start, end, atom, dist, maxnodes, maxnodedepth = 30, mintargetdist, minnodedist, id=null, var/turf/exclude=null) var/PriorityQueue/open = new /PriorityQueue(/proc/PathWeightCompare) //the open list, ordered using the PathWeightCompare proc, from lower f to higher var/list/closed = new() //the closed list var/list/path = null //the returned path, if any @@ -202,8 +209,8 @@ proc/AStar(start,end,adjacent,dist,maxnodes,maxnodedepth = 30,mintargetdist,minn */ //get adjacents turfs using the adjacent proc, checking for access with id - var/list/L = call(cur.source,adjacent)(id,closed) - + //var/list/L = call(cur.source,adjacent)(id,closed) + var/list/L = cur.source.reachableAdjacentTurfs(atom, id) for(var/turf/T in L) if(T == exclude) continue @@ -237,9 +244,55 @@ proc/AStar(start,end,adjacent,dist,maxnodes,maxnodedepth = 30,mintargetdist,minn return path -//wrapper that returns an empty list if A* failed to find a path -/proc/get_path_to(var/start,var/end,var/adjacent,var/dist,var/maxnodes,var/maxnodedepth = 30,var/mintargetdist,var/minnodedist,id=null, var/turf/exclude=null) - var/list/path = AStar(start, end, adjacent, dist, maxnodes, maxnodedepth, mintargetdist, minnodedist,id, exclude) - if(!path) - path = list() - return path +/turf/proc/reachableAdjacentTurfs(atom, ID) + var/list/L = new() + var/turf/simulated/T + if(ID) + for(var/dir in cardinal) + T = get_step(src,dir) + if(!istype(T) || T.density) + continue + if(!LinkBlockedWithAccess(T, ID)) + L.Add(T) + else + for(var/dir in cardinal) + if(dir & atmos_adjacent_turfs) + T = get_step(src,dir) + if(!istype(T)) + continue + if(!LinkBlocked(atom, T)) + L.Add(T) + return L + +/turf/proc/LinkBlocked(atom, turf/T) + if(istype(atom, /atom/movable)) + for(var/obj/O in T) + if(!O.CanPass(atom, T, 1)) + return 1 + return 0 + return 0 + +/turf/proc/LinkBlockedWithAccess(turf/T, obj/item/weapon/card/id/ID) + var/adir = get_dir(src, T) + var/rdir = get_dir(T, src) + if(DirBlockedWithAccess(src, adir, ID)) + return 1 + if(DirBlockedWithAccess(T, rdir, ID)) + return 1 + for(var/obj/O in T) + if(O.density && !istype(O, /obj/machinery/door) && !(O.flags & ON_BORDER)) + return 1 + return 0 + +/proc/DirBlockedWithAccess(turf/T, dir, ID) + for(var/obj/structure/window/D in T) + if(!D.density) + continue + if(D.dir == SOUTHWEST) + return 1 + if(D.dir == dir) + return 1 + for(var/obj/machinery/door/D in T) + if(!D.CanAStarPass(ID, dir)) + return 1 + return 0 \ No newline at end of file From 9064d2089e9dbc8e13912f72f52bdc03edaa73d4 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 18 May 2015 10:35:27 +0200 Subject: [PATCH 09/71] Adds abductees to Check antags panel. --- code/game/gamemodes/abduction/machinery/experiment.dm | 4 +++- code/modules/admin/player_panel.dm | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/abduction/machinery/experiment.dm b/code/game/gamemodes/abduction/machinery/experiment.dm index 2de8bdd41ff..45fe96068cd 100644 --- a/code/game/gamemodes/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/abduction/machinery/experiment.dm @@ -7,7 +7,8 @@ anchored = 1 state_open = 1 var/points = 0 - var/list/history = new + var/list/history = list() + var/list/abductee_minds = list() var/flash = " - || - " var/obj/machinery/abductor/console/console @@ -145,6 +146,7 @@ return "No glands detected!" if(H.mind != null && H.ckey != null) history += H + abductee_minds += H.mind say("Processing Specimen...") sleep(5) switch(text2num(type)) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 656097730e6..54592390be8 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -493,6 +493,17 @@ else dat += "Abductor not found!" dat += "" + dat += "
" + for(var/obj/machinery/abductor/experiment/E in machines) + for(var/datum/mind/abductee in E.abductee_minds) + var/mob/M = abductee.current + if(M) + dat += "" + dat += "" + dat += "" + else + dat += "" + dat += "
Abductees
[M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]PMShow Objective
Abductee not found!
" if(istype(ticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/mode = ticker.mode From dca4fbbefd933d9278338875be9fee1ba2aaa4d0 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Mon, 18 May 2015 23:39:09 +0100 Subject: [PATCH 10/71] Fixed storages contents not updating in some cases. --- code/game/objects/items/toys.dm | 10 ++++++++++ code/game/objects/items/weapons/tools.dm | 8 ++++++-- code/modules/assembly/holder.dm | 11 ++++++++--- code/modules/paperwork/paperbin.dm | 12 ++++++++++-- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 54a982ced76..a64275ae2f2 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -845,8 +845,18 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user, else if(istype(over_object, /obj/screen)) switch(over_object.name) if("l_hand") + if(istype(loc,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = loc + S.remove_from_storage(src,M) + else + M.unEquip(src) M.put_in_l_hand(src) else if("r_hand") + if(istype(loc,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = loc + S.remove_from_storage(src,M) + else + M.unEquip(src) M.put_in_r_hand(src) usr << "You pick up the deck." else diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 98be5d71110..90d68ba6e62 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -356,8 +356,12 @@ var/obj/item/stack/rods/R = I if (R.use(1)) var/obj/item/weapon/flamethrower/F = new /obj/item/weapon/flamethrower(user.loc) - user.unEquip(src) - loc = F + if(istype(loc,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = loc + S.remove_from_storage(src,F) + else + user.unEquip(src) + loc = F F.weldtool = src add_fingerprint(user) user << "You add a rod to a welder, starting to build a flamethrower." diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 7f3a9545228..077e771ad05 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -23,10 +23,15 @@ update_icon() /obj/item/device/assembly_holder/proc/attach(var/obj/item/device/assembly/A, var/mob/user) - if(user) - user.remove_from_mob(A) + if(istype(A.loc,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = A.loc + S.remove_from_storage(A,src) + else + if(user) + user.remove_from_mob(A) + A.loc = src + A.holder = src - A.loc = src A.toggle_secure() if(!a_left) a_left = A diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 5d34743e722..bb1daa9c1b4 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -23,10 +23,18 @@ else if(istype(over_object, /obj/screen)) switch(over_object.name) if("r_hand") - M.unEquip(src) + if(istype(loc,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = loc + S.remove_from_storage(src,M) + else + M.unEquip(src) M.put_in_r_hand(src) if("l_hand") - M.unEquip(src) + if(istype(loc,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = loc + S.remove_from_storage(src,M) + else + M.unEquip(src) M.put_in_l_hand(src) add_fingerprint(M) From adccdd38e94d6bad6e634a8c17d6d32e4634fb17 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Tue, 19 May 2015 00:28:15 +0100 Subject: [PATCH 11/71] Made a proc and fixed other buggy items. --- code/game/objects/items.dm | 11 ++++++++++- code/game/objects/items/toys.dm | 10 ++-------- code/game/objects/items/weapons/handcuffs.dm | 3 ++- code/game/objects/items/weapons/tools.dm | 5 +---- code/game/objects/items/weapons/weaponry.dm | 6 ++++-- code/modules/assembly/holder.dm | 6 +----- code/modules/paperwork/paperbin.dm | 10 ++-------- 7 files changed, 22 insertions(+), 29 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9ed07a3fb24..8acdde6efca 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -450,4 +450,13 @@ //Reset regardless of if we hit a human. throw_speed = initial(throw_speed) //explosions change this. - ..() \ No newline at end of file + ..() + +/obj/item/proc/remove_item_from_storage(atom/newLoc) //please use this if you're going to snowflake an item out of a obj/item/weapon/storage + if(!newLoc) + return 0 + if(istype(loc,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = loc + S.remove_from_storage(src,newLoc) + return 1 + return 0 \ No newline at end of file diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index a64275ae2f2..55786386839 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -845,17 +845,11 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user, else if(istype(over_object, /obj/screen)) switch(over_object.name) if("l_hand") - if(istype(loc,/obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = loc - S.remove_from_storage(src,M) - else + if(!remove_item_from_storage(M)) M.unEquip(src) M.put_in_l_hand(src) else if("r_hand") - if(istype(loc,/obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = loc - S.remove_from_storage(src,M) - else + if(!remove_item_from_storage(M)) M.unEquip(src) M.put_in_r_hand(src) usr << "You pick up the deck." diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 980a749b90d..8c2da43fe5a 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -97,7 +97,8 @@ var/obj/item/stack/rods/R = I if (R.use(1)) var/obj/item/weapon/wirerod/W = new /obj/item/weapon/wirerod - user.unEquip(src) + if(!remove_item_from_storage(user)) + user.unEquip(src) user.put_in_hands(W) user << "You wrap the cable restraint around the top of the rod." qdel(src) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 90d68ba6e62..b4ee952a64b 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -356,10 +356,7 @@ var/obj/item/stack/rods/R = I if (R.use(1)) var/obj/item/weapon/flamethrower/F = new /obj/item/weapon/flamethrower(user.loc) - if(istype(loc,/obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = loc - S.remove_from_storage(src,F) - else + if(!remove_item_from_storage(F)) user.unEquip(src) loc = F F.weldtool = src diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index c88fed93502..a4fb3d5fbcb 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -112,8 +112,9 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) if(istype(I, /obj/item/weapon/shard)) var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear + if(!remove_item_from_storage(user)) + user.unEquip(src) user.unEquip(I) - user.unEquip(src) user.put_in_hands(S) user << "You fasten the glass shard to the top of the rod with the cable." @@ -123,8 +124,9 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) else if(istype(I, /obj/item/weapon/wirecutters)) var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod + if(!remove_item_from_storage(user)) + user.unEquip(src) user.unEquip(I) - user.unEquip(src) user.put_in_hands(P) user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward." diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 077e771ad05..5d5aefac0be 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -23,14 +23,10 @@ update_icon() /obj/item/device/assembly_holder/proc/attach(var/obj/item/device/assembly/A, var/mob/user) - if(istype(A.loc,/obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = A.loc - S.remove_from_storage(A,src) - else + if(!A.remove_item_from_storage(src)) if(user) user.remove_from_mob(A) A.loc = src - A.holder = src A.toggle_secure() if(!a_left) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index bb1daa9c1b4..ed59900c037 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -23,17 +23,11 @@ else if(istype(over_object, /obj/screen)) switch(over_object.name) if("r_hand") - if(istype(loc,/obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = loc - S.remove_from_storage(src,M) - else + if(!remove_item_from_storage(M)) M.unEquip(src) M.put_in_r_hand(src) if("l_hand") - if(istype(loc,/obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = loc - S.remove_from_storage(src,M) - else + if(!remove_item_from_storage(M)) M.unEquip(src) M.put_in_l_hand(src) From fe4d28a376b5ab855d663dc1b28aba564a25f988 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Tue, 19 May 2015 09:32:46 -0300 Subject: [PATCH 12/71] Newscaster code big cleanup. Removes lots of copypaste. Admin newscaster barely modified, they still are a gigantic copypaste from the topic.dm() of the newscaster object. Printed diaries will now only report the information available when they were printed, including wanted status and the different types of censorship. All datums are now under /datum/newscaster Wanted is now a different type of datum, /datum/newscaster/wanted_message Fixed a bug where you couldn't censor normal submissions, made by crewmembers. Fixes #944 --- code/game/machinery/newscaster.dm | 1015 +++++++++---------- code/game/objects/items/devices/PDA/cart.dm | 14 +- code/modules/admin/admin.dm | 64 +- code/modules/admin/holder2.dm | 9 +- code/modules/admin/topic.dm | 98 +- 5 files changed, 560 insertions(+), 640 deletions(-) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index cd04b4d4a43..5c3e80e238d 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -1,70 +1,123 @@ -//############################################## -//################### NEWSCASTERS BE HERE! #### -//###-Agouri################################### +var/datum/newscaster/feed_network/news_network = new /datum/newscaster/feed_network +var/list/obj/machinery/newscaster/allCasters = list() -/datum/feed_comment +/datum/newscaster + +/datum/newscaster/feed_comment var/author = "" var/body = "" var/time_stamp = "" -/datum/feed_message +/datum/newscaster/feed_message var/author ="" var/body ="" - //var/parent_channel - var/backup_body ="" - var/backup_author ="" + var/list/authorCensorTime = list() + var/list/bodyCensorTime = list() var/is_admin_message = 0 var/icon/img = null var/time_stamp = "" - var/list/datum/feed_comment/comments = list() + var/list/datum/newscaster/feed_comment/comments = list() var/locked = 0 var/caption = "" + var/creationTime + var/authorCensor + var/bodyCensor -/datum/feed_channel - var/channel_name="" - var/list/datum/feed_message/messages = list() - //var/message_count = 0 - var/locked=0 - var/author="" - var/backup_author="" - var/censored=0 - var/is_admin_channel=0 - //var/page = null //For newspapers +/datum/newscaster/feed_message/proc/returnAuthor(censor) + if(censor == -1) + censor = authorCensor + var/txt = "[news_network.redactedText]" + if(!censor) + txt = author + return txt -/datum/feed_message/proc/clear() - src.author = "" - src.body = "" - src.backup_body = "" - src.backup_author = "" - src.img = null - src.locked = 0 +/datum/newscaster/feed_message/proc/returnBody(censor) + if(censor == -1) + censor = bodyCensor + var/txt = "[news_network.redactedText]" + if(!censor) + txt = body + return txt -/datum/feed_channel/proc/clear() - src.channel_name = "" - src.messages = list() - src.locked = 0 - src.author = "" - src.backup_author = "" - src.censored = 0 - src.is_admin_channel = 0 +/datum/newscaster/feed_message/proc/toggleCensorAuthor() + if(authorCensor) + authorCensorTime.Add(news_network.lastAction*-1) + else + authorCensorTime.Add(news_network.lastAction) + authorCensor = !authorCensor + news_network.lastAction ++ -/datum/feed_network - var/list/datum/feed_channel/network_channels = list() - var/datum/feed_message/wanted_issue +/datum/newscaster/feed_message/proc/toggleCensorBody() + if(bodyCensor) + bodyCensorTime.Add(news_network.lastAction*-1) + else + bodyCensorTime.Add(news_network.lastAction) + bodyCensor = !bodyCensor + news_network.lastAction ++ -/datum/feed_network/New() +/datum/newscaster/feed_channel + var/channel_name = "" + var/list/datum/newscaster/feed_message/messages = list() + var/locked = 0 + var/author = "" + var/censored = 0 + var/list/authorCensorTime = list() + var/list/DclassCensorTime = list() + var/authorCensor + var/is_admin_channel = 0 + +/datum/newscaster/feed_channel/proc/returnAuthor(censor) + if(censor == -1) + censor = authorCensor + var/txt = "[news_network.redactedText]" + if(!censor) + txt = author + return txt + +/datum/newscaster/feed_channel/proc/toggleCensorDclass() + if(censored) + DclassCensorTime.Add(news_network.lastAction*-1) + else + DclassCensorTime.Add(news_network.lastAction) + censored = !censored + news_network.lastAction ++ + +/datum/newscaster/feed_channel/proc/toggleCensorAuthor() + if(authorCensor) + authorCensorTime.Add(news_network.lastAction*-1) + else + authorCensorTime.Add(news_network.lastAction) + authorCensor = !authorCensor + news_network.lastAction ++ + +/datum/newscaster/wanted_message + var/active + var/criminal + var/body + var/scannedUser + var/isAdminMsg + var/icon/img + +/datum/newscaster/feed_network + var/list/datum/newscaster/feed_channel/network_channels = list() + var/datum/newscaster/wanted_message/wanted_issue + var/lastAction + var/redactedText = "\[REDACTED\]" + +/datum/newscaster/feed_network/New() CreateFeedChannel("Station Announcements", "SS13", 1) + wanted_issue = new /datum/newscaster/wanted_message -/datum/feed_network/proc/CreateFeedChannel(var/channel_name, var/author, var/locked, var/adminChannel = 0) - var/datum/feed_channel/newChannel = new /datum/feed_channel +/datum/newscaster/feed_network/proc/CreateFeedChannel(channel_name, author, locked, adminChannel = 0) + var/datum/newscaster/feed_channel/newChannel = new /datum/newscaster/feed_channel newChannel.channel_name = channel_name newChannel.author = author newChannel.locked = locked newChannel.is_admin_channel = adminChannel network_channels += newChannel -/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/allow_comments = 1) - var/datum/feed_message/newMsg = new /datum/feed_message +/datum/newscaster/feed_network/proc/SubmitArticle(msg, author, channel_name, obj/item/weapon/photo/photo, adminMessage = 0, allow_comments = 1) + var/datum/newscaster/feed_message/newMsg = new /datum/newscaster/feed_message newMsg.author = author newMsg.body = msg newMsg.time_stamp = "[worldtime2text()]" @@ -73,17 +126,37 @@ if(photo) newMsg.img = photo.img newMsg.caption = photo.scribble - for(var/datum/feed_channel/FC in network_channels) + for(var/datum/newscaster/feed_channel/FC in network_channels) if(FC.channel_name == channel_name) - FC.messages += newMsg //Adding message to the network's appropriate feed_channel + FC.messages += newMsg break for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) NEWSCASTER.newsAlert(channel_name) + lastAction ++ + newMsg.creationTime = lastAction +/datum/newscaster/feed_network/proc/submitWanted(criminal, body, scanned_user, obj/item/weapon/photo/photo, adminMsg = 0, newMessage = 0) + wanted_issue.active = 1 + wanted_issue.criminal = criminal + wanted_issue.body = body + wanted_issue.scannedUser = scanned_user + wanted_issue.isAdminMsg = adminMsg + if(photo) + wanted_issue.img = photo.img + if(newMessage) + for(var/obj/machinery/newscaster/N in allCasters) + N.newsAlert() + N.update_icon() -var/datum/feed_network/news_network = new /datum/feed_network //The global news-network, which is coincidentally a global list. +/datum/newscaster/feed_network/proc/deleteWanted() + wanted_issue.active = 0 + wanted_issue.criminal = null + wanted_issue.body = null + wanted_issue.scannedUser = null + wanted_issue.img = null + for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) + NEWSCASTER.update_icon() -var/list/obj/machinery/newscaster/allCasters = list() //Global list that will contain reference to all newscasters in existence. /obj/item/newscaster_frame @@ -117,8 +190,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co qdel(src) - - /obj/machinery/newscaster name = "newscaster" desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!" @@ -127,60 +198,36 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co verb_say = "beeps" verb_ask = "beeps" verb_exclaim = "beeps" - var/isbroken = 0 //1 if someone banged it with something heavy - var/ispowered = 1 //starts powered, changes with power_change() - //var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored. - //OBSOLETE: We're now using a global news network + var/isbroken = 0 + var/ispowered = 1 var/screen = 0 - // 0 = welcome screen - main menu - // 1 = view feed channels - // 2 = create feed channel - // 3 = create feed story - // 4 = feed story submited sucessfully - // 5 = feed channel created successfully - // 6 = ERROR: Cannot create feed story - // 7 = ERROR: Cannot create feed channel - // 8 = print newspaper - // 9 = viewing channel feeds - // 10 = censor feed story - // 11 = censor feed channel - //Holy shit this is outdated, made this when I was still starting newscasters :3 var/paper_remaining = 0 var/securityCaster = 0 - // 0 = Caster cannot be used to issue wanted posters - // 1 = the opposite - var/unit_no = 0 //Each newscaster has a unit number - //var/datum/feed_message/wanted //We're gonna use a feed_message to store data of the wanted person because fields are similar - //var/wanted_issue = 0 //OBSOLETE - // 0 = there's no WANTED issued, we don't need a special icon_state - // 1 = Guess what. + var/unit_no = 0 var/alert_delay = 500 var/alert = 0 - // 0 = there hasn't been a news/wanted update in the last alert_delay - // 1 = there has - var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster - var/msg = ""; //Feed message + var/scanned_user = "Unknown" + var/msg = "" var/obj/item/weapon/photo/photo = null - var/channel_name = ""; //the feed channel which will be receiving the feed, or being created - var/c_locked=0; //Will our new channel be locked to public submissions? - var/hitstaken = 0 //Death at 3 hits from an item with force>=15 - var/datum/feed_channel/viewing_channel = null + var/channel_name = "" + var/c_locked=0 + var/hitstaken = 0 + var/datum/newscaster/feed_channel/viewing_channel = null var/allow_comments = 1 luminosity = 0 anchored = 1 - -/obj/machinery/newscaster/security_unit //Security unit +/obj/machinery/newscaster/security_unit name = "security newscaster" securityCaster = 1 /obj/machinery/newscaster/New() allCasters += src - src.paper_remaining = 15 + paper_remaining = 15 for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) - src.unit_no++ - src.update_icon() //for any custom ones on the map... - ..() //I just realised the newscasters weren't in the global machines list. The superconstructor call will tend to that + unit_no++ + update_icon() + ..() /obj/machinery/newscaster/Destroy() allCasters -= src @@ -191,76 +238,63 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/update_icon() if(!ispowered || isbroken) icon_state = "newscaster_off" - if(isbroken) //If the thing is smashed, add crack overlay on top of the unpowered sprite. - src.overlays.Cut() - src.overlays += image(src.icon, "crack3") + if(isbroken) + overlays.Cut() + overlays += image(icon, "crack3") return - - src.overlays.Cut() //reset overlays - - if(news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message + overlays.Cut() + if(news_network.wanted_issue.active) icon_state = "newscaster_wanted" return - - if(alert) //new message alert overlay - src.overlays += "newscaster_alert" - - if(hitstaken > 0) //Cosmetic damage overlay - src.overlays += image(src.icon, "crack[hitstaken]") - + if(alert) + overlays += "newscaster_alert" + if(hitstaken > 0) + overlays += image(icon, "crack[hitstaken]") icon_state = "newscaster_normal" - return /obj/machinery/newscaster/power_change() - if(isbroken) //Broken shit can't be powered. + if(isbroken) return - if( src.powered() ) - src.ispowered = 1 + if(powered()) + ispowered = 1 stat &= ~NOPOWER - src.update_icon() + update_icon() else spawn(rand(0, 15)) - src.ispowered = 0 + ispowered = 0 stat |= NOPOWER - src.update_icon() - + update_icon() /obj/machinery/newscaster/ex_act(severity, target) switch(severity) if(1.0) qdel(src) - return if(2.0) - src.isbroken=1 + isbroken=1 if(prob(50)) qdel(src) else - src.update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in. - return + update_icon() else if(prob(50)) - src.isbroken=1 - src.update_icon() - return - return + isbroken=1 + update_icon() -/obj/machinery/newscaster/attack_ai(mob/user as mob) - return src.attack_hand(user) +/obj/machinery/newscaster/attack_ai(mob/user) + return attack_hand(user) -/obj/machinery/newscaster/attack_hand(mob/user as mob) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ - if(!src.ispowered || src.isbroken) +/obj/machinery/newscaster/attack_hand(mob/user) + if(!ispowered || isbroken) return if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) ) var/mob/living/human_or_robot_user = user var/dat - - src.scan_user(human_or_robot_user) //Newscaster scans you - + scan_user(human_or_robot_user) switch(screen) if(0) - dat += "Welcome to Newscasting Unit #[src.unit_no].
Interface & News networks Operational." + dat += "Welcome to Newscasting Unit #[unit_no].
Interface & News networks Operational." dat += "
Property of Nanotransen Inc" - if(news_network.wanted_issue) + if(news_network.wanted_issue.active) dat+= "
Read Wanted Issue" dat+= "

Create Feed Channel" dat+= "
View Feed Channels" @@ -268,125 +302,113 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+= "
Print newspaper" dat+= "
Re-scan User" dat+= "

Exit" - if(src.securityCaster) + if(securityCaster) var/wanted_already = 0 - if(news_network.wanted_issue) + if(news_network.wanted_issue.active) wanted_already = 1 - dat+="
Feed Security functions:
" dat+="
[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue" dat+="
Censor Feed Stories" dat+="
Mark Feed Channel with Nanotrasen D-Notice" - dat+="

The newscaster recognises you as: [src.scanned_user]" + dat+="

The newscaster recognises you as: [scanned_user]" if(1) dat+= "Station Feed Channels
" if( isemptylist(news_network.network_channels) ) dat+="No active channels found..." else - for(var/datum/feed_channel/CHANNEL in news_network.network_channels) + for(var/datum/newscaster/feed_channel/CHANNEL in news_network.network_channels) if(CHANNEL.is_admin_channel) dat+="[CHANNEL.channel_name]
" else dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" - /*for(var/datum/feed_channel/CHANNEL in src.channel_list) - dat+="[CHANNEL.channel_name]:
\[created by: [CHANNEL.author]\]

" - if( isemptylist(CHANNEL.messages) ) - dat+="No feed messages found in channel...

" - else - for(var/datum/feed_message/MESSAGE in CHANNEL.messages) - dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
"*/ - dat+="

Refresh" dat+="
Back" if(2) dat+="Creating new Feed Channel..." - dat+="
Channel Name: [src.channel_name]
" - dat+="Channel Author: [src.scanned_user]
" - dat+="Will Accept Public Feeds: [(src.c_locked) ? ("NO") : ("YES")]

" + dat+="
Channel Name: [channel_name]
" + dat+="Channel Author: [scanned_user]
" + dat+="Will Accept Public Feeds: [(c_locked) ? ("NO") : ("YES")]

" dat+="
Submit

Cancel
" if(3) dat+="Creating new Feed Message..." - dat+="
Receiving Channel: [src.channel_name]
" //MARK - dat+="Message Author: [src.scanned_user]
" - dat+="Message Body:
[parsepencode(src.msg, user, SIGNFONT)]
" - dat+="Attach Photo: [(src.photo ? "Photo Attached" : "No Photo")]
" + dat+="
Receiving Channel: [channel_name]
" + dat+="Message Author: [scanned_user]
" + dat+="Message Body:
[parsepencode(msg, user, SIGNFONT)]
" + dat+="Attach Photo: [(photo ? "Photo Attached" : "No Photo")]
" dat+="Comments [allow_comments ? "Enabled" : "Disabled"]
" dat+="
Submit

Cancel
" if(4) - dat+="Feed story successfully submitted to [src.channel_name].

" + dat+="Feed story successfully submitted to [channel_name].

" dat+="
Return
" if(5) - dat+="Feed Channel [src.channel_name] created successfully.

" + dat+="Feed Channel [channel_name] created successfully.

" dat+="
Return
" if(6) dat+="ERROR: Could not submit Feed story to Network.

" - if(src.channel_name=="") + if(channel_name=="") dat+="•Invalid receiving channel name.
" - if(src.scanned_user=="Unknown") + if(scanned_user=="Unknown") dat+="•Channel author unverified.
" - if(src.msg == "" || src.msg == "\[REDACTED\]") + if(msg == "" || msg == "\[REDACTED\]") dat+="•Invalid message body.
" - dat+="
Return
" if(7) dat+="ERROR: Could not submit Feed Channel to Network.

" - //var/list/existing_channels = list() //Let's get dem existing channels - OBSOLETE var/list/existing_authors = list() - for(var/datum/feed_channel/FC in news_network.network_channels) - //existing_channels += FC.channel_name //OBSOLETE - if(FC.author == "\[REDACTED\]") - existing_authors += FC.backup_author + for(var/datum/newscaster/feed_channel/FC in news_network.network_channels) + if(FC.authorCensor) + existing_authors += news_network.redactedText else existing_authors += FC.author - if(src.scanned_user in existing_authors) + if(scanned_user in existing_authors) dat+="•There already exists a Feed channel under your name.
" - if(src.channel_name=="" || src.channel_name == "\[REDACTED\]") + if(channel_name=="" || channel_name == "\[REDACTED\]") dat+="•Invalid channel name.
" var/check = 0 - for(var/datum/feed_channel/FC in news_network.network_channels) - if(FC.channel_name == src.channel_name) + for(var/datum/newscaster/feed_channel/FC in news_network.network_channels) + if(FC.channel_name == channel_name) check = 1 break if(check) dat+="•Channel name already in use.
" - if(src.scanned_user=="Unknown") + if(scanned_user=="Unknown") dat+="•Channel author unverified.
" dat+="
Return
" if(8) var/total_num=length(news_network.network_channels) var/active_num=total_num var/message_num=0 - for(var/datum/feed_channel/FC in news_network.network_channels) + for(var/datum/newscaster/feed_channel/FC in news_network.network_channels) if(!FC.censored) - message_num += length(FC.messages) //Dont forget, datum/feed_channel's var messages is a list of datum/feed_message + message_num += length(FC.messages) else active_num-- - dat+="Network currently serves a total of [total_num] Feed channels, [active_num] of which are active, and a total of [message_num] Feed Stories." //TODO: CONTINUE - dat+="

Liquid Paper remaining: [(src.paper_remaining) *100 ] cm^3" + dat+="Network currently serves a total of [total_num] Feed channels, [active_num] of which are active, and a total of [message_num] Feed Stories." + dat+="

Liquid Paper remaining: [(paper_remaining) *100 ] cm^3" dat+="

Print Paper" dat+="
Cancel" if(9) - dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author]\]
" - if(src.viewing_channel.censored) + dat+="[viewing_channel.channel_name]: \[created by: [viewing_channel.returnAuthor(-1)]\]
" + if(viewing_channel.censored) dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
" dat+="No further feed story additions are allowed while the D-Notice is in effect.

" else - if( isemptylist(src.viewing_channel.messages) ) + if( isemptylist(viewing_channel.messages) ) dat+="No feed messages found in channel...
" else var/i = 0 - for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) + for(var/datum/newscaster/feed_message/MESSAGE in viewing_channel.messages) i++ - dat+="-[MESSAGE.body]
" + dat+="-[MESSAGE.returnBody(-1)]
" if(MESSAGE.img) usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") dat+="
" if(MESSAGE.caption) dat+="[MESSAGE.caption]
" dat+="
" - dat+="\[Story by [MESSAGE.author] \] - ([MESSAGE.time_stamp])
" + dat+="\[Story by [MESSAGE.returnAuthor(-1)] \] - ([MESSAGE.time_stamp])
" dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]
" - for(var/datum/feed_comment/comment in MESSAGE.comments) + for(var/datum/newscaster/feed_comment/comment in MESSAGE.comments) dat+="[comment.body]
[comment.author] [comment.time_stamp]
" if(MESSAGE.locked) dat+="Comments locked
" @@ -402,7 +424,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(isemptylist(news_network.network_channels)) dat+="No feed channels found active...
" else - for(var/datum/feed_channel/CHANNEL in news_network.network_channels) + for(var/datum/newscaster/feed_channel/CHANNEL in news_network.network_channels) dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" dat+="
Cancel" if(11) @@ -413,80 +435,75 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(isemptylist(news_network.network_channels)) dat+="No feed channels found active...
" else - for(var/datum/feed_channel/CHANNEL in news_network.network_channels) + for(var/datum/newscaster/feed_channel/CHANNEL in news_network.network_channels) dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" - dat+="
Back" if(12) - dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \]
" - dat+="[(src.viewing_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
" - - - if( isemptylist(src.viewing_channel.messages) ) + dat+="[viewing_channel.channel_name]: \[ created by: [viewing_channel.returnAuthor(-1)] \]
" + dat+="[(viewing_channel.authorCensor) ? ("Undo Author censorship") : ("Censor channel Author")]
" + if(isemptylist(viewing_channel.messages)) dat+="No feed messages found in channel...
" else - for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) - dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
" - dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
" + for(var/datum/newscaster/feed_message/MESSAGE in viewing_channel.messages) + dat+="-[MESSAGE.returnBody(-1)]
\[Story by [MESSAGE.returnAuthor(-1)]\]
" + dat+="[(MESSAGE.bodyCensor) ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.authorCensor) ? ("Undo Author Censorship") : ("Censor message Author")]
" dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]: [MESSAGE.locked ? "Unlock" : "Lock"]
" - for(var/datum/feed_comment/comment in MESSAGE.comments) + for(var/datum/newscaster/feed_comment/comment in MESSAGE.comments) dat+="[comment.body] X
[comment.author] [comment.time_stamp]
" dat+="
Back" if(13) - dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \]
" - dat+="Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
" - if(src.viewing_channel.censored) + dat+="[viewing_channel.channel_name]: \[ created by: [viewing_channel.returnAuthor(-1)] \]
" + dat+="Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
" + if(viewing_channel.censored) dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
" dat+="No further feed story additions are allowed while the D-Notice is in effect.

" else - if( isemptylist(src.viewing_channel.messages) ) + if(isemptylist(viewing_channel.messages)) dat+="No feed messages found in channel...
" else - for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) - dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
" - + for(var/datum/newscaster/feed_message/MESSAGE in viewing_channel.messages) + dat+="-[MESSAGE.returnBody(-1)]
\[Story by [MESSAGE.returnAuthor(-1)]\]
" dat+="
Back" if(14) dat+="Wanted Issue Handler:" var/wanted_already = 0 var/end_param = 1 - if(news_network.wanted_issue) + if(news_network.wanted_issue.active) wanted_already = 1 end_param = 2 - if(wanted_already) dat+="
A wanted issue is already in Feed Circulation. You can edit or cancel it below.
" dat+="
" - dat+="Criminal Name: [src.channel_name]
" - dat+="Description: [src.msg]
" - dat+="Attach Photo: [(src.photo ? "Photo Attached" : "No Photo")]
" + dat+="Criminal Name: [channel_name]
" + dat+="Description: [msg]
" + dat+="Attach Photo: [(photo ? "Photo Attached" : "No Photo")]
" if(wanted_already) - dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
" + dat+="Wanted Issue created by: [news_network.wanted_issue.scannedUser]
" else - dat+="Wanted Issue will be created under prosecutor: [src.scanned_user]
" + dat+="Wanted Issue will be created under prosecutor: [scanned_user]
" dat+="
[(wanted_already) ? ("Edit Issue") : ("Submit")]" if(wanted_already) dat+="
Take down Issue" dat+="
Cancel" if(15) - dat+="Wanted issue for [src.channel_name] is now in Network Circulation.

" + dat+="Wanted issue for [channel_name] is now in Network Circulation.

" dat+="
Return
" if(16) dat+="ERROR: Wanted Issue rejected by Network.

" - if(src.channel_name=="" || src.channel_name == "\[REDACTED\]") + if(channel_name=="" || channel_name == "\[REDACTED\]") dat+="•Invalid name for person wanted.
" - if(src.scanned_user=="Unknown") + if(scanned_user=="Unknown") dat+="•Issue author unverified.
" - if(src.msg == "" || src.msg == "\[REDACTED\]") + if(msg == "" || msg == "\[REDACTED\]") dat+="•Invalid description.
" dat+="
Return
" if(17) dat+="Wanted Issue successfully deleted from Circulation
" dat+="
Return
" if(18) - if(news_network.wanted_issue) - dat+="-- STATIONWIDE WANTED ISSUE --
\[Submitted by: [news_network.wanted_issue.backup_author]\]
" - dat+="Criminal: [news_network.wanted_issue.author]
" + if(news_network.wanted_issue.active) + dat+="-- STATIONWIDE WANTED ISSUE --
\[Submitted by: [news_network.wanted_issue.scannedUser]\]
" + dat+="Criminal: [news_network.wanted_issue.criminal]
" dat+="Description: [news_network.wanted_issue.body]
" dat+="Photo:: " if(news_network.wanted_issue.img) @@ -498,7 +515,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="No current wanted issue found.

" dat+="

Back
" if(19) - dat+="Wanted issue for [src.channel_name] successfully edited.

" + dat+="Wanted issue for [channel_name] successfully edited.

" dat+="
Return
" if(20) dat+="Printing successful. Please receive your newspaper from the bottom of the machine.

" @@ -506,338 +523,264 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(21) dat+="Unable to print newspaper. Insufficient paper. Please notify maintenance personnel to refill machine storage.

" dat+="Return" - else - dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" - - //human_or_robot_user << browse(dat, "window=newscaster_main;size=400x600") - //onclose(human_or_robot_user, "newscaster_main") - - var/datum/browser/popup = new(human_or_robot_user, "newscaster_main", "Newscaster Unit #[src.unit_no]", 400, 600) + var/datum/browser/popup = new(human_or_robot_user, "newscaster_main", "Newscaster Unit #[unit_no]", 400, 600) popup.set_content(dat) - popup.set_title_image(human_or_robot_user.browse_rsc_icon(src.icon, src.icon_state)) + popup.set_title_image(human_or_robot_user.browse_rsc_icon(icon, icon_state)) popup.open() /obj/machinery/newscaster/Topic(href, href_list) if(..()) return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) scan_user(usr) if(href_list["set_channel_name"]) - src.channel_name = stripped_input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "", MAX_NAME_LEN) - while (findtext(src.channel_name," ") == 1) - src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1) - src.updateUsrDialog() - //src.update_icon() - + channel_name = stripped_input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "", MAX_NAME_LEN) + while (findtext(channel_name," ") == 1) + channel_name = copytext(channel_name,2,lentext(channel_name)+1) + updateUsrDialog() else if(href_list["set_channel_lock"]) - src.c_locked = !src.c_locked - src.updateUsrDialog() - //src.update_icon() - + c_locked = !c_locked + updateUsrDialog() else if(href_list["submit_new_channel"]) var/list/existing_authors = list() - for(var/datum/feed_channel/FC in news_network.network_channels) - //existing_channels += FC.channel_name - if(FC.author == "\[REDACTED\]") - existing_authors += FC.backup_author + for(var/datum/newscaster/feed_channel/FC in news_network.network_channels) + if(FC.authorCensor) + existing_authors += news_network.redactedText else - existing_authors +=FC.author + existing_authors += FC.author var/check = 0 - for(var/datum/feed_channel/FC in news_network.network_channels) - if(FC.channel_name == src.channel_name) + for(var/datum/newscaster/feed_channel/FC in news_network.network_channels) + if(FC.channel_name == channel_name) check = 1 break - if(src.channel_name == "" || src.channel_name == "\[REDACTED\]" || src.scanned_user == "Unknown" || check || (src.scanned_user in existing_authors) ) - src.screen=7 + if(channel_name == "" || channel_name == "\[REDACTED\]" || scanned_user == "Unknown" || check || (scanned_user in existing_authors) ) + screen=7 else var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel") if(choice=="Confirm") scan_user(usr) - news_network.CreateFeedChannel(src.channel_name, src.scanned_user, c_locked) + news_network.CreateFeedChannel(channel_name, scanned_user, c_locked) feedback_inc("newscaster_channels",1) - src.screen=5 - src.updateUsrDialog() - //src.update_icon() - + screen=5 + updateUsrDialog() else if(href_list["set_channel_receiving"]) - //var/list/datum/feed_channel/available_channels = list() var/list/available_channels = list() - for(var/datum/feed_channel/F in news_network.network_channels) + for(var/datum/newscaster/feed_channel/F in news_network.network_channels) if( (!F.locked || F.author == scanned_user) && !F.censored) available_channels += F.channel_name - src.channel_name = input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels - src.updateUsrDialog() - + channel_name = input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels + updateUsrDialog() else if(href_list["set_new_message"]) - var/temp_message = trim(stripped_multiline_input(usr, "Write your Feed story", "Network Channel Handler", src.msg)) + var/temp_message = trim(stripped_multiline_input(usr, "Write your Feed story", "Network Channel Handler", msg)) if(temp_message) - src.msg = temp_message - src.updateUsrDialog() - + msg = temp_message + updateUsrDialog() else if(href_list["set_attachment"]) AttachPhoto(usr) - src.updateUsrDialog() - + updateUsrDialog() else if(href_list["submit_new_message"]) - if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" ) - src.screen=6 + if(msg =="" || msg=="\[REDACTED\]" || scanned_user == "Unknown" || channel_name == "" ) + screen=6 else - news_network.SubmitArticle("[parsepencode(src.msg, usr, SIGNFONT)]", scanned_user, channel_name, photo, allow_comments) + news_network.SubmitArticle("[parsepencode(msg, usr, SIGNFONT)]", scanned_user, channel_name, photo, 0, allow_comments) feedback_inc("newscaster_stories",1) - src.screen=4 - src.msg = "" - src.updateUsrDialog() - + screen=4 + msg = "" + updateUsrDialog() else if(href_list["create_channel"]) - src.screen=2 - src.updateUsrDialog() - + screen=2 + updateUsrDialog() else if(href_list["create_feed_story"]) - src.screen=3 - src.updateUsrDialog() - + screen=3 + updateUsrDialog() else if(href_list["menu_paper"]) - src.screen=8 - src.updateUsrDialog() + screen=8 + updateUsrDialog() else if(href_list["print_paper"]) - if(!src.paper_remaining) - src.screen=21 + if(!paper_remaining) + screen=21 else - src.print_paper() - src.screen = 20 - src.updateUsrDialog() - + print_paper() + screen = 20 + updateUsrDialog() else if(href_list["menu_censor_story"]) - src.screen=10 - src.updateUsrDialog() - + screen=10 + updateUsrDialog() else if(href_list["menu_censor_channel"]) - src.screen=11 - src.updateUsrDialog() - + screen=11 + updateUsrDialog() else if(href_list["menu_wanted"]) var/already_wanted = 0 - if(news_network.wanted_issue) + if(news_network.wanted_issue.active) already_wanted = 1 - if(already_wanted) - src.channel_name = news_network.wanted_issue.author - src.msg = news_network.wanted_issue.body - src.screen = 14 - src.updateUsrDialog() - + channel_name = news_network.wanted_issue.criminal + msg = news_network.wanted_issue.body + screen = 14 + updateUsrDialog() else if(href_list["set_wanted_name"]) - src.channel_name = trim(stripped_input(usr, "Provide the name of the Wanted person", "Network Security Handler")) - src.updateUsrDialog() - + channel_name = trim(stripped_input(usr, "Provide the name of the Wanted person", "Network Security Handler")) + updateUsrDialog() else if(href_list["set_wanted_desc"]) - src.msg = trim(stripped_input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler")) - src.updateUsrDialog() - + msg = trim(stripped_input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler")) + updateUsrDialog() else if(href_list["submit_wanted"]) var/input_param = text2num(href_list["submit_wanted"]) - if(src.msg == "" || src.channel_name == "" || src.scanned_user == "Unknown") - src.screen = 16 + if(msg == "" || channel_name == "" || scanned_user == "Unknown") + screen = 16 else var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel") if(choice=="Confirm") scan_user(usr) - if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below - var/datum/feed_message/WANTED = new /datum/feed_message - WANTED.author = src.channel_name - WANTED.body = src.msg - WANTED.backup_author = src.scanned_user //I know, a bit wacky - if(photo) - WANTED.img = photo.img - news_network.wanted_issue = WANTED - for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) - NEWSCASTER.newsAlert() - NEWSCASTER.update_icon() - src.screen = 15 + if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. + news_network.submitWanted(channel_name, msg, scanned_user, photo, 0 , 1) + screen = 15 else - if(news_network.wanted_issue.is_admin_message) + if(news_network.wanted_issue.isAdminMsg) alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok") return - news_network.wanted_issue.author = src.channel_name - news_network.wanted_issue.body = src.msg - news_network.wanted_issue.backup_author = src.scanned_user - if(photo) - news_network.wanted_issue.img = photo.img - src.screen = 19 - - src.updateUsrDialog() - + news_network.submitWanted(channel_name, msg, scanned_user, photo) + screen = 19 + updateUsrDialog() else if(href_list["cancel_wanted"]) - if(news_network.wanted_issue.is_admin_message) + if(news_network.wanted_issue.isAdminMsg) alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok") return var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel") if(choice=="Confirm") - news_network.wanted_issue = null - for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) - NEWSCASTER.update_icon() - src.screen=17 - src.updateUsrDialog() - + news_network.deleteWanted() + screen=17 + updateUsrDialog() else if(href_list["view_wanted"]) - src.screen=18 - src.updateUsrDialog() + screen=18 + updateUsrDialog() else if(href_list["censor_channel_author"]) - var/datum/feed_channel/FC = locate(href_list["censor_channel_author"]) + var/datum/newscaster/feed_channel/FC = locate(href_list["censor_channel_author"]) if(FC.is_admin_channel) alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") return - if(FC.author != "\[REDACTED\]") - FC.backup_author = FC.author - FC.author = "\[REDACTED\]" - else - FC.author = FC.backup_author - src.updateUsrDialog() - + FC.toggleCensorAuthor() + updateUsrDialog() else if(href_list["censor_channel_story_author"]) - var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"]) + var/datum/newscaster/feed_message/MSG = locate(href_list["censor_channel_story_author"]) if(MSG.is_admin_message) alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok") return - if(MSG.author != "\[REDACTED\]") - MSG.backup_author = MSG.author - MSG.author = "\[REDACTED\]" - else - MSG.author = MSG.backup_author - src.updateUsrDialog() - + MSG.toggleCensorAuthor() + updateUsrDialog() else if(href_list["censor_channel_story_body"]) - var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"]) + var/datum/newscaster/feed_message/MSG = locate(href_list["censor_channel_story_body"]) if(MSG.is_admin_message) alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") return - if(MSG.body != "\[REDACTED\]") - MSG.backup_body = MSG.body - MSG.body = "\[REDACTED\]" - else - MSG.body = MSG.backup_body - src.updateUsrDialog() - + MSG.toggleCensorBody() + updateUsrDialog() else if(href_list["pick_d_notice"]) - var/datum/feed_channel/FC = locate(href_list["pick_d_notice"]) - src.viewing_channel = FC - src.screen=13 - src.updateUsrDialog() - + var/datum/newscaster/feed_channel/FC = locate(href_list["pick_d_notice"]) + viewing_channel = FC + screen=13 + updateUsrDialog() else if(href_list["toggle_d_notice"]) - var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"]) + var/datum/newscaster/feed_channel/FC = locate(href_list["toggle_d_notice"]) if(FC.is_admin_channel) alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok") return - FC.censored = !FC.censored - src.updateUsrDialog() - + FC.toggleCensorDclass() + updateUsrDialog() else if(href_list["view"]) - src.screen=1 - src.updateUsrDialog() - - else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~ - src.screen = text2num(href_list["setScreen"]) - if (src.screen == 0) - src.scanned_user = "Unknown"; + screen=1 + updateUsrDialog() + else if(href_list["setScreen"]) + screen = text2num(href_list["setScreen"]) + if (screen == 0) + scanned_user = "Unknown"; msg = ""; - src.c_locked=0; + c_locked=0; channel_name=""; - src.viewing_channel = null - src.updateUsrDialog() - + viewing_channel = null + updateUsrDialog() else if(href_list["show_channel"]) - var/datum/feed_channel/FC = locate(href_list["show_channel"]) - src.viewing_channel = FC - src.screen = 9 - src.updateUsrDialog() - + var/datum/newscaster/feed_channel/FC = locate(href_list["show_channel"]) + viewing_channel = FC + screen = 9 + updateUsrDialog() else if(href_list["pick_censor_channel"]) - var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"]) - src.viewing_channel = FC - src.screen = 12 - src.updateUsrDialog() - + var/datum/newscaster/feed_channel/FC = locate(href_list["pick_censor_channel"]) + viewing_channel = FC + screen = 12 + updateUsrDialog() else if(href_list["new_comment"]) - var/datum/feed_message/FM = locate(href_list["new_comment"]) + var/datum/newscaster/feed_message/FM = locate(href_list["new_comment"]) var/cominput = copytext(stripped_input(usr, "Write your message:", "New comment", null),1,141) if(cominput) scan_user(usr) - var/datum/feed_comment/FC = new/datum/feed_comment + var/datum/newscaster/feed_comment/FC = new/datum/newscaster/feed_comment FC.author = scanned_user FC.body = cominput FC.time_stamp = worldtime2text() FM.comments += FC - log_comment("[usr]/([usr.ckey]) as [scanned_user] commented on message [FM.body] -- [FC.body]") + log_comment("[usr]/([usr.ckey]) as [scanned_user] commented on message [FM.returnBody(-1)] -- [FC.body]") updateUsrDialog() - else if(href_list["del_comment"]) - var/datum/feed_comment/FC = locate(href_list["del_comment"]) - var/datum/feed_message/FM = locate(href_list["del_comment_msg"]) + var/datum/newscaster/feed_comment/FC = locate(href_list["del_comment"]) + var/datum/newscaster/feed_message/FM = locate(href_list["del_comment_msg"]) FM.comments -= FC qdel(FC) updateUsrDialog() - else if(href_list["lock_comment"]) - var/datum/feed_message/FM = locate(href_list["lock_comment"]) + var/datum/newscaster/feed_message/FM = locate(href_list["lock_comment"]) FM.locked ^= 1 updateUsrDialog() - else if(href_list["set_comment"]) allow_comments ^= 1 updateUsrDialog() - else if(href_list["refresh"]) - src.updateUsrDialog() - - -/obj/machinery/newscaster/attackby(obj/item/I as obj, mob/living/user as mob, params) + updateUsrDialog() +/obj/machinery/newscaster/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/weapon/wrench)) user << "You start [anchored ? "un" : ""]securing [name]..." - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 60)) user << "You [anchored ? "un" : ""]secure [name]." new /obj/item/newscaster_frame(loc) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) qdel(src) return - - if (isbroken) - playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1) - audible_message("[user.name] further abuses the shattered [src.name].", null, 5 ) + if(isbroken) + playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1) + audible_message("[user.name] further abuses the shattered [name].", null, 5 ) else - if(istype(I, /obj/item/weapon) ) + if(istype(I, /obj/item/weapon)) user.do_attack_animation(src) var/obj/item/weapon/W = I if(W.damtype == STAMINA) return if(W.force <15) - audible_message("[user.name] hits the [src.name] with the [W.name] with no visible effect.", null , 5 ) - playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) + audible_message("[user.name] hits the [name] with the [W.name] with no visible effect.", null , 5 ) + playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) else hitstaken++ if(hitstaken==3) - audible_message("[user.name] smashes the [src.name]!", null, 5 ) + audible_message("[user.name] smashes the [name]!", null, 5 ) isbroken=1 - playsound(src.loc, 'sound/effects/Glassbr3.ogg', 100, 1) + playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1) else - audible_message("[user.name] forcefully slams the [src.name] with the [I.name]!", null, 5 ) - playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) + audible_message("[user.name] forcefully slams the [name] with the [I.name]!", null, 5 ) + playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) else user << "This does nothing!" - src.update_icon() + update_icon() - -/obj/machinery/newscaster/attack_paw(mob/user as mob) +/obj/machinery/newscaster/attack_paw(mob/user) user << "The newscaster controls are far too complicated for your tiny brain!" return -/obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob) +/obj/machinery/newscaster/proc/AttachPhoto(mob/user) if(photo) if(!photo.sillynewscastervar) - photo.loc = src.loc + photo.loc = loc if(!issilicon(user)) user.put_in_inactive_hand(photo) else @@ -852,7 +795,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/find var/datum/picture/selection var/obj/item/device/camera/siliconcam/targetcam = null - if(istype(user,/mob/living/silicon/ai)) var/mob/living/silicon/ai/R = user targetcam = R.aicamera @@ -863,8 +805,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else targetcam = R.aicamera else - user << "You cannot interface with silicon photo uploading!" //gtfo pAIs - + user << "You cannot interface with silicon photo uploading!" if(targetcam.aipictures.len == 0) usr << "No images saved" return @@ -881,210 +822,210 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co photo = P qdel(P) +/obj/machinery/newscaster/proc/scan_user(mob/living/user) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + if(human_user.wear_id) + if(istype(human_user.wear_id, /obj/item/device/pda)) + var/obj/item/device/pda/P = human_user.wear_id + if(P.id) + scanned_user = "[P.id.registered_name] ([P.id.assignment])" + else + scanned_user = "Unknown" + else if(istype(human_user.wear_id, /obj/item/weapon/card/id) ) + var/obj/item/weapon/card/id/ID = human_user.wear_id + scanned_user ="[ID.registered_name] ([ID.assignment])" + else + scanned_user ="Unknown" + else + scanned_user ="Unknown" + else if(istype(user,/mob/living/silicon)) + var/mob/living/silicon/ai_user = user + scanned_user = "[ai_user.name] ([ai_user.job])" + else + ERROR("Newscaster used by non-human/silicon mob: [user.type]") + +/obj/machinery/newscaster/proc/print_paper() + feedback_inc("newscaster_newspapers_printed",1) + var/obj/item/weapon/newspaper/NEWSPAPER = new /obj/item/weapon/newspaper + for(var/datum/newscaster/feed_channel/FC in news_network.network_channels) + NEWSPAPER.news_content += FC + if(news_network.wanted_issue.active) + NEWSPAPER.wantedAuthor = news_network.wanted_issue.scannedUser + NEWSPAPER.wantedCriminal = news_network.wanted_issue.criminal + NEWSPAPER.wantedBody = news_network.wanted_issue.body + if(news_network.wanted_issue.img) + NEWSPAPER.wantedPhoto = news_network.wanted_issue.img + NEWSPAPER.loc = get_turf(src) + NEWSPAPER.creationTime = news_network.lastAction + paper_remaining-- + +/obj/machinery/newscaster/proc/newsAlert(channel) + if(channel) + say("Breaking news from [channel]!") + alert ++ + update_icon() + spawn(alert_delay) + alert -- + update_icon() + playsound(loc, 'sound/machines/twobeep.ogg', 75, 1) + else + say("Attention! Wanted issue distributed!") + playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, 1) -//######################################################################################################################## -//###################################### NEWSPAPER! ###################################################################### -//######################################################################################################################## /obj/item/weapon/newspaper name = "newspaper" desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations." icon = 'icons/obj/bureaucracy.dmi' icon_state = "newspaper" - w_class = 2 //Let's make it fit in trashbags! + w_class = 2 attack_verb = list("bapped") var/screen = 0 var/pages = 0 var/curr_page = 0 - var/list/datum/feed_channel/news_content = list() - var/datum/feed_message/important_message = null + var/list/datum/newscaster/feed_channel/news_content = list() var/scribble="" var/scribble_page = null + var/wantedAuthor + var/wantedCriminal + var/wantedBody + var/wantedPhoto + var/creationTime -/*obj/item/weapon/newspaper/attack_hand(mob/user as mob) - ..() - world << "derp"*/ - -obj/item/weapon/newspaper/attack_self(mob/user as mob) +/obj/item/weapon/newspaper/attack_self(mob/user) if(ishuman(user)) var/mob/living/carbon/human/human_user = user var/dat - src.pages = 0 + pages = 0 switch(screen) if(0) //Cover dat+="
The Griffon
" dat+="
Nanotrasen-standard newspaper, for use on Nanotrasen© Space Facilities

" - if(isemptylist(src.news_content)) - if(src.important_message) - dat+="Contents:
    **Important Security Announcement** \[page [src.pages+2]\]
" + if(isemptylist(news_content)) + if(wantedAuthor) + dat+="Contents:
    **Important Security Announcement** \[page [pages+2]\]
" else dat+="Other than the title, the rest of the newspaper is unprinted..." else dat+="Contents:
    " - for(var/datum/feed_channel/NP in src.news_content) - src.pages++ - if(src.important_message) - dat+="**Important Security Announcement** \[page [src.pages+2]\]
    " + for(var/datum/newscaster/feed_channel/NP in news_content) + pages++ + if(wantedAuthor) + dat+="**Important Security Announcement** \[page [pages+2]\]
    " var/temp_page=0 - for(var/datum/feed_channel/NP in src.news_content) + for(var/datum/newscaster/feed_channel/NP in news_content) temp_page++ dat+="[NP.channel_name] \[page [temp_page+1]\]
    " dat+="
" if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[src.scribble]\"" + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" dat+= "
" if(1) // X channel pages inbetween. - for(var/datum/feed_channel/NP in src.news_content) - src.pages++ //Let's get it right again. - var/datum/feed_channel/C = src.news_content[src.curr_page] - dat+="[C.channel_name] \[created by: [C.author]\]

" - if(C.censored) + for(var/datum/newscaster/feed_channel/NP in news_content) + pages++ + var/datum/newscaster/feed_channel/C = news_content[curr_page] + dat += "[C.channel_name] \[created by: [C.returnAuthor(notContent(C.authorCensorTime))]\]

" + if(notContent(C.DclassCensorTime)) dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." else if(isemptylist(C.messages)) dat+="No Feed stories stem from this channel..." else - dat+="